add MAXPHYS for NFS
[unix-history] / usr / src / sys / vax / mdec / utboot.c
CommitLineData
cb1c44c2 1/*
0880b18e 2 * Copyright (c) 1980, 1986 Regents of the University of California.
cb1c44c2
KM
3 * All rights reserved. The Berkeley software License Agreement
4 * specifies the terms and conditions for redistribution.
5 */
6
0880b18e 7/* "@(#)utboot.c 7.1 (Berkeley) %G%" */
2afab629
SL
8
9/*
10 * VAX tape boot block for distribution tapes
11 * works on unibus tm03
12 *
13 * reads a program from a tp directory on a tape and executes it
14 * program must be stripped of the header and is loaded ``bits as is''
15 * you can return to this loader via ``ret'' as you are called ``calls $0,ent''
16 */
17 .set RELOC,0x70000
18/* a.out defines */
19 .set HDRSIZ,040 /* size of file header for VAX */
20 .set MAGIC,0410 /* file type id in header */
21 .set TSIZ,4 /* text size */
22 .set DSIZ,8 /* data size */
23 .set BSIZ,12 /* bss size */
24 .set TENT,024 /* task header entry loc */
25/* tp directory definitions */
26 .set FILSIZ,38 /* tp direc offset for file size */
27 .set BNUM,44 /* tp dir offset for start block no. */
28 .set ENTSIZ,64 /* size of 1 TP dir entry, bytes */
29 .set PTHSIZ,32 /* size of TP path name, bytes */
30 .set BLKSIZ,512 /* tape block size, bytes */
31 .set NUMDIR,24 /* no. of dir blocks on tape */
32 .set ENTBLK,8 /* no. of dir entries per tape block */
33/* processor registers and bits */
34 .set RXCS,32
35 .set RXDB,33
36 .set TXCS,34
37 .set TXDB,35
38 .set RXCS_DONE,0x80
39 .set TXCS_RDY,0x80
40 .set TXCS_pr,7 /* bit position of TXCS ready bit */
41 .set RXCS_pd,7 /* bit position of RXCS done bit */
42/* UBA registers */
43 .set UBA_DPR1,68
44 .set UBA_MAP,2048
45 .set BNE,0x80000000
46 .set MRV,0x80000000
47 .set MR_BDP1,0x200000
48
49/* UT UBA registers */
50 .set UTCS1,0
51 .set UTWC,02
52 .set UTBA,04
53 .set UTFC,06
54 .set UTCS2,010
55 .set UTDS,012
56 .set UTER,014
57 .set UTAS,016
0b00f765 58 .set UTCC,020
2afab629
SL
59 .set UTDB,022
60 .set UTMR,024
61 .set UTDT,026
62 .set UTSN,030
63 .set UTTC,032
64
65/* UT commands and bits */
66 .set GO,01
0b00f765
SL
67 .set UT_REW,0x6
68 .set UT_RCOM,0x38
69 .set UT_SREV,0x1a
70 .set UT_DCLR,0x8
94404742
MK
71 .set UT_crdy,7 /* bit pos. */
72 .set UT_gapsd,13 /* bit; aka "positioning in progress" */
0b00f765 73 .set UTDENS,0x4c0 /* 1600 bpi, PDP-11 format */
2afab629
SL
74/* local stack variables */
75 .set tapa,-4 /* desired tape addr */
76 .set mtapa,-8 /* current tape addr */
77 .set name,-8-PTHSIZ /* operator-typed file name */
78/* register usage */
79 .set rUBA,r10
80 .set rUT,r11
81/* ===== */
82
83/* initialization */
84init:
85 movl $RELOC,fp /* core loc to which to move this program */
86 addl3 $name,fp,sp /* set stack pointer; leave room for locals */
87 clrl r0
881:
89 movc3 $end,(r0),(fp) /* move boot up to relocated position */
90 jmp start+RELOC
91start:
92 bsbw rew /* rewind input tape */
93 movab name(fp),r4 /* start of filename storage */
94 movzbl $'=,r0 /* prompt character */
95 bsbw putc /* output char to main console */
96/* read in a file name */
97 movl r4,r1 /* loc at which to store file name */
98nxtc:
99 bsbw getc /* get input char's in file name */
100 cmpb r0,$012 /* terminator ? */
101 beql nullc
102 movb r0,(r1)+
103 brb nxtc
104nullc:
105 subl3 r4,r1,r9 /* size of path name */
106 beql start /* dumb operator */
107 clrb (r1)+
108 incl r9
109/* user-specified TP filename has been stored at name(fp) */
110/* read in entire tp directory contents into low core */
111dirred:
112 movl $8,tapa(fp) /* tp directory starts at block 8 */
113 movl $(NUMDIR*BLKSIZ),r6 /* no. bytes in total dir */
114 bsbw taper /* read no. bytes indicated */
115/* search entire directory for user-specified file name */
116 clrl r5 /* dir buff loc = 0 */
117nxtdir:
118 cmpc3 r9,(r5),(r4) /* see if dir entry matches filename */
119 beql fndfil /* found match */
120 acbl $NUMDIR*BLKSIZ-1,$ENTSIZ,r5,nxtdir
121 /* see if done with tp dir */
122 brw start /* entry not in directory; start over */
123/* found desired tp dir entry */
124fndfil:
125 movzwl BNUM(r5),tapa(fp) /* start block no., 2 bytes */
126 addl2 $7,tapa(fp) /* skip 7 boot blocks */
127 movzwl FILSIZ(r5),r6 /* low 2 bytes file size */
128 insv FILSIZ-1(r5),$16,$8,r6 /* file size, high byte */
129 cmpl r6,$RELOC-512 /* check if file fits below stack */
130 blss filok /* file o.k. */
131 brw start /* file too large */
132/* time to read in desired file from tape */
133filok:
134 movl r6,r7 /* save r6 */
135 bsbb taper
136 bsbw rew
137/* clear core */
138 subl3 r7,$RELOC-4,r0 /* no. bytes to clear */
1391:
140 clrb (r7)+
141 sobgtr r0,1b
142/* time to jump to start of file & execute */
143 addl3 $20,fp,ap
144 clrl r5
145 calls $0,(r5)
146 brw start
147/* taper: movcTAPE (r6),tapa(fp),0 */
148rew2:
149 bsbb rew /* beginning of tape */
150taper0:
151 bsbb rrec /* advance 1 block; never want blk 0 */
152taper:
153 clrl r0 /* page no. */
154 cmpl mtapa(fp),tapa(fp) /* current position .vs. desired */
155 bgtr rew2
156 blss taper0
1571:
158 bsbb rrec
159 acbl $1,$-BLKSIZ,r6,1b
160 rsb
161/* rew: rewind the tape */
162rew:
163 clrl mtapa(fp) /* current position */
164 movw $UTDENS,UTTC(%rUT) /* select drive */
165 movw $UT_REW+GO,UTCS1(%rUT)
166 rsb
167/* rrec: read 1 block from mag tape into page (r0) */
168rrec:
169 /* pushl r0; movzbl $'r,r0; bsbw putc; movl (sp)+,r0; */
f20d7ae3 170 jsb utquiet
2afab629
SL
171 movw $-BLKSIZ,UTFC(%rUT)
172 movw $-256,UTWC(%rUT) /* !!!!!!!!!!!!!! */
173 bisl3 $MRV|MR_BDP1,r0,UBA_MAP(%rUBA)
174 movw $0,UTBA(%rUT)
175 movw $UTDENS,UTTC(%rUT) /* select drive */
176 movw $UT_RCOM+GO,UTCS1(%rUT)
f20d7ae3 177 jsb utquiet
2afab629
SL
178 bisl2 $BNE,UBA_DPR1(%rUBA)
179 tstw UTER(%rUT)
180 jgeq 2f
181 mnegw $1,UTWC(%rUT)
182 movw $UTDENS,UTTC(%rUT) /* select drive */
183 movw $UT_SREV+GO,UTCS1(%rUT)
184 jmp rrec
1852:
186 incl r0 /* next page no. */
187 incl mtapa(fp) /* mag tape block position */
188 rsb
189getc:
190 mfpr $RXCS,r0
191 bbc $RXCS_pd,r0,getc /* receiver ready ? */
192 mfpr $RXDB,r0
193 extzv $0,$7,r0,r0
194 cmpb r0,$015
195 bneq putc
196 bsbb putc
197 movb $0,r0
198 bsbb putc
199 movb $012,r0
200putc:
201 mfpr $TXCS,r2
202 bbc $TXCS_pr,r2,putc /* transmitter ready ? */
203 extzv $0,$7,r0,r0
204 mtpr r0,$TXDB
205 rsb
f20d7ae3 206utquiet:
2afab629 207 movw UTCS1(%rUT),r2
f20d7ae3 208 bbc $UT_crdy,r2,utquiet
2afab629
SL
2091:
210 movw UTDS(%rUT),r2
211 bbs $UT_gapsd,r2,1b
212 rsb
213end: