1 /4 OS/8 CASSETTE HANDLER 2 / 3 / 4 / 5 / 6 / 7 / 8 / 9 / 10 / 11 /COPYRIGHT (C) 1974,1975 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 46 / DEC-S8-UCASA-A-LA 47 48 / COPYRIGHT 1972 49 50 / DIGITAL EQUIPMENT CORPORATION 51 52 / MAYNARD MASSACHUSETTS 01754 53 54 / MOUTH/DORP 55 56 IFNDEF CODE 57 58 KCLR=CODE^10+6700 /CLEAR ALL 59 KSDR=CODE^10+6701 /SKIP ON DATA FLAG 60 KSEN=CODE^10+6702 /SKIP ON ERROR 61 KSBF=CODE^10+6703 /SKIP ON READY FLAG 62 KLSA=CODE^10+6704 /LOAD STATUS A 63 KSAF=CODE^10+6705 /SKIP ON ANY FLAG OR ERROR 64 KGOA=CODE^10+6706 /ASSERT CONTENTS OF STATUS A AND XFER 65 KRSB=CODE^10+6707 /READ STATUS B 66 67 BSW=7002 /BYTE SWAP [8/E,F ONLY] 68 69 /REWIND=10 70 /BACKFIL=30 71 /WRGAP=40 72 /BACKBLOCK=50 73 /SKPFIL=70 74 75 /SPECIAL CODES 76 77 / 0 WRITE EOF 78 / 1 REWIND 79 / 2 BACKBLOCK 80 / 3 SKIPFILE/BACKFILE 81 82 / 4-7 UNUSED (TAKES LOW ORDER 2 BITS ONLY CURRENTLY) 83 84 VERSION="C&77 85 *0 86 87 000000 7776 -2 /THERE ARE TWO HANDLERS 88 89 000001 2401 2401 90 000002 7001 7001+CODE 91 000003 0323 0323 92 000004 0160 0160+CODE+CODE /CSA0 93 000005 0270 270 /DEVICE CONTROL BLOCK (TYPE 27) 94 000006 4007 4000+7 /ENTRY POINT FOR CSA0 95 000007 0000 ZBLOCK 2 000010 0000 96 97 000011 2401 2401 98 000012 7001 7001+CODE 99 000013 0323 0323 100 000014 0161 0161+CODE+CODE /CSA1 101 000015 0270 270 102 000016 4001 4000+1 /ENTRY POINT FOR CSA1 103 000017 0000 ZBLOCK 2 000020 0000 104 *200 105 106 000200 3700 K3700, 3700 /MUST BE FIRST LOCATION ON PAGE 107 UNIT, 108 000201 0003 CSA1, VERSION /ENTRY POINT FOR CSA1 109 000202 7200 CLA /PROTECT CODE AGAINST IGNORANT USERS 110 000203 1201 TAD CSA1 /PICK UP ARGUMENTS 111 000204 3207 DCA CSA0 /VIA CSA0 112 000205 7125 STL IAC RAL /TAD (3 [8/I,L,E,F] 113 000206 5211 JMP .+3 /JOIN PROCESSING WITH UNIT 1 114 000207 0003 CSA0, VERSION /ENTRY POINT FOR CSA0 115 000210 7326 STL CLA RTL /TAD (2 116 000211 7002 BSW / [8/E,F] 117 000212 3201 DCA UNIT /SAVE UNIT (0 IS 200, 1 IS 300) 118 000213 4352 CS, JMS T /INITIALIZATION; REPLACED BY RDF 119 000214 1232 TAD KCIF /FORM RETURN FIELD INSTRUCTION 120 000215 3350 DCA RETCIF /STORE IN RETURN CODE 121 000216 1607 TAD I CSA0 /GET FUNCTION CONTROL WORD 122 000217 3354 DCA FUN /SAVE IT 123 000220 1354 TAD FUN /GET IT BACK AGAIN 124 000221 0374 AND K70 /ISOLATE FIELD OF BUFFER 125 000222 1375 TAD KCDF /FORM CDF TO FIELD OF BUFFER 126 000223 3262 DCA BUFCDF /STORE IN APPROPRIATE SPOT 127 000224 2207 ISZ CSA0 /POINT TO ARGUMENT 2 128 000225 1607 TAD I CSA0 /GET BUFFER ADDRESS 129 000226 3355 DCA BUFFER /SAVE IT 130 000227 2207 ISZ CSA0 /POINT TO ARGUMENT 3 131 000230 1607 TAD I CSA0 /GET BLOCK NUMBER 132 000231 2207 ISZ CSA0 /POINT TO ERROR RETURN 133 000232 6203 KCIF, CIF CDF 0 /SEEK TEMPORARY SAFETY IN CURRENT DATA FIELD 134 000233 7640 SZA CLA 135 000234 5242 JMP NOT1ST /NOT BLOCK 0 136 000235 7330 STL CLA RAR /TAD (4000 137 000236 0354 AND FUN /ISOLATE READ/WRITE BIT 138 000237 1201 TAD UNIT /INSERT UNIT 139 000240 4762 JMS I QCAS /CALL CASSETTE ROUTINE 140 000241 0212 REWIND-. /TO PERFORM A REWIND/INITIALIZATION 141 000242 1354 NOT1ST, TAD FUN 142 000243 0200 K200, AND K3700 /ISOLATE NUMBER OF BLOCKS TO XFER 143 000244 7450 SNA 144 000245 5366 JMP SPCASE /0 BLOCKS MEANS SPECIAL THING (EOF) 145 000246 3360 RECLP, DCA BLKNT /SET COUNT OF NUMBER OF BLOCKS 146 000247 7330 STL CLA RAR /TAD (4000 147 000250 0354 AND FUN /ISOLATE READ/WRITE BIT 148 000251 1201 TAD UNIT /INSERT UNIT 149 000252 4762 JMS I QCAS /CALL CASSETTE ROUTINE 150 000253 0137 RW-. /TO INITIATE READ OR WRITE 151 000254 7440 RETRY, SZA /NON-ZERO AC MEANS ERROR 152 000255 5350 JMP RETCIF /TOUGH LUCK BOOBIE - ERROR 153 000256 1264 TAD K7700 /GET READY TO XFER 100 DOUBLE WORDS 154 000257 3356 DCA DBWDCT /SET DOUBLE WORD COUNTER 155 000260 1355 TAD BUFFER /GET START OF BUFFER SEGMENT 156 000261 3363 DCA BPTR /SET 'BPTR' 157 000262 7402 BUFCDF, HLT /CHANGE TO DATA FIELD OF USER'S BUFFER 158 000263 1354 TAD FUN 159 000264 7700 K7700, SMA CLA /WHICH DIRECTION IS TRANSFER? 160 000265 5307 JMP READ /WANT TO READ 161 000266 1763 WRITE, TAD I BPTR /WANT TO WRITE, SO GET WORD FROM BUFFER 162 000267 4757 JMS I QGPCH /WRITE 163 000270 1763 TAD I BPTR /GET FIRST WORD AGAIN 164 000271 0333 AND P7400 /ISOLATE FIRST HALF OF BYTE 3 165 000272 3352 DCA T /SAVE FOR FUTURE REFERENCE 166 000273 2363 ISZ BPTR /POINT TO NEXT LOCATION IN BUFFER 167 000274 1763 TAD I BPTR /GET SECOND WORD OF BUFFER PAIR 168 000275 4757 JMS I QGPCH /WRITE BYTE #2 169 000276 1763 TAD I BPTR /RETRIEVE WORD 2 170 000277 0333 AND P7400 /ISOLATE 2ND HALF OF BYTE #3 171 000300 7112 CLL RTR /CREATE MYSTIC HIDDEN BYTE 3 172 000301 7012 RTR 173 000302 1352 TAD T /GOOD THING I STILL HAVE THIS 174 000303 7112 CLL RTR 175 000304 7012 RTR 176 000305 4757 JMS I QGPCH /WRITE BYTE #3 177 000306 5332 JMP COM 178 000307 4757 READ, JMS I QGPCH /READ BYTE #1 OF TRIPLE 179 000310 3763 DCA I BPTR /STORE IN WORD 1 OF BUFFER PAIR 180 000311 4757 JMS I QGPCH /READ BYTE #2 OF TRIPLE 181 000312 3352 DCA T /SAVE IT FOR POSTERITY 182 000313 4757 JMS I QGPCH /READ BYTE #3 OF TRIPLE 183 000314 7006 RTL 184 000315 7006 RTL /MYSTIC ROTATES 185 000316 3353 DCA T2 186 000317 1353 TAD T2 187 000320 0333 AND P7400 /AND MYSTIC CONSTANTS 188 000321 1763 TAD I BPTR /FIX UP BUFFER WORD 1 OF PAIR 189 000322 3763 DCA I BPTR 190 000323 1353 TAD T2 191 000324 7006 RTL 192 000325 7006 RTL /MORE ROTATION 193 000326 0333 AND P7400 /AND MORE 194 000327 1352 TAD T 195 000330 2363 ISZ BPTR /POINT TO SECOND WORD OF BUFFER PAIR 196 000331 3763 DCA I BPTR /STORE SECOND WORD 197 000332 2363 COM, ISZ BPTR /POINT TO BEGIN OF NEXT BUFFER PAIR 198 000333 7400 P7400, 7400 /PROTECTION AGAINST CORE WRAP AROUND 199 000334 2356 ISZ DBWDCT /BUMP DOUBLE WORD COUNT 200 000335 5262 JMP BUFCDF /REITERATE 201 000336 4762 JMS I QCAS /CALL CASSETTE ROUTINE 202 000337 0103 CRC-. /TO CHECK CRC 203 000340 1355 TAD BUFFER /GET BUFFER SEGMENT ADDRESS 204 000341 1243 TAD K200 /ADD 200 TO GET TO NEXT SEGMENT 205 000342 3355 DCA BUFFER /REPLACE 206 000343 1360 TAD BLKNT /GET BLOCK COUNT 207 000344 1264 TAD K7700 /SUBTRAT 100 208 000345 7440 SZA /ARE WE DONE? 209 000346 5246 JMP RECLP /NO, REITERATE 210 000347 2207 ISZ CSA0 /POINT TO NORMAL GOOD RETURN 211 000350 7402 RETCIF, HLT /RETURN TO USER'S DATA AND INSTRUCTION FIELDS 212 000351 5607 JMP I CSA0 /RETURN 213 / INTIALIZATION ROUTINE - ONCE ONLY CODE 214 / OVERLAID BY TEMPORARIES 215 216 000352 0000 T, 0 /ENTRY POINT TO INITIALIZATION 217 000353 1364 T2, TAD KRDF /REPLACE CALL BY RDF 218 000354 3213 FUN, DCA CS /SO THAT WE'LL NEVER SEE YOU HERE AGAIN 219 000355 1352 BUFFER, TAD T /CORRECT ADDRESS OF GPCH 220 000356 1365 DBWDCT, TAD KQX1 /BY ADDING IN CS+1 221 000357 3357 QGPCH, DCA . /STORE IT HERE 222 000360 7326 BLKNT, STL CLA RTL /CORRECT ADDRESS OF CAS IS 2 MORE 223 000361 1357 TAD QGPCH 224 000362 3362 QCAS, DCA . /THAN GPCH. STORE IT HERE. 225 000363 5213 BPTR, JMP CS /RETURN TO MAIN PROGRAM 226 000364 6214 KRDF, RDF 227 000365 0164 KQX1, GPCH-CS-1 228 229 000366 1354 SPCASE, TAD FUN 230 000367 0376 AND L4003 /ISOLATE R/W BIT + SPECIAL CODE 231 000370 1201 TAD UNIT 232 000371 4762 JMS I QCAS 233 000372 0115 SPCODE-. 234 000373 5347 JMP RETCIF-1 /LEAVE GRACEFULLY 235 000374 0070 K70, 70 236 000375 6201 KCDF, CDF 0 237 000376 4003 L4003, 4003 238 PAGE 239 000400 0000 GPCH, 0 /READ OR WRITE A BYTE 240 000401 5230 JMP AROUND /GO TO REAL LOCATION OF THIS SUBROUTINE 241 000402 0000 CAS, 0 /MUST BE AT GPCH+2; DO CASSETTE STUFF 242 000403 3303 DCA TEMP /SAVE ARGUMENT IN AC 243 000404 6201 CDF 0 244 000405 1602 TAD I CAS /GET UNRELOCATED RELATIVE LOCAL ENTRY POINT 245 000406 1202 TAD CAS /RELOCATE IT 246 000407 2202 ISZ CAS /POINT TO NORMAL RETURN LOCATION 247 000410 3200 DCA GPCH /SAVE ENTRY POINT IN TEMPORARY 248 000411 5600 JMP I GPCH /GO TO CORRECT ENTRY POINT 249 250 000412 1202 RW, TAD CAS 251 000413 3306 DCA RTRY /SAVE RETRY ADDRESS 252 000414 1303 TAD TEMP /GET ARGUMENT PASSED VIA AC 253 000415 3305 DCA FNUNIT /SAVE 254 000416 7346 CLL STA RTL /TAD (7775 255 000417 3304 DCA ERKNT /SET ERROR COUNT TO -3 256 000420 1305 ERETRY, TAD FNUNIT 257 000421 7510 SPA 258 000422 1377 TAD (20 /READ CODE IS 0; WRITE IS 20 259 000423 6704 KLSA /LOAD STATUS A 260 000424 1305 TAD FNUNIT /***KLSA CLEARS BIT 0 261 000425 7700 SMA CLA /READS HAVE TO BE INITIATED 262 000426 4326 JMS CWAIT /READ 263 000427 5706 JMP I RTRY /RETURN 264 265 000430 3303 AROUND, DCA TEMP 266 000431 1305 TAD FNUNIT 267 000432 7700 SMA CLA 268 000433 5237 JMP RDCHAR /READ 269 000434 1303 TAD TEMP /WRITE 270 000435 4326 JMS CWAIT 271 000436 5600 JMP I GPCH /RETURN 272 273 000437 4326 RDCHAR, JMS CWAIT 274 000440 1303 TAD TEMP /GET CHAR JUST READ 275 000441 5600 JMP I GPCH /RETURN WITH IT IN AC 276 000442 1305 CRC, TAD FNUNIT 277 000443 1376 TAD (60 278 000444 6704 KLSA /INITIATE READ/WRITE CRC 279 000445 1305 TAD FNUNIT /***KLSA CLEARS BIT 0 280 000446 7700 SMA CLA 281 000447 4326 JMS CWAIT /HAVE TO READ TWICE 282 000450 4326 JMS CWAIT /WRITE CRC WRITES BOTH 283 000451 6700 KCLR /WHY NOT? 284 000452 5602 JMP I CAS /RETURN 285 286 000453 1375 REWIND, TAD (10 287 000454 4267 JMS UTIL 288 000455 1303 TAD TEMP 289 000456 7700 SMA CLA 290 000457 5602 JMP I CAS /MERELY REWIND IF READING 291 000460 5263 JMP EOF 292 000461 1377 SKIPF, TAD (20 293 000462 1375 BACKBL, TAD (10 294 000463 1375 EOF, TAD (10 295 000464 1374 BACKF, TAD (30 296 000465 4267 JMS UTIL 297 000466 5602 JMP I CAS /RETURN 298 299 000467 0000 UTIL, 0 300 000470 1303 TAD TEMP 301 000471 6704 KLSA 302 000472 6706 TRYAGN, KGOA 303 000473 4355 JMS CTCTST 304 000474 6703 KSBF /WAIT FOR READY 305 000475 5273 JMP .-2 306 000476 6707 KRSB 307 000477 0375 AND (10 308 000500 7640 SZA CLA 309 000501 5272 JMP TRYAGN /KEEP TRYING IF ERROR CAUSED BY DRIVE EMPTY 310 000502 5667 JMP I UTIL 311 312 000503 0000 TEMP, 0 313 000504 0000 ERKNT, 0 314 000505 0000 FNUNIT, 0 315 000506 0000 RTRY, 0 316 317 000507 1303 SPCODE, TAD TEMP 318 000510 0373 AND (3 319 000511 1372 TAD (JMP TABLE 320 000512 3316 DCA J 321 000513 1303 TAD TEMP 322 000514 0371 AND (4300 323 000515 3303 DCA TEMP 324 000516 7402 J, HLT 325 000517 5263 TABLE, JMP EOF /0 WRITE EOF 326 000520 5253 JMP REWIND /1 REWIND AND WRITE EOF IF BIT 0=1 327 000521 5262 JMP BACKBL /2 BACK BLOCK 328 000522 1303 TAD TEMP /3 SKIP/BACK FILE DEPENDING ON BIT 0 329 000523 7700 SMA CLA 330 000524 5261 JMP SKIPF /FORWARD FILE 331 000525 5264 JMP BACKF /BACK FILE 332 000526 0000 CWAIT, 0 333 000527 6706 KGOA /ASSERT CONTENTS OF STATUS A 334 000530 3303 DCA TEMP /SAVE ANYTHING READ 335 000531 4355 JMS CTCTST 336 000532 6705 KSAF 337 000533 5331 JMP .-2 /WAIT FOR SOMETHING TO HAPPEN 338 000534 6702 KSEN /WAS IT AN ERROR? 339 000535 5726 JMP I CWAIT /NO, SO RETURN 340 000536 3303 ERR, DCA TEMP /YES ... ERROR 341 000537 6707 KRSB 342 000540 0374 AND (30 343 000541 7450 SNA 344 000542 5345 JMP .+3 345 000543 0377 AND (20 346 000544 5706 JMP I RTRY /END OF FILE IS SOFT ERROR 347 000545 2304 ISZ ERKNT /SHALL WE TRY AGAIN? 348 000546 5351 JMP .+3 /YES 349 000547 7330 STL CLA RAR /TAD (4000 350 000550 5706 JMP I RTRY /RETURN WITH NON-ZERO AC 351 000551 1305 TAD FNUNIT /RETRY 352 000552 1370 TAD (50 /BUT FIRST DO BACKSPACE BLOCK GAP 353 000553 4267 JMS UTIL 354 000554 5220 JMP ERETRY 355 356 000555 0000 CTCTST, 0 /TEST FOR CONTROL/C 357 000556 7600 L7600, 7600 358 000557 1356 TAD L7600 359 000560 6034 KRS 360 000561 1367 TAD (-7603 361 000562 7650 SNA CLA 362 000563 6031 KSF 363 000564 5755 JMP I CTCTST 364 000565 6203 CIF CDF 0 365 000566 5756 JMP I L7600 /RETURN TO OS/8 366 000567 0175 $ 000570 0050 000571 4300 000572 5317 000573 0003 000574 0030 000575 0010 000576 0060 000577 0020 AROUND 0430 BACKBL 0462 BACKF 0464 BLKNT 0360 BPTR 0363 BSW 7002 BUFCDF 0262 BUFFER 0355 CAS 0402 CODE 0000 COM 0332 CRC 0442 CS 0213 CSA0 0207 CSA1 0201 CTCTST 0555 CWAIT 0526 DBWDCT 0356 EOF 0463 ERETRY 0420 ERKNT 0504 ERR 0536 unreferenced FNUNIT 0505 FUN 0354 GPCH 0400 J 0516 K200 0243 K3700 0200 K70 0374 K7700 0264 KCDF 0375 KCIF 0232 KCLR 6700 KGOA 6706 KLSA 6704 KQX1 0365 KRDF 0364 KRSB 6707 KSAF 6705 KSBF 6703 KSDR 6701 unreferenced KSEN 6702 L4003 0376 L7600 0556 NOT1ST 0242 P7400 0333 QCAS 0362 QGPCH 0357 RDCHAR 0437 READ 0307 RECLP 0246 RETCIF 0350 RETRY 0254 unreferenced REWIND 0453 RTRY 0506 RW 0412 SKIPF 0461 SPCASE 0366 SPCODE 0507 T 0352 T2 0353 TABLE 0517 TEMP 0503 TRYAGN 0472 UNIT 0201 UTIL 0467 VERSIO 0003 WRITE 0266 unreferenced