xref: /original-bsd/sys/vax/mdec/utboot.c (revision d1a9a99c)
150f898f2Smckusick /*
2*d1a9a99cSmckusick  * Copyright (c) 1980, 1986 Regents of the University of California.
350f898f2Smckusick  * All rights reserved.  The Berkeley software License Agreement
450f898f2Smckusick  * specifies the terms and conditions for redistribution.
550f898f2Smckusick  */
650f898f2Smckusick 
7*d1a9a99cSmckusick /* "@(#)utboot.c	7.1 (Berkeley) 06/05/86" */
85f0eef06Ssam 
95f0eef06Ssam /*
105f0eef06Ssam  * VAX tape boot block for distribution tapes
115f0eef06Ssam  * works on unibus tm03
125f0eef06Ssam  *
135f0eef06Ssam  * reads a program from a tp directory on a tape and executes it
145f0eef06Ssam  * program must be stripped of the header and is loaded ``bits as is''
155f0eef06Ssam  * you can return to this loader via ``ret'' as you are called ``calls $0,ent''
165f0eef06Ssam  */
175f0eef06Ssam 	.set	RELOC,0x70000
185f0eef06Ssam /* a.out defines */
195f0eef06Ssam 	.set	HDRSIZ,040	/* size of file header for VAX */
205f0eef06Ssam 	.set	MAGIC,0410	/* file type id in header */
215f0eef06Ssam 	.set	TSIZ,4		/* text size */
225f0eef06Ssam 	.set	DSIZ,8		/* data size */
235f0eef06Ssam 	.set	BSIZ,12		/* bss size */
245f0eef06Ssam 	.set	TENT,024	/* task header entry loc */
255f0eef06Ssam /*  tp directory definitions */
265f0eef06Ssam 	.set	FILSIZ,38	/* tp direc offset for file size */
275f0eef06Ssam 	.set	BNUM,44		/* tp dir offset for start block no. */
285f0eef06Ssam 	.set	ENTSIZ,64	/* size of 1 TP dir entry, bytes */
295f0eef06Ssam 	.set	PTHSIZ,32	/* size of TP path name, bytes */
305f0eef06Ssam 	.set	BLKSIZ,512	/* tape block size, bytes */
315f0eef06Ssam 	.set	NUMDIR,24	/* no. of dir blocks on tape */
325f0eef06Ssam 	.set	ENTBLK,8	/* no. of dir entries per tape block */
335f0eef06Ssam /* processor registers and bits */
345f0eef06Ssam 	.set	RXCS,32
355f0eef06Ssam 	.set	RXDB,33
365f0eef06Ssam 	.set	TXCS,34
375f0eef06Ssam 	.set	TXDB,35
385f0eef06Ssam 	.set	RXCS_DONE,0x80
395f0eef06Ssam 	.set	TXCS_RDY,0x80
405f0eef06Ssam 	.set	TXCS_pr,7	/* bit position of TXCS ready bit */
415f0eef06Ssam 	.set	RXCS_pd,7	/* bit position of RXCS done bit */
425f0eef06Ssam /* UBA registers */
435f0eef06Ssam 	.set	UBA_DPR1,68
445f0eef06Ssam 	.set	UBA_MAP,2048
455f0eef06Ssam 	.set	BNE,0x80000000
465f0eef06Ssam 	.set	MRV,0x80000000
475f0eef06Ssam 	.set	MR_BDP1,0x200000
485f0eef06Ssam 
495f0eef06Ssam /* UT UBA registers */
505f0eef06Ssam 	.set	UTCS1,0
515f0eef06Ssam 	.set	UTWC,02
525f0eef06Ssam 	.set	UTBA,04
535f0eef06Ssam 	.set	UTFC,06
545f0eef06Ssam 	.set	UTCS2,010
555f0eef06Ssam 	.set	UTDS,012
565f0eef06Ssam 	.set	UTER,014
575f0eef06Ssam 	.set	UTAS,016
58ac9f8c26Ssam 	.set	UTCC,020
595f0eef06Ssam 	.set	UTDB,022
605f0eef06Ssam 	.set	UTMR,024
615f0eef06Ssam 	.set	UTDT,026
625f0eef06Ssam 	.set	UTSN,030
635f0eef06Ssam 	.set	UTTC,032
645f0eef06Ssam 
655f0eef06Ssam /* UT commands and bits */
665f0eef06Ssam 	.set	GO,01
67ac9f8c26Ssam 	.set	UT_REW,0x6
68ac9f8c26Ssam 	.set	UT_RCOM,0x38
69ac9f8c26Ssam 	.set	UT_SREV,0x1a
70ac9f8c26Ssam 	.set	UT_DCLR,0x8
71db8342d4Skarels 	.set	UT_crdy,7		/* bit pos. */
72db8342d4Skarels 	.set	UT_gapsd,13		/* bit; aka "positioning in progress" */
73ac9f8c26Ssam 	.set	UTDENS,0x4c0		/* 1600 bpi, PDP-11 format */
745f0eef06Ssam /* local stack variables */
755f0eef06Ssam 	.set	tapa,-4		/* desired tape addr */
765f0eef06Ssam 	.set	mtapa,-8	/* current tape addr */
775f0eef06Ssam 	.set	name,-8-PTHSIZ	/* operator-typed file name */
785f0eef06Ssam /* register usage */
795f0eef06Ssam 	.set	rUBA,r10
805f0eef06Ssam 	.set	rUT,r11
815f0eef06Ssam /* ===== */
825f0eef06Ssam 
835f0eef06Ssam /* initialization */
845f0eef06Ssam init:
855f0eef06Ssam 	movl	$RELOC,fp	/* core loc to which to move this program */
865f0eef06Ssam 	addl3	$name,fp,sp	/* set stack pointer; leave room for locals */
875f0eef06Ssam 	clrl	r0
885f0eef06Ssam 1:
895f0eef06Ssam 	movc3	$end,(r0),(fp)	/* move boot up to relocated position */
905f0eef06Ssam 	jmp	start+RELOC
915f0eef06Ssam start:
925f0eef06Ssam 	bsbw	rew			/* rewind input tape */
935f0eef06Ssam 	movab	name(fp),r4		/* start of filename storage */
945f0eef06Ssam 	movzbl	$'=,r0			/* prompt character */
955f0eef06Ssam 	bsbw	putc			/* output char to main console */
965f0eef06Ssam /* read in a file name */
975f0eef06Ssam 	movl	r4,r1			/* loc at which to store file name */
985f0eef06Ssam nxtc:
995f0eef06Ssam 	bsbw	getc			/* get input char's in file name */
1005f0eef06Ssam 	cmpb	r0,$012			/* terminator ? */
1015f0eef06Ssam 	beql	nullc
1025f0eef06Ssam 	movb	r0,(r1)+
1035f0eef06Ssam 	brb	nxtc
1045f0eef06Ssam nullc:
1055f0eef06Ssam 	subl3	r4,r1,r9		/* size of path name */
1065f0eef06Ssam 	beql	start			/* dumb operator */
1075f0eef06Ssam 	clrb	(r1)+
1085f0eef06Ssam 	incl	r9
1095f0eef06Ssam /* user-specified TP filename has been stored at name(fp) */
1105f0eef06Ssam /* read in entire tp directory contents into low core */
1115f0eef06Ssam dirred:
1125f0eef06Ssam 	movl	$8,tapa(fp)		/* tp directory starts at block 8 */
1135f0eef06Ssam 	movl	$(NUMDIR*BLKSIZ),r6	/* no. bytes in total dir */
1145f0eef06Ssam 	bsbw	taper			/* read no. bytes indicated */
1155f0eef06Ssam /* search entire directory for user-specified file name */
1165f0eef06Ssam 	clrl	r5			/* dir buff loc = 0 */
1175f0eef06Ssam nxtdir:
1185f0eef06Ssam 	cmpc3	r9,(r5),(r4)		/* see if dir entry matches filename */
1195f0eef06Ssam 	beql	fndfil			/* found match */
1205f0eef06Ssam 	acbl	$NUMDIR*BLKSIZ-1,$ENTSIZ,r5,nxtdir
1215f0eef06Ssam 					/* see if done with tp dir */
1225f0eef06Ssam 	brw	start			/* entry not in directory; start over */
1235f0eef06Ssam /* found desired tp dir entry */
1245f0eef06Ssam fndfil:
1255f0eef06Ssam 	movzwl	BNUM(r5),tapa(fp)	/* start block no., 2 bytes */
1265f0eef06Ssam 	addl2	$7,tapa(fp)		/* skip 7 boot blocks */
1275f0eef06Ssam 	movzwl	FILSIZ(r5),r6		/* low 2 bytes file size */
1285f0eef06Ssam 	insv	FILSIZ-1(r5),$16,$8,r6  /* file size, high byte */
1295f0eef06Ssam 	cmpl	r6,$RELOC-512		/* check if file fits below stack */
1305f0eef06Ssam 	blss	filok 			/* file o.k. */
1315f0eef06Ssam 	brw	start			/* file too large */
1325f0eef06Ssam /* time to read in desired file from tape */
1335f0eef06Ssam filok:
1345f0eef06Ssam 	movl	r6,r7			/* save r6 */
1355f0eef06Ssam 	bsbb	taper
1365f0eef06Ssam 	bsbw	rew
1375f0eef06Ssam /* clear core */
1385f0eef06Ssam 	subl3	r7,$RELOC-4,r0		/* no. bytes to clear */
1395f0eef06Ssam 1:
1405f0eef06Ssam 	clrb	(r7)+
1415f0eef06Ssam 	sobgtr	r0,1b
1425f0eef06Ssam /* time to jump to start of file & execute */
1435f0eef06Ssam 	addl3	$20,fp,ap
1445f0eef06Ssam 	clrl	r5
1455f0eef06Ssam 	calls	$0,(r5)
1465f0eef06Ssam 	brw	start
1475f0eef06Ssam /* taper: movcTAPE (r6),tapa(fp),0 */
1485f0eef06Ssam rew2:
1495f0eef06Ssam 	bsbb	rew			/* beginning of tape */
1505f0eef06Ssam taper0:
1515f0eef06Ssam 	bsbb	rrec			/* advance 1 block; never want blk 0 */
1525f0eef06Ssam taper:
1535f0eef06Ssam 	clrl	r0			/* page no. */
1545f0eef06Ssam 	cmpl	mtapa(fp),tapa(fp)	/* current position .vs. desired */
1555f0eef06Ssam 	bgtr	rew2
1565f0eef06Ssam 	blss	taper0
1575f0eef06Ssam 1:
1585f0eef06Ssam 	bsbb	rrec
1595f0eef06Ssam 	acbl	$1,$-BLKSIZ,r6,1b
1605f0eef06Ssam 	rsb
1615f0eef06Ssam /* rew: rewind the tape */
1625f0eef06Ssam rew:
1635f0eef06Ssam 	clrl	mtapa(fp)		/* current position */
1645f0eef06Ssam 	movw	$UTDENS,UTTC(%rUT)	/* select drive */
1655f0eef06Ssam 	movw	$UT_REW+GO,UTCS1(%rUT)
1665f0eef06Ssam 	rsb
1675f0eef06Ssam /* rrec: read 1 block from mag tape into page (r0) */
1685f0eef06Ssam rrec:
1695f0eef06Ssam 	/* pushl r0; movzbl $'r,r0; bsbw putc; movl (sp)+,r0; */
17085fc7887Ssam 	jsb	utquiet
1715f0eef06Ssam 	movw	$-BLKSIZ,UTFC(%rUT)
1725f0eef06Ssam 	movw	$-256,UTWC(%rUT)		/* !!!!!!!!!!!!!! */
1735f0eef06Ssam 	bisl3	$MRV|MR_BDP1,r0,UBA_MAP(%rUBA)
1745f0eef06Ssam 	movw	$0,UTBA(%rUT)
1755f0eef06Ssam 	movw	$UTDENS,UTTC(%rUT)	/* select drive */
1765f0eef06Ssam 	movw	$UT_RCOM+GO,UTCS1(%rUT)
17785fc7887Ssam 	jsb	utquiet
1785f0eef06Ssam 	bisl2	$BNE,UBA_DPR1(%rUBA)
1795f0eef06Ssam 	tstw	UTER(%rUT)
1805f0eef06Ssam 	jgeq	2f
1815f0eef06Ssam 	mnegw	$1,UTWC(%rUT)
1825f0eef06Ssam 	movw	$UTDENS,UTTC(%rUT)	/* select drive */
1835f0eef06Ssam 	movw	$UT_SREV+GO,UTCS1(%rUT)
1845f0eef06Ssam 	jmp	rrec
1855f0eef06Ssam 2:
1865f0eef06Ssam 	incl	r0			/* next page no. */
1875f0eef06Ssam 	incl	mtapa(fp)		/* mag tape block position */
1885f0eef06Ssam 	rsb
1895f0eef06Ssam getc:
1905f0eef06Ssam 	mfpr	$RXCS,r0
1915f0eef06Ssam 	bbc	$RXCS_pd,r0,getc	/* receiver ready ? */
1925f0eef06Ssam 	mfpr	$RXDB,r0
1935f0eef06Ssam 	extzv	$0,$7,r0,r0
1945f0eef06Ssam 	cmpb	r0,$015
1955f0eef06Ssam 	bneq	putc
1965f0eef06Ssam 	bsbb	putc
1975f0eef06Ssam 	movb	$0,r0
1985f0eef06Ssam 	bsbb	putc
1995f0eef06Ssam 	movb	$012,r0
2005f0eef06Ssam putc:
2015f0eef06Ssam 	mfpr	$TXCS,r2
2025f0eef06Ssam 	bbc	$TXCS_pr,r2,putc	/* transmitter ready ? */
2035f0eef06Ssam 	extzv	$0,$7,r0,r0
2045f0eef06Ssam 	mtpr	r0,$TXDB
2055f0eef06Ssam 	rsb
20685fc7887Ssam utquiet:
2075f0eef06Ssam 	movw	UTCS1(%rUT),r2
20885fc7887Ssam 	bbc	$UT_crdy,r2,utquiet
2095f0eef06Ssam 1:
2105f0eef06Ssam 	movw	UTDS(%rUT),r2
2115f0eef06Ssam 	bbs	$UT_gapsd,r2,1b
2125f0eef06Ssam 	rsb
2135f0eef06Ssam end:
214