.TITLE GSDDEC ; ROUTINE TO DECODE GSD RECORD ENTRIES IN OBJECT FILES ; ; GLOBALS DEFINED HERE .GLOBL GSDDEC PSECAD XFRADD HBUF2 ; ; GLOBALS DEFINED ELSEWHERE .GLOBL FLWORD DS.GSD PSCBUF HBUF1 OUTBUF .GLOBL STRPSC RECBF2 RECSET TXTRAN BLNKIT .GLOBL STRPSC HBUFL OUTFDB FILFDB ; ; DEFINE MACROS USED HERE .MCALL PUT$ .MACRO QIOEXE ADD,LEN PUT$ #OUTFDB,ADD,LEN CALL TOFC .ENDM QIOEXE .MACRO BLNKLN ADD,LEN MOV ADD,R0 MOV LEN,R1 JSR PC,BLNKIT .ENDM BLNKLN .MACRO R5ASCL ADR,RAD50 MOV ADR,R0 MOV RAD50,R1 .GLOBL $C5TA JSR PC,$C5TA .ENDM R5ASCL .MACRO CBASCL ADR,NUM,FLAG,ROUTIN MOV ADR,R0 MOV NUM,R1 MOV FLAG,R2 .GLOBL ROUTIN JSR PC,ROUTIN .ENDM CBASCL ; ; MACRO CALLS .MCALL FDOF$L ; DEFINE VARIOUS SYMBOLS LOCALLY FDOF$L ;FDB OFFSETS ; ; DATA STORAGE AREA XFRADD: .WORD 0 ;TRANSFER ADDRESS PSECAD: .WORD 0 ;POINTER TO NEXT PSECT STORAGE BFNAM: .WORD 0 ;ADDRESS OF TEXT BEFORE NAME AFNAM: .WORD 0 ;ADDRESS OF TEXT AFTER NAME AFPROC: .WORD 0 ;ADDRESS OF ROUTINE FOR FURTHER PROCESSING NAMST: .WORD 0,0 ; Store for PSECT name AC0: .ASCII /AC0=%0/ AC1: .ASCII /AC1=%1/ AC2: .ASCII /AC2=%2/ AC3: .ASCII /AC3=%3/ .NLIST BEX HBUF2: .BYTE 14 ;FORMFEED BLKB: .ASCIZ <11>/.BLKB/<11> TITLE: .ASCIZ <11>/.TITLE/<11> CSECT: .ASCIZ <11>/.CSECT/<11> PCOM: .ASCIZ <11>/;MAX LEN = / IDENT: .ASCIZ <11>/.IDENT/<11><57> IDENT1: .ASCIZ ;/; INTSYM: .ASCIZ /;INTERNAL SYMBOL "/ VALUE: .ASCIZ /" VALUE = / XFERAD: .ASCIZ /;TRANSFER ADDRESS IN PSECT "/ OFFSET: .ASCIZ /" OFFSET = / GLOBL: .ASCIZ <11>/.GLOBL/<11> EQUAL: .ASCIZ /==/ DOTEQ: .ASCIZ /==.+/ PSECT: .ASCIZ <11>/.PSECT/<11> ATTLST: .BYTE 0 .ASCIZ /,HIGH/ .BYTE 0 .BYTE 0 .ASCIZ /,CON/ .ASCIZ /,OVL/ .BYTE 0 .BYTE 0 .ASCIZ /,RW/ .ASCIZ /,RO/ .ASCIZ /,ABS/ .ASCIZ /,REL/ .ASCIZ /,LCL/ .ASCIZ /,GBL/ .ASCIZ /,I/ .ASCIZ /,D/ .EVEN .LIST BEX GSDDEC: BIT #DS.GSD,FLWORD ;CHECK FOR FLAG SET BNE GSD001 ;IF SET, SKIP SETUP MOV #PSCBUF,PSECAD ;PSECAD CONTAINS ADD FOR NEXT PSECT NAME MOV #1,XFRADD ;DEFAULT IS SUBROUTINE BIS #DS.GSD,FLWORD ;SET BIT SO SKIP THIS NEXT TIME BIT #4,SWORD ; /MA specified? BNE GSD001 ; If NE yes - omit heading PUT$ #OUTFDB,#HBUF2,#1 ;PRINT FORMFEED PUT$ #OUTFDB,#HBUF1,HBUFL ;OUTPUT HEADER LINE GSD001: BLNKLN #OUTBUF,#80. ;INIT LINE WITH BLANKS MOVB 5(R4),R3 ;TYPE BYTE IN R3 ASL R3 ;USE IT FOR INDEX JMP @GSDTBL(R3) GSDTBL: .WORD T0 .WORD T1 .WORD T2 .WORD T3 .WORD T4 .WORD T5 .WORD T6 T0: MOV #TITLE,BFNAM CLR AFNAM CLR AFPROC BR GSDCOM T1: MOV #CSECT,BFNAM MOV #PCOM,AFNAM MOV #-1,AFPROC ;-1 -> CONVERT VALUE BR GSDCOM T2: MOV #INTSYM,BFNAM MOV #VALUE,AFNAM MOV #-1,AFPROC BR GSDCOM T3: MOV #XFERAD,BFNAM MOV #OFFSET,AFNAM MOV #XFSTOR,AFPROC BR GSDCOM T4: BITB #10,4(R4) ;IS THIS SYMBOL DEFINED HERE BNE 1$ ;IF SO, BRANCH MOV #GLOBL,BFNAM CLR AFNAM CLR AFPROC BR GSDCOM 1$: BITB #40,4(R4) ;IS SYMBOL ABS OR REL BNE 2$ ;IF REL, BRANCH CLR BFNAM MOV #EQUAL,AFNAM 3$: MOV #-1,AFPROC BR GSDCOM 2$: CLR BFNAM MOV #DOTEQ,AFNAM BR 3$ T5: MOV #PSECT,BFNAM CLR AFNAM MOV #PSECPR,AFPROC BR GSDCOM T6: MOV #IDENT,BFNAM MOV #IDENT1,AFNAM ;ADD TRAILING "/" CLR AFPROC BR GSDCOM GSDCOM: MOV #OUTBUF,R5 BIT #4,SWORD ; /MA specified? BNE 10$ ; If NE yes - omit TABs MOV #4,R0 ;SET UP TO PUT 4$: MOVB #11,(R5)+ ;4 TABS IN FRONT OF LINE SOB R0,4$ ; 10$: MOV BFNAM,R0 BEQ 1$ MOV #40,R1 ;ALLOW FOR MAX STRING LEN JSR PC,TXTRAN 1$: MOV (R4),NAMST ; Store .PSECT name MOV 2(R4),NAMST+2 ; In case we need it BIT #4,SWORD ; /MA specified? BEQ 20$ ; If EQ no - carry on CMP #PSECT,BFNAM ; Doing a .PSECT? BNE 20$ ; If NE no - carry on CMP (R4),#^R. A ; . ABS.? BNE 20$ ; If NE no - carry on CMP 2(R4),#^RBS. ; Sure? BNE 20$ ; If NE no - carry on TST (R4)+ ; Yes - throw away PSECT name TST (R4)+ ; BR 3$ ; And exit ; 20$: R5ASCL R5,(R4)+ R5ASCL R0,(R4)+ MOV R0,R5 ;UPDATE R5 MOV AFNAM,R0 ;ANYTHING AFTER NAME BEQ 2$ ;IF NO, SKIP MOV #40,R1 ;SET FOR MAX LEN JSR PC,TXTRAN ;IF SO, PUT IT IN 2$: MOV AFPROC,R0 ;ANY MORE PROCESSING BEQ 3$ ;IF NOT, SKIP BIT #1,R0 ;ODD? (-1) BNE VALFIN ;IF SO, FINISH WITH VALUE JMP (R0) ;GO TO ROUTINE 3$: CMP (R4)+,(R4)+ ;BUMP PAST FLAG AND TYPE BR FINISH ;AND GO TO FINAL PROCESSING VALFIN: TST (R4)+ CBASCL R5,(R4)+,#1,$CBOMG MOV R0,R5 ;UPDATE R5 FINISH: SUB #OUTBUF,R5 ;LEN OF LINE IN R5 QIOEXE #OUTBUF,R5 ;PRINT LINE CMP #PSECT,BFNAM ; Just done a .PSECT? BEQ 20$ ; If EQ yes - check it ; 10$: JMP 90$ ; No - carry on ; 20$: CMP NAMST,#^R. A ; . ABS? BEQ 10$ ; Probably - ignore it MOV #OUTBUF,R5 ; BIT #4,SWORD ; /MA specified? BNE 40$ ; If NE yes - omit TABs MOV #4,R0 ;SET UP TO PUT 30$: MOVB #11,(R5)+ ;4 TABS IN FRONT OF LINE SOB R0,30$ ; 40$: R5ASCL R5,NAMST ; Yes - convert the PSECT name R5ASCL R0,NAMST+2 ; MOVB #'.,(R5)+ ; Overwrite first part with .$ MOVB #'$,(R5)+ ; MOVB #'=,(R0)+ ; Add =. MOVB #'.,(R0)+ ; SUB #OUTBUF,R0 ; Get length MOV R0,R5 ; Store it QIOEXE #OUTBUF,R5 ; Output it TST -2(R4) ; Any size? BEQ 10$ ; If EQ no - carry on MOV #OUTBUF,R5 ; Set up output buffer BIT #4,SWORD ; /MA specified? BNE 60$ ; If NE yes - omit TABs MOV #4,R0 ;SET UP TO PUT 50$: MOVB #11,(R5)+ ;4 TABS IN FRONT OF LINE SOB R0,50$ ; 60$: MOV #BLKB,R0 MOV #40,R1 ;ALLOW FOR MAX STRING LEN JSR PC,TXTRAN CBASCL R5,-2(R4),#1,$CBOMG MOV R0,R5 ;UPDATE R5 SUB #OUTBUF,R5 ;LEN OF LINE IN R5 QIOEXE #OUTBUF,R5 ;PRINT LINE MOV #OUTBUF,R5 ; Initialize buffer address BIT #4,SWORD ; /MA specified? BNE 80$ ; If NE yes - omit TABs MOV #4,R0 ;SET UP TO PUT 70$: MOVB #11,(R5)+ ;4 TABS IN FRONT OF LINE SOB R0,70$ ; 80$: MOVB #'.,(R5)+ ; MOVB #'=,(R5)+ ; Add =. R5ASCL R5,NAMST ; Yes - convert the PSECT name R5ASCL R0,NAMST+2 ; MOVB #'.,(R5)+ ; Overwrite first part with .$ MOVB #'$,(R5)+ ; SUB #OUTBUF,R0 ; Get length MOV R0,R5 ; Store it QIOEXE #OUTBUF,R5 ; Output it BR 100$ ; and get next bit ; 90$: CMP #TITLE,BFNAM ; Just done a .TITLE? BNE 100$ ; If NE carry on BIT #4,SWORD ; /MA specified? BEQ 100$ ; If EQ no - carry on QIOEXE #AC0,#6 ; Yes - output FPP register assignments QIOEXE #AC1,#6 ; QIOEXE #AC2,#6 ; QIOEXE #AC3,#6 ; ; 100$: MOV R4,R0 ;ARE WE AT END SUB #RECBF2,R0 ;OF GSD LINE? CMP R0,FILFDB+F.NRBD BGE 110$ ;IF NOT, GO DO MORE JMP GSD001 110$: JMP RECSET ;ELSE GET NEXT RECORD XFSTOR: MOV 2(R4),XFRADD ;STORE TRANSFER ADDRESS JMP VALFIN ;AND FINISH LINE PSECPR: JSR PC,STRPSC ;STORE PSECT INFO MOVB (R4),R3 ;FLAGS IN R3 MOV #ATTLST,R0 ;ASCII LIST OF ATTRIBUTES IN R0 MOV #8.,R2 ;EIGHT POSSIBLE BITS 1$: MOV #5,R1 ;MAX LEN OF ASCII ROR R3 ;GET NEXT BIT IN 'C' BCS 2$ ;IF SET DO SECOND ASCII OUTPUT JSR PC,TXTRAN ;ELSE DO FIRST JSR PC,SKIP ;AND SKIP SECOND BR 3$ 2$: JSR PC,SKIP JSR PC,TXTRAN 3$: SOB R2,1$ MOV #14,R1 MOV #PCOM,R0 JSR PC,TXTRAN ;PUT IN FINAL COMMENT WITH LENGTH JMP VALFIN SKIP: TSTB (R0)+ BEQ 1$ BR SKIP 1$: RTS PC .END