| 1 | /16 TM8-E MAGTAPE HANDLER FOR OS/8 |
| 2 | |
| 3 | |
| 4 | |
| 5 | |
| 6 | |
| 7 | |
| 8 | |
| 9 | |
| 10 | |
| 11 | |
| 12 | / |
| 13 | / |
| 14 | /COPYRIGHT (C) 1973,1974,1975 BY DIGITAL EQUIPMENT CORPORATION |
| 15 | / |
| 16 | / |
| 17 | / |
| 18 | / |
| 19 | / |
| 20 | / |
| 21 | / |
| 22 | / |
| 23 | / |
| 24 | / |
| 25 | /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE |
| 26 | /AND SHOULD NOT BE CONTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT |
| 27 | /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY |
| 28 | /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. |
| 29 | / |
| 30 | /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER |
| 31 | /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED |
| 32 | /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH |
| 33 | /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. |
| 34 | / |
| 35 | /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE |
| 36 | /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY |
| 37 | /DIGITAL. |
| 38 | / |
| 39 | / |
| 40 | / |
| 41 | / |
| 42 | / |
| 43 | \f LWCR=6701 /LOAD WORD COUNT REGISTER AND CLEAR AC |
| 44 | LCAR=6703 /LOAD CURRENT ADDRESS REGISTER AND CLEAR AC |
| 45 | LCMR=6705 /LOAD COMMAND REGISTER AND CLEAR AC |
| 46 | LFGR=6706 /LOAD FUNCTION REGISTER AND CLEAR AC |
| 47 | CLT=6712 /CLEAR TRANSPORT |
| 48 | RMSR=6714 /CLEAR AC AND READ MAIN STATUS REGISTER |
| 49 | RFSR=6716 /CLEAR AC AND READ STUFF |
| 50 | SKEF=6721 /SKIP IF ERROR FLAG IS SET |
| 51 | SKJD=6723 /SKIP IF THE JOB IS DONE (MTTF IS SET) |
| 52 | SKTR=6724 /SKIP IF TAPE UNIT READY (TUR TRUE) |
| 53 | |
| 54 | MTAVERSION="F&77 |
| 55 | |
| 56 | /SPECIAL CODES USED WHEN PAGE COUNT=0 (CODES IN BITS 9-11 OF FN WORD) |
| 57 | |
| 58 | /0 (CLOSE) WRITE 2 EOF'S |
| 59 | /1 REWIND |
| 60 | /2 SPACE FORWARD/REVERSE RECORDS |
| 61 | / IF BIT 0 OF THE FUNCTION WORD IS A 0, |
| 62 | / THIS CODE ADVANCES RECORDS. |
| 63 | / THE NEGATIVE OF THE NUMBER OF RECODRDS IS SPECIFIED IN ARG 3 |
| 64 | / IF BIT 0 OF THE FUNCTION WORD IS A 1, |
| 65 | / THIS CODE BACKSPACES RECORDS. |
| 66 | / THE NEGATIVE OF THE NUMBER OF RECORDS IS SPECIFIED AS ARG 3. |
| 67 | / UNDER NO CIRCUMSTANCES DOES THIS COMMAND CONTINUE PAST A FILE MARK. |
| 68 | /3 SPACE FORWARD/REVERSE FILES |
| 69 | / IF BIT 0 OF THE FUNCTION WORD IS A 0 |
| 70 | / THEN THIS FUNCTION ADVANCE FILE MARKS |
| 71 | / THE NEGATIVE OF THE NUMBER OF FILE MARKS IS SPECIFIED BY ARG3 |
| 72 | / THE TAPE IS LEFT POSITIONED AFTER THIS FILE MARK |
| 73 | / BUT UNDER NO CIRCUMSTANCES DOES THE TAPE ADVANCE PAST |
| 74 | / THE SECOND MARK OF TWO CONSECUTIVE FILE MARKS |
| 75 | / IF BIT 0 OF THE FUNCTION WORD IS A 1, |
| 76 | / THIS CODE BACKSPACES PAST FILE MARKS. |
| 77 | / THE NEGATIVE OF THE NUMBER OF FILE MARKS IS SPECIFIED BY ARG 3. |
| 78 | / THE TAPE IS LEFT POSITIONED BEFORE THE LAST FILE MARK, |
| 79 | / SO THE USER PROBABLY WANTS TO DO A FORWARD RECORD NEXT. |
| 80 | /4 REWIND AND PUT OFF-LINE |
| 81 | /5 WRITE EOF |
| 82 | /6 PERFORM OPERATION WITH SPECIFIED BLOCKSIZE |
| 83 | / THE NEGATIVE OF THE DESIRED BLOCKSIZE IS SPECIFIED AS ARG 3. |
| 84 | /7 CURRENTLY UNUSED |
| 85 | |
| 86 | /NOTE: SKIP TO EOD CAN BE PERFORMED BY SKIPPING 4096 FILES |
| 87 | |
| 88 | /MAINTENANCE RELEASE CHANGES: |
| 89 | |
| 90 | /1. MAJOR CODE OVERHAUL |
| 91 | /2. SKIP RECORDS RETURNS NON-FATAL ERROR IF IT DETECTS FILE MARK |
| 92 | /3. SKIP FORWARD FILES NEVER EVER PASSES EOD |
| 93 | /4. SKIP FORWARD FILES RETURNS ERROR IF IT STARTS IMMEDIATELY |
| 94 | / BEFORE A FILE MARK (UNLESS IT'S AT BOT) |
| 95 | / IT THEN REMAINS BEFORE THE FILE MARK |
| 96 | /5. FIXED TIMING PROBLEM FOR TS03 |
| 97 | /6. CHANGED ORDER OF TEST FOR DATA DURING SKIP FORWARD FILES |
| 98 | /7. MADE UNUSED FUNCTION CODE 7 ACT SAME AS 0 |
| 99 | \f |
| 100 | /BUILD DESCRIPTOR BLOCK |
| 101 | |
| 102 | *0 |
| 103 | |
| 104 | -10 /8 ENTRY POINTS |
| 105 | |
| 106 | DEVICE TM8E;DEVICE MTA0;200;MTA0&177+4000;ZBLOCK 2 |
| 107 | DEVICE TM8E;DEVICE MTA1;200;MTA1&177+4000;ZBLOCK 2 |
| 108 | DEVICE TM8E;DEVICE MTA2;200;MTA2&177+4000;ZBLOCK 2 |
| 109 | DEVICE TM8E;DEVICE MTA3;200;MTA3&177+4000;ZBLOCK 2 |
| 110 | DEVICE TM8E;DEVICE MTA4;200;MTA4&177+4000;ZBLOCK 2 |
| 111 | DEVICE TM8E;DEVICE MTA5;200;MTA5&177+4000;ZBLOCK 2 |
| 112 | DEVICE TM8E;DEVICE MTA6;200;MTA6&177+4000;ZBLOCK 2 |
| 113 | DEVICE TM8E;DEVICE MTA7;200;MTA7&177+4000;ZBLOCK 2 |
| 114 | \f *200 |
| 115 | |
| 116 | PARITY, 402 /CHANGE TO 2 TO HAVE EVEN PARITY |
| 117 | BLOCK0, 0 /SET TO 1 TO INHIBIT REWIND ON BLOCK 0 |
| 118 | MTATAD, TAD MTA0 /USED TO MAKE HANDLER SERIALLY REUSABLE |
| 119 | /CONTENTS MUST BE 13XX [V3C] |
| 120 | MTISZ, ISZ MTANO /DITTO |
| 121 | STOP, ISZ MTHX |
| 122 | MTEXIT, HLT /CIF CDF TO USER'S FIELD |
| 123 | JMP I MTHX |
| 124 | |
| 125 | PNEXT, 0 |
| 126 | /V3C CLA |
| 127 | TAD MTANO /GET UNIT # |
| 128 | CIA |
| 129 | TAD MTATAD /FIND WHICH ENTRY POINT |
| 130 | DCA MTFUN /MAKE A 'TAD MTAN' AND EXECUTE IT |
| 131 | MTFUN, HLT |
| 132 | DCA MTHX /COLLECT ARGUMENTS VIA 'MTHX' |
| 133 | CLA STL RTR /2000 |
| 134 | TAD MTFUN /MAKE A 'DCA MTAN' AND EXECUTE IT |
| 135 | DCA NBLOK |
| 136 | TAD MTISZ /RESTORE DESTROYED ISZ |
| 137 | NBLOK, HLT |
| 138 | TAD I MTHX /GET FUNCTION WORD |
| 139 | DCA MTFUN /SAVE IT IN 'MTFUN' |
| 140 | ISZ MTHX /POINT TO BUFFER ADDRESS |
| 141 | STA /GET ONE LESS THAN |
| 142 | TAD I MTHX /BUFFER ADDRESS |
| 143 | DCA NBUFF /AND STORE AWAY |
| 144 | ISZ MTHX /POINT TO BLOCK NUMBER |
| 145 | TAD I MTHX /GET BLOCK NUMBER |
| 146 | DCA NBLOK /STORE AWAY |
| 147 | ISZ MTHX /POINT TO ERROR RETURN |
| 148 | RDF /GET CALLING FIELD |
| 149 | TAD MTCDIF /CREATE CIF CDF TO USER'S FIELD |
| 150 | DCA MTEXIT /STORE AWAY WHERE WILL BE USEFUL LATER |
| 151 | MTCDIF, CIF CDF 0 /GO TO FIELD 0 |
| 152 | TAD MTANO /GET UNIT NUMBER |
| 153 | CLL RTR |
| 154 | RTR |
| 155 | DCA MTANO /PUT IN BITS 0-2 OF 'MTANO' |
| 156 | TAD MTFUN /RETRIEVE FUNCTION WORD |
| 157 | AND L70 /ISOLATE FIELD OF BUFFER |
| 158 | TAD PARITY /SET ODD PARITY BITS, AND DENSITY 8 (800 BPI, 7-CHANNEL) |
| 159 | TAD MTANO /COMBINE WITH UNIT NUMBER |
| 160 | DCA MTAWD /TO GET A USEFUL MTA COMMAND |
| 161 | TAD MTFUN /ZERO BUFFER FOR PIP ON EOF |
| 162 | AND L70 /FIELD OF ORIGIN |
| 163 | TAD MTCDF |
| 164 | DCA USRCDF |
| 165 | USRCDF, |
| 166 | MTANO, 0 |
| 167 | DCA MTANO /RESET 'MTANO' FOR NEXT CALL |
| 168 | TAD MTFUN |
| 169 | RAL |
| 170 | AND P7600 /GET # OF WORDS IN BUFFER |
| 171 | SNA SZL /ZERO BUFFER IF READING |
| 172 | JMP P7600 |
| 173 | CIA |
| 174 | DCA MTH |
| 175 | TAD NBUFF |
| 176 | DCA ERROR |
| 177 | MCLRLP, ISZ ERROR |
| 178 | L100, 100 |
| 179 | DCA I ERROR |
| 180 | ISZ MTH |
| 181 | JMP MCLRLP |
| 182 | P7600, 7600 |
| 183 | MTCDF, CDF 0 |
| 184 | TAD BLOCK0 |
| 185 | SNA /OPERATE IN MULTIPLE-FILE MODE? |
| 186 | TAD NBLOK /RETRIEVE BLOCK |
| 187 | SZA CLA /IS IT BLOCK 0? |
| 188 | JMP BIGBLK /NO |
| 189 | TAD MTATAD /YES, REWIND [CAN BE 13XX] |
| 190 | JMS MTH /CALL MAGTAPE ROUTINE |
| 191 | MTAWD, 1000 /CA IMMATERIAL |
| 192 | M7603, -7603 /WC IMMATERIAL |
| 193 | L70, 70 /NO REWIND ERRORS (THESE CAN'T OCCUR) |
| 194 | BIGBLK, TAD MTFUN |
| 195 | JMS I PNEXT /GO READ OR WRITE NEXT PAGE |
| 196 | NBUFF, 0 /ONE LESS THAN ADDRESS OF BUFFER |
| 197 | /MUST BE AT LOC AFTER CALL TO NEXT |
| 198 | \f/ MTH |
| 199 | |
| 200 | /SET UP WC AND CA REGISTERS, LOAD FUNCTION AND GO |
| 201 | |
| 202 | /CALLING SEQUENCE: |
| 203 | |
| 204 | / TAD (FNWORD |
| 205 | / JMS MTH |
| 206 | / BUFFER ADDRESS-1 |
| 207 | / -WORD COUNT |
| 208 | / MASK FOR UNACCEPTABLE ERROR CONDITIONS |
| 209 | / <NORMAL RETURN> |
| 210 | |
| 211 | / TAKES HANDLER ERROR RETURN ON ERRORS. |
| 212 | / IF ERROR, AC HAS ERROR CODE FROM MAIN STATUS REGISTER |
| 213 | / AC IS POSITIVE IF E.O.F. READ |
| 214 | |
| 215 | MTH, 0 /MUST BE AT 2ND LOC AFTER CALL TO NEXT |
| 216 | DCA ERROR /SAVE FUNCTION TEMPORARILY |
| 217 | SKTR /V3C |
| 218 | JMP .-1 /FIX TIMING BUG |
| 219 | CLT /CLEAR THE WORLD |
| 220 | TAD MTAWD |
| 221 | LCMR /LOAD COMMAND REGISTER |
| 222 | TAD I MTH /GET CURRENT ADDRESS |
| 223 | LCAR /LOAD IT |
| 224 | ISZ MTH /POINT TO WORD COUNT |
| 225 | TAD I MTH /GET WORD COUNT (TWO'S COMPLEMENT THEREOF) |
| 226 | LWCR /LOAD IT |
| 227 | ISZ MTH /POINT TO ERROR MASK |
| 228 | TAD ERROR /GET FUNCTION BACK |
| 229 | LFGR /GO BABY GO |
| 230 | JMS ERROR /CHECK FOR ERROR |
| 231 | SKJD /THROUGH? |
| 232 | JMP .-2 /NO |
| 233 | JMS ERROR /YES, ANY ERRORS? |
| 234 | E1, ISZ MTH /AMAZING WE MADE IT (NO ERRORS) |
| 235 | JMP I MTH /NORMAL RETURN |
| 236 | |
| 237 | IFNZRO MTH-NBUFF-1 <MTHERR,XXX> |
| 238 | \fERROR, 0 |
| 239 | TAD P7600 /YES |
| 240 | KRS /IS IT CTRL/C? |
| 241 | TAD M7603 /ALLOW PARITY TELETYPES |
| 242 | SNA CLA |
| 243 | KSF |
| 244 | JMP SIFE |
| 245 | CLT /ABORT I/O |
| 246 | JMP I P7600 /RETURN TO OS/8 KEYBOARD MONITOR |
| 247 | SIFE, SKEF /SKIP ON ERROR |
| 248 | JMP I ERROR /RETURN, NO ERRORS |
| 249 | RMSR /WHAT'S CAUSING THE ERROR? |
| 250 | AND I MTH /IS IT A GOOD ONE? (USE ERROR MASK) |
| 251 | SNA CLA /IS ERROR ACCEPTABLE? |
| 252 | JMP E1 /YES |
| 253 | RMSR /NOT ACCEPTABLE |
| 254 | AND L100 /IS IT AN E.O.F.? |
| 255 | SNA /IF SO, LEAVE BIT 0 CLEAR |
| 256 | RMSR |
| 257 | JMP MTEXIT /AND LEAVE WITH STATUS IN AC |
| 258 | |
| 259 | IFZERO .-367&4000 <PERR,ZZXX> |
| 260 | \f *366 |
| 261 | MTHX, MTAVERSION |
| 262 | MTA7, ISZ MTANO |
| 263 | MTA6, ISZ MTANO |
| 264 | MTA5, ISZ MTANO |
| 265 | MTA4, ISZ MTANO |
| 266 | MTA3, ISZ MTANO |
| 267 | MTA2, ISZ MTANO |
| 268 | MTA1, ISZ MTANO |
| 269 | MTA0, ISZ MTANO |
| 270 | JMS PNEXT /GET ADDRESS OF FIRST LOCATION ON NEXT PAGE |
| 271 | PAGE |
| 272 | |
| 273 | IFNZRO PARITY-200 <PARERR,ZZZ> |
| 274 | \f *400 |
| 275 | |
| 276 | NEXT, 0 |
| 277 | DCA RECNO /READ OR WRITE AND HOW MANY |
| 278 | TAD NEXT |
| 279 | TAD KSTOP |
| 280 | DCA NSTOP /ADDRESS OF RETURN ROUTINES |
| 281 | TAD NEXT |
| 282 | TAD KBLOK |
| 283 | DCA WC |
| 284 | TAD I WC |
| 285 | DCA WC |
| 286 | TAD I NEXT |
| 287 | DCA BUFFER /GET BUFFER ADDRESS - 1 |
| 288 | ISZ NEXT /POINT TO MTH |
| 289 | TAD (3677 /V3C |
| 290 | DCA ERFLAG /DEFAULT IS REPORT ALL ERRORS EXCEPT EOF |
| 291 | TAD RECNO |
| 292 | CLL RAL /LINK SPECIFIES READ OR WRITE |
| 293 | AND L7600 /-(# OF BLOCKS)^200 |
| 294 | SNA |
| 295 | JMP ZERO /0 PAGE COUNT! |
| 296 | DCA RECNO |
| 297 | SZL /READ OR WRITE? |
| 298 | STL CLA RTR /WRITE. +2000 TO CONVERT READ CODE TO WRITE CODE |
| 299 | TAD L2100 /READ (OR WRITE) & GO |
| 300 | DCA TEMP /SAVE THIS COMMAND |
| 301 | TAD L7600 |
| 302 | DCA WC /OS/8 USES 128 WORD BLOCKS |
| 303 | STA /V3C |
| 304 | DCA ERFLAG /NOW DEFAULT IS REPORT ALL ERRORS |
| 305 | RL1, TAD TEMP |
| 306 | JMS GO |
| 307 | TAD BUFFER /NEXT 200 WORDS |
| 308 | TAD L200 |
| 309 | DCA BUFFER |
| 310 | TAD RECNO /ANY MORE? |
| 311 | TAD L7600 |
| 312 | SNA |
| 313 | JMP I NSTOP /NO, FINISH |
| 314 | DCA RECNO /YES, LOOP |
| 315 | JMP RL1 /REJOIN PROCESSING |
| 316 | |
| 317 | KSTOP, STOP-NBUFF /USED TO RELOCATE 'STOP' |
| 318 | |
| 319 | KBLOK, NBLOK-NBUFF |
| 320 | \fFLAG, 0 |
| 321 | |
| 322 | COUNT, |
| 323 | TEMP, 0 |
| 324 | |
| 325 | EFL2, TAD L5100 |
| 326 | JMS GO /ALL THIS CODE IS NEW FOR V3C |
| 327 | EFL1, TAD L5100 |
| 328 | JMP GOO /V3C |
| 329 | |
| 330 | GO, 0 |
| 331 | JMS I NEXT /CALL MTH |
| 332 | BUFFER, HLT |
| 333 | WC, 0 |
| 334 | ERFLAG, -1 |
| 335 | JMP I GO |
| 336 | |
| 337 | L5100, 5100 |
| 338 | RECNO, 0 |
| 339 | NSTOP, 0 |
| 340 | L7, 7 |
| 341 | L2100, 2100 |
| 342 | \fZERO, TAD RECNO /RETRIEVE FN WORD (MUST PRESERVE LINK) |
| 343 | AND L7 /ISOLATE SPECIAL CODE |
| 344 | TAD PJUMP |
| 345 | DCA .+1 |
| 346 | FN, HLT /BRANCH THROUGH JUMP TABLE |
| 347 | |
| 348 | TABLE, JMP EFL2 /0 CLOSE. WRITE TWO EOF'S |
| 349 | JMP REW /1 REWIND |
| 350 | JMP SPACE /2 SPACE FORWARD/REVERSE RECORDS |
| 351 | JMP SEOF /3 SPACE FORWARD/REVERSE FILES |
| 352 | JMP UNLOAD /4 REWIND AND OFF-LINE |
| 353 | JMP EFL1 /5 WRITE EOF |
| 354 | JMP SPEC /6 READ OR WRITE WITH SPECIAL BLOCKSIZE |
| 355 | PJUMP, JMP TABLE /7 UNUSED SAME AS 0 |
| 356 | |
| 357 | SEOF, RAR /LINK ON MEANS REVERSE |
| 358 | RTR |
| 359 | DCA FN |
| 360 | TAD WC |
| 361 | DCA COUNT |
| 362 | STA |
| 363 | DCA WC |
| 364 | RMSR |
| 365 | AND (3000 /CHECK BOT BIT |
| 366 | SZA CLA /SIMULATE DATA IF AT BOT (OR REWINDING) |
| 367 | FILE, CLA IAC |
| 368 | FILE2, DCA FLAG |
| 369 | TAD FN |
| 370 | TAD L6100 /V3C FORWARD [OR BACKSPACE] A RECORD |
| 371 | JMS GO |
| 372 | RMSR |
| 373 | AND P100 |
| 374 | SNA CLA /SKIP IF FILE MARK FOUND |
| 375 | JMP FILE |
| 376 | TAD FN |
| 377 | TAD FLAG |
| 378 | SZA CLA /WAS THERE ANY DATA? |
| 379 | JMP CONT /V3C YES, CONTINUE |
| 380 | /EITHER SAW DATA OR WAS GOING IN REVERSE |
| 381 | STL /NO, BACKSPACE ONE RECORD |
| 382 | SPACE, CLA CMA /V3C DON'T TOUCH LINK |
| 383 | DCA ERFLAG /ALL ERRORS ARE FATAL |
| 384 | RAR /LINK ON MEANS REVERSE (READ BIT) |
| 385 | STL RAR |
| 386 | STL RAR |
| 387 | UNLOAD, TAD P100 /ADD IN 'GO' BIT |
| 388 | GOO, JMS GO |
| 389 | JMP I NSTOP |
| 390 | |
| 391 | CONT, ISZ COUNT /V3C |
| 392 | JMP FILE2 /CONTINUE? |
| 393 | JMP I NSTOP /CHECK FOR EOD BEFORE COUNT |
| 394 | |
| 395 | /FLAG .NE. 0 MEANS SAW DATA |
| 396 | \fL6100, 6100 |
| 397 | P100, 100 |
| 398 | L7600, 7600 |
| 399 | |
| 400 | SPEC, CLA CMA /V3C DON'T TOUCH LINK |
| 401 | DCA ERFLAG /ALL ERRORS ARE NOW FATAL |
| 402 | SZL /LINK STILL CONTAINS READ/WRITE BIT |
| 403 | STL CLA RTR |
| 404 | TAD L2100 /V3C |
| 405 | JMP GOO /V3C |
| 406 | |
| 407 | REW, DCA ERFLAG /NO REWIND ERRORS |
| 408 | TAD (1000 /V3C |
| 409 | JMP UNLOAD /V3C |
| 410 | L200, 200 |
| 411 | PAGE |
| 412 | $ |
| 413 | \f\v |