.TITLE DINS2 .IDENT /01/ .PSECT CODE,RO ; ; VERSION 01 ; ; TOM GETZINGER 22-OCT-80 ; ; THIS ROUTINE DISASSEMBLES AN INSTRUCTION, SETTING THE BITMAP ; WHEN NECESSARY. ; ; ; LOCAL DATA ; .PSECT RWDATA,RW,D PSCT1: .BLKW 1 LOC1: .BLKW 1 PSCT2: .BLKW 1 LOC2: .BLKW 1 OPTYPE: .BLKW 1 .PSECT CODE DINS2:: MOV #-1,PSCT1 ; FIRST REF DOESN'T EXIST MOV #-1,PSCT2 ; NEITHER DOES THE SECOND MOV T.VAL(R4),R1 ; GET THE TEXT VALUE 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 NEXT 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 BR 50$ ; IT ISN'T A LEGAL INSTRUCTION 20$: MOV 4(R3),OPTYPE ; GET OPERAND TYPES MOV OPTYPE,R1 ; GET FIRST OPERAND TYPE BIC #^C17,R1 ; REMOVE OTHER BITS BEQ 60$ ; THERE IS NO FIRST OPERAND MOV #PSCT1,R3 ; SETUP POINTER FOR FIRST REFERENCE CALL DISOP2 ; DISASSEMBLE THE OPERAND BCS 60$ ; WE RAN OUT OF TEXT BVS 50$ ; 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 40$ ; THERE IS NO SECOND OPERAND MOV #PSCT2,R3 ; SETUP POINTER FOR SECOND REFERENCE CALL DISOP2 ; DISASSEMBLE THE OPERAND BCS 60$ ; WE RAN OUT OF TEXT BVS 50$ ; THE OPERAND WAS ILLEGAL MOV PSCT2,R0 ; WAS THE 2ND OPERAND A REFERENCE? BMI 40$ ; NO MOV LOC2,R1 ; YES CALL SETREF ; SO SET IT 40$: MOV PSCT1,R0 ; WAS THE 1ST OPERAND A REFERENCE? BMI 50$ ; NO MOV LOC1,R1 ; YES CALL SETREF ; SO SET IT 50$: CLC ; CLEAR ERROR BIT 60$: RETURN ; AND WE'RE DONE .END