xref: /csrg-svn/sys/vax/mdec/utboot.c (revision 11180)
1*11180Ssam /*	utboot.c	4.2	83/02/20	*/
211106Ssam 
311106Ssam /*
411106Ssam  * VAX tape boot block for distribution tapes
511106Ssam  * works on unibus tm03
611106Ssam  *
711106Ssam  * reads a program from a tp directory on a tape and executes it
811106Ssam  * program must be stripped of the header and is loaded ``bits as is''
911106Ssam  * you can return to this loader via ``ret'' as you are called ``calls $0,ent''
1011106Ssam  */
1111106Ssam 	.set	RELOC,0x70000
1211106Ssam /* a.out defines */
1311106Ssam 	.set	HDRSIZ,040	/* size of file header for VAX */
1411106Ssam 	.set	MAGIC,0410	/* file type id in header */
1511106Ssam 	.set	TSIZ,4		/* text size */
1611106Ssam 	.set	DSIZ,8		/* data size */
1711106Ssam 	.set	BSIZ,12		/* bss size */
1811106Ssam 	.set	TENT,024	/* task header entry loc */
1911106Ssam /*  tp directory definitions */
2011106Ssam 	.set	FILSIZ,38	/* tp direc offset for file size */
2111106Ssam 	.set	BNUM,44		/* tp dir offset for start block no. */
2211106Ssam 	.set	ENTSIZ,64	/* size of 1 TP dir entry, bytes */
2311106Ssam 	.set	PTHSIZ,32	/* size of TP path name, bytes */
2411106Ssam 	.set	BLKSIZ,512	/* tape block size, bytes */
2511106Ssam 	.set	NUMDIR,24	/* no. of dir blocks on tape */
2611106Ssam 	.set	ENTBLK,8	/* no. of dir entries per tape block */
2711106Ssam /* processor registers and bits */
2811106Ssam 	.set	RXCS,32
2911106Ssam 	.set	RXDB,33
3011106Ssam 	.set	TXCS,34
3111106Ssam 	.set	TXDB,35
3211106Ssam 	.set	RXCS_DONE,0x80
3311106Ssam 	.set	TXCS_RDY,0x80
3411106Ssam 	.set	TXCS_pr,7	/* bit position of TXCS ready bit */
3511106Ssam 	.set	RXCS_pd,7	/* bit position of RXCS done bit */
3611106Ssam /* UBA registers */
3711106Ssam 	.set	UBA_DPR1,68
3811106Ssam 	.set	UBA_MAP,2048
3911106Ssam 	.set	BNE,0x80000000
4011106Ssam 	.set	MRV,0x80000000
4111106Ssam 	.set	MR_BDP1,0x200000
4211106Ssam 
4311106Ssam /* UT UBA registers */
4411106Ssam 	.set	UTCS1,0
4511106Ssam 	.set	UTWC,02
4611106Ssam 	.set	UTBA,04
4711106Ssam 	.set	UTFC,06
4811106Ssam 	.set	UTCS2,010
4911106Ssam 	.set	UTDS,012
5011106Ssam 	.set	UTER,014
5111106Ssam 	.set	UTAS,016
5211106Ssam 	.set	UTCK,020
5311106Ssam 	.set	UTDB,022
5411106Ssam 	.set	UTMR,024
5511106Ssam 	.set	UTDT,026
5611106Ssam 	.set	UTSN,030
5711106Ssam 	.set	UTTC,032
5811106Ssam 
5911106Ssam /* UT commands and bits */
6011106Ssam 	.set	GO,01
6111106Ssam 	.set	UT_REW,06
6211106Ssam 	.set	UT_RCOM,070
6311106Ssam 	.set	UT_SREV,032
6411106Ssam 	.set	UT_DCLR,010
6511106Ssam 	.set	UT_crdy,0200
6611106Ssam 	.set	UT_gapsd,020000	/* aka "positioning in progress" */
6711106Ssam 	.set	UTDENS,0		/* 1600 bpi */
6811106Ssam /* local stack variables */
6911106Ssam 	.set	tapa,-4		/* desired tape addr */
7011106Ssam 	.set	mtapa,-8	/* current tape addr */
7111106Ssam 	.set	name,-8-PTHSIZ	/* operator-typed file name */
7211106Ssam /* register usage */
7311106Ssam 	.set	rUBA,r10
7411106Ssam 	.set	rUT,r11
7511106Ssam /* ===== */
7611106Ssam 
7711106Ssam /* initialization */
7811106Ssam init:
7911106Ssam 	movl	$RELOC,fp	/* core loc to which to move this program */
8011106Ssam 	addl3	$name,fp,sp	/* set stack pointer; leave room for locals */
8111106Ssam 	clrl	r0
8211106Ssam 1:
8311106Ssam 	movc3	$end,(r0),(fp)	/* move boot up to relocated position */
8411106Ssam 	jmp	start+RELOC
8511106Ssam start:
8611106Ssam 	bsbw	rew			/* rewind input tape */
8711106Ssam 	movab	name(fp),r4		/* start of filename storage */
8811106Ssam 	movzbl	$'=,r0			/* prompt character */
8911106Ssam 	bsbw	putc			/* output char to main console */
9011106Ssam /* read in a file name */
9111106Ssam 	movl	r4,r1			/* loc at which to store file name */
9211106Ssam nxtc:
9311106Ssam 	bsbw	getc			/* get input char's in file name */
9411106Ssam 	cmpb	r0,$012			/* terminator ? */
9511106Ssam 	beql	nullc
9611106Ssam 	movb	r0,(r1)+
9711106Ssam 	brb	nxtc
9811106Ssam nullc:
9911106Ssam 	subl3	r4,r1,r9		/* size of path name */
10011106Ssam 	beql	start			/* dumb operator */
10111106Ssam 	clrb	(r1)+
10211106Ssam 	incl	r9
10311106Ssam /* user-specified TP filename has been stored at name(fp) */
10411106Ssam /* read in entire tp directory contents into low core */
10511106Ssam dirred:
10611106Ssam 	movl	$8,tapa(fp)		/* tp directory starts at block 8 */
10711106Ssam 	movl	$(NUMDIR*BLKSIZ),r6	/* no. bytes in total dir */
10811106Ssam 	bsbw	taper			/* read no. bytes indicated */
10911106Ssam /* search entire directory for user-specified file name */
11011106Ssam 	clrl	r5			/* dir buff loc = 0 */
11111106Ssam nxtdir:
11211106Ssam 	cmpc3	r9,(r5),(r4)		/* see if dir entry matches filename */
11311106Ssam 	beql	fndfil			/* found match */
11411106Ssam 	acbl	$NUMDIR*BLKSIZ-1,$ENTSIZ,r5,nxtdir
11511106Ssam 					/* see if done with tp dir */
11611106Ssam 	brw	start			/* entry not in directory; start over */
11711106Ssam /* found desired tp dir entry */
11811106Ssam fndfil:
11911106Ssam 	movzwl	BNUM(r5),tapa(fp)	/* start block no., 2 bytes */
12011106Ssam 	addl2	$7,tapa(fp)		/* skip 7 boot blocks */
12111106Ssam 	movzwl	FILSIZ(r5),r6		/* low 2 bytes file size */
12211106Ssam 	insv	FILSIZ-1(r5),$16,$8,r6  /* file size, high byte */
12311106Ssam 	cmpl	r6,$RELOC-512		/* check if file fits below stack */
12411106Ssam 	blss	filok 			/* file o.k. */
12511106Ssam 	brw	start			/* file too large */
12611106Ssam /* time to read in desired file from tape */
12711106Ssam filok:
12811106Ssam 	movl	r6,r7			/* save r6 */
12911106Ssam 	bsbb	taper
13011106Ssam 	bsbw	rew
13111106Ssam /* clear core */
13211106Ssam 	subl3	r7,$RELOC-4,r0		/* no. bytes to clear */
13311106Ssam 1:
13411106Ssam 	clrb	(r7)+
13511106Ssam 	sobgtr	r0,1b
13611106Ssam /* time to jump to start of file & execute */
13711106Ssam 	addl3	$20,fp,ap
13811106Ssam 	clrl	r5
13911106Ssam 	calls	$0,(r5)
14011106Ssam 	brw	start
14111106Ssam /* taper: movcTAPE (r6),tapa(fp),0 */
14211106Ssam rew2:
14311106Ssam 	bsbb	rew			/* beginning of tape */
14411106Ssam taper0:
14511106Ssam 	bsbb	rrec			/* advance 1 block; never want blk 0 */
14611106Ssam taper:
14711106Ssam 	clrl	r0			/* page no. */
14811106Ssam 	cmpl	mtapa(fp),tapa(fp)	/* current position .vs. desired */
14911106Ssam 	bgtr	rew2
15011106Ssam 	blss	taper0
15111106Ssam 1:
15211106Ssam 	bsbb	rrec
15311106Ssam 	acbl	$1,$-BLKSIZ,r6,1b
15411106Ssam 	rsb
15511106Ssam /* rew: rewind the tape */
15611106Ssam rew:
15711106Ssam 	clrl	mtapa(fp)		/* current position */
15811106Ssam 	movw	$UTDENS,UTTC(%rUT)	/* select drive */
15911106Ssam 	movw	$UT_REW+GO,UTCS1(%rUT)
16011106Ssam 	rsb
16111106Ssam /* rrec: read 1 block from mag tape into page (r0) */
16211106Ssam rrec:
16311106Ssam 	/* pushl r0; movzbl $'r,r0; bsbw putc; movl (sp)+,r0; */
164*11180Ssam 	jsb	utquiet
16511106Ssam 	movw	$-BLKSIZ,UTFC(%rUT)
16611106Ssam 	movw	$-256,UTWC(%rUT)		/* !!!!!!!!!!!!!! */
16711106Ssam 	bisl3	$MRV|MR_BDP1,r0,UBA_MAP(%rUBA)
16811106Ssam 	movw	$0,UTBA(%rUT)
16911106Ssam 	movw	$UTDENS,UTTC(%rUT)	/* select drive */
17011106Ssam 	movw	$UT_RCOM+GO,UTCS1(%rUT)
171*11180Ssam 	jsb	utquiet
17211106Ssam 	bisl2	$BNE,UBA_DPR1(%rUBA)
17311106Ssam 	tstw	UTER(%rUT)
17411106Ssam 	jgeq	2f
17511106Ssam 	mnegw	$1,UTWC(%rUT)
17611106Ssam 	movw	$UTDENS,UTTC(%rUT)	/* select drive */
17711106Ssam 	movw	$UT_SREV+GO,UTCS1(%rUT)
17811106Ssam 	jmp	rrec
17911106Ssam 2:
18011106Ssam 	incl	r0			/* next page no. */
18111106Ssam 	incl	mtapa(fp)		/* mag tape block position */
18211106Ssam 	rsb
18311106Ssam getc:
18411106Ssam 	mfpr	$RXCS,r0
18511106Ssam 	bbc	$RXCS_pd,r0,getc	/* receiver ready ? */
18611106Ssam 	mfpr	$RXDB,r0
18711106Ssam 	extzv	$0,$7,r0,r0
18811106Ssam 	cmpb	r0,$015
18911106Ssam 	bneq	putc
19011106Ssam 	bsbb	putc
19111106Ssam 	movb	$0,r0
19211106Ssam 	bsbb	putc
19311106Ssam 	movb	$012,r0
19411106Ssam putc:
19511106Ssam 	mfpr	$TXCS,r2
19611106Ssam 	bbc	$TXCS_pr,r2,putc	/* transmitter ready ? */
19711106Ssam 	extzv	$0,$7,r0,r0
19811106Ssam 	mtpr	r0,$TXDB
19911106Ssam 	rsb
200*11180Ssam utquiet:
20111106Ssam 	movw	UTCS1(%rUT),r2
202*11180Ssam 	bbc	$UT_crdy,r2,utquiet
20311106Ssam 1:
20411106Ssam 	movw	UTDS(%rUT),r2
20511106Ssam 	bbs	$UT_gapsd,r2,1b
20611106Ssam 	rsb
20711106Ssam end:
208