* Copyright (c) 1980 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
/* "@(#)tsboot.c 6.3 (Berkeley) %G%" */
* VAX tape boot block for distribution tapes
* reads a program from a tp directory on a tape and executes it
* program must be stripped of the header and is loaded ``bits as is''
* you can return to this loader via ``ret'' as you are called ``calls $0,ent''
.set HDRSIZ
,040 /* size of file header for VAX */
.set MAGIC
,0410 /* file type id in header */
.set TSIZ
,4 /* text size */
.set DSIZ
,8 /* data size */
.set BSIZ
,12 /* bss size */
.set TENT
,024 /* task header entry loc */
/* tp directory definitions */
.set FILSIZ
,38 /* tp direc offset for file size */
.set BNUM
,44 /* tp dir offset for start block no. */
.set ENTSIZ
,64 /* size of 1 TP dir entry, bytes */
.set PTHSIZ
,32 /* size of TP path name, bytes */
.set BLKSIZ
,512 /* tape block size, bytes */
.set NUMDIR
,24 /* no. of dir blocks on tape */
.set ENTBLK
,8 /* no. of dir entries per tape block */
/* processor registers and bits */
.set TXCS_pr
,7 /* bit position of TXCS ready bit */
.set RXCS_pd
,7 /* bit position of RXCS done bit */
/* TS commands and bits */
.set TSA
,0x200 /* page 1, ts command buffer relocation */
.set TS_ACK
,0100000 /* ack packet */
.set TS_CVC
,040000 /* clear volume check */
.set TS_SETCHR
,4 /* set characteristics */
.set TS_READ
,1 /* read */
.set TS_RETRY
,01000 /* retry, or with read */
/* local stack variables */
.set tapa
,-4 /* desired tape addr */
.set mtapa
,-8 /* current tape addr */
.set name
,-8-PTHSIZ
/* operator-typed file name */
movl $RELOC
,fp
/* core loc to which to move this program */
addl3 $name
,fp
,sp
/* set stack pointer; leave room for locals */
movc3 $end
,(r0
),(fp
) /* move boot up to relocated position */
bisl3 $MRV
,r0
,UBA_MAP
+4(%rUBA
)
movw $TSA
+setchr
,TSDB(%rTS
)
bsbw rew
/* rewind input tape */
movab
name(fp
),r4
/* start of filename storage */
movzbl $
'=,r0 /* prompt character */
bsbw putc /* output char to main console */
/* read in a file name */
movl r4,r1 /* loc at which to store file name */
bsbw getc /* get input char's in file name */
cmpb r0
,$
012 /* terminator ? */
subl3 r4
,r1
,r9
/* size of path name */
beql start
/* dumb operator */
/* user-specified TP filename has been stored at name(fp) */
/* read in entire tp directory contents into low core */
movl $
8,tapa(fp
) /* tp directory starts at block 8 */
movl $
(NUMDIR
*BLKSIZ
),r6
/* no. bytes in total dir */
bsbw taper
/* read no. bytes indicated */
/* search entire directory for user-specified file name */
clrl r5
/* dir buff loc = 0 */
cmpc3 r9
,(r5
),(r4
) /* see if dir entry matches filename */
beql fndfil
/* found match */
acbl $NUMDIR
*BLKSIZ
-1,$ENTSIZ
,r5
,nxtdir
/* see if done with tp dir */
brw start
/* entry not in directory; start over */
/* found desired tp dir entry */
movzwl
BNUM(r5
),tapa(fp
) /* start block no., 2 bytes */
addl2 $
7,tapa(fp
) /* skip 7 boot blocks */
movzwl
FILSIZ(r5
),r6
/* low 2 bytes file size */
insv FILSIZ
-1(r5
),$
16,$
8,r6
/* file size, high byte */
cmpl r6
,$RELOC
-512 /* check if file fits below stack */
blss filok
/* file o.k. */
brw start
/* file too large */
/* time to read in desired file from tape */
subl3 r7
,$RELOC
-4,r0
/* no. bytes to clear */
/* time to jump to start of file & execute */
/* taper: movcTAPE (r6),tapa(fp),0 */
bsbb rew
/* beginning of tape */
bsbb rrec
/* advance 1 block; never want blk 0 */
cmpl
mtapa(fp
),tapa(fp
) /* current position .vs. desired */
/* rew: rewind the tape */
clrl
mtapa(fp
) /* current position */
movw $TSA
+rewind
,TSDB(%rTS
)
/* rrec: read 1 block from mag tape into page (r0) */
/* pushl r0; movzbl $'r,r0; bsbw putc; movl (sp)+,r0; */
bisl3 $MRV
,r0
,UBA_MAP(%rUBA
)
movw $TS_ACK
|TS_CVC
|TS_READ
,tsread
movw $TSA
+tsread
,TSDB(%rTS
)
/* bisl2 $BNE,UBA_DPR1(%rUBA) */
incl r0
/* next page no. */
incl
mtapa(fp
) /* mag tape block position */
bbc $RXCS_pd
,r0
,getc
/* receiver ready ? */
bbc $TXCS_pr
,r2
,putc
/* transmitter ready ? */
.word TS_ACK
|TS_CVC
|TS_SETCHR
.word TS_ACK
|TS_CVC
|TS_READ
.word TS_ACK
|TS_CVC
|TS_REWIND