.TITLE PASS1 .IDENT /hah007/ .PSECT CODE,RO ; ; VERSION 01 ; ; TOM GETZINGER 11-SEP-80 ; ; Modified: 09-Nov-83 hah007 ; Add PSECT . ABS. after all psects have been defined if ; . ABS. was not defined. ; ; 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$: call addabs ;Add . ABS. if not already there ;hah007 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 addabs: ;hah007 mov r0,-(sp) ;Save a register ;hah007 mov psctbl,r0 ;Point to start of PSECT table ;hah007 10$: ;hah007 cmp #^R. A,(r0)+ ;. ABS. already defined ;hah007 bne 15$ ;Not here ;hah007 cmp #^RBS.,(r0)+ ;Maybe ;hah007 beq 30$ ;Yes it is, just return ;hah007 ; ;hah007 ; Havent found . ABS. yet, see if in next entry ;hah007 ; ;hah007 15$: ;hah007 tst (r0)+ ;Point to end of name ;hah007 20$: ;hah007 add #4,r0 ;Point to next entry ;hah007 cmp r0,r5 ;End of list yet? ;hah007 bne 10$ ;No, repeat ;hah007 ; ;hah007 ; . ABS. is not in table, add it ;hah007 ; ;hah007 mov #^R. A,(r5)+ ;Put in first part ;hah007 mov #^RBS.,(r5)+ ;Put in second part ;hah007 clr (r5)+ ;Current address in PSECT ;hah007 clr (r5)+ ;Length of PSECT ;hah007 WRITE$ #FDBTMP ; OUTPUT AN EMPTY BITMAP ;hah007 BCS 100$ ; ERROR ;hah007 WAIT$ ; WAIT FOR WRITE TO FINISH ;hah007 BCS 100$ ; ERROR ;hah007 ; ;hah007 ; All done ;hah007 ; ;hah007 30$: ;hah007 mov (sp)+,r0 ;Restore our register ;hah007 return ;hah007 ;hah007 100$: TRAP TMPERR ; I/O ERROR ON TEMP FILE ;hah007 .END