| 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 <CODE=0> |
| 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 | \f *0 |
| 86 | |
| 87 | -2 /THERE ARE TWO HANDLERS |
| 88 | |
| 89 | 2401 |
| 90 | 7001+CODE |
| 91 | 0323 |
| 92 | 0160+CODE+CODE /CSA0 |
| 93 | 270 /DEVICE CONTROL BLOCK (TYPE 27) |
| 94 | 4000+7 /ENTRY POINT FOR CSA0 |
| 95 | ZBLOCK 2 |
| 96 | |
| 97 | 2401 |
| 98 | 7001+CODE |
| 99 | 0323 |
| 100 | 0161+CODE+CODE /CSA1 |
| 101 | 270 |
| 102 | 4000+1 /ENTRY POINT FOR CSA1 |
| 103 | ZBLOCK 2 |
| 104 | \f *200 |
| 105 | |
| 106 | K3700, 3700 /MUST BE FIRST LOCATION ON PAGE |
| 107 | UNIT, |
| 108 | CSA1, VERSION /ENTRY POINT FOR CSA1 |
| 109 | CLA /PROTECT CODE AGAINST IGNORANT USERS |
| 110 | TAD CSA1 /PICK UP ARGUMENTS |
| 111 | DCA CSA0 /VIA CSA0 |
| 112 | STL IAC RAL /TAD (3 [8/I,L,E,F] |
| 113 | JMP .+3 /JOIN PROCESSING WITH UNIT 1 |
| 114 | CSA0, VERSION /ENTRY POINT FOR CSA0 |
| 115 | STL CLA RTL /TAD (2 |
| 116 | BSW / [8/E,F] |
| 117 | DCA UNIT /SAVE UNIT (0 IS 200, 1 IS 300) |
| 118 | CS, JMS T /INITIALIZATION; REPLACED BY RDF |
| 119 | TAD KCIF /FORM RETURN FIELD INSTRUCTION |
| 120 | DCA RETCIF /STORE IN RETURN CODE |
| 121 | TAD I CSA0 /GET FUNCTION CONTROL WORD |
| 122 | DCA FUN /SAVE IT |
| 123 | TAD FUN /GET IT BACK AGAIN |
| 124 | AND K70 /ISOLATE FIELD OF BUFFER |
| 125 | TAD KCDF /FORM CDF TO FIELD OF BUFFER |
| 126 | DCA BUFCDF /STORE IN APPROPRIATE SPOT |
| 127 | ISZ CSA0 /POINT TO ARGUMENT 2 |
| 128 | TAD I CSA0 /GET BUFFER ADDRESS |
| 129 | DCA BUFFER /SAVE IT |
| 130 | ISZ CSA0 /POINT TO ARGUMENT 3 |
| 131 | TAD I CSA0 /GET BLOCK NUMBER |
| 132 | ISZ CSA0 /POINT TO ERROR RETURN |
| 133 | KCIF, CIF CDF 0 /SEEK TEMPORARY SAFETY IN CURRENT DATA FIELD |
| 134 | SZA CLA |
| 135 | JMP NOT1ST /NOT BLOCK 0 |
| 136 | STL CLA RAR /TAD (4000 |
| 137 | AND FUN /ISOLATE READ/WRITE BIT |
| 138 | TAD UNIT /INSERT UNIT |
| 139 | JMS I QCAS /CALL CASSETTE ROUTINE |
| 140 | REWIND-. /TO PERFORM A REWIND/INITIALIZATION |
| 141 | NOT1ST, TAD FUN |
| 142 | K200, AND K3700 /ISOLATE NUMBER OF BLOCKS TO XFER |
| 143 | SNA |
| 144 | JMP SPCASE /0 BLOCKS MEANS SPECIAL THING (EOF) |
| 145 | RECLP, DCA BLKNT /SET COUNT OF NUMBER OF BLOCKS |
| 146 | STL CLA RAR /TAD (4000 |
| 147 | AND FUN /ISOLATE READ/WRITE BIT |
| 148 | TAD UNIT /INSERT UNIT |
| 149 | JMS I QCAS /CALL CASSETTE ROUTINE |
| 150 | RW-. /TO INITIATE READ OR WRITE |
| 151 | RETRY, SZA /NON-ZERO AC MEANS ERROR |
| 152 | JMP RETCIF /TOUGH LUCK BOOBIE - ERROR |
| 153 | TAD K7700 /GET READY TO XFER 100 DOUBLE WORDS |
| 154 | DCA DBWDCT /SET DOUBLE WORD COUNTER |
| 155 | TAD BUFFER /GET START OF BUFFER SEGMENT |
| 156 | DCA BPTR /SET 'BPTR' |
| 157 | BUFCDF, HLT /CHANGE TO DATA FIELD OF USER'S BUFFER |
| 158 | TAD FUN |
| 159 | K7700, SMA CLA /WHICH DIRECTION IS TRANSFER? |
| 160 | JMP READ /WANT TO READ |
| 161 | \fWRITE, TAD I BPTR /WANT TO WRITE, SO GET WORD FROM BUFFER |
| 162 | JMS I QGPCH /WRITE |
| 163 | TAD I BPTR /GET FIRST WORD AGAIN |
| 164 | AND P7400 /ISOLATE FIRST HALF OF BYTE 3 |
| 165 | DCA T /SAVE FOR FUTURE REFERENCE |
| 166 | ISZ BPTR /POINT TO NEXT LOCATION IN BUFFER |
| 167 | TAD I BPTR /GET SECOND WORD OF BUFFER PAIR |
| 168 | JMS I QGPCH /WRITE BYTE #2 |
| 169 | TAD I BPTR /RETRIEVE WORD 2 |
| 170 | AND P7400 /ISOLATE 2ND HALF OF BYTE #3 |
| 171 | CLL RTR /CREATE MYSTIC HIDDEN BYTE 3 |
| 172 | RTR |
| 173 | TAD T /GOOD THING I STILL HAVE THIS |
| 174 | CLL RTR |
| 175 | RTR |
| 176 | JMS I QGPCH /WRITE BYTE #3 |
| 177 | JMP COM |
| 178 | \fREAD, JMS I QGPCH /READ BYTE #1 OF TRIPLE |
| 179 | DCA I BPTR /STORE IN WORD 1 OF BUFFER PAIR |
| 180 | JMS I QGPCH /READ BYTE #2 OF TRIPLE |
| 181 | DCA T /SAVE IT FOR POSTERITY |
| 182 | JMS I QGPCH /READ BYTE #3 OF TRIPLE |
| 183 | RTL |
| 184 | RTL /MYSTIC ROTATES |
| 185 | DCA T2 |
| 186 | TAD T2 |
| 187 | AND P7400 /AND MYSTIC CONSTANTS |
| 188 | TAD I BPTR /FIX UP BUFFER WORD 1 OF PAIR |
| 189 | DCA I BPTR |
| 190 | TAD T2 |
| 191 | RTL |
| 192 | RTL /MORE ROTATION |
| 193 | AND P7400 /AND MORE |
| 194 | TAD T |
| 195 | ISZ BPTR /POINT TO SECOND WORD OF BUFFER PAIR |
| 196 | DCA I BPTR /STORE SECOND WORD |
| 197 | COM, ISZ BPTR /POINT TO BEGIN OF NEXT BUFFER PAIR |
| 198 | P7400, 7400 /PROTECTION AGAINST CORE WRAP AROUND |
| 199 | ISZ DBWDCT /BUMP DOUBLE WORD COUNT |
| 200 | JMP BUFCDF /REITERATE |
| 201 | JMS I QCAS /CALL CASSETTE ROUTINE |
| 202 | CRC-. /TO CHECK CRC |
| 203 | TAD BUFFER /GET BUFFER SEGMENT ADDRESS |
| 204 | TAD K200 /ADD 200 TO GET TO NEXT SEGMENT |
| 205 | DCA BUFFER /REPLACE |
| 206 | TAD BLKNT /GET BLOCK COUNT |
| 207 | TAD K7700 /SUBTRAT 100 |
| 208 | SZA /ARE WE DONE? |
| 209 | JMP RECLP /NO, REITERATE |
| 210 | ISZ CSA0 /POINT TO NORMAL GOOD RETURN |
| 211 | RETCIF, HLT /RETURN TO USER'S DATA AND INSTRUCTION FIELDS |
| 212 | JMP I CSA0 /RETURN |
| 213 | \f/ INTIALIZATION ROUTINE - ONCE ONLY CODE |
| 214 | / OVERLAID BY TEMPORARIES |
| 215 | |
| 216 | T, 0 /ENTRY POINT TO INITIALIZATION |
| 217 | T2, TAD KRDF /REPLACE CALL BY RDF |
| 218 | FUN, DCA CS /SO THAT WE'LL NEVER SEE YOU HERE AGAIN |
| 219 | BUFFER, TAD T /CORRECT ADDRESS OF GPCH |
| 220 | DBWDCT, TAD KQX1 /BY ADDING IN CS+1 |
| 221 | QGPCH, DCA . /STORE IT HERE |
| 222 | BLKNT, STL CLA RTL /CORRECT ADDRESS OF CAS IS 2 MORE |
| 223 | TAD QGPCH |
| 224 | QCAS, DCA . /THAN GPCH. STORE IT HERE. |
| 225 | BPTR, JMP CS /RETURN TO MAIN PROGRAM |
| 226 | KRDF, RDF |
| 227 | KQX1, GPCH-CS-1 |
| 228 | |
| 229 | SPCASE, TAD FUN |
| 230 | AND L4003 /ISOLATE R/W BIT + SPECIAL CODE |
| 231 | TAD UNIT |
| 232 | JMS I QCAS |
| 233 | SPCODE-. |
| 234 | JMP RETCIF-1 /LEAVE GRACEFULLY |
| 235 | K70, 70 |
| 236 | KCDF, CDF 0 |
| 237 | L4003, 4003 |
| 238 | PAGE |
| 239 | \fGPCH, 0 /READ OR WRITE A BYTE |
| 240 | JMP AROUND /GO TO REAL LOCATION OF THIS SUBROUTINE |
| 241 | CAS, 0 /MUST BE AT GPCH+2; DO CASSETTE STUFF |
| 242 | DCA TEMP /SAVE ARGUMENT IN AC |
| 243 | CDF 0 |
| 244 | TAD I CAS /GET UNRELOCATED RELATIVE LOCAL ENTRY POINT |
| 245 | TAD CAS /RELOCATE IT |
| 246 | ISZ CAS /POINT TO NORMAL RETURN LOCATION |
| 247 | DCA GPCH /SAVE ENTRY POINT IN TEMPORARY |
| 248 | JMP I GPCH /GO TO CORRECT ENTRY POINT |
| 249 | |
| 250 | RW, TAD CAS |
| 251 | DCA RTRY /SAVE RETRY ADDRESS |
| 252 | TAD TEMP /GET ARGUMENT PASSED VIA AC |
| 253 | DCA FNUNIT /SAVE |
| 254 | CLL STA RTL /TAD (7775 |
| 255 | DCA ERKNT /SET ERROR COUNT TO -3 |
| 256 | ERETRY, TAD FNUNIT |
| 257 | SPA |
| 258 | TAD (20 /READ CODE IS 0; WRITE IS 20 |
| 259 | KLSA /LOAD STATUS A |
| 260 | TAD FNUNIT /***KLSA CLEARS BIT 0 |
| 261 | SMA CLA /READS HAVE TO BE INITIATED |
| 262 | JMS CWAIT /READ |
| 263 | JMP I RTRY /RETURN |
| 264 | |
| 265 | AROUND, DCA TEMP |
| 266 | TAD FNUNIT |
| 267 | SMA CLA |
| 268 | JMP RDCHAR /READ |
| 269 | TAD TEMP /WRITE |
| 270 | JMS CWAIT |
| 271 | JMP I GPCH /RETURN |
| 272 | |
| 273 | RDCHAR, JMS CWAIT |
| 274 | TAD TEMP /GET CHAR JUST READ |
| 275 | JMP I GPCH /RETURN WITH IT IN AC |
| 276 | \fCRC, TAD FNUNIT |
| 277 | TAD (60 |
| 278 | KLSA /INITIATE READ/WRITE CRC |
| 279 | TAD FNUNIT /***KLSA CLEARS BIT 0 |
| 280 | SMA CLA |
| 281 | JMS CWAIT /HAVE TO READ TWICE |
| 282 | JMS CWAIT /WRITE CRC WRITES BOTH |
| 283 | KCLR /WHY NOT? |
| 284 | JMP I CAS /RETURN |
| 285 | |
| 286 | REWIND, TAD (10 |
| 287 | JMS UTIL |
| 288 | TAD TEMP |
| 289 | SMA CLA |
| 290 | JMP I CAS /MERELY REWIND IF READING |
| 291 | JMP EOF |
| 292 | SKIPF, TAD (20 |
| 293 | BACKBL, TAD (10 |
| 294 | EOF, TAD (10 |
| 295 | BACKF, TAD (30 |
| 296 | JMS UTIL |
| 297 | JMP I CAS /RETURN |
| 298 | |
| 299 | UTIL, 0 |
| 300 | TAD TEMP |
| 301 | KLSA |
| 302 | TRYAGN, KGOA |
| 303 | JMS CTCTST |
| 304 | KSBF /WAIT FOR READY |
| 305 | JMP .-2 |
| 306 | KRSB |
| 307 | AND (10 |
| 308 | SZA CLA |
| 309 | JMP TRYAGN /KEEP TRYING IF ERROR CAUSED BY DRIVE EMPTY |
| 310 | JMP I UTIL |
| 311 | |
| 312 | TEMP, 0 |
| 313 | ERKNT, 0 |
| 314 | FNUNIT, 0 |
| 315 | RTRY, 0 |
| 316 | |
| 317 | SPCODE, TAD TEMP |
| 318 | AND (3 |
| 319 | TAD (JMP TABLE |
| 320 | DCA J |
| 321 | TAD TEMP |
| 322 | AND (4300 |
| 323 | DCA TEMP |
| 324 | J, HLT |
| 325 | TABLE, JMP EOF /0 WRITE EOF |
| 326 | JMP REWIND /1 REWIND AND WRITE EOF IF BIT 0=1 |
| 327 | JMP BACKBL /2 BACK BLOCK |
| 328 | TAD TEMP /3 SKIP/BACK FILE DEPENDING ON BIT 0 |
| 329 | SMA CLA |
| 330 | JMP SKIPF /FORWARD FILE |
| 331 | JMP BACKF /BACK FILE |
| 332 | \fCWAIT, 0 |
| 333 | KGOA /ASSERT CONTENTS OF STATUS A |
| 334 | DCA TEMP /SAVE ANYTHING READ |
| 335 | JMS CTCTST |
| 336 | KSAF |
| 337 | JMP .-2 /WAIT FOR SOMETHING TO HAPPEN |
| 338 | KSEN /WAS IT AN ERROR? |
| 339 | JMP I CWAIT /NO, SO RETURN |
| 340 | ERR, DCA TEMP /YES ... ERROR |
| 341 | KRSB |
| 342 | AND (30 |
| 343 | SNA |
| 344 | JMP .+3 |
| 345 | AND (20 |
| 346 | JMP I RTRY /END OF FILE IS SOFT ERROR |
| 347 | ISZ ERKNT /SHALL WE TRY AGAIN? |
| 348 | JMP .+3 /YES |
| 349 | STL CLA RAR /TAD (4000 |
| 350 | JMP I RTRY /RETURN WITH NON-ZERO AC |
| 351 | TAD FNUNIT /RETRY |
| 352 | TAD (50 /BUT FIRST DO BACKSPACE BLOCK GAP |
| 353 | JMS UTIL |
| 354 | JMP ERETRY |
| 355 | |
| 356 | CTCTST, 0 /TEST FOR CONTROL/C |
| 357 | L7600, 7600 |
| 358 | TAD L7600 |
| 359 | KRS |
| 360 | TAD (-7603 |
| 361 | SNA CLA |
| 362 | KSF |
| 363 | JMP I CTCTST |
| 364 | CIF CDF 0 |
| 365 | JMP I L7600 /RETURN TO OS/8 |
| 366 | $ |
| 367 | \f |