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