.enabl lc ;+ ; ; Secondary bootstrap. ; ; Look up file in RT-11 directory, and load it (.LE. 110. blocks). ; ; 11/14/95 JMBW Created. ; ;- bcsr= 30 ;from BOOT.MAC ; dirbuf= 6000 ;directory segment buffer ; ttcsr= 177564 ;CTY control/status ttbuf= 177566 ;CTY output buffer ; .asect .=2000 br bload bfile: .rad50 /BOS SAV/ ;file to load bload: ; search next dir seg for file mov dirseg,r3 ;get dir seg beq fnf ;end of chain, skip asl r3 ;two blocks per segment add #6-2,r3 ;segment 1 starts at block 6 mov #2,r4 ;two blocks mov #dirbuf,r5 ;into dirbuf iot ;read it mov #dirbuf+2,r5 ;point past total # segments mov (r5)+,dirseg ;get link to next seg tst (r5)+ ;skip highest seg # in use mov (r5)+,dirinf ;save # info bytes (RSTS RTS, etc.) mov (r5)+,dirdat ;save starting data block for this seg 10$: ; check next entry mov (r5)+,r0 ;get status bits bit #4000,r0 ;end of segment? bne bload ;yes, check next seg bit #2000,r0 ;permanent file? beq 20$ ;no, tentative file or < UNUSED > area, skip cmp (r5),@#bfile ;check for match bne 20$ cmp 2(r5),@#bfile+2 bne 20$ cmp 4(r5),@#bfile+4 beq 30$ ;got it 20$: ; skip this entry add 6(r5),dirdat ;bump data ptr to next file add #14,r5 ;skip to info bytes add dirinf,r5 ;skip those too br 10$ ;check next entry 30$: ; file found, DIRDAT=starting blk, 6(r5)=length mov dirdat,r3 ;starting block # mov 6(r5),r4 ;get length beq fnf ;0, nothing to do mov r4,-(sp) ;save mov #load,r5 ;put it where it's safe iot ;read it all ; relocate to 000000 mov #50$,r0 ;first relocate the relocater mov #157000,r1 ;to top of memory mov #<60$-50$>/2,r2 40$: mov (r0)+,(r1)+ ;move a word dec r2 ;loop bne 40$ mov bcsr,r5 ;save CSR mov #load,r0 ;source ptr clr r1 ;dest ptr mov (sp)+,r2 ;block count swab r2 ;word count jmp @#157000 50$: mov (r0)+,(r1)+ ;copy a word dec r2 ;do them all (don't use SOB!) bne 50$ mov r5,r1 ;copy CSR mov @#42,sp ;init stack mov @#40,r3 ;get start addr (PIC) jmp (r3) 60$: ; end of code to relocate ; fnf: ; file not found, print message jsr r5,ctyout ;display message on CTY .asciz '?BLOAD-F-No file to load'<15><12> .even ctyout: movb (r5)+,r0 ;get a byte beq 20$ ;don't write the NUL 10$: tstb @#ttcsr ;ready? bpl 10$ mov r0,@#ttbuf ;yes, write char br ctyout 20$: halt ;give up br 20$ ;initted vars may be bashed, don't restart ; dirseg: .word 1 ;current dir segment (initially 1) dirinf: .blkw ;# info bytes per dir entry dirdat: .blkw ;starting data block for next file entry ; load: ; disk buffer starts here .end