xref: /original-bsd/sys/vax/mdec/htboot.c (revision 3109f15a)
1 /*	htboot.c	6.1	83/07/29	*/
2 
3 /*
4  * VAX tape boot block for distribution tapes
5  * works on massbus tu10/te16/tu45/tu77
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 	.set	RELOC,0x70000
12 /* a.out defines */
13 	.set	HDRSIZ,040	/* size of file header for VAX */
14 	.set	MAGIC,0410	/* file type id in header */
15 	.set	TSIZ,4		/* text size */
16 	.set	DSIZ,8		/* data size */
17 	.set	BSIZ,12		/* bss size */
18 	.set	TENT,024	/* task header entry loc */
19 /* tp directory definitions */
20 	.set	FILSIZ,38	/* tp direc offset for file size */
21 	.set	BNUM,44		/* tp dir offset for start block no. */
22 	.set	ENTSIZ,64	/* size of 1 TP dir entry, bytes */
23 	.set	PTHSIZ,32	/* size of TP path name, bytes */
24 	.set	BLKSIZ,512	/* tape block size, bytes */
25 	.set	NUMDIR,24	/* no. of dir blocks on tape */
26 	.set	ENTBLK,8	/* no. of dir entries per tape block */
27 /* processor registers and bits */
28 	.set	RXCS,32
29 	.set	RXDB,33
30 	.set	TXCS,34
31 	.set	TXDB,35
32 	.set	RXCS_DONE,0x80
33 	.set	TXCS_RDY,0x80
34 	.set	TXCS_pr,7	/* bit position of TXCS ready bit */
35 	.set	RXCS_pd,7	/* bit position of RXCS done bit */
36 /* MBA registers */
37 	.set	MBA_CSR,0	/* configuration and status register */
38 	.set	MBA_CR,4	/* MBA control reg */
39 	.set	MBA_SR,8	/* MBA status reg */
40 	.set	MBA_VAR,12	/* MBA virt addr reg */
41 	.set	MBA_BCR,16	/* MBA byte count reg */
42 	.set	MBA_MAP,0x800	/* start of MBA map reg's */
43 	.set	MRV,0x80000000
44 /* TE16/TU45/TU77 mba registers */
45 	.set	HTCS1,0		/* HT control 1 reg */
46 	.set	HTDS,4		/* status reg */
47 	.set	HTER,8		/* error reg */
48 	.set	HTAS,16		/* attention summary */
49 	.set	HTFC,20		/* frame count */
50 	.set	HTTC,36		/* HT tape control */
51 /* HT commands */
52 	.set	GO,1		/* GO bit */
53 	.set	HT_REW,6	/* rewind, on-line */
54 	.set	HT_DCLR,010	/* drive clear */
55 	.set	HT_SREV,032	/* space reverse */
56 	.set	HT_RCOM,070	/* read forward */
57 /* HT bits */
58 	.set	ERR,040000 	/* composite error bit in status reg */
59 	.set	TCHAR,012300 	/* unit 0, odd parity, PDP11, 1600 BPI NRZ, */
60 				/* abort on error - for tape controller */
61 	.set	DRDY,0200	/* HT/drive ready in status reg */
62 	.set	HT_pd,7 	/* bit position of HT DRDY bit */
63 	.set	HT_pe,14	/* bit position of HT ERROR bit */
64 /* local stack variables */
65 	.set	tapa,-4		/* desired tape addr */
66 	.set	mtapa,-8	/* current tape addr */
67 	.set	name,-8-PTHSIZ	/* operator-typed file name */
68 /* register usage */
69 	.set	rMBA,r10
70 	.set	rHT,r11
71 
72 /* initialization */
73 init:
74 	mull2	$0x80,%rHT
75 	addl2	$0x400,%rHT
76 	addl2	%rMBA,%rHT
77 	movl	$RELOC,fp	/* core loc to which to move this program */
78 	addl3	$name,fp,sp	/* set stack pointer, leaving room for locals */
79 	clrl	r0
80 1:
81 	movc3	$end,(r0),(fp)	/* move boot up to relocated position */
82 	jmp	start+RELOC
83 start:
84 	movl	$1,MBA_CR(%rMBA)	/* MBA init */
85 	movl	$TCHAR,HTTC(%rHT)	/* drive no., etc. */
86 	movl	$HT_DCLR+GO,HTCS1(%rHT)	/* drive clear */
87 	bsbw	rew			/* rewind input tape */
88 	movab	name(fp),r4		/* start of filename storage */
89 	movzbl	$'=,r0			/* prompt character */
90 	bsbw	putc			/* output char to main console */
91 /* read in a file name */
92 	movl	r4,r1			/* loc at which to store file name */
93 nxtc:
94 	bsbw	getc			/* get input char's in file name */
95 	cmpb	r0,$012			/* terminator ? */
96 	beql	nullc
97 	movb	r0,(r1)+
98 	brb	nxtc
99 nullc:
100 	subl3	r4,r1,r9		/* size of path name */
101 	beql	start			/* dumb operator */
102 	clrb	(r1)+
103 	incl	r9
104 /* user-specified TP filename has been stored at name(fp) */
105 /* read in entire tp directory contents into low core */
106 dirred:
107 	movl	$8,tapa(fp)		/* tp directory starts at block 8 */
108 	movl	$(NUMDIR*BLKSIZ),r6	/* no. bytes in total dir */
109 	bsbw	taper			/* read no. bytes indicated */
110 /* search entire directory for user-specified file name */
111 	clrl	r5			/* dir buff loc = 0 */
112 nxtdir:
113 	cmpc3	r9,(r5),(r4)		/* see if dir entry matches filename */
114 	beql	fndfil			/* found match */
115 	acbl	$NUMDIR*BLKSIZ-1,$ENTSIZ,r5,nxtdir
116 					/* see if done with tp dir */
117 	brw	start			/* entry not in directory; start over */
118 /* found desired tp dir entry */
119 fndfil:
120 	movzwl	BNUM(r5),tapa(fp)	/* start block no., 2 bytes */
121 	addl2	$7,tapa(fp)		/* skip 7 boot blocks */
122 	movzwl	FILSIZ(r5),r6		/* low 2 bytes file size */
123 	insv	FILSIZ-1(r5),$16,$8,r6  /* file size, high byte */
124 	cmpl	r6,$RELOC-512		/* check if file fits below stack */
125 	blss	filok 			/* file o.k. */
126 	brw	start			/* file too large */
127 /* time to read in desired file from tape */
128 filok:
129 	movl	r6,r7			/* save r6 */
130 	bsbb	taper
131 	bsbw	rew
132 /* clear core */
133 	subl3	r7,$RELOC-4,r0		/* no. bytes to clear */
134 1:
135 	clrb	(r7)+
136 	sobgtr	r0,1b
137 /* time to jump to start of file & execute */
138 	addl3	$20,fp,ap
139 	clrl	r5
140 	calls	$0,(r5)
141 	brw	start
142 /* taper: movcTAPE (r6),tapa(fp),0 */
143 rew2:
144 	bsbb	rew			/* beginning of tape */
145 taper0:
146 	bsbb	rrec			/* advance 1 block; never want blk0 */
147 taper:
148 	clrl	r0			/* page no. */
149 	cmpl	mtapa(fp),tapa(fp)	/* current position .vs. desired */
150 	bgtr	rew2
151 	blss	taper0
152 1:
153 	bsbb	rrec
154 	acbl	$1,$-BLKSIZ,r6,1b
155 	rsb
156 /* rew: rewind the tape */
157 rew:
158 	clrl	mtapa(fp)		/* current position */
159 	movl	$HT_REW+GO,HTCS1(%rHT)  /* rewind */
160 	rsb
161 /* rrec: read 1 block from mag tape into page (r0) */
162 rrec:
163 	/* pushl r0; movzbl $'r,r0; bsbw putc; movl (sp)+,r0; */
164 	movl	HTDS(%rHT),r2
165 	bbc	$HT_pd,r2,rrec		/* HT & drive ready ? */
166 	movl	$-BLKSIZ,MBA_BCR(%rMBA)
167 	bisl3	$MRV,r0,MBA_MAP(%rMBA)
168 	clrl	MBA_VAR(%rMBA)
169 	movl	$HT_RCOM+GO,HTCS1(%rHT)	/* read forward */
170 1:
171 	movl	HTDS(%rHT),r2
172 	bbc	$HT_pd,r2,1b
173 	movl	HTER(%rHT),r2
174 	bbc	$HT_pe,r2,2f		/* any read errors ? */
175 	clrl	HTDS(%rHT)		/* clear status - try to recover */
176 	mnegl	$1,HTFC(%rHT)		/* frame count for backspace */
177 	movl	$HT_SREV+GO,HTCS1(%rHT)	/* space reverse */
178 	brb	rrec
179 2:
180 	incl	r0			/* next page no. */
181 	incl	mtapa(fp)		/* mag tape block position */
182 	rsb
183 getc:
184 	mfpr	$RXCS,r0
185 	bbc	$RXCS_pd,r0,getc	/* receiver ready ? */
186 	mfpr	$RXDB,r0
187 	extzv	$0,$7,r0,r0
188 	cmpb	r0,$015
189 	bneq	putc
190 	bsbb	putc
191 	movb	$0,r0
192 	bsbb	putc
193 	movb	$012,r0
194 putc:
195 	mfpr	$TXCS,r2
196 	bbc	$TXCS_pr,r2,putc	/* transmitter ready ? */
197 	extzv	$0,$7,r0,r0
198 	mtpr	r0,$TXDB
199 	rsb
200 end:
201