TITLE 'INNER DISASSEMBLY LOOP'›SUBTTL 'File DSMINS.AMA'›;›; This module actually disassembles a machine language›; instruction and loads the result in LINEBF.›; It is called as a subroutine from DSMAIN.›;›DSMINSLDX INSBUF;Get the opcode.›LDA MNEIND,X;Get the mnemonic offset.›TAX›LDY #2›DSMIN1LDA MNETEX,X ;Move mnemonic to LINEBF›STA LINEBF+7,Y›DEX›DEY›BPL DSMIN1›;›; The mnemonic is in LINEBF. Now we insert the operand.›;›JSR OPERA;Does this mean go to the opera?›RTS;Now LINEBF contains a›; complete assembly-language instruction.›;›;›; Subroutine to insert the operand into LINEBF.›;›PROC›OPERALDX INSBUF;Get opcode›LDA MODES,X;Get mode byte›AND #$1F;Mask out mode ID›TAX;Index operand subroutine table›LDA OPERS,X;Get subroutine address›STA TEMP;load in pointer›INX›LDA OPERS,X›STA TEMP+1›JMP (TEMP);And go there.›;›:IMPOPLDA #EOL;Implied mode›STA LINEBF+10›RTS;Easy, wasn't it?›;›:ACCOPLDA #'A';Accumulator mode›STA LINEBF+11›LDA #EOL›STA LINEBF+12›RTS;Not much harder›;›:IMMOPLDA #'#';Immediate mode›STA LINEBF+11›LDA #'$'›STA LINEBF+12›LDX #13›LDA INSBUF+1;Get immediate byte›JSR WRTHEX;Output it›LDA #EOL›STA LINEBF+15›RTS;Now it's getting interesting.›;›:RELOPLDA INSBUF+1;Get the relative displacement›STA ADRBUF›JSR RELADR;and convert to absolute.›LDX #11›JSR WRTOP;Write it out.›JSR ADRCOM›LDA #EOL›STA LINEBF,X›RTS›;›:ABSOPLDA INSBUF+1;Get address›STA ADRBUF ;Pass it to WRTOP›LDA INSBUF+2›STA ADRBUF+1›LDX #11›JSR WRTOP ;And write it out.›JSR ADRCOM›LDA #EOL›STA LINEBF,X›RTS›;›:XOPLDA INSBUF+1›STA ADRBUF›LDA INSBUF+2›STA ADRBUF+1›LDX #11›JSR WRTOP›LDA #','›STA LINEBF,X›INX›LDA #'X'›STA LINEBF,X›INX›JSR ADRCOM›LDA #EOL›STA LINEBF,X›RTS›;›:YOPLDA INSBUF+1›STA ADRBUF›LDA INSBUF+2›STA ADRBUF+1›LDX #11›JSR WRTOP›LDA #','›STA LINEBF,X›INX›LDA #'Y'›STA LINEBF,X›INX›JSR ADRCOM›LDA #EOL›STA LINEBF,X›RTS›;›:ZPOPLDX #11;Index operand›LDA #0›STA ADRBUF+1;Zero high byte›LDA INSBUF+1›STA ADRBUF›JSR WRTOP›:ZPXITJSR ADRCOM›LDA #EOL›STA LINEBF,X›RTS›;›:ZPXOPLDX #11›LDA #0›STA ADRBUF+1›LDA INSBUF+1›STA ADRBUF›JSR WRTOP›:ZPXXTLDA #','›STA LINEBF,X›INX›LDA #'X'›STA LINEBF,X›INX›JSR ADRCOM›LDA #EOL›STA LINEBF,X›RTS›;›:ZPYOPLDX #11›LDA #0›STA ADRBUF+1›LDA INSBUF+1›STA ADRBUF›JSR WRTOP›:ZPYXTLDA #','›STA LINEBF,X›INX›LDA #'Y'›STA LINEBF,X›INX›JSR ADRCOM›LDA #EOL›STA LINEBF,X›RTS›;›:INDOPLDA #'('›STA LINEBF+11›LDA INSBUF+1›STA ADRBUF›LDA INSBUF+2›STA ADRBUF+1›LDX #12›JSR WRTOP›LDA #')'›STA LINEBF,X›INX›JSR ADRCOM›LDA #EOL›STA LINEBF,X›RTS›;›:INXOPLDA #'('›STA LINEBF+11›LDA INSBUF+1›STA ADRBUF›LDA #0›STA ADRBUF+1›LDX #12›JSR WRTOP›INX›LDA #','›STA LINEBF,X›INX›LDA #'X'›STA LINEBF,X›INX›LDA #')'›STA LINEBF,X›INX›JSR ADRCOM›LDA #EOL›STA LINEBF,X›RTS›;›:INYOPLDA #'('›STA LINEBF+11›LDA INSBUF+1›STA ADRBUF›LDA #0›STA ADRBUF+1›LDX #12›JSR WRTOP›LDA #')'›STA LINEBF,X›INX›LDA #','›STA LINEBF,X›INX›LDA #'Y'›STA LINEBF,X›INX›JSR ADRCOM›LDA #EOL›STA LINEBF,X›RTS›;›;›;›; Vector table to operand subroutines.›;›OPERSDW :IMPOP,:ACCOP,:IMMOP,:RELOP›DW :ABSOP,:XOP,:YOP,:ZPOP›DW :ZPXOP,:ZPYOP,:INDOP›DW :INXOP,:INYOP›EPROC››