9b742951d3cf94813feda38146ad4420d0fd2b4f
[pdp8.git] / sw / os8 / v3d / sources / system / dectapes / dectape3 / C3BOOT.PA
1 /2 OS/8 TERTIARY CASSETTE BOOTSTRAP V5
2 /
3 /
4 /
5 /
6 /
7 /
8 /
9 /
10 /
11 /COPYRIGHT (C) 1973,1974 BY DIGITAL EQUIPMENT CORPORATION
12 /
13 /
14 /
15 /
16 /
17 /
18 /
19 /
20 /
21 /
22 /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE
23 /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT
24 /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY
25 /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT.
26 /
27 /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER
28 /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED
29 /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH
30 /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL.
31 /
32 /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE
33 /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY
34 /DIGITAL.
35 /
36 /
37 /
38 /
39 /
40 /
41 /
42 /
43 /
44 /
45 \f VERSON= 5
46 SUBVER= 01 /SUBVERSION A = 01, ETC
47
48 BINARY=6200
49
50 FIELD 1
51
52 *5200
53
54 CIF CDF 0 /THE SECONDARY BOOTSTRAP BRANCHES HERE OF ALL PLACES
55 JMP I .+1
56 C3STRT /WE WANT TO BE HERE
57
58
59
60 /EXPLANATION:
61
62 /THE PRIMARY (KEY-IN) BOOTSTRAP CONSISTS OF 32 WORDS
63 /AND IS AWFUL PRIMITIVE. IT BARELY MANAGES TO READ IN THE
64 /SECONDARY BOOTSTRAP.
65 /THE SECONDARY BOOTSTRAP CONTAINS A FULL-FLEDGED BINARY LOADER
66 /AND IS USED TO READ IN THE NEXT FILE INTO CORE
67 /(BUT NOT OVER ITSELF (LOCS 3600-4040)) AND DOES LITTLE IF ANY
68 /I/O ERROR CHECKING. THIS NEXT FILE IS IN FACT THE TERTIARY BOOTSTRAP.
69 /THE SECONDARY BOOTSTRAP STARTS UP THE TERTIARY BOOTSTRAP AT
70 /LOCATION 15200 WHICH THEN CONTAINS ANOTHER FULL-FLEDGED BINARY LOADER
71 /AND IN ADDITION A COMPLETE TWO-PAGE CASSETTE HANDLER.
72 /THIS TERTIARY BOOTSTRAP RESIDES IN BUFFER SPACE OF BUILD AND
73 /READS IN BUILD WITH FULL I/O ERROR CHECKING.
74 /WHEN IT IS THROUGH, IT BRANCHES TO BUILD AT LOCATION 02000.
75
76 /RECORD SIZES:
77
78 /C2BOOT MUST BE 200 BYTES/RECORD
79 /C3BOOT MUST BE 200 BYTES/RECORD
80 /BUILD MUST BE 300 BYTES/RECORD
81 /OS8 MUST BE 300 BYTES/RECORD
82 /CD MUST BE 300 BYTES/RECORD
83 /MCPIP MUST BE 300 BYTES/RECORD
84 /OTHER CUSPS CAN BE ANY RECORD SIZE.
85
86 /C2BOOT AND C3BOOT MUST BE 200 BYTES/RECORD BECAUSE THAT'S WHAT THE PRIMARY BOOT READS.
87 /THE ONES WHICH MUST BE 300 BYTES/RECORD ARE SUCH BECAUSE
88 /THEY ARE USING THE OS/8 CASSETTE HANDLER TO READ IN.
89 /OTHERS ARE READ IN BY MCPIP AND CAN BE ANY RECORD SIZE.
90 \f FIELD 0
91
92 *5400
93
94 C3STRT, CLA
95 JMS I (CSA0
96 3 /SKIP FILE
97 L7400, 7400
98 L200, 200
99 M200, -200
100 JMS I (CSA0
101 100 /SKIP HEADER BY READING PAST IT
102
103 BINARY
104 M301, -301
105 SKP CLA /ERROR IS OK
106 HLT /GOOD READ IS BAD
107 LDABS2, DCA CKSUM
108 JMS GCHAR
109 SNA
110 JMP .-2 /IGNORE BLANKS
111 TAD M200
112 SZA CLA /IS IT LEADER?
113 HLT /NOT BINARY
114 LEADER, JMS GCHAR
115 TAD M200 /STILL LEADER?
116 SNA
117 JMP LEADER /YES
118 NEWWD, SMA /IS IT LESS THAN 200?
119 JMP FIELDW /NO, IT'S A FIELD SETTING
120 TAD L200 /RESTORE CHAR
121 DCA WD1
122 JMS GCHAR
123 DCA WD2
124 JMS GCHAR
125 TAD M200
126 SNA
127 JMP OVER /200 FINISHES US UP
128 DCA WD /SAVE NEXT WORD FOR LATER
129 JMS ASSEMB /ASSEMBLE PREVIOUS WORD
130 SZL /IS IT AN ORIGIN?
131 JMP ORG /YES
132 XFIELD, CDF 0 /ASSUMES BUILD STARTS IN FIELD 0
133 DCA I ORIGIN
134 CDF0, CDF 0
135 TAD ORIGIN
136 IAC
137 ORG, DCA ORIGIN
138 NEXT, TAD WD1
139 TAD WD2 /MAKE UP CHECKSUM
140 TAD CKSUM
141 DCA CKSUM
142 TAD WD
143 JMP NEWWD
144 L70, 70
145 \fFIELDW, AND L70 /EXTRACT FIELD SETTING
146 TAD CDF0
147 DCA XFIELD
148 JMS GCHAR
149 TAD M200
150 SZA
151 JMP NEWWD
152 OVER, JMS ASSEMB
153 CIA
154 TAD CKSUM
155 SZA CLA
156 HLT /BAD CHECKSUM
157 JMP I L200 /START BUILD
158
159 ASSEMB, 0
160 TAD WD1
161 CLL RTL
162 RTL
163 RTL
164 TAD WD2
165 JMP I ASSEMB
166
167 ORIGIN, 0
168 WD1, 0
169 WD2, 0
170 WD, 0
171 CKSUM, 0
172 \fCHCNT, -1
173 CHPTR, BINBUF
174
175 GCHAR, 0
176 ISZ JMPGET /POINT TO CORRECT ROUTINE
177 ISZ CHCNT /NEED WE READ?
178 JMPX, JMP JMPGET /NOT YET
179 JMS I (CSA0 /CALL HANDLER
180 100 /READ ONE PAGE
181 BINBUF, BINARY
182 L377, 377 /DUMMY BLOCK NO.
183 HLT /I/O ERROR
184 TAD M301
185 DCA CHCNT /NEW CHAR COUNT
186 TAD BINBUF
187 DCA CHPTR
188 TAD JMPX
189 DCA JMPGET
190 JMP GCHAR+1
191 JMPGET, JMP .
192 JMP CHAR1
193 JMP CHAR2
194 TAD JMPX
195 DCA JMPGET
196 TAD I CHPTR
197 AND L7400
198 CLL RTR
199 RTR
200 TAD CHTMP
201 RTR
202 RTR
203 ISZ CHPTR
204 JMP GCHCOM
205
206 CHTMP, 0
207
208 CHAR2, TAD I CHPTR
209 AND L7400
210 DCA CHTMP
211 ISZ CHPTR
212 CHAR1, TAD I CHPTR
213 GCHCOM, AND L377
214 JMP I GCHAR
215 PAGE
216 \f CODE=0
217
218 KCLR=CODE^10+6700 /CLEAR ALL
219 KSDR=CODE^10+6701 /SKIP ON DATA FLAG
220 KSEN=CODE^10+6702 /SKIP ON ERROR
221 KSBF=CODE^10+6703 /SKIP ON READY FLAG
222 KLSA=CODE^10+6704 /LOAD STATUS A
223 KSAF=CODE^10+6705 /SKIP ON ANY FLAG OR ERROR
224 KGOA=CODE^10+6706 /ASSERT CONTENTS OF STATUS A AND XFER
225 KRSB=CODE^10+6707 /READ STATUS B
226
227 BSW=7002 /BYTE SWAP [8/E,F ONLY]
228
229 /REWIND=10
230 /BACKFIL=30
231 /WRGAP=40
232 /BACKBLOCK=50
233 /SKPFIL=70
234
235 /SPECIAL CODES
236
237 / 0 WRITE EOF
238 / 1 REWIND
239 / 3 SKIPFILE/BACKFILE
240 / 2 BACKBLOCK
241
242 / 4-7 UNUSED (TAKES LOW ORDER 2 BITS ONLY CURRENTLY)
243
244 VERSION="B&77 /MODIFIED
245 \fK3700, 3700 /MUST BE FIRST LOCATION ON PAGE
246 UNIT,
247 CSA1, VERSION /ENTRY POINT FOR CSA1
248 CLA /PROTECT CODE AGAINST IGNORANT USERS
249 TAD CSA1 /PICK UP ARGUMENTS
250 DCA CSA0 /VIA CSA0
251 STL IAC RAL /TAD (3 [8/I,L,E,F]
252 JMP .+3 /JOIN PROCESSING WITH UNIT 1
253 CSA0, VERSION /ENTRY POINT FOR CSA0
254 STL CLA RTL /TAD (2
255 BSW / [8/E,F]
256 DCA UNIT /SAVE UNIT (0 IS 200, 1 IS 300)
257 CS, JMS T /INITIALIZATION; REPLACED BY RDF
258 TAD KCIF /FORM RETURN FIELD INSTRUCTION
259 DCA RETCIF /STORE IN RETURN CODE
260 TAD I CSA0 /GET FUNCTION CONTROL WORD
261 DCA FUN /SAVE IT
262 TAD FUN /GET IT BACK AGAIN
263 AND K70 /ISOLATE FIELD OF BUFFER
264 TAD KCDF /FORM CDF TO FIELD OF BUFFER
265 DCA BUFCDF /STORE IN APPROPRIATE SPOT
266 ISZ CSA0 /POINT TO ARGUMENT 2
267 TAD I CSA0 /GET BUFFER ADDRESS
268 DCA BUFFER /SAVE IT
269 ISZ CSA0 /POINT TO ARGUMENT 3
270 TAD I CSA0 /GET BLOCK NUMBER
271 ISZ CSA0 /POINT TO ERROR RETURN
272 KCIF, CIF CDF 0 /SEEK TEMPORARY SAFETY IN CURRENT DATA FIELD
273 SZA CLA
274 JMP NOT1ST /NOT BLOCK 0
275 STL CLA RAR /TAD (4000
276 AND FUN /ISOLATE READ/WRITE BIT
277 TAD UNIT /INSERT UNIT
278 JMS I QCAS /CALL CASSETTE ROUTINE
279 REWIND-. /TO PERFORM A REWIND/INITIALIZATION
280 NOT1ST, TAD FUN
281 K200, AND K3700 /ISOLATE NUMBER OF BLOCKS TO XFER
282 SNA
283 JMP SPCASE /0 BLOCKS MEANS SPECIAL THING (EOF)
284 RECLP, DCA BLKNT /SET COUNT OF NUMBER OF BLOCKS
285 STL CLA RAR /TAD (4000
286 AND FUN /ISOLATE READ/WRITE BIT
287 TAD UNIT /INSERT UNIT
288 JMS I QCAS /CALL CASSETTE ROUTINE
289 RW-. /TO INITIATE READ OR WRITE
290 RETRY, SZA /NON-ZERO AC MEANS ERROR
291 JMP RETCIF /TOUGH LUCK BOOBIE - ERROR
292 TAD K7700 /GET READY TO XFER 100 DOUBLE WORDS
293 DCA DBWDCT /SET DOUBLE WORD COUNTER
294 TAD BUFFER /GET START OF BUFFER SEGMENT
295 DCA BPTR /SET 'BPTR'
296 BUFCDF, HLT /CHANGE TO DATA FIELD OF USER'S BUFFER
297 TAD FUN
298 K7700, SMA CLA /WHICH DIRECTION IS TRANSFER?
299 JMP READ /WANT TO READ
300 \fWRITE, TAD I BPTR /WANT TO WRITE, SO GET WORD FROM BUFFER
301 JMS I QGPCH /WRITE
302 TAD I BPTR /GET FIRST WORD AGAIN
303 AND P7400 /ISOLATE FIRST HALF OF BYTE 3
304 DCA T /SAVE FOR FUTURE REFERENCE
305 ISZ BPTR /POINT TO NEXT LOCATION IN BUFFER
306 TAD I BPTR /GET SECOND WORD OF BUFFER PAIR
307 JMS I QGPCH /WRITE BYTE #2
308 TAD I BPTR /RETRIEVE WORD 2
309 AND P7400 /ISOLATE 2ND HALF OF BYTE #3
310 CLL RTR /CREATE MYSTIC HIDDEN BYTE 3
311 RTR
312 TAD T /GOOD THING I STILL HAVE THIS
313 CLL RTR
314 RTR
315 JMS I QGPCH /WRITE BYTE #3
316 JMP COM
317 \fREAD, JMS I QGPCH /READ BYTE #1 OF TRIPLE
318 DCA I BPTR /STORE IN WORD 1 OF BUFFER PAIR
319 JMS I QGPCH /READ BYTE #2 OF TRIPLE
320 DCA T /SAVE IT FOR POSTERITY
321 JMS I QGPCH /READ BYTE #3 OF TRIPLE
322 RTL
323 RTL /MYSTIC ROTATES
324 DCA T2
325 TAD T2
326 AND P7400 /AND MYSTIC CONSTANTS
327 TAD I BPTR /FIX UP BUFFER WORD 1 OF PAIR
328 DCA I BPTR
329 TAD T2
330 RTL
331 RTL /MORE ROTATION
332 AND P7400 /AND MORE
333 TAD T
334 ISZ BPTR /POINT TO SECOND WORD OF BUFFER PAIR
335 DCA I BPTR /STORE SECOND WORD
336 COM, ISZ BPTR /POINT TO BEGIN OF NEXT BUFFER PAIR
337 P7400, 7400 /PROTECTION AGAINST CORE WRAP AROUND
338 ISZ DBWDCT /BUMP DOUBLE WORD COUNT
339 JMP BUFCDF /REITERATE
340 JMS I QCAS /CALL CASSETTE ROUTINE
341 CRC-. /TO CHECK CRC
342 TAD BUFFER /GET BUFFER SEGMENT ADDRESS
343 TAD K200 /ADD 200 TO GET TO NEXT SEGMENT
344 DCA BUFFER /REPLACE
345 TAD BLKNT /GET BLOCK COUNT
346 TAD K7700 /SUBTRAT 100
347 SZA /ARE WE DONE?
348 JMP RECLP /NO, REITERATE
349 ISZ CSA0 /POINT TO NORMAL GOOD RETURN
350 RETCIF, HLT /RETURN TO USER'S DATA AND INSTRUCTION FIELDS
351 JMP I CSA0 /RETURN
352 \f/ INTIALIZATION ROUTINE - ONCE ONLY CODE
353 / OVERLAID BY TEMPORARIES
354
355 T, 0 /ENTRY POINT TO INITIALIZATION
356 T2, TAD KRDF /REPLACE CALL BY RDF
357 FUN, DCA CS /SO THAT WE'LL NEVER SEE YOU HERE AGAIN
358 BUFFER, TAD T /CORRECT ADDRESS OF GPCH
359 DBWDCT, TAD KQX1 /BY ADDING IN CS+1
360 QGPCH, DCA . /STORE IT HERE
361 BLKNT, STL CLA RTL /CORRECT ADDRESS OF CAS IS 2 MORE
362 TAD QGPCH
363 QCAS, DCA . /THAN GPCH. STORE IT HERE.
364 BPTR, JMP CS /RETURN TO MAIN PROGRAM
365 KRDF, RDF
366 KQX1, GPCH-CS-1
367
368 SPCASE, TAD FUN
369 AND L4003 /ISOLATE R/W BIT + SPECIAL CODE
370 TAD UNIT
371 JMS I QCAS
372 SPCODE-.
373 JMP RETCIF-1 /LEAVE GRACEFULLY
374 K70, 70
375 KCDF, CDF 0
376 L4003, 4003
377 PAGE
378 \fGPCH, 0 /READ OR WRITE A BYTE
379 JMP AROUND /GO TO REAL LOCATION OF THIS SUBROUTINE
380 CAS, 0 /MUST BE AT GPCH+2; DO CASSETTE STUFF
381 DCA TEMP /SAVE ARGUMENT IN AC
382 CDF 0
383 TAD I CAS /GET UNRELOCATED RELATIVE LOCAL ENTRY POINT
384 TAD CAS /RELOCATE IT
385 ISZ CAS /POINT TO NORMAL RETURN LOCATION
386 DCA GPCH /SAVE ENTRY POINT IN TEMPORARY
387 JMP I GPCH /GO TO CORRECT ENTRY POINT
388
389 RW, TAD CAS
390 DCA RTRY /SAVE RETRY ADDRESS
391 TAD TEMP /GET ARGUMENT PASSED VIA AC
392 DCA FNUNIT /SAVE
393 CLL STA RTL /TAD (7775
394 DCA ERKNT /SET ERROR COUNT TO -3
395 ERETRY, TAD FNUNIT
396 SPA
397 TAD (20 /READ CODE IS 0; WRITE IS 20
398 KLSA /LOAD STATUS A
399 TAD FNUNIT /***KLSA CLEARS BIT 0
400 SMA CLA /READS HAVE TO BE INITIATED
401 JMS CWAIT /READ
402 JMP I RTRY /RETURN
403
404 AROUND, DCA TEMP
405 TAD FNUNIT
406 SMA CLA
407 JMP RDCHAR /READ
408 TAD TEMP /WRITE
409 JMS CWAIT
410 JMP I GPCH /RETURN
411
412 RDCHAR, JMS CWAIT
413 TAD TEMP /GET CHAR JUST READ
414 JMP I GPCH /RETURN WITH IT IN AC
415 \fCRC, TAD FNUNIT
416 TAD (60
417 KLSA /INITIATE READ/WRITE CRC
418 TAD FNUNIT /***KLSA CLEARS BIT 0
419 SMA CLA
420 JMS CWAIT /HAVE TO READ TWICE
421 JMS CWAIT /WRITE CRC WRITES BOTH
422 KCLR /WHY NOT?
423 JMP I CAS /RETURN
424
425 REWIND, TAD (10
426 JMS UTIL
427 TAD TEMP
428 SMA CLA
429 JMP I CAS /MERELY REWIND IF READING
430 JMP EOF
431 SKIPF, TAD (20
432 BACKBL, TAD (10
433 EOF, TAD (10
434 BACKF, TAD (30
435 JMS UTIL
436 JMP I CAS /RETURN
437
438 UTIL, 0
439 TAD TEMP
440 KLSA
441 TRYAGN, KGOA
442 KSBF /WAIT FOR READY
443 JMP .-1
444 KRSB
445 AND (10
446 SZA CLA
447 JMP TRYAGN /KEEP TRYING IF ERROR CAUSED BY DRIVE EMPTY
448 JMP I UTIL
449
450 TEMP, 0
451 ERKNT, 0
452 FNUNIT, 0
453 RTRY, 0
454
455 SPCODE, TAD TEMP
456 AND (3
457 TAD (JMP TABLE
458 DCA J
459 TAD TEMP
460 AND (4300
461 DCA TEMP
462 J, HLT
463 TABLE, JMP EOF /0 WRITE EOF
464 JMP REWIND /1 REWIND AND WRITE EOF IF BIT 0=1
465 JMP BACKBL /2 BACK BLOCK
466 TAD TEMP /3 SKIP/BACK FILE DEPENDING ON BIT 0
467 SMA CLA
468 JMP SKIPF /FORWARD FILE
469 JMP BACKF /BACK FILE
470 \fCWAIT, 0
471 KGOA /ASSERT CONTENTS OF STATUS A
472 DCA TEMP /SAVE ANYTHING READ
473 KSAF
474 JMP .-1 /WAIT FOR SOMETHING TO HAPPEN
475 KSEN /WAS IT AN ERROR?
476 JMP I CWAIT /NO, SO RETURN
477 ERR, DCA TEMP /YES ... ERROR
478 KRSB
479 AND (30
480 SNA
481 JMP .+3
482 AND (20
483 JMP I RTRY /END OF FILE IS SOFT ERROR
484 ISZ ERKNT /SHALL WE TRY AGAIN?
485 JMP .+3 /YES
486 STL CLA RAR /TAD (4000
487 JMP I RTRY /RETURN WITH NON-ZERO AC
488 TAD FNUNIT /RETRY
489 TAD (50 /BUT FIRST DO BACKSPACE BLOCK GAP
490 JMS UTIL
491 JMP ERETRY
492
493 L7600, 7600
494 $
495 \f