| 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 |