; DIS-ASSEMBLER FOR 6502 (AVOCET XASM-65) ; CPU DEPENDING PART ; ; 1982.9.18. ; 1983.9.23. ; ; EQUATIONS OF EXTERNAL & ENTRY SYMBOLS ; ENTRY STRTMD ;START MODE SET UP ROUTINE ENTRY LOOPIN ;LOOP INITIALIZE ROUTINE ENTRY SETDB ;SET DEFINE BYTE PSUDO LINE ENTRY SETDW ;SET DEFINE WORD PSEUDO LINE ENTRY SETBDT ;SET BYTE DATA ENTRY SETWDT ;SET WORD DATA ; ENTRY IXMNEM ;MNEMONIC MAIN INDEX ENTRY IXMAIN ;MAIN ROUTINE INDEX ; ENTRY PORG ;ORIGINATE PSUDO DATA POINT ENTRY PEQU ;EQUATION PSUDO DATA POINT ENTRY PEND ;END PSUDO DATA POINT ; ENTRY CSTUP ;START UP COMMNET ENTRY CPAGE ;PAGE top comment ENTRY CTAG ;TAG DATA ENTRY MENDCD ;END CODE POINT ENTRY ASMTYP ;Ex.(XXXX.A65) ; EXT GETYN ;GET YES NO RESPONSE EXT COPY ;COPY DATA EXT ENDLIS ;ONE LINE END PROCESS EXT STLBOR ;SET LABEL DATA EXT LOOPDL ;LINE DECODE LOOP FOR INDEXED EXT SRCHCD ;SEARCH CODE EXT SETLOC ;SET LOCATION DATA EXT SETBYT ;SET BYTE DATA ; EXT WKOPCD ;OPCODE POINT IN WORK EXT BCODE ;INPUT FILE CODE BUFFER EXT PCURNT ;CURRENT PROGRAM ADDRESS ; ; EQUATIONS OF DATA ; CR EQU 0DH ;CARIAGE RETURN LF EQU 0AH ;LINE FEED FF EQU 0CH ;Form feed ; ; OPTION SELECTION AT START POINT ; STRTMD: RET ;NO OPTION ; ; ONE LINE DECODING LOOP INITIALIZE ROUTINE ; OUTPUT ; HL:LINE END ROUTINE POINTER ; LOOPIN: MVI A,-1 STA MENDCD ;RESET END CODE MODE LXI H,ENDLIN RET ; ; END PROCESS OF ONE LINE ; ENDLIN: JMP ENDLIS ;TO MAIN END ROUTINE ; ; SET UP OF LABELED OPERAND ; SLOPDT: ;DATA LABEL MVI C,'D' JMP STLBOP ; SLOPPR: ;PROGRAM LABEL MVI C,'A' JMP STLBOP ; SLOPTB: ;TABLE LABEL MVI C,'T' STLBOP: MOV A,M INX H MOV H,M MOV L,A ;GET ADDRESS JMP STLBOR ; ; SET DEFINE BYTE ; SETDB: POP H ;CANCEL CODE POINTER SETDBS: CALL CLROPA ;CLEAR OPCODE & OPRAND AREA LXI H,PDB CALL SETOPC ;SET 'DB ' MVI B,1 ;ONE BYTE LDA BCODE ;GET CODE JMP SETBDT ;SET BYTE DATA ; ; SET DEFINE WORD ; SETDW: LXI H,PDW CALL SETOPC ;SET 'DW ' POP H MVI B,2 ;TWO BYTE DATA JMP SLOPPR ;SET AS PROGRAM LABEL ; ; SET OPCODE TO BUFFER ; INPUT ; HL:OPCODE DATA POINT ; OUTPUT ; DE:OPERAND BUFFER POINT ; SETOPC: LXI D,WKOPCD ;OPCODE DATA BUFFER LXI B,4 ;LENGTH OF OPCODE CALL COPY LXI D,WKOPCD+8 ;OPERAND BUFFER POINT RET ; ; SET COMMA ; SETCOM: PUSH PSW MVI A,',' STAX D INX D POP PSW RET ; ; CLEAR OPCODE & OPERAND AREA ; CLROPA: LXI H,WKOPCD MVI B,20 CLRLIL: MVI M,' ' ;FILL BY SPACE INX H DCR B JNZ CLRLIL MVI M,0 ;SET END CODE RET ; ; SET WORD DATA ; INPUT ; HL:DATA ; DE:BUFFER POINTER ; SETWDT: PUSH PSW MVI A,'0' STAX D INX D CALL SETLOC ;SET ADDRESS MVI A,'H' STAX D INX D POP PSW RET ; ; SET BYTE DATA ; INPUT ; A:DATA ; DE:BUFFER POINTER ; SETBDT: PUSH PSW MVI A,'0' STAX D INX D POP PSW CALL SETBYT MVI A,'H' STAX D INX D RET ; ; SET END CODE MODE ; STENDC: XRA A STA MENDCD ;SET END CODE MODE RET ; ; EACH INSTRUCTION ROUTINE ; ; INPUT ; A:CODE ; DE:OPERAND DATA BUFFER POINT ; HL:CODE DATA BUFFER POINT ; ; ONE BYTE NO OPERAND ; OBNOOP: RET ;DO NOTHING ; OBNOPE: ;NO OPERAND END CODE JMP STENDC ; ; ABSOLUTE PROGRAM ADDRESSING ; ABSOLE: ;END CODE CALL STENDC ABSOLT: MVI B,3 JMP SLOPPR ;PROGRAM ADDRESS ; ABSOLD: ;DATA ADDRESS MVI B,3 JMP SLOPDT ; ; INDIRECT & END ; INDIRE: CALL STENDC MVI A,'[' STAX D INX D CALL SLOPDT ;SET LABEL AS DATA LABEL MVI A,']' STAX D INX D MVI B,3 RET ; ; RELATIVE ; RELATV: MVI B,2 PUSH D MOV A,M INX H MOV E,A RAL SBB A ;GET SIGN MOV D,A LHLD PCURNT ;GET CURRENT ADDRESS INX H INX H DAD D ;GET ADDRESS POP D MVI C,'A' JMP STLBOR ;SET AS PROGRAM ADDRESS ; ; MULTI ADDRESSING MODE INSTRUCTION ROUTINES ; MODE: MODEIN: MODEBT: ANI 1CH ;GET MODE DATA RRC PUSH H LXI H,IXMODE ADD L MOV L,A MOV A,H ACI 0 MOV H,A ;GET INDEX POINT MOV A,M INX H MOV H,M MOV L,A XTHL RET ;TO EACH ROUTINE ; ; IMMEDIATE ; IMEDIT: MVI A,'#' STAX D INX D MVI B,2 MOV A,M ;SET DATA BYTE JMP SETBDT ;SET AS DATA ; ; ZERO PAGE ; ZPAGE: MVI B,2 MOV L,M ;GET ADDRESS MVI H,0 MVI C,'D' JMP STLBOR ;SET AS DATA ADDRESS ; ; ZERO PAGE INDEXED BY X ; ZPAGEX: CALL ZPAGE ADDXCD: CALL SETCOM MVI A,'X' STAX D INX D RET ; ; ABSOLUTE WITH INDEX ; ABSOLY: CALL ABSOLD ADDYCD: CALL SETCOM MVI A,'Y' STAX D INX D RET ; ABSOLX: CALL ABSOLD JMP ADDXCD ; ; ZERO PAGE INDEXED BY Y ; ZPAGEY: CALL ZPAGE JMP ADDYCD ; ; INDIRECT X ; INDIRX: MVI A,'[' STAX D INX D CALL ZPAGEX MVI A,']' STAX D INX D RET ; ; INDIRECT Y ; INDIRY: MVI A,'[' STAX D INX D CALL ZPAGE MVI A,']' STAX D INX D JMP ADDYCD ; ; ACCUMLATOR ; ACCUM: MVI A,'A' STAX D INX D RET ; ; NOT FULL MODE MASKING ; MODESF: ;SHIFT ANI 1CH CPI 8 JZ ACCUM ;ACCUMLATOR MOV C,A ANI 4 MOV A,C JZ SETDBS ;NOT MATCH JMP MODE ; MODEST: ;STORE ANI 1CH CPI 8 JZ SETDBS ;NOT MATCH JMP MODE ; MODECP: ;COMPARE WITH INDEX ANI 0CH CPI 8 JZ SETDBS ;NOT MATCH ORA A JNZ MODE ORI 8 JMP MODE ;IMMEDIATE ; MODESX: ANI 1CH CPI 14H JZ ZPAGEY MODESY: ANI 1CH CPI 1CH JZ SETDBS ;NOT MATCH JMP MODE ; MODELX: ;LDX ANI 1CH CPI 14H JZ ZPAGEY ;ZERO PAGE Y CPI 1CH JZ ABSOLY ;ABSOLUTE Y MODELY: ;LDY ANI 1CH JZ IMEDIT MOV C,A ANI 4 MOV A,C JZ SETDBS ;NOT MATCH JMP MODE ; ; ; MAIN ROUTINE INDEX ; IXMAIN: DW OBNOOP ;ONE BYTE NO OPERAND DW ABSOLT ;ABSOLUTE PROGRAM ADDRESS DW OBNOPE ;ONE BYTE NO OPERAND & END CODE DW ABSOLE ;ABSOLUTE END CODE DW INDIRE ;INDIRECT END CODE DW RELATV ;RELATIVE ADDRESSING DW MODE ;FULL MODE ARITHMETIC DW MODEST ;7 MODES STORE DW MODESF ;5 MODES SHIFT DW MODEIN ;4 MODES INCREMENT DW MODECP ;3 MODES COMPARE WITH INDEXED DW MODEBT ;2 MODES BIT DW MODESX ;3 MODES STORE X INDEXED DATA DW MODESY ;3 MODES STORE Y INDEXED DATA DW MODELX ;5 MODES LOAD TO X INDEXED ADDRESS DW MODELY ;5 MODES LOAD TO Y INDEXED ADDRESS ; ; MODE INDEX ; IXMODE: DW INDIRX ;INDIRECT X (ZADD,X) DW ZPAGE ;ZERO PAGE ZADD DW IMEDIT ;IMMEDIATE #00 DW ABSOLD ;ABSOLUTE DATA ADD DADD DW INDIRY ;INDIRECT Y (ZADD),Y DW ZPAGEX ;ZERO PAGE X ZADD,X DW ABSOLY ;ABSOLUTE Y DADD,Y DW ABSOLX ;ABSOLUTE X DADD,X ; ; CODE INDEX ; IXMNEM: DB 0FFH,23 ;IMPLIED 0 DB 018H,'CLC ' DB 0D8H,'CLD ' DB 058H,'CLI ' DB 0B8H,'CLV ' DB 0CAH,'DEX ' DB 088H,'DEY ' DB 0E8H,'INX ' DB 0C8H,'INY ' DB 000H,'BRK ' DB 0EAH,'NOP ' DB 048H,'PHA ' DB 008H,'PHP ' DB 068H,'PLA ' DB 028H,'PLP ' DB 038H,'SEC ' DB 0F8H,'SED ' DB 078H,'SEI ' DB 0AAH,'TAX ' DB 0A8H,'TAY ' DB 0BAH,'TSX ' DB 08AH,'TXA ' DB 09AH,'TXS ' DB 098H,'TYA ' ; ;ABSOLUTE ONLY DB 0FFH,1 DB 020H,'JSR ' ; ;IMPLIED END CODE DB 0FFH,2 DB 040H,'RTI ' DB 060H,'RTS ' ; ;ABSOLUTE END CODE DB 0FFH,1 DB 04CH,'JMP ' ; ;INDIRECT END CODE DB 0FFH,1 DB 06CH,'JMP ' ; ;RELATIVE DB 0FFH,8 DB 090H,'BCC ' DB 0B0H,'BCS ' DB 0F0H,'BEQ ' DB 030H,'BMI ' DB 0D0H,'BNE ' DB 010H,'BPL ' DB 050H,'BVC ' DB 070H,'BVS ' ; ;MULTI MODE INSTRUCTIONS ;FULL MODE ARITHMETIC DB 0E3H,7 DB 061H,'ADC ' DB 021H,'AND ' DB 0C1H,'CMP ' DB 041H,'EOR ' DB 0A1H,'LDA ' DB 001H,'ORA ' DB 0E1H,'SBC ' ; ;7 MODES STORE DB 0E3H,1 DB 081H,'STA ' ; ;5 MODES SHIFT DB 0E3H,4 DB 002H,'ASL ' DB 042H,'LSR ' DB 022H,'ROL ' DB 062H,'ROR ' ; ;4 MODES INCREMENT DB 0E7H,2 DB 0E6H,'INC ' DB 0C6H,'DEC ' ; ;3 MODES COMPARE WITH INDEXED DATA DB 0F3H,2 DB 0E0H,'CPX ' DB 0C0H,'CPY ' ; ;2 MODES BIT DB 0F7H,1 DB 24H,'BIT ' ; ;3 MODES STORE INDEXED DATA DB 0E7H,1 DB 086H,'STX ' ; DB 0E7H,1 DB 084H,'STY ' ; ;5 MODES LOAD TO INDEXED ADDRESS DB 0E3H,1 DB 0A2H,'LDX ' ; DB 0E3H,1 DB 0A0H,'LDY ' ; DB 0 ; ; PSEUDO OPERATION CODES ; PORG: DB 'ORG ' PEND: DB 'END ' PEQU: DB 'EQU ' PDB: DB 'DB ' PDW: DB 'DW ' ASMTYP: DW '65' ; ; COMMENTS ; CSTUP: DB 'DIS-ASSEMBLER 6502 Ver.2.02',0 CTAG: DB ':',0 ;TAG DATA CPAGE: DB FF,'//DIS-ASSEMBLER MCS6502 ver.2.02//',0 ; ; MENDCD: DS 1 ;END CODE MODE 0 END CODE ; ; ; END