.TITLE DINS3 .IDENT /01/ .PSECT CODE,RO ; ; VERSION 01 ; ; TOM GETZINGER 22-OCT-80 ; ; THIS ROUTINE DISASSEMBLES AN INSTRUCTION ; ; ; LOCAL DATA ; .PSECT RWDATA,RW,D OPTYPE: .BLKW 1 .PSECT CODE DINS3:: MOV #2,INSTLN ; SET DEFAULT INST LEN TO 2 BYTES MOV T.VAL(R4),R1 ; GET THE TEXT VALUE MOV R1,INST ; SAVE IT COM R1 ; COMPLEMENT IT MOV #NINSTS,R2 ; R2 = # OF POSSIBLE INSTRUCTIONS MOV #INSTBL,R3 ; R3 = START OF INSTRUCTION TABLE 10$: MOV (R3)+,R0 ; GET THE MASK BIC R1,R0 ; "AND" IT WITH THE VALUE CMP R0,(R3)+ ; IS THIS THE RIGHT INSTRUCTION BNE 15$ ; NO BITB SWITCH,5(R3) ; YES, BUT IS IT A PERMISSABLE INSTRUCTION SET? BEQ 20$ ; YES, SO USE IT 15$: ADD #6,R3 ; NO, SKIP TO THE NEXT INST SOB R2,10$ ; AND TRY IT 17$: MOV #OUTBUF+8.,R5 ; POINT TO START OF OUTPUT BUFFER MOV #WORD,R0 ; IT ISN'T AN INSTRUCITON CALL APPEND ; SO OUTPUT IT AS A .WORD MOV R5,OPSTRT ; SAVE OPERAND START ADDRESS MOV T.VAL(R4),R0 CALL ADDOCT BR 50$ ; AND WE'RE DONE 20$: MOV 4(R3),OPTYPE ; GET OPERAND TYPES MOV R3,R0 CALL ADDR50 ; ADD THE MENMONIC TO THE OUTPUT TST -2(R3) ; IS THIS A POSSIBLE BYTE INST? BMI 30$ ; NO TST R1 ; YES, IS IT A BYTE INST? BMI 30$ ; NO MOVB #'B,(R5)+ ; YES, SO ADD A 'B' TO THE MNEMONIC 30$: CLR OPSTRT ; ASSUME THERE ARE NO OPERANDS MOV OPTYPE,R1 ; GET FIRST OPERAND TYPE BIC #^C17,R1 ; REMOVE OTHER BITS BEQ 50$ ; THERE IS NO FIRST OPERAND MOVB #11,(R5)+ ; ADD A TAB BETWEEN MNEM AND OPERAND MOV R5,OPSTRT ; SAVE OPERAND START ADDRESS CALL DISOP3 ; DISASSEMBLE THE OPERAND BCS 60$ ; WE RAN OUT OF TEXT BVS 17$ ; THE OPERAND WAS ILLEGAL MOV OPTYPE,R1 ; GET SECOND OPERAND TYPE ASH #-4,R1 ; PUT IT IN THE LOW FOUR BITS BIC #^C17,R1 ; REMOVE OTHER BITS BEQ 50$ ; THERE IS NO SECOND OPERAND MOVB #',,(R5)+ ; ADD A COMMA BETWEEN OPERANDS CALL DISOP3 ; DISASSEMBLE THE OPERAND BCS 60$ ; WE RAN OUT OF TEXT BVS 17$ ; THE OPERAND WAS ILLEGAL 50$: CLC ; CLEAR ERROR BIT 60$: RETURN ; AND WE'RE DONE .END