xref: /csrg-svn/sys/vax/mdec/tsboot.c (revision 29326)
123151Smckusick /*
2*29326Smckusick  * Copyright (c) 1980, 1986 Regents of the University of California.
323151Smckusick  * All rights reserved.  The Berkeley software License Agreement
423151Smckusick  * specifies the terms and conditions for redistribution.
523151Smckusick  */
611097Ssam 
7*29326Smckusick /* "@(#)tsboot.c	7.1 (Berkeley) 06/05/86" */
823151Smckusick 
911097Ssam /*
1011097Ssam  * VAX tape boot block for distribution tapes
1111097Ssam  * works on unibus ts11
1211097Ssam  *
1311097Ssam  * reads a program from a tp directory on a tape and executes it
1411097Ssam  * program must be stripped of the header and is loaded ``bits as is''
1511097Ssam  * you can return to this loader via ``ret'' as you are called ``calls $0,ent''
1611097Ssam  */
1711097Ssam 	.set	RELOC,0x70000
1811097Ssam /* a.out defines */
1911097Ssam 	.set	HDRSIZ,040	/* size of file header for VAX */
2011097Ssam 	.set	MAGIC,0410	/* file type id in header */
2111097Ssam 	.set	TSIZ,4		/* text size */
2211097Ssam 	.set	DSIZ,8		/* data size */
2311097Ssam 	.set	BSIZ,12		/* bss size */
2411097Ssam 	.set	TENT,024	/* task header entry loc */
2511097Ssam /*  tp directory definitions */
2611097Ssam 	.set	FILSIZ,38	/* tp direc offset for file size */
2711097Ssam 	.set	BNUM,44		/* tp dir offset for start block no. */
2811097Ssam 	.set	ENTSIZ,64	/* size of 1 TP dir entry, bytes */
2911097Ssam 	.set	PTHSIZ,32	/* size of TP path name, bytes */
3011097Ssam 	.set	BLKSIZ,512	/* tape block size, bytes */
3111097Ssam 	.set	NUMDIR,24	/* no. of dir blocks on tape */
3211097Ssam 	.set	ENTBLK,8	/* no. of dir entries per tape block */
3311097Ssam /* processor registers and bits */
3411097Ssam 	.set	RXCS,32
3511097Ssam 	.set	RXDB,33
3611097Ssam 	.set	TXCS,34
3711097Ssam 	.set	TXDB,35
3811097Ssam 	.set	RXCS_DONE,0x80
3911097Ssam 	.set	TXCS_RDY,0x80
4011097Ssam 	.set	TXCS_pr,7	/* bit position of TXCS ready bit */
4111097Ssam 	.set	RXCS_pd,7	/* bit position of RXCS done bit */
4211097Ssam /* UBA registers */
4311097Ssam 	.set	UBA_DPR1,68
4411097Ssam 	.set	UBA_MAP,2048
4511097Ssam 	.set	BNE,0x80000000
4611097Ssam 	.set	MRV,0x80000000
4711097Ssam 	.set	MR_BDP1,0x200000
4811097Ssam /* TS UBA registers */
4911097Ssam 	.set	TSDB,0
5011097Ssam 	.set	TSSR,2
5111097Ssam /* TS commands and bits */
5211097Ssam 	.set	TSA,0x200	/* page 1, ts command buffer relocation */
5311097Ssam 	.set	TS_ACK,0100000	/* ack packet */
5411097Ssam 	.set	TS_CVC,040000	/* clear volume check */
5511097Ssam 	.set	TS_SETCHR,4	/* set characteristics */
5611097Ssam 	.set	TS_READ,1	/* read */
5711097Ssam 	.set	TS_RETRY,01000	/* retry, or with read */
5811097Ssam 	.set	TS_REWIND,02010
5911097Ssam /* local stack variables */
6011097Ssam 	.set	tapa,-4		/* desired tape addr */
6111097Ssam 	.set	mtapa,-8	/* current tape addr */
6211097Ssam 	.set	name,-8-PTHSIZ	/* operator-typed file name */
6311097Ssam /* register usage */
6411097Ssam 	.set	rUBA,r10
6511097Ssam 	.set	rTS,r11
6611097Ssam /* ===== */
6711097Ssam 
6811097Ssam /* initialization */
6911097Ssam init:
7011097Ssam 	movl	$RELOC,fp	/* core loc to which to move this program */
7111097Ssam 	addl3	$name,fp,sp	/* set stack pointer; leave room for locals */
7211097Ssam 	clrl	r0
7311097Ssam 1:
7411097Ssam 	movc3	$end,(r0),(fp)	/* move boot up to relocated position */
7511097Ssam 	jmp	start+RELOC
7611097Ssam start:
7711097Ssam 	ashl	$-9,$RELOC,r0
7811097Ssam 	bisl3	$MRV,r0,UBA_MAP+4(%rUBA)
7911097Ssam 	clrw	TSSR(%rTS)
8011097Ssam 	bsbw	tsquiet
8111097Ssam 	movw	$TSA+setchr,TSDB(%rTS)
8211097Ssam 	bsbw	tsquiet
8311097Ssam 	bsbw	rew			/* rewind input tape */
8411097Ssam 	movab	name(fp),r4		/* start of filename storage */
8511097Ssam 	movzbl	$'=,r0			/* prompt character */
8611097Ssam 	bsbw	putc			/* output char to main console */
8711097Ssam /* read in a file name */
8811097Ssam 	movl	r4,r1			/* loc at which to store file name */
8911097Ssam nxtc:
9011097Ssam 	bsbw	getc			/* get input char's in file name */
9111097Ssam 	cmpb	r0,$012			/* terminator ? */
9211097Ssam 	beql	nullc
9311097Ssam 	movb	r0,(r1)+
9411097Ssam 	brb	nxtc
9511097Ssam nullc:
9611097Ssam 	subl3	r4,r1,r9		/* size of path name */
9711097Ssam 	beql	start			/* dumb operator */
9811097Ssam 	clrb	(r1)+
9911097Ssam 	incl	r9
10011097Ssam /* user-specified TP filename has been stored at name(fp) */
10111097Ssam /* read in entire tp directory contents into low core */
10211097Ssam dirred:
10311097Ssam 	movl	$8,tapa(fp)		/* tp directory starts at block 8 */
10411097Ssam 	movl	$(NUMDIR*BLKSIZ),r6	/* no. bytes in total dir */
10511097Ssam 	bsbw	taper			/* read no. bytes indicated */
10611097Ssam /* search entire directory for user-specified file name */
10711097Ssam 	clrl	r5			/* dir buff loc = 0 */
10811097Ssam nxtdir:
10911097Ssam 	cmpc3	r9,(r5),(r4)		/* see if dir entry matches filename */
11011097Ssam 	beql	fndfil			/* found match */
11111097Ssam 	acbl	$NUMDIR*BLKSIZ-1,$ENTSIZ,r5,nxtdir
11211097Ssam 					/* see if done with tp dir */
11311097Ssam 	brw	start			/* entry not in directory; start over */
11411097Ssam /* found desired tp dir entry */
11511097Ssam fndfil:
11611097Ssam 	movzwl	BNUM(r5),tapa(fp)	/* start block no., 2 bytes */
11711097Ssam 	addl2	$7,tapa(fp)		/* skip 7 boot blocks */
11811097Ssam 	movzwl	FILSIZ(r5),r6		/* low 2 bytes file size */
11911097Ssam 	insv	FILSIZ-1(r5),$16,$8,r6  /* file size, high byte */
12011097Ssam 	cmpl	r6,$RELOC-512		/* check if file fits below stack */
12111097Ssam 	blss	filok 			/* file o.k. */
12211097Ssam 	brw	start			/* file too large */
12311097Ssam /* time to read in desired file from tape */
12411097Ssam filok:
12511097Ssam 	movl	r6,r7			/* save r6 */
12611097Ssam 	bsbb	taper
12711097Ssam 	bsbw	rew
12811097Ssam /* clear core */
12911097Ssam 	subl3	r7,$RELOC-4,r0		/* no. bytes to clear */
13011097Ssam 1:
13111097Ssam 	clrb	(r7)+
13211097Ssam 	sobgtr	r0,1b
13311097Ssam /* time to jump to start of file & execute */
13411097Ssam 	addl3	$20,fp,ap
13511097Ssam 	clrl	r5
13611097Ssam 	calls	$0,(r5)
13711097Ssam 	brw	start
13811097Ssam /* taper: movcTAPE (r6),tapa(fp),0 */
13911097Ssam rew2:
14011097Ssam 	bsbb	rew			/* beginning of tape */
14111097Ssam taper0:
14211097Ssam 	bsbb	rrec			/* advance 1 block; never want blk 0 */
14311097Ssam taper:
14411097Ssam 	clrl	r0			/* page no. */
14511097Ssam 	cmpl	mtapa(fp),tapa(fp)	/* current position .vs. desired */
14611097Ssam 	bgtr	rew2
14711097Ssam 	blss	taper0
14811097Ssam 1:
14911097Ssam 	bsbb	rrec
15011097Ssam 	acbl	$1,$-BLKSIZ,r6,1b
15111097Ssam 	rsb
15211097Ssam /* rew: rewind the tape */
15311097Ssam rew:
15411097Ssam 	clrl	mtapa(fp)		/* current position */
15511097Ssam 	movw	$TSA+rewind,TSDB(%rTS)
15611097Ssam 	bsbb	tsquiet
15711097Ssam 	rsb
15811097Ssam /* rrec: read 1 block from mag tape into page (r0) */
15911097Ssam rrec:
16011097Ssam 	/* pushl r0; movzbl $'r,r0; bsbw putc; movl (sp)+,r0; */
16111097Ssam 	bisl3	$MRV,r0,UBA_MAP(%rUBA)
16211097Ssam 	movw	$TS_ACK|TS_CVC|TS_READ,tsread
16311097Ssam 1:
16411097Ssam 	movw	$TSA+tsread,TSDB(%rTS)
16511097Ssam 	bsbb	tsquiet
16611097Ssam /*	bisl2	$BNE,UBA_DPR1(%rUBA) */
16711097Ssam 	tstw	TSSR(%rTS)
16811097Ssam 	bgeq	2f
16911097Ssam 	bisw2	$TS_RETRY,tsread
17011097Ssam 	brb	1b
17111097Ssam 2:
17211097Ssam 	incl	r0			/* next page no. */
17311097Ssam 	incl	mtapa(fp)		/* mag tape block position */
17411097Ssam 	rsb
17511097Ssam tsquiet:
17611097Ssam 	tstb	TSSR(%rTS)
17711097Ssam 	bgeq	tsquiet
17811097Ssam 	rsb
17911097Ssam getc:
18011097Ssam 	mfpr	$RXCS,r0
18111097Ssam 	bbc	$RXCS_pd,r0,getc	/* receiver ready ? */
18211097Ssam 	mfpr	$RXDB,r0
18311097Ssam 	extzv	$0,$7,r0,r0
18411097Ssam 	cmpb	r0,$015
18511097Ssam 	bneq	putc
18611097Ssam 	bsbb	putc
18711097Ssam 	movb	$0,r0
18811097Ssam 	bsbb	putc
18911097Ssam 	movb	$012,r0
19011097Ssam putc:
19111097Ssam 	mfpr	$TXCS,r2
19211097Ssam 	bbc	$TXCS_pr,r2,putc	/* transmitter ready ? */
19311097Ssam 	extzv	$0,$7,r0,r0
19411097Ssam 	mtpr	r0,$TXDB
19511097Ssam 	rsb
19611097Ssam 	.align	2
19711097Ssam setchr:
19811097Ssam 	.word	TS_ACK|TS_CVC|TS_SETCHR
19911097Ssam 	.long	TSA+char
20011097Ssam 	.word	0xe
20111097Ssam char:
20211097Ssam 	.long	TSA+tsstat
20311097Ssam 	.word	0xe
20411097Ssam 	.word	0
20511097Ssam tsread:
20611097Ssam 	.word	TS_ACK|TS_CVC|TS_READ
20711097Ssam 	.long	0
20811097Ssam 	.word	BLKSIZ
20911097Ssam rewind:
21011097Ssam 	.word	TS_ACK|TS_CVC|TS_REWIND
21111097Ssam 	.long	0
21211097Ssam 	.word	0
21311097Ssam tsstat:
21411097Ssam 	.space	7*2
21511097Ssam end:
216