1 /2 OS/8 TERTIARY CASSETTE BOOTSTRAP V5
11 /COPYRIGHT (C) 1973,1974 BY DIGITAL EQUIPMENT CORPORATION
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.
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.
32 /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE
33 /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY
46 SUBVER= 01 /SUBVERSION A = 01, ETC
54 CIF CDF 0 /THE SECONDARY BOOTSTRAP BRANCHES HERE OF ALL PLACES
56 C3STRT /WE WANT TO BE HERE
62 /THE PRIMARY (KEY-IN) BOOTSTRAP CONSISTS OF 32 WORDS
63 /AND IS AWFUL PRIMITIVE. IT BARELY MANAGES TO READ IN THE
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.
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.
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.
101 100 /SKIP HEADER BY READING PAST IT
106 HLT /GOOD READ IS BAD
110 JMP .-2 /IGNORE BLANKS
112 SZA CLA /IS IT LEADER?
115 TAD M200 /STILL LEADER?
118 NEWWD, SMA /IS IT LESS THAN 200?
119 JMP FIELDW /NO, IT'S A FIELD SETTING
120 TAD L200 /RESTORE CHAR
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?
132 XFIELD, CDF 0 /ASSUMES BUILD STARTS IN FIELD 0
139 TAD WD2 /MAKE UP CHECKSUM
145 \fFIELDW, AND L70 /EXTRACT FIELD SETTING
157 JMP I L200 /START BUILD
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
182 L377, 377 /DUMMY BLOCK NO.
185 DCA CHCNT /NEW CHAR COUNT
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
227 BSW=7002 /BYTE SWAP [8/E,F ONLY]
239 / 3 SKIPFILE/BACKFILE
242 / 4-7 UNUSED (TAKES LOW ORDER 2 BITS ONLY CURRENTLY)
244 VERSION="B&77 /MODIFIED
245 \fK3700, 3700 /MUST BE FIRST LOCATION ON PAGE
247 CSA1, VERSION /ENTRY POINT FOR CSA1
248 CLA /PROTECT CODE AGAINST IGNORANT USERS
249 TAD CSA1 /PICK UP ARGUMENTS
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
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
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
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
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
281 K200, AND K3700 /ISOLATE NUMBER OF BLOCKS TO XFER
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
296 BUFCDF, HLT /CHANGE TO DATA FIELD OF USER'S BUFFER
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
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
312 TAD T /GOOD THING I STILL HAVE THIS
315 JMS I QGPCH /WRITE BYTE #3
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
326 AND P7400 /AND MYSTIC CONSTANTS
327 TAD I BPTR /FIX UP BUFFER WORD 1 OF PAIR
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
342 TAD BUFFER /GET BUFFER SEGMENT ADDRESS
343 TAD K200 /ADD 200 TO GET TO NEXT SEGMENT
345 TAD BLKNT /GET BLOCK COUNT
346 TAD K7700 /SUBTRAT 100
348 JMP RECLP /NO, REITERATE
349 ISZ CSA0 /POINT TO NORMAL GOOD RETURN
350 RETCIF, HLT /RETURN TO USER'S DATA AND INSTRUCTION FIELDS
352 \f/ INTIALIZATION ROUTINE - ONCE ONLY CODE
353 / OVERLAID BY TEMPORARIES
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
363 QCAS, DCA . /THAN GPCH. STORE IT HERE.
364 BPTR, JMP CS /RETURN TO MAIN PROGRAM
369 AND L4003 /ISOLATE R/W BIT + SPECIAL CODE
373 JMP RETCIF-1 /LEAVE GRACEFULLY
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
383 TAD I CAS /GET UNRELOCATED RELATIVE LOCAL ENTRY POINT
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
390 DCA RTRY /SAVE RETRY ADDRESS
391 TAD TEMP /GET ARGUMENT PASSED VIA AC
393 CLL STA RTL /TAD (7775
394 DCA ERKNT /SET ERROR COUNT TO -3
397 TAD (20 /READ CODE IS 0; WRITE IS 20
399 TAD FNUNIT /***KLSA CLEARS BIT 0
400 SMA CLA /READS HAVE TO BE INITIATED
413 TAD TEMP /GET CHAR JUST READ
414 JMP I GPCH /RETURN WITH IT IN AC
417 KLSA /INITIATE READ/WRITE CRC
418 TAD FNUNIT /***KLSA CLEARS BIT 0
420 JMS CWAIT /HAVE TO READ TWICE
421 JMS CWAIT /WRITE CRC WRITES BOTH
429 JMP I CAS /MERELY REWIND IF READING
447 JMP TRYAGN /KEEP TRYING IF ERROR CAUSED BY DRIVE EMPTY
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
468 JMP SKIPF /FORWARD FILE
471 KGOA /ASSERT CONTENTS OF STATUS A
472 DCA TEMP /SAVE ANYTHING READ
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
483 JMP I RTRY /END OF FILE IS SOFT ERROR
484 ISZ ERKNT /SHALL WE TRY AGAIN?
486 STL CLA RAR /TAD (4000
487 JMP I RTRY /RETURN WITH NON-ZERO AC
489 TAD (50 /BUT FIRST DO BACKSPACE BLOCK GAP