1 /3.1 OS/8 V3 FOTP 5-AUGUST-1975 (NOT HALLOWEEN)
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
45 \f/WITH FAILSAFE CHANGES NOV 17, 1973 R.L.
48 / FOTP (FILE ORIENTED TRANSFER PROGRAM) H.J.
55 / FIELD 2 GETS CONDITIONALLY USED AS BUFFER
59 / 7577-4600 INCORE OUTPUT DIRECTORY
65 / 7577-7200 ERROR MESSAGES
66 / 7177-0 WORK AREA AS:
68 / AT TOP- OUTPUT HANDLER IF NEEDED
71 / INPUT HANDLER IF NEEDED
74 / INPUT DEVICES DIRECTORY
77 / THE TRANSFER BUFFER IN 8K
78 / IS WHAT EVER REMAINS.
80 /FIXES FOR MAINTENANCE RELEASE: (S.R. 5-AUG-75)
82 /1. CHANGED COPYRIGHT DATE
83 /2. INCORPORATED SEQ #1 PATCH (DSN MARCH 1975)
84 / PERMITS FOTP TO RECOVER FROM A MONITOR ERROR 6
85 / BY UNFAKING THE SYSTEM HANDLER
86 /3. UPDATED FOTP VERSION NUMBER TO V8
87 /4. ADDED SPACE FOR A PATCH LEVEL
88 /5. ALLOWED /T SWITCH TO WORK IN CONJUNCTION WITH /R
89 /6. PERMITS RENAMING A FILE TO IT'S OWN NAME
90 /7. IF NO OUTPUT DEVICE IS SPECIFIED WITH /R,
91 / ASSUME OUT DEV=INPUT DEVICE.
93 /8. FIXED BUG RE ADDITIONAL INFO WORDS
94 \f/PAGE 0 LOCATIONS OS/8 USR WON'T MANGLE
113 /AUTO INDEX REGISTERS USR WILL ALLOW ME TO USE TEMPORARILY
120 /VARIOUS CONSTANTS THAT CAN BE GENERATED
123 AC4000=CLA CLL CML RAR
127 / LOCATIONS REFERENCED IN OS/8
133 DIRKEY=7 /"DIRECTORY SEGMENT IN CORE" KEY
135 /SYMBOLIC FOTP LOCATIONS:
137 OUBUFR= 4600 /OUTPUT BUFFER - IN FIELD 1
138 INBUFR= 0 /INPUT BUFFER - IN FIELD 0
139 LSTFPG= 7000 /FIRST LOC OF LAST FREE PAGE IN FIELD 0
140 FAKHND= 200 /LOCATION OF OS/8 FAKEOUT HANDLER
141 VERSION= 11 /VERSION NUMBER
142 SUBVER= 01 /SUB VERSION (PATCH LEVEL)
143 /LOCATED AT "VERLOC" AS 60+VERSION^100+SUBVER
144 \f/STARTS AT 4600 IN FIELD 1 (ONCE ONLY CODE)
149 / .SAVE SYS FOTP;14600
154 CDCALL, JMS I (200 /SEE WHAT THE PERSON WANTS
156 STAR, 5200 /IN SPECIAL MODE
158 BYPSCD, JMS I (INTERC /CATCH CALLS TO 7600
160 TAD I (7600 /SAVE USER OUTPUT DEVICE
161 DCA I (USEROD /-FOR LATER
164 / CHECK FOR ? IN OUTPUT SPECIFICATION
165 TAD (-10 /8CHARACTERS TO LOOK AT
166 DCA CNT /CNT HAVING -10 PUTS US AT FIRST CHAR
168 JMS I (GTSXBT /GET A CHAR
169 TAD (-"?!7700 /CHECK FOR ?
171 JMP QINO /? IN OUTPUT NOT ALLOWED
175 / CHECK FOR EMBEDDED * IN ANY SPECIFICATION
183 TAD (-"*!7700 /CHECK TO SEE IF CHARACTER *
184 SZA CLA /SKIP IF IT IS
185 JMP CNTUP /GO LOOK AT NEXT
187 TAD CNT /ARE WE AT EXTENSION
189 TAD (6 /ARE WE AT START OF FILENAME?
191 ISZ CNT /BUMP COUNT ONLY IF OK
192 TAD PTR /LOOK AT NEXT CHAR
194 SZA CLA /SKIP IF ITS NULL - OK
196 CNTUP, ISZ CNT /BUMP TO NEXT CHAR
197 JMP ACK /CONTINUE CHECKING
198 TAD I PTR /ANY MORE INPUT
199 SNA CLA /SKIP IF THERE IS
201 TAD FIVE /BUMP TO NEXT ENTRY
204 \f/ CHECK FOR NULL OUTPUT SPECIFICATION AND MAKE *.*
206 NULLCK, TAD I (7601 /WAS OUTPUT FILENAME GIVEN?
207 SZA CLA /SKIP IF NONE
209 TAD STAR /PUT AN ASTERISK IN
210 DCA I (7601 /FILENAME
212 DCA I (7604 /AND EXTENSION
214 /THIS CODE SETS A DEFAULT OUTPUT DEVICE ON DELETE
216 DIDEML, TAD I (7600 /IS AN OUTPUT DEVICE SPECIFIED?
218 JMP ODSPEC /NOTE DEVICE NUMBER IN AC
219 TAD I (OPT1 /CHECK FOR /D
221 SZA CLA /SKIP IF NOT /D
222 JMP MOV /OUTPUT=INPUT
224 AND (100 /CHECK FOR /R
226 MOV, TAD I (7605 /WE'LL SUBSTITUTE FIRST INPUT DEVICE FOR USER
227 ODSPEC, AND (17 /CLEAR USER SPECIFIED LENGTH
228 DCA I (7600 /WE KNOW BETTER
230 /THE FOLLOWING BRINGS IN THE OUTPUT DEVICE HANDLER,
231 /READS THE DIRECTORY INTO CORE AND VERIFIES IT.
233 TAD (LSTFPG /SET THE FREE SPACE POINTER
234 DCA FPAGE /TO THE LAST FREE PAGE IN FIELD 0
235 TAD I (7600 /IS THERE AN OUTPUT DEVICE?
236 SZA /IF NO OUTPUT, DON'T FETCH HANDLER
237 JMS I (ASSIGN /GET THE HANDLER AND ALLOCATE ITS SPACE
238 DCA OUHAND /AC RETURNS HANDLER ENTRY POINT
239 JMS I (ODIRIN /READ IN THE OUTPUT DIRECTORY
240 TAD (7605 /INGIALIZE INPUT POINTER
242 /THIS IS THE BEGINING OF THE INPUT FILE LOOP
244 DOMOIN, DCA INFPTR /POINTER TO CURRENT INPUT
245 TAD I INFPTR /WHEN 0 NO MORE INPUT
246 SNA /SKIP IF MORE TO DO
247 JMP I (ENDCHK /DO END PROCESSING
248 JMS I (ASSIGN /ASSIGN AND ALLOCATE SPACE FOR INPUT HANDLER
249 DCA INHAND /AND SAVE ITS ENTRY ADDRESS
251 /THE FOLLOWING 2 INSTRUCTIONS HELP AVOID ALL KINDS OF
252 /PROBLEMS WITH THE MONITOR. IF A HANDLER GETS LOADED, THE
253 /MONITOR MAKES IT RESIDENT FOR OTHER PEOPLE AND DOESN'T DELETE
254 /ITS RESIDENT STATUS IF A REQUEST IS MADE FOR A NEW HANDLER
255 /TO BE LOADED OVER IT IF THE NEW HANDLER IS ALREADY RESIDENT
257 TAD FPAGE /SAVE FREE SPACE POINTER HERE
259 JMP I (PG1 /LINK TO NEXT SECTION
262 \fONDERR, JMS I (ERROR
263 ODRERR+40 /ERROR READING OUT DIR
270 \f/CHECK FOR NON FILE STRUCTURED INPUT
276 TAD I TEMP /IS FILE STRUCTURED BIT ON
277 SMA CLA /SKIP IF IT IS
280 JMS I INHAND /READ INPUT DEVICES DIRECTORY
286 TAD I IDBUF /MAKE SURE THAT THE
287 CMA CLL /DIRECTORY OF
288 TAD I (INBUFR+2 /THE DEVICE IS
291 TAD (7700 /(SEE COMMENT ON TEST IN ROUTINE "ODIRIN")
292 SZL CLA /SKIP IF ITS GOOD
295 /FIND LAST BLOCK OF DIRECTORY
297 AC2 /LINK TO NEXT SGMENT NUMBER
298 FNDLST, DCA PTR /SAVE IT
300 TAD I PTR /IS THERE ANOTHER SEGMENT?
302 JMP ATIT /NO...WE ARE POINTING TO LAST
303 TAD PTR /BUMP TO NEXT SEGMENT
305 JMP FNDLST /LOOK AGAIN
307 AND PTR /AND OUT 2'S BIT
308 TAD (400 /TOTAL SIZE OF IN CORE DIRECTRY
311 TAD FPAGE /WE ARE GOING TO PACK DIRECTORY
312 TAD (200 /RIGHT UP TO INPUT HANDLER SO
313 TAD CNT /WE GET MAX SIZE TRANSFER BUFFER
314 DCA FPAGE /ADJUSTED FREE CORE POINTER
317 DCA XR1 /SET UP PLACE TO MOVE TO
319 DCA XR2 /ALWAYS COMES FROM 0
324 \f/SET SAME DEVICE FLAG FLAG 4000 IF /D
329 RTL CLL /PUT /D BIT INTO AC 0
334 / COUNT NUMBER OF INPUTS FROM SAME DEVICE
335 /ALSO MAKE NULL INPUT FILENAMES *.*
338 TAD INFPTR /OK LETS GO THROUGH
339 DCA PTR /THE INPUT SPECIFICATIONS
340 GETCNT, ISZ PTR /POINT TO FILENAME WORD
341 TAD (3 /SET TEMP TO POINT TO EXTENSION
344 TAD SDFLG /ARE WE DOING /D
345 K7450, SNA /SKIP IF YES - AC NON 0
346 TAD I PTR /NO /D - LOOK AT FILENAME
347 SZA CLA /ITS NULL PUT IN *.*
348 JMP NOSUB /DONT CHANGE IT
353 NOSUB, CLA IAC /TEMP+1 POINTS TO NEW INPUT
356 /NOTE CNT WAS SET BY ISZ'ING TO ZERO
357 ISZ CNT /KEEP COUNT OF DEVICES IN GROUP
358 TAD I (OPT2 /CHECK FOR /U (UGLY SWITCH)
360 SZA CLA /SKIP IN NO /U
361 JMP NOPTIM /WERE FORCED TO DO ONE AT A TIME
362 TAD I PTR /COMPARE DEVICE NUMBERS
365 SNA CLA /SKIP IF NEW GROUP
366 JMP GETCNT /WE'LL DO ALL THE SAME AT ONCE
369 DCA INSCNT /AS NUMBER OF INPUTS TO DO AT ONCE
370 TAD PTR /SAVE WHERE TO CONTINUE FOR REST
372 \f/THE FOLLOWING CHECKS TO SEE IF A OPERATION
373 /IS BEING DONE FROM A DEVICE TO ITSELF
375 TAD I (7600 /GET DEVICE NUMBER
376 TAD (7646 /HANDLER ENTRY POINT TABLE
378 TAD I INFPTR /GET INPUT ENTRY POINT
381 TAD I PTR /CHECK INPUT ENTRY POINT AGAINST
383 TAD I TEMP /OUTPUT ENRTY POINT
384 SNA CLA /SKIP IF THEY ARE DIFFERENT
385 ISZ SDFLG /SET SAME DEVICE FLAG, AC11
386 TAD FPAGE /SET POINTER TO
387 DCA BDPTR /START OF DIRECTORY
388 DCA TYPFND /CLEAR FOUND FILE FLAG
389 JMP I (NBLOCK /LINK TO SOME MORE
392 SDFLG, 0 /NEGATIVE MEANS /D, ODD MEANS OUTPUT DEV=INPUT DEV
395 NFLEIN+40 /NON FILE STRUCTED INPUT
397 BADIRD+40 /ERROR READING INPUT DIR
399 BIDIRM+40 /NOT A GOOD DIRECTORY
402 \f/THIS IS THE SUPERQUASIFACETED DIRECTORY PATTERN MATCHING ROUTINE
404 /THE INPUT DIRECTORY IS SEARCHED HERE, IF A MATCH
405 /IS FOUND USING THE INPUT GROUPING
406 /GOT1 GETS CONTROL WITH -BLOCKS IN THE AC
409 TAD BDPTR /POINTER TO START OF DIR BLOCK
412 TAD I XR /GET COUNT OF NUMBER OF ENTRIES
413 DCA ENTCNT /SAVE LOCALLY TO AVOID HERB'S BUG
414 TAD I XR /GET BLOCK NUMBER FIRST FILE
416 TAD I XR /NEXT SEGMENT NUMBER
417 DCA LFLAG /IF IT 0 WE AT END
418 ISZ XR /SKIP TENTATIVE FILE WORD
419 TAD I XR /GET -NUMBER OF INFO WORDS
422 TAD XR /POINT TO FIRST
426 BLOOP, TAD I EPTR /GET FILENAME WORD
428 SNA CLA /SKIP IF FILE HERE
429 JMP EMPTY /NO... ITS REALLY AN EMPTY
430 TAD INSCNT /SET NUMBER OF INPUT TO LOOK
431 DCA NCNT /AT ALL AT ONCE
432 DCA MATFLG /CLEAR MATCH FLAG
433 TAD INFPTR /ADDRESS OF FIRST INPUT
435 MN1, TAD GPTR2 /ADDRESS OF CURRENT INPUT
436 TAD (5 /GTSXBT SUBR REQUIRES US TO
437 DCA GPTR2 /POINT TO END OF FIELD
438 TAD EPTR /POINT DIRECTORY POINTER TO
439 TAD (4 /END OF ENTRY FOR SAME REASON
441 TAD GPTR1 /SET EPNEXT TO POINT TO
442 TAD INFWDS /MINUS NUMBER OF BLOCKS IN
443 DCA EPNEXT /FILE WORD
444 TAD (-10 /NUMBER OF CHARS TO LOOK AT
446 \fMLP, TAD GPTR2 /OK - GET A CHARACTER FROM
447 JMS I (GTSXBT /STRING
448 TAD (-"*!7700 /IS IT AN *
450 JMP WILDA /YEP... ITS A WILD CARD
451 TAD ("*-"? /IS IT A ?
453 JMP WILD /YES... FORCE MATCH ON THIS CHAR
454 TAD ("?&77 /RESTORE VALUE
457 TAD GPTR1 /NOW GET CHAR FROM DIRECTORY
461 TAD CHAR /DO CHARS MATCH
462 SZA CLA /SKIP IF THEY DO
463 JMP NM1 /NO MATCH ON THIS INPUT
464 WILD, ISZ CNT /BUMP COUNT OF CHARS & POINTER
465 JMP MLP /COMPARE ALL 8
466 MEXT, ISZ MATFLG /A MATCH!!!!!!!
467 NM1, CLA /WILD CARD COMES HERE WITH ICHY AC
468 ISZ NCNT /HAVE WE CHECKED GROUP OF INPUTS
469 JMP MN1 /NO CHECK WHOLE GROUP
470 TAD MATFLG /HAVE THERE BEEN ANY MATCHES
472 TAD (4 /WILL INVERT /V SWITCH
473 TAD I (OPT2 /ADD SWITCH
476 /SKIPS IF INPUT DIRECTORY ENTRY IS NOT CANDIDATE
477 /THAT IS - IF A MATCH WAS NOT FOUND BETWEEN ANY
478 /OF THE INPUTS AND /V WAS NOT SPECIFIED OR
479 /A MATCH WAS FOUND AND /V WAS SPECIFIED
481 /THIS ALLOWS /V TO MEAN EVERYTHING BUT...
484 TAD I EPNEXT /GET -NUMBER OF BLOCKS
486 SZA /SKIPS IF TENTATIVE OR NOT CANDIDATE
487 JMP I (GOT1 /PROCESS FILE
488 NENT, TAD EPNEXT /POINT EPTR TO BLOCK
489 DCA EPTR /COUNT OF FILE
491 EMPTY, ISZ EPTR /ON EMPTY MAKE EPTR POINT TO BLOCK COUNT
493 TAD I EPTR /GET BLOCK COUNT
497 ISZ EPTR /POINT TO NEXT ENTRY
498 ISZ ENTCNT /BUMP THE NUMBER OF ENTRIES
499 JMP BLOOP /NOT DONE WITH SEGMENT
501 TAD (400 /BUMP TO NEXT SEGMENT
504 TAD LFLAG /DID WE PROCESS LAST SEGMENT
505 SZA CLA /SKIP IF WE DID
506 JMP NBLOCK /PROCESS NEW SEGNENT
507 TAD I (SFUDG /RESET FREE CORE POINTER
508 DCA FPAGE /TO PRESERVE INPUT HANDLER IF PRESENT
513 WILDA, TAD CNT /GET CURRENT CHAR POSITION
514 TAD (6 /ADD SIZE OF FILENAME
515 SPA /SKIP IF IN EXTENSION FIELD
516 JMP WILDNM /THIS BUMPS TO EXTENSION
517 JMP MEXT /THIS MEANS IT HAS TO BE A MATCH
531 \fGOT1, DCA IFCNT /-# OF BLOCKS IN AC
532 JMS I (DATCHK /VERIFY IF /C OR /O ALSO MATCH
533 ISZ I (TYPFND /COMES BACK IF THEY DO -
534 /TURN OFF NO FILES MSG FOR THIS INPUT GROUP
535 TAD I (OPT2 /CHECK FOR /T
538 TAD INFWDS /SEE IF DATE PRESENT
540 SZA CLA /SKIP IF NO DATE OR /T
543 SZA /SKIP IF NO DATE OR /T
544 DCA I (DATE /GIVE MONITOR FILES DATE
545 TAD (-4 /MAKE 2 COPIES
546 DCA CNT /OF THE INPUT
549 DCA XR /WORK WITH THEM
550 TAD (SPOT-1 /MAKE THEM AT SPOT
552 TAD (SPOT1 /SPOT1 WILL ALWAYS
553 DCA PTR /CONTAIN THE ORIGINAL
554 MOVENT, CDF 0 /AND SPOT WILL
555 TAD I XR /CONTAIN THE
556 CDF 10 /UPDATED VERSION AS
557 DCA I PTR /REFLECTED FROM
558 TAD I PTR /THE OUTPUT SPECIFICATION
563 TAD I (7601 /GET OUTPUT FILENAME
566 JMP TSTEXT /YES... LEAVE FILENAME ALONE
567 TAD I (7601 /REPLACE INPUT NAME
568 DCA I (SPOT /WITH GIVEN
570 DCA I (SPOT+1 /SPECIFICATION
573 TSTEXT, TAD I (7604 /SEE IF EXTENSION
575 SNA CLA /SKIP IF IT WASNT
576 JMP .+3 /LEAVE INPUT DEFAULT ALONE
577 TAD I (7604 /REPLCE EXTENSION
578 DCA I (SPOT+3 /WITH GIVEN EXTENSION
579 DCA TRFLG /CLEAR THE TRANSFER FLAG
580 TAD I (OPT2 /IS /R ON?
582 TAD I (SDFLG /OR /D OR INPUT DEV=OUTPUT DEV?
584 JMP SETGD /WE ARE DEFINITELY OK
585 SMA CLA /IF /D THEN CHECK OUTPUT
586 TAD (SPOT1-SPOT /OTHERWISE INPUT
588 JMP NSETGD /NO OUTPUT FILE GIVEN
589 SNA /AC=BLOCK NO OF FILE OR 0 IF NONE
590 JMP I (NENT /NO FILE - DO NOTHING
591 DCA TEMP /SAVE - WE MIGHT NEED IT
592 TAD I (SDFLG /IF OPERATION IS TRANSFER THEN
593 /TRFLG IS SET IF FILE HAS NOT
594 /MOVED; IF /D TRFLG MUST NOT BE
595 /SET ; WE DONT CARE ABOUT
596 /RENAME - ITS IRRELEVANT.
597 SMA CLA /SKIP IF /D- WILL CAUSE TRFLG=0
598 TAD TEMP /GET THE BLOCK FILE IS NOW AT
599 CIA /CHECK AGAINST ORIGINAL
600 TAD I (BLOCK /LOCATION
601 SNA CLA /SKIP IF IT MOVED - NOTE THAT
602 /IF THIS SKIPS THE USER IS DOING
603 /A PLAY WITH DEATH OPERATION
604 SETGD, ISZ TRFLG /ENABLE TRANSFERING OF THE FILE
605 NSETGD, TAD I (SDFLG /SET UP TO PROMPT OR LIST
606 SPA CLA /SKIP IF NOT /D
607 TAD (SPOT-SPOT1 /USE OUTPUT NAME
608 TAD (SPOT1+4 /USE INPUT NAME
609 JMS I (PRINTE /SEE IF HE WANTS TO BE PROMPTED
611 RTL /PUT /N INTO LINK
612 AND (400 /ISOLATE /R OPTION
613 SZA CLA /SKIP IF NOT /R
614 JMP I (RENAME /GO TO RENAME CODE
615 TAD I (SDFLG /CHECK FOR NO /D AND SAME DEV
616 SPA SNA CLA /SKIP IF NO /D AND SANE DEV
617 TAD I (7600 /IS THERE AN OUTPUT?
618 SNA SZL /SKIP IF NO /N AND OUTPUT DEV
619 /DIDNT SKIP IF NO /D AND SAME DEVICE
620 JMP NODEL /DONT DELETE
621 JMS I (FAKUSR /FAKE USR HANDLER CALLS
624 SPOT /OUTPUT FILE NAME
626 CLA SKP /O.K. TO GET CLOSE ERROR NOW
627 ISZ I (WRTDIR /SIGNAL CHANGE MADE TO DIRECTRY
628 JMS I (UNFAK /FIXUP HANDLER ADDRESS AGAIN
630 TAD TRFLG /SET AC NOT 0 IF TRANSFER GO AHEAD
631 JMP I (NPG /LINK TO SOME MORE
637 \f/THIS PAGE OF CODE PERFORMS FILE MOVES FROM
640 NPG, SNA CLA /SKIP IF WE CAN DO TRANSFER
641 JMP NFUNCT /GO PROCESS NEXT ENTRY
643 /THE FOLLOWING SMALL STRANGE PIECE OF CODE
644 /DYNAMICALLY ALLOCATES THE BUFFER ACCORDING
645 /TO THE FREE SPACE IN FIELD 0 (INCLUDING
646 /DIRECTORY SHRINKING) OR ALLOCATES 15 BLOCKS
647 /IN FIELD 2 IF ITS AVAILABLE.
649 F2C1, TAD (7400 /BECOMES TAD EPTR IF ONLY 8K
650 AND (7400 /CALCULATE FREE SPACE
655 TAD IFCNT /SET THE OUTPUT
657 DCA OFCNT /AS POSITIVE NIMBER OF BLOCKS
658 TAD OFCNT /SET THE NUMBER
660 SNA CLA /UP FOR ENTER
661 TAD OFCNT /IF IT IS LESS
664 DCA TEMP /FOR FILES GREATER THAN 256
665 TAD (SPOT /SET THE ADDRESS OF THE
666 DCA SBLKN /OUTPUT NAME
667 TAD I (7600 /IS THERE AN OUTPUT FILE?
668 SNA /SKIP IF THERE IS
669 JMP NFUNCT /DO NO TRANSFER
670 TAD (7757 /INDEX INTO TENTATIVE FILE
671 DCA MSIZE /TABLE IN ORDER TO
672 TAD I MSIZE /CLEAR OUT ANY
673 AND (7770 /TENTATIVE WE DONT WANT
674 DCA I MSIZE /THIS COMES IF AN I/O ERROR HIT
675 TAD I (7600 /DO THE ENTER
676 JMS I (FAKUSR /MAKE USR USE IN CORE HANDLER
677 TAD TEMP /ADD IN BLOCK COUNT
682 JMP I (NOROOM /ENTER FAILED
683 TAD I (SVDATE /RESTORE REAL DATE TO MONITOR
685 JMS I (UNFAK /REMOVE OUR FAKE HANDLER
686 JMS I (ADDINF /COPY ADDITIONAL INFO WORDS
687 TAD IFCNT /SEE IF ENTER SIZE
688 STL CIA /GIVEN BACK IS
689 TAD MSIZE /ENOUGH - HANDLES >255 AND
690 SNL SZA CLA /NON FILE STRUCTURED
691 JMP I (NOROOM /LENGTHS. NOT ENOUGH
692 DCA INEOF /CLEAR INPUT END OF FILE
693 TAD SBLKN /SET THE OUTPUT BLOCK NUMBER
695 TAD I (BLOCK /SET THE INPUT BLOCK NUMBER
698 \f/THE FOLLOWING PIECE OF CODE IS A TRICKY PIECE
699 /THAT CALCULATES THE NUMBER OF BLOCKS TO READ
701 MOVEIT, TAD IFCNT /GET THE NUMBER OF BLOCKS
703 TAD BUFSIZ /ADD ON BUFFER SIZE
704 SNL /SKIP IF MORE ROOM AVAILABLE THAN NEEDED
705 DCA IFCNT /OTHERWISE RESAVE NEW COUNT
706 SZL /SKIP IF NOT AT END OF FILE
707 ISZ INEOF /SET END OF FILE INDICATOR
708 CIA /MAKES -BUFSIZ+COUNT
709 TAD BUFSIZ /MAKES COUNT OF NUMBER OF BLOCK
713 F2C2, TAD (20 /BECOMES NOP IF ONLY 8K
714 DCA INCTLW /SET INPUT CONTROL WORD
715 JMS I (CINTER /CHECK FOR ^C
717 JMP I (CTCDE /ABORT OPERATION
719 JMS I INHAND /READ INPUT HUNK
723 JMP I (RDERR /WELL- SCRATCH THAT FILE
724 TAD BLOCKN /UPDATE BLOCK COUNT
727 AC4000 /SET THE OUTPUT
728 TAD INCTLW /CONTROL WORD
730 JMS I (CINTER /CHECK FOR ^C
732 JMP I (CTCDE /ABORT OPERATION
733 ISZ I (MUSTWT /SIGNAL REAL OUTPUT DONE
735 JMS I OUHAND /WRITE A HUNK OF FILE
739 JMP I (WRTERR /WHAT A CRUMBY OUTPUT DEVICE
740 TAD OBLCKN /UPDATE THE
741 TAD BUFSIZ /OUTPUT FILE
742 DCA OBLCKN /BLOCK NUMBER
743 TAD INEOF /SEE IF THATS ALL FOLKS
744 SNA CLA /SKIP IF WE TRANSFERED FILE
745 JMP MOVEIT /DO SOME MORE
746 TAD I (7600 /OK - LETS MAKE IT PERMANENT
747 JMS I (FAKUSR /TELL USR TO USE INCORE HANDLER
752 JMP I (CLOERR /THIS IS IMPOSSIBLE (I HOPE)
753 JMS I (UNFAK /ENABLE SYSTEM USE OF REAL HANDLER
754 ISZ I (WRTDIR /SET WE CHANGED DIRECTORY FLAG
755 NFUNCT, JMP I (NENT /I KNOW ITS INEFFICIENT TO JUMP HERE
758 \f/HERE COMES GOBBS AND GOBBS OF GOODY LITTLE ROUTINES
760 /FIRST WE HAVE A NICE LITTLE ROUTINE WHICH WILL DO
761 /HANDY LITTLE THINGS LIKE FETCH A HANDLER
762 /AND IN ADDITION ALLOCATE THE SPACE FOR IT.
763 /JUST IMAGINE THIS CAN BE YOURS FOR THE LOW LOW PRICE
767 DCA TEMP /SAVE DEVICE NUMBER
770 12 /INQUIRE ABOUT HANDLER
772 JMP I (CLOERR /CANT HAPPEN (I HOPE)
773 TAD HADDR1 /DID WE GET BACK ADDRESS
774 SZA /SKIP IF NOT- NON-RESIDENT
775 JMP I ASSIGN /YES... RETURN ITS ENTRY POINT
777 TWOPAG, IAC /TURN ON 2-PAGE BIT
778 TAD FPAGE /GET FREE SPACE POINTER
779 DCA HADDR2 /SET FOR FETCH
782 DCA FPAGE /FREE SPACE
783 TAD TEMP /GET DEVICE NUMBER
787 JMP TWOPAG /FAILED- MUST BE 2-PAGER
788 TAD HADDR2 /RETURN ENTRY POINT ADDRESS
790 \f/THIS UTILITY ROUTINE RETURNS A SIS BIT
791 /CHARACTER FROM ANY FIELD (SET ON ENTRY)
792 /FROM ADDRESS IN AC-COUNT(IN HALF WORDS)
795 CLL RAL /DOUBLE POINTER ADDRESS
796 TAD CNT /ADD NEGATIVE DISPLACEMENT
797 CML RAR /GET WORD ADDRESS AGAIN
800 SNL /SKIP IF WE WANT RIGHT HALF
801 JMS ROTR6 /MAKE LEFT HALF RIGHT HALF
802 AND (77 /GET LOW SIX BITS
812 /THIS TAKES A SIX BIT CHAR IN AC AND CONVERTS
813 /IT TO ASCII TO TYPE IT
816 SZA /CONVERT 0 TO BLANKS
822 \f/TYPE TAKES A CHARACTER IN THE AC AND CALLS
823 /TTY TO TYPE IT IF ^O IS NOT IN AFFECT
824 /ALSO CHECKS FOR ^C AND ^P
827 DCA READKB /SAVE CHARACTER
828 JMS I (CINTER /SEE IF ^C
830 JMP I (CTCDE /ABORT OPERATION IF ^C OR ^P
832 JMS I (CTYPE /SEE IF TYPED
834 DCA ECHO /CLEAR ECHO SWITCH
835 TAD ECHO /IS ECHO IN EFFECT
837 JMP I TYPE /IGNORE CHARACTER IF ^O
838 TAD READKB /TYPE CHAR
844 TAD TCHAR /GET CHAR BACK
845 /** NEXT 4 LOCATIONS REPLACED IF BATCH ACTIVE BY:
847 TSF /** 7400 /ADDRESS OF BATCH OUTPUT ROUTINE
848 JMP .-1 /** CIF TOPFIELD
850 TAD TCHAR /GET CHAR AGAIN
851 TAD (-215 /IF WE JUST TYPED A C.R. TYPE
858 /GET A CHARACTER FROM KEYBOARD AND
864 JMS I (CINTER /IS IT ^C
868 AND (177 /AND GET RID OF
871 \f/ROUTINE TO MAKE SURE USER SPECIFIED
872 //C AND /O SWITCHES CAUSE CORRECT MATCH WITH DATE
875 TAD I (OPT1 /CHECK /C
877 NOP /RETURN HERE WITH AC=0 IF NO /C
878 SZA CLA /RETURN HERE WITH AC=0 IF DATES MATCH
879 JMP I (NENT /DATES DONT MATCH AND /C GIVEN
880 TAD I (OPT2 /CHECK /V
882 CMA CLA /SET AC=-1 IF NO /V
883 SNA CLA /RETURN HERE AC=0 IF DATES SAME
884 JMP I (NENT /DATES SAME WITH /V-IGNORE FILE
885 JMP I DATCHK /CONTINUE
887 MDATE, 0 //O AND /V ARE AC2
888 RTL /IS IT OPTION ON?
889 SMA CLA /SKIP IF IT IS
890 JMP I MDATE /NO- RETURN WITH 0 AC
891 ISZ MDATE /SKIP RETURN
893 TAD I GPTR1 /GET DATE WORD
896 TAD I (SVDATE /COMPARE WITH MONITORS, 0 IF =
903 \f/THIS IS THE CORE DEVICE HANDLER
904 /THE USR IS MADE TO COME HERE BY A CALL TO FAKUSR.
905 /THIS HANDLER SWAPS THE DESIRED BLOCK INTO
906 /THE USR AREA AND WRITES THE BLOCK BACK INTO THE
909 /THE CODE SET UP IN FIELD 0 TO CALL THE HANDLER IS:
912 / TAD FAKHND /GET RETURN ADDRESS
914 / JMP I .+1 /PLOP UP TO BODY OF HANDLER IN FIELD 1
918 FAKBDY, DCA RETLOC /SAVE ARGUMENT ADDRESS
919 TAD I RETLOC /GET CONTROL WORD
920 RAL /R/W BIT INTO LINK
921 CLA RAL /R/W BIT INTO AC11
922 TAD DCAXR1 /IF WRITE MAKE DCA XR2 ELSE XR1
923 DCA DCASPT /SAVE WHERE WE NEED IT
924 ISZ RETLOC /BUMP TO LOCATION (ALWAYS 1400 FROM USR)
925 ISZ RETLOC /BUMP TO BLOCK NUMBER
927 ISZ RETLOC /BUMP TO ERROR RETURN
928 ISZ RETLOC /NOW TO GOOD RETURN (WE WONT FAIL)
929 CLL RTR /MULTIPLY BY 400(8)
932 TAD (4177 /ADD ON TO BEGINING OF DIRECTRY
933 DCAXR1, DCA XR1 /SAVE IN BOTH XR1
936 TAD (1377 /NOW SAVE USR BLOCK AREA
937 DCASPT, HLT /IN EITHER XR1 OR XR2 (R OR W)
938 TAD (-400 /SET WORD TRANSFER COUNT
940 TAD I XR2 /GET A WORD
941 DCA I XR1 /PUT A WORD
944 JMP I RETLOC /GO BACK TO USR
945 \f/THIS ROUTINE DOES THE SETUP OF THE INCORE
946 /DIRECTORY HANDLER AND CHANGES THE REAL
947 /HANDLERS ENTRY POINT IN THE MONITOR SO THAT
948 /THE USR WILL CALL IT.
951 DCA UNFAK /SAVE DEVICE NUMBER
952 TAD UNFAK /INDEX INTO MONITORS RESIDENCY
955 TAD WRTDIR /SEE IF DEVICE HAS DIRECTORY
956 SPA CLA /SKIP IF IT DOES
957 JMP NOSUBST /!!!DONT CHANGE IF NON-FILE DEV
958 TAD (FAKHND /PUT OUR HANDLERS ADDRESS IN
959 DCA I TABAD /MONITORS TABLE
961 TAD (1200 /PUT IN HANDLER INTERFACE CODE
962 DCA I (FAKHND+1 /INTO FIELD 0 AS GIVEN ABOVE
970 TAD UNFAK /RETURN WITH DEVICE NUMBER IN AC
975 TAD OUHAND /RESET MONITORS TABLE TO
976 DCA I TABAD /POINT TO REAL HANDLER
982 \f/ENTER HERE IF A BRANCH TO 7600 OR 7605 OCCURS
984 FIXDIR, JMS UNFAK /JUST IN CASE
985 JMS I (CINTER /CHECK FOR ^C
987 AC4000 /EITHER WAY GO BACK TO
988 DCA I (ALTOPT /MONITOR BUT AFTER WE HANDLE DIRECTORY
989 CTCDE, TAD MUSTWT /IS MUST WRITE SET?
990 SNA CLA /SKIP IF /Q OR MUST WRITE
991 TAD WRTDIR /CHECK TO SEE IF WE HAVE TO
992 SPA SNA CLA /WRITE THE DIRECTORY
994 DCA WRTDIR /KEEP OLD DIRECTORY
995 JMS I (ERROR /TELL HIM
998 ENDCHK, ISZ I (ECHO /TURN ON ECHO
999 JMS DIROUT /WRITE OUT THE OUTPUT DIRECTORY
1000 JMS I (RESTORE /RESTORE 7600 IN FIELD 0
1001 TAD I (OPT2 /GET OPTION /W
1003 SNL CLA /SKIP FOR VESION NUMBER
1005 DCA I (OPT2 /STOPS RECUSION WITH ^P
1006 JMS I (ERROR /PRINT VERSION NUMBER
1010 NOVER, TAD I (ALTOPT /GO BACK TO MONITOR?
1011 SMA CLA /SKIP IF YES
1012 JMP I (CDCALL /CALL THE CD AGAIN
1013 CIF CDF 0 /RETURN TO MONITOR
1020 \fDIROUT, 0 /ROUTINE TO WRITE THE OUTPUT DIRECTORY
1021 TAD WRTDIR /AC>0 IF WE HAVE TO WRITE IT
1022 SPA SNA CLA /SKIP TO WRITE DIRECTORY
1025 JMS I OUHAND /WRITE DIRECTORY BACK ONTO DEVICE
1029 JMP I (ODERR /IS HE IN TROUBLE...
1030 DCA WRTDIR /CLEAR WRITE DIRECTORY FLAG
1031 JMP I DIROUT /RETURN
1033 \f/ROUTINE WHICH ECHOES ^(CHAR) AND SKIP RETURNS IF
1037 DCA T2 /SAVE CHARACTER
1038 TAD (200 /GT RID OF PARITY
1039 KRS /SEE WHATS IN BUFFER
1041 TAD T2 /COMPARE AGAINST DESIRED ONE
1042 SNA CLA /SKIP IF NOT ONE
1044 JMP I CTYPE /NO... JUST RETURN
1045 KCC /CLEAR CHARACTER
1053 ISZ CTYPE /SKIP RETURN
1058 /ROUTINE USED TO DETERMINE IF ^C OR ^P TYPED
1061 TAD (203 /CHECK FOR ^C
1063 JMP UPPCK /NO CHECK FOR ^P
1064 JMP SPURGE /YES SET ALTMODE BIT
1067 JMP I CINTER /NOT EITHER ^P OR ^C
1068 SKP /IF ^P CLEAR ALTMODE BIT
1069 SPURGE, CMA /SET BIT
1071 ISZ CINTER /SKIP RETURN
1073 \f/THIS ROUTINE MODIFIES THE THE MONITOR RETURN
1074 /LOCATIONS TO COME BACK TO FOTP AND SAVES WHAT
1075 /WAS THERE SO RESTORE CAN RESTORE THEM
1079 DCA I (SVDATE /SAVE MONITOR DATE
1081 TAD I (7600 /SAVE 7600,7601,7602,7605
1082 DCA SCODE /AND REPLACE WITH
1083 TAD (CIF CDF 10 /CIF CDF 10
1084 DCA I (7600 /JMP I .+1
1086 DCA SCODE+1 /7605 GETS JMP 7600
1087 TAD (5602 /THIS ENABLES FOTP TO WRITE
1088 DCA I (7601 /OUT DIRECTORY AN MANUAL ABORT
1089 TAD I (7602 /OR IF HANDLER PICKS UP ^C
1090 DCA SCODE+2 /AND TRIES TO GO TO MONITOR
1100 /THIS ROUTINE SIMPLY RESTORES THE MONITOR
1101 /LOCATIONS TO THEIR ORIGINAL VALUE
1104 TAD I (SVDATE /RESTORE DATE
1108 DCA I (7600 /RESTORE LOCATIONS
1119 \f/THIS IS THE MAGIC MESSAGE PRINTER
1120 /IT IS ACTUALLY USED MORE THAN JUST FOR ERROR MESSAGES
1121 /IF THE MESSAGE ENDS WITH A % THEN THE OPERATION
1122 /IS ABORTED OTHERWISE CONTROL IS RETURNED
1123 /TO THE CALLER AND NO CRLF IS GIVEN
1124 /ALL MESSAGES COMMING THROUGH HERE ARE ECHOED
1127 CLA CLL /JUNK MIGHT BE IN AC
1128 TAD I (ECHO /SAVE ECHO STATUS SO WE CAN
1129 DCA I (ECTMP /RESTORE IT AFTER MESSAGE
1130 ISZ I (ECHO /TURN ON ECHO
1131 TAD (-100 /USED SO WE CAN USE GTSXBT TO
1132 DCA CNT /UNPACK THE MESSAGES
1133 PLOOP, TAD I ERROR /CONTAINS ADDRESS OF MESSAGE
1135 JMS I (GTSXBT /GET CHARACTER
1139 JMP CRLF /WE HIT EOM AND CALLER NO WANT CONTROL
1140 TAD ("%&77 /RESTORE CHARACTER
1141 DCA DFLAG /SAVE IT FOR LATER
1142 TAD DFLAG /PRINT IT, 0 PRINTS AS BLANK
1144 ISZ CNT /BUMP TO NEXT CHAR IN MESSAGE
1145 TAD DFLAG /ARE WE AT END
1146 SZA CLA /SKIP IF WE ARE
1147 JMP PLOOP /DO ANOTHER CHARACTER
1148 ISZ ERROR /SKIP ADDRESS OF MESSAGE
1150 CRLF, TAD (215 /PRINT CR
1152 JMP I (ENDCHK /FINISH PROCESSING
1156 \f/THIS ROUTINE PRINTS A FILENAME.EXTENSION
1159 DCA NMEPLC /SAVE ADDRESS OF NAME
1160 TAD (-10 /SET CHAR COUNT
1162 PNLOOP, TAD NMEPLC /GET THE SIXBIT CHAR
1164 SZA /SKIP IF NULL CHAR
1165 JMS I (CONVTP /PRINT CHAR
1166 TAD (3 /SEE IF AT START OF
1170 TAD (". /PRINT THE DOT
1173 JMP PNLOOP /KEEP GOING
1180 INERR+40 /ERROR READING FILE
1181 DYSTF1, TAD (SPOT1+4 /PRINT INPUT FILE NAME
1182 DYSTUF, JMS I (PNMSUB
1185 TAD ECTMP /RESTORE ECHO FLAG AS
1186 DCA I (ECHO /SAVED ON ENTRY TO ERROR
1187 JMP I (NENT /GO TO NEXT FILE
1188 WRTERR, JMS I (ERROR
1189 OUERR+40 /ERROR WRITING FILE
1190 POUTNM, TAD (SPOT+4 /PRINT OUTPUT FILE NAME
1192 NORUMX, JMS I (ERROR /NOT ENOUGH ROOM FOR
1193 SPRBLM+40 /FILE ON OUTPUT DEVICE
1195 \f/ROUTINE WHICH PRINTS NO FILES MSG IF NECESSARY
1196 /IT WONT PRINT MESSAGE IF ANY FILE IN A SO CALLED
1197 /INPUT GROUP MATCHES(A BUG?)
1199 SAYNON, TAD I (TYPFND /GET INPUT MATCH FLAG
1200 SZA CLA /SKIP IF NOTHING MATCHED
1201 JMP GOBCK /DONT DO MESSAGE
1202 TLP, JMS I (ERROR /PRINT MESSAGE
1204 TAD INFPTR /POINT TO END OF INPUT ENTRY
1205 TAD (5 /TO MAKE GTSXBT WORK CORRECTLY
1207 TAD INFPTR /PRINT THE FILE NAME
1209 TAD (OTAB-2 /NOW PRINT /V,/C,/O IF
1210 DCA XR2 /ANY OF THEM SPECIFIED
1211 NOPT1, ISZ XR2 /FIX POINTER WHEN SWITCH NOT ON
1212 NOPT, TAD I XR2 /GET ADDRESS OF OPTION
1213 SNA /SKIP IF NOT AT END
1214 JMP CRIT /WE ARE AT END
1216 TAD I TEMP /GET OPTION WORD
1217 AND I XR2 /AND WITH OPTION BIT
1218 SNA CLA /SKIP IF OPTION GIVEN
1219 JMP NOPT1 /DO ANOTHER
1224 JMP NOPT /DO ANOTHER
1225 CRIT, TAD (215 /END WITH A CRLF
1227 TAD ECTMP /RESTORE ECHO FLAG THAT ERROR
1229 ISZ INSCNT /PRINT MESSAGE FOR ALL FILES
1231 GOBCK, TAD I (USEROD /GET USER SPECIFIED DEVICE
1232 SNA CLA /SKIP IF HE GAVE ONE
1233 TAD I (SDFLG /IF HE DIDNT WE CANT HANDLE /D
1234 SPA CLA /SKIP IF NO /D
1235 TAD I MOIN /YEP. /D BETTER NOT BE ANY MORE INPUT
1236 SZA CLA /THERE WASN'T - O.K.
1237 JMP DELERR /WARN HIM OF THE SHORTCOMING
1238 TAD MOIN /GET SAVED INPUT POINTER
1239 JMP I (DOMOIN /AND DO SOME MORE INPUTS
1241 DELERR, JMS I (ERROR
1242 CNTDEL+40 /MULTIPLE DEVICE DELETE
1250 \f/TABLE OF SWITCHES FOR "NO FILES" MESSAGE
1264 \f/THIS ROUTINE HANDLES THE /L AND /Q OPTIONS
1265 /IF EITHER IS ON IT PRINTS THE NAME
1266 /THEN IF ITS /Q IT PRINTS A ? AND WAITS FOR
1267 /A RESPONSE. IF Y IT RETURNS, ANYTHING ELSE
1268 /AND IT GOES TO PROCESS THE NEXT DIRECTORY ENTRY
1271 DCA I (NMEPLC /SAVE ADDRESS OF NAME
1272 TAD I (OPT1 /CHECK /L
1274 SZL CLA /SKIP IF NO /L
1276 TAD I (OPT2 /CHECK /Q
1279 JMP I PRINTE /RETURN
1280 ISZ I (ECHO /IF /Q FORCE ECHO ON
1281 PIT, TAD I (NMEPLC /NOW PRINT FILENAME
1283 DCA OKFLAG /CLEAR OKFLAG
1284 TAD I (OPT2 /WAS IT /Q?
1287 JMP FUNCT2 /JUST PRINT CRLF
1290 CMA /SET OKFLAG NO GOOD
1292 JMS I (READKB /GET A CHAR
1295 ISZ OKFLAG /IT WAS Y, SET OK AND SKIP
1298 JMS I (TYPE /ECHO IT
1299 FUNCT2, TAD (215 /PRINT CRLF
1301 TAD OKFLAG /OKFLG=0 MEANS YES
1302 SZA CLA /SKIP IF TO PROCESS FILE
1303 JMP I (NFUNCT /SKIP THIS FILE
1304 JMP I PRINTE /RETURN
1307 DCA I (WRTDIR /FIX RECURSION
1309 ODIERR+40 /ERROR WRITING DIRECTORY
1311 BODORM+40 /BAD OUTPUT DIRECTORY
1312 CLOERR, JMS I (ERROR
1313 SERR+40 /SYSTEM ERROR
1314 HLT /DONT LET HIM CONTINUE
1315 JMP .-1 /IT CAN ONLY GET WORSE
1317 SPOT, ZBLOCK 4 /ROOM FOR OUTPUT FILE NAME
1318 SPOT1, ZBLOCK 4 /ROOM FOR INPUT FILE NAME
1319 \f/CODE TO HANDLE OUT OF ROOM CONDITION ON OUTPUT DEVICE
1321 NOROOM, JMS I (UNFAK /RESTORE THE REAL OUTPUT HANDLER
1323 AND (100 /CHECK FOR THE /F OPTION SPECIFIED
1325 JMP I (NORUMX /NO - GIVE AN ERROR MESSAGE
1326 JMS I (DIROUT /FAILSAFING - WRITE OUT THE OUTPUT DIRECTORY
1327 JMS I (ERROR /PRINT THE MESSAGE
1328 FLSFMS+40 /"MOUNT NEXT OUTPUT VOLUME"
1329 JMS I (READKB /GET AN ANSWER
1330 CLA /ANY CHAR EXCEPT ^C OR ^P IS YES
1332 JMS I (TYPE /PRINT CRLF
1333 JMS ODIRIN /READ IN THE NEW OUTPUT DIRECTORY
1334 JMP I (FLSRSM /RECOMPUTE THE PENDING TRANSFER.
1336 ODIRIN, 0 /SUBROUTINE TO READ IN THE OUTPUT DIRECTORY
1337 TAD I (7600 /GET OUTPUT DEVICE NUMBER
1339 JMP NOUTFL /NO - DON'T READ OUTPUT DIRECTORY
1340 TAD (7757 /ADD ADDRESS OF MONITOR TABLE
1341 DCA TEMP /TO INDEX INTO IT
1342 TAD I TEMP /FILE STRUCTURED BIT IS 0
1343 SMA CLA /SKIP IF DIRECTORY DEVICE
1344 JMP NOUTFL /WE DONT WANT TO READ OR WRITE DIRECTORY
1346 JMS I OUHAND /READ DIRECTORY
1350 JMP I (ONDERR /ERROR
1352 CMA CLL /CHECK FOR LEGAL OUTPUT DIRECTORY - FIRST
1353 TAD I (OUBUFR+2 /WORD OF AN OS/8 DIRECTORY IS .LT. 50
1354 SNL /AND THE THIRD WORD MUST BE .LT. 7,
1355 TAD (7700 /SO WE CAN CHECK FOR THE SUM OF THOSE
1356 SZL CLA /WORDS BEING .LT. 64
1357 JMP I (BODIR /ERROR - CANT BE DIRECTORY
1359 NOUTFL, AC4000 /WRTDIR MINUS MEANS DONT WRITE
1360 DCA I (WRTDIR /DIRECTORY
1361 DCA I (MUSTWT /CLEAR THE MUST WRITE FLAG
1362 DCA DIRKEY /CLEAR THE OS/8 DIRECTORY KEY
1363 JMP I ODIRIN /RETURN
1365 \f/SUBROUTINE TO DO LOOKUPS ON OUTPUT DEVICE
1366 /DOES IMMEDIATE RETURN IF NO OUTPUT DEVICE
1367 /OTHERWISE RETURNS WITH BLOCK OF FILE IN AC OR
1368 /0 IN AC MEANING NOT FOUND OR NON-FILE STRUCTURED DEVICE
1370 TAD (SPOT /ADDRESS OF FILE NAME
1372 TAD I (7600 /GET OUTPUT DEVICE
1373 SNA /SKIP IF PRESENT
1374 JMP I LOOKUP /NO OUTPUT DEVICE
1375 JMS I (FAKUSR /FAKE OUT THE USR
1380 DCA PLACE /NOT FOUND, 0 PLACE
1381 JMS I (UNFAK /RESTORE RESIDENT HANDLER
1382 ISZ LOOKUP /SKIP RETURN
1383 TAD PLACE /WITH BLOCK IN AC
1385 \f/HERE IS WHAT WE HAVE ALL BEEN WAITING FOR
1387 //////////////////////////////////////
1391 //////////////////////////////////////
1394 JMP I (CLOERR /SUPER SYSTEM DISASTER
1395 DCA OBLOCK /V3C SAVE BLOCK OF NEW NAME (IF ANY)
1396 TAD (SPOT1-SPOT /LOOKUP INPUT FILE
1398 JMP I (CLOERR /SUPER SYSTEM DISASTER
1399 CIA /LOOKUP INPUT NAME ON OUTPUT DEVICE
1400 TAD OBLOCK /IS IT SAME SPOT AS NEW NAME ON OUTPUT DEVICE?
1402 JMS EXERR /NO, MAYBE ALREADY EXISTS
1403 TAD I (1404 /GET ADDRESS OF FILE
1404 TAD 17 /FROM MONITOR BY THE
1405 TAD (-4 /DOCUMENTED METHOD
1407 TAD (SPOT-1 /GET NEW OUTPUT NAME
1409 TAD (-4 /SET UP COUNT OF WORDS TO MOVE
1411 RNAM, TAD I XR1 /MOVE THEM
1415 JMP RNAM /CONTINUE TILL DONE
1417 SNA CLA /BUT IS THERE ROOM FOR DATE?
1418 JMP NONUDA /NO, NO ADDITIONAL INFO WORDS
1419 TAD I (DATE /YES, MOVE DATE
1420 DCA I TEMP /INTO NEW FILENAME ENTRY
1421 NONUDA, JMS WRKEY /V3C
1422 ISZ I (WRTDIR /INDICATE DIRECTORY CHANGED
1423 JMP I (NFUNCT /DO NEXT FILE
1426 TAD DIRKEY /GET "SEGMENT IN CORE" KEY
1427 AND (7 /ISOLATE SEGMENT NUMBER
1428 DCA SEGNO /NUMBER FOR WRITE
1430 JMS I 51 /CALL HANDLER USR USED TO DO
1431 4210 /LOOKUP, THIS POINTS TO FOTPS
1432 1400 /INCORE DIRECTORY HANDLER
1433 SEGNO, 0 /REWRITE UPDATED DIRECTORY BLOCK
1434 JMP I (CLOERR /SYSTEM ERROR
1436 \fEXERR, 0 /BLOCK NUMBERS DIFFERENT
1437 TAD OBLOCK /LOOK AT BLOCK NUMBER OF EXISTING FILE
1438 SNA CLA /DID IT REALLY EXIST?
1439 JMP I EXERR /NO, OK TO RENAME TO THIS NAME
1440 JMS I (ERROR /YES, TRYING TO RENAME TO EXISTING NAME
1441 RENERR+40 /FILE ALREADY EXISTS
1444 OBLOCK, 0 /TEMPORARY, HOLDS BLOCK NUMBER OF ALREADY
1445 /EXISTING FILE WITH SAME NAME AS PROPOSED NEW NAME
1446 /ON OUT PUT DEVICE (OR 0 IF NONE)
1447 \f/THIS ROUTINE TRANSFERS THE ADDITIONAL
1448 /INFORMATION WORDS OF THE INPUT FILE WHEN COPYING
1449 /IT IF THERE ARE ANY
1453 TAD I (1404 /GET NUMBER OF WORDS FROM OUTPUT DIRECTORY
1454 SMA /SKIP IF 2 OR MORE
1455 JMP NOTRAN /WE DONT TOUCH IT
1456 DCA LOOKUP /SAVE NEGATIVE NUMBER TO MOVE
1457 TAD LOOKUP /ADD NUMBER TO LOC 17
1458 TAD 17 /TO FIND ADDR(SECOND)
1460 TAD INFWDS /GET NUMBER OF AIW IN INPUT
1463 SMA /SKIP IF MORE THAN 1 AIW
1464 JMP ZEROUT /ZERO OUTPUT AIW
1465 DCA TEMP /SAVE COUNT
1466 MOVEM, ISZ GPTR1 /BUMP PTR (1ST TIME PAST DATE)
1468 TAD I GPTR1 /GET WORD
1470 DCA I PPTR1 /PUT IT INTO OUTPUT DIRECTORY
1472 ISZ LOOKUP /HAS OUTPUT COUNT OVERFLOWED?
1473 JMP MORE /MORE OUTPUT TO DO
1476 JMP I ADDINF /WERE DONE
1477 MORE, ISZ TEMP /BUMP INPUT COUNT
1478 JMP MOVEM /IT HASNT OVERFLOWED
1479 ZEROUT, CLA CMA /NO MORE INPUT WORDS-
1480 DCA TEMP /SO FIX UP TO ZERO REST OF OUTPUT WORDS
1481 JMP ZLOOP /DO ALL THE OUTPUTS
1485 \f/** THIS IS THE STARTING ADDRESS OF FOTP!!!
1487 FOTP, JMS INIT /REGULAR ENTRY POINT
1488 JMS INIT /CHAIN ENTRY POINT
1489 JMP I (CDCALL /CALL COMMAND DECODER
1490 JMP I (BYPSCD /DONT CALL COMMAND DECODER
1492 ISZ INIT /DO SKIP RETURN
1495 TAD I (7777 /GET BATCH CONTROL WORD
1497 TAD FCIF0 /FORM CIF TO BATCH FIELD
1502 SNL CLA /BATCH RUNNING?
1505 DCA I TTOUTP /MOVE IN SUBSTITUTE TTY OUTPUT CODE
1511 NOBTCH, DCA CORFUJ / =0 IF NO BATCH, -1 IF BATCH
1512 MOVMSG, TAD I ONCE /MOVE MSGS TO LOWER FIELD
1517 CDF 0 /MOVE CORE DETERMINER
1518 DCA I M1 /INTO FIELD 0 ALSO
1525 TAD (2000 /SET RESTART LOCATION
1533 TAD CORFUJ /COMPUTE AMOUNT OF CORE EXCLUDING BATCH FIELD
1535 SZA CLA /SKIP IF WE HAVE ONLY 8K (OR 12K AND BATCH)
1537 TAD (TAD EPTR /PATCH LOCATIONS IN FOTP
1538 DCA I (F2C1 /TO WORK WITH ONLY 8K
1551 BATOUT, SKP /OUTPUT TO BATCH LOG
1554 TTYOUT+1&177+4600 /JMS I .-2
1555 \f/SUBR TO DETERMINE MACHINE SIZE - RETURNS NUMBER OF
1557 /MUST RUN IN FIELD 0.
1566 SNA /DOES LOCATION 7777 SPECIFY CORE SIZE?
1568 CLL RTR /YES - BELIEVE IT.
1571 CORELP, CDF 0 /NEEDED FOR PDP-8L
1572 TAD TRYFLD /GET FLD TO TST
1575 AND COR70 /MASK USEFUL BITS
1577 DCA .+1 /SET UP CDF TO FLD
1579 TAD I CORLOC /SAV CURRENT CONTENTS
1582 TAD .-2 /7000 IS A GOOD PATTERN
1584 COR70, 70 /HACK FOR PDP-8.,NO-OP
1585 TAD I CORLOC /TRY TO READ BK 7000
1586 7400 /HACK FOR PDP-8,.NO-OP
1587 TAD .-1 /GUARD AGAINST WRAP AROUND
1588 TAD CORLOC+1 /TAD 1400
1590 JMP .+5 /NON EXISTENT FLD EXIT
1591 TAD COR706 /RESTORE CONTENS DESTROYED
1593 ISZ TRYFLD /TRY NXT HIGHER FLD
1599 CORLOC, COR70+2 /ADR TO TST IN EACH FLD
1600 1400 /7000+7400+1400=0
1601 TRYFLD, 1 /CURRENT FLD TO TST
1605 \f/FOTP'S ERROR MESSAGES
1606 /THESE RESIDE IN FIELD 0 LOCATIONS 7200-7577
1614 ILLQ, TEXT /ILLEGAL ?%/
1615 ILLA, TEXT /ILLEGAL *%/
1616 SERR, TEXT /SYSTEM ERROR/
1617 RENERR, TEXT /ALREADY EXISTS-/
1618 VERNO, 0617;2420;4026 /FOTP V
1619 VERLOC, VERSION+60^100+SUBVER /ONE-DIGIT VERSION NUMBER AND 1 CHAR PATCH LEVEL
1621 BADIRD, TEXT /ERROR READING INPUT DIRECTORY%/
1622 ODRERR, TEXT /ERROR READING OUTPUT DIRECTORY%/
1623 ODIERR, TEXT /ERROR WRITING OUTPUT DIRECTORY%/
1624 SPRBLM, TEXT /NO ROOM, SKIPPING-/
1625 INERR, TEXT /ERROR ON INPUT DEVICE-SKIPPING-/
1626 OUERR, TEXT /ERROR ON OUTPUT DEVICE-SKIPPING-/
1627 NFLEIN, TEXT /USE PIP FOR NON-FILE STRUCTURED INPUT%/
1628 NOFILE, TEXT /NO FILES OF THE FORM:/
1629 BIDIRM, TEXT /BAD INPUT DIRECTORY%/
1630 BODORM, TEXT /BAD OUTPUT DIRECTORY%/
1631 CNTDEL, TEXT /DELETES PERFORMED ONLY ON INPUT DEVICE GROUP 1/
1632 CNTDE2, TEXT /CAN'T HANDLE MULTIPLE DEVICE DELETES%/
1633 DSVED, TEXT /ORIGINAL DIRECTORY PRESERVED%/
1634 FLSFMS, TEXT /MOUNT NEXT OUTPUT VOLUME:/
1636 FIELD 1 /SELF-STARTING BINARY LOADER STUFF FOR ABSLDR