1 /TD8E DECTAPE ROUTINE 2 /VERSION 01 3 4 /JULY 2 1971 GB/RL/EF 5 6 /COPYRIGHT 1971 DIGITAL EQUIPMENT CORP. 7 / MAYNARD, MASS. 8 9 /ABSTRACT-- 10 / THE ROUTINE DESCRIBED AND LISTED HERE IS A GENERAL 11 /DATA HANDLER FOR THE TD8E DECTAPE SYSTEM. THE ROUTINE 12 /CONTAINS SEARCH, READ, AND WRITE FUNCTIONS IN A FORMAT 13 /WHICH IS COMPATIBLE WITH PS/8 DEVICE HANDLER CALLING 14 /SEQUENCES. 15 16 /THIS ROUTINE CAN BE RE-EDITED AND ASSEMBLED TO PRODUCE 17 /VARIATIONS ON THE BASIC TD8E SYSTEM. ASSEMBLY PARAMETERS 18 /CONTROL: 19 /A) WHAT DRIVES (UNITS 0-7) WILL BE USED 20 /B) THE ORIGIN OF THE TWO PAGE ROUTINE 21 /C) WHAT MEMORY FIELD THE ROUTINE WILL RUN IN 22 /D) THE SIZE OF THE DECTAPE BLOCK TO BE READ/WRITTEN 23 24 /FOLLOWING ARE THE PARAMETERS SET UP FOR THE STANDARD 25 /DEC VERSION OF THIS ROUTINE: 26 27 DRIVE=10 /UNITS 0 AND 1 SELECTED 28 ORIGIN=7400 /ENTRIES AT 7200 AND 7204 29 AFIELD=1 /INITIAL FIELD SETTING 30 MFIELD=10 /AFIELD*10=MFIELD 31 WDSBLK=201 /129 WORDS PER BLOCK 32 33 /THE USE OF THE PARAMETERS IS AS FOLLOWS: 34 35 / DRIVE: DRIVE DETERMINES WHICH UNITS WILL BE SELECTED 36 / DRIVE=10 IMPLIES UNITS 0 &1 37 / DRIVE=20 IMPLIES UNITS 2&3 38 / DRIVE=30 IMPLIES UNITS 4&5 39 / DRIVE=40 IMPLIES UNITS 6&7 40 41 /ORIGIN: ALTERING ORIGIN CAUSES ASSEMBLY IN A DIFFERENT 42 / MEMORY LOCATION. WHEN CHANGING ORIGIN KEEP IN MIND 43 /THAT THIS IS A TWO PAGE ROUTINE. 44 45 /AFIELD: AFIELD DETERMINES THE INITIAL FIELD SETTING FOR THE 46 / LOADER. PERMISSIBLE VALUES FOR AFIELD ARE 0 TO 7. 47 48 /MFIELD: MFIELD IS USED IN A CIF CDF MFIELD INSTRUCTION. 49 / THE VALUE INSERTED FOR MFIELD SHOULD BE 10(8) TIMES 50 / THE VALUE FOR AFIELD. THE PERMISSIBLE VALUES ARE 00-70. 51 52 /WDSBLK: WDSBLK GOVERNS HOW MANY WORDS THE ROUTINE THINKS ARE 53 / IN A DECTAPE BLOCK. THE STANDARD VALUE IS 201(8) OR 54 / 128 DECIMAL. NOTE THAT THE FUNCTION WORD BIT 10 CAN 55 / BE USED TO SUBTRACT ONE FROM WDSBLK. THE VALUE USED 56 / FOR WDSBLK SHOULD BE THE NUMBER OF WORDS THE TAPE WAS 57 / FORMATTED TO CONTAIN. 58 59 /IF WE WANT A HANDLER FOR UNITS 2&3 TO RESIDE IN 60 /FIELD 2 AT LOCATION 3000 AND READ/WRITE 256(10) WORDS 61 /PER BLOCK, THE PARAMETERS WOULD BE: 62 / DRIVE=20 63 / ORIGIN=3000 64 / AFIELD=2 65 / MFIELD=20 66 / WDSBLK=400 67 68 /THE CALL TO THE SUBROUTINE FOLLOWS BASICALLY THE 69 /CALLING SEQUENCE FOR PS/8 DEVICE HANDLERS. 70 /THE CALLING SEQUENCE IS: 71 72 / CDF CURRENT 73 / CIF MFIELD /MFIELD=FIELD ASSEMBLED IN 74 / JMS ENTRY /ENTRY=ORIGIN (EVEN NUMBERED DRIVE 75 /AND ORIGIN+4 FOR ODD NUMBERED DRIVE. 76 / ARG1 77 / ARG2 78 / ARG3 79 / ERROR RETURN 80 / NORMAL RETURN 81 82 /THE ARGUMENTS ARE: 83 84 /ARG1: FUNCTION WORD BIT0: 0=READ, 1=WRITE 85 / BITS 1-5: # BLOCKS IN OPERATION 86 / BITS 6-8: FIELD OF BUFFER AREA 87 / BIT 9: UNUSED 88 / BIT 10: # OF WORDS/BLOCK. 89 / 0= WDSBLK, 1=WDSBLK-1 90 / BIT 11: 1=START FORWARD, 0=REVERSE 91 92 /ARG2: BUFFER ADDRESS FOR OPERATION 93 /ARG3: STARTING BLOCK FOR OPERATION 94 95 /ERRORS: THE HANDLER DETECTS TWO TYPES OF ERRORS: 96 /A) FATAL ERRORS- PARITY ERROR, TIMING ERROR, 97 / TOO GREAT A BLOCK NUMBER 98 / FATAL ERRORS TAKE ERROR RETURN WITH THE 99 / AC=4000. 100 /B) NON-FATAL- SELECT ERROR. 101 / IF NO PROPER UNIT IS SELECTED, THE ERROR 102 / RETURN IS TAKEN WITH CLEAR AC. 103 /FATAL ERRORS TRY THREE TIMES BEFORE TAKING ERROR RETURN. 104 /THE NORMAL RETURN IS TAKEN AFTER ALL INDICATED 105 /BLOCKS HAVE BEEN TRANSFERRED. THE AC IS CLEAR. 106 107 /THE TD8E IOT'S ARE: 108 SDSS=7001-DRIVE /SKIP ON SINGLE LINE FLAG 109 SDST=7002-DRIVE /SKIP ON TIMING ERROR 110 SDSQ=7003-DRIVE /SKIP ON QUAD LINE FLAG 111 SDLC=7004-DRIVE /LOAD COMMAND REGISTER 112 SDLD=7005-DRIVE /LOAD DATA REGISTER 113 SDRC=7006-DRIVE /READ COMMAND REGISTER 114 SDRD=7007-DRIVE /READ DATA REGISTER 115 116 /THE IOT'S IN GENERAL ARE 677X,676X,675X,AND 674X. 117 /THE OTHERS CONTROL UNITS 2-7. 118 119 BLOCK=DTA1 120 121 FIELD AFIELD 122 *ORIGIN 123 017400 0000 DTA0, 0 /ENTRY POINT FROM UNIT 0 124 017401 7300 CLA CLL /0 TO LINK 125 017402 5210 JMP DTA1X 126 017403 1000 C1000, 1000 127 017404 0000 DTA1, 0 /UNIT 2 ENTRY 128 017405 7320 CLA CLL CML /1 TO LINK 129 017406 1204 TAD DTA1 130 017407 3200 DCA DTA0 /PICK UP ARGS AT DTA0 131 017410 7010 DTA1X, RAR 132 017411 3361 DCA UNIT /LINK TO UNIT POSITION 133 017412 6214 RDF 134 017413 1354 TAD C6203 /GET DATA FIELD AND SETUP RETURN 135 017414 3352 DCA LEAVE 136 017415 1600 TAD I DTA0 /GET FUNCTION WORD 137 017416 6775 SDLD /PUT FUNCTION INTO DATA REGISTER 138 017417 7112 CLL RTR /AC STILL HAS FUNCTION. PUT # WORDS PER 139 /BLOCK INTO LINK 140 017420 7630 SZL CLA /KNOCK ONE OFF WDSBLK? 141 017421 7001 IAC /YES 142 017422 1360 TAD MWORDS 143 017423 3356 DCA WCOUNT /STORE MASTER WORD COUNT 144 017424 2200 ISZ DTA0 /TO BUFFER 145 017425 1600 TAD I DTA0 146 017426 3357 DCA BUFF 147 017427 2200 ISZ DTA0 /TO BLOCK NUMBER 148 017430 1600 TAD I DTA0 149 017431 3204 DCA BLOCK 150 017432 2200 ISZ DTA0 /POINT TO ERROR EXIT 151 017433 6213 CIF CDF MFIELD /TO ROUTINES DATA FIELD 152 017434 6777 SDRD /GET FUNCTION INTO AC 153 017435 7104 CLL RAL 154 017436 0307 AND CM200 /GET # PAGES TO XFER 155 017437 3364 DCA PGCT 156 017440 6777 SDRD 157 017441 0374 C374, AND C70 /GET FIELD FOR XFER 158 017442 1354 TAD C6203 /FORM CDF N 159 017443 3377 DCA XFIELD /IF=0 AND DF=N AT XFER. 160 017444 7346 CLA CLL CMA RTL 161 017445 3367 DCA TRYCNT /3 ERROR TRIES 162 017446 1361 TAD UNIT /TEST FOR SELECT ERROR 163 017447 6774 SDLC 164 017450 6776 SDRC 165 017451 0366 AND C100 166 017452 7640 SZA CLA 167 017453 5346 JMP FATAL-1 168 169 017454 6777 SDRD /PUT FUNCT INTO XFUNCT IN SECOND PG. 170 017455 3762 DCA I CXFUN 171 017456 1356 TAD WCOUNT 172 017457 3765 DCA I CXWCT 173 017460 6777 SDRD /GET MOTION BIT TO LINK 174 017461 7110 CLL RAR 175 017462 5301 JMP GO /AND START THE MOTION. 176 017463 6772 RWCOM, SDST /ANY CHECKSUM ERRORS? 177 017464 7640 SZA CLA /OR CHECKSUM ERRORS? 178 017465 5341 JMP TRY3 /PLEASE NOTE THAT THE LINK IS ALWAYS 179 /SET AT RWCOM. GETCHK SETS IT. 180 017466 1364 TAD PGCT /NO ERROR..FINISHED XFER? 181 017467 1307 TAD CM200 182 017470 7450 SNA 183 017471 5345 JMP EXIT /ALL DONE. GET OUT 184 017472 3364 DCA PGCT /NEW PAGE COUNT 185 017473 2204 ISZ BLOCK /NEXT BLOCK TO XFER 186 017474 1356 TAD WCOUNT /FORM NEXT BUFFER ADDRESS 187 017475 7041 CIA 188 017476 1357 TAD BUFF 189 017477 3357 DCA BUFF 190 017500 7120 CLL CML /FORCES MOTION FORWARD 191 017501 7232 GO, CLA CML RTR /LINK BECOMES MOTION BIT 192 017502 1203 TAD C1000 193 017503 1361 TAD UNIT /PUT IN 'GO' AND UNIT # 194 017504 6774 SDLC /LOOK FOR BLOCK NO. 195 196 017505 4755 JMS I CRDQUD /WAIT AT LEAST 6 LINES TO LOOK 197 017506 4755 JMS I CRDQUD 198 017507 7600 CM200, 7600 /COULD HAVE SAVED A LOC. HERE 199 017510 6771 SRCH, SDSS 200 017511 5310 JMP .-1 /WAIT FOR SINGLE LINE FLAG 201 017512 6776 SDRC 202 017513 7106 CLL RTL /DIRECTION TO LINK. INFO BITS 203 /ARE SHIFTED. 204 017514 0241 AND C374 /ISOLATE MARK TRACK BITS 205 017515 1333 TAD M110 /IS IT END ZONE? 206 017516 7450 SNA /THE LINK STAYS SAME THRU THIS 207 017517 5335 JMP ENDZ 208 017520 1363 TAD M20 /CHECK FOR BLOCK MARK 209 017521 7640 SZA CLA 210 017522 5310 JMP SRCH 211 017523 6777 SDRD /GET THE BLOCK NUMBER 212 017524 7430 SZL /IF WE ARE IN REVERSE, LOOK FOR 3 213 /BLOCKS BEFORE TARGET BLOCK. THIS 214 /ALLOWS TURNAROUND AND UP TO SPEED. 215 017525 1375 TAD C3 /REVERSE 216 017526 7040 CMA 217 017527 1204 TAD BLOCK 218 017530 7040 CMA /IS IT RIGHT BLOCK? 219 017531 7450 SNA 220 017532 5370 JMP FOUND /YES..HOORAY! 221 017533 7670 M110, SZL SNA CLA /NO, BUT ARE WE HEADED FOR IT? 222 /ABOVE SNA IS SUPERFLUOUS. 223 017534 5310 JMP SRCH /YES 224 017535 6776 ENDZ, SDRC /WE ARE IN THE END ZONE 225 017536 7106 CLL RTL /DIRECTION TO LINK 226 017537 7630 SZL CLA /ARE WE IN REVERSE? 227 017540 5301 JMP GO /YES..TURN US AROUND 228 /IF WE ARE IN THE END ZONE GOING FORWARD, IT IS AN ERROR 229 017541 2367 TRY3, ISZ TRYCNT 230 017542 5301 JMP GO /TRY 3 TIMES 231 017543 7300 CLL CLA 232 017544 5347 JMP FATAL /LINK OFF MEANS AC=4000 ON RETURN 233 017545 2200 EXIT, ISZ DTA0 234 017546 7120 CLL CML /AC=0 ON NORMAL RETURN 235 017547 1361 FATAL, TAD UNIT 236 017550 6774 SDLC /STOP THE UNIT 237 017551 7230 CLA CML RAR 238 017552 7402 LEAVE, HLT 239 017553 5600 JMP I DTA0 240 241 242 017554 6203 C6203, 6203 243 017555 7713 CRDQUD, RDQUAD 244 017556 0000 WCOUNT, 0 245 017557 0000 BUFF, 0 246 017560 7577 MWORDS, -WDSBLK 247 017561 0000 UNIT, 0 248 017562 7753 CXFUN, XFUNCT 249 017563 7760 M20, -20 250 017564 0000 PGCT, 0 251 017565 7761 CXWCT, XWCT 252 017566 0100 C100, 100 253 017567 7775 TRYCNT, -3 254 255 256 *ORIGIN+170 257 017570 7630 FOUND, SZL CLA /RIGHT BLOCK. HOW ABOUT DIRECTION? 258 017571 5301 JMP GO /WRONG..TURN AROUND 259 017572 1361 TAD UNIT /PUT UNIT INTO LINK 260 017573 7104 CLL RAL /AC IS NOW 0 261 017574 0070 C70, 70 /********DON'T MOVE THIS!!!!****** 262 017575 0003 C3, 3 263 017576 1357 TAD BUFF /GET BUFFER ADDRESS 264 017577 7402 XFIELD, HLT /INTO NEXT PAGE 265 266 *ORIGIN+200 267 XUNIT=EQUFUN 268 269 017600 6212 CIF MFIELD 270 017601 3360 DCA XBUFF /SAVE ADDRESS 271 017602 7010 RAR /NOW GET UNIT # 272 017603 3320 DCA XUNIT 273 017604 1361 TAD XWCT 274 017605 3357 DCA WORDS /WORD COUNTER 275 017606 6771 REVGRD, SDSS 276 017607 5206 JMP .-1 /LOOK FOR REVERSE GUARD 277 017610 6776 SDRC 278 017611 0241 AND K77 279 017612 1354 TAD CM32 /IS IT REVERSE GUARD? 280 017613 7640 SZA CLA 281 017614 5206 JMP REVGRD /NO.KEEP LOOKING 282 017615 1353 TAD XFUNCT /GET FUNCTION READ OR WRITE 283 017616 7700 K7700, SMA CLA 284 017617 5254 JMP READ /NEG. IS WRITE 285 017620 6776 WRITE, SDRC 286 017621 0266 AND C300 /CHECK FOR WRITE LOCK AND SELECT ERROR 287 017622 7120 CLL CML /LOCK OUT AND SELECT ARE AC 0 ERRORS 288 017623 7640 SZA CLA 289 017624 5751 JMP I CFATAL /FATAL ERROR. LINK MUST BE ON 290 017625 4313 JMS RDQUAD /NO ONE EVER USES THIS WORD! 291 017626 7600 C7600, 7600 292 017627 1355 TAD C1400 293 017630 1320 TAD XUNIT /INITIATE WRITE MODE 294 017631 6774 SDLC 295 017632 7240 CLA CMA 296 017633 4304 JMS WRQUAD /PUT 77 IN REVERSE CHECKSUM 297 017634 7240 CLA CMA 298 017635 3356 DCA CHKSUM 299 017636 1760 WRLP, TAD I XBUFF /GLORY BE! THE ACTUAL WRITE! 300 017637 4304 JMS WRQUAD 301 017640 2360 ISZ XBUFF /BUMP CORE POINTER 302 017641 0077 K77, 77 /ABOVE MAY SKIP 303 017642 2357 ISZ WORDS /DONE THIS BLOCK? 304 017643 5236 JMP WRLP /NOT YET..LOOP A WHILE 305 017644 1353 TAD XFUNCT /IS THE OPERATION FOR WDSBLK PER BLOCK? 306 017645 7112 CLL RTR /IF NO, WRITE A 0 WORD 307 017646 7630 SZL CLA 308 309 017647 4304 JMS WRQUAD /WRITE A WORD OF 0 310 017650 4335 JMS GETCHK /DO THE CHECK SUM 311 017651 4304 JMS WRQUAD /WRITE FORWARD CHECKSUM 312 017652 4304 JMS WRQUAD /ALLOW CHECKSUM TO BE WRITTEN 313 017653 5752 JMP I CRWCOM 314 315 316 017654 4313 READ, JMS RDQUAD 317 017655 4313 JMS RDQUAD 318 017656 4313 JMS RDQUAD /SKIP CONTROL WORDS 319 017657 0241 AND K77 320 017660 1216 TAD K7700 /TACK 7700 ONTO CHECKSUM. 321 017661 3356 DCA CHKSUM /CHECKSUM ONLY LOW 6 BITS ANYWAY 322 017662 4313 RDLP, JMS RDQUAD 323 017663 4320 JMS EQUFUN /COMPUT CHECKSUM AS WE GO 324 017664 3760 DCA I XBUFF /IT GETS CONDENSED LATER 325 017665 2360 ISZ XBUFF 326 017666 0300 C300, 300 /PROTECTION 327 017667 2357 ISZ WORDS /DONE THIS OP? 328 017670 5262 JMP RDLP /NO SUCH LUCK 329 017671 1353 TAD XFUNCT /IF OP WAS FOR WDSBLK-1, READ AND 330 017672 7112 CLL RTR /CHECKSUM THE LAST TAPE WORD 331 017673 7620 SNL CLA 332 017674 5277 JMP RDLP2 333 017675 4313 JMS RDQUAD /NOT NEEDED FOR WDSBLK/BLOCK 334 017676 4320 JMS EQUFUN /CHECKSUM IT 335 017677 4313 RDLP2, JMS RDQUAD /READ CHECKSUM 336 017700 0216 AND K7700 337 017701 4320 JMS EQUFUN 338 017702 4335 JMS GETCHK /GET SIX BIT CHECKSUM 339 017703 5752 JMP I CRWCOM 340 341 017704 0000 WRQUAD, 0 /WRITE OUT A 12 BIT WORD 342 017705 4320 JMS EQUFUN /ADD THIS TO CHECKSUM 343 017706 6773 SDSQ /SKIP ON QUADLINE FLAG 344 017707 5306 JMP .-1 345 017710 6775 SDLD /LOAD DATA ONTO BUS 346 017711 7200 CLA /SDLD DOESN'T CLEAR AC 347 017712 5704 JMP I WRQUAD 348 349 017713 0000 RDQUAD, 0 /READ A 12 BIT WORD 350 017714 6773 SDSQ 351 017715 5314 JMP .-1 352 017716 6777 SDRD /READ DATA 353 017717 5713 JMP I RDQUAD 354 355 356 017720 0000 EQUFUN, 0 /COMPUTE EQUIVALENCE CHECKSUM 357 017721 7040 CMA 358 017722 3362 DCA EQUTMP /ACTUALLY CHECKSUMS ON DECTAPE ARE 359 017723 1362 TAD EQUTMP /EQUIVALENCE OF ALL WORDS IN A RECORD 360 017724 0356 AND CHKSUM /SIX BITS AT A TIME. BUT SINCE EQUIVALENCE 361 017725 7041 CIA /IS ASSOCIATIVE, WE CAN DO IT 12 362 017726 7104 CLL RAL /BITS AT A TIME AND CONDENSE LATER. 363 017727 1362 TAD EQUTMP /THIS ROUTINE USES THESE IDENTITIES: 364 017730 1356 TAD CHKSUM /A+B=(A.XOR.B)+2*(A.AND.B) 365 017731 3356 DCA CHKSUM /A.EQU.B=.NOT.(A.XOR.B)=A.XOR.(.NOT.B) 366 017732 1362 TAD EQUTMP /A.EQU.B=(A+(.NOT.B))-2*(A.AND.(.NOT.B)) 367 017733 7040 CMA 368 017734 5720 JMP I EQUFUN 369 370 017735 0000 GETCHK, 0 /FORM 6 BIT CHECKSUM 371 017736 7200 CLA 372 017737 1356 TAD CHKSUM 373 017740 7040 CMA 374 017741 7106 CLL RTL 375 017742 7006 RTL 376 017743 7006 RTL 377 017744 4320 JMS EQUFUN 378 017745 7320 CLA CLL CML /FORCES LINK ON AT RWCOM 379 017746 1356 TAD CHKSUM 380 017747 0216 AND K7700 381 017750 5735 JMP I GETCHK 382 383 017751 7547 CFATAL, FATAL 384 017752 7463 CRWCOM, RWCOM 385 017753 0000 XFUNCT, 0 386 017754 7746 CM32, -32 387 017755 1400 C1400, 1400 388 017756 0000 CHKSUM, 0 389 017757 0000 WORDS, 0 390 017760 0000 XBUFF, 0 391 017761 0000 XWCT, 0 392 017762 0000 EQUTMP, 0 393 394 $$$$$$$$$$$