.TITLE GSD2 .IDENT /01/ .PSECT CODE,RO ; ; VERSION 01 ; ; TOM GETZINGER 05-SEP-80 ; ; THIS MODULE DISASSEMBLES AND OUTPUTS "GSD" RECORDS ; ; LOCAL DATA ; .PSECT RODATA,RO,D .NLIST BEX PSCATT: .WORD BLANK,0 ; MEMORY SPEED (LOW/HIGH) .WORD BLANK,0 ; PSECT TYPE (NORMAL/LIBRARY) .WORD BLANK,OVR ; ALLOCATION (CON/OVR) .WORD BLANK,BLANK ; UNUSED .WORD BLANK,RO ; ACCESS (RW/RO) .WORD ABS,BLANK ; RELOCATION (ABS/REL) .WORD BLANK,GBL ; SCOPE (LCL/GBL) .WORD BLANK,D ; TYPE (I/D) BLANK: .ASCIZ "" OVR: .ASCIZ ",OVR" RO: .ASCIZ ",RO" ABS: .ASCIZ ",ABS" GBL: .ASCIZ ",GBL" D: .ASCIZ ",D" .EVEN .PSECT CODE .MCALL PUT$S GSD2:: ASR R4 ; CALCULATE # OF GSD ENTRIES ASR R4 ASR R4 BNE 10$ ; ARE THERE ANY TO PROCESS? JMP 160$ ; NO, SO WE'RE DONE 10$: MOV F.NRBD+2+FDBOUT,R5 ; POINT TO OUTPUT RECORD MOVB G.TYPE(R3),R1 ; GET GSD TYPE CALL SELECT ; GO PROCESS IT .BYTE GT.MNM,GT.IDN .WORD 140$ ; ILLEGAL .WORD 20$ ; .TITLE .WORD 30$ ; .CSECT .WORD 140$ ; INTERNAL SYMBOL NAME .WORD 40$ ; .END .WORD 50$ ; .GLOBL .WORD 70$ ; .PSECT .WORD 110$ ; .IDENT 20$: MOV #TITLE,R0 ; OUTPUT " .TITLE " BR 60$ 30$: INC GBLPSN ; INCREMENT PSECT NUMBER MOV #CSECT,R0 ; OUTPUT " .CSECT " BR 60$ 40$: MOV (R3),ENDPSC ; SAVE END PSECT NAME MOV 2(R3),ENDPSC+2 MOV R3,R0 CALL PSCNUM ; FIND THE END PSECT NUMBER MOV G.VAL(R3),R1 ; GET THE END ADDRESS BIT #1,R1 ; IS THERE REALLY AN END ADDRESS? BNE 130$ ; NO CALL SETREF ; YES, REFERENCE IT BR 130$ ; AND THEN WE'RE DONE 50$: BIT #10,G.FLAG(R3) ; IS THIS A GLOBAL DEFINITION? BEQ 55$ ; NO MOV G.NAME(R3),(R2)+; YES, COPY THE NAME MOV G.NAME+2(R3),(R2)+ MOVB G.FLAG(R3),(R2)+; COPY THE FLAGS MOVB GBLPSN,(R2)+ ; COPY THE PSECT NUMBER MOV G.VAL(R3),R1 ; GET THE GLOBAL VALUE MOV R1,(R2)+ ; COPY IT MOV GBLPSN,R0 ; GET THE GLOBAL PSECT NUMBER CALL SETREF ; REFERENCE THE GLOBAL SYMBOL 55$: MOV #GLOBL,R0 ; OUTPUT " .GLOBL " 60$: CALL APPEND MOV R3,R0 CALL ADDR50 ; ADD THE NAME BR 120$ 70$: INC GBLPSN ; INCREMENT THE PSECT NUMBER CMP (R3),#^R. A ; IS THIS PSECT = ". ABS." BNE 80$ ; NO MOV #ASECT,R0 ; YES, OUTPUT " .ASECT" CALL APPEND BR 120$ 80$: MOV #PSECT,R0 ; " .PSECT " CALL APPEND MOV R3,R0 CALL ADDR50 ; ADD THE PSECT NAME MOVB G.FLAG(R3),R1 ; GET THE PSECT FLAGS MOV R2,-(SP) ; SAVE R2 MOV #PSCATT,R2 ; POINT TO PSECT ATTRIBUTE TABLE MOV R4,-(SP) ; SAVE R4 MOV #8.,R4 ; THERE ARE EIGHT BITS TO CHECK 90$: MOV (R2),R0 ; GET ATTRIBUTE FOR "OFF" BIT ROR R1 ; IS THE BIT OFF? BCC 100$ ; YES MOV 2(R2),R0 ; NO, GET ATTRIBUTE FOR "ON" BIT 100$: TST R0 ; IS THIS A LEGAL VALUE? BEQ 140$ ; NO CALL APPEND ; YES, SO ADD THE TEXT FOR IT ADD #4,R2 ; SKIP TO NEXT ATTRIBUTE SOB R4,90$ ; CONTINUE TIL ALL ATTRIBUTES DONE MOV (SP)+,R4 ; RESTORE R4 MOV (SP)+,R2 ; RESTORE R2 BR 120$ 110$: MOV #IDENT,R0 ; " .IDENT /" CALL APPEND MOV R3,R0 CALL ADDR50 ; ADD THE IDENT MOVB #'/,(R5)+ ; FOLLOWED BY A SLASH 120$: SUB F.NRBD+2+FDBOUT,R5 ; CALCULATE RECORD LENGTH PUT$S #FDBOUT,,R5 ; OUTPUT THE RECORD 130$: ADD #G.LEN,R3 ; SKIP TO NEXT GSD ENTRY DEC R4 ; ANY MORE ENTRIES? BEQ 160$ ; NO, SO WE'RE DONE JMP 10$ ; YES, SO GO PROCESS IT 160$: RETURN ; AND WE'RE DONE 140$: TRAP OBJFMT ; OBJECT FORMAT ERROR .END