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