1 /2 OS8 PIP10 - PDP-10 CONVERSION PROGRAM V3A
11 /COPYRIGHT (C) 1974,1975 BY DIGITAL EQUIPMENT CORPORATION
22 /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE
23 /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT
24 /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY
25 /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT.
27 /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER
28 /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED
29 /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH
30 /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL.
32 /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE
33 /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY
53 /WRITTEN BY MARK BRAMHALL 1970
54 /MODIFIED FOR TD8E BY R. LARY 1973
55 /DATE 75 PATCH ADDED BY S.R. AFTER 1/5/75
57 /PIP10 IS A PIP FOR OS8 THAT HANDLES PDP-10 DECTAPES
59 /COMMAND DECODER RULES:
61 /*OUTPUT_INPUT,INPUT,...
65 / DEFAULT DEVICE IS DSK:
66 / [NN] IGNORED IF PDP-10 OUTPUT
67 / IF /L OR /F DEFAULT OUTPUT IS TTY:
71 / DEFAULT DEVICE IS DSK:
72 / FOLLOWING DEFAULT DEVICES ARE THE PRECEEDING DEVICE
73 / UP TO NINE (9) INPUT FILES
76 / /L IS LIST DIRECTORY (ONLY VALID IF PDP-10 INPUT)
77 / /F IS SHORT FORM DIRECTORY (ONLY PDP-10 INPUT)
78 / /Z IS ZERO DIRECTORY BEFORE TRANSFER (ONLY IF PDP-10 OUTPUT)
79 / /D IS DELETE OLD OUTPUT FILE BEFORE TRANSFER
80 / /B IS BINARY MODE TRANSFER (I.E. 8 BITS PER 36 BITS)
81 / /I IS IMAGE MODE TRANSFER (I.E. 3 12 BITS PER 36 BITS)
82 / /P IS PRESERVE LINE NUMBERS (DEFAULT IS TO DELETE THEM)
85 / MAINTENACE RELEASE FIXES:
88 /2. TD8E RELIABILITY IMPROVEMENTS
89 /3. ANSI DATE OUTPUT FORMAT
90 /4. INCORPORATED PATCH BY DAVID HEMBLEN [UNITED AIRCRAFT
91 / RESEARCH LABORATORIES] TO ALLOW WRITING PDP-6
93 \f/COMMAND DECODER SETS UP:
95 /AT "MOUTPU" THE LIST--
96 / LLL LLL LLD DDD OR UUU 100 000 000
97 / NAME (TRIMMED) NAME (EXCESS 40)
100 / EXTENSION EXTENSION
103 / OS8 FILE OR PDP-10 FILE
105 /WHERE L IS LENGTH (8 BITS), D IS DEVICE (4 BITS), U IS UNIT (3 BITS)
107 /AT "MINPUT" THE LIST--
108 / LLL LLL LLD DDD OR UUU 100 000 000
109 / START BLOCK ANY BLOCK
111 / OS8 FILE OR PDP-10 FILE
113 /THE LIST ENDS WITH A ZERO (0) WORD
115 /AT "MPARAM" THE BLOCK--
120 /WHICH ARE THE OPTION CHARACTERS
122 /THE = CONSTRUCTION IS NOT IMPLEMENTED
125 VERSION= 3 /VERSION NUMBER
126 SUBVER= 01 /PATCH LEVEL
127 /LOCATED AT "VERLOC" AS 60+VERSION^100+SUBVER
129 DIRECT=7000 /PDP-10 DIRECTORY BUFFER (FIELD 1)
130 IBUF10=3000 /PDP-10 INPUT BUFFER (FIELD 1)
131 INBUF=3000 /OS8 INPUT BUFFER (FIELD 1)
132 OBUF10=5000 /PDP-10 OUTPUT BUFFER (FIELD 1)
133 OUBUF=5000 /OS8 OUTPUT BUFFER (FIELD 1)
135 OUDEVH=7200 /OUTPUT DEVICE (FIELD 0)
136 INDEVH=6600 /INPUT DEVICE (FIELD 0)
138 INCTL=1010 /INPUT CONTROL
139 OUCTL=5010 /OUTPUT CONTROL
140 INRECS=4 /INPUT RECORDS
142 MDATE=7666 /MONITOR'S DATE (FIELD 1)
144 MINPUT=7617 /INPUT LIST (FIELD 1)
145 MOUTPU=7600 /OUTPUT LIST (FIELD 1)
146 MPARAM=7643 /PARAMETER LIST (FIELD 1)
147 JSBITS=7746 /0S8 JOB STATUS BITS
149 DCB=7760 /DEVICE CONTROL BLOCK (FIELD 1)
150 PTP=20 /DCB VALUE OF THE PAPER TAPE PUNCH
151 \f/PAGE ZERO AND POINTERS
155 INDEX0, 0 /AUTO-INDEX REGISTERS
162 IXR, 0 /INPUT LIST INDEX REGISTER
166 UNIT10, 0 /CURRENT PDP-10 UNIT (U400)
168 POINT, 0 /GENERAL POINTER
170 CNTR, 0 /GENERAL COUNTER
172 TEMP1, 0 /TEMPORARIES
179 CHARNI, 0 /CHARACTER INPUT NUMBER
180 CHARNO, 0 /CHARACTER OUTPUT NUMBER
182 OUNIT, 0 /OUTPUT UNIT
185 IBLOCK, 0 /INPUT BLOCK
186 OBLOCK, 0 /OUTPUT BLOCK
188 INPUT, 0 /INPUT ROUTINE POINTER
189 OUTPUT, 0 /OUTPUT ROUTINE POINTER
191 IPOINT, 0 /INPUT POINTER
192 OPOINT, 0 /OUTPUT POINTER
194 SAVELN, 0 /OPTION /P SWITCH
196 MODE, 0 /OPTION /I AND /B SWITCH
198 WORDS, 0 /WORDS LEFT COUNTER
200 DATE, 0 /TODAY'S DATE
202 FREEP, 0 /POINT TO FREE SPOT
204 PRINT0, 0 /PRINT ROUTINE TEMPORARIES
208 PRINTC, 0 /240 FOR LEADING SPACES
210 RBFLAG, 0 /RUBOUT FLAG
212 CDDEVF, 0 /DEFAULT DEVICE NAME
218 CDEXT, 0 /FILE EXTENSION
222 PERSW, 0 /PERIOD SWITCH
224 DEVSW, 0 /DEVICE SWITCH
229 INSEG, 0 /PDP-10 UNIT WITH DIRECTORY IN CORE
231 PDP10D, ZBLOCK 10 /LIST OF KNOWN PDP-10 UNITS
233 CDCNT, 0 /INPUT LIST COUNTER
235 CDI04, 0 /POINTER SAVE
237 XDSK, TEXT /DSK/ /DEFAULT DEVICE DSK:
240 DVTYPE, 0 /DEVICE TYPE HOLDER
242 TAPFUN, 0 /DECTAPE FUNCTION
243 DATE75, 0 /1 MEANS HAD H.O. BIT ON
244 XDATE, 0 /POINTS TO EXTRA DATE BIT
245 HIDATE, 0 /HIGH-ORDER BIT OF TODAY'S DATE
247 / KLUDGE FOR DATE-75 BUG:
248 / ONLY CONSIDER 1 MORE BIT OF PRECISION
249 / INSTEAD OF ALL 3 EXTRA BITS
250 / SINCE OS/8 DATE WILL RUN OUT BEFORE
253 \f JMP I (PIP10 /NORMAL ENTRY
254 JMS ERROR /PIP10 CANNOT BE CHAINED TO
259 IOERR, JMS ERROR /I/O ERROR
262 NOROOM, JMS ERROR /NO ROOM IN TAPE OR DIRECTORY
265 NOOFIL, JMS ERROR /NO SUCH DEVICE
268 FNOTFD, JMS ERROR /FILE NOT FOUND
270 NOT10F, JMS ERROR /NOT A PDP-10 FILE
273 ERDELF, JMS ERROR /ERROR DELETING A FILE
276 NOTPSF, JMS ERROR /NOT A OS8 FILE
279 NOOOFL, JMS ERROR /ERROR OPENING THE OUTPUT FILE
282 SYNTAX, JMS ERROR /SYNTAX ERROR
285 ERROR, 0 /ERROR ROUTINE
289 DCA INDEX0 /POINT TO MESSAG-1
291 DCA OUTPUT /SET TTY: OUTPUT
292 JMS ERROR4 /PRINT THE STRING
293 JMP I (PIPCD /AND BACK TO NORMAL
295 ERROR4, 0 /PRINT THE STRING POINTED BY INDEX0
302 JMS ERROR2 /BREAK IT DOWN
316 TAD [200 /MAKE A CHAR
318 TAD (-337 /_ IS SPECIAL
346 PRINT7, DCA PRINTC /SET SWITCH
364 JMP PRINT5 /IT IS NON-ZERO
367 JMS I OUTPUT /PRINT LEADING SPACE IF DESIRED
380 \f/PDP-10 DECTAPE SERVICE ROUTINE
383 / JMS READT /READ PDP-10 DECTAPE
384 / BUFFER /BUFFER ADDRESS - FIELD 1
385 / BLOCK /BLOCK NUMBER
387 / JMS WRITET /WRITE PDP-10 DECTAPE
388 / BUFFER /BUFFER ADDRESS - FIELD 1
389 / BLOCK /BLOCK NUMBER
391 /THE UNIT IS IN "UNIT10"
393 TCON2, 2 /MUST BE AT BEGINNING OF PAGE!
395 WRITET, 0 /WRITE PDP-10 DECTAPE
396 CDF /BE SURE OF FIELD 0
399 JMS I (TDIOCK /CHECK FOR TD IO
400 TAD I WRITET /GET BUFFER ADDRESS
401 DCA TBUF /AND SAVE IT
402 JMS RWTEST /TEST DIRECTION
403 WRITE2, JMS I (FLIP /REVERSE - FLIP BUFFER NOW
405 WRITE1, DCA TAPFUN /SET FUNCTION (30=READ, 50=WRITE)
406 DTLB /SEARCH INTO FIELD 0
408 DCA I TCA /TAPE BLOCK INTO "TBLK"
409 TERR, RTL /ERROR BIT IS 0 INITIALLY
410 RAL /SHIFT END ZONE BIT INTO LINK
411 CML CLA /CLEAR REST OF THE JUNK
413 TSTART, SNL /SKIP IF NO REVERSE DIRECTION
414 TAD [400 /'REVERSE' BIT
415 DTXA /START DRIVE GOING
419 JMP TERR /YES - CHECK IT
420 DTRA /CHECK DIRECTION
422 RTL /DIRECTION BIT INTO LINK
423 TMOD1, SZL CLA /'SNL CLA' IF REVERSE MODE
424 TMOD4, TAD TCON2 /'CLL CLA CMA RAL' IF REVERSE MODE
425 TAD TBLK /GET BLOCK FOUND
427 TAD I WRITET /GET BLOCK DESIRED
429 SZA CLA /SKIP IF FOUND THE BLOCK
430 JMP TSTART /NOT FOUND - GO AGAIN
431 TMOD2, SZL CLA /'SNL CLA' IF REVERSE MODE
432 JMP TSTART+1 /FOUND BUT WRONG DIRECTION - REVERSE IT
434 TAD TBUF /GET BUFFER ADDRESS-1
435 DCA I TCA /SET ADDRESS
437 DTLB /SET FIELD 1 BUFFER
439 DTXA /SET READ OR WRITE
441 DCA I TWC /SET WORD COUNT OF 600 OCTAL WORDS
444 DTRB /CHECK FOR ERRORS
446 JMP I (IOERR /ERROR!!
449 TMOD3, JMS I (FLIP /POSSIBLE FLIP AFTER READ
453 TCA, 7755 /DECTAPE CURRENT ADDRESS
454 TWC, 7754 /DECTAPE WORD COUNT
455 TBLK, 0 /SET TO BLOCK FOUND IN SEARCH
456 TBUF, 0 /HOLDS BUFFER ADDRESS
460 READT, 0 /PDP-10 DECTAPE READ
464 JMS I (TDIOCK /CHECK FOR TD IO
465 TAD I READT /GET BUFFER ADDRESS
466 DCA TBUF /AND SAVE IT
468 DCA WRITET /MOVE RETURN ADDRESS
469 JMS RWTEST /CHECK DIRECTION
470 NOP /NO INITIAL FLIP IF REVERSE
471 TAD (30 /READ FUNCTION
472 JMP WRITE1 /GO DO REST OF THE ROUTINE
473 \fRWTEST, 0 /CHECK DIRECTION TO READ/WRITE AND SEARCH
475 JMS I (GOLDBK /GET OLD BLOCK NUMBER (NEGATIVE)
476 TAD I WRITET /GET DESIRED BLOCK
477 DCA TBLK /SAVE FOR FUTURE USE
479 TAD (10 /FORWARD - SZL CLA
480 TAD TMOD6 /REVERSE - SNL CLA
481 DCA TMOD1 /SET UP FOR DIRECTION
485 TAD WRITE2 /REVERSE - FLIP BUFFER AFTER
486 DCA TMOD3 /FORWARD - NO BUFFER FLIP
488 TAD (7344-1200 /REVERSE - CLL CLA CMA RAL
489 TAD TMOD5 /FORWARD - TAD TCON2
490 DCA TMOD4 /X0002 OR 17776
492 ISZ RWTEST /FORWARD - 2ND EXIT
495 CIA /REVERSE DIRECTION
498 TM600, CLA /NO LOWER THAN 0
499 DCA I TAPFUN /SET NEW LAST SERVICED BLOCK
500 TAD TBLK /REMEMBER SAVING THIS?
502 SMA SZA /<0 AND 0 SKIP AND HAVE LINK=0
503 CLL CML CIA />0 BECOMES <0 AND HAS LINK=1
505 CLA RTR /LINK HAS SEARCH DIRECTION
507 TAD (10 /ADD 'SEARCH' BIT
508 DTCA DTXA /LOAD SEARCH AND DIRECTION
510 DTXA /ADD UNIT (ALSO FLIPS DIRECTION)
513 \f/"OLDTBL" IS LIST OF LAST SERVICED BLOCKS
515 OLDTBL, 0;0;0;0;0;0;0;0
516 /FLIP THE BUFFER ROUTINE
518 FLIP, 0 /FLIP A 600 WORD BUFFER (FIELD 1)
519 TAD I (TBUF /BUFFER START
523 DCA FLIP2 /SET END (END=START+577)
525 DCA FLIP3 /SET COUNT (600/2=300)
526 CDF 10 /BUFFER IS IN FIELD 1
527 FLIP6, TAD I FLIP1 /GET START
529 DCA FLIP5 /SAVE TEMPORARILY
532 DCA I FLIP1 /PUT END INTO START
534 DCA I FLIP2 /PUT START INTO END
535 ISZ FLIP1 /BUMP POINTERS
544 FLIP1, 0 /START POINTER
545 FLIP2, 0 /END POINTER
548 FLIP7, 0 /FLIPPING TEMPORARIES
551 FLIP4, 0 /FLIP A CELL
557 DCA FLIP8 /ACCUMULATE RESULT
563 DCA FLIP8 /BUILD RESULT
569 DCA FLIP8 /BUILD RESULT
577 \f/TD8E I/O ROUTINE - CALLS STANDARD ROUTINE
580 DCA TDRET /SAVE RETURN ADDR
582 DCA TDFUN /SAVE READ/WRITE
583 JMS I (GET10D /GET TYPE OF DECTAPE
586 JMP I TDIOCK /TC08 - CONTINUE
588 DCA TDBUF /SAVE BUF ADDR
590 JMS GOLDBK /GET OLD BLOCK #
592 CLA RAL /GET DIRECTION
593 TAD (110 /ONE BLOCK, FIELD 1
595 DCA TDFUN /SAVE FINAL FUNCTION WORD
596 JMS I (TDUSET /SET UP HANDLER
601 DCA TDIOCK /SET UP HANDLER ENTRY PTR
616 TAD UNIT10 /GET THE UNIT WE NEED
618 RTL /SHIFT INTO BITS 9-11
620 DCA TAPFUN /POINT TO THIS UNIT'S POSITION
621 TAD I TAPFUN /GET LAST SERVICED BLOCK
625 \f/GET A LINE ROUTINE
629 JMS I [ERROR3 /ANNOUNCE US WITH A *
630 DCA RBFLAG /RESET RUBOUT FLAG
632 DCA IXR /POINT TO THE BUFFER
634 JMP CHLOOP /WAIT FOR TTY:
640 DCA INDEX0 /SET LIST SEARCH
646 JMP I INDEX0 /FOUND SO JUMP
652 DCA I IXR /STORE THE CHARACTER
656 JMP CHLOOP /GET ANOTHER CHARACTER
661 CLFINI, DCA I IXR /SET END
665 SPADR, -225;JMP CTRLU
678 BAKARR, JMS PRNT /"_"
680 JMP CINSRT+1 /USE "<" INSTEAD
684 JMS I [ERROR3 /CONTROL CHARACTERS
687 CLRLIN, JMS I [ERROR3
691 JMP GLINE+1 /NOT "^C"
694 JMP I (7605 /TO MONITOR
701 JMS I [ERROR3 /PRINT CR-LF
705 DCA TEMP1 /ALTMODE IS "$"
707 JMP CLFINI /ENDS THE LINE
712 JMP RBSPCL /SPECIAL TREATMENT
715 JMS I [ERROR3 /PRINT \
721 JMS I [ERROR3 /PRINT RUBED CHAR
724 JMP CHLOOP-1 /GO GET ANOTHER
727 JMP CLRLIN+1 /NOT INTO RUBOUTS
735 JMS I [ERROR3 /END OF RUBOUTS
738 JMS I [ERROR3 /PRINT CHAR
747 TAD I IXR /PRINT THE LINE
752 \f/FIND A SLOT ROUTINE
753 /SLOT NUMBERS BETWEEN 0 AND 1101
754 /RETURN WITH A 5 BIT NUMBER (1 TO 26 OCTAL)
757 / JMS FINDSL /FIND A SLOT
759 / (AC) /VALUE OF SLOT RETURNED
761 /SLOT NUMBER OF 0 RETURNS 7777
763 FINDSL, 0 /FIND A SLOT
765 TAD I FINDSL /GET SLOT NUMBER-1
769 JMS DIV7 /NO - DIVIDE BY 7
771 DCA DIV1 /USE REMAINDER FOR JUMPING
772 CDF 10 /BUFFER IS IN FIELD 1
773 DIV1, HLT /TEMPORARY AND JUMP CELL
776 JMP I FINDSL /EXIT WITH 7777 FOR SLOT NUMBER 0
778 FINDS0, FINDS1 /JUMP TABLE
791 DCA POINT /POINT TO DIRECTORY
793 DIV3, TAD (-7 /SUBTRACT 7'S
795 JMP I DIV7 /EXIT WITH REMAINDER
796 ISZ POINT /BUMP POINTER BY 3
801 /FIND SLOT ROUTINE #1
804 FINDS1, TAD I POINT /GET CELL
807 RTL /GET FIRST 5 BITS
808 FINDS8, AND [37 /ONLY 5 BITS
810 JMP I FINDSL /AND EXIT WITH VALUE IN AC
812 /FIND SLOT ROUTINE #2
819 /FIND SLOT ROUTINE #3
820 /USE WORD 1 BITS 10-11 AND WORD 2 BITS 0-2
823 AND [3 /USE BITS 10-11 OF 1ST WORD
825 RAL /SHIFT TO BITS 7-8
830 FINDS9, RTL /GET INTO BITS 8-11
831 AND [17 /GET ONLY BITS 8-11
832 TAD DIV1 /ADD OTHER BITS
835 /FIND SLOT ROUTINE #4
838 FINDS4, ISZ POINT /USE 2ND WORD
843 /FIND SLOT ROUTINE #5
844 /USE WORD 2 BITS 8-11 AND WORD 3 BIT 0
846 FINDS5, ISZ POINT /USE 2ND WORD
849 CLL RAL /GET BITS 7-10
850 DCA DIV1 /AND SAVE THEM
853 AND I POINT /GET BIT 0
856 /FIND SLOT ROUTINE #6
860 ISZ POINT /USE 3RD WORD
865 /FIND SLOT ROUTINE #7
866 /USE WORD 3 BITS 6-10
869 ISZ POINT /USE 3RD WORD
871 RAR /GET RID OF LAST BIT
873 \f/DELETE A PDP-10 ENTRY
876 / (AC) /POINT TO NAME-1 (FIELD 1)
877 / JMS DELETE /DELETE A PDP-10 ENTRY
879 / -OK- /ENTRY DELETED
881 DELETE, 0 /DELETE A PDP-10 ENTRY
882 JMS I (FIND /TRY TO FIND IT FIRST
883 JMP I DELETE /NOT FOUND
884 ISZ DELETE /FOUND - 2ND EXIT
885 DCA DELET1 /SAVE SLOT NUMBER
887 DCA DELET2 /START AT SLOT 1
889 DCA DELET3 /DO 1101 SLOTS
890 JMS FINDSL /FIND A SLOT
891 DELET2, 0 /SLOT NUMBER
893 TAD DELET1 /IS IT ONE OF OURS?
897 DCA .+2 /SET SLOT NUMBER AGAIN
898 JMS I (FILLSL /FILL WITH A 0
901 DELET4, ISZ DELET2 /NEXT SLOT
903 JMP DELET2-1 /YES - LOOP
904 CDF 10 /DIRECTORY IS IN FIELD 1
905 DCA I INDEX0 /REMEMBER "FIND" SETTING THIS UP?
906 DCA I INDEX0 /REMOVE THE FILE NAME
910 DCA INDEX0 /POINT TO EXTENSION
912 DCA I INDEX0 /REMOVE EXTENSION
917 DELET1, 0 /HOLDS FOUND SLOT NUMBER
920 \f/FILL A SLOT ROUTINE
923 / JMS FILLSL /FILL A SLOT
925 / VALUE /VALUE TO FILL SLOT WITH
927 /SLOT NUMBER 0 IS ILLEGAL!
929 FILLSL, 0 /FILL A SLOT ROUTINE
931 TAD I FILLSL /GET SLOT NUMBER-1
933 JMS I (DIV7 /DIVIDE BY 7
935 DCA FILLS9 /USE REMAINDER FOR JUMPING
936 TAD I FILLSL /GET VALUE
938 AND [37 /5 BIT VALUE ONLY
939 CDF 10 /DIRECTORY IS IN FIELD 1
940 FILLS9, HLT /TEMPORARY AND JUMP CELL
954 /FILL SLOT ROUTINE #1
958 RTR /VALUE INTO BITS 0-4
960 DCA FILLS9 /SAVE VALUE
962 AND [177 /AND OFF BITS 0-4
963 FILLS8, TAD FILLS9 /ADD IN VALUE
964 DCA I POINT /SET NEW WORD
968 /FILL SLOT ROUTINE #2
971 FILLS2, CLL RTL /VALUE INTO BITS 5-9
972 DCA FILLS9 /SAVE VALUE
974 AND (7603 /AND OFF BITS 5-9
977 /FILL SLOT ROUTINE #3
978 /BITS 10-11 OF WORD 1 AND BITS 0-2 OF WORD 2
980 FILLS3, DCA FILLS9 /SAVE VALUE
983 CLL RAR /GET BITS 10-11
987 AND (7774 /AND OFF BITS 10-11
988 TAD FILLSA /ADD IN BITS 10-11
989 DCA I POINT /SET NEW WORD
990 ISZ POINT /GOTO WORD 2
995 DCA FILLS9 /SAVE VALUE
997 AND (777 /AND OFF BITS 0-2
1000 /FILL SLOT ROUTINE #4
1004 RTL /SHIFT INTO POSITION
1005 DCA FILLS9 /AND SAVE
1006 ISZ POINT /USE WORD 2
1008 AND (7017 /AND OFF BITS 3-7
1011 /FILL SLOT ROUTINE #5
1012 /BITS 8-11 OF WORD 2 AND BIT 0 OF WORD 3
1015 TAD FILLS9 /GET VALUE
1016 CLL RAR /GET BITS 8-11
1017 DCA FILLSA /AND SAVE
1018 ISZ POINT /USE WORD 2 FIRST
1020 AND [7760 /AND OFF BITS 8-11
1021 TAD FILLSA /ADD IN THOSE BITS
1022 DCA I POINT /SET NEW WORD 2
1023 ISZ POINT /NOW WORD 3
1025 AND FILLS9 /GET BIT 0
1026 CLL RTR /AND SHIFT INTO POSITION
1027 DCA FILLS9 /AND SAVE IT
1029 AND I POINT /AND OFF BIT 0
1032 /FILL SLOT ROUTINE #6
1036 RTL /SHIFT INTO POSITION
1038 DCA FILLS9 /AND SAVE
1040 ISZ POINT /USE WORD 3
1042 AND (4077 /AND OFF BITS 1-5
1045 /FILL SLOT ROUTINE #7
1046 /BITS 6-10 OF WORD 3
1047 /BIT 11 OF WORD 3 A 0
1049 FILLS7, CLL RAL /SHIFT INTO POSITION
1050 DCA FILLS9 /AND SAVE
1052 ISZ POINT /USE WORD 3
1054 AND [7700 /AND OFF BITS 6-11
1057 CDF /SET H.O. DATE WORD OF FILE
1058 TAD I (SLOTNO /ENTRY NO. OF FILE
1060 TAD I (SLOTNO /SINCE 1 -10 WORD= 3 -8 WORDS
1061 TAD (DIRECT-1 /POINT TO HIGH ORDER BIT OF DATE
1064 STA CLL RAL /OTHER STUFF IS VERY IMPORTANT
1065 AND I FIXPTR /SO KEEP IT
1066 TAD HIDATE /OR IN THIS BIT
1067 DCA I FIXPTR /AND WRITE IT BACK
1070 FIXPTR, 0 /POINTS TO WORD CONTAINING H.O. DATE
1072 \f/GET NEXT SLOT ROUTINE
1073 /GOES BY 5'S EITHER FORWARD OR BACKWARD
1076 / (AC) /CURRENT BLOCK NUMBER
1077 / JMS NEXTSL /GET NEXT SLOT
1078 / (AC) /NEXT BLOCK NUMBER
1080 /GOES TO "NOROOM" IF DIRECTORY FULL
1082 NEXTSL, 0 /GET NEXT SLOT
1083 TAD NEXTDI /ADD IN DIRECTION FACTOR
1085 JMP NEXTS2 /<0 MEANS REVERSE DIRECTION
1088 JMP NEXTS2 />1101 MEANS REVERSE DIRECTION
1090 DCA NEXTS1 /SET NEW BLOCK NUMBER
1091 JMS I (FINDSL /IS THIS SLOT FREE?
1092 NEXTS1, 0 /BLOCK NUMBER
1094 JMP NEXTS3 /NO - NOT FREE
1096 DCA NEXTS7+1 /SET BLOCK AGAIN
1097 NEXTS7, JMS I (FILLSL /FILL THIS SLOT THEN
1099 SLOTNO, 0 /VALUE TO FILL WITH
1101 SMA CLA /MAKE SURE DIRECTION IS -4 OR 4
1105 TAD NEXTS7+1 /GET NEW BLOCK
1108 NEXTS2, CLA /REVERSE DIRECTION
1110 SMA CLA /SET 0 OR 1101
1112 DCA NEXTS1 /INTO BLOCK NUMBER
1114 CIA /REVERSE DIRECTION
1115 JMP NEXTS3+1 /GO PRETEND WE FOUND A FULL SLOT
1118 SMA CLA /MAKE DIRECTION -1 OR 1
1121 DCA NEXTDI /DIRECTION IS -1 OR 1
1123 DCA NEXTS4 /CHECK 1102 BLOCKS
1125 DCA NEXTS5 /SET START BLOCK
1126 JMS I (FINDSL /CHECK A SLOT
1127 NEXTS5, 0 /SLOT TO CHECK
1129 JMP NEXTS6 /FOUND A FREE SLOT
1130 ISZ NEXTS4 /TRY MORE?
1132 JMP I (NOROOM /NO - OUT OF ROOM
1134 TAD NEXTDI /ADD DIRECTION TO SLOT
1136 JMP NEXTS2 /<0 IS TOO FAR
1139 JMP NEXTS2 />1101 IS TOO FAR
1141 DCA NEXTS5 /SET NEW BLOCK
1142 JMP NEXTS5-1 /KEEP GOING
1144 NEXTS6, TAD NEXTS5 /GET FREE BLOCK
1145 JMP NEXTS7-1 /AND SET IT
1149 NEXTDI, 0 /DIRECTION (5, -5, 1, -1)
1153 /OUTPUT CHARACTER #3 - BITS 9-11 WORD 2 AND BITS 0-3 WORD 3
1181 \f/PDP-10 CHARACTER OUTPUT ROUTINE
1185 / JMS OCHR10 /OUTPUT TO PDP-10
1186 / -RETURN- /O.K. RETURN
1188 OCHR10, 0 /OUTPUT TO PDP-10
1189 DCA OCHARY /SAVE CHAR
1190 TAD MODE /IMAGE MODE?
1192 JMP OC10A1 /YES /I OR /B
1193 TAD OCHARY /NO - USE 7 BITS
1196 OC10A3, TAD CHARNO /GET CHAR NUMBER
1198 DCA OCHARZ /USE TO SET UP JUMP
1199 CDF 10 /BUFFER IS IN FIELD 1
1200 OCHARZ, 0 /JUMP TO THE ROUTINE
1202 OC10A1, SMA CLA /BINARY?
1214 /OUTPUT CHARACTER #0 - BITS 0-6 WORD 1
1216 OCHAR0, TAD I [OBUF10+2
1220 JMP OCHARA /STILL ROOM IN BUFFER
1221 CDF /NO ROOM IN BUFFER
1223 JMS I (NEXTSL /GET THE NEXT BLOCK NUMBER
1224 DCA OCHARZ /AND SAVE IT
1225 CDF 10 /BACK TO FIELD 1
1230 RTR /GET LINK POINTER
1238 DCA I [OBUF10+1 /AND SET POINTER
1240 DCA UNIT10 /SET OUR UNIT
1242 DCA .+3 /AND OUR BLOCK
1243 JMS I (WRITET /WRITE PDP-10 DECTAPE
1245 0 /BLOCK NUMBER IS SET
1246 CDF 10 /BACK TO FIELD 1
1250 DCA I [OBUF10+1 /CLEAR POINTER
1252 DCA OBLOCK /SET NEW BLOCK
1255 DCA I [OBUF10+2 /ZERO COUNT
1257 DCA OPOINT /RESET POINTER
1258 OCHARA, ISZ I [OBUF10+2 /BUMP COUNT
1259 TAD MODE /IMAGE MODE?
1269 DCA I OPOINT /SET 8 BITS
1271 OCHARC, CDF /BACK TO FIELD 0
1282 OCHARD, DCA I OPOINT /SET IT
1283 ISZ CHARNO /BUMP CHARACTER NUMBER
1286 /OUTPUT CHARACTER #1 - BITS 7-11 WORD 1 AND BITS 0-1 WORD 2
1292 CLL RAR /GET BITS 7-11
1295 DCA I OPOINT /SET WORD 1
1296 ISZ OPOINT /NOW WORD 2
1303 /OUTPUT CHARACTER #2 - BITS 2-8 WORD 2
1314 /OUTPUT CHARACTER #4 - BITS 4-10 WORD 3
1320 OC10A7, DCA I OPOINT /SET WORD 3
1322 DCA CHARNO /RESET CHARACTER NUMBER
1329 \f/PDP-10 CHARACTER INPUT
1332 / JMS ICHR10 /PDP-10 INPUT
1333 / -EOF- /END OF FILE RETURN
1334 / (AC) /NORMAL RETURN - CHARACTER IN AC
1336 ICHR10, 0 /PCP-10 INPUT ROUTINE
1339 DCA ICHARY /USE CHARACTER NUMBER TO FORM JUMP
1340 CDF 10 /BUFFER IS IN FIELD 1
1341 ICHARY, 0 /TEMPORARY AND JUMP CELL
1349 /INPUT CHARACTER #0 - BITS 0-6 WORD 1
1351 ICHAR0, TAD WORDS /GET NUMBER OF WORD LEFT
1353 JMP ICHARA /STILL MORE WORDS LEFT
1354 TAD IBLOCK /GET NEXT BLOCK
1356 JMP ICHARC+1 /NONE - EOF
1357 DCA .+5 /SET NEXT BLOCK
1359 DCA UNIT10 /SET OUR UNIT
1360 JMS I (READT /READ PDP-10 DECTAPE
1363 CDF 10 /BACK TO FIELD 1
1366 DCA WORDS /SET NUMBER OF WORDS
1372 DCA IBLOCK /SET NEXT BLOCK
1379 DCA IBLOCK /SET NEXT BLOCK
1381 DCA IPOINT /RESET POINTER
1386 DCA WORDS /COUNT DOWM ON NUMBER OF WORDS
1387 TAD MODE /IMAGE MODE?
1394 TAD I IPOINT /GET WORD 3
1396 AND [377 /USE 8 BITS
1397 ICHARC, ISZ ICHR10 /2ND EXIT
1398 CDF /BACK TO FIELD 0
1401 ICHARB, TAD SAVELN /PRESERVE OPTION?
1406 DCA ICHARY /POINT TO WORD 3
1410 JMP ICHARF /WORD O.K.
1412 ISZ IPOINT /IGNORE THIS WORD
1416 ICHARF, TAD I IPOINT
1420 ICHARD, ISZ CHARNI /BUMP COUNTER
1421 AND [177 /USE 7 BITS
1425 /INPUT CHARACTER #1 - BITS 7-11 WORD 1 AND BITS 0-1 WORD 2
1432 CLL RTL /GET BITS 7-11
1434 ISZ IPOINT /USE WORD 2 NOW
1438 AND [3 /GET BITS 0-1
1439 ICHARE, TAD ICHARY /ADD IN OTHER BITS
1442 /INPUT CHARACTER #2 - BITS 2-8 WORD 2
1452 /INPUT CHARACTER #3 - BITS 9-11 WORD 2 AND BITS 0-3 WORD 3
1454 ICHAR3, TAD I IPOINT
1459 ISZ IPOINT /USE WORD 3 NOW
1464 AND [17 /GET BITS 0-3
1467 /INPUT CHARACTER #4 - BITS 4-10 WORD 3
1469 ICHAR4, DCA CHARNI /RESET CHARACTER COUNT
1482 \f/CLOSE A PDP-10 FILE
1485 / JMS CLOS10 /CLOSE A PDP-10 FILE
1488 CLOS10, 0 /CLOSE A PDP-10 FILE
1489 TAD MODE /IMAGE MODE?
1491 JMP CLOS1A /YES - NO FILL NEEDED
1494 JMP CLOS1A /CHARACTER NUMBER IS 0 - FILL DONE
1495 JMS I (OCHR10 /0 FILL
1499 DCA UNIT10 /SET OUR UNIT
1501 DCA .+3 /SET THE BLOCK
1502 JMS I (WRITET /WRITE PDP-10 DECTAPE
1506 JMS I (DELETE /DELETE THE OLD FILE
1507 NOP /O.K. IF IT IS NOT THERE
1509 DCA INDEX0 /POINT TO THE FREE SPOT
1511 DCA INDEX1 /POINT TO THE FILE NAME
1515 TAD I INDEX1 /SET THE NAME
1521 DCA INDEX0 /POINT TO THE EXTENSION
1523 DCA I INDEX0 /SET THE EXTENSION
1527 DCA I INDEX0 /SET THE DATE
1528 JMS I (FIX75 /V3C SET HIGH ORDER BIT TOO
1529 JMS I (WRITET /WRITE PDP-10 DECTAPE
1531 144 /BLOCK 100 BASE 10
1533 \f/OPEN A PDP-10 FILE FOR OUTPUT
1536 / JMS OOPN10 /OPEN A PDP-10 FILE
1539 OOPN10, 0 /OPEN A PDP-10 FILE
1541 JMS I (FIND /FIND A FREE SPOT
1542 JMP I (NOROOM /NO ROOM LEFT
1543 DCA I (SLOTNO /SET THIS SLOT
1545 DCA FREEP /SAVE POINTER TO FREE SPOT
1547 DCA I (NEXTDI /SET DIRECTION = -1
1549 JMS I (NEXTSL /FIND FIRST OPEN SLOT
1550 DCA OBLOCK /AND SET IT
1559 DCA I [OBUF10+2 /SET FIRST BLOCK POINTER
1564 DCA I [OBUF10+1 /SET FIRST BLOCK POINTER
1565 DCA I [OBUF10 /ZERO LINK POINTER
1566 DCA CHARNO /RESET CHARACTER NUMBER
1568 DCA OPOINT /RESET POINTER
1571 \f/OPEN PDP-10 INPUT FILE
1574 / (AC) /POINT TO FILE NAME-1
1575 / JMS IOPN10 /OPEN PDP-10 INPUT FILE
1577 / (AC) /ANY BLOCK OF THE FILE
1579 IOPN10, 0 /OPEN PDP-10 INPUT FILE
1580 JMS I (FIND /FIND THE FILE
1581 JMP I IOPN10 /NOT THERE
1582 DCA IOPN1B /SAVE SLOT NUMBER
1587 IOPN1F, JMS I (FINDSL /FIND A SLOT
1588 IOPN1A, 0 /SLOT TO FIND
1590 TAD IOPN1B /IS IT US?
1594 TAD IOPN1A /BUMP BLOCK NUMBER
1599 JMP I IOPN10 /TOO FAR - EXIT
1601 DCA IOPN1A /SET NEW BLOCK
1604 IOPN1B, 0 /SLOT THAT WE WANT
1608 JMP IOPN1F-1 /CHANGE DIRECTION AND RETRY
1615 \f/CONVERT OS8 DATE TO PDP-10 DATE
1619 JMP I CVDATE /0 CONVERTS TO 0
1628 AND [7 /GET OS8 YEAR (-1970)
1632 DCA DATE1 /SAVE YEAR
1637 DCA DATE1 /DATE1=DATE1*12
1644 TAD DATE1 /ADD IN MONTH
1652 TAD TEMP2 /*12+*3=*15
1654 TAD DATE1 /*30+1=*31
1655 TAD DATE4 /V3C ADD IN DAY
1656 DCA DATE1 /DATE1=DATE1+MONTH-1 * 31
1657 RAL /V3C LINK NOW HAS HIGH ORDER DATE BIT
1658 DCA HIDATE /ONLY WITHIN RANGE OF OS/8
1659 TAD DATE1 /RETURN LOW ORDER 12 BITS OF DATE
1667 SZL /LINK HAD HIGH ORDER BIT
1668 TAD (4 /IF ON, WANT ADDITIONAL 11 YEARS, 4 DAYS
1669 DCA DATE1 /SAVE VALUE
1671 DCA DATE75 /SAVE FACT THAT NEED 'NUTHER 11 YEARS
1672 TAD (100 /V3C BASE IS (19)64
1673 DCA DATE2 /WILL BE YEAR
1676 JMP DATE12 /MUST BE POSITIVE
1677 ISZ DATE2 /BUMP YEAR
1679 TAD (-564 /-372 DECIMAL (DAYS PER YEAR)
1683 DATE12, DCA DATE3 /WILL BE MONTH
1684 TAD DATE1 /DIVIDE BY 31
1688 ISZ DATE3 /BUMP MONTH
1693 ISZ DATE1 /+1 IS DAY
1694 TAD DATE3 /DIVIDE BY 12
1698 ISZ DATE2 /BUMP YEAR
1708 JMS I OUTPUT /PRINT LEADING 0 IF NECESSARY
1710 JMS I (PRINT /PRINT DAY
1715 TAD DATE3 /V3C MULTIPLY BY 3
1716 TAD (MONTBL /ADD IN BASE OF MONTH NAMES
1717 DCA MONPTR /POINT TO PROPER MONTH NAME
1718 TAD I MONPTR /GET CHAR 1
1719 JMS I OUTPUT /PRINT IT
1720 ISZ MONPTR /POINT TO NEXT CHAR
1721 TAD I MONPTR /GET CHAR 2
1722 JMS I OUTPUT /PRINT IT
1730 TAD (13 /ADD 11 YEARS IF H.O. BIT ON
1732 JMS I (PRINT /PRINT YEAR
1737 MONPTR, 0 /V3C POINTS TO MONTH NAME
1745 PRINTZ, 0 /PRINT WITH LEADING SPACES
1752 /ZERO A DIRECTORY (PDP-10)
1754 ZERO10, 0 /ZERO THE PDP-10 DIRECTORY
1758 JMP I (NOT10F /NOT A PDP-10
1760 DCA UNIT10 /SET UNIT
1762 DCA INDEX0 /POINT TO DIRECTORY
1764 DCA CNTR /COUNT OF 600
1765 DCA I INDEX0 /ZERO THE DIRECTORY
1769 DCA I (DIRECT /SAVE BLOCKS 1 AND 2
1771 DCA I (DIRECT+52 /SAVE BLOCK 144
1773 DCA I (DIRECT+367 /SAVE BLOCKS 1102 ON UP
1776 JMS I (WRITET /WRITE PDP-10 DECTAPE
1778 144 /DIRECTORY BLOCK
1781 \f/DELETE A PDP-10 FILE
1783 DELE10, 0 /DELETE A PDP-10 FILE
1787 JMP DELOS8 /DELETE A OS8 FILE
1789 DCA UNIT10 /SET UNIT
1792 JMS I (DELETE /DELETE THE PDP-10 FILE
1793 JMP I (ERDELF /NOT THERE
1794 JMS I (WRITET /WRITE PDP-10 DECTAPE
1796 144 /DIRECTORY BLOCK
1800 JMS I (DELPS1 /DELETE A OS8 FILE
1802 JMP I (ERDELF /ERROR DELETING THE FILE
1805 /GET THE NEXT INPUT FILE
1807 NEXIFL, 0 /GET THE NEXT INPUT FILE
1808 DCA CHARNI /RESET STUFF
1821 DCA IBLOCK /SET START BLOCK
1826 JMP NEXIF1 /PDP-10 FILE
1866 DCA IBLOCK /SET START BLOCK
1868 NEXIF3, DCA INPUT /SET ROUTINE POINTER
1886 \fPIP10, CDF 10 /STARTS HERE - JUMPED TO FROM 200
1888 TAD I (MDATE /GET TODAY'S DATE
1890 JMS I (CVDATE /CONVERT IT
1891 DCA DATE /AND STORE IT
1892 TAD (3401 /UNRESTARTABLE, DOESN'T DESTROY BATCH OR USR AREA
1895 JMS I (CD /COMMAND DECODE
1900 DCA MODE /SET /I SWITCH
1903 DCA SAVELN /SET /P SWITCH
1907 JMP I (LIST10 /EITHER /F OR /L
1910 JMP PIP001 /IS AN OUTPUT FILE
1913 JMP PIPCD /NO OUTPUT OR INPUT FILES
1914 JMP I (NOOOFL /INPUT, BUT NO OUTPUT
1916 PIP001, CLL CLA CML RTR
1919 JMS I (ZERO10 /IT IS /Z OPTION
1925 JMP PIPB /OUTPUT IS OS8
1927 DCA UNIT10 /SET UNIT
1929 DIRECT /GET DIRECTORY INTO CORE
1937 JMS I (DELE10 /DELETE A PDP-10 FILE FIRST
1945 DCA IXR /SET INPUT LIST
1950 JMP PIPC /OUTPUT IS OS8
1951 JMS I (OOPN10 /OPEN PDP-10 OUTPUT
1953 PIPD, DCA OUTPUT /SET OUTPUT ROUTINE
1954 PIPE, SZA CLA /IS IT ERROR OR EOF
1956 JMS I (NEXIFL /GET NEXT FILE
1958 JMS I INPUT /GET INPUT
1959 JMP PIPE /EOF OR ERROR
1960 JMS I OUTPUT /OUTPUT
1964 JMS I (OOPNPS /OPEN OS8 OUTPUT
1972 1 /GET OS8 OUTPUT HANDLER
1978 TAD I [MOUTPU /NOW CLOSE THE OUTPUT FILE
1991 \fLIST10, TAD (OUDEVH+1
1995 TAD (3100 /RESET THINGS
1999 JMP LIST11 /OUTPUT FILE EXISTS
2004 LISTDV, TEXT /TTY/ /LOOKUP THE TTY:
2009 DCA I [MOUTPU /SET TTY: DEVICE NUMBER
2013 JMP I (NOTPSF /NOT A OS8 FILE
2023 JMS I (OOPNPS /OPEN OUTPUT FILE
2026 DCA OUTPUT /SET OUTPUT ROUTINE
2033 JMP I (PIPCD /NO INPUT
2037 JMS I (READT /READ THE DIRECTORY
2044 DCA I INDEX0 /CLEAR THE COUNTS
2051 JMS I (FINDSL /FIND ALL SLOTS
2055 ISZ I LIST15 /COUNT THE NUMBER IN EACH SLOT
2061 JMS I (PRINTZ /PRINT FREE BLOCKS
2064 JMS I (ERROR4 /"FREE BLOCKS"
2070 TAD (DIRECT+2 /HIGH ORDER BIT (4096'S) OCCURS AT END OF EACH
2071 DCA XDATE /PDP-10 WORD AT BEGIN OF DIRECTORY
2072 /THIS IS END OF EVERY 3RD PDP-8 WORD
2073 LIST17, CDF 10 /MAIN LOOP
2076 JMP I (LIST16 /DO NOT PRINT THIS BLANK ENTRY
2094 TAD I INDEX5 /GET EXTENSION
2102 JMP LIST19 /NO EXTRA IF NOT /L
2108 TAD I LIST23 /GET NUMBER OF BLOCKS
2112 RAR /HIGH ORDER BIT OF DATE TO LINK
2121 TAD (3 /POINT TO NEXT DATE H.O. BIT
2126 JMP I (PIPG /CLOSE THE FILE
2159 \f/FIND A PDP-10 ENTRY IN DIRECTORY
2162 / (AC) /POINT TO NAME-1 (FIELD 1)
2163 / JMS FIND /FIND A PDP-10 ENTRY
2165 / (AC) /SLOT NUMBER IF FOUND
2167 FIND, 0 /FIND A PDP-10 FILE
2168 DCA FIND4 /SAVE POINTER
2170 DCA INDEX0 /POINT TO DIRECTORY START
2172 DCA CNTR /22 DECIMAL FILES
2173 CDF 10 /DIRECTORY IS IN FIELD 1
2174 FIND2, TAD FIND4 /GET POINTER
2175 DCA INDEX2 /POINT TO NAME,EXT
2178 TAD I INDEX2 /CHECK WORD 1
2183 TAD I INDEX2 /CHECK WORD 2
2188 TAD I INDEX2 /CHECK WORD 3
2193 DCA INDEX1 /POINT TO EXTENSIONS
2196 TAD I INDEX2 /CHECK WORD 4
2202 TAD I INDEX2 /CHECK WORD 5
2207 DCA INDEX0 /POINT TO ENTRY AGAIN
2210 ISZ FIND /WE FOUND IT - 2ND EXIT
2211 FIND3, CDF /BACK TO FIELD 0
2214 FIND1, ISZ INDEX0 /EXTRA POINTER BUMPS
2216 ISZ CNTR /MORE FILES?
2217 JMP FIND2 /YES - LOOP
2218 JMP FIND3 /NO - NOT FOUND
2220 FIND4, 0 /POINTER TO NAME-1
2225 LISTM1, TEXT / FREE BLOCKS PIP10 V/
2227 60+VERSION^100+SUBVER
2230 ERMES0, TEXT /_PIP10 CANNOT BE CHAINED TO_/
2231 ERMES1, TEXT #_I/O ERROR_#
2233 ERMES2, TEXT /_DEVICE FULL_/
2235 ERMES3, TEXT /_NO SUCH DEVICE_/
2237 ERMES4, TEXT /_NOT PDP-10 FILE_/
2239 ERMES5, TEXT /_ERROR DELETING FILE_/
2241 ERMES6, TEXT /_NOT OS8 FILE_/
2243 ERMES7, TEXT /_OUTPUT FILE OPEN ERROR_/
2245 ERMES8, TEXT /_SYNTAX ERROR_/
2246 ERMES9, TEXT /_FILE NOT FOUND_/
2247 \f/ROUTINE TO SET TD8E UNIT INFORMATION FROM UNIT10
2257 DCA TDUNIT /SAVE EVEN/ODD BIT
2273 DVCTBL, 6770;6760;6750;6740
2310 TAD I IXR /GET A CHAR
2313 JMP GCH+1 /IGNORE SPACES
2324 JMS SLSHCH /GET OPTION
2332 JMS SLSHCH /GET OPTION
2337 JMP I (SYNTAX /ERROR
2340 DCA TEMP5 /POINT TO PARAMETERS
2348 JMP .-3 /FIND DIVIDED BY 12
2353 JMP .-2 /SHIFT A BIT
2359 TAD TEMP4 /OR IN THAT BIT
2383 EXA401, CLL CLA CML RAR
2403 \f/GET A NAME ROUTINE
2406 DCA CDDEV /CLEAR AREA
2409 DCA DEVSW /ALLOW DEVICES
2410 GNAME1, DCA CDNAME /CLEAR NAME,EXTENSION
2416 DCA PERSW /ALLOW EXTENSIONS
2418 DCA POINT /SET POINTER
2419 DCA CNTR /SET SWITCH
2420 GNAME2, JMS I (GCH /GET A CHAR
2427 JMP GNAME5 /: IS DEVICE
2430 JMP GNAME4 /. IS EXTENSION
2432 DCA TEMP6 /SAVE THE CHAR
2434 JMP GNAME6-1 /NOT 0-9 OR A-Z IS END
2437 AND [77 /GET TRIMMED ASCII
2439 JMP GNAME3 /LEFT HALF
2441 DCA I POINT /SET RIGHT HALF
2448 DCA I POINT /SET LEFT HALF
2455 JMP GNAME2-1 /LOOP - IGNORE
2460 JMP I (SYNTAX /ERROR
2462 DCA CDEXT+1 /CLEAR EXTENSION
2464 JMP GNAME2-2 /GET EXTENSION
2467 JMP I (SYNTAX /ERROR
2469 JMP I (SYNTAX /ERROR
2472 JMP I (SYNTAX /ERROR
2475 DCA CDDEV+1 /SET DEVICE
2476 JMP GNAME1 /NOW GET THE NAME
2486 DCA CDEXT+1 /CLEAR EXTENSION
2495 DCA I INDEX0 /CLEAR AREAS
2503 DCA INSEG /NO DIRECTORY IN CORE
2504 DCA PDP10D /NO KNOWN PDP-10 DRIVES
2512 DCA CDCNT /ZERO INPUT COUNT
2513 JMS I (GLINE /GET A LINE
2518 JMP NOBAKB /NO "<" IS LINE
2525 DCA CDDEVF /SET "DSK" AS DEFAULT
2528 JMS I (GNAME /GET THE NAME
2532 JMP CDX03 /NO SIZE SPECIFIED
2536 JMP CDX02 /END OF SIZE
2539 JMP I (SYNTAX /ERROR
2546 DCA CDEXT+2 /ADD IN NUMBER
2550 JMP I (SYNTAX /ERROR
2558 JMP I (SYNTAX /ERROR
2559 JMS I (CDOUTX /SET OUTPUT STUFF
2560 NOBAKA, TAD (MINPUT-1
2563 DCA CDDEVF /SET DEFAULT
2567 DCA CDI04 /SAVE POINTER
2570 JMP I CD /NO INPUT FILES
2572 DCA IXR /RESET POINTER
2573 CDI01, JMS I (GNAME /GET A FILE
2575 JMP CDI02 /DEVICE SPECIFIED
2579 DCA CDDEV+1 /SET DEFAULT DEVICE
2583 DCA CDDEVF+1 /SET NEW DEFAULT
2584 ISZ CDCNT /COUNT INPUT FILES
2588 JMP I (SYNTAX /TOO MANY FILES
2589 JMS I (CDINX /SET INPUT STUFF
2596 JMP I (SYNTAX /ERROR
2598 NOBAKB, TAD [LINBUF-1
2602 \fCDOUTX, 0 /SET OUTPUT STUFF
2604 JMP CDOUT9 /DEVICE SPECIFIED
2607 JMP I CDOUTX /NO NAME AND NO DEVICE IS NOTHING
2611 DCA CDDEV+1 /SET DEFAULT DEVICE
2612 CDOUT9, TAD (OUDEVH+1
2613 DCA CDOUT2 /SET OUTPUT HANDLER ADDRESS
2619 DCA CDOUT1+1 /SET DEVICE
2628 JMS I (GTDVTP /GET DEVICE TYPE AND COMPARE WITH TC08 AND TD8E
2630 JMP CDOUT3 /NOT DECTAPE
2640 JMS SETUNT /SET UP PHYSICAL UNIT FROM HANDLER ENTRY POINT
2641 JMS I (ROCK /CHECK THE TAPE
2642 JMP CDOUT3 /NOT PDP-10 DECTAPE
2643 JMS I (EXA40 /EXCESS 40 CONVERSION
2645 JMP CDOUT4 /SET PARAMETERS
2648 TAD CDEXT+2 /GET LENGTH
2651 TAD CDEXT+2 /O.K. - USE LENGTH
2654 AND [7760 /8 BIT LENGTH
2655 TAD CDOUT1+1 /ADD IN DEVICE NUMBER
2657 DCA I INDEX6 /SET DEVICE
2659 DCA I INDEX6 /SET NAME
2683 JMP I SETUNT /TC08 - FINISHED
2686 AND (7000 /TD8E ENTRY POINTS ARE STRANGE -
2687 TAD UNIT10 /MUST ROTATE UNIT NUMBER LEFT 1
2691 JMS I (TDUSET /SET UP TD8E OPCODES
2694 \fCDINX, 0 /SET INPUT STUFF
2698 DCA CDIN2 /SET DEVICE
2709 JMS GTDVTP /COMPARE DCB ENTRY WITH TC08 OR TD8E
2711 JMP CDIN3 /NOT DECTAPE
2713 JMS I (SETUNT /SET UP UNIT NUMBER
2714 JMS I (ROCK /CHECK THE TAPE
2715 JMP CDIN3 /NOT PDP-10 DECTAPE
2716 JMS I (EXA40 /DO EXCESS 40
2719 TAD UNIT10 /IS DIRECTORY IN CORE?
2721 JMP CDIN8 /YES - NO READ
2724 JMP CDIN7 /NO NAME - NO READ
2726 DIRECT /READ DIRECTORY
2729 DCA INSEG /SET DIRECTORY IN CORE
2743 JMS I (IOPN10 /OPEN THE PDP-10 FILE
2753 JMP CDIN9 /NO LOOKUP IF NO NAME
2758 CDIN4, CDNAME /LOOKUP
2767 AND [7760 /GET LENGTH
2768 TAD CDIN2+1 /ADD DEVICE
2772 DCA I INDEX6 /SET BLOCK STARTING
2783 TAD I TEMP1 /GET DCB ENTRY
2794 JMS GET10D /GET ENTRY IN TAPE TYPE TABLE
2796 JMP ROCK4 /UNKNOWN - ROCK IT
2806 DCA TEMP5 /POINT TO KNOWN TABLE
2814 SZA CLA /WHAT KIND OF TAPE?
2846 JMP I ROCK /OS8 UNIT
2850 JMP I ROCK /PDP-10 UNIT
2852 DTWAIT, 0 /WAIT FOR DECTAPE FLAG
2872 AND (100 /CHECK FOR TAPE NOT READY
2874 JMP TDCHK /WAIT FOR TAPE TO COME UP
2885 SZA CLA /WAIT FOR GUARD
2891 TAD (-51 /SEARCH FOR SOME CRAP NEAR END OF RECORD
2895 IOTX6, SDLC /STOP TAPE
2898 TAD (-611 /9 WORDS FOR GOOD LUCK
2901 STL RTL /SET TABLE ENTRY TO 2 FOR TD8E TAPE
2911 FIELD 0 /DUMP PG 0 LITERALS HERE
2912 \f/TD8E DECTAPE ROUTINE
2915 /JULY 2 1971 GB/RL/EF
2917 /COPYRIGHT 1971 DIGITAL EQUIPMENT CORP.
2921 / THE ROUTINE DESCRIBED AND LISTED HERE IS A GENERAL
2922 /DATA HANDLER FOR THE TD8E DECTAPE SYSTEM. THE ROUTINE
2923 /CONTAINS SEARCH, READ, AND WRITE FUNCTIONS IN A FORMAT
2924 /WHICH IS COMPATIBLE WITH PS/8 DEVICE HANDLER CALLING
2927 /THIS ROUTINE CAN BE RE-EDITED AND ASSEMBLED TO PRODUCE
2928 /VARIATIONS ON THE BASIC TD8E SYSTEM. ASSEMBLY PARAMETERS
2930 /A) WHAT DRIVES (UNITS 0-7) WILL BE USED
2931 /B) THE ORIGIN OF THE TWO PAGE ROUTINE
2932 /C) WHAT MEMORY FIELD THE ROUTINE WILL RUN IN
2933 /D) THE SIZE OF THE DECTAPE BLOCK TO BE READ/WRITTEN
2935 /FOLLOWING ARE THE PARAMETERS SET UP FOR THE STANDARD
2936 /DEC VERSION OF THIS ROUTINE:
2938 DRIVE=10 /UNITS 0 AND 1 SELECTED
2939 ORIGIN=6200 /ENTRIES AT 6200 AND 6204
2940 AFIELD=0 /INITIAL FIELD SETTING
2941 MFIELD=00 /AFIELD*10=MFIELD
2942 WDSBLK=600 /384 WORDS PER BLOCK
2944 /THE USE OF THE PARAMETERS IS AS FOLLOWS:
2946 / DRIVE: DRIVE DETERMINES WHICH UNITS WILL BE SELECTED
2947 / DRIVE=10 IMPLIES UNITS 0 &1
2948 / DRIVE=20 IMPLIES UNITS 2&3
2949 / DRIVE=30 IMPLIES UNITS 4&5
2950 / DRIVE=40 IMPLIES UNITS 6&7
2952 /ORIGIN: ALTERING ORIGIN CAUSES ASSEMBLY IN A DIFFERENT
2953 / MEMORY LOCATION. WHEN CHANGING ORIGIN KEEP IN MIND
2954 /THAT THIS IS A TWO PAGE ROUTINE.
2956 /AFIELD: AFIELD DETERMINES THE INITIAL FIELD SETTING FOR THE
2957 / LOADER. PERMISSIBLE VALUES FOR AFIELD ARE 0 TO 7.
2959 /MFIELD: MFIELD IS USED IN A CIF CDF MFIELD INSTRUCTION.
2960 / THE VALUE INSERTED FOR MFIELD SHOULD BE 10(8) TIMES
2961 / THE VALUE FOR AFIELD. THE PERMISSIBLE VALUES ARE 00-70.
2963 /WDSBLK: WDSBLK GOVERNS HOW MANY WORDS THE ROUTINE THINKS ARE
2964 / IN A DECTAPE BLOCK. THE STANDARD VALUE IS 201(8) OR
2965 / 128 DECIMAL. NOTE THAT THE FUNCTION WORD BIT 10 CAN
2966 / BE USED TO SUBTRACT ONE FROM WDSBLK. THE VALUE USED
2967 / FOR WDSBLK SHOULD BE THE NUMBER OF WORDS THE TAPE WAS
2968 / FORMATTED TO CONTAIN.
2970 /IF WE WANT A HANDLER FOR UNITS 2&3 TO RESIDE IN
2971 /FIELD 2 AT LOCATION 3000 AND READ/WRITE 256(10) WORDS
2972 /PER BLOCK, THE PARAMETERS WOULD BE:
2979 /THE CALL TO THE SUBROUTINE FOLLOWS BASICALLY THE
2980 /CALLING SEQUENCE FOR PS/8 DEVICE HANDLERS.
2981 /THE CALLING SEQUENCE IS:
2984 / CIF MFIELD /MFIELD=FIELD ASSEMBLED IN
2985 / JMS ENTRY /ENTRY=ORIGIN (EVEN NUMBERED DRIVE
2986 /AND ORIGIN+4 FOR ODD NUMBERED DRIVE.
2995 /ARG1: FUNCTION WORD BIT0: 0=READ, 1=WRITE
2996 / BITS 1-5: # BLOCKS IN OPERATION
2997 / BITS 6-8: FIELD OF BUFFER AREA
2999 / BIT 10: # OF WORDS/BLOCK.
3000 / 0= WDSBLK, 1=WDSBLK-1
3001 / BIT 11: 1=START FORWARD, 0=REVERSE
3003 /ARG2: BUFFER ADDRESS FOR OPERATION
3004 /ARG3: STARTING BLOCK FOR OPERATION
3006 /ERRORS: THE HANDLER DETECTS TWO TYPES OF ERRORS:
3007 /A) FATAL ERRORS- PARITY ERROR, TIMING ERROR,
3008 / TOO GREAT A BLOCK NUMBER
3009 / FATAL ERRORS TAKE ERROR RETURN WITH THE
3011 /B) NON-FATAL- SELECT ERROR.
3012 / IF NO PROPER UNIT IS SELECTED, THE ERROR
3013 / RETURN IS TAKEN WITH CLEAR AC.
3014 /FATAL ERRORS TRY THREE TIMES BEFORE TAKING ERROR RETURN.
3015 /THE NORMAL RETURN IS TAKEN AFTER ALL INDICATED
3016 /BLOCKS HAVE BEEN TRANSFERRED. THE AC IS CLEAR.
3018 /THE TD8E IOT'S ARE:
3019 SDSS=7001-DRIVE /SKIP ON SINGLE LINE FLAG
3020 SDST=7002-DRIVE /SKIP ON TIMING ERROR
3021 SDSQ=7003-DRIVE /SKIP ON QUAD LINE FLAG
3022 SDLC=7004-DRIVE /LOAD COMMAND REGISTER
3023 SDLD=7005-DRIVE /LOAD DATA REGISTER
3024 SDRC=7006-DRIVE /READ COMMAND REGISTER
3025 SDRD=7007-DRIVE /READ DATA REGISTER
3027 /THE IOT'S IN GENERAL ARE 677X,676X,675X,AND 674X.
3028 /THE OTHERS CONTROL UNITS 2-7.
3034 DTA0, 0 /ENTRY POINT FROM UNIT 0
3038 DTA1, 0 /UNIT 2 ENTRY
3039 CLA CLL CML /1 TO LINK
3041 DCA DTA0 /PICK UP ARGS AT DTA0
3043 DCA UNIT /LINK TO UNIT POSITION
3045 TAD C6203 /GET DATA FIELD AND SETUP RETURN
3047 TAD I DTA0 /GET FUNCTION WORD
3048 DIO01, SDLD /PUT FUNCTION INTO DATA REGISTER
3049 CLL RTR /AC STILL HAS FUNCTION. PUT # WORDS PER
3051 SZL CLA /KNOCK ONE OFF WDSBLK?
3054 DCA WCOUNT /STORE MASTER WORD COUNT
3058 ISZ DTA0 /TO BLOCK NUMBER
3061 ISZ DTA0 /POINT TO ERROR EXIT
3062 CIF CDF MFIELD /TO ROUTINES DATA FIELD
3063 DIO02, SDRD /GET FUNCTION INTO AC
3065 AND CM200 /GET # PAGES TO XFER
3068 C374, AND C70 /GET FIELD FOR XFER
3069 TAD C6203 /FORM CDF N
3070 DCA XFIELD /IF=0 AND DF=N AT XFER.
3072 DCA TRYCNT /3 ERROR TRIES
3073 TAD UNIT /TEST FOR SELECT ERROR
3080 DIO06, SDRD /PUT FUNCT INTO XFUNCT IN SECOND PG.
3084 DIO07, SDRD /GET MOTION BIT TO LINK
3086 JMP GO /AND START THE MOTION.
3088 RWCOM, SDST /ANY CHECKSUM ERRORS?
3089 SZA CLA /OR CHECKSUM ERRORS?
3090 JMP TRY3 /PLEASE NOTE THAT THE LINK IS ALWAYS
3091 /SET AT RWCOM. GETCHK SETS IT.
3092 TAD PGCT /NO ERROR..FINISHED XFER?
3095 JMP EXIT /ALL DONE. GET OUT
3096 DCA PGCT /NEW PAGE COUNT
3097 ISZ BLOCK /NEXT BLOCK TO XFER
3098 TAD WCOUNT /FORM NEXT BUFFER ADDRESS
3102 CLL CML /FORCES MOTION FORWARD
3103 GO, CLA CML RTR /LINK BECOMES MOTION BIT
3105 TAD UNIT /PUT IN 'GO' AND UNIT #
3106 DIO09, SDLC /LOOK FOR BLOCK NO.
3108 JMS I CRDQUD /WAIT AT LEAST 6 LINES TO LOOK
3110 CM200, 7600 /COULD HAVE SAVED A LOC. HERE
3113 JMP .-1 /WAIT FOR SINGLE LINE FLAG
3115 CLL RTL /DIRECTION TO LINK. INFO BITS
3117 AND C374 /ISOLATE MARK TRACK BITS
3118 TAD M110 /IS IT END ZONE?
3119 SNA /THE LINK STAYS SAME THRU THIS
3121 TAD M20 /CHECK FOR BLOCK MARK
3124 DIO12, SDRD /GET THE BLOCK NUMBER
3125 SZL /IF WE ARE IN REVERSE, LOOK FOR 3
3126 /BLOCKS BEFORE TARGET BLOCK. THIS
3127 /ALLOWS TURNAROUND AND UP TO SPEED.
3131 CMA /IS IT RIGHT BLOCK?
3133 JMP FOUND /YES..HOORAY!
3134 M110, SZL SNA CLA /NO, BUT ARE WE HEADED FOR IT?
3135 /ABOVE SNA IS SUPERFLUOUS.
3138 ENDZ, SDRC /WE ARE IN THE END ZONE
3139 CLL RTL /DIRECTION TO LINK
3140 /V3C SZL CLA /ARE WE IN REVERSE?
3141 JMP GO /YES..TURN US AROUND
3142 /IF WE ARE IN THE END ZONE GOING FORWARD, IT IS AN ERROR
3146 JMP FATAL /LINK OFF MEANS AC=4000 ON RETURN
3148 CLL CML /AC=0 ON NORMAL RETURN
3150 DIO14, SDLC /STOP THE UNIT
3171 FOUND, SZL CLA /RIGHT BLOCK. HOW ABOUT DIRECTION?
3172 JMP GO /WRONG..TURN AROUND
3173 TAD UNIT /PUT UNIT INTO LINK
3174 CLL RAL /AC IS NOW 0
3175 C70, 70 /********DON'T MOVE THIS!!!!******
3177 TAD BUFF /GET BUFFER ADDRESS
3178 XFIELD, HLT /INTO NEXT PAGE
3183 DCA XBUFF /SAVE ADDRESS
3189 DCA DWORDS /WORD COUNTER
3192 JMP .-1 /LOOK FOR REVERSE GUARD
3195 TAD CM32 /IS IT REVERSE GUARD?
3197 JMP REVGRD /NO.KEEP LOOKING
3198 TAD XFUNCT /GET FUNCTION READ OR WRITE
3200 JMP READ /NEG. IS WRITE
3203 AND C300 /CHECK FOR WRITE LOCK AND SELECT ERROR
3204 CLL CML /LOCK OUT AND SELECT ARE AC 0 ERRORS
3206 JMP I CFATAL /FATAL ERROR. LINK MUST BE ON
3207 / JMS RDQUAD /NO ONE EVER USES THIS WORD!
3209 STA /V3C HACK FOR PDP-6
3210 JMS WRQUAD /V3C 7777 FOR REV CHECKSUM AND SKIP OVER LOCK
3212 TAD XUNIT /INITIATE WRITE MODE
3215 JMS WRQUAD /PUT 77 IN REVERSE CHECKSUM
3218 WRLP, TAD I XBUFF /GLORY BE! THE ACTUAL WRITE!
3220 ISZ XBUFF /BUMP CORE POINTER
3221 K77, 77 /ABOVE MAY SKIP
3222 ISZ DWORDS /DONE THIS BLOCK?
3223 JMP WRLP /NOT YET..LOOP A WHILE
3224 TAD XFUNCT /IS THE OPERATION FOR WDSBLK PER BLOCK?
3225 CLL RTR /IF NO, WRITE A 0 WORD
3228 JMS WRQUAD /WRITE A WORD OF 0
3229 JMS GETCHK /DO THE CHECK SUM
3230 JMS WRQUAD /WRITE FORWARD CHECKSUM
3231 JMS WRQUAD /ALLOW CHECKSUM TO BE WRITTEN
3232 JMS WRQUAD /V3C WRITE REST OF CHECKSUM [PDP-6]
3238 JMS RDQUAD /SKIP CONTROL WORDS
3240 TAD K7700 /TACK 7700 ONTO CHECKSUM.
3241 DCA CHKSUM /CHECKSUM ONLY LOW 6 BITS ANYWAY
3243 JMS EQUFUN /COMPUT CHECKSUM AS WE GO
3244 DCA I XBUFF /IT GETS CONDENSED LATER
3246 C300, 300 /PROTECTION
3247 ISZ DWORDS /DONE THIS OP?
3248 JMP RDLP /NO SUCH LUCK
3249 TAD XFUNCT /IF OP WAS FOR WDSBLK-1, READ AND
3250 CLL RTR /CHECKSUM THE LAST TAPE WORD
3253 JMS RDQUAD /NOT NEEDED FOR WDSBLK/BLOCK
3254 JMS EQUFUN /CHECKSUM IT
3255 RDLP2, JMS RDQUAD /READ CHECKSUM
3258 JMS GETCHK /GET SIX BIT CHECKSUM
3261 WRQUAD, 0 /WRITE OUT A 12 BIT WORD
3262 JMS EQUFUN /ADD THIS TO CHECKSUM
3263 DIO19, SDSQ /SKIP ON QUADLINE FLAG
3265 DIO20, SDLD /LOAD DATA ONTO BUS
3266 CLA /SDLD DOESN'T CLEAR AC
3269 RDQUAD, 0 /READ A 12 BIT WORD
3272 DIO22, SDRD /READ DATA
3276 EQUFUN, 0 /COMPUTE EQUIVALENCE CHECKSUM
3278 DCA EQUTMP /ACTUALLY CHECKSUMS ON DECTAPE ARE
3279 TAD EQUTMP /EQUIVALENCE OF ALL WORDS IN A RECORD
3280 AND CHKSUM /SIX BITS AT A TIME. BUT SINCE EQUIVALENCE
3281 CIA /IS ASSOCIATIVE, WE CAN DO IT 12
3282 CLL RAL /BITS AT A TIME AND CONDENSE LATER.
3283 TAD EQUTMP /THIS ROUTINE USES THESE IDENTITIES:
3284 TAD CHKSUM /A+B=(A.XOR.B)+2*(A.AND.B)
3285 DCA CHKSUM /A.EQU.B=.NOT.(A.XOR.B)=A.XOR.(.NOT.B)
3286 TAD EQUTMP /A.EQU.B=(A+(.NOT.B))-2*(A.AND.(.NOT.B))
3290 GETCHK, 0 /FORM 6 BIT CHECKSUM
3298 CLA CLL CML /FORCES LINK ON AT RWCOM
3378 INERR, CLL CLA CML RAR
3447 OUEFAL, TAD I (MOUTPU
3501 OULLLP, JMS I (OCHARP
3517 OUDUMP, TAD I (MOUTPU