|
|
1.1 root 1: /*
2: * VAX tape boot block for distribution tapes
3: * works on unibus tm03
4: *
5: * reads a program from a tp directory on a tape and executes it
6: * program must be stripped of the header and is loaded ``bits as is''
7: * you can return to this loader via ``ret'' as you are called ``calls $0,ent''
8: */
9: .set RELOC,0x70000
10: /* a.out defines */
11: .set HDRSIZ,040 /* size of file header for VAX */
12: .set MAGIC,0410 /* file type id in header */
13: .set TSIZ,4 /* text size */
14: .set DSIZ,8 /* data size */
15: .set BSIZ,12 /* bss size */
16: .set TENT,024 /* task header entry loc */
17: /* tp directory definitions */
18: .set FILSIZ,38 /* tp direc offset for file size */
19: .set BNUM,44 /* tp dir offset for start block no. */
20: .set ENTSIZ,64 /* size of 1 TP dir entry, bytes */
21: .set PTHSIZ,32 /* size of TP path name, bytes */
22: .set BLKSIZ,512 /* tape block size, bytes */
23: .set NUMDIR,24 /* no. of dir blocks on tape */
24: .set ENTBLK,8 /* no. of dir entries per tape block */
25: /* processor registers and bits */
26: .set RXCS,32
27: .set RXDB,33
28: .set TXCS,34
29: .set TXDB,35
30: .set RXCS_DONE,0x80
31: .set TXCS_RDY,0x80
32: .set TXCS_pr,7 /* bit position of TXCS ready bit */
33: .set RXCS_pd,7 /* bit position of RXCS done bit */
34: /* UBA registers */
35: .set UBA_DPR1,68
36: .set UBA_MAP,2048
37: .set BNE,0x80000000
38: .set MRV,0x80000000
39: .set MR_BDP1,0x200000
40: /* TM UBA registers */
41: .set TMER,0
42: .set TMCS,2
43: .set TMBC,4
44: .set TMBA,6
45: /* TM commands and bits */
46: .set GO,1
47: .set TM_REW,016
48: .set TM_RCOM,02
49: .set TM_SREV,012
50: .set TM_DCLR,010000
51: .set TM_crdy,7
52: .set TM_gapsd,3
53: .set TMDENS,0 /* 1600 bpi */
54: /* local stack variables */
55: .set tapa,-4 /* desired tape addr */
56: .set mtapa,-8 /* current tape addr */
57: .set name,-8-PTHSIZ /* operator-typed file name */
58: /* register usage */
59: .set rUBA,r10
60: .set rTM,r11
61: /* ===== */
62:
63: /* initialization */
64: init:
65: movl $RELOC,fp /* core loc to which to move this program */
66: addl3 $name,fp,sp /* set stack pointer; leave room for locals */
67: clrl r0
68: 1:
69: movc3 $end,(r0),(fp) /* move boot up to relocated position */
70: jmp start+RELOC
71: start:
72: bsbw rew /* rewind input tape */
73: movab name(fp),r4 /* start of filename storage */
74: movzbl $'=,r0 /* prompt character */
75: bsbw putc /* output char to main console */
76: /* read in a file name */
77: movl r4,r1 /* loc at which to store file name */
78: nxtc:
79: bsbw getc /* get input char's in file name */
80: cmpb r0,$012 /* terminator ? */
81: beql nullc
82: movb r0,(r1)+
83: brb nxtc
84: nullc:
85: subl3 r4,r1,r9 /* size of path name */
86: beql start /* dumb operator */
87: clrb (r1)+
88: incl r9
89: /* user-specified TP filename has been stored at name(fp) */
90: /* read in entire tp directory contents into low core */
91: dirred:
92: movl $8,tapa(fp) /* tp directory starts at block 8 */
93: movl $(NUMDIR*BLKSIZ),r6 /* no. bytes in total dir */
94: bsbw taper /* read no. bytes indicated */
95: /* search entire directory for user-specified file name */
96: clrl r5 /* dir buff loc = 0 */
97: nxtdir:
98: cmpc3 r9,(r5),(r4) /* see if dir entry matches filename */
99: beql fndfil /* found match */
100: acbl $NUMDIR*BLKSIZ-1,$ENTSIZ,r5,nxtdir
101: /* see if done with tp dir */
102: brw start /* entry not in directory; start over */
103: /* found desired tp dir entry */
104: fndfil:
105: movzwl BNUM(r5),tapa(fp) /* start block no., 2 bytes */
106: addl2 $7,tapa(fp) /* skip 7 boot blocks */
107: movzwl FILSIZ(r5),r6 /* low 2 bytes file size */
108: insv FILSIZ-1(r5),$16,$8,r6 /* file size, high byte */
109: cmpl r6,$RELOC-512 /* check if file fits below stack */
110: blss filok /* file o.k. */
111: brw start /* file too large */
112: /* time to read in desired file from tape */
113: filok:
114: movl r6,r7 /* save r6 */
115: bsbb taper
116: bsbw rew
117: /* clear core */
118: subl3 r7,$RELOC-4,r0 /* no. bytes to clear */
119: 1:
120: clrb (r7)+
121: sobgtr r0,1b
122: /* time to jump to start of file & execute */
123: addl3 $20,fp,ap
124: clrl r5
125: calls $0,(r5)
126: brw start
127: /* taper: movcTAPE (r6),tapa(fp),0 */
128: rew2:
129: bsbb rew /* beginning of tape */
130: taper0:
131: bsbb rrec /* advance 1 block; never want blk 0 */
132: taper:
133: clrl r0 /* page no. */
134: cmpl mtapa(fp),tapa(fp) /* current position .vs. desired */
135: bgtr rew2
136: blss taper0
137: 1:
138: bsbb rrec
139: acbl $1,$-BLKSIZ,r6,1b
140: rsb
141: /* rew: rewind the tape */
142: rew:
143: clrl mtapa(fp) /* current position */
144: movw $TM_REW+TMDENS+GO,TMCS(%rTM)
145: rsb
146: /* rrec: read 1 block from mag tape into page (r0) */
147: rrec:
148: /* pushl r0; movzbl $'r,r0; bsbw putc; movl (sp)+,r0; */
149: jsb tmquiet
150: movw $-BLKSIZ,TMBC(%rTM)
151: bisl3 $MRV|MR_BDP1,r0,UBA_MAP(%rUBA)
152: movw $0,TMBA(%rTM)
153: movw $TM_RCOM+TMDENS+GO,TMCS(%rTM)
154: jsb tmquiet
155: bisl2 $BNE,UBA_DPR1(%rUBA)
156: tstw TMER(%rTM)
157: jgeq 2f
158: mnegw $1,TMBC(%rTM)
159: movw $TM_SREV+TMDENS+GO,TMCS(%rTM)
160: jmp rrec
161: 2:
162: incl r0 /* next page no. */
163: incl mtapa(fp) /* mag tape block position */
164: rsb
165: getc:
166: mfpr $RXCS,r0
167: bbc $RXCS_pd,r0,getc /* receiver ready ? */
168: mfpr $RXDB,r0
169: extzv $0,$7,r0,r0
170: cmpb r0,$015
171: bneq putc
172: bsbb putc
173: movb $0,r0
174: bsbb putc
175: movb $012,r0
176: putc:
177: mfpr $TXCS,r2
178: bbc $TXCS_pr,r2,putc /* transmitter ready ? */
179: extzv $0,$7,r0,r0
180: mtpr r0,$TXDB
181: rsb
182: tmquiet:
183: movw TMCS(%rTM),r2
184: bbc $TM_crdy,r2,tmquiet
185: 1:
186: movw TMER(%rTM),r2
187: blbc r2,1b /* low bit == TUR */
188: bbs $TM_gapsd,r2,1b
189: rsb
190: end:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.