.TITLE DISOP2 .IDENT /01/ .PSECT CODE,RO ; ; VERSION 01 ; ; TOM GETZINGER 22-OCT-80 ; ; THIS ROUTINE DISASSEMBLES AN OPERAND ; ; INPUTS: ; R4 POINTS TO THE CURRENT TEXT ENTRY ; R3 POINTS TO BUFFER FOR MEM REF, IF FOUND ; R1 IS THE OPERAND TYPE ; ; OUTPUTS: ; IF A MEMORY REFERENCE IS FOUND: ; (R3) = PSECT NUMBER ; 2(R3) = ADDRESS ; IF THERE IS NOT ENOUGH TEXT FOR THE OPERAND: ; CARRY IS SET ; R4 IS SET TO POINTE TO THE FIRST TEXT ENTRY ; IF THE OPERAND IS NOT LEGAL: ; OVERFLOW IS SET ; R4 IS SET TO POINT TO THE FIRST TEXT ENTRY ; ; EFFECTS: ; R0,R1,R2 ARE DESTROYED ; DISOP2:: MOV FRSTXT,R0 ; R0 -> FIRST TEXT ENTRY MOV T.VAL(R0),R2 ; R2 = INSTRUCTION CALL SELECT ; GO PROCESS THE OPERAND .BYTE 1,11. .WORD 80$ ; ILLEGAL .WORD 20$ ; ADDRESS .WORD 10$ ; ADDRESS*100 .WORD 80$ ; REG*100 .WORD 40$ ; BRANCH .WORD 80$ ; MARK .WORD 80$ ; REG .WORD 50$ ; SOB .WORD 80$ ; AC*100 .WORD 5$ ; FPP ADDRESS .WORD 80$ ; SPL .WORD 80$ ; TRAP 5$: BIT #70,R2 ; IS THIS REGISTER MODE? BNE 20$ ; NO BIT #4,R1 ; YES, IS IT A LEGAL FP REGISTER? BEQ 20$ ; YES 7$: MOV FRSTXT,R4 ; NO, RESET TEXT POINTER SEV ; SET OVERFLOW RETURN ; AND RETURN 10$: ASH #-6,R2 ; SHIFT ADDRESS MODE DOWN 20$: MOV R2,R1 ; GET THE REGISTER BIC #^C7,R1 ASH #-4,R2 ; GET THE MODE BIC #^C3,R2 BEQ 80$ ; IT'S 0 OR 1, SO DO NOTHING CMP R1,#7 ; IS THE REGISTER PC? BNE 30$ ; NO ASR R2 ; IS THE MODE AUTO DECREMENT? BCC 80$ ; YES, SO DO NOTHING MOV (R4),R0 ; POINT TO THE NEXT TEXT ENTRY BEQ 70$ ; WE RAN OUT OF TEXT BIT #TF.BYT!TF.LMT,T.FLAG(R0) ; IS THIS A WORD? BNE 25$ ; NO MOV R0,R4 ; YES, SO SKIP TO IT TST R2 ; IS THE MODE AUTO INCREMENT? BEQ 80$ ; YES, SO WE'RE DONE BIT #TF.REL,T.FLAG(R4) ; IS THE TEXT RELOCATED? BNE 80$ ; YES, SO WE'RE DONE MOV CRNPSN,(R3)+ ; NO, SO SET PSECT # TO CURRENT MOV T.VAL(R4),(R3) ; COPY TEXT VALUE ADD T.ADDR(R4),(R3) ; ADD TEXT ADDRESS ADD #2,(R3) ; ADD 2 TO GET REFERENCED ADDRESS BR 80$ ; AND WE'RE DONE 25$: TST R2 ; DEFERRED? BNE 7$ ; YES, THE OPERAND IS NOT LEGAL BR 80$ ; NO, WE'RE DONE 30$: CMP R2,#3 ; IS THE MODE INDEXED? BNE 80$ ; NO, SO WE'RE DONE MOV (R4),R4 ; POINT TO THE NEXT TEXT ENTRY BEQ 70$ ; WE RAN OUT OF TEXT BIT #TF.BYT!TF.LMT,T.FLAG(R4) ; IS THIS A WORD? BNE 7$ ; NO, SO THE OPERAND IS NOT LEGAL BR 80$ ; YES, SO WE'RE DONE 40$: MOVB R2,R2 ; SIGN EXTEND THE BRANCH DISPLACEMENT BR 60$ 50$: BIC #^C77,R2 ; CLEAR GARBAGE NEG R2 ; NEGATE SOB OFFSET 60$: INC R2 ; OFFSTE IS FROM THE WORD AFTER THE BRANCH ASL R2 ; CONVERT TO WORD OFFSET ADD T.ADDR(R4),R2 ; CONVERT TO ADDRESS MOV CRNPSN,(R3)+ ; SET PSECT NUMBER TO CURRENT MOV R2,(R3) ; SET ADDRESS UP BR 80$ ; AND WE'RE DONE 70$: MOV FRSTXT,R4 ; BACKUP TO START OF INST SEC ; SET ERROR FLAG BR 90$ ; AND LEAVE 80$: .WORD CLC!CLV ; CLEAR ERROR FLAGS 90$: RETURN ; AND WE'RE DONE .END