1*11095Ssam /* tmboot.c 4.1 83/02/16 */ 2*11095Ssam 3*11095Ssam /* 4*11095Ssam * VAX tape boot block for distribution tapes 5*11095Ssam * works on unibus tm03 6*11095Ssam * 7*11095Ssam * reads a program from a tp directory on a tape and executes it 8*11095Ssam * program must be stripped of the header and is loaded ``bits as is'' 9*11095Ssam * you can return to this loader via ``ret'' as you are called ``calls $0,ent'' 10*11095Ssam */ 11*11095Ssam .set RELOC,0x70000 12*11095Ssam /* a.out defines */ 13*11095Ssam .set HDRSIZ,040 /* size of file header for VAX */ 14*11095Ssam .set MAGIC,0410 /* file type id in header */ 15*11095Ssam .set TSIZ,4 /* text size */ 16*11095Ssam .set DSIZ,8 /* data size */ 17*11095Ssam .set BSIZ,12 /* bss size */ 18*11095Ssam .set TENT,024 /* task header entry loc */ 19*11095Ssam /* tp directory definitions */ 20*11095Ssam .set FILSIZ,38 /* tp direc offset for file size */ 21*11095Ssam .set BNUM,44 /* tp dir offset for start block no. */ 22*11095Ssam .set ENTSIZ,64 /* size of 1 TP dir entry, bytes */ 23*11095Ssam .set PTHSIZ,32 /* size of TP path name, bytes */ 24*11095Ssam .set BLKSIZ,512 /* tape block size, bytes */ 25*11095Ssam .set NUMDIR,24 /* no. of dir blocks on tape */ 26*11095Ssam .set ENTBLK,8 /* no. of dir entries per tape block */ 27*11095Ssam /* processor registers and bits */ 28*11095Ssam .set RXCS,32 29*11095Ssam .set RXDB,33 30*11095Ssam .set TXCS,34 31*11095Ssam .set TXDB,35 32*11095Ssam .set RXCS_DONE,0x80 33*11095Ssam .set TXCS_RDY,0x80 34*11095Ssam .set TXCS_pr,7 /* bit position of TXCS ready bit */ 35*11095Ssam .set RXCS_pd,7 /* bit position of RXCS done bit */ 36*11095Ssam /* UBA registers */ 37*11095Ssam .set UBA_DPR1,68 38*11095Ssam .set UBA_MAP,2048 39*11095Ssam .set BNE,0x80000000 40*11095Ssam .set MRV,0x80000000 41*11095Ssam .set MR_BDP1,0x200000 42*11095Ssam /* TM UBA registers */ 43*11095Ssam .set TMER,0 44*11095Ssam .set TMCS,2 45*11095Ssam .set TMBC,4 46*11095Ssam .set TMBA,6 47*11095Ssam /* TM commands and bits */ 48*11095Ssam .set GO,1 49*11095Ssam .set TM_REW,016 50*11095Ssam .set TM_RCOM,02 51*11095Ssam .set TM_SREV,012 52*11095Ssam .set TM_DCLR,010000 53*11095Ssam .set TM_crdy,7 54*11095Ssam .set TM_gapsd,3 55*11095Ssam .set TMDENS,0 /* 1600 bpi */ 56*11095Ssam /* local stack variables */ 57*11095Ssam .set tapa,-4 /* desired tape addr */ 58*11095Ssam .set mtapa,-8 /* current tape addr */ 59*11095Ssam .set name,-8-PTHSIZ /* operator-typed file name */ 60*11095Ssam /* register usage */ 61*11095Ssam .set rUBA,r10 62*11095Ssam .set rTM,r11 63*11095Ssam /* ===== */ 64*11095Ssam 65*11095Ssam /* initialization */ 66*11095Ssam init: 67*11095Ssam movl $RELOC,fp /* core loc to which to move this program */ 68*11095Ssam addl3 $name,fp,sp /* set stack pointer; leave room for locals */ 69*11095Ssam clrl r0 70*11095Ssam 1: 71*11095Ssam movc3 $end,(r0),(fp) /* move boot up to relocated position */ 72*11095Ssam jmp start+RELOC 73*11095Ssam start: 74*11095Ssam bsbw rew /* rewind input tape */ 75*11095Ssam movab name(fp),r4 /* start of filename storage */ 76*11095Ssam movzbl $'=,r0 /* prompt character */ 77*11095Ssam bsbw putc /* output char to main console */ 78*11095Ssam /* read in a file name */ 79*11095Ssam movl r4,r1 /* loc at which to store file name */ 80*11095Ssam nxtc: 81*11095Ssam bsbw getc /* get input char's in file name */ 82*11095Ssam cmpb r0,$012 /* terminator ? */ 83*11095Ssam beql nullc 84*11095Ssam movb r0,(r1)+ 85*11095Ssam brb nxtc 86*11095Ssam nullc: 87*11095Ssam subl3 r4,r1,r9 /* size of path name */ 88*11095Ssam beql start /* dumb operator */ 89*11095Ssam clrb (r1)+ 90*11095Ssam incl r9 91*11095Ssam /* user-specified TP filename has been stored at name(fp) */ 92*11095Ssam /* read in entire tp directory contents into low core */ 93*11095Ssam dirred: 94*11095Ssam movl $8,tapa(fp) /* tp directory starts at block 8 */ 95*11095Ssam movl $(NUMDIR*BLKSIZ),r6 /* no. bytes in total dir */ 96*11095Ssam bsbw taper /* read no. bytes indicated */ 97*11095Ssam /* search entire directory for user-specified file name */ 98*11095Ssam clrl r5 /* dir buff loc = 0 */ 99*11095Ssam nxtdir: 100*11095Ssam cmpc3 r9,(r5),(r4) /* see if dir entry matches filename */ 101*11095Ssam beql fndfil /* found match */ 102*11095Ssam acbl $NUMDIR*BLKSIZ-1,$ENTSIZ,r5,nxtdir 103*11095Ssam /* see if done with tp dir */ 104*11095Ssam brw start /* entry not in directory; start over */ 105*11095Ssam /* found desired tp dir entry */ 106*11095Ssam fndfil: 107*11095Ssam movzwl BNUM(r5),tapa(fp) /* start block no., 2 bytes */ 108*11095Ssam addl2 $7,tapa(fp) /* skip 7 boot blocks */ 109*11095Ssam movzwl FILSIZ(r5),r6 /* low 2 bytes file size */ 110*11095Ssam insv FILSIZ-1(r5),$16,$8,r6 /* file size, high byte */ 111*11095Ssam cmpl r6,$RELOC-512 /* check if file fits below stack */ 112*11095Ssam blss filok /* file o.k. */ 113*11095Ssam brw start /* file too large */ 114*11095Ssam /* time to read in desired file from tape */ 115*11095Ssam filok: 116*11095Ssam movl r6,r7 /* save r6 */ 117*11095Ssam bsbb taper 118*11095Ssam bsbw rew 119*11095Ssam /* clear core */ 120*11095Ssam subl3 r7,$RELOC-4,r0 /* no. bytes to clear */ 121*11095Ssam 1: 122*11095Ssam clrb (r7)+ 123*11095Ssam sobgtr r0,1b 124*11095Ssam /* time to jump to start of file & execute */ 125*11095Ssam addl3 $20,fp,ap 126*11095Ssam clrl r5 127*11095Ssam calls $0,(r5) 128*11095Ssam brw start 129*11095Ssam /* taper: movcTAPE (r6),tapa(fp),0 */ 130*11095Ssam rew2: 131*11095Ssam bsbb rew /* beginning of tape */ 132*11095Ssam taper0: 133*11095Ssam bsbb rrec /* advance 1 block; never want blk 0 */ 134*11095Ssam taper: 135*11095Ssam clrl r0 /* page no. */ 136*11095Ssam cmpl mtapa(fp),tapa(fp) /* current position .vs. desired */ 137*11095Ssam bgtr rew2 138*11095Ssam blss taper0 139*11095Ssam 1: 140*11095Ssam bsbb rrec 141*11095Ssam acbl $1,$-BLKSIZ,r6,1b 142*11095Ssam rsb 143*11095Ssam /* rew: rewind the tape */ 144*11095Ssam rew: 145*11095Ssam clrl mtapa(fp) /* current position */ 146*11095Ssam movw $TM_REW+TMDENS+GO,TMCS(%rTM) 147*11095Ssam rsb 148*11095Ssam /* rrec: read 1 block from mag tape into page (r0) */ 149*11095Ssam rrec: 150*11095Ssam /* pushl r0; movzbl $'r,r0; bsbw putc; movl (sp)+,r0; */ 151*11095Ssam jsb tmquiet 152*11095Ssam movw $-BLKSIZ,TMBC(%rTM) 153*11095Ssam bisl3 $MRV|MR_BDP1,r0,UBA_MAP(%rUBA) 154*11095Ssam movw $0,TMBA(%rTM) 155*11095Ssam movw $TM_RCOM+TMDENS+GO,TMCS(%rTM) 156*11095Ssam jsb tmquiet 157*11095Ssam bisl2 $BNE,UBA_DPR1(%rUBA) 158*11095Ssam tstw TMER(%rTM) 159*11095Ssam jgeq 2f 160*11095Ssam mnegw $1,TMBC(%rTM) 161*11095Ssam movw $TM_SREV+TMDENS+GO,TMCS(%rTM) 162*11095Ssam jmp rrec 163*11095Ssam 2: 164*11095Ssam incl r0 /* next page no. */ 165*11095Ssam incl mtapa(fp) /* mag tape block position */ 166*11095Ssam rsb 167*11095Ssam getc: 168*11095Ssam mfpr $RXCS,r0 169*11095Ssam bbc $RXCS_pd,r0,getc /* receiver ready ? */ 170*11095Ssam mfpr $RXDB,r0 171*11095Ssam extzv $0,$7,r0,r0 172*11095Ssam cmpb r0,$015 173*11095Ssam bneq putc 174*11095Ssam bsbb putc 175*11095Ssam movb $0,r0 176*11095Ssam bsbb putc 177*11095Ssam movb $012,r0 178*11095Ssam putc: 179*11095Ssam mfpr $TXCS,r2 180*11095Ssam bbc $TXCS_pr,r2,putc /* transmitter ready ? */ 181*11095Ssam extzv $0,$7,r0,r0 182*11095Ssam mtpr r0,$TXDB 183*11095Ssam rsb 184*11095Ssam tmquiet: 185*11095Ssam movw TMCS(%rTM),r2 186*11095Ssam bbc $TM_crdy,r2,tmquiet 187*11095Ssam 1: 188*11095Ssam movw TMER(%rTM),r2 189*11095Ssam blbc r2,1b /* low bit == TUR */ 190*11095Ssam bbs $TM_gapsd,r2,1b 191*11095Ssam rsb 192*11095Ssam end: 193