.TITLE PASS1 .IDENT /hah015/ ; ; 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. ; 27-Jul-85 hah010 ; Convert SELECT subroutine to support DOB as a I&D space task. ; 17-Aug-85 hah015 ; Do not assume memory is pre-extended by TKB. Allocate memory ; as needed. ; ; THIS MODULE SCANS ALL "GSD" RECORDS, BUILDING THE PSECT TABLE ; ; 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 RWDATA,RW,D GTSK: .BLKW 16. memlft: .blkw 1 ;Amount of memory left from last extend ;hah015 .PSECT RODATA,RO,D table: ;hah010 .BYTE RT.GSD,RT.END ;hah010 .WORD illcod ; ILLEGAL TYPE ;hah010 .WORD gsdrec ; GSD ;hah010 .WORD gsdend ; END OF GSD ;hah010 .WORD skip ; TXT ;hah010 .WORD skip ; RLD ;hah010 .WORD skip ; ISD ;hah010 .WORD illcod ; END OF MODULE ;hah010 table1: ;hah010 .BYTE GT.CSC,GT.PSC ;hah010 .WORD skip1 ; UNWANTED ;hah010 .WORD csectn ; .CSECT ;hah010 .WORD skip1 ; INTERNAL SYMBOL NAME ;hah010 .WORD skip1 ; .END ;hah010 .WORD glbal ; .GLOBL ;hah010 .WORD csectn ; .PSECT ;hah010 .PSECT CODE,RO .enabl lsb .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 gtsk$s #gtsk ;Get task parameters ;hah015 mov gtsk+g.tsts,r1 ;Get task end address ;hah015 sub r5,r1 ;Calculate size of free memory ;hah015 bic #3,r1 ;Make sure it's a multiple of 4 bytes ;hah015 mov r1,memlft ;Save space remaining ;hah015 mov #freehd+4,r0 ;Init the free memory listhead ;hah015 clr -(r0) ;hah015 clr -(r0) ;hah015 call $rlcb ;Release the block ;hah015 skip: 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 illcod ; YES, SO SOMETHING'S WRONG MOV F.NRBD+2(R0),R3 ; GET THE RECORD ADDRESS MOV (R3)+,R1 ; GET THE RECORD TYPE bic #^C7,r1 ; Clear all but used bits select #table ;hah010 gsdrec: ASR R4 ; CALCULATE # OF GSD ENTRIES ASR R4 ASR R4 BEQ skip ; THERE ARE NONE 30$: MOVB G.TYPE(R3),R1 ; GET GSD TYPE select #table1 ;hah010 glbal: BITB #10,G.FLAG(R3) ; IS THIS A DEFINITION? BEQ skip1 ; NO, SO IGNORE IT INC R2 ; INCREMENT GLOBAL SYMBOL COUNT BR skip1 csectn: sub #10,memlft ;Length of PSECT entry ;hah015 bpl 55$ ;Have enough memory ;hah015 call getspc ;Get some more memory ;hah015 55$: ;hah015 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 skip1: ADD #G.LEN,R3 ; SKIP TO THE NEXT GSD ENTRY SOB R4,30$ ; AND PROCESS IT, IF THERE IS ONE BR skip ; THERE ISN'T, SO PROCESS THE NEXT RECORD 60$: TRAP INIOER ; INPUT I/O ERROR BR 90$ illcod: TRAP OBJFMT ; OBJECT FORMAT ILLEGAL BR 90$ gsdend: 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 sub r2,memlft ;Make sure we have room for global syms ;hah015 bpl 85$ ;Yes we do ;hah015 83$: ;hah015 call getspc ;Get more space ;hah015 tst memlft ;Have enough memory left? ;hah015 bmi 83$ ;No, get some more ;hah015 85$: ;hah015 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 .dsabl lsb ;hah010 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 sub #10,memlft ;Make sure we have room ;hah015 bpl 25$ ;Continue ;hah015 call getspc ;Get more memory ;hah015 25$: ;hah015 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 getspc: ;hah015 mov r0,-(sp) ;hah015 mov r1,-(sp) ;hah015 mov r2,-(sp) ;hah015 mov #freehd,r0 ;hah015 mov #512.,r1 ;Let's get 1KB for starters ;hah015 call getblk ;Get it ;hah015 add r1,memlft ;Add in whatever space we got ;hah015 mov r0,r2 ;Copy address to release it ;hah015 mov #freehd,r0 ;Point to list header again ;hah015 call $rlcb ;Release what we just allocated ;hah015 mov (sp)+,r2 ;hah015 mov (sp)+,r1 ;hah015 mov (sp)+,r0 ;hah015 return ;Return with task extended ;hah015 .END