.TITLE DASM3 .IDENT /01/ .PSECT CODE,RO ; ; VERSION 01 ; ; TOM GETZINGER 21-SEP-80 ; ; THIS ROUTINE DISASSEMBLES AS MUCH TEXT AS IT CAN, WRITING IT ; TO THE OUTPUT FILE. ; .MCALL PUT$S DASM3:: JSR R5,$SAVRG ; SAVE R3-R5 5$: MOV FRSTXT,R4 ; R4 -> FIRST TEXT ENTRY BEQ 60$ ; THERE IS NO TEXT MOV #OUTBUF+8.,R5 ; POINT TO THE OUTPUT BUFFER BIT #TF.LMT,T.FLAG(R4) ; IS THIS A .LIMIT? BEQ 10$ ; NO MOV #LIMIT,R0 ; YES, SO OUTPUT = ".LIMIT" CALL APPEND MOV #4,INSTLN ; THE INSTRUCTION IS TWO WORDS LONG (4 BYTES) CLR INST ; BOTH WORDS ARE ZERO CLR INST+2 CLR OPSTRT ; THIS INSTRUCTION HAS NO OPERANDS BR 50$ 10$: BIT #TF.BYT,T.FLAG(R4) ; IS THIS A BYTE? BEQ 30$ ; NO MOV #BYTE,R0 ; YES, SO OUTPUT = ".BYTE " CALL APPEND MOV R5,OPSTRT ; SAVE OPERAND STARTING ADDRESS MOV #1,INSTLN ; THE INSTRUCTION IS ONE BYTE LONG BIT #TF.REL,T.FLAG(R4) ; IS THE VALUE RELOCATED? BEQ 20$ ; NO MOV T.STR(R4),R0 ; YES, GET STRING POINTER CALL ADDSTR ; ADD IT TO OUTPUT CLR INST ; USE A VALUE OF ZERO BR 50$ 20$: MOV T.VAL(R4),R0 ; GET TEXT VALUE MOV R0,INST ; PUT IN INSTRUCTION VALUE TABLE CALL ADDOCT ; OUTPUT THE INSTRUCTION IN OCTAL BR 50$ 30$: BIT #TF.REL,T.FLAG(R4) ; IS THE WORD RELOCATED? BEQ 40$ ; NO MOV #WORD,R0 ; YES, OUTPUT = ".WORD " CALL APPEND MOV R5,OPSTRT ; SAVE OPERAND STARTING ADDRESS MOV #2,INSTLN ; THE INSTRUCTION IS TWO BYTES LONG CLR INST ; USE A VALUE OF ZERO MOV T.STR(R4),R0 ; GET STRING POINTER CALL ADDSTR ; ADD IT TO OUTPUT BR 50$ 40$: CALL DINS3 ; DISASSEMBLE THE INSTRUCTION BCS 60$ ; IT ISN'T AN INSTRUCTION 50$: CALL TXTOUT ; OUTPUT THE TEXT BR 5$ ; GO DO THE NEXT TEXT ENTRY 60$: RETURN ; AND WE'RE DONE .END