software: Added more and more
[pdp8.git] / sw / os8 / v3d / sources / system / dectapes / dectape5 / DTCOPY.PA
CommitLineData
7af5ad59
PH
1/DECTAPE COPY, V10
2
3/
4/
5/
6/
7/
8/
9//
10/
11/
12/
13/
14/COPYRIGHT (C) 1966, 1975
15/DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
16/
17/
18/
19/THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A
20/SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLU-
21/SION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANT OTHER
22/COPIES THEREOF, MAY NOT BR PROVIDED OR OTHERWISE MADE AVAILABLE
23/TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO
24/AGREES TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE
25/SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC.
26/
27/
28/THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT
29/NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL
30/EQUIPMRNT COROPATION.
31/
32/DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS
33/SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.
34/
35/
36/
37/
38/
39/
40\f/DECTAPE COPY
41/VERSION .B07
42/
43/
44/COPYRIGHT 1968 DIGITAL EQUIPMENT CORPORATION
45/ MAYNARD, MASS. OCTOBER,1968
46
47
48\f
49/ THIS PROGRAM COPIES A DECTAPE FROM ONE
50/ SPECIFIED UNIT TO ANOTHER. ALL DECTAPE
51/ ROUTINES ARE INTERNALLY GENERATED SO THAT
52/ IT MAY BE RUN WITHOUT THE MONITOR SYSTEM.
53/
54/ STARTING ADDRESS IS 200
55/
56 DTRA=6761
57 DTCA=6762
58 DTXA=6764
59 DTSF=6771
60 DTRB=6772
61 DTLB=6774
62
63 WC=7754
64 CA=7755
65/ THESE AREAS ARE USED BY DATA BREAK
66BUFIOT=1547 /INPUT OUTPUT BUFFER
67BUFCHK=4563 /RE-READ BUFFER
68/
69*20
70/ PAGE ZERO WORKING STORAGE
71BADTRY, -3 /COUNT OF READ ERRORS
72CURBLK, 0 /CURRENT BLOCK NUMBER
73TRASH1, 0 /WORKING STORAGE
74TRASH2, 0 /WORKING STORAGE
75TRASH3, 0 /WORKING STORAGE
76BLKCNT, 0 /NUMBEROF BLOCKS TO READ
77 /OR MINUS THAT NUMBER
78SORBLK, 0 /STORAGE FOR CURBLK
79WORDS, 0 /NUMBER OF WORDS PER BLOCK
80INUNIT, 0 /INPUT UNIT IN LH OCT CHAR
81OUTUNI, 0 /OUTPUT UNIT IN LH OCT CHAR
82RESTOR, 0 /NUMBER OF WORDS TO COPY
83RESAVE, 0 /NEGATIVE OF BLKCNT
84SMICAR, 0 /CHARACTER STORAGE
85SMISUM, 0 /RUNNING SUM
86SPELIN, 0 /POINTER
87SEAZIK, 0 /INPUT AREA
88SEAZOK, 0 /TEMP STORAGE
89DECTWC, 0 /FLAG TO DETERMINE IF VALIDATION WILL OCCUR
90DECTCA, 0 /CURRENT ADDRESS STORE
91FIRST, 0 /STARTING BLOCK NUMBER
92LAST, 0 /LAST BLOCK NUMBER
93LENGTH, 0 /NUMBER OF WORDS TO COPY
94PARITY, 0 /PARITY ERROR FLAG (COUNT)
95MSKIN, 0 /NEGATIVE OF INUNIT
96PARDEL, PSTACK /POINTER TO PARITY TABLE
97/
98/ PAGE ZERO SUBROUTINES
99DIREC, 0
100 CLA
101 DTRA /FIND DIRECTION
102 AND [400
103 SZA CLA /BRANCH BACK
104 ISZ DIREC /REVERSE DIRECTION EXIT
105 JMP I DIREC /FORWARD DIRECTION EXIT
106/
107/
108BACKUP, 0 /SUBROUTINE REWINDS TAPE
109 CLA
110 DTRA
111 AND (670 /CLEAR DIRECTION AND MOVEMENT
112 DTXA
113 TAD (600 /GO IN REVERSE
114 DTXA
115 DTSF
116 JMP .-1 /WAIT UNTILL DONE
117 JMS I [ERROR /BUSYWORK FOR ERRORS
118 JMP I BACKUP /EXIT ON ENDZONE ERROR
119 JMP BACKUP+1
120\f
121*200
122BEGIN, CLA CLL /INITIALIZE
123 DTLB
124 TLS /TELETYPE OUTPUT
125 JMS I [SPEAK
126 MESS0
127 JMS I [SPEAK
128 MESS1 /INPUT UNIT NUMBER
129 JMS GETNUM /CHECK INPUT UNIT NUMBER
130 DCA INUNIT
131 TAD INUNIT
132 CIA /SET UP INPUT UNIT MASK
133 DCA MSKIN
134 JMS I [SPEAK
135 MESS2 /OUTPUT UNIT NUMBER
136 JMS GETNUM
137 TAD MSKIN /MAKE SURE UNITS ARE DIFFERENT
138 SNA
139 JMP BEGIN /INPUT ERROR
140 TAD INUNIT
141 DCA OUTUNI
142 JMS I [SPEAK /GET FIRST BLOCK NUMBER
143 MESSA
144 JMS I [SMIGIT
145 NOP
146 DCA CURBLK
147 TAD CURBLK
148 CIA /STORE BEGINNING MARKER
149 DCA FIRST
150 JMS I [SPEAK /GET LAST BLOCK NUMBER
151 MESSB
152 JMS I [SMIGIT
153 CLA CMA /KLUDGE IF NO INPUT
154 DCA LAST
155 TAD FIRST
156 CLL
157 SZA
158 TAD LAST /MAKE SURE VALID
159 SZA SNL CLA
160 JMP BEGIN
161 DTLB
162 TAD INUNIT /INIT INPUT UNIT
163 JMS I [FIXTAP
164 DCA WORDS /SET UP BLOCK LENGTH
165 TAD OUTUNI /INIT OUTPUT UNIT
166 JMS I [FIXTAP
167 CIA /MAKE SURE BLOCK LENGTH
168 TAD WORDS /SAME ON INPUT AND OUTPUT
169 SZA CLA
170 JMP BADLEN /BLOCK LENGTH ERROR
171 JMS I [SPEAK /TYPE OUT BLOCK LENGTH
172 MESS3
173 TAD WORDS
174 JMS I [TYPNUM
175 JMS I [SPEAK /SEND <RETURN><LINE FEED>
176 MESS0+11
177 TAD WORDS
178 CIA /COMPUTE NUMBER OF BLOCKS
179 DCA LENGTH /TO READ AND WRITE
180 DCA BLKCNT /CLEAR BLOCK COUNTER
181 TAD [3014 /LOAD BUFFER SIZE
182 TAD LENGTH
183 SPA
184 JMP BADLEN /TOO MANY WORDS PER BLOCK
185 ISZ BLKCNT /TALLY
186 TAD LENGTH
187 SMA
188 JMP .-3 /CONTINUE COUNTING
189 TAD WORDS /GET NUMBER OF
190 TAD [-3014 /WORDS TO READ
191 CIA /AND TO WRITE
192 DCA RESTOR /PRESERVE IN RESTOR
193 TAD RESTOR
194 DCA LENGTH
195 TAD BLKCNT /SAVE NEGATIVE OF BLKCNT
196 CIA
197 DCA RESAVE
198 JMS I [SPEAK
199 MESSC
200 JMS I [SMIGIT
201 NOP
202 DCA DECTWC /SET UP VERIFY FLAG
203/
204/ MAIN LOOP FOR COPY
205LETS, TAD CURBLK /CHECK FOR PARTIAL BLOCK TO COPY
206 TAD BLKCNT
207 CLL CMA IAC
208 TAD LAST
209 SZL
210 JMP LETT /COPY FULL LENGTH
211 DCA LENGTH /ADJUST WORDS TO COPY
212 TAD RESTOR
213 CIA
214 TAD WORDS
215 ISZ LENGTH
216 JMP .-2 /COMPUTE PROPER LENGTH
217 CIA
218 TAD WORDS
219 DCA LENGTH
220 TAD [REVERS /KLUDGE COPY EXIT
221 DCA I [COPY
222 JMP I [COPY+1 /PERFORM THIS COPY
223LETT, JMS I [COPY /COPY THIS BLOCKS
224 TAD BLKCNT
225 TAD BLKCNT /ADVANCE CURRENT BLOCK
226 TAD CURBLK
227 DCA CURBLK
228 JMS DIREC
229 JMP LETU /FORWARD EXCEEDED CHECK
230LETR, TAD CURBLK /REVERSE CHECK
231 TAD FIRST
232 CMA
233 SZA CLA /CHECK FOR MINUS 1
234 JMP LETT /CONTINUE COPY
235 JMP I [DONE /FINISHED JOB
236LETU, TAD CURBLK
237 CLL CMA IAC
238 TAD LAST
239 SZL CLA /CHECK FOR END OF TAPE
240 JMP LETS
241 JMP I [REVERV
242
243
244
245
246/ THIS SUBROUTINE GETS INPUT
247/ AND OUTPUT UNIT NUMBERS FROM
248/ THE TELETYPE AND VALIDATES THEM.
249/
250GETNUM, 0
251 JMS I [SMIGIT
252 NOP
253 AND [7
254 CLL RTR /MOVE TO LH THREE BITS
255 RTR
256 JMP I GETNUM
257/
258/
259
260BADLEN, JMS I [SPEAK /BLOCK LENGTH ERROR
261 MESS3A
262 JMP BEGIN
263/
264/
265/
266PAGE
267\f
268/
269/ THIS TURN AROUND IS ENTERRED
270/ WHEN THE LAST COPY MOVED INTO
271/ THE FINAL DATA AREA
272REVERV, TAD LAST
273 DCA CURBLK /START OF COPY BACK
274 JMS REVALT /CHANGE INUNIT AND OUTUNI
275 TAD INUNIT
276 DTCA DTXA
277 JMS I [RESET /REPOSITION TAPE
278 TAD OUTUNI
279 DTCA DTXA
280 JMS I [RESET /REPOSITION TAPE
281REBACK, TAD CURBLK
282 CMA /COMPUTE NEW COPY LENGTH
283 TAD SORBLK
284 TAD BLKCNT
285 SNA
286 JMP REVERS /KLUDGE IF NOTHING TO DO
287 DCA SORBLK /MINUS # OF BLOCKS
288 TAD SORBLK
289 DCA BLKCNT /SAVE THIS NUMBER
290 TAD WORDS
291 ISZ SORBLK
292 JMP .-2
293 DCA LENGTH /LENGTH FOR COPY
294 JMS I [COPY /PERFORM IT
295 TAD CURBLK
296 TAD BLKCNT
297 TAD RESAVE /ADVANCE CURBLK
298 DCA CURBLK
299 TAD RESAVE
300 DCA BLKCNT
301 TAD RESTOR
302 DCA LENGTH
303 JMP I [LETR /CONTINUE COPY
304/
305/
306/ THIS TURN AROUND IS ENTERRED
307/ WHEN THE LAST SEARCH FOR
308/ CURRENT BLOCK CAUSED AN END
309/ OF TAPE ERROR
310/
311REVERT, JMS DIREC
312 SKP
313 JMP I [DONE /FINISHED IF DIRECTION REVERSE
314 TAD SORBLK
315 DCA CURBLK /RESTORE CURBLK
316 TAD OUTUNI /RESET LOCATION OF
317 DTCA DTXA /OUTPUT DECTAPE AND
318 JMS I [RESET /FIND LAST BLOCK
319 TAD [4000 /BY LOOKING FOR IMAGINARY
320 JMS I [SEARCH /BLOCK NUMBER (KLUDGING SEARCH)
321 NOP
322 JMP .-3 /TRY AGAIN ON ERRORS
323 TAD SEAZIK /MUST BE LAST BLOCK NUMBER
324 DCA CURBLK
325 JMS REVALT /CHANGE INUNIT AND OUTUNI
326 JMP REBACK
327/
328/
329/ THIS TURN AROUND IS ENTERRED WHEN THE
330/ END BLOCK FOR COPY WAS REACHED BY A
331/ PARTIAL BUFFER COPY.
332/
333REVERS, CLA CMA /ADJUST CURBLK POINTER
334 TAD SORBLK
335 DCA CURBLK
336 TAD RESAVE
337 DCA BLKCNT /MAKE BLKCNT NEGATIVE
338 TAD RESTOR
339 DCA LENGTH /RESTORE COPY LENGTH
340 JMS REVALT /CHANGE INUNIT AND OUTUNI
341 JMP I [LETR
342/
343REVALT, 0
344 TAD OUTUNI
345 TAD [400
346 DCA OUTUNI /REVERSE DIRECTION
347 TAD INUNIT
348 TAD [400
349 DCA INUNIT /REVERSE DIRECTION
350 JMP I REVALT
351/
352\f
353/THIS SUBROUTINE PERFORMS THE OPERATION
354/OF COPYING N BLOCKS AND VALIDATING
355/THE OUTPUT.
356/WHEN END OF TAPE IS REACHED THE ROUTINE
357/BRANCHES TO "REVERS", OR TO REVERT
358/AS APPROPRIATE.
359/
360COPY, 0
361 KSF /CHECK FOR <^C>
362 JMP .+5
363 KRB
364 TAD [-203
365 SNA
366 JMP I [7600
367 CLA
368 TAD INUNIT /LOAD STAT REG A
369 DTCA DTXA
370 TAD [-3
371 DCA BADTRY /RESTORE ERROR COUNTER
372 JMS I [DECTAP
373COPO, BUFIOT /INPUT AREA
374 30 /READ CODE
375 NOP /NORMAL RETURN
376 TAD PARITY /CHECK PARITY FLAG
377 SZA
378 JMP I [ERRPAR /FIX MESSAGE FOR PARITY ERRORS
379COPZ, TAD OUTUNI /(IGNORE END ZONE)
380 DTCA DTXA /OUTPUT UNIT & DIRECTION
381COPYB, JMS I [DECTAP /WRITE OUTPUT TAPE
382 BUFIOT /OUTPUT BUFFER
383 50 /WRITE CODE
384 JMP COPCPR /NORMAL RETURN
385 TAD [REVERS /END ZONE RETURN
386 DCA COPY /FIX UP EXIT
387COPCPR, TAD CURBLK
388 DCA SORBLK /STORE CURRENT BLOCK NUMBER
389 TAD DECTWC
390 SZA CLA
391 JMP I COPY /NO VERIFICATION
392 JMS I [RESET /RETURN TO FRONT END
393 JMS I [DECTAP /READ DATA
394COPR, BUFCHK /INPUT AREA
395 30 /READ CODE
396 JMP .+2 /NORMAL RETURN BRANCH
397 TAD I [WC /END ZONE RETURN
398 TAD LENGTH
399 CIA
400 DCA TRASH3 /COUNTER
401 TAD COPO
402 DCA 17 /FORWARDS POINTER
403 TAD COPR /REREAD BUFFER
404 DCA 16 /SET UP POINTER
405COPCML, TAD I 16
406 CIA
407 TAD I 17
408 SZA
409 JMP COPERR /MISMATCH ON READ
410 ISZ TRASH3 /ANY MORE WORDS
411 JMP COPCML /LOOP
412 JMP I COPY /MADE IT! EXIT
413COPERR, ISZ BADTRY /HOW MANY ATTEMPTS
414 JMP COPERS /TRY AGAIN
415 JMS I [SPEAK
416 MESS5 /RE-READ ERRORS
417 JMS I [TUNIT /TYPE UNIT NUMBER AND WAIT
418 TAD [-3
419 DCA BADTRY /RESTORE ERROR COUNTER
420COPERS, CLA
421 JMS I [RESET
422 JMP COPYB /WRITE OUT BLOCK AGAIN
423/
424PAGE
425\f
426/ THIS SUBROUTINE MOVES THE DECTAPE
427/ BACK IN PREPARATION FOR ANOTHER
428/ READ OR WRITE.
429/
430RESET, 0
431 CLA CLL /CLEAR AC AND LINK
432 TAD [400 /CHANGE DIRECTION
433 DTXA
434 JMS DIREC /FIND DIRECTION
435 TAD [6 /FORWARD MAKE +3
436 TAD [-3 /REVERSE MAKE -3
437 TAD CURBLK
438 SPA /MAKE SURE VALUE IS PLUS
439 JMP RESEV
440 JMS I [SEARCH /FIND THIS BLOCK
441 SKP CLA /FOUND IT
442 JMP RESET+4
443REEXT, DTRA
444 AND [200 /CLEAR STOP-GO FLAG
445 TAD [400 /AND REVERSE DIRECTION
446 DTXA
447 JMP I RESET
448RESEV, JMS BACKUP /REWIND THIS TAPE
449 JMP REEXT
450/
451/
452/ THIS BRANCH IS TKEN WHEN
453/ ALL COPYING IS COMPLETED
454DONE, JMS I [SPEAK
455 MESS4
456 JMS I [SMIGIT
457 JMP I [BEGIN
458
459 JMP I [BEGIN
460\f
461/THIS SUBROUTINE READS NUMBERS,
462/NOT EXCEEDING 4098, FROM A TELETYPE
463/AND RETURNS THE OCTAL VALUE OF INPUT.
464/THE FOLLOWING SPECIAL CHARACTERS
465/ARE USD...<RETURN> MARKS END OF INPUT, CAUSES A <CR><LF>
466/IF THE <RETURN> IS THE FIRST CHARACTER THEN
467/DIRECT RETURN IS TAKEN, ELSE RETURN IS TO ENTRY+2
468/ <^C> CAUSES A BRANCH TO 7600
469/
470SMIGIT, 0
471 KCC /INITIALIZE TTY INPUT
472 DCA SMISUM /CLEAR TEMP STORAGE
473 JMS TTYIN /GET CHAR
474 AND [177
475 TAD [200
476 TAD [-215 /CHECK FOR <RETURN>
477 SNA
478 JMP SMIXIT /EXIT ON FIRST <RETURN>
479 ISZ SMIGIT /ADVANCE EXIT POINTER
480SMIGOP, TAD [12 /CHECK FOR ^C
481 SNA
482 JMP I [7600 /BRANCH TO MONITOR
483 TAD [-65 /CHECK FOR DIGITS
484 CLL
485 TAD [10
486 SNL
487 JMP SMILOP /INVALID CHARACTER
488 DCA SMICAR /TEMP STOR
489 TAD SMISUM /GET CHARACTER STRING
490 CLL RAL
491 CLL RAL
492 CLL RAL /ROTATE TO LH POSITION
493 TAD SMICAR /APPEND CURRENT DIGIT
494 DCA SMISUM
495 TAD SMICAR
496 TAD [260 /MAKE ASCII
497 JMS TYPE /ECHO CHARACTER
498SMILOP, JMS TTYIN /GET NEXT CHARACTER
499 TAD [-215 /CHECK FOR <RETURN>
500 SZA
501 JMP SMIGOP /CONTINUE LOOP
502SMIXIT, JMS I [SPEAK /SEND A <RETURN><LINE FEED>
503 MESS0+11
504 TAD SMISUM /GET INPUT STRING
505 JMP I SMIGIT /EXIT
506
507
508/THIS SUBROUTINE READS A CHARACTER FROM THE TTY
509TTYIN, 0
510 KSF /WAIT UNTIL READY
511 JMP .-1
512 KRB /READ TTY BUFFER
513 JMP I TTYIN
514\f
515/THIS SUBROUTINE TYPES OUT A
516/DIGIT STRING FROM THE AC
517/AS FOUR OCTAL CHARACTERS
518TYPNUM, 0
519 DCA SMICAR /PRESERVE STRING VALUE
520 TAD [-4
521 DCA SMISUM /INITIALIZE COUNTER
522TYPXL, TAD SMICAR
523 RTL
524 RAL /GET NEXT PRINT DIGIT
525 DCA SMICAR /RETURN TO STRING
526 TAD [3
527 AND SMICAR
528 RAL /ENTER CURRENT DIGIT
529 TAD [260 /MAKE ASCII
530 JMS TYPE /TYPE DIGIT
531 ISZ SMISUM /COUNT DIGITS
532 JMP TYPXL /COUNTINUE LOOP
533 JMP I TYPNUM /EXIT
534
535\f
536/THIS SUBROUTINE TYPES OUT A
537/MESSAGE IN "TEXT" FORMAT TWO
538/ASCII CHARACTERS PER WORD.
539/SPECIAL CHARACTERS ARE NOT
540/PERMITTED. A CARRIGE RETURN
541/AND LINE FEED PRECEED THE
542/MESSAGE.
543/ JMS I [SPEAK <BRANCH TO SUBROUTINE>
544/ MESSAGE <POINTER TO MESSAGE BUFFER>
545/A ZERO WORD MARKS THE
546/END OF THE MESSAGE.
547/
548SPEAK, 0
549 CLA CLL
550 TAD [215
551 JMS I [TYPE /CARRIGE RETURN
552 TAD I SPEAK /GET ADDRESS OF OUTPUT
553 DCA SPELIN
554 ISZ SPEAK
555 TAD [212
556 JMS I [TYPE /LINE FEED
557SPEELH, TAD I SPELIN /GET NEXT WORD
558 SNA /CHECK FOR ZERO
559 JMP I SPEAK /EXIT IF ZERO
560 AND [7700 /GET LH CHARACTER
561 CLL RTR /MOVE TO
562 RTR /RIGHT HAND
563 RTR /SIX BITS
564 JMS SPEOUT /TRANSLATE AND OUTPUT
565 TAD I SPELIN
566 ISZ SPELIN /ADVANCE POINTER
567 AND [77 /GET RH CHARACTER
568 JMS SPEOUT /TRANSLATE AND OUTPUT
569 JMP SPEELH
570SPEOUT, 0
571 TAD [-40 /CHECK FORMAT
572 SMA
573 TAD [-100 /KLUDGE DIGITS FORMAT<200+XX>
574 TAD [340 /ALPHA FORMAT <300+XX>
575 JMS I [TYPE /OUTPUT IT
576 JMP I SPEOUT /RETURN
577
578/
579/THIS SUBROUTINE TYPES OUT
580/THE ASCII CHARACTER IN THE AC.
581/
582TYPE, 0
583 TSF /WAIT UNTIL READY
584 JMP .-1
585 TLS /TYPE CHARACTER
586 CLA
587 JMP I TYPE
588/
589/THIS SUBROUTINE TYPES OUT THE
590/CURRENT UNIT NUMBER
591TUNIT, 0
592 CLA
593 DTRA
594 AND [7000 /GET CURRENT UNIT NUMBER
595 CLL RTL /MOVE OVER
596 RTL
597 TAD [260 /MAKE ASCII CODE
598 JMS I [TYPE /TYPE IT
599 JMS I [SMIGIT /WAIT
600 JMP I TUNIT /EXIT
601 JMP I TUNIT
602/
603/
604PAGE
605\f
606/THIS SUBROUTINE SEARCHES DECTAPE
607/IN A FORWARD OR REVERSE DIRECTION.
608/STATUS REGISTER A SHOULD CONTAIN
609/UNIT SELECT NUMBER (0-2), FORWARD
610/OR REVERSE, AND A5=1.
611/THE BLOCK NUMBER FOR WHICH THE PROGRAM IS
612/SEARCHING MUST BE IN THE AC.
613/ON ERROR RETURN THE COMAND
614/FOLLOWING THE "JMS" IS SKIPPED,
615/AN END OF TAPE ERROR WILL CAUSE
616/THREE MOVES INTO ENDZONE AND TWO COMMANDS FOLLOWING
617/THE "JMS" ARE SKIPPED
618SEARCH, 0
619 CIA /FORM TWO'S COMPLEMENT
620 DCA SEAZOK /STORE - BLOCK NUMBER
621 DCA SEAZIK /CLEAR INPUT WORD
622 DTRA
623 AND [274
624 DTXA /CLEAR OUT A REGISTER
625 TAD [210 /START DEVICE
626 DTXA
627 JMS DIREC /DETERMINE DIRECTION
628 TAD [NOP-CIA /FORWARD...FIX TO "NOP"
629 TAD [CIA /REVERSE...FIX TO "CIA"
630 DCA SEATIX /FIX UP COMMAND
631 TAD [SEAZIK /BLOCK NUMBER INPUT
632 DCA I [CA /PUT IN CURRENT ADDRESS
633 CLA CMA /NUMBER OF BLOCKS=1
634 JMS SEARUN /FIND FIRST BLOCK MARK
635 TAD [100 /SET CONTINUOUS MODE FLAG
636 DTXA
637 TAD SEAZIK /BLOCK NUMBER HERE
638 TAD SEAZOK /MINUS BLOCK NUMBER THERE
639SEATIX, NOP /IFSEARCHING IN REVERSE DIRECTION
640*.-1
641 CIA /IF SEARCHING IN FORWARD DIRECTION
642 SPA /SKIP IF DONE
643 JMS SEARUN /FIND "N" BLOCK MARKS
644 DTRA
645 AND [100 /CLEAR CONTINUOUS MODE FLAG
646 DTXA
647 JMP I SEARCH /NORMAL EXIT
648SEARUN, 0
649 DCA I [WC /NUMBER OF BLOCKS TO READ
650 DTXA
651 DTSF /CHECK FOR DONE
652 JMP .-1
653 DTRB /READ STATUS REGISTER B
654 SMA CLA
655 JMP I SEARUN /DT FLAG...NORMAL EXIT
656 JMS I [ERROR /HANDLE ALL ERRORS
657 ISZ SEARCH /END OF TAPE ERROR
658 ISZ SEARCH /ALL OTHER ERRORS
659 JMP SEARUN-4 /EXIT
660
661\f
662/THIS SUBROUTINE READS OR WRITES
663/<N> WORDS, IN CONTROL MODE, ON
664/A BLOCK(S) ASSUMING THAT
665/THE DECTAPE IS PROPERLY
666/POSITIONED. IN LINE CODE:
667/ JMS I [DECTAP
668/ <BUFFER> ADDRESS TO READ INTO (OR WRITE FROM) -1
669/ <3> IF READ, <5> IF WRITE
670/<<NORMAL RETURN>>
671/<<END OF TAPE ERROR>>
672/AN END OF TAPE ERROR WHILE SEARCHING
673/CAUSES A BRANCH TO "REVERT".
674/STATUS REGISTER A SHOULD CONTAIN:
675/AO-2 UNIT NUMBER
676/A3 FORWARD=0, REVERSE=1
677/A4 UNIMPORTANT, SHOULD BE ZERO
678/A5 1
679/A6-8,89 UNIMPORTANT
680/BLOCK NUMBER IN PAGE ZERO "CURBLK"
681/NUMBER OF WORDS TO READ OR
682/WRITE IS IN PAGE ZERO "LENGTH"
683/
684DECTAP, 0
685 TAD I DECTAP /GET INPUT BUFFER
686 DCA DECTCA /STORE
687 ISZ DECTAP
688DECAGN, TAD CURBLK /SEARCH FOR BLOCK
689 JMS I [SEARCH
690 JMP DECRUN /FOUND IT
691 JMP DECAGN
692 JMP I [REVERT /END ZONE ERROR
693DECRUN, TAD SEAZIK
694 TAD SEAZOK /CHECK TO SEE IF FOUND BLOCK
695 SZA
696 JMP DECEXT-3
697 TAD LENGTH /SET UP WORD COUNT
698 CIA
699 DCA I [WC
700 TAD DECTCA /AND INPUT OUTPUT BUFFER
701 DCA I [CA
702 TAD I DECTAP /GET READ OR WRITE
703DECLOP, DTXA /START GOING
704 DTSF
705 JMP .-1
706 DTRB /GET FLAGS
707 SMA
708 JMP DECEXI
709 JMS I [ERROR
710 JMP DECEXT-1 /ENDZONE ERROR
711 JMS I [RESET /RESTORE POINTERS
712 JMP DECAGN
713 ISZ DECTAP /END OF TAPE EXIT
714DECEXT, ISZ DECTAP
715 CLA
716 JMP I DECTAP /FINISHED
717DECEXI, CLA
718 TAD I [WC /HAVE WE FINISHED?
719 SZA CLA
720 JMP DECLOP /NO-:CONTINUE READ-WRITE
721 DTRA /YES--CLEAR STATUS
722 AND [274
723 DTXA
724 JMP DECEXT
725\f
726/THIS SUBROUTINE CHECKS THE CONTENTS
727/OF STATUS REGISTER B.
728/ <BRANCH> JMS I [ERROR
729/ <+1 END OF TAPE ERROR>
730/ <+2 ALL OTHER ERRORS>
731/IN ADDITION: 1--A SELECT ERROR WILL
732/CAUSE A TYPEOUT AND HALT. 2--A PARITY
733/ERROR ON OUTPUT TAPE CAUSES A
734/BRANCH TO "COPERS"; ON INPUT TAPE
735/"PARITY ERROR" IS TYPED OUT. 3--GO FLIP-FLOP
736/AND STATUS REGISTER A6-8 WILL BE CLEARED.
737/
738ERROR, 0
739 CLA CLL
740 DTRB /GET ERROR FLAGS
741 AND [200 /PARITY ERROR FLAG
742 SNA CLA
743 JMP ERNOT /HANDLE OTHER ERRORS
744 DTXA /CLEAR FLAGS, CONTINUE READ MODE
745 DTRA /GET UNIT NUMBER
746 AND [7000
747 TAD MSKIN /CHECK FOR INPUT UNIT
748 SZA
749 JMP I [COPERR /ERROR ON OUTPUT UNIT
750 TAD I [WC /PUT WORD COUNT IN PUSH
751 CIA
752 DCA I PARDEL /DOWN STACK
753 ISZ PARDEL /ADVANCE POINTER
754 ISZ PARITY /SET FLAG
755 JMP I [DECEXI /RETURN TO READ
756ERNOT, DTRA /GET STATUS REGISTER A
757 AND [274
758 TAD [2 /DO NOT DISTURB ERROR FLAGS
759 DTXA /CLEAR A4 AND A6-8
760 DTRB /GET ERROR FLAGS
761 RTL
762 SMA /SKIP IF END OF TAPE ERROR
763 JMP ERROTH
764 CLA
765 TAD [-3 /LOAD -3
766 DCA ERRSOR /STORE IN COUNT
767 TAD [200 /GO FLIP-FLOP
768 DTXA /SET
769 DTSF
770 JMP .-1
771 ISZ ERRSOR /HAVE WE DONE THREE TIMES
772 JMP .-5
773 JMP I ERROR /EXIT
774ERRSOR, 0
775ERROTH, ISZ ERROR /CHANGE ERROR BRANCH
776 SZL
777 CLA CLL /MARK TRACK ERROR
778 RTL
779 SNL CLA
780 JMP I ERROR /TIMING ERROR BRANCH
781 JMS I [SPEAK /SELECT ERROR MESSAGE
782 ERRSEL
783ERRUNT, JMS I [TUNIT
784 JMP I ERROR
785/
786PAGE
787\f
788/ VARIOUS MESSAGES
789MESS0, TEXT %DECTAPE COPY V10A %
790MESSA, TEXT %FIRST BLOCK TO COPY (OCTAL) %
791MESSB, TEXT %FINAL BLOCK TO COPY (OCTAL) %
792ERRSEL, TEXT %SELECT ERROR ON UNIT #%
793PMESS, TEXT %PARITY ERROR ON BLOCK %
794MESSC, TEXT %VERIFY OUTPUT? (0=YES, 1=NO): %
795MESS1, TEXT %FROM UNIT %
796MESS2, TEXT %TO UNIT %
797MESS3, TEXT %PDP-8 WORDS PER BLOCK %
798MESS4, TEXT %DONE%
799MESS5, TEXT %WRITE ERRORS ON UNIT #%
800MESS3A, TEXT %BLOCK LENGTH ERROR%
801/
802/
803PAGE
804/
805/
806\f
807/THIS ROUTINE TYPES OUT PARITY ERROR MESSAGES
808/AND RESTORES POINTERS TO THE PUSH DOWN STACK.
809ERRPAR, CIA
810 DCA PARITY /SET UP STACK COUNTER
811 CLA CMA
812 TAD PARDEL /MOVE POINTER BACK
813 DCA PARDEL
814 JMS I [SPEAK /TYPE OUT MESSAGE
815 PMESS
816 TAD CURBLK
817EPLOOP, DCA EPJK
818 TAD I PARDEL /CHECK FOR CORRECT BLOCK NUMBER
819 TAD WORDS /ADVANCE BLOCK WORDS COUNT
820 DCA I PARDEL
821 TAD I PARDEL
822 CIA /REACHED ORIGINAL VALUE?
823 TAD LENGTH
824 SNA CLA
825 JMP EPTYP /TYPE BLOCK AT ERROR
826 JMS DIREC
827 CLL CMA RAL /ADD ONE IF FORWARD
828 CMA /SUBTRACT ONE IF NEGATIVE
829 TAD EPJK /NEXT BLOCK NUMBER
830 JMP EPLOOP /CONTINUE LOOP
831EPTYP, TAD EPJK
832 JMS I [TYPNUM /TYPE BLOCK NUMBER
833 ISZ PARITY /ADVANCE COUNTER
834 JMP ERRPAR+2 /CONTINUE LOOP
835 JMP I EPPEXT /RETURN TO COPY
836EPPEXT, COPZ /REENTRY TO COPY
837EPJK, 0 /WORKING STORAGE
838\f
839/THIS SUBROUTINE READS A RANDOM
840/BLOCK ON DECTAPE TO DETERMINE THE BLOCK LENGTH
841FIXTAP, 0
842 TAD [610 /FIX A REG. WORD
843 DTCA DTXA /LOAD A STAT. REG.
844 CLA CMA
845 DCA I [WC /SEARCH FOR 1 BLOCK
846 TAD [BUFIOT /FIX CURRENT ADDRESS
847 DCA I [CA /TO READ INTO BUFFER
848 DTSF /WAIT AROUND
849 JMP .-1
850 DTRB
851 SPA CLA
852 JMP FIXERR /HANDLE ERROR CONDITIONS
853 TAD [30 /CHANGE TO READ MODE
854 DTXA
855 DTSF /WAIT TILL READ DONE
856 JMP .-1
857 TAD [200 /STOP TAPE
858 DTXA
859 TAD I [WC /GET BLOCK LENGTH
860 JMP I FIXTAP /EXIT
861FIXERR, JMS I [ERROR
862 TAD [400 /END OF TAPE...REVERSE DIRECTION
863 TAD [210 /START TAPE MOVING
864 DTXA /AND CLEAR FLAGS
865 JMP FIXTAP+3 /TRY AGAIN
866\f
867/PARITY ERROR WORD COUNT STACK
868PSTACK, 0
869
870
871/
872
873/END OF PROGRAM
874$