; ; OPCODE TABLE AND OPERAND EVALUATION ROUTINES ; ; BYTE 0, BASE OPCODE VALUE: BITS 7-3 RIGHT SHIFTED 1 BIT (BIT2 ALWAYS 0) ; BYTE 1, CODE IDENTIFYING VALID OPERAND MODES ; ; 0 -- NO OPERAND ALLOWED ; 1 -- RELATIVE ADDRESSING ; 2 -- XIND, ZP, IMM, ABS, INDY, ZPIND, ZPX, ABSY, ABSX ; 3 -- ZP, IMM, ABS ; 4 -- ZP, ACC, ABS, ZPX, ABSX ; 5 -- XIND, ZP, ABS, INDY, ZPIND, ZPX, ABSY, ABSX ; 6 -- ZP, ABS, ZPYSP ; 7 -- ZP, ABS, ZPX, ABSX (DEC, INC) ; 8 -- ZP, ABS, ZPX ; 9 -- ZP, ABS (BIT) ; 10 -- ABS, ABSIND (JMP) ; 11 -- (JSR) ; ; DEFINE MODES ; XIND = $00 ZP = $04 ACC = $08 IMM = $08 ABS = $0C INDY = $10 ZPIND = $11 ZPX = $14 ABSY = $18 ABSX = $1C ; OPS DB $B1,$02,'ADC' DB $91,$02,'AND' DB $82,$04,'ASL' DB $C8,$01,'BCC' DB $D8,$01,'BCS' DB $F8,$01,'BEQ' DB $90,$09,'BIT' DB $98,$01,'BMI' DB $E8,$01,'BNE' DB $88,$01,'BPL' DB $C0,$01,'BRA' DB $80,$00,'BRK' DB $A8,$01,'BVC' DB $B8,$01,'BVS' DB $8C,$00,'CLC' DB $EC,$00,'CLD' DB $AC,$00,'CLI' DB $DC,$00,'CLV' DB $E1,$02,'CMP' DB $F0,$03,'CPX' DB $E0,$03,'CPY' DB $FF,$49,'DB' DB $FF,$4A,'DC' DB $E2,$07,'DEC' DB $E6,$00,'DEX' DB $C4,$00,'DEY' DB $FF,$43,'DS' DB $FF,$48,'DW' DB $FF,$42,'END' DB $A1,$02,'EOR' EQCODE DB $FF,$41,'EQU' DB $FF,$45,'INCLUDE' DB $F2,$07,'INC' DB $F4,$00,'INX' DB $E4,$00,'INY' DB $A0,$0A,'JMP' DB $8C,$0B,'JSR' ;VERY FUNNY OPCODE (ABNORMAL) DB $D1,$02,'LDA' DB $D2,$03,'LDX' DB $D0,$03,'LDY' DB $FF,$44,'LIST' DB $A2,$04,'LSR' DB $F6,$00,'NOP' DB $81,$02,'ORA' DB $FF,$40,'ORG' DB $FF,$4B,'PAGE' DB $A4,$00,'PHA' DB $84,$00,'PHP' DB $B4,$00,'PLA' DB $94,$00,'PLP' DB $92,$04,'ROL' DB $B2,$04,'ROR' DB $A0,$00,'RTI' DB $B0,$00,'RTS' DB $F1,$02,'SBC' DB $9C,$00,'SEC' DB $FC,$00,'SED' DB $BC,$00,'SEI' DB $C1,$05,'STA' DB $C2,$06,'STX' DB $C0,$08,'STY' DB $FF,$47,'SUBTTL' DB $D6,$00,'TAX' DB $D4,$00,'TAY' DB $FF,$46,'TITLE' DB $DE,$00,'TSX' DB $C6,$00,'TXA' DB $CE,$00,'TXS' DB $CC,$00,'TYA' ENDOPS DB $FF,$FF ; NOTHG LDA LABEL BNE LABONL COMMNT LDA #$80 STA ISVAL LABONL CLC RTS ; GENCODE LDY #0 JSR GETSYM ;LABEL? LDA SYMBOL BEQ NOLBL ;NO DO OPCODE THEN LDX #SYMSIZ+1 SAVLAB LDA SYMBOL-1,X STA LABEL-1,X DEX BNE SAVLAB ; NOLBL JSR NXTFLD ;NEXT, SKIP OVER TO OPCODE LDA #0 STA ISVAL STA MODE STA LEN STA LEN+1 LDA #' ' STA ADRERR JSR NXTFLD CMP #';' ;COMMENT? BEQ NOTHG TAX BMI NOTHG CMP #'=' BNE NOTEQ LDA #LOW[EQCODE] STA TABPTR LDA #HIGH[EQCODE] STA TABPTR+1 INY JSR NXTFLD STY TXTPTR JMP SPCLOP ; NOTEQ JSR GETSYM JSR NXTFLD STY TXTPTR ; LDA #LOW[OPS-1] STA TABPTR LDA #HIGH[OPS-1] STA TABPTR+1 LDY #0 FINDOP INY LDA (TABPTR),Y BPL FINDOP CLC TYA ADC TABPTR STA TABPTR LDA #0 ADC TABPTR+1 STA TABPTR+1 LDY #1 LDA (TABPTR),Y BMI NOTOPC ;IF NO MATCH IN THE TABLE LDX #$FF OPCPL INX INY LDA SYMBOL,X BEQ TSTEM ;END OF SYMBOL, END OF TABENT? CMP (TABPTR),Y BNE FINDOP BEQ OPCPL ; NOTOPC LDA #'O' STA ADRERR LDA #$EA ;3 NOP INSTRUCTIONS STA OPCODE STA VALUE STA VALUE+1 LDA #3 STA LEN LDY #0 ;CC=ZERO, PLUS (ERROR) RTS ; TSTEM LDA (TABPTR),Y BPL FINDOP ;NOT END OF TABLE ENTRY, NO MATCH ; SPCLOP LDY #0 LDA (TABPTR),Y STA OPCODE INY INC LEN LDA (TABPTR),Y BEQ OPNDOK LDY TXTPTR CMP #$40 BCC MACHCD ;IF 6502 INSTRUCTION JMP ASSDIR ; MACHCD JSR RDOPND STY TXTPTR BCC OPNDOK LDA #'E' STA ADRERR OPNDOK LDA OPCODE AND #$FC CLC ADC OPCODE CLC ADC MODE STA OPCODE JMP CODOBJ ; ; ESTABLISH MODE FROM SYNTAX OF OPERAND ; RELJMP JSR EVALAB ;EVALUATE ADDRESS CLC LDA VALUE SBC PC STA VALUE BNE GRELV DEC VALUE+1 GRELV LDA VALUE+1 SBC PC+1 STA VALUE+1 DEC VALUE ; LDA VALUE ASL A LDA VALUE+1 ADC #0 BEQ RRELV LDA #' ' CMP ADRERR BCC RRELV LDA #'V' STA ADRERR RRELV CLC RTS ; JMPGRP LDA (TEXTP),Y CMP #'(' BNE JABS LDA #$2C ;MODE OFFSET = 2C STA MODE INY JSR EVALAB DEY LDA (TEXTP),Y CMP #')' BNE SMERR JSMRET JMP SMXIT ; JABS JSR EVALAB JMP SMABS ; ACCREF LDA #1 STA LEN BNE ACCJ ; JSUB JSR EVALAB ACCJ LDA #ACC JMP SMRET ; RDOPND INC LEN CMP #1 ;IF RELATIVE BRANCH, SPECIAL BEQ RELJMP INC LEN CMP #$0A ;IF JUMP, ONLY ABS AND ABSIND ARE ALLOWED BEQ JMPGRP CMP #$0B BEQ JSUB TAX ;SAVE FOR FUTURE REF. STA MODE LDA (TEXTP),Y CPX #4 BNE NOACC CMP #'A' BNE NOACC INY LDA (TEXTP),Y CMP #'0' BCC ACCREF CMP #'z'+1 BCS ACCREF DEY BCC GOTACH NOACC CMP #'#' BEQ SMIMM CMP #'(' BEQ SMIND GOTACH JSR EVALAB ;EVALUATE ABSOLUTE OPERAND DEY LDA VALUE+1 BEQ ZPOPND ABSOPD LDA (TEXTP),Y CMP #',' BNE SMABS INY LDA (TEXTP),Y CMP #'Y' BEQ SMAY CMP #'X' BEQ SMAX SMERR SEC ;ELSE, ERROR RTS ; SMIND DEC LEN INY JSR EVALAB LDA VALUE+1 BNE SMERR DEY LDA (TEXTP),Y CMP #',' BEQ SMINX CMP #')' BNE SMERR INY LDA (TEXTP),Y CMP #',' BNE SZI INY LDA (TEXTP),Y CMP #'Y' BNE SMERR LDA #INDY JMP SMRET ; SMABS LDA #ABS BNE SMRET ; SMAX LDA #ABSX BNE SMRET ; SMZPY CMP #'Y' TSMERR BNE SMERR LDX MODE CPX #3 BEQ ZPYSP CPX #6 BEQ ZPYSP ; SMAY LDA #3 STA LEN LDA #ABSY BNE SMRET ; ZPOPND LDA ADRERR CMP #' ' BNE ABSOPD DEC LEN LDA (TEXTP),Y CMP #',' BNE SMZP INY LDA (TEXTP),Y CMP #'X' BNE SMZPY ZPYSP LDA #ZPX BNE SMRET ; SMIMM DEC LEN INY JSR EVALAB LDA VALUE+1 BEQ SMIMOK LDA VALUE BPL SMIMBD INC VALUE+1 BEQ SMIMOK SMIMBD LDA #' ' CMP ADRERR BCC SMIMOK LDA #'V' STA ADRERR SMIMOK LDX MODE CPX #3 BEQ XYIMM LDA #IMM BNE SMRET ; SMINX INY LDA (TEXTP),Y CMP #'X' BNE TSMERR INY LDA (TEXTP),Y CMP #')' BNE TSMERR XYIMM LDA #XIND SMRET STA MODE SMXIT CLC RTS ; SZI LDA #ZPIND BNE SMRET ; SMZP LDA #ZP BNE SMRET