.TITLE PASS1 .IDENT /01/ .PSECT CODE,RO ; ; VERSION 01 ; ; TOM GETZINGER 11-SEP-80 ; ; THIS MODULE SCANS ALL "GSD" RECORDS, BUILDING THE PSECT TABLE ; ; LOCAL DATA ; .PSECT RWDATA,RW,D GTSK: .BLKW 16. .PSECT CODE .MCALL GET$S GTSK$S WAIT$ WRITE$ PASS1:: CLR R2 ; INITIALIZE GLOBAL SYMBOL COUNT CLR PASS ; CLEAR PASS FLAG MOV #BITMAP,R0 ; CLEAR OUT THE BITMAP MOV #4096.,R1 5$: CLR (R0)+ SOB R1,5$ MOV PSCTBL,R5 ; POINT TO START OF PSECT TABLE 10$: GET$S #FDBIN ; GET THE NEXT RECORD BCS 60$ ; ERROR MOV F.NRBD(R0),R4 ; GET THE RECORD LENGTH SUB #2,R4 ; IS IT LESS THAN 2 BYTES LONG? BMI 70$ ; YES, SO SOMETHING'S WRONG MOV F.NRBD+2(R0),R3 ; GET THE RECORD ADDRESS MOV (R3)+,R1 ; GET THE RECORD TYPE CALL SELECT ; GO PROCESS IT .BYTE RT.GSD,RT.END .WORD 70$ ; ILLEGAL TYPE .WORD 20$ ; GSD .WORD 80$ ; END OF GSD .WORD 10$ ; TXT .WORD 10$ ; RLD .WORD 10$ ; ISD .WORD 70$ ; END OF MODULE 20$: ASR R4 ; CALCULATE # OF GSD ENTRIES ASR R4 ASR R4 BEQ 10$ ; THERE ARE NONE 30$: MOVB G.TYPE(R3),R1 ; GET GSD TYPE CALL SELECT ; GO PROCESS IT .BYTE GT.CSC,GT.PSC .WORD 50$ ; UNWANTED .WORD 40$ ; .CSECT .WORD 50$ ; INTERNAL SYMBOL NAME .WORD 50$ ; .END .WORD 35$ ; .GLOBL .WORD 40$ ; .PSECT 35$: BITB #10,G.FLAG(R3) ; IS THIS A DEFINITION? BEQ 50$ ; NO, SO IGNORE IT INC R2 ; INCREMENT GLOBAL SYMBOL COUNT BR 50$ 40$: MOV G.NAME(R3),(R5)+ ; SAVE THE PSECT NAME MOV G.NAME+2(R3),(R5)+ CLR (R5)+ ; CLEAR CURRENT ADDRESS MOV G.VAL(R3),(R5)+ ; SAVE THE MAX LENGTH WRITE$ #FDBTMP ; OUTPUT AN EMPTY BITMAP BCS 100$ ; ERROR WAIT$ ; WAIT FOR WRITE TO FINISH BCS 100$ ; ERROR 50$: ADD #G.LEN,R3 ; SKIP TO THE NEXT GSD ENTRY SOB R4,30$ ; AND PROCESS IT, IF THERE IS ONE BR 10$ ; THERE ISN'T, SO PROCESS THE NEXT RECORD 60$: TRAP INIOER ; INPUT I/O ERROR BR 90$ 70$: TRAP OBJFMT ; OBJECT FORMAT ILLEGAL BR 90$ 80$: MOV R5,PSCEND ; SAVE PSECT TABLE END ADDRESS ASL R2 ; CONVERT GLOBAL SYMBOL COUNT ASL R2 ; INTO GLOBAL SYMBOL TABLE LENGTH ASL R2 ADD R5,R2 ; FIND END OF GLOBAL SYMBOL TABLE MOV R2,GBLEND ; AND SAVE IT SUB PSCTBL,R5 ; CALCULATE PSECT TABLE LENGTH ASR R5 ; FIND # OF PSECTS IN THE TABLE ASR R5 ASR R5 MOV R5,NPSCTS ; SAVE PSECT COUNT GTSK$S #GTSK ; GET TASK PARAMETERS MOV GTSK+G.TSTS,R1 ; GET TASK END ADDRESS SUB R2,R1 ; CALCULATE SIZE OF FREE MEMORY BIC #3,R1 ; MAKE SURE IT'S A MULTIPLE OF 4 BYTES MOV #FREEHD+4,R0 ; INIT THE FREE MEMORY LISTHEAD CLR -(R0) CLR -(R0) CALL $RLCB ; RELEASE THE BLOCK CLC 90$: RETURN 100$: TRAP TMPERR ; I/O ERROR ON TEMP FILE .END