1*11180Ssam /* utboot.c 4.2 83/02/20 */ 211106Ssam 311106Ssam /* 411106Ssam * VAX tape boot block for distribution tapes 511106Ssam * works on unibus tm03 611106Ssam * 711106Ssam * reads a program from a tp directory on a tape and executes it 811106Ssam * program must be stripped of the header and is loaded ``bits as is'' 911106Ssam * you can return to this loader via ``ret'' as you are called ``calls $0,ent'' 1011106Ssam */ 1111106Ssam .set RELOC,0x70000 1211106Ssam /* a.out defines */ 1311106Ssam .set HDRSIZ,040 /* size of file header for VAX */ 1411106Ssam .set MAGIC,0410 /* file type id in header */ 1511106Ssam .set TSIZ,4 /* text size */ 1611106Ssam .set DSIZ,8 /* data size */ 1711106Ssam .set BSIZ,12 /* bss size */ 1811106Ssam .set TENT,024 /* task header entry loc */ 1911106Ssam /* tp directory definitions */ 2011106Ssam .set FILSIZ,38 /* tp direc offset for file size */ 2111106Ssam .set BNUM,44 /* tp dir offset for start block no. */ 2211106Ssam .set ENTSIZ,64 /* size of 1 TP dir entry, bytes */ 2311106Ssam .set PTHSIZ,32 /* size of TP path name, bytes */ 2411106Ssam .set BLKSIZ,512 /* tape block size, bytes */ 2511106Ssam .set NUMDIR,24 /* no. of dir blocks on tape */ 2611106Ssam .set ENTBLK,8 /* no. of dir entries per tape block */ 2711106Ssam /* processor registers and bits */ 2811106Ssam .set RXCS,32 2911106Ssam .set RXDB,33 3011106Ssam .set TXCS,34 3111106Ssam .set TXDB,35 3211106Ssam .set RXCS_DONE,0x80 3311106Ssam .set TXCS_RDY,0x80 3411106Ssam .set TXCS_pr,7 /* bit position of TXCS ready bit */ 3511106Ssam .set RXCS_pd,7 /* bit position of RXCS done bit */ 3611106Ssam /* UBA registers */ 3711106Ssam .set UBA_DPR1,68 3811106Ssam .set UBA_MAP,2048 3911106Ssam .set BNE,0x80000000 4011106Ssam .set MRV,0x80000000 4111106Ssam .set MR_BDP1,0x200000 4211106Ssam 4311106Ssam /* UT UBA registers */ 4411106Ssam .set UTCS1,0 4511106Ssam .set UTWC,02 4611106Ssam .set UTBA,04 4711106Ssam .set UTFC,06 4811106Ssam .set UTCS2,010 4911106Ssam .set UTDS,012 5011106Ssam .set UTER,014 5111106Ssam .set UTAS,016 5211106Ssam .set UTCK,020 5311106Ssam .set UTDB,022 5411106Ssam .set UTMR,024 5511106Ssam .set UTDT,026 5611106Ssam .set UTSN,030 5711106Ssam .set UTTC,032 5811106Ssam 5911106Ssam /* UT commands and bits */ 6011106Ssam .set GO,01 6111106Ssam .set UT_REW,06 6211106Ssam .set UT_RCOM,070 6311106Ssam .set UT_SREV,032 6411106Ssam .set UT_DCLR,010 6511106Ssam .set UT_crdy,0200 6611106Ssam .set UT_gapsd,020000 /* aka "positioning in progress" */ 6711106Ssam .set UTDENS,0 /* 1600 bpi */ 6811106Ssam /* local stack variables */ 6911106Ssam .set tapa,-4 /* desired tape addr */ 7011106Ssam .set mtapa,-8 /* current tape addr */ 7111106Ssam .set name,-8-PTHSIZ /* operator-typed file name */ 7211106Ssam /* register usage */ 7311106Ssam .set rUBA,r10 7411106Ssam .set rUT,r11 7511106Ssam /* ===== */ 7611106Ssam 7711106Ssam /* initialization */ 7811106Ssam init: 7911106Ssam movl $RELOC,fp /* core loc to which to move this program */ 8011106Ssam addl3 $name,fp,sp /* set stack pointer; leave room for locals */ 8111106Ssam clrl r0 8211106Ssam 1: 8311106Ssam movc3 $end,(r0),(fp) /* move boot up to relocated position */ 8411106Ssam jmp start+RELOC 8511106Ssam start: 8611106Ssam bsbw rew /* rewind input tape */ 8711106Ssam movab name(fp),r4 /* start of filename storage */ 8811106Ssam movzbl $'=,r0 /* prompt character */ 8911106Ssam bsbw putc /* output char to main console */ 9011106Ssam /* read in a file name */ 9111106Ssam movl r4,r1 /* loc at which to store file name */ 9211106Ssam nxtc: 9311106Ssam bsbw getc /* get input char's in file name */ 9411106Ssam cmpb r0,$012 /* terminator ? */ 9511106Ssam beql nullc 9611106Ssam movb r0,(r1)+ 9711106Ssam brb nxtc 9811106Ssam nullc: 9911106Ssam subl3 r4,r1,r9 /* size of path name */ 10011106Ssam beql start /* dumb operator */ 10111106Ssam clrb (r1)+ 10211106Ssam incl r9 10311106Ssam /* user-specified TP filename has been stored at name(fp) */ 10411106Ssam /* read in entire tp directory contents into low core */ 10511106Ssam dirred: 10611106Ssam movl $8,tapa(fp) /* tp directory starts at block 8 */ 10711106Ssam movl $(NUMDIR*BLKSIZ),r6 /* no. bytes in total dir */ 10811106Ssam bsbw taper /* read no. bytes indicated */ 10911106Ssam /* search entire directory for user-specified file name */ 11011106Ssam clrl r5 /* dir buff loc = 0 */ 11111106Ssam nxtdir: 11211106Ssam cmpc3 r9,(r5),(r4) /* see if dir entry matches filename */ 11311106Ssam beql fndfil /* found match */ 11411106Ssam acbl $NUMDIR*BLKSIZ-1,$ENTSIZ,r5,nxtdir 11511106Ssam /* see if done with tp dir */ 11611106Ssam brw start /* entry not in directory; start over */ 11711106Ssam /* found desired tp dir entry */ 11811106Ssam fndfil: 11911106Ssam movzwl BNUM(r5),tapa(fp) /* start block no., 2 bytes */ 12011106Ssam addl2 $7,tapa(fp) /* skip 7 boot blocks */ 12111106Ssam movzwl FILSIZ(r5),r6 /* low 2 bytes file size */ 12211106Ssam insv FILSIZ-1(r5),$16,$8,r6 /* file size, high byte */ 12311106Ssam cmpl r6,$RELOC-512 /* check if file fits below stack */ 12411106Ssam blss filok /* file o.k. */ 12511106Ssam brw start /* file too large */ 12611106Ssam /* time to read in desired file from tape */ 12711106Ssam filok: 12811106Ssam movl r6,r7 /* save r6 */ 12911106Ssam bsbb taper 13011106Ssam bsbw rew 13111106Ssam /* clear core */ 13211106Ssam subl3 r7,$RELOC-4,r0 /* no. bytes to clear */ 13311106Ssam 1: 13411106Ssam clrb (r7)+ 13511106Ssam sobgtr r0,1b 13611106Ssam /* time to jump to start of file & execute */ 13711106Ssam addl3 $20,fp,ap 13811106Ssam clrl r5 13911106Ssam calls $0,(r5) 14011106Ssam brw start 14111106Ssam /* taper: movcTAPE (r6),tapa(fp),0 */ 14211106Ssam rew2: 14311106Ssam bsbb rew /* beginning of tape */ 14411106Ssam taper0: 14511106Ssam bsbb rrec /* advance 1 block; never want blk 0 */ 14611106Ssam taper: 14711106Ssam clrl r0 /* page no. */ 14811106Ssam cmpl mtapa(fp),tapa(fp) /* current position .vs. desired */ 14911106Ssam bgtr rew2 15011106Ssam blss taper0 15111106Ssam 1: 15211106Ssam bsbb rrec 15311106Ssam acbl $1,$-BLKSIZ,r6,1b 15411106Ssam rsb 15511106Ssam /* rew: rewind the tape */ 15611106Ssam rew: 15711106Ssam clrl mtapa(fp) /* current position */ 15811106Ssam movw $UTDENS,UTTC(%rUT) /* select drive */ 15911106Ssam movw $UT_REW+GO,UTCS1(%rUT) 16011106Ssam rsb 16111106Ssam /* rrec: read 1 block from mag tape into page (r0) */ 16211106Ssam rrec: 16311106Ssam /* pushl r0; movzbl $'r,r0; bsbw putc; movl (sp)+,r0; */ 164*11180Ssam jsb utquiet 16511106Ssam movw $-BLKSIZ,UTFC(%rUT) 16611106Ssam movw $-256,UTWC(%rUT) /* !!!!!!!!!!!!!! */ 16711106Ssam bisl3 $MRV|MR_BDP1,r0,UBA_MAP(%rUBA) 16811106Ssam movw $0,UTBA(%rUT) 16911106Ssam movw $UTDENS,UTTC(%rUT) /* select drive */ 17011106Ssam movw $UT_RCOM+GO,UTCS1(%rUT) 171*11180Ssam jsb utquiet 17211106Ssam bisl2 $BNE,UBA_DPR1(%rUBA) 17311106Ssam tstw UTER(%rUT) 17411106Ssam jgeq 2f 17511106Ssam mnegw $1,UTWC(%rUT) 17611106Ssam movw $UTDENS,UTTC(%rUT) /* select drive */ 17711106Ssam movw $UT_SREV+GO,UTCS1(%rUT) 17811106Ssam jmp rrec 17911106Ssam 2: 18011106Ssam incl r0 /* next page no. */ 18111106Ssam incl mtapa(fp) /* mag tape block position */ 18211106Ssam rsb 18311106Ssam getc: 18411106Ssam mfpr $RXCS,r0 18511106Ssam bbc $RXCS_pd,r0,getc /* receiver ready ? */ 18611106Ssam mfpr $RXDB,r0 18711106Ssam extzv $0,$7,r0,r0 18811106Ssam cmpb r0,$015 18911106Ssam bneq putc 19011106Ssam bsbb putc 19111106Ssam movb $0,r0 19211106Ssam bsbb putc 19311106Ssam movb $012,r0 19411106Ssam putc: 19511106Ssam mfpr $TXCS,r2 19611106Ssam bbc $TXCS_pr,r2,putc /* transmitter ready ? */ 19711106Ssam extzv $0,$7,r0,r0 19811106Ssam mtpr r0,$TXDB 19911106Ssam rsb 200*11180Ssam utquiet: 20111106Ssam movw UTCS1(%rUT),r2 202*11180Ssam bbc $UT_crdy,r2,utquiet 20311106Ssam 1: 20411106Ssam movw UTDS(%rUT),r2 20511106Ssam bbs $UT_gapsd,r2,1b 20611106Ssam rsb 20711106Ssam end: 208