.TITLE GSD2 .IDENT /hah014/ ; ; VERSION 01 ; ; TOM GETZINGER 05-SEP-80 ; ; Modified: 07-Nov-83 hah ; Save transfer address if specified by '.END label' ; 07-Nov-83 hah004 ; Add support for PSECT bits SAVE and LIBRARY. Note that since ; MACRO-11 will not support the LIBRARY bit, a note is printed ; each time a PSECT definition is printed that references this ; bit, saying that this module cannot be reassembled. However, ; the disassembly does continue so that the contents of the file ; can be examined. ; 10-Nov-83 hah008 ; If a global symbol record is a reference and not a definition, ; print a message to that effect. ; 27-Jul-85 hah010 ; Convert SELECT subroutine to support DOB as a I&D space task. ; 14-Aug-85 hah014 ; Support .WEAK declarations ; ; THIS MODULE DISASSEMBLES AND OUTPUTS "GSD" RECORDS ; ; 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 ; .PSECT RODATA,RO,D .NLIST BEX PSCATT: .WORD BLANK,SAV ; FORCE INTO ROOT (NOSAV, SAV) ;hah004 .WORD BLANK,LIB ; PSECT TYPE (NORMAL/LIBRARY) ;hah004 .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) .enabl lc ;hah008 BLANK: .ASCIZ "" OVR: .ASCIZ ",OVR" RO: .ASCIZ ",RO" ABS: .ASCIZ ",ABS" GBL: .ASCIZ ",GBL" D: .ASCIZ ",D" SAV: .ASCIZ ",SAV" LIB: .ASCIZ ",LIBRARY" ;hah004 NOASM0: .ASCIZ "; NOTE: This Program CANNOT be reassembled" ;hah004 noasm1: .ASCIZ "; since it references a Library .PSECT" ;hah004 noasm2: ;hah004 gblref: .asciz <11><11>/;Global reference/ ;hah008 .EVEN ;hah004 .dsable lc ;hah008 table: ;hah010 .BYTE GT.MNM,GT.IDN ;hah010 .WORD illcod ; ILLEGAL ;hah010 .WORD gsdttl ; .TITLE ;hah010 .WORD gsdcst ; .CSECT ;hah010 .WORD illcod ; INTERNAL SYMBOL NAME ;hah010 .WORD prgend ; .END ;hah010 .WORD gsdgbl ; .GLOBL ;hah010 .WORD gsdpsc ; .PSECT ;hah010 .WORD gsdidn ; .IDENT ;hah010 .PSECT CODE,RO .MCALL PUT$S .enabl lsb ;hah010 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 select #table ;hah010 gsdttl: MOV #TITLE,R0 ; OUTPUT " .TITLE " BR 60$ gsdcst: INC GBLPSN ; INCREMENT PSECT NUMBER MOV #CSECT,R0 ; OUTPUT " .CSECT " BR 60$ prgend: 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? beq 45$ ;Yes ;hah008 jmp 130$ ;No ;hah008 45$: ;hah008 MOV R1,ENDADR ; SET THE ENDING ADDRESS ;HAH CALL SETREF ; YES, REFERENCE IT JMP 130$ ; AND THEN WE'RE DONE ;hah008 gsdgbl: 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 " bit #1,g.flag(r3) ;Normal or weak? ;hah014 beq 57$ ;Normal ;hah014 mov #weak,r0 ;Output " .WEAK " ;hah014 57$: ;hah014 CALL APPEND ;hah008 MOV R3,R0 ;hah008 CALL ADDR50 ; ADD THE NAME ;hah008 bit #10,g.flag(r3) ;Is this a global reference? ;hah008 bne 120$ ;No ;hah008 mov #gblref,r0 ;Say this is a reference ;hah008 call append ;Put it in the buffer ;hah008 BR 120$ ;hah008 60$: CALL APPEND MOV R3,R0 CALL ADDR50 ; ADD THE NAME BR 120$ gsdpsc: 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 illcod ; 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 BITB #2,G.FLAG(R3) ; REFERENCE A LIBRARY? ;hah004 BEQ 105$ ; NO ;hah004 sub f.nrbd+2+fdbout,r5 ;Calculate record length ;hah004 put$s #fdbout,,r5 ;Output the record ;hah004 put$s #fdbout,#noasm0,#noasm1-noasm0 ;hah004 put$s #fdbout,#noasm1,#noasm2-noasm1 ;hah004 105$: ;hah004 MOV (SP)+,R4 ; RESTORE R4 MOV (SP)+,R2 ; RESTORE R2 BR 120$ gsdidn: 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 illcod: TRAP OBJFMT ; OBJECT FORMAT ERROR .END