; DIS-ASSEMBLER FOR MC 6801/6803 (SORCIM ACT68+6803 MACRO-LIB) ; CPU DEPENDING PART ; ; 1983.8.8. ; ; 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 COMMENT ENTRY CPAGE ;PAGE TOP COMMENT ENTRY CTAG ;TAG DATA ENTRY MENDCD ;END CODE POINT ; 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 FF EQU 0CH ;FORM FEED LF EQU 0AH ;LINE FEED ; ; OPTION SELECTION AT START POINT ; STRTMD: RET ; ; 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 L,M MOV H,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,'$' STAX D INX D CALL SETLOC ;SET ADDRESS POP PSW RET ; ; SET BYTE DATA ; INPUT ; A:DATA ; DE:BUFFER POINTER ; SETBDT: PUSH PSW MVI A,'$' STAX D INX D POP PSW JMP SETBYT ; ; 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 ; ABSOLT: MVI B,3 JMP SLOPPR ;PROGRAM ADDRESS ; ABSOLD: ;DATA ADDRESS MVI B,3 JMP SLOPDT ; ; RELATIVE END CODE ; RELATE: CALL STENDC ; ; 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 ; ; FULL MODE ; MODEFL: PUSH PSW ANI 40H CALL SETRGN ;SET REGISTER NAME POP PSW MODEFF: PUSH H LXI H,IXMODE MODEFJ: RRC RRC RRC ANI 06H ;GET BIAS 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 ; ; HALF MODE ; MODEHF: ANI 30H JNZ MODEFF MVI A,'#' ;IMMEDIATE ADDRESS STAX D INX D JMP ABSOLD ; ; 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 C,'D' ;AS DATA ADDRESS ZPAGES: MVI B,2 MOV L,M ;GET ADDRESS MVI H,0 JMP STLBOR ;SET AS ADDRESS ; ZPAGEA: MVI C,'A' JMP ZPAGES ;AS PROGRAM ADDRESS ; ; INDEXED ; INDEXD: MVI B,2 INDEXS: MOV A,M CALL SETBDT ;SET DATA CALL SETCOM ;SET COMMA MVI A,'X' STAX D INX D RET ; ; DOUBLE MODE WITH END ; DBLMOE: MOV C,A CALL STENDC MOV A,C ; ; DOUBLE MODE ; DBLMOD: ANI 10H JZ INDEXD ;INDEXED JMP ABSOLT ;PROGRAM ADDRESS ; ; NOT FULL MODE MASKING ; MODEFS: ;FULL STORE MOV C,A ANI 30H MOV A,C JZ SETDBS ;NOT MATCH JMP MODEFL ; MODEHS: ;HALF STORE MOV C,A ANI 30H MOV A,C JZ SETDBS JMP MODEHF ; MODEJS: ;JSR MODE PUSH H LXI H,IXMODJ JMP MODEFJ ; MODEHR: ;HALF REGISTER MOV C,A ANI 20H MOV A,C JNZ MODEHF RRC RRC RRC RRC MODERG: ;REGISTER ANI 1 ; ; SET REGISTER NAME ; INPUT ; ZF:ON A OFF B ; DE:TOP OF OPERAND AREA ; SETRGN: MVI A,'A' JZ $+5 MVI A,'B' PUSH H LXI H,-5 DAD D ;GET OPCODE POINT MOV M,A POP H RET ; ; ; MAIN ROUTINE INDEX ; IXMAIN: DW OBNOOP ;IMPLIED DW OBNOPE ;IMPLIED END DW RELATV ;RELATIVE ADDRESS DW RELATE ;RELATIVE ADDRESS END DW DBLMOE ;2 MODE END DW MODEFL ;FULL MODE DW MODEFS ;FULL STORE DW MODEHF ;HALF DW MODEHS ;HALF STORE DW MODEJS ;JSR DW MODERG ;STACK DW MODEHR ;HALF REGISTER ; ; MODE INDEX ; IXMODE: DW IMEDIT ;IMMEDIATE #00 DW ZPAGE ;DIRECT ZERO PAGE ZADD DW INDEXD ;INDEXED 00,X DW ABSOLD ;EXTENDED DADD ; IXMODJ: ;FOR JSR DW SETDBS ;IMMEDIATE IS ERROR DW ZPAGEA ;DIRECT PAGE AS PROGRAM ADDRESS DW INDEXD ;INDEXED DW ABSOLT ;EXTENDED AS PROGRAM ADDRESS ; ; CODE INDEX ; IXMNEM: DB 0FFH,29 ;IMPLIED 0 DB 01H,'NOP ' DB 04H,'LSRD' DB 05H,'ASLD' DB 06H,'TAP ' DB 07H,'TPA ' DB 08H,'INX ' DB 09H,'DEX ' DB 0AH,'CLV ' DB 0BH,'SEV ' DB 0CH,'CLC ' DB 0DH,'SEC ' DB 0EH,'CLI ' DB 0FH,'SEI ' DB 10H,'SBA ' DB 11H,'CBA ' DB 16H,'TAB ' DB 17H,'TBA ' DB 19H,'DAA ' DB 1BH,'ABA ' DB 30H,'TSX ' DB 31H,'INS ' DB 34H,'DES ' DB 35H,'TXS ' DB 38H,'PULX' DB 3AH,'ABX ' DB 3CH,'PSHX' DB 3DH,'MUL ' DB 3EH,'WAI ' DB 3FH,'SWI ' ; DB 0FFH,2 ;IMPLIED END DB 39H,'RTS ' DB 3BH,'RTI ' ; DB 0FFH,16 ;RELATIVE DB 21H,'BRN ' DB 22H,'BHI ' DB 23H,'BLS ' DB 24H,'BCC ' DB 25H,'BCS ' DB 26H,'BNE ' DB 27H,'BEQ ' DB 28H,'BVC ' DB 29H,'BVS ' DB 2AH,'BPL ' DB 2BH,'BMI ' DB 2CH,'BGE ' DB 2DH,'BLT ' DB 2EH,'BGT ' DB 2FH,'BLE ' DB 8DH,'BSR ' ; DB 0FFH,2 ;RELATIVE END DB 20H,'BRA ' DB 21H,'BRN ' ; DB 0EFH,1 ;2 MODE END DB 6EH,'JMP ' ; DB 8FH,10 ;FULL MODE DB 8BH,'ADD ' DB 89H,'ADC ' DB 84H,'AND ' DB 85H,'BIT ' DB 81H,'CMP ' DB 88H,'EOR ' DB 86H,'LDA ' DB 8AH,'ORA ' DB 80H,'SUB ' DB 82H,'SBC ' ; DB 8FH,1 ;EXCEPT IMMEDIATE DB 87H,'STA ' ; DB 0CFH,6 ;HALF MODE DB 83H,'SUBD' DB 8CH,'CPX ' DB 0C3H,'ADDD' DB 0CCH,'LDD ' DB 0CEH,'LDX ' DB 08EH,'LDS ' ; DB 0CFH,3 ;EXCEPT IMMEDIATE DB 0CDH,'STD ' DB 0CFH,'STX ' DB 08FH,'STS ' ; DB 0CFH,1 ;JSR DB 08DH,'JSR ' ; DB 0FEH,2 ;STACK DB 36H,'PSH ' DB 32H,'PUL ' ; DB 0CFH,11 ;HALF REGISTER DB 40H,'NEG ' DB 43H,'COM ' DB 44H,'LSR ' DB 46H,'ROR ' DB 47H,'ASR ' DB 48H,'ASL ' DB 49H,'ROL ' DB 4AH,'DEC ' DB 4CH,'INC ' DB 4DH,'TST ' DB 4FH,'CLR ' ; DB 0 ; ; PSEUDO OPERATION CODES ; PORG: DB 'ORG ' PEND: DB 'END ' PEQU: DB 'EQU ' PDB: DB 'DB ' PDW: DB 'DW ' ; ; COMMENTS ; CSTUP: DB 'DIS-ASSEMBLER MD6801/6803 VER.1.00',0 CPAGE: DB FF,' DIS-ASSEMBLER MD6800/6803 VER.1.00',0 CTAG: DB ' EQU *',0 ;TAG DATA ; ; MENDCD: DS 1 ;END CODE MODE 0 END CODE ; ; ; END