.TITLE DISOP2 .IDENT /hah010/ ; ; VERSION 01 ; ; TOM GETZINGER 22-OCT-80 ; ; Modified: 27-Jul-85 hah010 ; Convert SELECT subroutine to support DOB as a I&D space task. ; ; 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 ; ; MACROs ;hah010 ; ;hah010 .macro select table ;hah010 mov r0,-(sp) ;Save R0 (restored by SELECT) ;hah010 mov table, r0 ;hah010 call select ;hah010 .endm ;hah010 ; ; Local data ;hah010 ; .PSECT RODATA,RO,D table: ;hah010 .BYTE 1,11. ;hah010 .WORD skip ; ILLEGAL ;hah010 .WORD addrss ; ADDRESS ;hah010 .WORD add100 ; ADDRESS*100 ;hah010 .WORD skip ; REG*100 ;hah010 .WORD brnch ; BRANCH ;hah010 .WORD skip ; MARK ;hah010 .WORD skip ; REG ;hah010 .WORD subone ; SOB ;hah010 .WORD skip ; AC*100 ;hah010 .WORD fppadd ; FPP ADDRESS ;hah010 .WORD skip ; SPL ;hah010 .WORD skip ; TRAP ;hah010 .PSECT CODE,RO .enabl lsb ;hah010 DISOP2:: MOV FRSTXT,R0 ; R0 -> FIRST TEXT ENTRY MOV T.VAL(R0),R2 ; R2 = INSTRUCTION select #table ;hah010 fppadd: BIT #70,R2 ; IS THIS REGISTER MODE? BNE addrss ; NO BIT #4,R1 ; YES, IS IT A LEGAL FP REGISTER? BEQ addrss ; YES 7$: MOV FRSTXT,R4 ; NO, RESET TEXT POINTER SEV ; SET OVERFLOW RETURN ; AND RETURN add100: ASH #-6,R2 ; SHIFT ADDRESS MODE DOWN addrss: MOV R2,R1 ; GET THE REGISTER BIC #^C7,R1 ASH #-4,R2 ; GET THE MODE BIC #^C3,R2 BEQ skip ; 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 skip ; 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 skip ; YES, SO WE'RE DONE BIT #TF.REL,T.FLAG(R4) ; IS THE TEXT RELOCATED? BNE skip ; 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 skip ; AND WE'RE DONE 25$: TST R2 ; DEFERRED? BNE 7$ ; YES, THE OPERAND IS NOT LEGAL BR skip ; NO, WE'RE DONE 30$: CMP R2,#3 ; IS THE MODE INDEXED? BNE skip ; 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 skip ; YES, SO WE'RE DONE brnch: MOVB R2,R2 ; SIGN EXTEND THE BRANCH DISPLACEMENT BR 60$ subone: 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 skip ; AND WE'RE DONE 70$: MOV FRSTXT,R4 ; BACKUP TO START OF INST SEC ; SET ERROR FLAG BR 90$ ; AND LEAVE skip: .WORD CLC!CLV ; CLEAR ERROR FLAGS 90$: RETURN ; AND WE'RE DONE .END