home *** CD-ROM | disk | FTP | other *** search
/ ftp.update.uu.se / ftp.update.uu.se.2014.03.zip / ftp.update.uu.se / pub / pdp8 / os278-src.tar.Z / os278-src.tar / fotp.pa < prev    next >
Text File  |  1992-09-18  |  41KB  |  1,675 lines

  1. /FOTP.PA OS278
  2. /ADAPTED FROM:
  3. /3.3 OS/8 V3 FOTP        23-MAY-1978
  4. /
  5. /
  6. /
  7. /
  8. /
  9. /
  10. /
  11. /
  12. /
  13. /COPYRIGHT  (C)  1974,1975,1978, 1981, 1982 BY DIGITAL EQUIPMENT CORPORATION
  14. /
  15. /
  16. /
  17. /
  18. /
  19. /
  20. /
  21. /
  22. /
  23. /
  24. /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE
  25. /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT
  26. /CORPORATION.  DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY
  27. /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT.
  28. /
  29. /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER
  30. /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED
  31. /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH
  32. /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL.
  33. /
  34. /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE
  35. /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY
  36. /DIGITAL.
  37. /
  38. /
  39. /
  40. /
  41. /
  42. /
  43. /
  44. /
  45. /
  46. /
  47. /WITH FAILSAFE CHANGES    NOV 17, 1973    R.L.
  48.  
  49.  
  50. /  FOTP (FILE ORIENTED TRANSFER PROGRAM)   H.J.
  51.  
  52.  
  53. /CORE MAP
  54.  
  55. /FROM TOP OF CORE
  56.  
  57. /    FIELD 2 GETS CONDITIONALLY USED AS BUFFER
  58.  
  59. /    FIELD 1
  60. /        7777-7600    MONITOR
  61. /        7577-4600    INCORE OUTPUT DIRECTORY
  62. /        4577-2000    FOTP CODE
  63. /        1777-0        RESIDENT USR
  64. /
  65. /    FIELD 0
  66. /        7777-7600    MONITOR
  67. /        7577-7200    ERROR MESSAGES
  68. /        7177-0        WORK AREA AS:
  69. /
  70. /        AT TOP-    OUTPUT HANDLER IF NEEDED
  71. /            1 OR 2 PAGES
  72.  
  73. /            INPUT HANDLER IF NEEDED
  74. /            1 OR 2 PAGES
  75.  
  76. /            INPUT DEVICES DIRECTORY
  77. /            (ONLY USED PORTION)
  78.  
  79. /            THE TRANSFER BUFFER IN 8K
  80. /            IS WHAT EVER REMAINS.
  81.  
  82. /FIXES FOR MAINTENANCE RELEASE: (S.R. 5-AUG-75)
  83.  
  84. /1.    CHANGED COPYRIGHT DATE
  85. /2.    INCORPORATED SEQ #1 PATCH (DSN MARCH 1975)
  86. /    PERMITS FOTP TO RECOVER FROM A MONITOR ERROR 6
  87. /    BY UNFAKING THE SYSTEM HANDLER
  88. /3.    UPDATED FOTP VERSION NUMBER TO V8
  89. /4.    ADDED SPACE FOR A PATCH LEVEL
  90. /5.    ALLOWED /T SWITCH TO WORK IN CONJUNCTION WITH /R
  91. /6.    PERMITS RENAMING A FILE TO IT'S OWN NAME
  92. /7.    IF NO OUTPUT DEVICE IS SPECIFIED WITH /R,
  93. /    ASSUME OUT DEV=INPUT DEVICE.
  94.  
  95. /8.    FIXED BUG RE ADDITIONAL INFO WORDS
  96.  
  97. /CHANGES FOR SYMBIONT SUPPORT (S.R.) MARCH 26, 1978
  98.  
  99. /9.    ADDED SYMBIONT SUPPORT (SET 17726 BIT 9 IF SYMBIONT RUNNING)
  100. /    NOTE: WHEN SYMBIONT IS RUNNING, YOU MUST NOT SET SOFTWARE CORE SIZE
  101. /    EQUAL TO 8K !!!!!!!!!
  102. /10.    DIRECTORY (TEMPORARY) FIELD 0 BUFFER NOW STARTS AT LOCATION 3.
  103.  
  104. /VERSION 4 OS78 CHANGES:
  105.  
  106. /CHANGED KEYBOARD PROCESSING ROUTINES TO OPERATE IN A VT278 WORLD. JMS
  107. /TO CINTER ONLY LOOKS FOR ^C; LEAVES ANYTHING IT FOUND IN T2, AND EXITS
  108. /WITH A ZERO AC. XON/XOFF (^O, ^S) ARE PROCESSED IN THE INPUT/OUTPUT
  109. /HANDLER, NOT IN FOTP.
  110.  
  111. /ADDED THE PATCH FROM DSN 21.19.1 TO ALLOW FOTP TO KNOW ABOUT LARGE
  112. /DIRECTORIES.
  113.  
  114. /OS278 VB0  CONVERT NULL TO SPACE IN TTY FILENAME OUTPUT ROUTINE (PNLOOP)
  115. /VB1 05-JAN-83    LC SUPPORT FOR Y/N QUERY
  116. /PAGE 0 LOCATIONS OS/8 USR WON'T MANGLE
  117.  
  118.     PTR=20
  119.     CNT=21
  120.     INFPTR=22
  121.     OUHAND=23
  122.     INHAND=24
  123.     FPAGE=25
  124.     EPTR=26
  125.     INSCNT=27
  126.     TEMP=30
  127.     OKFLAG=31
  128.     IFCNT=32
  129.     BUFSIZ=33
  130.     INFWDS=34
  131.     BDPTR=35
  132.     GPTR1=36
  133.     INEOF=37
  134.  
  135. /AUTO INDEX REGISTERS USR WILL ALLOW ME TO USE TEMPORARILY
  136.  
  137.     XR=10
  138.     XR1=11
  139.     XR2=12
  140.  
  141.  
  142. /VARIOUS CONSTANTS THAT CAN BE GENERATED
  143.  
  144.     AC2=CLA CLL CML RTL
  145.     AC4000=CLA CLL CML RAR
  146.     ACM2=CLA CLL CMA RAL
  147.     ACM3=CLA CLL CMA RTL
  148.  
  149. /    LOCATIONS REFERENCED IN OS/8
  150.  
  151.     ALTOPT=7642
  152.     OPT1=7643
  153.     OPT2=7644
  154.     DATE=7666
  155.     DIRKEY=7    /"DIRECTORY SEGMENT IN CORE" KEY
  156.  
  157. /SYMBOLIC FOTP LOCATIONS:
  158.  
  159. OUBUFR=    4600        /OUTPUT BUFFER - IN FIELD 1
  160. INBUFR=    3        /INPUT BUFFER - IN FIELD 0
  161. LSTFPG=    7000        /FIRST LOC OF LAST FREE PAGE IN FIELD 0
  162. FAKHND=    200        /LOCATION OF OS/8 FAKEOUT HANDLER
  163. VERSION=    "B&77^100!61    /VER B1
  164. SUBVER=        0
  165.             /LOCATED AT "VERLOC" AS 60+VERSION^100+SUBVER
  166. /STARTS AT 4600 IN FIELD 1 (ONCE ONLY CODE)
  167.  
  168. /SAVE INFO:
  169.  
  170. /    .LOAD FOTP(89P)
  171. /    .SAVE SYS FOTP;14600
  172.  
  173.     FIELD 1
  174.     *2000
  175.  
  176. CDCALL,    JMS I (200    /SEE WHAT THE PERSON WANTS
  177. FIVE,    5
  178. STAR,    5200        /IN SPECIAL MODE
  179.  
  180. BYPSCD,    JMS I (INTERC    /CATCH CALLS TO 7600
  181.  
  182.     TAD I (7600    /SAVE USER OUTPUT DEVICE
  183.     DCA I (USEROD    /-FOR LATER
  184.  
  185.  
  186. / CHECK FOR ? IN OUTPUT SPECIFICATION
  187.     TAD (-10    /8CHARACTERS TO LOOK AT
  188.     DCA CNT        /CNT HAVING -10 PUTS US AT FIRST CHAR
  189. S1C,    TAD (7605
  190.     JMS I (GTSXBT    /GET A CHAR
  191.     TAD (-"?!7700    /CHECK FOR ?
  192.     SNA CLA
  193.     JMP QINO    /? IN OUTPUT NOT ALLOWED
  194.     ISZ CNT
  195.     JMP S1C
  196.  
  197. / CHECK FOR EMBEDDED * IN ANY SPECIFICATION
  198.  
  199.     TAD (7605
  200. S4L,    DCA PTR
  201.     TAD (-10
  202.     DCA CNT
  203. ACK,    TAD PTR
  204.     JMS I (GTSXBT
  205.     TAD (-"*!7700    /CHECK TO SEE IF CHARACTER *
  206.     SZA CLA        /SKIP IF IT IS
  207.     JMP CNTUP    /GO LOOK AT NEXT
  208.     AC2
  209.     TAD CNT        /ARE WE AT EXTENSION
  210.     SZA        /SKIP IF YES
  211.     TAD (6        /ARE WE AT START OF FILENAME?
  212.     SNA CLA        /SKIP IF NOT
  213.     ISZ CNT        /BUMP COUNT ONLY IF OK
  214.     TAD PTR        /LOOK AT NEXT CHAR
  215.     JMS I (GTSXBT
  216.     SZA CLA        /SKIP IF ITS NULL - OK
  217.     JMP AINO    /ERROR
  218. CNTUP,    ISZ CNT        /BUMP TO NEXT CHAR
  219.     JMP ACK        /CONTINUE CHECKING
  220.     TAD I PTR    /ANY MORE INPUT
  221.     SNA CLA        /SKIP IF THERE IS
  222.     JMP NULLCK
  223.     TAD FIVE    /BUMP TO NEXT ENTRY
  224.     TAD PTR
  225.     JMP S4L
  226. / CHECK FOR NULL OUTPUT SPECIFICATION AND MAKE *.*
  227.  
  228. NULLCK,    TAD I (7601    /WAS OUTPUT FILENAME GIVEN?
  229.     SZA CLA        /SKIP IF NONE
  230.     JMP DIDEML
  231.     TAD STAR    /PUT AN ASTERISK IN
  232.     DCA I (7601    /FILENAME
  233.     TAD STAR
  234.     DCA I (7604    /AND EXTENSION
  235.  
  236. /THIS CODE SETS A DEFAULT OUTPUT DEVICE ON DELETE
  237.  
  238. DIDEML,    TAD I (7600    /IS AN OUTPUT DEVICE SPECIFIED?
  239.     SZA        /SKIP IF NOT
  240.     JMP ODSPEC    /NOTE DEVICE NUMBER IN AC
  241.     TAD I (OPT1    /CHECK FOR /D
  242.     AND (400
  243.     SZA CLA        /SKIP IF NOT /D
  244.     JMP MOV        /OUTPUT=INPUT
  245.     TAD I (OPT2    /V3C
  246.     AND (100    /CHECK FOR /R
  247.     SZA CLA        /V3C
  248. MOV,    TAD I (7605    /WE'LL SUBSTITUTE FIRST INPUT DEVICE FOR USER
  249. ODSPEC,    AND (17        /CLEAR USER SPECIFIED LENGTH
  250.     DCA I (7600    /WE KNOW BETTER
  251.  
  252. /THE FOLLOWING BRINGS IN THE OUTPUT DEVICE HANDLER,
  253. /READS THE DIRECTORY INTO CORE AND VERIFIES IT.
  254.  
  255.     TAD (LSTFPG    /SET THE FREE SPACE POINTER
  256.     DCA FPAGE    /TO THE LAST FREE PAGE IN FIELD 0
  257.     TAD I (7600    /IS THERE AN OUTPUT DEVICE?
  258.     SZA        /IF NO OUTPUT, DON'T FETCH HANDLER
  259.     JMS I (ASSIGN    /GET THE HANDLER AND ALLOCATE ITS SPACE
  260.     DCA OUHAND    /AC RETURNS HANDLER ENTRY POINT
  261.     JMS I (ODIRIN    /READ IN THE OUTPUT DIRECTORY
  262.     TAD (7605    /INGIALIZE INPUT POINTER
  263.  
  264. /THIS IS THE BEGINING OF THE INPUT FILE LOOP
  265.  
  266. DOMOIN,    DCA INFPTR    /POINTER TO CURRENT INPUT
  267.     TAD I INFPTR    /WHEN 0 NO MORE INPUT
  268.     SNA        /SKIP IF MORE TO DO
  269.     JMP I (ENDCHK    /DO END PROCESSING
  270.     JMS I (ASSIGN    /ASSIGN AND ALLOCATE SPACE FOR INPUT HANDLER
  271.     DCA INHAND    /AND SAVE ITS ENTRY ADDRESS
  272.  
  273. /THE FOLLOWING 2 INSTRUCTIONS HELP AVOID ALL KINDS OF
  274. /PROBLEMS WITH THE MONITOR.  IF A HANDLER GETS LOADED, THE
  275. /MONITOR MAKES IT RESIDENT FOR OTHER PEOPLE AND DOESN'T DELETE
  276. /ITS RESIDENT STATUS IF A REQUEST IS MADE FOR A NEW HANDLER
  277. /TO BE LOADED OVER IT IF THE NEW HANDLER IS ALREADY RESIDENT
  278.  
  279.     TAD FPAGE    /SAVE FREE SPACE POINTER HERE
  280.     DCA SFUDG
  281.     JMP I (PG1    /LINK TO NEXT SECTION
  282.  
  283. SFUDG,    0
  284. ONDERR,    JMS I (ERROR
  285.     ODRERR+40    /ERROR READING OUT DIR
  286. AINO,    JMS I (ERROR
  287.     ILLA+40        /ILLEGAL *
  288. QINO,    JMS I (ERROR
  289.     ILLQ+40        /ILLEGAL ?
  290.  
  291. SYMPAT,    TAD (5000    /DON'T PUT BUFFER OVER LOC 0
  292.     DCA I (X7400    /WHEN RUNNING A SYMBIOTE
  293.     JMP I (INIRET    /RETURN FROM INIT
  294.     PAGE
  295. /CHECK FOR NON FILE STRUCTURED INPUT
  296. /WE CAN'T HANDLE IT
  297.  
  298. PG1,    TAD I INFPTR
  299.     TAD (7757
  300.     DCA TEMP
  301.     TAD I TEMP    /IS FILE STRUCTURED BIT ON
  302.     SMA CLA        /SKIP IF IT IS
  303.     JMP NFIN    /ERROR
  304.     CIF 0
  305.     JMS I INHAND    /READ INPUT DEVICES DIRECTORY
  306.     1400
  307. IDBUF,    INBUFR
  308.     1
  309.     JMP INDERR    /ERROR
  310.     CDF 0
  311.     TAD I IDBUF    /MAKE SURE THAT THE
  312.     CMA CLL        /DIRECTORY OF
  313.     TAD I (INBUFR+2    /THE DEVICE IS
  314.     CDF 10        /GOOD
  315.     SNL
  316.     TAD (-107    //V4: ALLOW FOTP TO RECOGNIZE UP TO 71 (D) ENTRIES
  317.             //IN A DIRECTORY SEGMENT. DSN 21.19.1 AUG78.
  318.             /(SEE COMMENT ON TEST IN ROUTINE "ODIRIN")
  319.     SZL CLA        /SKIP IF ITS GOOD
  320.     JMP BIDIR    /ERROR
  321.  
  322. /FIND LAST BLOCK OF DIRECTORY
  323.  
  324.     TAD (INBUFR+2    /LINK TO NEXT SGMENT NUMBER
  325. FNDLST,    DCA PTR        /SAVE IT
  326.     CDF 0
  327.     TAD I PTR    /IS THERE ANOTHER SEGMENT?
  328.     SNA CLA        /SKIP IF YES
  329.     JMP ATIT    /NO...WE ARE POINTING TO LAST
  330.     TAD PTR        /BUMP TO NEXT SEGMENT
  331.     TAD (400
  332.     JMP FNDLST    /LOOK AGAIN
  333. ATIT,    TAD PTR
  334.     AND (7600    /NEW
  335.     TAD (400    /TOTAL SIZE OF IN CORE DIRECTRY
  336.     CIA        /NEGATE FOR ISZ
  337.     DCA CNT
  338.     TAD FPAGE    /WE ARE GOING TO PACK DIRECTORY
  339.     TAD (200    /RIGHT UP TO INPUT HANDLER SO
  340.     TAD CNT        /WE GET MAX SIZE TRANSFER BUFFER
  341.     DCA FPAGE    /ADJUSTED FREE CORE POINTER
  342.     CMA
  343.     TAD FPAGE
  344.     DCA XR1        /SET UP PLACE TO MOVE TO
  345.     AC2
  346.     DCA XR2        /ALWAYS COMES FROM 3
  347.     TAD I XR2    /MOVE
  348.     DCA I XR1    /IT
  349.     ISZ CNT
  350.     JMP .-3
  351. /SET SAME DEVICE FLAG FLAG 4000 IF /D
  352.  
  353.     CDF 10
  354.     TAD I (OPT1
  355.     AND (400
  356.     RTL CLL        /PUT /D BIT INTO AC 0
  357.     RAL
  358.     DCA SDFLG
  359.  
  360.  
  361. / COUNT NUMBER OF INPUTS FROM SAME DEVICE
  362. /ALSO MAKE NULL INPUT FILENAMES *.*
  363. /BUT ONLY IF NOT /D
  364.  
  365.     TAD INFPTR    /OK LETS GO THROUGH
  366.     DCA PTR        /THE INPUT SPECIFICATIONS
  367. GETCNT,    ISZ PTR        /POINT TO FILENAME WORD
  368.     TAD (3        /SET TEMP TO POINT TO EXTENSION
  369.     TAD PTR
  370.     DCA TEMP
  371.     TAD SDFLG    /ARE WE DOING /D
  372. K7450,    SNA        /SKIP IF YES - AC NON 0
  373.     TAD I PTR    /NO /D - LOOK AT FILENAME
  374.     SZA CLA        /ITS NULL PUT IN *.*
  375.     JMP NOSUB    /DONT CHANGE IT
  376.     TAD (5200    /MAKE IT *
  377.     DCA I PTR
  378.     TAD (5200    /.*
  379.     DCA I TEMP
  380. NOSUB,    CLA IAC        /TEMP+1 POINTS TO NEW INPUT
  381.     TAD TEMP
  382.     DCA PTR
  383. /NOTE CNT WAS SET BY ISZ'ING TO ZERO
  384.     ISZ CNT        /KEEP COUNT OF DEVICES IN GROUP
  385.     TAD I (OPT2    /CHECK FOR /U (UGLY SWITCH)
  386.     AND (10
  387.     SZA CLA        /SKIP IN NO /U
  388.     JMP NOPTIM    /WERE FORCED TO DO ONE AT A TIME
  389.     TAD I PTR    /COMPARE DEVICE NUMBERS
  390.     CIA        /IN A GROUPING
  391.     TAD I INFPTR
  392.     SNA CLA        /SKIP IF NEW GROUP
  393.     JMP GETCNT    /WE'LL DO ALL THE SAME AT ONCE
  394. NOPTIM,    TAD CNT
  395.     CIA        /NEGATE COUNT
  396.     DCA INSCNT    /AS NUMBER OF INPUTS TO DO AT ONCE
  397.     TAD PTR        /SAVE WHERE TO CONTINUE FOR REST
  398.     DCA I (MOIN
  399. /THE FOLLOWING CHECKS TO SEE IF A OPERATION
  400. /IS BEING DONE FROM A DEVICE TO ITSELF
  401.  
  402.     TAD I (7600    /GET DEVICE NUMBER
  403.     TAD (7646    /HANDLER ENTRY POINT TABLE
  404.     DCA TEMP
  405.     TAD I INFPTR    /GET INPUT ENTRY POINT
  406.     TAD (7646
  407.     DCA PTR
  408.     TAD I PTR    /CHECK INPUT ENTRY POINT AGAINST
  409.     CIA
  410.     TAD I TEMP    /OUTPUT ENRTY POINT
  411.     SNA CLA        /SKIP IF THEY ARE DIFFERENT
  412.     ISZ SDFLG    /SET SAME DEVICE FLAG, AC11
  413.     TAD FPAGE    /SET POINTER TO
  414.     DCA BDPTR    /START OF DIRECTORY
  415.     DCA TYPFND    /CLEAR FOUND FILE FLAG
  416.     JMP I (NBLOCK    /LINK TO SOME MORE
  417.  
  418. TYPFND,    0
  419. SDFLG,    0        /NEGATIVE MEANS /D, ODD MEANS OUTPUT DEV=INPUT DEV
  420.  
  421. NFIN,    JMS I (ERROR
  422.     NFLEIN+40    /NON FILE STRUCTED INPUT
  423. INDERR,    JMS I (ERROR
  424.     BADIRD+40    /ERROR READING INPUT DIR
  425. BIDIR,    JMS I (ERROR
  426.     BIDIRM+40    /NOT A GOOD DIRECTORY
  427.  
  428.     PAGE
  429. /THIS IS THE SUPERQUASIFACETED DIRECTORY PATTERN MATCHING ROUTINE
  430.  
  431. /THE INPUT DIRECTORY IS SEARCHED HERE, IF A MATCH
  432. /IS FOUND USING THE INPUT GROUPING
  433. /GOT1 GETS CONTROL WITH -BLOCKS IN THE AC
  434.  
  435. NBLOCK,    STA
  436.     TAD BDPTR    /POINTER TO START OF DIR BLOCK
  437.     DCA XR
  438.     CDF 0
  439.     TAD I XR    /GET COUNT OF NUMBER OF ENTRIES
  440.     DCA ENTCNT    /SAVE LOCALLY TO AVOID HERB'S BUG
  441.     TAD I XR    /GET BLOCK NUMBER FIRST FILE
  442.     DCA BLOCK
  443.     TAD I XR    /NEXT SEGMENT NUMBER
  444.     DCA LFLAG    /IF IT 0 WE AT END
  445.     ISZ XR        /SKIP TENTATIVE FILE WORD
  446.     TAD I XR    /GET -NUMBER OF INFO WORDS
  447.     CIA        /MAKE POSITVE
  448.     DCA INFWDS
  449.     TAD XR        /POINT TO FIRST
  450.     IAC        /ENTRY
  451.     DCA EPTR
  452.  
  453. BLOOP,    TAD I EPTR    /GET FILENAME WORD
  454.     CDF 10
  455.     SNA CLA        /SKIP IF FILE HERE
  456.     JMP EMPTY    /NO... ITS REALLY AN EMPTY
  457.     TAD INSCNT    /SET NUMBER OF INPUT TO LOOK
  458.     DCA NCNT    /AT ALL AT ONCE
  459.     DCA MATFLG    /CLEAR MATCH FLAG
  460.     TAD INFPTR    /ADDRESS OF FIRST INPUT
  461.     SKP
  462. MN1,    TAD GPTR2    /ADDRESS OF CURRENT INPUT
  463.     TAD (5        /GTSXBT SUBR REQUIRES US TO
  464.     DCA GPTR2    /POINT TO END OF FIELD
  465.     TAD EPTR    /POINT DIRECTORY POINTER TO
  466.     TAD (4        /END OF ENTRY FOR SAME REASON
  467.     DCA GPTR1
  468.     TAD GPTR1    /SET EPNEXT TO POINT TO
  469.     TAD INFWDS    /MINUS NUMBER OF BLOCKS IN
  470.     DCA EPNEXT    /FILE WORD
  471.     TAD (-10    /NUMBER OF CHARS TO LOOK AT
  472. WILDNM,    DCA CNT
  473. MLP,    TAD GPTR2    /OK - GET A CHARACTER FROM
  474.     JMS I (GTSXBT    /STRING
  475.     TAD (-"*!7700    /IS IT AN *
  476.     SNA        /SKIP IF NOT *
  477.     JMP WILDA    /YEP... ITS A WILD CARD
  478.     TAD ("*-"?    /IS IT A ?
  479.     SNA        /SKIP IF NOT
  480.     JMP WILD    /YES... FORCE MATCH ON THIS CHAR
  481.     TAD ("?&77    /RESTORE VALUE
  482.     CIA        /NEGATE
  483.     DCA CHAR    /AND SAVE
  484.     TAD GPTR1    /NOW GET CHAR FROM DIRECTORY
  485.     CDF 0
  486.     JMS I (GTSXBT
  487.     CDF 10
  488.     TAD CHAR    /DO CHARS MATCH
  489.     SZA CLA        /SKIP IF THEY DO
  490.     JMP NM1        /NO MATCH ON THIS INPUT
  491. WILD,    ISZ CNT        /BUMP COUNT OF CHARS & POINTER
  492.     JMP MLP        /COMPARE ALL 8
  493. MEXT,    ISZ MATFLG    /A MATCH!!!!!!!
  494. NM1,    CLA        /WILD CARD COMES HERE WITH ICHY AC
  495.     ISZ NCNT    /HAVE WE CHECKED GROUP OF INPUTS
  496.     JMP MN1        /NO CHECK WHOLE GROUP
  497.     TAD MATFLG    /HAVE THERE BEEN ANY MATCHES
  498.     SZA CLA        /SKIP IF NOT
  499.     TAD (4        /WILL INVERT /V SWITCH
  500.     TAD I (OPT2    /ADD SWITCH
  501.     AND (4        /ISOLATE IT
  502.     CDF 0
  503. /SKIPS IF INPUT DIRECTORY ENTRY IS NOT CANDIDATE
  504. /THAT IS - IF A MATCH WAS NOT FOUND BETWEEN ANY
  505. /OF THE INPUTS AND /V WAS NOT SPECIFIED   OR
  506. /A MATCH WAS FOUND AND /V WAS SPECIFIED
  507.  
  508. /THIS ALLOWS /V TO MEAN EVERYTHING BUT...
  509.  
  510.     SZA CLA
  511.     TAD I EPNEXT    /GET -NUMBER OF BLOCKS
  512.     CDF 10
  513.     SZA        /SKIPS IF TENTATIVE OR NOT CANDIDATE
  514.     JMP I (GOT1    /PROCESS FILE
  515. NENT,    TAD EPNEXT    /POINT EPTR TO BLOCK
  516.     DCA EPTR    /COUNT OF FILE
  517.     SKP
  518. EMPTY,    ISZ EPTR    /ON EMPTY MAKE EPTR POINT TO BLOCK COUNT
  519.     CDF 0
  520.     TAD I EPTR    /GET BLOCK COUNT
  521.     CIA        /MAKE POSITIVE
  522.     TAD BLOCK
  523.     DCA BLOCK    /KEEP SUM
  524.     ISZ EPTR    /POINT TO NEXT ENTRY
  525.     ISZ ENTCNT    /BUMP THE NUMBER OF ENTRIES
  526.     JMP BLOOP    /NOT DONE WITH SEGMENT
  527.     CDF 10
  528.     TAD (400    /BUMP TO NEXT SEGMENT
  529.     TAD BDPTR
  530.     DCA BDPTR
  531.     TAD LFLAG    /DID WE PROCESS LAST SEGMENT
  532.     SZA CLA        /SKIP IF WE DID
  533.     JMP NBLOCK    /PROCESS NEW SEGNENT
  534.     TAD I (SFUDG    /RESET FREE CORE POINTER
  535.     DCA FPAGE    /TO PRESERVE INPUT HANDLER IF PRESENT
  536.     JMP I (SAYNON
  537.  
  538. /HANDLE WILD CARDS
  539.  
  540. WILDA,    TAD CNT        /GET CURRENT CHAR POSITION
  541.     TAD (6        /ADD SIZE OF FILENAME
  542.     SPA        /SKIP IF IN EXTENSION FIELD
  543.     JMP WILDNM    /THIS BUMPS TO EXTENSION
  544.     JMP MEXT    /THIS MEANS IT HAS TO BE A MATCH
  545.  
  546.  
  547. CHAR,    0
  548. EPNEXT,    0
  549. GPTR2,    0
  550. LFLAG,    0
  551. NCNT,    0
  552. BLOCK,    0
  553. MATFLG,    0
  554. ENTCNT,    0
  555.  
  556.  
  557.     PAGE
  558. GOT1,    DCA IFCNT    /-# OF BLOCKS IN AC
  559.     JMS I (DATCHK    /VERIFY IF /C OR /O ALSO MATCH
  560.     ISZ I (TYPFND    /COMES BACK IF THEY DO - 
  561.             /TURN OFF NO FILES MSG FOR THIS INPUT GROUP
  562.     TAD I (OPT2    /CHECK FOR /T
  563.     AND (20
  564.     SNA CLA        /SKIP IF /T
  565.     TAD INFWDS    /SEE IF DATE PRESENT
  566.     CDF 0
  567.     SZA CLA        /SKIP IF NO DATE OR /T
  568.     TAD I GPTR1
  569.     CDF 10
  570.     SZA        /SKIP IF NO DATE OR /T
  571.     DCA I (DATE    /GIVE MONITOR FILES DATE
  572.     TAD (-4        /MAKE 2 COPIES
  573.     DCA CNT        /OF THE INPUT
  574.     CMA        /FILE NAME IN
  575.     TAD EPTR    /FIELD 1 TO
  576.     DCA XR        /WORK WITH THEM
  577.     TAD (SPOT-1    /MAKE THEM AT SPOT
  578.     DCA XR1        /AND SPOT1
  579.     TAD (SPOT1    /SPOT1 WILL ALWAYS
  580.     DCA PTR        /CONTAIN THE ORIGINAL
  581. MOVENT,    CDF 0        /AND SPOT WILL
  582.     TAD I XR    /CONTAIN THE
  583.     CDF 10        /UPDATED VERSION AS
  584.     DCA I PTR    /REFLECTED FROM
  585.     TAD I PTR    /THE OUTPUT SPECIFICATION
  586.     ISZ PTR        /-
  587.     DCA I XR1    /-
  588.     ISZ CNT        /-
  589.     JMP MOVENT    /-
  590.     TAD I (7601    /GET OUTPUT FILENAME
  591.     TAD (-5200    /WAS IT *
  592.     SNA CLA        /SKIP IF NOT
  593.     JMP TSTEXT    /YES... LEAVE FILENAME ALONE
  594.     TAD I (7601    /REPLACE INPUT NAME
  595.     DCA I (SPOT    /WITH GIVEN
  596.     TAD I (7602    /OUTPUT
  597.     DCA I (SPOT+1    /SPECIFICATION
  598.     TAD I (7603
  599.     DCA I (SPOT+2    /-
  600. TSTEXT,    TAD I (7604    /SEE IF EXTENSION
  601.     TAD (-5200    /WAS *
  602.     SNA CLA        /SKIP IF IT WASNT
  603.     JMP .+3        /LEAVE INPUT DEFAULT ALONE
  604.     TAD I (7604    /REPLCE EXTENSION
  605.     DCA I (SPOT+3    /WITH GIVEN EXTENSION
  606.     DCA TRFLG    /CLEAR THE TRANSFER FLAG
  607.     TAD I (OPT2    /IS /R ON?
  608.     AND (100
  609.     TAD I (SDFLG    /OR /D OR INPUT DEV=OUTPUT DEV?
  610.     SNA        /SKIP IF ANY
  611.     JMP SETGD    /WE ARE DEFINITELY OK
  612.     SMA CLA        /IF /D THEN CHECK OUTPUT
  613.     TAD (SPOT1-SPOT    /OTHERWISE INPUT
  614.     JMS I (LOOKUP
  615.     JMP NSETGD    /NO OUTPUT FILE GIVEN
  616.     SNA        /AC=BLOCK NO OF FILE OR 0 IF NONE
  617.     JMP I (NENT    /NO FILE - DO NOTHING
  618.     DCA TEMP    /SAVE - WE MIGHT NEED IT
  619.     TAD I (SDFLG    /IF OPERATION IS TRANSFER THEN
  620.             /TRFLG IS SET IF FILE HAS NOT
  621.             /MOVED; IF /D TRFLG MUST NOT BE
  622.             /SET ; WE DONT CARE ABOUT
  623.             /RENAME - ITS IRRELEVANT.
  624.     SMA CLA        /SKIP IF /D- WILL CAUSE TRFLG=0
  625.     TAD TEMP    /GET THE BLOCK FILE IS NOW AT
  626.     CIA        /CHECK AGAINST ORIGINAL
  627.     TAD I (BLOCK    /LOCATION
  628.     SNA CLA        /SKIP IF IT MOVED - NOTE THAT
  629.             /IF THIS SKIPS THE USER IS DOING
  630.             /A PLAY WITH DEATH OPERATION
  631. SETGD,    ISZ TRFLG    /ENABLE TRANSFERING OF THE FILE
  632. NSETGD,    TAD I (SDFLG    /SET UP TO PROMPT OR LIST
  633.     SPA CLA        /SKIP IF NOT /D
  634.     TAD (SPOT-SPOT1    /USE OUTPUT NAME
  635.     TAD (SPOT1+4    /USE INPUT NAME
  636.     JMS I (PRINTE    /SEE IF HE WANTS TO BE PROMPTED
  637. FLSRSM,    TAD I (OPT2
  638.     RTL        /PUT /N INTO LINK
  639.     AND (400    /ISOLATE /R OPTION
  640.     SZA CLA        /SKIP IF NOT /R
  641.     JMP I (RENAME    /GO TO RENAME CODE
  642.     TAD I (SDFLG    /CHECK FOR NO /D AND SAME DEV
  643.     SPA SNA CLA    /SKIP IF NO /D AND SANE DEV
  644.     TAD I (7600    /IS THERE AN OUTPUT?
  645.     SNA SZL        /SKIP IF NO /N AND OUTPUT DEV
  646.             /DIDNT SKIP IF NO /D AND SAME DEVICE
  647.     JMP NODEL    /DONT DELETE
  648.     JMS I (FAKUSR    /FAKE USR HANDLER CALLS
  649.     JMS I (200    /CALL USR
  650.     4        /CLOSE
  651.     SPOT        /OUTPUT FILE NAME
  652.     0
  653.     CLA SKP        /O.K. TO GET CLOSE ERROR NOW
  654.     ISZ I (WRTDIR    /SIGNAL CHANGE MADE TO DIRECTRY
  655.     JMS I (UNFAK    /FIXUP HANDLER ADDRESS AGAIN
  656. NODEL,    CLA
  657.     TAD TRFLG    /SET AC NOT 0 IF TRANSFER GO AHEAD
  658.     JMP I (NPG    /LINK TO SOME MORE
  659.  
  660. TRFLG,    0
  661.  
  662.  
  663.     PAGE
  664. /THIS PAGE OF CODE PERFORMS FILE MOVES FROM
  665. /INPUT TO OUTPUT
  666.  
  667. NPG,    SNA CLA        /SKIP IF WE CAN DO TRANSFER
  668.     JMP NFUNCT    /GO PROCESS NEXT ENTRY
  669.  
  670. /THE FOLLOWING SMALL STRANGE PIECE OF CODE
  671. /DYNAMICALLY ALLOCATES THE BUFFER ACCORDING
  672. /TO THE FREE SPACE IN FIELD 0 (INCLUDING
  673. /DIRECTORY SHRINKING) OR ALLOCATES 15 BLOCKS
  674. /IN FIELD 2 IF ITS AVAILABLE.
  675.  
  676. F2C1,    TAD X7400    /BECOMES  TAD EPTR  IF ONLY 8K
  677.     AND (7400    /CALCULATE FREE SPACE
  678.     RAL CLL        /SIZE
  679.     RTL        /AND SAVE
  680.     RTL        /IT
  681.     DCA BUFSIZ
  682.     TAD IFCNT    /SET THE OUTPUT 
  683.     CIA        /FILE COUNT
  684.     DCA OFCNT    /AS POSITIVE NUMBER OF BLOCKS
  685.     TAD OFCNT    /SET THE NUMBER
  686.     AND (7400    /OF BLOCKS
  687.     SNA CLA        /UP FOR ENTER
  688.     TAD OFCNT    /IF IT IS LESS
  689.     RTL CLL        /THAN 256 OR
  690.     RTL        /SET IT TO 0
  691.     DCA TEMP    /FOR FILES GREATER THAN 256
  692.     TAD (SPOT    /SET THE ADDRESS OF THE
  693.     DCA SBLKN    /OUTPUT NAME
  694.     TAD I (7600    /IS THERE AN OUTPUT FILE?
  695.     SNA        /SKIP IF THERE IS
  696.     JMP NFUNCT    /DO NO TRANSFER
  697.     TAD (7757    /INDEX INTO TENTATIVE FILE
  698.     DCA MSIZE    /TABLE IN ORDER TO
  699.     TAD I MSIZE    /CLEAR OUT ANY
  700.     AND (7770    /TENTATIVE WE DONT WANT
  701.     DCA I MSIZE    /THIS COMES IF AN I/O ERROR HIT
  702.     TAD I (7600    /DO THE ENTER
  703.     JMS I (FAKUSR    /MAKE USR USE IN CORE HANDLER
  704.     TAD TEMP    /ADD IN BLOCK COUNT
  705.     JMS I (200
  706.     3        /ENTER
  707. SBLKN,    SPOT
  708. MSIZE,    0
  709.     JMP I (NOROOM    /ENTER FAILED
  710.     TAD I (SVDATE    /RESTORE REAL DATE TO MONITOR
  711.     DCA I (DATE
  712.     JMS I (UNFAK    /REMOVE OUR FAKE HANDLER
  713.     JMS I (ADDINF    /COPY ADDITIONAL INFO WORDS
  714.     TAD IFCNT    /SEE IF ENTER SIZE
  715.     STL CIA        /GIVEN BACK IS
  716.     TAD MSIZE    /ENOUGH - HANDLES >255 AND
  717.     SNL SZA CLA    /NON FILE STRUCTURED
  718.     JMP I (NOROOM    /LENGTHS. NOT ENOUGH
  719.     DCA INEOF    /CLEAR INPUT END OF FILE
  720.     TAD SBLKN    /SET THE OUTPUT BLOCK NUMBER
  721.     DCA OBLCKN
  722.     TAD I (BLOCK    /SET THE INPUT BLOCK NUMBER
  723.     DCA BLOCKN
  724.  
  725. /THE FOLLOWING PIECE OF CODE IS A TRICKY PIECE
  726. /THAT CALCULATES THE NUMBER OF BLOCKS TO READ
  727.  
  728. MOVEIT,    TAD IFCNT    /GET THE NUMBER OF BLOCKS
  729.     CLL        /ITS NEGATIVE
  730.     TAD BUFSIZ    /ADD ON BUFFER SIZE
  731.     SNL        /SKIP IF MORE ROOM AVAILABLE THAN NEEDED
  732.     DCA IFCNT    /OTHERWISE RESAVE NEW COUNT
  733.     SZL        /SKIP IF NOT AT END OF FILE
  734.     ISZ INEOF    /SET END OF FILE INDICATOR
  735.     CIA        /MAKES -BUFSIZ+COUNT
  736.     TAD BUFSIZ    /MAKES COUNT OF NUMBER OF BLOCK
  737.     RTR CLL        /BUILD THE
  738.     RTR        /INPUT CONTROL
  739.     RTR        /WORD
  740. F2C2,    TAD (20        /BECOMES NOP IF ONLY 8K
  741.     DCA INCTLW    /SET INPUT CONTROL WORD
  742.     JMS I (CINTER    /CHECK FOR ^C
  743.     JMP I (CTCDE    /ABORT OPERATION
  744.     NOP        //V4: DUMMY FOR COMMON ROUTINE
  745.     CIF 0
  746.     JMS I INHAND    /READ INPUT HUNK
  747. INCTLW,    0
  748.     0
  749. BLOCKN,    0
  750.     JMP I (RDERR    /WELL- SCRATCH THAT FILE
  751.     TAD BLOCKN    /UPDATE BLOCK COUNT
  752.     TAD BUFSIZ
  753.     DCA BLOCKN
  754.     AC4000        /SET THE OUTPUT
  755.     TAD INCTLW    /CONTROL WORD
  756.     DCA OUCTLW
  757.     JMS I (CINTER    /CHECK FOR ^C
  758.     JMP I (CTCDE    /ABORT OPERATION
  759.     NOP        //V4: DUMMIES KEEP THE CODE STRAIGHT
  760.     ISZ I (MUSTWT    /SIGNAL REAL OUTPUT DONE
  761.     CIF 0
  762.     JMS I OUHAND    /WRITE A HUNK OF FILE
  763. OUCTLW,    0
  764.     0
  765. OBLCKN,    0
  766.     JMP I (WRTERR    /WHAT A CRUMBY OUTPUT DEVICE
  767.     TAD OBLCKN    /UPDATE THE
  768.     TAD BUFSIZ    /OUTPUT FILE
  769.     DCA OBLCKN    /BLOCK NUMBER
  770.     TAD INEOF    /SEE IF THATS ALL FOLKS
  771.     SNA CLA        /SKIP IF WE TRANSFERED FILE
  772.     JMP MOVEIT    /DO SOME MORE
  773.     TAD I (7600    /OK - LETS MAKE IT PERMANENT
  774.     JMS I (FAKUSR    /TELL USR TO USE INCORE HANDLER
  775.     JMS I (200
  776.     4        /CLOSE
  777.     SPOT
  778. OFCNT,    0
  779.     JMP I (CLOERR    /THIS IS IMPOSSIBLE (I HOPE)
  780.     JMS I (UNFAK    /ENABLE SYSTEM USE OF REAL HANDLER
  781.     ISZ I (WRTDIR    /SET WE CHANGED DIRECTORY FLAG
  782. NFUNCT,    JMP I (NENT    /I KNOW ITS INEFFICIENT TO JUMP HERE
  783.             /BUT- IT'S CLEAN...
  784.  
  785. X7400,    7400        /CHANGES UNDER SYMBIOSIS
  786.     PAGE
  787. /HERE COMES GOBBS AND GOBBS OF GOODY LITTLE ROUTINES
  788.  
  789. /FIRST WE HAVE A NICE LITTLE ROUTINE WHICH WILL DO
  790. /HANDY LITTLE THINGS LIKE FETCH A HANDLER
  791. /AND IN ADDITION ALLOCATE THE SPACE FOR IT.
  792. /JUST IMAGINE THIS CAN BE YOURS FOR THE LOW LOW PRICE
  793. /OF 23 INSTRUCTIONS
  794.  
  795. ASSIGN,    0
  796.     DCA TEMP    /SAVE DEVICE NUMBER
  797.     TAD TEMP
  798.     JMS I (200
  799.     12        /INQUIRE ABOUT HANDLER
  800. HADDR1,    0
  801.     JMP I (CLOERR    /CANT HAPPEN (I HOPE)
  802.     TAD HADDR1    /DID WE GET BACK ADDRESS
  803.     SZA        /SKIP IF NOT- NON-RESIDENT
  804.     JMP I ASSIGN    /YES... RETURN ITS ENTRY POINT
  805.     SKP
  806. TWOPAG,    IAC        /TURN ON 2-PAGE BIT
  807.     TAD FPAGE    /GET FREE SPACE POINTER
  808.     DCA HADDR2    /SET FOR FETCH
  809.     TAD FPAGE    /TAKE AWAY
  810.     TAD (-200    /PAGE FROM
  811.     DCA FPAGE    /FREE SPACE
  812.     TAD TEMP    /GET DEVICE NUMBER
  813.     JMS I (200
  814.     1        /FETCH
  815. HADDR2,    0
  816.     JMP TWOPAG    /FAILED- MUST BE 2-PAGER
  817.     TAD HADDR2    /RETURN ENTRY POINT ADDRESS
  818.     JMP I ASSIGN
  819. /THIS UTILITY ROUTINE RETURNS A SIX BIT
  820. /CHARACTER FROM ANY FIELD (SET ON ENTRY)
  821. /FROM ADDRESS IN AC-COUNT(IN HALF WORDS)
  822.  
  823. GTSXBT,    HLT
  824.     CLL RAL        /DOUBLE POINTER ADDRESS
  825.     TAD CNT        /ADD NEGATIVE DISPLACEMENT
  826.     CML RAR        /GET WORD ADDRESS AGAIN
  827.     DCA TEMP    /SAVE IT
  828.     TAD I TEMP    /GET WORD
  829.     SNL        /SKIP IF WE WANT RIGHT HALF
  830.     JMS ROTR6    /MAKE LEFT HALF RIGHT HALF
  831.     AND (77        /GET LOW SIX BITS
  832.     JMP I GTSXBT
  833.  
  834.  
  835. ROTR6,    0
  836.     RTR
  837.     RTR
  838.     RTR
  839.     JMP I ROTR6
  840.  
  841. /THIS TAKES A SIX BIT CHAR IN AC AND CONVERTS
  842. /IT TO ASCII TO TYPE IT
  843.  
  844. CONVTP,    HLT
  845.     SZA        /CONVERT 0 TO BLANKS
  846.     TAD (240
  847.     AND (77
  848.     TAD (240
  849.     JMS I (TYPE    /TYPE IT
  850.     JMP I CONVTP
  851. /TYPE TAKES A CHARACTER IN THE AC AND CALLS
  852. /TTY TO TYPE IT IF ^O IS NOT IN AFFECT
  853. /ALSO CHECKS FOR ^C AND ^P
  854.  
  855. TYPE,    HLT
  856.     DCA READKB    /SAVE CHARACTER
  857.     KSF        //V4: ^P IS SUPPOSED TO BE ^Q. WHAT CAN I SAY?
  858.     JMP TYPE1    //V4: HANDLERS TAKE CARE OF XON/XOFF
  859.     JMS I (CINTER    /CHECK FOR ^C OR ^P; PRINT & RETURN CALL +1 
  860.     JMP I (CTCDE    /IF EITHER IS FOUND.
  861.     JMP TYPE1    //V4:
  862.     TAD (-217    /^O?
  863.     SNA CLA        /CLEARED ECHO SWITCH SAYS OK TO ECHO; CANNOT BE -1.
  864.     DCA ECHO    
  865. TECHO,    TAD ECHO    /IS ECHO IN EFFECT
  866.     SNA CLA        /SKIP IF YES
  867.     JMP I TYPE    /IGNORE CHARACTER IF ^O
  868. TYPE1,    TAD READKB    /TYPE CHAR
  869.     JMS TTY
  870.     JMP I TYPE
  871.  
  872. TTY,    0
  873.     DCA TCHAR    /SAVE CHAR
  874.     TAD TCHAR    /GET CHAR BACK
  875.             /** NEXT 4 LOCATIONS REPLACED IF BATCH ACTIVE BY:
  876. TTYOUT,    TLS        /** SKP
  877.     TSF        /** 7400    /ADDRESS OF BATCH OUTPUT ROUTINE
  878.     JMP .-1        /** CIF TOPFIELD
  879.     CLA        /** JMS I .-2
  880.     TAD TCHAR    /GET CHAR AGAIN
  881.     TAD (-215    /IF WE JUST TYPED A C.R. TYPE
  882.     SZA CLA        /A L.F.
  883.     JMP I TTY
  884.     TAD (12
  885.     JMP TTY+1
  886. TCHAR,    0
  887.  
  888. /GET A CHARACTER FROM KEYBOARD AND
  889. /CHECK FOR ^C AND ^P
  890.  
  891. READKB,    HLT
  892.     KSF
  893.     JMP .-1
  894.     JMS I (CINTER    /IS IT ^C
  895.     JMP I (CTCDE    /^C OR ^P
  896.     TAD I (T2    /RETURN 8 BIT ASCII
  897.     JMP I READKB
  898. /ROUTINE TO MAKE SURE USER SPECIFIED
  899. //C AND /O SWITCHES CAUSE CORRECT MATCH WITH DATE
  900.  
  901. DATCHK,    0
  902.     TAD I (OPT1    /CHECK /C
  903.     JMS MDATE
  904.     NOP        /RETURN HERE WITH AC=0 IF NO /C
  905.     SZA CLA        /RETURN HERE WITH AC=0 IF DATES MATCH
  906.     JMP I (NENT    /DATES DONT MATCH AND /C GIVEN
  907.     TAD I (OPT2    /CHECK /V
  908.     JMS MDATE
  909.     CMA CLA        /SET AC=-1 IF NO /V
  910.     SNA CLA        /RETURN HERE AC=0 IF DATES SAME
  911.     JMP I (NENT    /DATES SAME WITH /V-IGNORE FILE
  912.     JMP I DATCHK    /CONTINUE
  913.  
  914. MDATE,    0        //O AND /V ARE AC2
  915.     RTL        /IS IT OPTION ON?
  916.     SMA CLA        /SKIP IF IT IS
  917.     JMP I MDATE    /NO- RETURN WITH 0 AC
  918.     ISZ MDATE    /SKIP RETURN
  919.     CDF 0
  920.     TAD I GPTR1    /GET DATE WORD
  921.     CIA
  922.     CDF 10
  923.     TAD I (SVDATE    /COMPARE WITH MONITORS, 0 IF =
  924.     JMP I MDATE
  925.  
  926. ECHO,    1
  927.  
  928.  
  929.     PAGE
  930. /THIS IS THE CORE DEVICE HANDLER
  931. /THE USR IS MADE TO COME HERE BY A CALL TO FAKUSR.
  932. /THIS HANDLER SWAPS THE DESIRED BLOCK INTO
  933. /THE USR AREA AND WRITES THE BLOCK BACK INTO THE
  934. /INCORE DIRECTORY.
  935.  
  936. /THE CODE SET UP IN FIELD 0 TO CALL THE HANDLER IS:
  937. /    *FAKHND
  938. /    0        /ENTRY POINT
  939. /    TAD FAKHND    /GET RETURN ADDRESS
  940. /    CIF CDF 10
  941. /    JMP I .+1    /PLOP UP TO BODY OF HANDLER IN FIELD 1
  942. /    FAKBDY
  943.  
  944.  
  945. FAKBDY,    DCA RETLOC    /SAVE ARGUMENT ADDRESS
  946.     TAD I RETLOC    /GET CONTROL WORD
  947.     RAL        /R/W BIT INTO LINK
  948.     CLA RAL        /R/W BIT INTO AC11
  949.     TAD DCAXR1    /IF WRITE MAKE DCA XR2 ELSE XR1
  950.     DCA DCASPT    /SAVE WHERE WE NEED IT
  951.     ISZ RETLOC    /BUMP TO LOCATION (ALWAYS 1400 FROM USR)
  952.     ISZ RETLOC    /BUMP TO BLOCK NUMBER
  953.     TAD I RETLOC    /GET IT
  954.     ISZ RETLOC    /BUMP TO ERROR RETURN
  955.     ISZ RETLOC    /NOW TO GOOD RETURN (WE WONT FAIL)
  956.     CLL RTR        /MULTIPLY BY 400(8)
  957.     RTR
  958.     RAR
  959.     TAD (4177    /ADD ON TO BEGINING OF DIRECTRY
  960. DCAXR1,    DCA XR1        /SAVE IN BOTH XR1
  961.     TAD XR1
  962.     DCA XR2        /AND XR2
  963.     TAD (1377    /NOW SAVE USR BLOCK AREA
  964. DCASPT,    HLT        /IN EITHER XR1 OR XR2 (R OR W)
  965.     TAD (-400    /SET WORD TRANSFER COUNT 
  966.     DCA CNT
  967.     TAD I XR2    /GET A WORD
  968.     DCA I XR1    /PUT A WORD
  969.     ISZ CNT
  970.     JMP .-3
  971.     JMP I RETLOC    /GO BACK TO USR
  972. /THIS ROUTINE DOES THE SETUP OF THE INCORE
  973. /DIRECTORY HANDLER AND CHANGES THE REAL
  974. /HANDLERS ENTRY POINT IN THE MONITOR SO THAT
  975. /THE USR WILL CALL IT.
  976.  
  977. FAKUSR,    0
  978.     DCA UNFAK    /SAVE DEVICE NUMBER
  979.     TAD UNFAK    /INDEX INTO MONITORS RESIDENCY
  980.     TAD (7646    /TABLE
  981.     DCA TABAD
  982.     TAD WRTDIR    /SEE IF DEVICE HAS DIRECTORY
  983.     SPA CLA        /SKIP IF IT DOES
  984.     JMP NOSUBST    /!!!DONT CHANGE IF NON-FILE DEV
  985.     TAD (FAKHND    /PUT OUR HANDLERS ADDRESS IN
  986.     DCA I TABAD    /MONITORS TABLE
  987. NOSUBST,CDF 0
  988.     TAD (1200    /PUT IN HANDLER INTERFACE CODE
  989.     DCA I (FAKHND+1    /INTO FIELD 0 AS GIVEN ABOVE
  990.     TAD (CIF CDF 10
  991.     DCA I (FAKHND+2
  992.     TAD (5604
  993.     DCA I (FAKHND+3
  994.     TAD (FAKBDY
  995.     DCA I (FAKHND+4
  996.     CDF 10
  997.     TAD UNFAK    /RETURN WITH DEVICE NUMBER IN AC
  998.     JMP I FAKUSR
  999.  
  1000. UNFAK,    0
  1001.     CLA        /V3C
  1002.     TAD OUHAND    /RESET MONITORS TABLE TO
  1003.     DCA I TABAD    /POINT TO REAL HANDLER
  1004.     DCA TABAD    /V3C
  1005.     JMP I UNFAK
  1006.  
  1007. TABAD,    0
  1008. RETLOC,    0
  1009. /ENTER HERE IF A BRANCH TO 7600 OR 7605 OCCURS
  1010.  
  1011. FIXDIR,    JMS UNFAK    /JUST IN CASE
  1012.     NOP
  1013.     NOP
  1014.     AC4000        /EITHER WAY GO BACK TO
  1015.     DCA I (ALTOPT    /MONITOR BUT AFTER WE HANDLE DIRECTORY
  1016. CTCDE,    TAD MUSTWT    /IS MUST WRITE SET?
  1017.     SNA CLA        /SKIP IF /Q OR MUST WRITE
  1018.     TAD WRTDIR    /CHECK TO SEE IF WE HAVE TO
  1019.     SPA SNA CLA    /WRITE THE DIRECTORY
  1020.     JMP ENDCHK    /CONTINUE
  1021.     DCA WRTDIR    /KEEP OLD DIRECTORY
  1022.     JMS I (ERROR    /TELL HIM
  1023.     DSVED+40
  1024.  
  1025. ENDCHK,    ISZ I (ECHO    /TURN ON ECHO
  1026.     JMS DIROUT    /WRITE OUT THE OUTPUT DIRECTORY
  1027.     JMS I (RESTORE    /RESTORE 7600 IN FIELD 0
  1028.     TAD I (OPT2    /GET OPTION /W
  1029.     RTR
  1030.     SNL CLA        /SKIP FOR VESION NUMBER
  1031.     JMP NOVER
  1032.     DCA I (OPT2    /STOPS RECUSION WITH ^P
  1033.     JMS I (ERROR    /PRINT VERSION NUMBER
  1034.     VERNO+40
  1035.     TAD (215
  1036.     JMS I (TYPE
  1037. NOVER,    TAD I (ALTOPT    /GO BACK TO MONITOR?
  1038.     SMA CLA        /SKIP IF YES
  1039.     JMP I (CDCALL    /CALL THE CD AGAIN
  1040.     CIF CDF 0    /RETURN TO MONITOR
  1041.     JMP I (7605
  1042.  
  1043.  
  1044. MUSTWT,    0
  1045. SVDATE,    0
  1046. WRTDIR,    0
  1047. DIROUT,    0        /ROUTINE TO WRITE THE OUTPUT DIRECTORY
  1048.     TAD WRTDIR    /AC>0 IF WE HAVE TO WRITE IT
  1049.     SPA SNA CLA    /SKIP TO WRITE DIRECTORY
  1050.     JMP I DIROUT
  1051.     CIF 0
  1052.     JMS I OUHAND    /WRITE DIRECTORY BACK ONTO DEVICE
  1053.     5410
  1054.     4600
  1055.     1
  1056.     JMP I (ODERR    /IS HE IN TROUBLE...
  1057.     DCA WRTDIR    /CLEAR WRITE DIRECTORY FLAG
  1058.     JMP I DIROUT    /RETURN
  1059.     PAGE
  1060. //V4: SUBROUTINE TO REPLACE CTYPE, CINTER, AND A BUNCH OF KRS-ING.
  1061. /READ THE KEYBOARD; SAVE THE CHARACTER AS 8-BIT; CHECK FOR A ^C, ^O, ^P.
  1062. /IF EITHER IS FOUND, ECHO AS ^CHAR; EXIT AT CALL +1 FOR ^C AND ^P.
  1063. /EXIT AT CALL+2 FOR THE REST. CALLING ROUTINE DECIDES WHAT TO TO WITH
  1064. /LEGIT CHAR LEFT IN T2.
  1065.  
  1066. CINTER,    0
  1067.     TAD (200    
  1068.     KRS        /BUILD AN 8-BIT CHAR FOR ANCIENT OS8 PROGRAMS.
  1069.     AND (337    /MASK OUT LOWER CASE BIT
  1070.     DCA T2
  1071.     KCC        /ENABLE THE KEYBOARD SO VT278 CAN WORK
  1072.     TAD T2
  1073.     TAD (-203
  1074.     SNA CLA        //V4: XON/XOFF NOT HANDLED HERE ANYMORE.  /SNA
  1075.     JMP SPURGE    /^C
  1076.     ISZ CINTER    /TAD (3-21
  1077.     JMP I CINTER    /SNA
  1078.             //THE COMMENTS ARE ALSO SCREWED UP-- ^P IS SUPPOSED
  1079.             //TO BE XON, OR ^Q, OR ASCII [2]21.
  1080.  
  1081.     JMP SPURGE+1    /^Q
  1082.     ISZ CINTER    /THE REST LEAVE AT CALL+2
  1083.     IAC
  1084.     SZA CLA
  1085.     JMP I CINTER    /AND DON'T ECHO ^ SOMETHING.
  1086.     JMP SPURGE+2
  1087. SPURGE,    CMA
  1088.     DCA I (ALTOPT
  1089.     TAD ("^
  1090.     JMS I (TTY
  1091.     TAD T2
  1092.     TAD (100    /MAKE IT PRINTABLE
  1093.     JMS I (TTY
  1094.     TAD (215    /WITH A PRETTY CRLF.
  1095.     JMS I (TTY
  1096.     JMP I CINTER    /WITH A 0 AC.
  1097.  
  1098. T2,    0
  1099. /THIS ROUTINE MODIFIES THE THE MONITOR RETURN
  1100. /LOCATIONS TO COME BACK TO FOTP AND SAVES WHAT
  1101. /WAS THERE SO RESTORE CAN RESTORE THEM
  1102.  
  1103. INTERC,    0
  1104.     TAD I (DATE
  1105.     DCA I (SVDATE    /SAVE MONITOR DATE
  1106.     CDF 0
  1107.     TAD I (7600    /SAVE 7600,7601,7602,7605
  1108.     DCA SCODE    /AND REPLACE WITH
  1109.     TAD (CIF CDF 10    /CIF CDF 10
  1110.     DCA I (7600    /JMP I .+1
  1111.     TAD I (7601    /FIXDIR
  1112.     DCA SCODE+1    /7605 GETS JMP 7600
  1113.     TAD (5602    /THIS ENABLES FOTP TO WRITE
  1114.     DCA I (7601    /OUT DIRECTORY AN MANUAL ABORT
  1115.     TAD I (7602    /OR IF HANDLER PICKS UP ^C
  1116.     DCA SCODE+2    /AND TRIES TO GO TO MONITOR
  1117.     TAD (FIXDIR
  1118.     DCA I (7602
  1119.     TAD I (7605
  1120.     DCA SCODE+3
  1121.     TAD (5200
  1122.     DCA I (7605
  1123.     CDF 10
  1124.     JMP I INTERC
  1125.  
  1126. /THIS ROUTINE SIMPLY RESTORES THE MONITOR
  1127. /LOCATIONS TO THEIR ORIGINAL VALUE
  1128.  
  1129. RESTORE,0
  1130.     TAD I (SVDATE    /RESTORE DATE
  1131.     DCA I (DATE
  1132.     CDF 0
  1133.     TAD SCODE
  1134.     DCA I (7600    /RESTORE LOCATIONS
  1135.     TAD SCODE+1
  1136.     DCA I (7601
  1137.     TAD SCODE+2
  1138.     DCA I (7602
  1139.     TAD SCODE+3
  1140.     DCA I (7605
  1141.     CDF 10
  1142.     JMP I RESTORE
  1143.  
  1144. SCODE,    0;0;0;0
  1145. /THIS IS THE MAGIC MESSAGE PRINTER
  1146. /IT IS ACTUALLY USED MORE THAN JUST FOR ERROR MESSAGES
  1147. /IF THE MESSAGE ENDS WITH A % THEN THE OPERATION
  1148. /IS ABORTED OTHERWISE CONTROL IS RETURNED
  1149. /TO THE CALLER AND NO CRLF IS GIVEN
  1150. /ALL MESSAGES COMMING THROUGH HERE ARE ECHOED
  1151.  
  1152. ERROR,    0
  1153.     CLA CLL        /JUNK MIGHT BE IN AC
  1154.     TAD I (ECHO    /SAVE ECHO STATUS SO WE CAN
  1155.     DCA I (ECTMP    /RESTORE IT AFTER MESSAGE
  1156.     ISZ I (ECHO    /TURN ON ECHO
  1157.     TAD (-100    /USED SO WE CAN USE GTSXBT TO
  1158.     DCA CNT        /UNPACK THE MESSAGES
  1159. PLOOP,    TAD I ERROR    /CONTAINS ADDRESS OF MESSAGE
  1160.     CDF 0        /IN FIELD 0
  1161.     JMS I (GTSXBT    /GET CHARACTER
  1162.     CDF 10
  1163.     TAD (-45    /IS IT %
  1164.     SNA        /SKIP IF NOT
  1165.     JMP CRLF    /WE HIT EOM AND CALLER NO WANT CONTROL
  1166.     TAD ("%&77    /RESTORE CHARACTER
  1167.     DCA DFLAG    /SAVE IT FOR LATER
  1168.     TAD DFLAG    /PRINT IT, 0 PRINTS AS BLANK
  1169.     JMS I (CONVTP
  1170.     ISZ CNT        /BUMP TO NEXT CHAR IN MESSAGE
  1171.     TAD DFLAG    /ARE WE AT END
  1172.     SZA CLA        /SKIP IF WE ARE
  1173.     JMP PLOOP    /DO ANOTHER CHARACTER
  1174.     ISZ ERROR    /SKIP ADDRESS OF MESSAGE
  1175.     JMP I ERROR    /RETURN
  1176. CRLF,    TAD (215    /PRINT CR
  1177.     JMS I (TYPE    /LF
  1178.     JMP I (ENDCHK    /FINISH PROCESSING
  1179.  
  1180. DFLAG,    0
  1181.     PAGE
  1182. /THIS ROUTINE PRINTS A FILENAME.EXTENSION
  1183.  
  1184. PNMSUB,    0
  1185.     DCA NMEPLC    /SAVE ADDRESS OF NAME
  1186.     TAD (-10    /SET CHAR COUNT
  1187.     DCA CNT
  1188. PNLOOP,    TAD NMEPLC    /GET THE SIXBIT CHAR
  1189.     JMS I (GTSXBT
  1190.     SNA        /IN NULL CHAR CONVERT TO SPACE
  1191.     TAD (240
  1192.     JMS I (CONVTP    /PRINT CHAR
  1193.     TAD (3        /SEE IF AT START OF
  1194.     TAD CNT        /EXTENSION
  1195.     SZA CLA        /SKIP IF SO
  1196.     JMP .+3
  1197.     TAD (".        /PRINT THE DOT
  1198.     JMS I (TYPE
  1199.     ISZ CNT
  1200.     JMP PNLOOP    /KEEP GOING
  1201.     JMP I PNMSUB
  1202.  
  1203. NMEPLC,    0
  1204. ECTMP,    0
  1205.  
  1206. RDERR,    JMS I (ERROR
  1207.     INERR+40    /ERROR READING FILE
  1208. DYSTF1,    TAD (SPOT1+4    /PRINT INPUT FILE NAME
  1209. DYSTUF,    JMS I (PNMSUB
  1210.     TAD (215
  1211.     JMS I (TYPE
  1212.     TAD ECTMP    /RESTORE ECHO FLAG AS
  1213.     DCA I (ECHO    /SAVED ON ENTRY TO ERROR
  1214.     JMP I (NENT    /GO TO NEXT FILE
  1215. WRTERR,    JMS I (ERROR
  1216.     OUERR+40    /ERROR WRITING FILE
  1217. POUTNM,    TAD (SPOT+4    /PRINT OUTPUT FILE NAME
  1218.     JMP DYSTUF
  1219. NORUMX,    JMS I (ERROR    /NOT ENOUGH ROOM FOR
  1220.     SPRBLM+40    /FILE ON OUTPUT DEVICE
  1221.     JMP DYSTF1
  1222. /ROUTINE WHICH PRINTS NO FILES MSG IF NECESSARY
  1223. /IT WONT PRINT MESSAGE IF ANY FILE IN A SO CALLED
  1224. /INPUT GROUP MATCHES(A BUG?)
  1225.  
  1226. SAYNON,    TAD I (TYPFND    /GET INPUT MATCH FLAG
  1227.     SZA CLA        /SKIP IF NOTHING MATCHED
  1228.     JMP GOBCK    /DONT DO MESSAGE
  1229. TLP,    JMS I (ERROR    /PRINT MESSAGE
  1230.     NOFILE+40
  1231.     TAD INFPTR    /POINT TO END OF INPUT ENTRY
  1232.     TAD (5        /TO MAKE GTSXBT WORK CORRECTLY
  1233.     DCA INFPTR
  1234.     TAD INFPTR    /PRINT THE FILE NAME
  1235.     JMS I (PNMSUB
  1236.     TAD (OTAB-2    /NOW PRINT /V,/C,/O IF
  1237.     DCA XR2        /ANY OF THEM SPECIFIED
  1238. NOPT1,    ISZ XR2        /FIX POINTER WHEN SWITCH NOT ON
  1239. NOPT,    TAD I XR2    /GET ADDRESS OF OPTION
  1240.     SNA         /SKIP IF NOT AT END
  1241.     JMP CRIT    /WE ARE AT END
  1242.     DCA TEMP
  1243.     TAD I TEMP    /GET OPTION WORD
  1244.     AND I XR2    /AND WITH OPTION BIT
  1245.     SNA CLA        /SKIP IF OPTION GIVEN
  1246.     JMP NOPT1    /DO ANOTHER
  1247.     TAD ("/        /PRINT /
  1248.     JMS I (TYPE
  1249.     TAD I XR2    /OPTION
  1250.     JMS I (TYPE
  1251.     JMP NOPT    /DO ANOTHER
  1252. CRIT,    TAD (215    /END WITH A CRLF
  1253.     JMS I (TYPE
  1254.     TAD ECTMP    /RESTORE ECHO FLAG THAT ERROR
  1255.     DCA I (ECHO    /SAVED
  1256.     ISZ INSCNT    /PRINT MESSAGE FOR ALL FILES
  1257.     JMP TLP        /IN GROUP
  1258. GOBCK,    TAD I (USEROD    /GET USER SPECIFIED DEVICE
  1259.     SNA CLA        /SKIP IF HE GAVE ONE
  1260.     TAD I (SDFLG    /IF HE DIDNT WE CANT HANDLE /D
  1261.     SPA CLA        /SKIP IF NO /D
  1262.     TAD I MOIN    /YEP. /D BETTER NOT BE ANY MORE INPUT
  1263.     SZA CLA        /THERE WASN'T - O.K.
  1264.     JMP DELERR    /WARN HIM OF THE SHORTCOMING
  1265.     TAD MOIN    /GET SAVED INPUT POINTER
  1266.     JMP I (DOMOIN    /AND DO SOME MORE INPUTS
  1267.  
  1268. DELERR,    JMS I (ERROR
  1269.     CNTDEL+40    /MULTIPLE DEVICE DELETE
  1270.     TAD (215
  1271.     JMS I (TYPE
  1272.     JMS I (ERROR
  1273.     CNTDE2+40
  1274.  
  1275. USEROD,    0
  1276. MOIN,    0
  1277. /TABLE OF SWITCHES FOR "NO FILES" MESSAGE
  1278.  
  1279. OTAB,    OPT2
  1280.     4
  1281.     "V
  1282.     OPT1
  1283.     1000
  1284.     "C
  1285.     OPT2
  1286.     1000
  1287.     "O
  1288.     0
  1289.  
  1290.     PAGE
  1291. /THIS ROUTINE HANDLES THE /L AND /Q OPTIONS
  1292. /IF EITHER IS ON IT PRINTS THE NAME
  1293. /THEN IF ITS /Q IT PRINTS A ? AND WAITS FOR
  1294. /A RESPONSE. IF Y IT RETURNS, ANYTHING ELSE
  1295. /AND IT GOES TO PROCESS THE NEXT DIRECTORY ENTRY
  1296.  
  1297. PRINTE,    0
  1298.     DCA I (NMEPLC    /SAVE ADDRESS OF NAME
  1299.     TAD I (OPT1    /CHECK /L
  1300.     RAR
  1301.     SZL CLA        /SKIP IF NO /L
  1302.     JMP PIT        /PRINT NAME
  1303.     TAD I (OPT2    /CHECK /Q
  1304.     AND (200
  1305.     SNA CLA        /SKIP IF /Q
  1306.     JMP I PRINTE    /RETURN
  1307.     ISZ I (ECHO    /IF /Q FORCE ECHO ON
  1308. PIT,    TAD I (NMEPLC    /NOW PRINT FILENAME
  1309.     JMS I (PNMSUB
  1310.     DCA OKFLAG    /CLEAR OKFLAG
  1311.     TAD I (OPT2    /WAS IT /Q?
  1312.     AND (200
  1313.     SNA CLA        /SKIP IF /Q
  1314.     JMP FUNCT2    /JUST PRINT CRLF
  1315.     TAD ("?        /PRINT ?
  1316.     JMS I (TYPE
  1317.     CMA        /SET OKFLAG NO GOOD
  1318.     DCA OKFLAG
  1319.     JMS I (READKB    /GET A CHAR
  1320.     TAD (-"Y    /IS IT Y?
  1321.     SNA CLA        /SKIP ON NO
  1322.     ISZ OKFLAG    /IT WAS Y, SET OK AND SKIP
  1323.     TAD ("N-"Y    /GET N
  1324.     TAD ("Y        /GET Y
  1325.     JMS I (TYPE    /ECHO IT
  1326. FUNCT2,    TAD (215    /PRINT CRLF
  1327.     JMS I (TYPE
  1328.     TAD OKFLAG    /OKFLG=0 MEANS YES
  1329.     SZA CLA        /SKIP IF TO PROCESS FILE
  1330.     JMP I (NFUNCT    /SKIP THIS FILE
  1331.     JMP I PRINTE    /RETURN
  1332.  
  1333. ODERR,    CLA
  1334.     DCA I (WRTDIR    /FIX RECURSION
  1335.     JMS I (ERROR
  1336.     ODIERR+40    /ERROR WRITING DIRECTORY
  1337. BODIR,    JMS I (ERROR
  1338.     BODORM+40    /BAD OUTPUT DIRECTORY
  1339. CLOERR,    JMS I (ERROR
  1340.     SERR+40        /SYSTEM ERROR
  1341.     HLT        /DONT LET HIM CONTINUE
  1342.     JMP .-1        /IT CAN ONLY GET WORSE
  1343.  
  1344. SPOT,    ZBLOCK 4    /ROOM FOR OUTPUT FILE NAME
  1345. SPOT1,    ZBLOCK 4    /ROOM FOR INPUT FILE NAME
  1346. /CODE TO HANDLE OUT OF ROOM CONDITION ON OUTPUT DEVICE
  1347.  
  1348. NOROOM,    JMS I (UNFAK    /RESTORE THE REAL OUTPUT HANDLER
  1349.     TAD I (OPT1
  1350.     AND (100    /CHECK FOR THE /F OPTION SPECIFIED
  1351.     SNA CLA
  1352.     JMP I (NORUMX    /NO - GIVE AN ERROR MESSAGE
  1353.     JMS I (DIROUT    /FAILSAFING - WRITE OUT THE OUTPUT DIRECTORY
  1354.     JMS I (ERROR    /PRINT THE MESSAGE
  1355.     FLSFMS+40    /"MOUNT NEXT OUTPUT VOLUME"
  1356.     JMS I (READKB    /GET AN ANSWER
  1357.     CLA        /ANY CHAR EXCEPT ^C OR ^P IS YES
  1358.     TAD (215
  1359.     JMS I (TYPE    /PRINT CRLF
  1360.     JMS ODIRIN    /READ IN THE NEW OUTPUT DIRECTORY
  1361.     JMP I (FLSRSM    /RECOMPUTE THE PENDING TRANSFER.
  1362.  
  1363. ODIRIN,    0        /SUBROUTINE TO READ IN THE OUTPUT DIRECTORY
  1364.     TAD I (7600    /GET OUTPUT DEVICE NUMBER
  1365.     SNA        /IS IT PRESENT?
  1366.     JMP NOUTFL    /NO - DON'T READ OUTPUT DIRECTORY
  1367.     TAD (7757    /ADD ADDRESS OF MONITOR TABLE
  1368.     DCA TEMP    /TO INDEX INTO IT
  1369.     TAD I TEMP    /FILE STRUCTURED BIT IS 0
  1370.     SMA CLA        /SKIP IF DIRECTORY DEVICE
  1371.     JMP NOUTFL    /WE DONT WANT TO READ OR WRITE DIRECTORY
  1372.     CIF 0
  1373.     JMS I OUHAND    /READ DIRECTORY
  1374.     1410
  1375. ODBUF,    OUBUFR
  1376.     1
  1377.     JMP I (ONDERR    /ERROR
  1378.     TAD I ODBUF
  1379.     CMA CLL        /CHECK FOR LEGAL OUTPUT DIRECTORY - FIRST
  1380.     TAD I (OUBUFR+2    /WORD OF AN OS/8 DIRECTORY IS .LT. 50
  1381.     SNL        /AND THE THIRD WORD MUST BE .LT. 7,
  1382.     TAD (-107    //V4: DSN 21.19.1 AUG 78 TO ALLOW 71 ENTRIES/SEGMENT
  1383.     SZL CLA        /WORDS BEING .LT. 64
  1384.     JMP I (BODIR    /ERROR - CANT BE DIRECTORY
  1385.     SKP
  1386. NOUTFL,    AC4000        /WRTDIR MINUS MEANS DONT WRITE
  1387.     DCA I (WRTDIR    /DIRECTORY
  1388.     DCA I (MUSTWT    /CLEAR THE MUST WRITE FLAG
  1389.     DCA DIRKEY    /CLEAR THE OS/8 DIRECTORY KEY
  1390.     JMP I ODIRIN    /RETURN
  1391.     PAGE
  1392. /SUBROUTINE TO DO LOOKUPS ON OUTPUT DEVICE
  1393. /DOES IMMEDIATE RETURN IF NO OUTPUT DEVICE
  1394. /OTHERWISE RETURNS WITH BLOCK OF FILE IN AC   OR
  1395. /0 IN AC MEANING NOT FOUND OR NON-FILE STRUCTURED DEVICE
  1396. LOOKUP,    0
  1397.     TAD (SPOT    /ADDRESS OF FILE NAME
  1398.     DCA PLACE
  1399.     TAD I (7600    /GET OUTPUT DEVICE
  1400.     SNA        /SKIP IF PRESENT
  1401.     JMP I LOOKUP    /NO OUTPUT DEVICE
  1402.     JMS I (FAKUSR    /FAKE OUT THE USR
  1403.     JMS I (200
  1404.     2        /LOOKUP
  1405. PLACE,    SPOT
  1406.     0
  1407.     DCA PLACE    /NOT FOUND, 0 PLACE
  1408.     JMS I (UNFAK    /RESTORE RESIDENT HANDLER
  1409.     ISZ LOOKUP    /SKIP RETURN
  1410.     TAD PLACE    /WITH BLOCK IN AC
  1411.     JMP I LOOKUP
  1412. /HERE IS WHAT WE HAVE ALL BEEN WAITING FOR
  1413.  
  1414.     //////////////////////////////////////
  1415.    /                    /
  1416.   /        RENAME               /
  1417.  /                      /
  1418. //////////////////////////////////////
  1419.  
  1420. RENAME,    JMS LOOKUP
  1421.     JMP I (CLOERR    /SUPER SYSTEM DISASTER
  1422.     DCA OBLOCK    /V3C SAVE BLOCK OF NEW NAME (IF ANY)
  1423.     TAD (SPOT1-SPOT    /LOOKUP INPUT FILE
  1424.     JMS LOOKUP
  1425.     JMP I (CLOERR    /SUPER SYSTEM DISASTER
  1426.     CIA        /LOOKUP INPUT NAME ON OUTPUT DEVICE
  1427.     TAD OBLOCK    /IS IT SAME SPOT AS NEW NAME ON OUTPUT DEVICE?
  1428.     SZA CLA        /V3C
  1429.     JMS EXERR    /NO, MAYBE ALREADY EXISTS
  1430.     TAD I (1404    /GET ADDRESS OF FILE
  1431.     TAD 17        /FROM MONITOR BY THE
  1432.     TAD (-4        /DOCUMENTED METHOD
  1433.     DCA TEMP
  1434.     TAD (SPOT-1    /GET NEW OUTPUT NAME
  1435.     DCA XR1
  1436.     TAD (-4        /SET UP COUNT OF WORDS TO MOVE
  1437.     DCA CNT
  1438. RNAM,    TAD I XR1    /MOVE THEM
  1439.     DCA I TEMP
  1440.     ISZ TEMP
  1441.     ISZ CNT
  1442.     JMP RNAM    /CONTINUE TILL DONE
  1443.     TAD I (1404    /V3C
  1444.     SNA CLA        /BUT IS THERE ROOM FOR DATE?
  1445.     JMP NONUDA    /NO, NO ADDITIONAL INFO WORDS
  1446.     TAD I (DATE    /YES, MOVE DATE
  1447.     DCA I TEMP    /INTO NEW FILENAME ENTRY
  1448. NONUDA,    JMS WRKEY    /V3C
  1449.     ISZ I (WRTDIR    /INDICATE DIRECTORY CHANGED
  1450.     JMP I (NFUNCT    /DO NEXT FILE
  1451.  
  1452. WRKEY,    0        /V9
  1453.     TAD DIRKEY    /GET "SEGMENT IN CORE" KEY
  1454.     AND (7        /ISOLATE SEGMENT NUMBER
  1455.     DCA SEGNO    /NUMBER FOR WRITE
  1456.     CIF 0
  1457.     JMS I 51    /CALL HANDLER USR USED TO DO
  1458.     4210        /LOOKUP, THIS POINTS TO FOTPS
  1459.     1400        /INCORE DIRECTORY HANDLER
  1460. SEGNO,    0        /REWRITE UPDATED DIRECTORY BLOCK
  1461.     JMP I (CLOERR    /SYSTEM ERROR
  1462.     JMP I WRKEY
  1463. EXERR,    0        /BLOCK NUMBERS DIFFERENT
  1464.     TAD OBLOCK    /LOOK AT BLOCK NUMBER OF EXISTING FILE
  1465.     SNA CLA        /DID IT REALLY EXIST?
  1466.     JMP I EXERR    /NO, OK TO RENAME TO THIS NAME
  1467.     JMS I (ERROR    /YES, TRYING TO RENAME TO EXISTING NAME
  1468.     RENERR+40    /FILE ALREADY EXISTS
  1469.     JMP I (POUTNM
  1470.  
  1471. OBLOCK,    0        /TEMPORARY, HOLDS BLOCK NUMBER OF ALREADY
  1472.             /EXISTING FILE WITH SAME NAME AS PROPOSED NEW NAME
  1473.             /ON OUT PUT DEVICE (OR 0 IF NONE)
  1474. /THIS ROUTINE TRANSFERS THE ADDITIONAL
  1475. /INFORMATION WORDS OF THE INPUT FILE WHEN COPYING
  1476. /IT IF THERE ARE ANY
  1477.  
  1478. ADDINF,    0
  1479.     CLA IAC        /AC=1
  1480.     TAD I (1404    /GET NUMBER OF WORDS FROM OUTPUT DIRECTORY
  1481.     SMA        /SKIP IF 2 OR MORE
  1482.     JMP NOTRAN    /WE DONT TOUCH IT
  1483.     DCA LOOKUP    /SAVE NEGATIVE NUMBER TO MOVE
  1484.     TAD LOOKUP    /ADD NUMBER TO LOC 17
  1485.     TAD 17        /TO FIND ADDR(SECOND)
  1486.     DCA PPTR1    /USE 17
  1487.     TAD INFWDS    /GET NUMBER OF AIW IN INPUT
  1488.     CIA        /NEGATE
  1489.     IAC        /ADD 1
  1490.     SMA        /SKIP IF MORE THAN 1 AIW
  1491.     JMP ZEROUT    /ZERO OUTPUT AIW
  1492.     DCA TEMP    /SAVE COUNT
  1493. MOVEM,    ISZ GPTR1    /BUMP PTR (1ST TIME PAST DATE)
  1494.     CDF 0
  1495.     TAD I GPTR1    /GET WORD
  1496. ZLOOP,    CDF 10
  1497.     DCA I PPTR1    /PUT IT INTO OUTPUT DIRECTORY
  1498.     ISZ PPTR1
  1499.     ISZ LOOKUP    /HAS OUTPUT COUNT OVERFLOWED?
  1500.     JMP MORE    /MORE OUTPUT TO DO
  1501.     JMS WRKEY    /V9
  1502. NOTRAN,    CLA        /EXIT
  1503.     JMP I ADDINF    /WERE DONE
  1504. MORE,    ISZ TEMP    /BUMP INPUT COUNT
  1505.     JMP MOVEM    /IT HASNT OVERFLOWED
  1506. ZEROUT,    CLA CMA        /NO MORE INPUT WORDS-
  1507.     DCA TEMP    /SO FIX UP TO ZERO REST OF OUTPUT WORDS
  1508.     JMP ZLOOP    /DO ALL THE OUTPUTS
  1509.  
  1510. PPTR1,    0
  1511.     PAGE
  1512. /** THIS IS THE STARTING ADDRESS OF FOTP!!!
  1513.  
  1514. FOTP,    JMS INIT    /REGULAR ENTRY POINT
  1515.     JMS INIT    /CHAIN ENTRY POINT
  1516.     JMP I (CDCALL    /CALL COMMAND DECODER
  1517.     JMP I (BYPSCD    /DONT CALL COMMAND DECODER
  1518. INIT,    0
  1519.     ISZ INIT    /DO SKIP RETURN
  1520.     CLA CLL
  1521.     CDF 0
  1522.     TAD I (7777    /GET BATCH CONTROL WORD
  1523.     AND (70
  1524.     TAD FCIF0    /FORM CIF TO BATCH FIELD
  1525.     DCA BATCIF
  1526.     TAD I (7777
  1527.     CDF 10
  1528.     RTL
  1529.     SNL CLA        /BATCH RUNNING?
  1530.     JMP NOBTCH    /NO
  1531. BMOVLP,    TAD BATOUT
  1532.     DCA I TTOUTP    /MOVE IN SUBSTITUTE TTY OUTPUT CODE
  1533.     ISZ BMOVLP
  1534.     ISZ TTOUTP
  1535.     ISZ TTCNT4
  1536.     JMP .-5
  1537.     STA
  1538. NOBTCH,    DCA CORFUJ    / =0 IF NO BATCH, -1 IF BATCH
  1539. MOVMSG,    TAD I ONCE    /MOVE MSGS TO LOWER FIELD
  1540.     CDF 0
  1541.     DCA I ONLY
  1542.     CDF 10
  1543.     TAD I M1
  1544.     CDF 0        /MOVE CORE DETERMINER
  1545.     DCA I M1    /INTO FIELD 0 ALSO
  1546.     CDF 10
  1547.     ISZ M1
  1548.     ISZ ONCE
  1549.     ISZ ONLY
  1550.     ISZ CODE
  1551.     JMP MOVMSG
  1552.     TAD (2000    /SET RESTART LOCATION
  1553.     CDF 0
  1554.     DCA I (7745
  1555.     TAD (6403    /SET JSW
  1556.     DCA I (7746
  1557.     CDF 10
  1558.     TAD I (7726
  1559.     RTR
  1560.     RAR
  1561.     SZL CLA
  1562.     JMP I (SYMPAT    /FIX BUFFER IF SYMBIONT IS RUNNING
  1563.             /IF SYMBIONT IS RUNNING, ASSUME FIELD 2 IS
  1564.             /ALWAYS USEABLE, HOWEVER DON'T GO ABOVE 5000
  1565.             /JUST IN CASE BATCH IS RUNNING
  1566. FCIF0,    CIF 0
  1567.     JMS CORE
  1568.     TAD CORFUJ    /COMPUTE AMOUNT OF CORE EXCLUDING BATCH FIELD
  1569.     TAD (-1
  1570.     SZA CLA        /SKIP IF WE HAVE ONLY 8K (OR 12K AND BATCH)
  1571.     JMP I INIT
  1572.     TAD (TAD EPTR    /PATCH LOCATIONS IN FOTP
  1573.     DCA I (F2C1    /TO WORK WITH ONLY 8K
  1574.     TAD (NOP
  1575.     DCA I (F2C2
  1576. INIRET,    JMP I INIT    /START
  1577.  
  1578. M1,    .&7600
  1579. ONCE,    MSGS
  1580. ONLY,    LSTFPG+200
  1581. CODE,    7400
  1582.  
  1583. CORFUJ,    0
  1584. TTCNT4,    -4
  1585. TTOUTP,    TTYOUT
  1586. BATOUT,    SKP        /OUTPUT TO BATCH LOG
  1587.     7400
  1588. BATCIF,    HLT
  1589.     TTYOUT+1&177+4600    /JMS I .-2
  1590. /SUBR TO DETERMINE MACHINE SIZE - RETURNS NUMBER OF
  1591. /BANKS IN AC.
  1592. /MUST RUN IN FIELD 0.
  1593.  
  1594. CORE,    0
  1595.     TAD    C6203
  1596.     RDF
  1597.     DCA    CORRTN
  1598.     CDF 0
  1599.     TAD I (7777
  1600.     AND (70
  1601.     SNA        /DOES LOCATION 7777 SPECIFY CORE SIZE?
  1602.     JMP CORELP    /NO
  1603.     CLL RTR        /YES - BELIEVE IT.
  1604.     RAR
  1605.     JMP CORRTN
  1606. CORELP,    CDF 0        /NEEDED FOR PDP-8L
  1607.     TAD TRYFLD    /GET FLD TO TST
  1608.     CLL RTL
  1609.     RAL
  1610.     AND    COR70    /MASK USEFUL BITS
  1611.     TAD    CORELP
  1612.     DCA    .+1    /SET UP CDF TO FLD
  1613. COR706,    0
  1614.     TAD I    CORLOC    /SAV CURRENT CONTENTS
  1615.     NOP        /HACK FOR PDP-8
  1616.     DCA    .-3
  1617.     TAD    .-2    /7000 IS A GOOD PATTERN
  1618.     DCA I    CORLOC
  1619. COR70,    70        /HACK FOR PDP-8.,NO-OP
  1620.     TAD I    CORLOC    /TRY TO READ BK 7000
  1621.     7400        /HACK FOR PDP-8,.NO-OP
  1622.     TAD    .-1    /GUARD AGAINST WRAP AROUND
  1623.     TAD    CORLOC+1    /TAD 1400
  1624.     SZA CLA
  1625.     JMP    .+5    /NON EXISTENT FLD EXIT
  1626.     TAD    COR706    /RESTORE CONTENS DESTROYED
  1627.     DCA I    CORLOC
  1628.     ISZ    TRYFLD /TRY NXT HIGHER FLD
  1629.     JMP    CORELP
  1630.     STA
  1631.     TAD    TRYFLD
  1632. CORRTN,    0
  1633.     JMP I    CORE
  1634. CORLOC,    COR70+2        /ADR TO TST IN EACH FLD
  1635.     1400        /7000+7400+1400=0
  1636. TRYFLD,    1        /CURRENT FLD TO TST
  1637. C6203,    6203
  1638.  
  1639.     PAGE
  1640. /FOTP'S ERROR MESSAGES
  1641. /THESE RESIDE IN FIELD 0 LOCATIONS 7200-7577
  1642.  
  1643. MSGS,
  1644.  
  1645.     NOPUNCH
  1646.     *LSTFPG+200
  1647.     ENPUNCH
  1648.  
  1649. ILLQ,    TEXT /ILLEGAL ?%/
  1650. ILLA,    TEXT /ILLEGAL *%/
  1651. SERR,    TEXT /SYSTEM ERROR/
  1652. RENERR,    TEXT /ALREADY EXISTS-/
  1653. VERNO,    0617;2420;4026    /FOTP V
  1654.     VERSION        //V4: "A0"
  1655.     SUBVER
  1656. BADIRD,    TEXT /ERROR READING INPUT DIRECTORY%/
  1657. ODRERR,    TEXT /ERROR READING OUTPUT DIRECTORY%/
  1658. ODIERR,    TEXT /ERROR WRITING OUTPUT DIRECTORY%/
  1659. SPRBLM,    TEXT /NO ROOM, SKIPPING-/
  1660. INERR,    TEXT /ERROR ON INPUT DEVICE-SKIPPING-/
  1661. OUERR,    TEXT /ERROR ON OUTPUT DEVICE-SKIPPING-/
  1662. NFLEIN,    TEXT /USE PIP FOR NON-FILE STRUCTURED INPUT%/
  1663. NOFILE,    TEXT /NO FILES OF THE FORM:/
  1664. BIDIRM,    TEXT /BAD INPUT DIRECTORY%/
  1665. BODORM,    TEXT /BAD OUTPUT DIRECTORY%/
  1666. CNTDEL,    TEXT /DELETES PERFORMED ONLY ON INPUT DEVICE GROUP 1/
  1667. CNTDE2,    TEXT /CAN'T HANDLE MULTIPLE DEVICE DELETES%/
  1668. DSVED,    TEXT /ORIGINAL DIRECTORY PRESERVED%/
  1669. FLSFMS,    TEXT /MOUNT NEXT OUTPUT VOLUME:/
  1670.  
  1671.     FIELD 1        /SELF-STARTING BINARY LOADER STUFF FOR ABSLDR
  1672.     *FOTP
  1673.     $
  1674.  
  1675.