.TITLE $IFMTR ; INSTRUCTION FORMATTER ; ; ORIGINALLY A ONE NIGHT HACK BY DAVE CONROY AND DAVID MCLEY ; TYPED IN AGAIN BY DAVE CONROY ; SOME DAY IT WILL GO INTO A DEBUGGER .GLOBL $IFMTR .MCALL CALL, RETURN .NLIST BEX ; EQUIVALENCES TAB = 11 BLANK = 40 ; LOCAL DATA CCCHAR: .ASCII "CZVN" ;FOR CC SET AND CLEAR OPS. CCCEND: ; THIS IS THE OPCODE TABLE; ITS FORMAT WAS STOLED FROM DB ; EACH ENTRY IS 4 WORDS ; A MASK TO 'BIC' THE INSTRUCTION WORD WITH ; A VALUE TO COMPARE THIS TO ; A POINTER TO THE OPCODE NAME (ASCIZ) ; A ROUTINE TO CALL TO FORMAT THE OPERANDS .MACRO OP MASK, OPCODE, STR, TYPE .WORD MASK .WORD OPCODE OP1 STR,\...LAB ...LAB = ...LAB+1 .WORD TYPE .ENDM OP .MACRO OP1 STR, LAB .WORD L'LAB .PSECT .NAME. L'LAB: .ASCIZ "STR" .PSECT .ENDM OP1 ...LAB = 0 .PSECT .NAME.,CON .PSECT OPTAB: OP 000000, 000000, HALT, INHOPS OP 000000, 000001, WAIT, INHOPS OP 000000, 000002, RTI, INHOPS OP 000000, 000003, BPT, INHOPS OP 000000, 000004, IOT, INHOPS OP 000000, 000005, RESET, INHOPS OP 000000, 000006, RTT, INHOPS OP 000007, 000000, ILLOP, INHOPS OP 000077, 000100, JMP, SOP OP 000000, 000207, RETURN, INHOPS OP 000007, 000200, RTS, ROPS OP 000017, 000210, ILLOP, INHOPS OP 000007, 000230, SPL, SCOPS OP 000000, 000240, NOP, INHOPS OP 000000, 000241, CLC, INHOPS OP 000017, 000240, CLEAR, CCOPS OP 000000, 000261, SEC, INHOPS OP 000017, 000260, SET, CCOPS OP 000077, 000300, SWAB, SOP OP 000377, 000400, BR, BRANCH OP 000377, 001000, BNE, BRANCH OP 000377, 001400, BEQ, BRANCH OP 000377, 002000, BGE, BRANCH OP 000377, 002400, BLT, BRANCH OP 000377, 003000, BGT, BRANCH OP 000377, 003400, BLE, BRANCH OP 000077, 004700, CALL, SOP OP 000777, 004000, JSR, RDST OP 100077, 005000, CLR, SOWB OP 100077, 005100, COM, SOWB OP 100077, 005200, INC, SOWB OP 100077, 005300, DEC, SOWB OP 100077, 005400, NEG, SOWB OP 100077, 005500, ADC, SOWB OP 100077, 005600, SBC, SOWB OP 100077, 005700, TST, SOWB OP 100077, 006000, ROR, SOWB OP 100077, 006100, ROL, SOWB OP 100077, 006200, ASR, SOWB OP 100077, 006300, ASL, SOWB OP 000077, 006400, MARK, MARKS OP 000077, 006500, MFPI, SOP OP 000077, 006600, MTPI, SOP OP 000077, 006700, SXT, SOP OP 000777, 007000, ILLOP, INHOPS OP 107777, 010000, MOV, DBLOPS OP 107777, 020000, CMP, DBLOPS OP 107777, 030000, BIT, DBLOPS OP 107777, 040000, BIC, DBLOPS OP 107777, 050000, BIS, DBLOPS OP 007777, 060000, ADD, DBLOPS OP 007777, 160000, SU, DBLOPS OP 000777, 070000, MUL, SREG OP 000777, 071000, DIV, SREG OP 000777, 072000, ASH, SREG OP 000777, 073000, ASHC, SREG OP 000777, 074000, XOR, RDST OP 000007, 075000, FADD, ROPS OP 000007, 075010, FSUB, ROPS OP 000007, 075020, FMUL, ROPS OP 000007, 075030, FDIV, ROPS OP 000777, 077000, SOB, SOPOP OP 003777, 074000, ILLOP, INHOPS OP 000377, 100000, BPL, BRANCH OP 000377, 100400, BMI, BRANCH OP 000377, 101000, BHI, BRANCH OP 000377, 101400, BLOS, BRANCH OP 000377, 102000, BVC, BRANCH OP 000377, 102400, BVS, BRANCH OP 000377, 103000, BHIS, BRANCH OP 000377, 103400, BLO, BRANCH OP 000377, 104000, EMT, TRAPS OP 000377, 104400, TRAP, TRAPS OP 000077, 106400, ILLOP, INHOPS OP 000077, 106500, MFPD, SOP OP 000077, 106600, MTPD, SOP OP 001777, 106000, ILLOP, INHOPS OP 007777, 170000, 45FPP, INHOPS OP 177777, 000000, ILLOP, INHOPS OPTABE: .PAGE ;+ ; ** $IFMTR -- INSTRUCTION FORMATTER ; ; INPUTS: ; R0=THE PC ; R1=BUFFER POINTER ; ; OUTPUTS: ; R0=UPDATED AS THE MACHINE WOULD ; R1=ADVANCED ;- $IFMTR: MOV R5,-(SP) MOV R4,-(SP) MOV R3,-(SP) MOV R2,-(SP) MOV R0,R2 ;OUTPUT PC CALL ADDR MOVB #BLANK,(R1)+ MOV (R0)+,R2 ;LOOK UP INSTRUCTION MOV #OPTAB,R3 10$: MOV R2,R4 BIC (R3)+,R4 CMP R4,(R3)+ BEQ 20$ ADD #4,R3 CMP R3,#OPTABE BLO 10$ IOT 20$: MOV (R3)+,R4 ;COPY OUT OPCODE STRING 30$: MOVB (R4)+,(R1)+ BNE 30$ DEC R1 CALL @(R3)+ ;CALL OPCODE TYPE FORMATTER MOV (SP)+,R2 MOV (SP)+,R3 MOV (SP)+,R4 MOV (SP)+,R5 RETURN ; SMALL CONSTANT (SPL) ; INHERENT (HALT) SCOPS: MOVB #TAB,(R1)+ BIC #177770,R2 ADD #'0,R2 MOVB R2,(R1)+ INHOPS: RETURN ; REGISTER (RTS) ; SINGLE OPS WITH A 'B' (COM) ; SINGLE OPS WITHOUT A 'B' (MFPD) .ENABL LSB ROPS: MOVB #TAB,(R1)+ BIC #177770,R2 BR 10$ SOWB: TST R2 ;BYTE INSTR. HAVE BIT 15 SET BPL SOP MOVB #'B,(R1)+ SOP: MOVB #TAB,(R1)+ 10$: CALL AMODE RETURN .DSABL LSB ; DOUBLE OPERAND ; REGISTER, DESTINATION (JSR) .ENABL LSB DBLOPS: MOV #170077,R3 ;SOURCE MASK TST R2 ;BYTE INSTR. HAVE BIT 15 SET BPL 10$ MOVB #'B,(R1)+ BR 10$ RDST: MOV #177077,R3 ;SOURCE MASK (MAKES MODE 0) 10$: MOVB #TAB,(R1)+ MOV R2,-(SP) BIC R3,R2 ;SOURCE CALL ASR6 CALL AMODE MOVB #',,(R1)+ MOV (SP)+,R2 ;DESTINATION CALL AMODE RETURN .DSABL LSB ; SOURCE, REGISTER (MUL) SREG: MOVB #TAB,(R1)+ MOV R2,-(SP) CALL AMODE ;SOURCE (IN BITS 0-5) MOVB #',,(R1)+ MOV (SP)+,R2 ;DESTINATION (FORCE MODE 0) BIC #177077,R2 CALL ASR6 CALL AMODE RETURN ; BRANCHES BRANCH: MOVB #TAB,(R1)+ SWAB R2 ;GET OFFSET CALL ASR6 ASR R2 BIC #1,R2 ADD R0,R2 ;ACTUAL ADDRESS CALL ADDR RETURN ; EMT AND TRAP ; MARK .ENABL LSB MARKS: BIC #177700,R2 ;MARK COUNT BR 10$ TRAPS: BIC #177400,R2 ;TRAP CODE 10$: MOVB #TAB,(R1)+ CALL ADDRB RETURN .DSABL LSB ; CONDITION CODE OPS CCOPS: MOVB #TAB,(R1)+ MOV #CCCHAR,R3 10$: MOVB (R3)+,R4 ASR R2 ;IF THE INDICATOR IS AFFECTED BCC 20$ MOVB R4,(R1)+ ;PUT IT IN THE OUTPUT 20$: CMP R3,#CCCEND BLO 10$ RETURN ; SOB SOPOP: MOVB #TAB,(R1)+ MOV R2,-(SP) BIC #177077,R2 ;REGISTER (FORCE MODE 0) CALL ASR6 CALL AMODE MOVB #',,(R1)+ MOV (SP)+,R2 ;THEN ADDRESS BIS #177700,R2 ASL R2 ADD R0,R2 CALL ADDR RETURN .PAGE ;+ ; ** ASR6 -- DO 6 ASR'S ON R2 ; ; THIS EXISTS AS A ROUTINE BECAUSE OF NON EIS PDP-11 ; PROCESSORS. ;- ASR6: ASR R2 ASR R2 ASR R2 ASR R2 ASR R2 ASR R2 RETURN .PAGE ;+ ; ** AMODE -- FORMAT ADDRESSING MODE ; ; INPUTS: ; R0=THE PC ; R1=OUTPUT BUFFER POINTER ; R2=ADDRESS MODE (BITS 0-5) ; ; OUTPUTS: ; R0=MOVED AS THE MACHINE WOULD DO IT ; R1=ADVANCED ; ; USES: ; R2, R3, R4 ;- AMODE: MOV R2,R3 ;SAVE ADDRESS MODE BIC #177770,R2 ;REG. BIC #177707,R3 ;GO TO CORRECT PROCESSOR ASR R3 ASR R3 JMP @10$(R3) 10$: .WORD AMODE0 .WORD AMODE1 .WORD AMODE2 .WORD AMODE3 .WORD AMODE4 .WORD AMODE5 .WORD AMODE6 .WORD AMODE7 AMODE0: CALL AREG ;REGISTER MODE. RETURN AMODE1: MOVB #'(,(R1)+ ;REGISTER DEFERED MODE. CALL AREG MOVB #'),(R1)+ RETURN AMODE3: MOVB #'@,(R1)+ ;AUTOINCREMENT DEFERED MODE. AMODE2: CMP R2,#7 ;AUTOINCREMENT MODE. BEQ 10$ ;(PC)+ IS # CALL AMODE1 MOVB #'+,(R1)+ BR 20$ 10$: MOVB #'#,(R1)+ MOV (R0)+,R2 ;LITERAL WORD CALL ADDR 20$: RETURN AMODE5: MOVB #'@,(R1)+ ;AUTODECREMENT DEFERED MODE. AMODE4: MOVB #'-,(R1)+ ;AUTODECREMENT MODE CALL AMODE1 RETURN AMODE7: MOVB #'@,(R1)+ ;INDEX DEFERED MODE. AMODE6: CMP R2,#7 ;INDEX MODE BEQ 10$ ;XXX(PC) IS JUST XXX MOV R2,-(SP) MOV (R0)+,R2 ;INDEX CONSTANT CALL ADDR MOV (SP)+,R2 CALL AMODE1 BR 20$ 10$: MOV (R0)+,R2 ;COMPUTE ADDRESS ADD R0,R2 CALL ADDR 20$: RETURN .PAGE ;+ ; ** AREG -- FORMAT A REGISTER NAME ; ; INPUTS: ; R1=OUTPUT BUFFER POINTER ; R2=REGISTER ; ; OUTPUTS: ; R1=ADVANCED ; ; USES: ; R2 ;- AREG: CMP R2,#7 ;PC BNE 10$ MOVB #'P,(R1)+ MOVB #'C,(R1)+ BR 30$ 10$: CMP R2,#6 ;SP BNE 20$ MOVB #'S,(R1)+ MOVB #'P,(R1)+ BR 30$ 20$: MOVB #'R,(R1)+ ;RN ADD #'0,R2 MOVB R2,(R1)+ 30$: RETURN .PAGE ;+ ; ** ADDR -- FORMAT 6 DIGIT ADDRESS ; ** ADDRB -- FORMAT 3 DIGIT ADDRESS ; ; INPUTS: ; R1=OUTPUT BUFFER POINTER ; R2=ADDRESS ; ; OUTPUTS: ; R1=ADVANCED ; ; USES: ; R2, R3, R4 ;- .ENABL LSB ADDR: MOVB #'0,(R1) ;1ST DIGIT ASL R2 ADCB (R1)+ MOV #5,R3 ;5 MORE TO DO BR 10$ ADDRB: SWAB R2 ;POSITION BYTE IN TOP OF WORD CLC ROR R2 MOV #3,R3 ;3 MORE TO DO 10$: MOV #6,R4 ;6X IS 'X' ASL R2 ROL R4 ASL R2 ROL R4 ASL R2 ROL R4 MOVB R4,(R1)+ DEC R3 BNE 10$ RETURN .DSABL LSB .END