xref: /original-bsd/sys/vax/mdec/mtboot.c (revision 037861c2)
1 /*	mtboot.c	4.1	83/02/16	*/
2 
3 /*
4  * VAX tape boot block for distribution tapes
5  * works on massbys tu78
6  *
7  * reads a program from a tp directory on a tape and executes it
8  * program must be stripped of the header and is loaded ``bits as is''
9  * you can return to this loader via ``ret'' as you are called ``calls $0,ent''
10  *
11  * Based on similar driver for tm03 formatter.
12  * Local modifications by Jeffrey R. Schwab	June, 1982
13  *				Purdue University Computing Center
14  */
15 	.set	RELOC,0x70000
16 /* a.out defines */
17 	.set	HDRSIZ,040	/* size of file header for VAX */
18 	.set	MAGIC,0410	/* file type id in header */
19 	.set	TSIZ,4		/* text size */
20 	.set	DSIZ,8		/* data size */
21 	.set	BSIZ,12		/* bss size */
22 	.set	TENT,024	/* task header entry loc */
23 /* tp directory definitions */
24 	.set	FILSIZ,38	/* tp direc offset for file size */
25 	.set	BNUM,44		/* tp dir offset for start block no. */
26 	.set	ENTSIZ,64	/* size of 1 TP dir entry, bytes */
27 	.set	PTHSIZ,32	/* size of TP path name, bytes */
28 	.set	BLKSIZ,512	/* tape block size, bytes */
29 	.set	NUMDIR,24	/* no. of dir blocks on tape */
30 	.set	ENTBLK,8	/* no. of dir entries per tape block */
31 /* processor registers and bits */
32 	.set	RXCS,32
33 	.set	RXDB,33
34 	.set	TXCS,34
35 	.set	TXDB,35
36 	.set	RXCS_DONE,0x80
37 	.set	TXCS_RDY,0x80
38 	.set	TXCS_pr,7	/* bit position of TXCS ready bit */
39 	.set	RXCS_pd,7	/* bit position of RXCS done bit */
40 /* MBA registers */
41 	.set	MBA_CSR,0	/* configuration and status register */
42 	.set	MBA_CR,4	/* MBA control reg */
43 	.set	MBA_SR,8	/* MBA status reg */
44 	.set	MBA_VAR,12	/* MBA virt addr reg */
45 	.set	MBA_BCR,16	/* MBA byte count reg */
46 	.set	MBA_MAP,0x800	/* start of MBA map reg's */
47 	.set	MRV,0x80000000
48 	.set	MBA_bsy,31	/* massbus busy */
49 /* TU78 mba registers */
50 	.set	MTCS,0		/* MT data transfer control reg */
51 	.set	MTER,4		/* data transfer error status reg */
52 	.set	MTRC,8		/* record count */
53 	.set	MTAS,16		/* attention summary */
54 	.set	MTBC,20		/* byte count */
55 	.set	MTNER,44	/* non data transfer error status reg */
56 	.set	MTNCS,48	/* non data transfer control reg */
57 	.set	MTID,68		/* internal data reg */
58 /* MT commands */
59 	.set	GO,1		/* GO bit */
60 	.set	MT_REW,6	/* rewind, on-line */
61 	.set	MT_RCOM,070	/* read forward */
62 /* MT bits */
63 	.set	MT_rdy,15	/* controller ready */
64 	.set	MT_rec,2	/* bit for single record count */
65 	.set	MT_rcnt,4	/* record count for single record (shifted) */
66 	.set	MT_erc,0xffffffc0	/* error code mask */
67 	.set	MT_done,1	/* proper completion code */
68 	.set	MT_atn,0	/* attention bit for drive 0 */
69 /* local stack variables */
70 	.set	tapa,-4		/* desired tape addr */
71 	.set	mtapa,-8	/* current tape addr */
72 	.set	name,-8-PTHSIZ	/* operator-typed file name */
73 /* register usage */
74 	.set	rMBA,r10
75 	.set	rMT,r11
76 
77 /* initialization */
78 init:
79 	mull2	$0x80,%rMT
80 	addl2	$0x400,%rMT
81 	addl2	%rMBA,%rMT
82 	movl	$RELOC,fp	/* core loc to which to move this program */
83 	addl3	$name,fp,sp	/* set stack pointer, leaving room for locals */
84 	clrl	r0
85 1:
86 	movc3	$end,(r0),(fp)	/* move boot up to relocated position */
87 	jmp	start+RELOC
88 start:
89 	movl	$1,MBA_CR(%rMBA)	/* MBA init */
90 1:
91 	movl	MTID(%rMT),r2		/* wait for tape controller to ready */
92 	bbc	$MT_rdy,r2,1b		/* after massbus init */
93 	bsbw	rew			/* rewind input tape */
94 	movab	name(fp),r4		/* start of filename storage */
95 	movzbl	$'=,r0			/* prompt character */
96 	bsbw	putc			/* output char to main console */
97 /* read in a file name */
98 	movl	r4,r1			/* loc at which to store file name */
99 nxtc:
100 	bsbw	getc			/* get input char's in file name */
101 	cmpb	r0,$012			/* terminator ? */
102 	beql	nullc
103 	movb	r0,(r1)+
104 	brb	nxtc
105 nullc:
106 	subl3	r4,r1,r9		/* size of path name */
107 	beql	start			/* dumb operator */
108 	clrb	(r1)+
109 	incl	r9
110 /* user-specified TP filename has been stored at name(fp) */
111 /* read in entire tp directory contents into low core */
112 dirred:
113 	movl	$8,tapa(fp)		/* tp directory starts at block 8 */
114 	movl	$(NUMDIR*BLKSIZ),r6	/* no. bytes in total dir */
115 	bsbw	taper			/* read no. bytes indicated */
116 /* search entire directory for user-specified file name */
117 	clrl	r5			/* dir buff loc = 0 */
118 nxtdir:
119 	cmpc3	r9,(r5),(r4)		/* see if dir entry matches filename */
120 	beql	fndfil			/* found match */
121 	acbl	$NUMDIR*BLKSIZ-1,$ENTSIZ,r5,nxtdir
122 					/* see if done with tp dir */
123 	brw	start			/* entry not in directory; start over */
124 /* found desired tp dir entry */
125 fndfil:
126 	movzwl	BNUM(r5),tapa(fp)	/* start block no., 2 bytes */
127 	addl2	$7,tapa(fp)		/* skip 7 boot blocks */
128 	movzwl	FILSIZ(r5),r6		/* low 2 bytes file size */
129 	insv	FILSIZ-1(r5),$16,$8,r6  /* file size, high byte */
130 	cmpl	r6,$RELOC-512		/* check if file fits below stack */
131 	blss	filok 			/* file o.k. */
132 	brw	start			/* file too large */
133 /* time to read in desired file from tape */
134 filok:
135 	movl	r6,r7			/* save r6 */
136 	bsbb	taper
137 	bsbw	rew
138 /* clear core */
139 	subl3	r7,$RELOC-4,r0		/* no. bytes to clear */
140 1:
141 	clrb	(r7)+
142 	sobgtr	r0,1b
143 /* time to jump to start of file & execute */
144 	addl3	$20,fp,ap
145 	clrl	r5
146 	calls	$0,(r5)
147 	brw	start
148 /* taper: movcTAPE (r6),tapa(fp),0 */
149 rew2:
150 	bsbb	rew			/* beginning of tape */
151 taper0:
152 	bsbb	rrec			/* advance 1 block; never want blk0 */
153 taper:
154 	clrl	r0			/* page no. */
155 	cmpl	mtapa(fp),tapa(fp)	/* current position .vs. desired */
156 	bgtr	rew2
157 	blss	taper0
158 1:
159 	bsbb	rrec
160 	acbl	$1,$-BLKSIZ,r6,1b
161 	rsb
162 /* rew: rewind the tape */
163 rew:
164 	clrl	mtapa(fp)		/* current position */
165 	movl	MTNER(%rMT),r2		/* read non-data status */
166  	movl	MTAS(%rMT),MTAS(%rMT)	/* and clear any attention bits */
167 	movl	$MT_REW+GO,MTNCS(%rMT)	/* rewind command and go bit */
168 1:
169 	movl	MTAS(%rMT),r2		/* check attention bits */
170 	bbc	$MT_atn,r2,1b		/* loop if attention not yet set */
171 	movl	MTNER(%rMT),r2		/* read non-data status */
172 	movl	MTAS(%rMT),MTAS(%rMT)	/* and clear any attention bits */
173 	bicl2	$MT_erc,r2		/* isolate error condition */
174 	subl2	$MT_done,r2		/* check with completion condition */
175 	bneq	1b			/* wait for completion attention */
176 	rsb
177 /* rrec: read 1 block from mag tape into page (r0) */
178 rrec:
179 	/* pushl r0; movzbl $'r,r0; bsbw putc; movl (sp)+,r0; */
180 	movl	MTNER(%rMT),r2		/* read non-data status */
181 	movl	MTAS(%rMT),MTAS(%rMT)	/* and clear any attention bits */
182 	movl	$-BLKSIZ,MBA_BCR(%rMBA)
183 	bisl3	$MRV,r0,MBA_MAP(%rMBA)
184 	clrl	MBA_VAR(%rMBA)
185 	movl	$BLKSIZ,MTBC(%rMT)	/* set byte count */
186 	bisl2	$MT_rcnt,MTRC(%rMT)	/* set record count */
187 	movl	$MT_RCOM+GO,MTCS(%rMT)	/* load read command */
188 1:
189 	movl	MBA_SR(%rMBA),r2	/* load mba status reg */
190 	bbs	$MBA_bsy,r2,1b		/* wait for mba to go non-busy */
191 	movl	MTRC(%rMT),r2		/* fetch record count */
192 	bbs	$MT_rec,r2,rrec		/* retry read if we did not read a record */
193 	movl	MTER(%rMT),r2		/* load data transfer error status */
194 	bicl2	$MT_erc,r2		/* isolate status value */
195 	subl2	$MT_done,r2		/* compare with successful read */
196 	bneq	rrec			/* load to try read again */
197 
198 	incl	r0			/* next page no. */
199 	incl	mtapa(fp)		/* mag tape block position */
200 	rsb
201 getc:
202 	mfpr	$RXCS,r0
203 	bbc	$RXCS_pd,r0,getc	/* receiver ready ? */
204 	mfpr	$RXDB,r0
205 	extzv	$0,$7,r0,r0
206 	cmpb	r0,$015
207 	bneq	putc
208 	bsbb	putc
209 	movb	$0,r0
210 	bsbb	putc
211 	movb	$012,r0
212 putc:
213 	mfpr	$TXCS,r2
214 	bbc	$TXCS_pr,r2,putc	/* transmitter ready ? */
215 	extzv	$0,$7,r0,r0
216 	mtpr	r0,$TXDB
217 	rsb
218 end:
219