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=7200 /ENTRIES AT 7200 AND 7204 29 AFIELD=0 /INITIAL FIELD SETTING 30 MFIELD=00 /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 007200 0000 DTA0, 0 /ENTRY POINT FROM UNIT 0 124 007201 7300 CLA CLL /0 TO LINK 125 007202 5210 JMP DTA1X 126 007203 1000 C1000, 1000 127 007204 0000 DTA1, 0 /UNIT 2 ENTRY 128 007205 7320 CLA CLL CML /1 TO LINK 129 007206 1204 TAD DTA1 130 007207 3200 DCA DTA0 /PICK UP ARGS AT DTA0 131 007210 7010 DTA1X, RAR 132 007211 3361 DCA UNIT /LINK TO UNIT POSITION 133 007212 6214 RDF 134 007213 1354 TAD C6203 /GET DATA FIELD AND SETUP RETURN 135 007214 3352 DCA LEAVE 136 007215 1600 TAD I DTA0 /GET FUNCTION WORD 137 007216 6775 SDLD /PUT FUNCTION INTO DATA REGISTER 138 007217 7112 CLL RTR /AC STILL HAS FUNCTION. PUT # WORDS PER 139 /BLOCK INTO LINK 140 007220 7630 SZL CLA /KNOCK ONE OFF WDSBLK? 141 007221 7001 IAC /YES 142 007222 1360 TAD MWORDS 143 007223 3356 DCA WCOUNT /STORE MASTER WORD COUNT 144 007224 2200 ISZ DTA0 /TO BUFFER 145 007225 1600 TAD I DTA0 146 007226 3357 DCA BUFF 147 007227 2200 ISZ DTA0 /TO BLOCK NUMBER 148 007230 1600 TAD I DTA0 149 007231 3204 DCA BLOCK 150 007232 2200 ISZ DTA0 /POINT TO ERROR EXIT 151 007233 6203 CIF CDF MFIELD /TO ROUTINES DATA FIELD 152 007234 6777 SDRD /GET FUNCTION INTO AC 153 007235 7104 CLL RAL 154 007236 0307 AND CM200 /GET # PAGES TO XFER 155 007237 3364 DCA PGCT 156 007240 6777 SDRD 157 007241 0374 C374, AND C70 /GET FIELD FOR XFER 158 007242 1354 TAD C6203 /FORM CDF N 159 007243 3377 DCA XFIELD /IF=0 AND DF=N AT XFER. 160 007244 7346 CLA CLL CMA RTL 161 007245 3367 DCA TRYCNT /3 ERROR TRIES 162 007246 1361 TAD UNIT /TEST FOR SELECT ERROR 163 007247 6774 SDLC 164 007250 6776 SDRC 165 007251 0366 AND C100 166 007252 7640 SZA CLA 167 007253 5346 JMP FATAL-1 168 169 007254 6777 SDRD /PUT FUNCT INTO XFUNCT IN SECOND PG. 170 007255 3762 DCA I CXFUN 171 007256 1356 TAD WCOUNT 172 007257 3765 DCA I CXWCT 173 007260 6777 SDRD /GET MOTION BIT TO LINK 174 007261 7110 CLL RAR 175 007262 5301 JMP GO /AND START THE MOTION. 176 007263 6772 RWCOM, SDST /ANY CHECKSUM ERRORS? 177 007264 7640 SZA CLA /OR CHECKSUM ERRORS? 178 007265 5341 JMP TRY3 /PLEASE NOTE THAT THE LINK IS ALWAYS 179 /SET AT RWCOM. GETCHK SETS IT. 180 007266 1364 TAD PGCT /NO ERROR..FINISHED XFER? 181 007267 1307 TAD CM200 182 007270 7450 SNA 183 007271 5345 JMP EXIT /ALL DONE. GET OUT 184 007272 3364 DCA PGCT /NEW PAGE COUNT 185 007273 2204 ISZ BLOCK /NEXT BLOCK TO XFER 186 007274 1356 TAD WCOUNT /FORM NEXT BUFFER ADDRESS 187 007275 7041 CIA 188 007276 1357 TAD BUFF 189 007277 3357 DCA BUFF 190 007300 7120 CLL CML /FORCES MOTION FORWARD 191 007301 7232 GO, CLA CML RTR /LINK BECOMES MOTION BIT 192 007302 1203 TAD C1000 193 007303 1361 TAD UNIT /PUT IN 'GO' AND UNIT # 194 007304 6774 SDLC /LOOK FOR BLOCK NO. 195 196 007305 4755 JMS I CRDQUD /WAIT AT LEAST 6 LINES TO LOOK 197 007306 4755 JMS I CRDQUD 198 007307 7600 CM200, 7600 /COULD HAVE SAVED A LOC. HERE 199 007310 6771 SRCH, SDSS 200 007311 5310 JMP .-1 /WAIT FOR SINGLE LINE FLAG 201 007312 6776 SDRC 202 007313 7106 CLL RTL /DIRECTION TO LINK. INFO BITS 203 /ARE SHIFTED. 204 007314 0241 AND C374 /ISOLATE MARK TRACK BITS 205 007315 1333 TAD M110 /IS IT END ZONE? 206 007316 7450 SNA /THE LINK STAYS SAME THRU THIS 207 007317 5335 JMP ENDZ 208 007320 1363 TAD M20 /CHECK FOR BLOCK MARK 209 007321 7640 SZA CLA 210 007322 5310 JMP SRCH 211 007323 6777 SDRD /GET THE BLOCK NUMBER 212 007324 7430 SZL /IF WE ARE IN REVERSE, LOOK FOR 3 213 /BLOCKS BEFORE TARGET BLOCK. THIS 214 /ALLOWS TURNAROUND AND UP TO SPEED. 215 007325 1375 TAD C3 /REVERSE 216 007326 7040 CMA 217 007327 1204 TAD BLOCK 218 007330 7040 CMA /IS IT RIGHT BLOCK? 219 007331 7450 SNA 220 007332 5370 JMP FOUND /YES..HOORAY! 221 007333 7670 M110, SZL SNA CLA /NO, BUT ARE WE HEADED FOR IT? 222 /ABOVE SNA IS SUPERFLUOUS. 223 007334 5310 JMP SRCH /YES 224 007335 6776 ENDZ, SDRC /WE ARE IN THE END ZONE 225 007336 7106 CLL RTL /DIRECTION TO LINK 226 007337 7630 SZL CLA /ARE WE IN REVERSE? 227 007340 5301 JMP GO /YES..TURN US AROUND 228 /IF WE ARE IN THE END ZONE GOING FORWARD, IT IS AN ERROR 229 007341 2367 TRY3, ISZ TRYCNT 230 007342 5301 JMP GO /TRY 3 TIMES 231 007343 7300 CLL CLA 232 007344 5347 JMP FATAL /LINK OFF MEANS AC=4000 ON RETURN 233 007345 2200 EXIT, ISZ DTA0 234 007346 7120 CLL CML /AC=0 ON NORMAL RETURN 235 007347 1361 FATAL, TAD UNIT 236 007350 6774 SDLC /STOP THE UNIT 237 007351 7230 CLA CML RAR 238 007352 7402 LEAVE, HLT 239 007353 5600 JMP I DTA0 240 241 242 007354 6203 C6203, 6203 243 007355 7513 CRDQUD, RDQUAD 244 007356 0000 WCOUNT, 0 245 007357 0000 BUFF, 0 246 007360 7577 MWORDS, -WDSBLK 247 007361 0000 UNIT, 0 248 007362 7553 CXFUN, XFUNCT 249 007363 7760 M20, -20 250 007364 0000 PGCT, 0 251 007365 7561 CXWCT, XWCT 252 007366 0100 C100, 100 253 007367 7775 TRYCNT, -3 254 255 256 *ORIGIN+170 257 007370 7630 FOUND, SZL CLA /RIGHT BLOCK. HOW ABOUT DIRECTION? 258 007371 5301 JMP GO /WRONG..TURN AROUND 259 007372 1361 TAD UNIT /PUT UNIT INTO LINK 260 007373 7104 CLL RAL /AC IS NOW 0 261 007374 0070 C70, 70 /********DON'T MOVE THIS!!!!****** 262 007375 0003 C3, 3 263 007376 1357 TAD BUFF /GET BUFFER ADDRESS 264 007377 7402 XFIELD, HLT /INTO NEXT PAGE 265 266 *ORIGIN+200 267 XUNIT=EQUFUN 268 269 007400 6202 CIF MFIELD 270 007401 3360 DCA XBUFF /SAVE ADDRESS 271 007402 7010 RAR /NOW GET UNIT # 272 007403 3320 DCA XUNIT 273 007404 1361 TAD XWCT 274 007405 3357 DCA WORDS /WORD COUNTER 275 007406 6771 REVGRD, SDSS 276 007407 5206 JMP .-1 /LOOK FOR REVERSE GUARD 277 007410 6776 SDRC 278 007411 0241 AND K77 279 007412 1354 TAD CM32 /IS IT REVERSE GUARD? 280 007413 7640 SZA CLA 281 007414 5206 JMP REVGRD /NO.KEEP LOOKING 282 007415 1353 TAD XFUNCT /GET FUNCTION READ OR WRITE 283 007416 7700 K7700, SMA CLA 284 007417 5254 JMP READ /NEG. IS WRITE 285 007420 6776 WRITE, SDRC 286 007421 0266 AND C300 /CHECK FOR WRITE LOCK AND SELECT ERROR 287 007422 7120 CLL CML /LOCK OUT AND SELECT ARE AC 0 ERRORS 288 007423 7640 SZA CLA 289 007424 5751 JMP I CFATAL /FATAL ERROR. LINK MUST BE ON 290 007425 4313 JMS RDQUAD /NO ONE EVER USES THIS WORD! 291 007426 7600 C7600, 7600 292 007427 1355 TAD C1400 293 007430 1320 TAD XUNIT /INITIATE WRITE MODE 294 007431 6774 SDLC 295 007432 7240 CLA CMA 296 007433 4304 JMS WRQUAD /PUT 77 IN REVERSE CHECKSUM 297 007434 7240 CLA CMA 298 007435 3356 DCA CHKSUM 299 007436 1760 WRLP, TAD I XBUFF /GLORY BE! THE ACTUAL WRITE! 300 007437 4304 JMS WRQUAD 301 007440 2360 ISZ XBUFF /BUMP CORE POINTER 302 007441 0077 K77, 77 /ABOVE MAY SKIP 303 007442 2357 ISZ WORDS /DONE THIS BLOCK? 304 007443 5236 JMP WRLP /NOT YET..LOOP A WHILE 305 007444 1353 TAD XFUNCT /IS THE OPERATION FOR WDSBLK PER BLOCK? 306 007445 7112 CLL RTR /IF NO, WRITE A 0 WORD 307 007446 7630 SZL CLA 308 309 007447 4304 JMS WRQUAD /WRITE A WORD OF 0 310 007450 4335 JMS GETCHK /DO THE CHECK SUM 311 007451 4304 JMS WRQUAD /WRITE FORWARD CHECKSUM 312 007452 4304 JMS WRQUAD /ALLOW CHECKSUM TO BE WRITTEN 313 007453 5752 JMP I CRWCOM 314 315 316 007454 4313 READ, JMS RDQUAD 317 007455 4313 JMS RDQUAD 318 007456 4313 JMS RDQUAD /SKIP CONTROL WORDS 319 007457 0241 AND K77 320 007460 1216 TAD K7700 /TACK 7700 ONTO CHECKSUM. 321 007461 3356 DCA CHKSUM /CHECKSUM ONLY LOW 6 BITS ANYWAY 322 007462 4313 RDLP, JMS RDQUAD 323 007463 4320 JMS EQUFUN /COMPUT CHECKSUM AS WE GO 324 007464 3760 DCA I XBUFF /IT GETS CONDENSED LATER 325 007465 2360 ISZ XBUFF 326 007466 0300 C300, 300 /PROTECTION 327 007467 2357 ISZ WORDS /DONE THIS OP? 328 007470 5262 JMP RDLP /NO SUCH LUCK 329 007471 1353 TAD XFUNCT /IF OP WAS FOR WDSBLK-1, READ AND 330 007472 7112 CLL RTR /CHECKSUM THE LAST TAPE WORD 331 007473 7620 SNL CLA 332 007474 5277 JMP RDLP2 333 007475 4313 JMS RDQUAD /NOT NEEDED FOR WDSBLK/BLOCK 334 007476 4320 JMS EQUFUN /CHECKSUM IT 335 007477 4313 RDLP2, JMS RDQUAD /READ CHECKSUM 336 007500 0216 AND K7700 337 007501 4320 JMS EQUFUN 338 007502 4335 JMS GETCHK /GET SIX BIT CHECKSUM 339 007503 5752 JMP I CRWCOM 340 341 007504 0000 WRQUAD, 0 /WRITE OUT A 12 BIT WORD 342 007505 4320 JMS EQUFUN /ADD THIS TO CHECKSUM 343 007506 6773 SDSQ /SKIP ON QUADLINE FLAG 344 007507 5306 JMP .-1 345 007510 6775 SDLD /LOAD DATA ONTO BUS 346 007511 7200 CLA /SDLD DOESN'T CLEAR AC 347 007512 5704 JMP I WRQUAD 348 349 007513 0000 RDQUAD, 0 /READ A 12 BIT WORD 350 007514 6773 SDSQ 351 007515 5314 JMP .-1 352 007516 6777 SDRD /READ DATA 353 007517 5713 JMP I RDQUAD 354 355 356 007520 0000 EQUFUN, 0 /COMPUTE EQUIVALENCE CHECKSUM 357 007521 7040 CMA 358 007522 3362 DCA EQUTMP /ACTUALLY CHECKSUMS ON DECTAPE ARE 359 007523 1362 TAD EQUTMP /EQUIVALENCE OF ALL WORDS IN A RECORD 360 007524 0356 AND CHKSUM /SIX BITS AT A TIME. BUT SINCE EQUIVALENCE 361 007525 7041 CIA /IS ASSOCIATIVE, WE CAN DO IT 12 362 007526 7104 CLL RAL /BITS AT A TIME AND CONDENSE LATER. 363 007527 1362 TAD EQUTMP /THIS ROUTINE USES THESE IDENTITIES: 364 007530 1356 TAD CHKSUM /A+B=(A.XOR.B)+2*(A.AND.B) 365 007531 3356 DCA CHKSUM /A.EQU.B=.NOT.(A.XOR.B)=A.XOR.(.NOT.B) 366 007532 1362 TAD EQUTMP /A.EQU.B=(A+(.NOT.B))-2*(A.AND.(.NOT.B)) 367 007533 7040 CMA 368 007534 5720 JMP I EQUFUN 369 370 007535 0000 GETCHK, 0 /FORM 6 BIT CHECKSUM 371 007536 7200 CLA 372 007537 1356 TAD CHKSUM 373 007540 7040 CMA 374 007541 7106 CLL RTL 375 007542 7006 RTL 376 007543 7006 RTL 377 007544 4320 JMS EQUFUN 378 007545 7320 CLA CLL CML /FORCES LINK ON AT RWCOM 379 007546 1356 TAD CHKSUM 380 007547 0216 AND K7700 381 007550 5735 JMP I GETCHK 382 383 007551 7347 CFATAL, FATAL 384 007552 7263 CRWCOM, RWCOM 385 007553 0000 XFUNCT, 0 386 007554 7746 CM32, -32 387 007555 1400 C1400, 1400 388 007556 0000 CHKSUM, 0 389 007557 0000 WORDS, 0 390 007560 0000 XBUFF, 0 391 007561 0000 XWCT, 0 392 007562 0000 EQUTMP, 0 393 394 $$$$$$$$$$$ AFIELD 0000 BLOCK 7204 BUFF 7357 C100 7366 C1000 7203 C1400 7555 C3 7375 C300 7466 C374 7241 C6203 7354 C70 7374 C7600 7426 unreferenced CFATAL 7551 CHKSUM 7556 CM200 7307 CM32 7554 CRDQUD 7355 CRWCOM 7552 CXFUN 7362 CXWCT 7365 DRIVE 0010 DTA0 7200 DTA1 7204 DTA1X 7210 ENDZ 7335 EQUFUN 7520 EQUTMP 7562 EXIT 7345 FATAL 7347 FOUND 7370 GETCHK 7535 GO 7301 K77 7441 K7700 7416 LEAVE 7352 M110 7333 M20 7363 MFIELD 0000 MWORDS 7360 ORIGIN 7200 PGCT 7364 RDLP 7462 RDLP2 7477 RDQUAD 7513 READ 7454 REVGRD 7406 RWCOM 7263 SDLC 6774 SDLD 6775 SDRC 6776 SDRD 6777 SDSQ 6773 SDSS 6771 SDST 6772 SRCH 7310 TRY3 7341 TRYCNT 7367 UNIT 7361 WCOUNT 7356 WDSBLK 0201 WORDS 7557 WRITE 7420 unreferenced WRLP 7436 WRQUAD 7504 XBUFF 7560 XFIELD 7377 XFUNCT 7553 XUNIT 7520 XWCT 7561