Add README.md
[pdp8.git] / sw / os8 / v3d / sources / system / dectapes / dectape3 / TDCOPY.PA
1 /TD8E DECTAPE COPY, V4
2 /
3 /
4 /
5 /
6 /
7 /
8 //
9 /
10 /
11 /
12 /
13 /COPYRIGHT (C) 1972, 1975
14 /DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
15 /
16 /
17 /
18 /THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A
19 /SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLU-
20 /SION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANT OTHER
21 /COPIES THEREOF, MAY NOT BR PROVIDED OR OTHERWISE MADE AVAILABLE
22 /TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO
23 /AGREES TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE
24 /SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC.
25 /
26 /
27 /THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT
28 /NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL
29 /EQUIPMRNT COROPATION.
30 /
31 /DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS
32 /SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.
33 /
34 /
35 /
36 /
37 /
38 /
39 \f
40
41
42 /DEFINITIONS FOR PAL8 AND PAL10
43
44 BSW=7002
45 MQL=7421
46 MQA=7501
47 CAM=7621
48 SWP=7521
49 ACL=7701
50 CAF=6007
51 CDI=6203
52 KCF=6030
53 SDSS=6771
54 SDST=6772
55 SDSQ=6773
56 SDLC=6774
57 SDLD=6775
58 SDRC=6776
59 SDRD=6777
60 FIXTAB
61
62
63 HALT=HLT
64
65
66 /UNIT NUMBER DEFINITIONS FOR TD8E IOT'S
67
68 UNIT01=0770
69 UNIT23=0760
70 UNIT45=0750
71 UNIT67=0740
72
73 \f
74
75 LIMIT=7600
76
77 *11
78
79 X11, 0
80 X12, 0
81
82 /PAGE 0 CONSTANTS AND VARIABLES
83
84 *20
85 INPUT, 0 /INPUT UNIT CONSTANT
86 OUTPUT, 0 /OUTPUT UNIT CONSTANTS
87 0
88 0
89 0
90 0
91 0
92 0
93 OCOUNT, 0 /NUMBER OF OUTPUT UNITS SPECIFIED
94 OPOINT, 0
95 LIST, OUTPUT-1
96 OUTNUM, 0
97 IBLOCK, 0 /STARTING INPUT BLOCK
98 OBLOCK, 0 /STARTING OUTPUT BLOCK
99 NUMBER, 0 /NUMBER OF BLOCKS TO TRANSFER
100 FIELDS, 0 /-(HIGHEST FIELD AVAILABLE)
101 COUNT, 0 /TEMPORARY COUNTERS
102 COUNT1, 0 / "
103 COUNT2, 0 / "
104 COUNT3, 0 / "
105 COUNT4, 0 / "
106 UNIT, 0 /UNIT CONSTANT--THIS TRANSFER
107 VERF, 0 /VERIFY SWITCH (1=YES,0=NO)
108 WDCNT, 0 /-(NUMBER OF WORDS PER BLOCK)
109 RW, 0 /READ/WRITE BIT--THIS TRANSFER
110 FLD0, 0 /# OF BLOCKS IN FIELD 0 BUFFER
111 FLDN, 0 /# OF BLOCKS IN FIELD N BUFFER
112 BUF0, 0 /START OF FIELD 0 BUFFER
113 BUFN, 0 /START OF FIELD N BUFFER
114 XNUMB, 0 /# OF BLOCKS LEFT TO TRANSFER
115 BLOCKN, 0 /STARTING BLOCK NUMBER--THIS TRANSFER
116 NUMB1, 0
117 NUMB2, 0
118 VB, 0
119 END0, 0 /BEGINNING OF FIELD 0 VERIFY BUFFER
120 ENTRY, 0 /ENTRY TO TD8E HANDLER
121 INB, 0
122 OUTB, 0
123 OHOLD, 0
124 \f
125 MESSG1, TEXT @TD8E COPY V4A@
126 MESSG3, TEXT @ 12-BIT WORDS PER BLOCK@
127 \f
128 *200
129
130 START, TLS
131 JMS CRLF
132 JMS I [MESSGE
133 MESSG1 /@TD8E COPY@
134 JMS CRLF
135 DCA COUNT
136 JMP I [END /ONCE ONLY CODE FOR MULTIPLE FIELD TEST
137 START1, JMS QUEST
138 MESSG4 /@FROM UNIT:@
139 SWP
140 JMS UNITNO /MAKE UNIT NUMBER CONSTANT
141 DCA INPUT
142 TAD LIST
143 DCA OPOINT
144 SKP
145 AGAIN, JMS ERR4 /*ILLEGAL RESPONSE*
146 DCA OCOUNT
147 DCA COUNT
148 JMS I [MESSGE
149 MESSG5 /@TO UNITS:@
150 MORE2, JMS I [ANSWER
151 JMP AGAIN
152 ACL
153 JMS UNITNO /MAKE UNIT NUMBER CONSTANT
154 MQL /STORE IN MQ
155 MQA /RESTORE TO AC
156 CIA
157 TAD INPUT
158 SNA CLA /IS OUTPUT UNIT = INPUT UNIT ?
159 JMP MORE2+1 /YES--ERROR
160 ISZ OPOINT
161 ISZ OCOUNT /COUNT ONE MORE OUTPUT UNIT
162 TAD OCOUNT
163 TAD [-10
164 SPA CLA /WERE MORE THAN 7 UNITS SPECIFIED?
165 JMP .+3
166 JMS CRLF /YES--CARRIAGE RETURN
167 JMP OALL /IGNORE EXTRA ONE
168 SWP /NO--
169 DCA I OPOINT /STORE UNIT CONSTANT IN LIST
170 TAD COUNT
171 CIA
172 TAD OCOUNT
173 SPA SNA CLA /ALL UNITS IN?
174 JMP MORE2 /YES
175 \f
176 OALL, DCA COUNT
177 JMS I [MESSGE
178 MESSG6 /@FIRST INPUT BLOCK:@
179 JMS I [ANSWER
180 JMP WHOLE /COPY WHOLE TAPE
181 TAD COUNT
182 SNA CLA /WERE TOO MANY SPECIFIED?
183 JMP .+5
184 JMS I [MESSGE /YES
185 ERROR4 /@ILLEGAL RESPONSE@
186 JMS CRLF
187 JMP OALL /REPEAT THE QUESTION
188 ACL /NO
189 DCA IBLOCK /STORE
190 JMS QUEST
191 MESSG7 /@FIRST OUTPUT BLOCK:@
192 ACL
193 DCA OBLOCK
194 JMS QUEST
195 MESSG8 /@NUMBER OF BLOCKS TO COPY:@
196 ACL
197 SNA /WERE 0 BLOCKS SPECIFIED?
198 JMP QUEST1 /YES--REPEAT QUESTION
199 DCA NUMBER
200 JMP .+4
201 WHOLE, DCA IBLOCK
202 DCA OBLOCK
203 DCA NUMBER /0 MEANS WHOLE TAPE
204 JMS QUEST
205 MESSG9 /@VERIFY OUTPUT (YES=1,NO=0):@
206 ACL
207 AND [7
208 DCA VERF
209 JMP I (SETUP
210 \f
211 /OUTPUT CARRIAGE RETURN/LINE FEED
212
213 CRLF, 0
214 TAD (215
215 JMS I [TYPE
216 TAD [212
217 JMS I [TYPE
218 JMP I CRLF /--RETURN--
219
220 ERR4, 0
221 JMS I [MESSGE
222 ERROR4 /@ILLEGAL RESPONSE@
223 JMS CRLF /OUTPUT CARRIAGE RETURN/LINE FEED
224 TAD [-4
225 TAD ERR4
226 DCA ERR4
227 DCA COUNT
228 JMP I ERR4 /--RETURN--
229
230 \f
231 QUEST, 0
232 TAD I QUEST
233 DCA MNUM
234 ISZ QUEST
235 JMS I [MESSGE
236 MNUM, 0
237 JMS I [ANSWER
238 QUEST1, JMS ERR4
239 TAD COUNT
240 SZA CLA
241 JMP QUEST1
242 JMP I QUEST /--RETURN--
243
244
245 /CONVERT UNIT NUMBER TO A WORD OF THE FORM
246 /000 XXX XXX 000 OR
247 /100 XXX XXX 000
248 /WHERE XY0 IS THE THIRD DIGIT OF THE IOT
249 /AND 0 OR 1 REFLECTS THE TD8E UNIT NUMBER
250 /ENTER WITH THE UNIT NUMBER IN THE AC
251 /EXIT WITH SPECIAL CODE IN AC
252
253 UNITNO, 0
254 AND [7 /MASK OUT ALL EXTRANEOUS BITS
255 CLL RAR /SAVE 0/1 BIT IN LINK
256 MQL /STORE ROTATED WORD, CLEAR AC
257 RAR
258 SWP /PRESERVE 0/1 BIT IN MQ
259 TAD TABX /GET DEVICE NUMBER CORRECTLY
260 DCA CRLF
261 TAD I CRLF
262 MQA /OR IN 0/1 BIT
263 JMP I UNITNO /--RETURN--
264
265 TABX, UNITS
266
267 /SKIP 4 LINES AND FETCH MARK TRACK
268
269 SKIPQ, 0
270 IOTR5, SDSQ
271 JMP .-1
272 IOTR6, SDRC
273 JMP I SKIPQ /--RETURN--
274 \f
275 *400
276
277 /USER RESPONSE HANDLER
278 /USES MQ FOR TEMPORARY STORAGE
279 /EXIT WITH RESPONSE IN MQ
280 /EXIT TO CALL+1 IF JUST CARRIAGE RETURN
281 /OR ILLEGAL CHARACTER, CARRIAGE RETURN
282 /OR ;,CARRIAGE RETURN
283 /EXIT TO CALL+2 IF GOOD DATA, CARRIAGE RETURN
284 /INCREMENT COUNT AND EXIT TO CALL+2 IF GOOD DATA;
285 /ILLEGAL CHARACTERS CAUSE WHOLE ANSWER TO BE IGNORED
286 /AND EXIT TO CALL+1
287
288 ANSWER, 0
289 CAM /CLEAR AC AND MQ
290 TAD CLEAR
291 DCA SWITCH
292 MORE, JMS LISTEN /FETCH A CHARACTER
293 TAD (-215
294 SZA /IS IT A CARRIAGE RETURN?
295 JMP .+5 /NO
296 TAD [212 /YES--OUTPUT LINE FEED
297 JMS TYPE
298 SWITCH, NOP /SET UP EXIT ADDRESS
299 JMP I ANSWER /--RETURN--
300 TAD (215-260
301 SPA /IS CHARACTER LESS THAN 260?
302 JMP BAD /YES--ILLEGAL CHARACTER
303 TAD [260-270 /NO
304 SMA /IS IT MORE THAN 269?
305 JMP SEMI /YES--CHECK FOR SEMICOLON
306 TAD (270 /RESTORE CHARACTER
307 AND [7 /MASK OUT EXTRANEOUS BITS
308 CLL
309 SWP
310 AND (777 /MASK OUT FIRST DIGIT IF THERE ARE 4
311 RAL /ROTATE 3 LEFT
312 RTL
313 MQA /FETCH NEW CHARACTER
314 MQL /STORE RESULT IN MQ
315 TAD SKIP /SET UP TO SKIP ON RETURN
316 DCA SWITCH
317 JMP MORE /FETCH ANOTHER
318
319 \f
320 CLEAR, NOP
321 SKIP, ISZ ANSWER
322
323 BAD, CLA /ILLEGAL CHARACTER
324 JMS I [CRLF
325 JMP I ANSWER /--RETURN--
326
327
328 /TEST FOR SEMICOLON
329
330 SEMI, TAD (270-273
331 SZA CLA /IS CHARACTER A SEMICOLON?
332 JMP BAD /NO--ILLEGAL CHARACTER
333 ISZ COUNT /YES--INCREMENT COUNTER
334 JMP SWITCH /EXIT FROM ANSWER ROUTINE
335
336
337 /TELETYPE INPUT AND ECHO HANDLER
338
339 LISTEN, 0
340 KSF
341 JMP .-1
342 JMS I [PARITY
343 TLS /ECHO CHARACTER
344 JMS CHECK /CHECK FOR CTRL/C AND CTRL/S
345 JMP I LISTEN /--RETURN--
346
347 /CHECK FOR CTRL/C AND CTRL/S
348 /ENTER WITH INPUT CHARACTER IN AC
349 /EXIT TO HANDLER OR WITH CHARACTER IN AC
350
351 CHECK, 0
352 TAD (-203
353 SNA /IS IT CTRL/C?
354 JMP I CTRLC /YES--HANDLE IT
355 TAD (203-223
356 SNA /IS IT CTRL/S?
357 JMP I [REPEAT /YES--HANDLE IT
358 TAD (223 /RESTORE CHARACTER
359 JMP I CHECK /--RETURN--
360
361 CTRLC, LIMIT
362 \f
363 /MESSAGE OUTPUT HANDLER
364
365 /EXPECTS MESSAGE ADDRESS TO BE IN LOCATION AFTER CALL
366 /EXITS TO CALL+2
367
368 MESSGE, 0
369 TAD I MESSGE
370 DCA FINDER /SET UP POINTER
371 ISZ MESSGE
372 DCA LOC /SET L/R SWITCH TO L (EVEN)
373 LNEXT, TAD I FINDER /GET WORD
374 BSW
375 RHALF, AND [77
376 SNA /IS CHARACTER 0 (TERMINATOR)?
377 JMP I MESSGE /YES--RETURN--
378 DCA CHAR
379 TAD CHAR
380 AND (40
381 SNA CLA /IS IT A LETTER?
382 TAD [100 /YES--301-337
383 TAD [200 /NO--240-277
384 TAD CHAR /RESTORE CHARACTER
385 JMS TYPE /OUTPUT IT
386 ISZ LOC
387 TAD LOC
388 RAR
389 SZL CLA /WHICH HALF WAS THAT?
390 JMP .+3
391 ISZ FINDER /RIGHT
392 JMP LNEXT
393 TAD I FINDER /LEFT
394 JMP RHALF
395 FINDER, 0
396 LOC, 0
397 CHAR, 0
398
399
400 /TELETYPE OUTPUT ROUTINE
401
402
403 TYPE, 0
404 TSF
405 JMP .-1
406 TLS
407 CLA
408 JMP I TYPE /--RETURN--
409
410 \f
411 /INSERT IOT'S ACCORDING TO TABLES
412 /UNIT CONTAINS APPROPRIATE UNIT CODE
413 /COUNT CONTAINS -(NUMBER OF IOT'S TO TRANSFER)
414 /COUNT1 CONTAINS ADDRESS OF ADDRESS TABLE
415 /UNIT CONTAINS UNIT CODE OF CURRENT UNIT
416
417 INSERT, 0
418 TAD I COUNT1
419 DCA COUNT3
420 TAD UNIT
421 MQL
422 TAD I COUNT3 /MAKE NEW IOT
423 AND (7007
424 MQA
425 CIA
426 TAD I COUNT3 /COMPARE WITH IOT FROM PROGRAM
427 SNA CLA /ARE THE IOT'S THE SAME AS THE LAST UNIT?
428 JMP I INSERT /YES--RETURN--
429 INS1, TAD I COUNT1
430 DCA COUNT3
431 TAD I COUNT3 /GET IOT FROM PROGRAM
432 AND (7007 /RETAIN ONLY SIGNIFICANT BITS
433 MQA /OR IN UNIT NUMBER
434 DCA I COUNT3 /PUT IT IN PROGRAM
435 ISZ COUNT1 /BUMP COUNTERS
436 ISZ COUNT /DONE YET?
437 JMP INS1 /NO
438 JMP I INSERT /YES--RETURN--
439
440
441 PAGE
442 \f
443 /COUNT THE NUMBER OF WORDS PER BLOCK
444 /PLACE IT IN MWORDS
445 /BE SURE ALL TAPES MATCH INPUT FORMAT
446
447 SETUP, TAD LIST
448 DCA OPOINT /SET POINTER TO I/O LIST
449 DCA COUNT2 /CLEAR COUNTER
450 TAD OCOUNT
451 CMA
452 DCA OUTNUM /SET # OF UNITS
453 SET4, TAD (TABLE1-END1-1 /SET UP COUNTERS FOR IOT FIX
454 DCA COUNT
455 TAD (TABLE1
456 DCA COUNT1
457 TAD I OPOINT
458 DCA UNIT
459 JMS I [INSERT /PUT THE PROPER IOT'S IN THE FOLLOWING ROUTINE
460 DCA WDCNT /CLEAR WORD COUNT
461 TAD UNIT
462 AND [4000
463 TAD (2000
464 IOTX7, SDLC
465 CLA
466 IOTX8, SDRC
467 RTL
468 SZL /DOES UNIT EXIST?
469 JMP .+3 /YES
470 SELERR, JMS I [ERR3 /@SELECT ERROR UNIT N@
471 JMP SETUP
472 AND (400
473 SZA CLA /TURNED ON?
474 JMP SELERR /NO
475 TAD UNIT /GET 0 OR 1 UNIT BIT (0 OR 4000)
476 AND [4000
477 TAD [1000 /GET GO BIT
478 IOTX1, SDLC /START READING FORWARD
479 JMS SKIP4 /SKIP 8 LINES TO AVOID GARBAGE
480 JMS SKIP4
481 IOTX3, SDSS /LOOK FOR FORWARD BLOCK NUMBER (26)
482 JMP .-1
483 IOTX4, SDRC
484 AND [77
485 TAD (-26
486 SZA CLA /FOUND YET?
487 JMP IOTX3 /NO--KEEP LOOKING
488 \f
489 SET2, JMS SKIP4 /YES--START COUNTING LINES BY FOURS
490 ISZ WDCNT
491 NOP
492 AND [77
493 TAD (-51
494 SZA CLA /FOUND GUARD YET?
495 JMP SET2 /NO
496 TAD UNIT /YES
497 AND [4000
498 IOTX2, SDLC /STOP UNIT
499 CLA
500 TAD COUNT2
501 SZA /IS THIS THE INPUT UNIT?
502 JMP SET5 /NO
503 TAD (-11 /YES--SAVE THE COUNT
504 TAD WDCNT
505 CIA
506 DCA COUNT2
507 JMP SET3 /FIRST OUTPUT UNIT
508 SET5, TAD (-11 /NOT INPUT UNIT
509 TAD WDCNT
510 SZA CLA /SAME NUMBER OF WORDS AS INPUT UNIT?
511 JMP ERR5 /NO*ILLEGAL FORMAT*
512 SET3, ISZ OPOINT /NEXT UNIT
513 ISZ OUTNUM /DONE YET?
514 JMP SET4 /NO
515 TAD COUNT2 /YES--PRINT MESSAGE
516 DCA I [MWORDS /SET UP NUMBER OF WORDS PER BLOCK
517 TAD I [MWORDS
518 CIA
519 JMS I [PRINT /PRINT 4 DIGIT NUMBER OF BLOCKS
520 JMS I [MESSGE /YES--PRINT REST OF MESSAGE
521 MESSG3
522 JMS I [CRLF
523 \f
524 /IF WHOLE TAPE IS TO BE COPIED, IT IS NECESSARY TO
525 /COMPUTE THE NUMBER OF BLOCKS ON THE TAPE (NB)
526 /USING THE NUMBER OF WORDS PER BLOCK (WB)
527 /AND THE FORMULA:
528 /OCTAL: NB=[63 6160/(WB+17)]+2
529 /DECIMAL: NB=[212,080/(WB+15)]+2
530
531 TAD NUMBER
532 SZA CLA /COPY WHOLE TAPE?
533 JMP VERFQ /NO--
534 DCA COUNT /YES--COMPUTE NUMBER OF BLOCKS ON TAPE
535 TAD I [MWORDS
536 CIA
537 TAD (17
538 DCA COUNT1 /GET NUMBER OF WORDS PER BLOCK+17
539 TAD (-64
540 DCA COUNT2
541 TAD (-6160
542 SUB, CLL
543 TAD COUNT1
544 ISZ COUNT /COUNT A BLOCK--TOO MANY?
545 SKP /NO
546 JMP ERR5 /YES--ERROR
547 SZL
548 ISZ COUNT2
549 JMP SUB
550 CLA CLL
551 TAD COUNT /COUNT IS [63 6160/WB+17]+1
552 IAC /ADD 1 MORE
553 DCA NUMBER /STORE AS # OF BLOCKS TO TRANSFER
554 JMP I .+1
555 VERFQ
556
557 ERR5, CLA
558 JMS I [MESSGE
559 ERROR5 /*ILLEGAL FORMAT UNIT*
560 JMS I [DECODE /PRINT UNIT NUMBER
561 JMS I [CTRLR /WAIT FOR CTRL/R
562 JMS I [CRLF /CARRIAGE RETURN/LINE FEED
563 JMP SETUP /TRY AGAIN
564
565
566
567
568 /READ FOUR LINES AND FETCH MARK TRACK
569
570 SKIP4, 0
571 IOTX5, SDSQ
572 JMP .-1
573 IOTX6, SDRC
574 JMP I SKIP4 /--RETURN--
575
576
577
578 \f
579 PAGE
580
581 /IS TAPE TO BE VERIFIED?
582 /SET UP DEPENDING ON RESPONSE
583 VERFQ, TAD VERF
584 SZA CLA /VERIFY?
585 JMP YES /YES--
586 TAD (NOP /NO--
587 DCA I VERF1A
588 TAD (OUTN
589 DCA I VERF2A
590 JMP CONT
591 YES, TAD (RAR
592 DCA I VERF1A
593 TAD (VERIFY
594 DCA I VERF2A
595 CONT, JMP I .+1
596 DOIT
597
598 VERF1A, VERF1
599 VERF2A, VERF2
600
601 /WAIT FOR CTRL/R
602
603 CTRLR, 0
604 JMS I [LISTEN /FETCH CHARACTER
605 TAD [-222
606 SZA CLA /IT IT CTRL/R?
607 JMP .-3 /NO--WAIT FOR ONE
608 JMS I [CRLF /CARRIAGE RETURN/LINE FEED
609 JMP I CTRLR /--RETURN--
610
611
612 REPEAT, DCA COUNT
613 JMS I [CRLF
614 JMS I [QUEST /@REPEAT (YES=1;NO=0):@
615 MESS11
616 ACL
617 AND [7
618 SZA CLA
619 JMP I [CLEAN /YES
620 JMP I [START+4 /NO--RESTART
621 \f
622 MESSG6, TEXT @FIRST INPUT BLOCK:@
623 MESSG7, TEXT @FIRST OUTPUT BLOCK:@
624 MESSG8, TEXT @NUMBER OF BLOCKS TO COPY:@
625 MESSG9, TEXT @VERIFY OUTPUT (YES=1,NO=0):@
626 MESS10, TEXT @DONE@
627 MESS11, TEXT @REPEAT (YES=1,NO=0):@
628 ERROR1, TEXT @VERIFY ERROR BLOCK @
629 ERROR2, TEXT @TAPE ERROR BLOCK @
630 ERROR3, TEXT @SELECT ERROR UNIT @
631 \f
632 PAGE
633
634 /SETUP FOR ACTUAL READ/WRITE/VERIFY OPERATION
635 DOIT, TAD [LIMIT-END /SET UP NUMBER OF BLOCKS
636 JMS DIV1 /IN FIELD 0 BUFFER
637 DCA FLD0
638 TAD M200
639 JMS DIV1 /AND IN FIELD N BUFFERS
640 DCA FLDN
641 TAD IBLOCK /SET UP RUNNING COUNTERS AND POINTERS
642 DCA INB /FOR NEXT INPUT BLOCK
643 TAD OBLOCK
644 DCA OUTB /FOR NEXT OUTPUT BLOCK
645 TAD NUMBER
646 DCA NUMB1 /FOR NUMBER OF BLOCKS LEFT TO TRANSFER
647 JMP .+4
648 ALLDUN, TAD XNUMB
649 SNA CLA /DONE WITH ALL BLOCKS YET?
650 JMP REWIND /YES
651 /READ---
652 READX, TAD LIST /NO--SET UP POINTER TO OUTPUT UNITS
653 DCA OPOINT
654 TAD OCOUNT
655 CMA
656 DCA OUTNUM
657 TAD INB
658 DCA BLOCKN
659 TAD NUMB1 /SET POINTERS FOR TRANSFER
660 DCA XNUMB
661 TAD NUMB1
662 DCA NUMB2 /SAVE COUNTER FOR WRITE
663 TAD INPUT /SELECT INPUT UNIT
664 DCA UNIT
665 DCA RW /SET R/W BIT TO READ
666 \f
667 TAD [END /SET START OF BUFFERS IN CASE
668 DCA BUF0 /THEY WERE CHANGED BY VERIFY
669 DCA BUFN
670 JMS I [READY /FILL THE BUFFERS
671 TAD XNUMB /SAVE THE POINTERS
672 DCA NUMB1
673 TAD BLOCKN
674 DCA INB
675
676 OUTN, ISZ OPOINT
677 ISZ OUTNUM /DONE WITH ALL UNITS YET?
678 JMP .+4 /NO--CONTINUE WRITING
679 TAD OHOLD /YES
680 DCA OUTB
681 JMP ALLDUN /READ ANOTHER BUFFER LOAD
682 WRITEX, TAD OUTB
683 DCA OHOLD
684 TAD OHOLD /WRITE
685 DCA BLOCKN /RESET POINTERS
686 TAD OUTB
687 DCA VB /SAVE COUNTER FOR VERIFY
688 TAD NUMB2
689 DCA XNUMB
690 TAD I OPOINT /SELECT OUTPUT UNIT
691 DCA UNIT
692 CLA CLL CML RAR /AC=4000
693 DCA RW /SET R/W BIT TO WRITE
694 JMS I [READY
695 TAD BLOCKN
696 DCA OHOLD
697 JMP I .+1
698 VERF2, VERIFY
699
700
701 \f
702 /SEE HOW MANY BLOCKS WILL FIT INTO BUFFER
703 /ENTER WITH BUFFER SIZE IN AC
704 /EXIT WITH # OF BLOCKS IN AC
705
706 DIV1, 0
707 DCA COUNT1
708 DCA COUNT
709 TAD COUNT1 /TOTAL WORDS
710 DIV2, CLL
711 TAD I [MWORDS /-NUMBER OF WORDS PER BLOCK
712 SNL /RUN OUT OF ROOM?
713 JMP .+3 /YES--
714 ISZ COUNT /NO--COUNT A BLOCK
715 JMP DIV2
716 CLA CLL /IGNORE LESS THAN A BLOCK LEFT
717 TAD COUNT
718 VERF1, RAR /DIVIDE BY 2 IF VERIFY (NOP IF NO VERIFY)
719 JMP I DIV1 /--RETURN--
720
721 /END OF OPERATION
722 /REWIND TAPES TO INITIAL END ZONE
723
724 REWIND, TAD OCOUNT
725 CMA
726 DCA COUNT2 /SET NUMBER OF TAPES STILL SPINNING
727 RLIST, CLA CMA
728 TAD LIST
729 DCA OPOINT /SET POINTER TO UNIT LIST
730 TAD OCOUNT
731 IAC
732 CMA
733 DCA OUTNUM /SET NUMBER OF UNITS IN LIST
734 RUNIT, JMS I [PARITY
735 JMS I [CHECK /CHECK TTY FOR CTRL/S OR CTRL/C
736 ISZ OUTNUM /DONE WITH WHOLE LIST YET?
737 SKP CLA /NO
738 JMP RLIST /YES--START THROUGH LIST AGAIN
739 ISZ OPOINT
740 TAD I OPOINT /GET UNIT CODE
741 RTL
742 SZL CLA /STILL SPINNING?
743 JMP RUNIT /NO--TRY NEXT TAPE
744 TAD I OPOINT /YES
745 DCA UNIT
746 \f
747
748 TAD [-6
749 DCA COUNT
750 TAD [RTAB
751 DCA COUNT1
752 JMS I [INSERT /PUT PROPER IOT'S IN THIS ROUTINE
753 TAD I OPOINT
754 AND [4000 /UNIT/READ
755 TAD [3000 /REVERSE/GO
756 IOTR1, SDLC
757 JMS I [SKIPQ
758 JMS I [SKIPQ /WAIT FOR DRIVE TO GET UP TO SPEED
759 IOTR2, SDSS
760 JMP .-1
761 IOTR3, SDRC /GET MARK TRACK BITS
762 AND [77
763 TAD [-22
764 SZA CLA /END ZONE?
765 JMP RUNIT /NO--NEXT UNIT
766 CLA CLL CML RTR /AC=2000
767 MQA /UNIT CODE STILL IN MQ FROM INSERT
768 DCA I OPOINT /SET STOPPED BIT
769 TAD I OPOINT
770 AND [6000
771 IOTR4, SDLC /STOP UNIT
772 M200, 7600 /CLA
773 ISZ COUNT2 /ALL TAPES STOPPED?
774 JMP RUNIT /NO--NEXT UNIT
775 JMS I [MESSGE /YES
776 MESS10 /@DONE@
777 JMP I [REPEAT
778
779 \f
780
781 PAGE
782
783 /VERIFICATION ROUTINES
784
785 VERIFY, TAD VB /SET POINTERS AND COUNTERS FOR TRANSFER
786 DCA BLOCKN
787 TAD NUMB2
788 DCA XNUMB
789 DCA RW
790 TAD END0 /SET BEGINNINGS OF VERIFY BUFFERS
791 DCA BUF0
792 TAD (3700
793 DCA BUFN
794 TAD CDF0
795 DCA COMP2
796 JMS I [READY /READ VERIFY BUFFERS FULL
797 TAD COUNT1 /GET # OF BLOCKS IN LAST BUFFER FILLED
798 DCA COUNT3
799 CMA /SET AUTOINDEX POINTERS TO BUFFERS
800 TAD [END
801 DCA X11
802 CMA CLL
803 TAD END0
804 DCA X12
805 TAD COUNT
806 CMA
807 TAD FIELDS
808 DCA COUNT /SET NUMBER OF FIELDS WHICH WERE FILLED
809 JMS COMP4 /GET NUMBER OF BLOCKS
810 TAD FLD0
811 CIA
812 DCA COUNT4 /SET COUNTER
813 JMS COMP /COMPARE THE BUFFERS
814 \f
815 COMP3, TAD COUNT
816 SNA CLA
817 JMP I [OUTN
818 JMS COMP4 /GET NUMBER OF BLOCKS
819 TAD FLDN
820 CIA
821 DCA COUNT4
822 TAD COMP2 /EACH FIELD------
823 TAD (10
824 DCA COMP2 /SET CDF INSTRUCTION PROPERLY
825 CMA CLL /SET AUTOINDEX POINTERS TO BUFFERS
826 DCA X11
827 TAD (3677
828 DCA X12
829 JMS COMP
830 JMP COMP3 /DO THE NEXT FIELD
831
832
833 /ENTER WITH AC CLEAR
834 /EXIT TO CALL+1 WITH AC CLEAR IF
835 /NORMAL BUFFER FILL
836 /EXIT TO CALL+2 WITH # OF BLOCKS IN AC IF
837 /LAST BUFFER
838
839 COMP4, 0
840 ISZ COUNT /LAST FIELD FILLED?
841 JMP I COMP4 /NO--RETURN--
842 TAD XNUMB /YES--OUT OF BLOCKS?
843 SZA CLA
844 JMP I COMP4 /NO--RETURN--
845 TAD COUNT3 /YES--GET ACTUAL # OF BLOCKS
846 ISZ COMP4 /INCREMENT RETURN ADDRESS
847 JMP I COMP4 /--RETURN--
848
849 \f
850 /COMPARE PORTION OF VERIFY ROUTINE
851
852 COMP, 0
853 TAD I [MWORDS /SET NUMBER OF WORDS PER BLOCK COUNTER
854 DCA COUNT2
855 COMP2, HALT /SHOULD CONTAIN CDF N
856 TAD I X11 /GET CORRESPONDING WORDS FROM EACH BUFFER
857 CIA
858 TAD I X12
859 CDF0, CDF 0
860 SZA CLA /DO WORDS MATCH?
861 JMP ERR1 /NO--VERIFY ERROR
862 TRY, ISZ COUNT2 /DONE WITH BLOCK?
863 JMP COMP2 /NO--CONTINUE
864 ISZ COUNT4 /DONE WITH ALL BLOCKS?
865 JMP COMP+1 /NO
866 JMP I COMP /YES--RETURN--
867
868 ERR1, JMS I [MESSGE
869 ERROR1 /*VERIFY ERROR BLOCK *
870 TAD COUNT4 /GET CURRENT BLOCK NUMBER
871 CIA
872 TAD I (BLOCKS /FROM BLOCK THIS OPERATION STARTED WITH
873 JMS PRINT /PRINT 4 DIGIT BLOCK NUMBER
874 JMS I [MESSGE
875 ERROR6 /*UNIT *
876 JMS I [DECODE /PRINT UNIT NUMBER
877 WAIT, JMS I [LISTEN /WAIT FOR RESPONSE
878 DCA PRINT
879 JMS I [CRLF
880 TAD PRINT
881 TAD [-224
882 SNA /WAS IT CTRL/T?
883 JMP I [WRITEX /YES--TRY AGAIN
884 TAD [2
885 SZA CLA /WAS IT CTRL/R?
886 JMP WAIT /NO--WAIT FOR A GOOD RESPONSE
887 JMP TRY /YES--IGNORE AND CONTINUE
888
889 \f
890
891
892 /PRINT A 4 DIGIT OCTAL NUMBER
893 /ENTER WITH NUMBER IN AC
894
895 PRINT, 0
896 DCA I [MESSGE /TEMPORARY STORAGE
897 TAD [-4
898 DCA I [ANSWER /SET DIGIT COUNTER
899 TAD I [MESSGE
900 RAL
901 DCA I [CRLF
902 FOUR, TAD I [CRLF
903 RAL
904 RTL
905 DCA I [CRLF
906 TAD I [CRLF
907 AND [7
908 TAD [260
909 JMS I [TYPE /PRINT ONE DIGIT
910 ISZ I [ANSWER /DONE YET?
911 JMP FOUR /NO
912 JMP I PRINT /YES--RETURN--
913
914
915 /CLEAN UP UNIT TABLES AFTER REWIND
916
917 CLEAN, TAD LIST
918 DCA OPOINT
919 TAD OCOUNT
920 CMA
921 DCA OUTNUM /SET POINTER AND COUNTER
922 CLEAN1, TAD I OPOINT /GET UNIT CODE
923 AND (4770 /MASK OUT EXTRANEOUS BITS
924 DCA I OPOINT /REPLACE IT
925 ISZ OPOINT
926 ISZ OUTNUM /DONE YET?
927 JMP CLEAN1 /NO
928 JMP I [DOIT /YES--NEXT OPERATION
929
930
931
932 \f
933 PAGE
934
935 /FILL ALL N FIELDS ONCE
936 /ENTER WITH AC CLEAR
937 /# OF BLOCKS FOR FIELD 0 IN FLD0
938 /# OF BLOCKS FOR OTHERS IN FLDN
939 /ADDRESSES OF BUFFERS IN BUF0, BUFN
940 /R/W BIT (0 OR 4000) IN RW
941
942
943
944 READY, 0
945 TAD [IOTLOC-TABEND-1
946 DCA COUNT
947 TAD [IOTLOC
948 DCA COUNT1
949 JMS I [INSERT /PUT PROPER IOT'S IN HANDLER
950 TAD UNIT
951 SPA CLA /EVEN OR ODD UNIT NUMBER?
952 CLL IAC RTL /ODD
953 TAD [ORIGIN /EVEN
954 DCA ENTRY /SET UP ENTRY TO HANDLER
955 TAD RW
956 MQL /STORE UNIT BIT FOR LATER
957 CMA
958 TAD FIELDS /SET COUNTER FOR # OF FIELDS
959 DCA COUNT
960 CLL
961 TAD FLD0 /ADJUST NUMBER OF BLOCKS TO
962 JMS SUB1 /TRANSFER DEPENDING ON NUMBER
963 TAD FLD0 /LEFT TO BE TRANSFERRED
964 JMS SUB2 /RESET FUNCTION WORD
965 TAD BUF0 /SET UP BUFFER POINTERS
966 JMS SUB3
967 JMS TRANS /TRANSFER DATA--FIELD 0
968 ZOOM, ISZ COUNT /BEGINNING OF LOOP FOR EACH FIELD ABOVE 0
969 SKP /DONE YET?
970 JMP I READY /YES--RETURN--
971 \f
972 TAD FIELDS
973 CIA CLL
974 TAD COUNT
975 IAC
976 RAL
977 RTL /GET FIELD SETTING READY
978 MQL /STORE IN MQ
979 TAD FUNCTN /GET PREVIOUS FUNCTION WORD
980 AND [4000 /GET R/W BIT
981 MQA /OR IN FIELD SETTING
982 MQL /STORE
983 CLL
984 TAD FLDN /ADJUST NUMBER OF BLOCKS TO TRANSFER
985 JMS SUB1
986 TAD FLDN
987 JMS SUB2 /AND RESET FUNCTION WORD
988 TAD BUFN
989 JMS SUB3 /SET UP BUFFER POINTERS
990 JMS TRANS /TRANSFER DATA--FIELDS 1-N
991 JMP ZOOM /FILL ANOTHER FIELD
992
993 SUB1, 0
994 CIA
995 TAD XNUMB
996 CLL CML /SET LINK=1
997 SMA /ARE THERE LESS BLOCKS LEFT THAN A FIELD FULL?
998 DCA XNUMB /NO--REDUCE COUNT OF BLOCKS LEFT
999 JMP I SUB1 /YES-TRANSFER BLOCKS LEFT--RETURN--
1000
1001 SUB2, 0
1002 DCA COUNT1 /LINK=1 IF BLOCKS LEFT, 0 IF NONE
1003 SNL /DONE WITH ALL BLOCKS YET?
1004 DCA XNUMB /YES--BUMP SWITCH
1005 TAD COUNT1 /NO
1006 BSW
1007 MQA /PUT # OF BLOCKS INTO FUNCTION WORD
1008 DCA FUNCTN /START REVERSE
1009 JMP I SUB2 /--RETURN--
1010
1011 \f
1012 SUB3, 0
1013 DCA BUFADD
1014 TAD BLOCKN /SET STARTING BLOCK NUMBER
1015 DCA BLOCKS
1016 TAD COUNT1
1017 TAD BLOCKN
1018 DCA BLOCKN /RESET STARTING BLOCK FOR NEXT TIME
1019 JMP I SUB3 /--RETURN--
1020
1021
1022 /CALL TO THE HANDLER
1023
1024 TRANS, 0
1025 JMS I [PARITY /CHECK TELETYPE
1026 JMS I [CHECK /WAS ^C OR ^S TYPED?
1027 JMS I ENTRY
1028 FUNCTN, 0 /FUNCTION WORD
1029 BUFADD, 0 /BUFFER ADDRESS
1030 BLOCKS, 0 /STARTING BLOCK NUMBER
1031 JMP ERR /ERROR RETURN
1032 JMS I [PARITY /CHECK TELETYPE
1033 JMS I [CHECK /WAS ^C OR ^S TYPED?
1034 CLA
1035 TAD XNUMB
1036 SZA CLA /DONE YET?
1037 JMP I TRANS /NO--RETURN--
1038 ISZ COUNT
1039 JMP I READY /--RETURN--
1040 JMP I READY /--RETURN--
1041
1042 /TRANSFER ERROR HANDLER
1043
1044 ERR, SNA CLA /FATAL ERROR?
1045 JMP SELECT /NO
1046 JMS I [MESSGE /YES
1047 ERROR2 /*TAPE ERROR BLOCK *
1048 TAD I (BLOCK
1049 JMS I [PRINT /PRINT BLOCK NUMBER
1050 JMS I [MESSGE
1051 ERROR6 /*UNIT *
1052 JMS DECODE /PRINT UNIT NUMBER
1053 JMS I [CRLF
1054 JMP I [REWIND
1055 SELECT, JMS ERR3
1056 ISZ FUNCTN /TURN AROUND AND TRY AGAIN
1057 JMP FUNCTN-1
1058
1059 \f
1060 ERR3, 0
1061 JMS I [MESSGE
1062 ERROR3 /*SELECT ERROR UNIT *
1063 JMS DECODE /PRINT UNIT NUMBER
1064 JMS CTRLR /WAIT FOR CTRL/R
1065 JMP I ERR3 /--RETURN--
1066
1067
1068 /DECODE UNIT NUMBER FOR PRINTING
1069 /PRINT UNIT NUMBER BEFORE RETURNING
1070
1071 DECODE, 0
1072 CLL
1073 TAD UNIT
1074 RAL
1075 MQL /SAVE ROTATED CODE IN MQ
1076 RAL
1077 SWP /SAVE EVEN/ODD BIT IN MQ
1078 RAR /WORK ON IOT CODE
1079 RTR
1080 IAC
1081 CMA
1082 AND [7
1083 MQA /INCLUDE EVEN/ODD BIT
1084 TAD [260 /MAKE ASCII DIGIT
1085 JMS I [TYPE
1086 JMP I DECODE /--RETURN--
1087
1088
1089 PAGE
1090
1091 \f
1092 /TD8E DECTAPE HANDLER
1093
1094 /SLIGHTLY MODIFIED VERSION OF DEC-E8-UZTA-D
1095 /COPYRIGHT 1971 DIGITAL EQUIPMENT CORPORATION
1096 / MAYNARD, MASSACHUSETTS 01754
1097
1098 /THE CALLING SEQUENCE IS:
1099 / JMS ENTRY
1100 / FUNCTION WORD
1101 / BUFFER ADDRESS
1102 / STARTING BLOCK
1103 / ERROR RETURN
1104 / NORMAL RETURN (AC CLEAR)
1105
1106 /FUNCTION WORD:
1107 / BIT 0: 0=READ, 1=WRITE
1108 / BITS 1-5: # OF BLOCKS TO BE TRANSFERRED
1109 / BITS 6-8: FIELD OF BUFFER AREA
1110 / BITS 9-10: UNUSED
1111 / BIT 11: 1=START FORWARD, 0=START REVERSE
1112
1113 /ERRORS:
1114 /THE HANDLER DETECTS TWO TYPES OF ERRORS:
1115 /FATAL ERRORS:
1116 / PARITY ERROR
1117 / TIMING ERROR
1118 / TOO GREAT A BLOCK NUMBER
1119 /FATAL ERRORS TAKE ERROR RETURN WITH AC=4000
1120 /NON-FATAL ERROR:
1121 / SELECT ERROR (IMPROPER UNIT NUMBER OR NO UNIT NUMBER)
1122 /NON-FATAL ERROR TAKES ERROR RETURN WITH AC=0
1123 \fPAGE
1124
1125 MFIELD=0
1126 ORIGIN=.
1127
1128 DTA0, 0 /ENTRY POINT FROM UNIT 0
1129 CLA CLL /0 TO LINK
1130 JMP DTA1X
1131 C1000, 1000
1132 DTA1, 0 /UNIT 2 ENTRY
1133 CLA CLL CML /1 TO LINK
1134 TAD DTA1
1135 DCA DTA0 /PICK UP ARGS AT DTA0
1136 DTA1X, RAR
1137 DCA YUNIT /LINK TO UNIT POSITION
1138 RDF
1139 TAD C6203 /GET DATA FIELD AND SETUP RETURN
1140 DCA LEAVE
1141 TAD YUNIT /GET FUNCTION WORD
1142 IOT4, SDLC /PUT FUNCTION INTO DATA REGISTER
1143 TAD I DTA0
1144 IOT1, SDLD
1145 CLA
1146 TAD MWORDS
1147 DCA WCOUNT /STORE MASTER WORD COUNT
1148 ISZ DTA0 /TO BUFFER
1149 TAD I DTA0
1150 DCA BUFF
1151 ISZ DTA0 /TO BLOCK NUMBER
1152 TAD I DTA0
1153 DCA BLOCK
1154 ISZ DTA0 /POINT TO ERROR EXIT
1155 CIF CDF MFIELD /TO ROUTINES DATA FIELD
1156 IOT2, SDRD /GET FUNCTION INTO AC
1157 CLL RAL
1158 AND CM200 /GET # PAGES TO XFER
1159 DCA PGCT
1160 IOT3, SDRD
1161 C374, AND C70 /GET FIELD FOR XFER
1162 TAD C6201 /FORM CDF N
1163 DCA XFIELD /IF=0 AND DF=N AT XFER.
1164 CLA CLL CMA RTL
1165 DCA TRYCNT /3 ERROR TRIES
1166 IOT5, SDRC
1167 AND C100
1168 SZA CLA
1169 JMP FATAL-1
1170 \f
1171 IOT6, SDRD /PUT FUNCT INTO XFUNCT IN SECOND PG.
1172 DCA I CXFUN
1173 TAD WCOUNT
1174 DCA I CXWCT
1175 IOT7, SDRD /GET MOTION BIT TO LINK
1176 CLL RAR
1177 JMP GO /AND START THE MOTION.
1178 RWCOM, SDST /ANY CHECKSUM ERRORS?
1179 SZA CLA /OR CHECKSUM ERRORS?
1180 JMP TRY3 /PLEASE NOTE THAT THE LINK IS ALWAYS
1181 /SET AT RWCOM. GETCHK SETS IT.
1182 TAD PGCT /NO ERROR..FINISHED XFER?
1183 TAD CM200
1184 SNA
1185 JMP EXIT /ALL DONE. GET OUT
1186 DCA PGCT /NEW PAGE COUNT
1187 ISZ BLOCK /NEXT BLOCK TO XFER
1188 TAD WCOUNT /FORM NEXT BUFFER ADDRESS
1189 CIA
1190 TAD BUFF
1191 DCA BUFF
1192 CLL CML /FORCES MOTION FORWARD
1193 GO, CLA CML RTR /LINK BECOMES MOTION BIT
1194 TAD C1000
1195 TAD YUNIT /PUT IN 'GO' AND UNIT #
1196 IOT8, SDLC /LOOK FOR BLOCK NO.
1197 JMS I CRDQUD /WAIT AT LEAST 6 LINES TO LOOK
1198 JMS I CRDQUD
1199 CM200, 7600 /COULD HAVE SAVED A LOC. HERE
1200 SRCH, SDSS
1201 JMP .-1 /WAIT FOR SINGLE LINE FLAG
1202 IOT9, SDRC
1203 CLL RTL /DIRECTION TO LINK. INFO BITS
1204 /ARE SHIFTED.
1205 AND C374 /ISOLATE MARK TRACK BITS
1206 TAD M110 /IS IT END ZONE?
1207 SNA /THE LINK STAYS SAME THRU THIS
1208 JMP ENDZ
1209 TAD M20 /CHECK FOR BLOCK MARK
1210 SZA CLA
1211 JMP SRCH
1212 IOT10, SDRD /GET THE BLOCK NUMBER
1213 SZL /IF WE ARE IN REVERSE, LOOK FOR 3
1214 /BLOCKS BEFORE TARGET BLOCK. THIS
1215 /ALLOWS TURNAROUND AND UP TO SPEED.
1216 TAD C3 /REVERSE
1217 CMA
1218 TAD BLOCK
1219 CMA /IS IT RIGHT BLOCK?
1220 SNA
1221 JMP FOUND /YES..HOORAY!
1222 M110, SZL SNA CLA /NO, BUT ARE WE HEADED FOR IT?
1223 /ABOVE SNA IS SUPERFLUOUS.
1224 JMP SRCH /YES
1225 ENDZ, SDRC /WE ARE IN THE END ZONE
1226 CLL RTL /DIRECTION TO LINK
1227 CLA /ARE WE IN REVERSE?
1228 JMP GO /YES..TURN US AROUND
1229 /IF WE ARE IN THE END ZONE GOING FORWARD, IT IS AN ERROR
1230 TRY3, CLL CLA
1231 ISZ TRYCNT
1232 JMP GO /TRY 3 TIMES
1233 CLL CLA
1234 JMP FATAL /LINK OFF MEANS AC=4000 ON RETURN
1235 EXIT, ISZ DTA0
1236 CLL CML /AC=0 ON NORMAL RETURN
1237 FATAL, TAD YUNIT
1238 SDLC /STOP THE UNIT
1239 CLA CML RAR
1240 LEAVE, HLT
1241 JMP I DTA0 /--RETURN--
1242
1243 \f
1244 C6201, 6201
1245 C6203, 6203
1246 CRDQUD, RDQUAD
1247 WCOUNT, 0
1248 BUFF, 0
1249 MWORDS, 0
1250 YUNIT, 0
1251 CXFUN, XFUNCT
1252 M20, -20
1253 PGCT, 0
1254 CXWCT, XWCT
1255 C100, 100
1256 TRYCNT, -3
1257 BLOCK=DTA1
1258
1259
1260 *ORIGIN+170
1261 FOUND, SZL CLA /RIGHT BLOCK. HOW ABOUT DIRECTION?
1262 JMP GO /WRONG..TURN AROUND
1263 TAD YUNIT /PUT UNIT INTO LINK
1264 CLL RAL /AC IS NOW 0
1265 C70, 70 /********DON'T MOVE THIS!!!!******
1266 C3, 3
1267 TAD BUFF /GET BUFFER ADDRESS
1268 XFIELD, HLT /INTO NEXT PAGE
1269
1270 *ORIGIN+200
1271 XUNIT=EQUFUN
1272
1273 DCA XBUFF
1274 IOT16, SDRC
1275 IOT17, SDLC
1276 RAR /NOW GET UNIT #
1277 DCA XUNIT
1278 REVGRD, SDSS
1279 JMP REVGRD /LOOK FOR REVERSE GUARD
1280 IOT11, SDRC
1281 AND K77
1282 TAD CM32 /IS IT REVERSE GUARD?
1283 SZA CLA
1284 JMP REVGRD /NO.KEEP LOOKING
1285 TAD XWCT
1286 DCA WORDS /WORD COUNTER
1287 TAD XFUNCT /GET FUNCTION READ OR WRITE
1288 K7700, SMA CLA
1289 JMP READ /NEG. IS WRITE
1290 WRITE, SDRC
1291 AND C300 /CHECK FOR WRITE LOCK AND SELECT ERROR
1292 CLL CML /LOCK OUT AND SELECT ARE AC 0 ERRORS
1293 SZA CLA
1294 JMP I CFATAL /FATAL ERROR. LINK MUST BE ON
1295 JMS RDQUAD /NO ONE EVER USES THIS WORD!
1296 C7600, 7600
1297 TAD C1400
1298 TAD XUNIT /INITIATE WRITE MODE
1299 IOT12, SDLC
1300 CLA CMA
1301 JMS WRQUAD /PUT 77 IN REVERSE CHECKSUM
1302 CLA CMA
1303 DCA CHKSUM
1304 WRLP, TAD I XBUFF /GLORY BE! THE ACTUAL WRITE!
1305 JMS WRQUAD
1306 ISZ XBUFF /BUMP CORE POINTER
1307 K77, 77 /ABOVE MAY SKIP
1308 ISZ WORDS /DONE THIS BLOCK?
1309 JMP WRLP /NOT YET..LOOP A WHILE
1310 TAD XFUNCT /IS THE OPERATION FOR WDSBLK PER BLOCK?
1311 CLL RTR /IF NO, WRITE A 0 WORD
1312 SZL CLA
1313 \f
1314 JMS WRQUAD /WRITE A WORD OF 0
1315 JMS GETCHK /DO THE CHECK SUM
1316 JMS WRQUAD /WRITE FORWARD CHECKSUM
1317 JMS WRQUAD /ALLOW CHECKSUM TO BE WRITTEN
1318 JMP I CRWCOM
1319
1320
1321 READ, JMS RDQUAD
1322 JMS RDQUAD
1323 JMS RDQUAD /SKIP CONTROL WORDS
1324 AND K77
1325 TAD K7700 /TACK 7700 ONTO CHECKSUM.
1326 DCA CHKSUM /CHECKSUM ONLY LOW 6 BITS ANYWAY
1327 RDLP, JMS RDQUAD
1328 JMS EQUFUN /COMPUT CHECKSUM AS WE GO
1329 DCA I XBUFF /IT GETS CONDENSED LATER
1330 ISZ XBUFF
1331 C300, 300 /PROTECTION
1332 ISZ WORDS /DONE THIS OP?
1333 JMP RDLP /NO SUCH LUCK
1334 TAD XFUNCT /IF OP WAS FOR WDSBLK-1, READ AND
1335 CLL RTR /CHECKSUM THE LAST TAPE WORD
1336 SNL CLA
1337 JMP RDLP2
1338 JMS RDQUAD /NOT NEEDED FOR WDSBLK/BLOCK
1339 JMS EQUFUN /CHECKSUM IT
1340 RDLP2, JMS RDQUAD /READ CHECKSUM
1341 AND K7700
1342 JMS EQUFUN
1343 JMS GETCHK /GET SIX BIT CHECKSUM
1344 JMP I CRWCOM
1345
1346 WRQUAD, 0 /WRITE OUT A 12 BIT WORD
1347 JMS EQUFUN /ADD THIS TO CHECKSUM
1348 IOT13, SDSQ /SKIP ON QUADLINE FLAG
1349 JMP .-1
1350 IOT14, SDLD /LOAD DATA ONTO BUS
1351 CLA /SDLD DOESN'T CLEAR AC
1352 JMP I WRQUAD
1353
1354 RDQUAD, 0 /READ A 12 BIT WORD
1355 SDSQ
1356 JMP .-1
1357 IOT15, SDRD /READ DATA
1358 JMP I RDQUAD
1359
1360 \f
1361 EQUFUN, 0 /COMPUTE EQUIVALENCE CHECKSUM
1362 CMA
1363 DCA EQUTMP /ACTUALLY CHECKSUMS ON DECTAPE ARE
1364 TAD EQUTMP /EQUIVALENCE OF ALL WORDS IN A RECORD
1365 AND CHKSUM /SIX BITS AT A TIME. BUT SINCE EQUIVALENCE
1366 CIA /IS ASSOCIATIVE, WE CAN DO IT 12
1367 CLL RAL /BITS AT A TIME AND CONDENSE LATER.
1368 TAD EQUTMP /THIS ROUTINE USES THESE IDENTITIES:
1369 TAD CHKSUM /A+B=(A.XOR.B)+2*(A.AND.B)
1370 DCA CHKSUM /A.EQU.B=.NOT.(A.XOR.B)=A.XOR.(.NOT.B)
1371 TAD EQUTMP /A.EQU.B=(A+(.NOT.B))-2*(A.AND.(.NOT.B))
1372 CMA
1373 JMP I EQUFUN
1374
1375 GETCHK, 0 /FORM 6 BIT CHECKSUM
1376 CLA
1377 TAD CHKSUM
1378 CMA
1379 CLL RTL
1380 RTL
1381 RTL
1382 JMS EQUFUN
1383 CLA CLL CML /FORCES LINK ON AT RWCOM
1384 TAD CHKSUM
1385 AND K7700
1386 JMP I GETCHK
1387
1388 CFATAL, FATAL
1389 CRWCOM, RWCOM
1390 XFUNCT, 0
1391 CM32, -32
1392 C1400, 1400
1393 CHKSUM, 0
1394 WORDS, 0
1395 XBUFF, 0
1396 XWCT, 0
1397 EQUTMP, 0
1398
1399 \fPAGE
1400 /
1401 /
1402 PARITY, 0
1403 KRB
1404 AND [177
1405 TAD [200
1406 JMP I PARITY
1407
1408 /IOT TABLES FOR TD8E SUBROUTINE
1409
1410 IOTLOC, IOT1
1411 IOT2
1412 IOT3
1413 IOT4
1414 IOT5
1415 IOT6
1416 IOT7
1417 RWCOM
1418 IOT8
1419 SRCH
1420 IOT9
1421 IOT10
1422 ENDZ
1423 FATAL+1
1424 REVGRD
1425 IOT11
1426 WRITE
1427 IOT12
1428 IOT13
1429 IOT14
1430 RDQUAD+1
1431 IOT15
1432 IOT16
1433 TABEND, IOT17
1434
1435 UNITS=.
1436 UNIT01
1437 UNIT23
1438 UNIT45
1439 UNIT67
1440
1441 RTAB, IOTR1
1442 IOTR2
1443 IOTR3
1444 IOTR4
1445 IOTR5
1446 IOTR6
1447
1448
1449 /IOT TABLES FOR WORDS PER BLOCK ROUTINE
1450
1451 TABLE1, IOTX1
1452 IOTX2
1453 IOTX3
1454 IOTX4
1455 IOTX5
1456 IOTX6
1457 IOTX7
1458 END1, IOTX8
1459
1460 \fMESSG4, TEXT @FROM UNIT:@
1461 MESSG5, TEXT @TO UNITS:@
1462 ERROR5, TEXT @ILLEGAL FORMAT UNIT @
1463 ERROR6, TEXT @ UNIT @
1464 ERROR4, TEXT @ILLEGAL RESPONSE@
1465
1466 \f
1467 PAGE
1468 /ONCE ONLY CODE
1469
1470 END, JMS I (QUEST
1471 MESSG2 /@HIGHEST FIELD AVAILABLE:@
1472 ACL
1473 AND [7
1474 CIA
1475 DCA FIELDS
1476 TAD (CDF
1477 DCA CDF00
1478 TAD FIELDS
1479 SNA /MORE THAN 1 FIELD??
1480 JMP LIM /NO--NO PROBLEM
1481 DCA COUNT1 /YES--ARE THEY ALL PRESENT?
1482 NEXT, TAD CDF00
1483 TAD (10
1484 DCA CDF00 /SET FOR DATA FIELD CHANGE
1485 TAD (HLT
1486 CDF00, CDF
1487 DCA I (10 /TRY LOCATION 10
1488 TAD I (10
1489 CDF 0
1490 CIA
1491 TAD (HLT
1492 SNA CLA /IS FIELD THERE?
1493 JMP NEXT1 /YES--TRY NEXT ONE
1494 JMS I [MESSGE /NO
1495 ERROR4 /ILLEGAL RESPONSE
1496 JMS I [CRLF /CARRIAGE RETURN/LINE FEED
1497 DCA COUNT /CLEAR COUNT
1498 JMP END /TRY AGAIN
1499 NEXT1, ISZ COUNT1 /DONE YET?
1500 JMP NEXT /NO
1501
1502 LIM, TAD (LIMIT-END /SET BEGINNING OF VERIFY BUFFER
1503 CLL RAR
1504 TAD [END
1505 DCA END0
1506 TAD (NOP
1507 DCA I (START1-1
1508 JMP I (START1
1509 MESSG2, TEXT @HIGHEST FIELD AVAILABLE:@
1510
1511 FIELD 0
1512 *200
1513
1514 $
1515 \f\f