home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / RCPM / LUX100.LBR / LUX100.ZZ0 / LUX100.Z80
Text File  |  2000-06-30  |  49KB  |  1,904 lines

  1.  
  2. ; LUX - A Library extension system - Version 100 as of 03/05/87
  3. ;
  4. ;              Supports CPM v2.2 and CPM v3.0
  5. ;
  6. ; Allows the user to peer into .ARC, .ARK and .LBR file groups.  With
  7. ; appropriate peripheral files which accompany this program (or are
  8. ; already on most RCPM systems) can type .LBR member files whether
  9. ; crunched, squeezed or normal.  Can also type files in .ARC or .ARK
  10. ; libraries.  If using KMD or a comparable program, can easily extract
  11. ; member files from .ARC, .ARK or .LBR groups.  Options included to use
  12. ; KMD clones such as MBKMD and NUKMD.
  13. ;
  14. ;-----------------------------------------------------------------------
  15. ;
  16. ; 03/05/87  This is LUX77 renamed to LUX100.  It has numerous features
  17. ;  v100     which make it far more desireable for many RCPM operators
  18. ;        than Tom Brady's versions called LUX54, LUX75 and LUX80,
  19. ;        all of which are virtually identical and none of which work
  20. ;        on CPM v3.0 systems that many of us have.  LUX70, LUX77 and
  21. ;        this LUX100 work great on CPM v3.0 as well as on CPM v2.2
  22. ;        systems.  Irv had version LUX54 ready in October of 1986 but
  23. ;        never released it while waiting for Bob Freed to finish NOAH
  24. ;        since LUX52 already supported both .LBR and .ARC files.
  25. ;        Tom Brady put out his version called LUX54 so Irv didn't have
  26. ;        much choice except to skip to LUX70 for his version in a
  27. ;        courteous way to allow Tom Brady to continue developing his
  28. ;        LUX54 with LUX55 - should any additional things of merit be
  29. ;        added.  Such has not been the case.  Tom has taken a personal
  30. ;        vendetta to prevent the rest of us from using Irv's version
  31. ;        which took me all of 5 minutes to install on my CPM v3.0
  32. ;        system.  This was the first I had been able to even use LUX
  33. ;        on my system and I for one greatly appreciate what Irv has
  34. ;        contributed to this excellent program.  I don't care for Tom
  35. ;        Brady trying to play God and dictate to me what I should use
  36. ;        on my system.  I know many of you will agree with me.  Tom
  37. ;        also included UNARC142 in his version, without permission
  38. ;        from Bob Freed.  He specifically distributed that with the
  39. ;        distinct admonition that it was a beta test version for sysops
  40. ;        use only.  Tom Brady totally ignored this warning and made the
  41. ;        program public as though it were his to do with as he wished.
  42. ;        This has upset Bob Freed to the point he may never issue any
  43. ;        source code to any of his programs, again.    He was already
  44. ;        upset with Tom Brad's stealing the copyrighted routines he
  45. ;        had given to Irv for exclusive use in KMD.  If you never see
  46. ;        NOAH for CPM it may well be because of Tom Brady's antics.
  47. ;        (I got some of this information from direct personal calls.
  48. ;        The rest was already well known in many parts of the country.)
  49. ;                    - Earl Crocket
  50. ;                      Earl's Corner RCPM
  51. ;
  52. ; 03/04/87  (By Tom Brady, who again totally substituted his version of
  53. ;   v80     LUX54 in place of LUX77 then put an .ARK extention on it.
  54. ;        It is an obvious effort to again totally discredit the efforts
  55. ;        of Irv Hoff to simpifly and adapt the LUX program to use
  56. ;        normal programs already on most RCPM systems.)
  57. ;
  58. ; 03/01/87  NOTICE TO TOM BRADY:  LEAVE YOUR FINGERS OFF THIS PROGRAM.
  59. ;   v77     IF YOU WANT TO CONTINUE MUCKING WITH LUX, SUGGEST YOU USE
  60. ;        THE NUMBER LUX55 TO FOLLOW YOUR OWN LUX54.    I INTENTIONALLY
  61. ;        SKIPPED TO LUX70 SO AS TO NOT PROHIBIT YOU FROM DOING JUST
  62. ;        THAT, BUT WILL NOT TOLERATE YOUR USING THIS SERIES IN AN
  63. ;        OBVIOUS ATTEMPT TO PREVENT ME FROM CONTRIBUTING TO THE DE-
  64. ;        VELOPMENT OF THIS PROGRAM.
  65. ;
  66. ;        Restored LUX v77 to the original intent of the LUX 7x ver-
  67. ;        sion.  I had already skipped to LUX70 to not place Tom Brady
  68. ;        in a position where he could not continue working with his
  69. ;        LUX54, calling any subsequent version LUX55.  Instead he
  70. ;        elected to try to totally obliterate any work I had put into
  71. ;        this program.  I will not allow that to occur.  Many people
  72. ;        prefer my version to his, since it can be installed on any
  73. ;        RCPM as fast as you can extract the files from the libaray.
  74. ;                    - Irv Hoff
  75. ;
  76. ; 02/28/87  (Tom Brady totally replaced everything in the LUX70A version
  77. ;   v75     including all auxiliary programs in the library with his own
  78. ;        LUX54 version.  He further decided to jump to LUX75.  This
  79. ;        was done in an obvious attempt to force people to use only
  80. ;        his version.)
  81. ;
  82. ; 02/27/87  Added an equate to select MBKMD120 which came out about the
  83. ;   v70A    same time that LUX70 was being released.  LUX70A supports
  84. ;        KMD, MBKMD and NUKMD.  Be sure to make the proper selection.
  85. ;                    - Irv Hoff
  86. ;
  87. ; 02/22/87  MAJOR CHANGE... Rewrote program to use conventional files
  88. ;   v70     normally found on A0:
  89. ;
  90. ;           LCHEK.COM  (Current is LCHEK11.COM)
  91. ;           DIR.COM      (Renamed SD.COM with $L option)
  92. ;           TYPE.COM   (Should handle both squeezed and crunched)
  93. ;           UNARC.COM  (Combination DIR and TYPE for .ARC/.ARK files)
  94. ;
  95. ;        Special files such as LUXCHK, LUXDIR, LUXTYPE, etc. on
  96. ;        a special drive/user area (usually A15:) no longer needed.
  97. ;        This greatly simplifies the installation and use of LUX.
  98. ;        Wheel byte, MAXDRV and MAXUSR bytes no longer used or even
  99. ;        needed - LUX can be only be called up in whatever drive/user
  100. ;        area you are currently in, which in itself is the limiting
  101. ;        factor.  This is a radical departure from previous versions
  102. ;        so the version number has been significantly advanced.  This
  103. ;        allows additional updates of conventional versions if others
  104. ;        want an additional choice.    This makes one universal version
  105. ;        possible for any size system from small floppies to immense
  106. ;        hard drives of 100 Mb and more.
  107. ;
  108. ;        Option added to support KMD, MB-KMD or NUKMD added as the
  109. ;        latter two must have must have both 'A' and 'L' capability
  110. ;        for various functions.  (KMD needs only the 'A', however it
  111. ;        accepts 'L' interchangeably since versions prior to .ARC or
  112. ;        .ARK files used 'L' for .LBR files.)  Can now exit LUX with
  113. ;        CTL-C, CTL-K or CTL-X.  This standardizes exit with other
  114. ;        similar programs.        - Irv Hoff
  115. ;
  116. ; 09/09/86  None of the previous LUX files protected its start address,
  117. ;   v54     allowing long programs to overrun LUX itself.  It would then
  118. ;        lock up the system until reset by the Sysop.  This happened
  119. ;        most often when using the TYPE command to look at lengthy
  120. ;        .DOC files but was not limited to such files.  Reformatted
  121. ;        and simplified.        - Irv Hoff
  122. ;
  123. ; 08/25/86  Modified for .ARK file support in addition to .ARC and .LBR.
  124. ;   v53                 - Norman Beeler
  125. ;
  126. ; 06/02/86  Modified for .ARC file support, using UNARCxx for DIR and
  127. ;   v52     TYPE commands....fully automatic determination of .ARC or
  128. ;        .LBR file extents, (extent not necessary).    Supports .ARC
  129. ;        member transfer.        - Norman Beeler
  130. ;
  131. ; 06/26/85  Modified for KMD support throughout.  Other cosmetic changes.
  132. ;   v51     KMD offers total automatic protocol detect.  (It also offers
  133. ;        YMODEM-type batch transfers but this is not used with LUX.)
  134. ;                    - Tom Brady
  135. ;
  136. ; 07/21/85  Added SENDK and SK options for use with 1k blocks which are
  137. ;   v50     needed for MEX114 and MS-DOS program with YMODEM protocol.
  138. ;        (1k blocks are fully automatic with IMP.  The 'SK' need not
  139. ;        be manually inserted for 1k protocol.)
  140. ;                    - Steve Sanders
  141. ;
  142. ; 11/26/83  Original release.  Adapted from ATTACH program.
  143. ;   v12B                - Steven Holtzclaw
  144. ;
  145. ;-----------------------------------------------------------------------
  146. ;
  147.     .Z80            ; Needed for M80, otherwise ignore
  148. ;
  149. YES    EQU    0FFH
  150. NO    EQU    0
  151. ;
  152. KMD    EQU    YES
  153. MBKMD    EQU    NO
  154. NUKMD    EQU    NO
  155. ;
  156. ;-----------------------------------------------------------------------
  157. ;
  158. ; Equates
  159. ;
  160. CR    EQU    0DH
  161. LF    EQU    0AH
  162. ;
  163. ;-----------------------------------------------------------------------
  164. ;
  165. ;
  166. ; If RCPM is Yes, change the BYECMD equate at end of this file if your
  167. ; logoff program is not called BYE.COM.
  168. ;
  169. RCPM    EQU    YES        ; Yes, if being used with a RCPM system
  170. HLPMSG    EQU    YES        ; Yes, if helpful messages are wanted
  171. AUTODR    EQU    YES        ; Yes, if initial auto-directory wanted
  172. HLPERS    EQU    2        ; Give auto-help after this many errors
  173. ;
  174. ;
  175. ;-----------------------------------------------------------------------
  176. ;
  177. ; The following files are normally on A0: and are for general purpose as
  178. ; well as for use with LUX.
  179. ;
  180. ;     NOTE:    The DIR.COM file must be a SD-xx.COM type
  181. ;        having the $L option (to show library member
  182. ;        contents).  This is normally placed on A0:
  183. ;        for general use in displaying the directory.
  184. ;        When choosing a drive, use:  0=A, 1=B, etc.
  185. ;
  186. CHKDRV    EQU    0        ; Drive number for LCHEK.COM (LCHEK11.COM)
  187. CHKUSR    EQU    0        ; User number  for LCHEK.COM
  188. ;
  189. DIRDRV    EQU    0        ; Drive number for DIR.COM  (SD.COM)
  190. DIRUSR    EQU    0        ; User number  for DIR.COM  (SD.COM)
  191. ;
  192. KMDRV    EQU    0        ; Drive number for KMD, MB-KMD or NUKMD
  193. KMDUSR    EQU    0        ; User number  for KMD, MB-KMD or NUKMD
  194. ;
  195. TYPDRV    EQU    0        ; Drive number for TYPE.COM
  196. TYPUSR    EQU    0        ; User number  for TYPE.COM
  197. ;
  198. UNADRV    EQU    0        ; Drive number for UNARC.COM
  199. UNAUSR    EQU    0        ; User number  for UNARC.COM
  200. ;
  201. ;-----------------------------------------------------------------------
  202. ;
  203. BDOS    EQU    0005H        ; Jumper vector for BDOS calls
  204. TPA    EQU    0100H        ; CP/M program area
  205. FCB1    EQU    005CH        ; First file control block
  206. FCB2    EQU    006CH        ; Second file control block
  207. REBOOT    EQU    0000H        ; Cold reboot address
  208. TBUFF    EQU    0080H        ; Default command buffer
  209. ;
  210. ;
  211. ; Macros used
  212. ;
  213. DRVUSR     MACRO    DRIVNO,USERNO,FNCNAM,RTN1,RTN2,RTN3,RTN4
  214.     CALL    FILTYP
  215.     DEFB    DRIVNO+'A'
  216. ;
  217. USERN1    DEFL    USERNO
  218. ;
  219.      IF    USERN1 GT 9
  220.     DEFB    (USERN1    /10)+'0'
  221. ;
  222. USERN1    DEFL    USERN1-10
  223.      ENDIF            ; USERN1 GT 9
  224. ;
  225.     DEFB    USERN1+'0'
  226.     DEFB    ':'
  227.     DEFB    FNCNAM
  228.     DEFB    0
  229. ;
  230.      IF    NOT NUL    RTN1
  231.     CALL    RTN1
  232.      ENDIF            ; NOT NUL RTN1
  233. ;
  234.      IF    NOT NUL    RTN2
  235.     CALL    RTN2
  236.      ENDIF            ; NOT NUL RTN2
  237. ;
  238.      IF    NOT NUL    RTN3
  239.     CALL    RTN3
  240.      ENDIF            ; NOT NUL RTN3
  241. ;
  242.      IF    NOT NUL    RTN4
  243.     CALL    RTN4
  244.      ENDIF
  245.     JP    PROCES        ; NOT NUL RTN4
  246.      ENDM
  247. ;
  248. DVUS     MACRO    DRIVNO,USERNO,FNCNAM,RTN1,RTN2,RTN3,RTN4
  249.     CALL    FILTYP
  250.     DEFB    DRIVNO+'A'
  251. ;
  252. USERN2    DEFL    USERNO
  253. ;
  254.      IF    USERN2 GT 9
  255.     DEFB    (USERN2    /10)+'0'
  256.     USERN2    DEFL USERN2-10
  257.      ENDIF            ; USERN2 GT 9
  258. ;
  259.     DEFB    USERN2+'0'
  260.     DEFB    ':'
  261.     DEFB    FNCNAM
  262.     DEFB    0
  263.      ENDM
  264. ;
  265. CMDJMP     MACRO    VERB,VECTOR
  266.     CALL    ILCMP
  267.     DEFB    VERB
  268.     DEFB    0
  269.     JP    NC,VECTOR
  270.      ENDM
  271. ;
  272. ;=======================================================================
  273. ;
  274. ;            Program starts here
  275. ;
  276. ;=======================================================================
  277. ;
  278. START:    LD    SP,SSTACK    ; Starting stack
  279.     CALL    ILPRT
  280.     DEFB    CR,LF,'LUX v100'
  281.     DEFB    CR,LF,0
  282. ;
  283. ;
  284. ; Check for a blank or null command line
  285. ;
  286.     LD    A,(TBUFF+1)    ; Get byte from default command buffer
  287.     OR    A        ; If non-zero then there is a possible
  288.     JP    NZ,GTDVUS    ; File specified
  289. ;
  290. SPCERR:    CALL    ILPRT        ; Print the error message
  291.     DEFB    CR,LF
  292.     DEFB    '++ Examples of valid LUX commands ++',CR,LF,LF
  293.     DEFB    '   LUX HELLO.ARC',CR,LF
  294.     DEFB    '   LUX HELLO.ARK',CR,LF
  295.     DEFB    '   LUX HELLO.LBR',CR,LF,LF
  296.     DEFB    '   The extent is not needed if no other ',CR,LF
  297.     DEFB    '   library files have a similar name.'
  298.     DEFB    CR,LF,0
  299.     JP    REBOOT        ; Reboot since we have overwritten CCP
  300. ;.....
  301. ;
  302. ;
  303. GTDVUS:    LD    HL,TBUFF+2    ; Index default key buffer
  304.     CALL    DRUSR        ; Get requested drive/user
  305.     JP    C,SPCERR
  306. ;
  307. ;
  308. ; Test for drive/user within range
  309. ;
  310.     LD    (RQDDRV),BC    ; Set the requested drive/user
  311.     EX    DE,HL        ; DE is source address to create new FCB
  312.     LD    HL,FCB1        ; Index FCB
  313.     CALL    SCANR1        ; Create the new FCB
  314. ;
  315. ;
  316. ; Force the default file type
  317. ;
  318.     LD    HL,'RA'        ; Set 'AR' into first two bytes of file type
  319.     LD    (FCB1+9),HL
  320.     LD    A,'K'        ; Set 'K' into last byte of file type
  321.     LD    (FCB1+11),A
  322. ;
  323. ;
  324. ; Get the library name from the FCB and store it
  325. ;
  326.     LD    HL,FCB1        ; Source for move
  327.     LD    DE,LBRNAM-1    ; Destination for move
  328.     LD    BC,9        ; Max 8 character filename
  329.     LDIR            ; Move to local name
  330.     LD    HL,FCB1+1    ; First byte of filename
  331.     LD    A,'?'        ; Character to look for
  332.     LD    BC,11        ; Search thru 11 bytes
  333.     CPIR            ; Do search
  334.     JR    NZ,LOOKUP    ; No ? found - continue
  335.     CALL    ILPRT        ; Print the error message
  336.     DEFB    CR,LF
  337.     DEFB    '++ Ambiguous filenames are not allowed ++',CR,LF,0
  338.     JP    SPCERR
  339. ;.....
  340. ;
  341. ;
  342. ; Look for the filename on directory
  343. ;
  344. LOOKUP:    CALL    GETOLD        ; Get the current drive/user
  345.     CALL    SETNEW        ; Set requested drive/user
  346.     LD    DE,080H        ; Default DMA address
  347.     LD    C,26
  348.     CALL    BDOS        ; Set the DMA address
  349.     LD    DE,FCB1        ; Index filename specified
  350.     LD    C,17
  351.     CALL    BDOS        ; Search for first
  352.     INC    A        ; Does file exist?
  353.     JP    NZ,SETARK    ; Jump to start of LUX
  354.     LD    HL,'RA'        ; Try .ARC file
  355.     LD    (FCB1+9),HL
  356.     LD    A,'C'        ; Set .ARC
  357.     LD    (FCB1+11),A
  358.     LD    DE,FCB1
  359.     LD    C,17        ; See if it exists
  360.     CALL    BDOS
  361.     INC    A
  362.     JP    NZ,SETARC    ; Yes so go
  363.     LD    HL,'BL'        ; Try .LBR file
  364.     LD    (FCB1+9),HL
  365.     LD    A,'R'        ; Set .LBR
  366.     LD    (FCB1+11),A
  367.     LD    DE,FCB1
  368.     LD    C,17        ; See if it exists
  369.     CALL    BDOS
  370.     INC    A
  371.     JP    Z,NOFILE    ; No, error off
  372.     JP    PRESTR
  373. ;.....
  374. ;
  375. ;
  376. SETARC:    LD    A,0FFH        ; Yes, set ARCFLG
  377.     LD    (ARCFLG),A
  378.     JP    PRESTR
  379. ;.....
  380. ;
  381. ;
  382. SETARK:    LD    A,7FH        ; Yes, set ARCFLG and .ARK
  383.     LD    (ARCFLG),A
  384. ;
  385. PRESTR:    LD    HL,FCB1
  386.     LD    DE,LBRNAM-1    ; Update library name (.ARC)
  387.     LD    BC,12
  388.     LDIR
  389.     JP    PGMSTR        ; Go do it
  390. ;.....
  391. ;
  392. ;
  393. NOFILE:    CALL    SETOLD
  394.     CALL    ILPRT        ; Print the error message
  395.     DEFB    CR,LF,'Can''t find ',0
  396.     CALL    DVUPRT
  397.     CALL    NAMPRT        ; Print the filename
  398.     CALL    ILPRT
  399.     DEFB    ' - check the DIR',CR,LF,0
  400.     JP    0000H        ; Reboot since we have destroyed the ccp
  401. ;.....
  402. ;
  403. ;
  404.     DEFS    64        ; 32 level stack for here
  405. ;
  406. SSTACK    EQU    $
  407. ;
  408. FINIS    EQU    $        ; Finish of program loader
  409. ;
  410. LODLEN    EQU    FINIS-START    ; Length of loader
  411.                 ; Keep the program in line
  412.     DEFS    300H-LODLEN    ; Add extra bytes here to make
  413.                 ; 'PGMSTR' start on a 100h byte boundary
  414. ;
  415. ;-----------------------------------------------------------------------
  416. ; This is the start of the relocated program - all of the code from
  417. ; 'START' to here is thrown away once LUX begins execution.
  418. ;-----------------------------------------------------------------------
  419. ;
  420. ; set up the BDOS and BIOS patches
  421. ;
  422. PGMSTR:    JP    INIT        ; Jump to start of this module
  423.     DEFB    'LUX v100'    ; The name 'LUX' is a clue to other
  424.                 ;   programs that enables them to deter-
  425.                 ;   mine if LUX is resident. 'L' is at
  426.                 ;   BDOS+3 when LUX is resident.
  427. ;
  428. ; This is the LUX removal routine, jumped to by the BYE command.  It is
  429. ; accessable to external programs and is defined to exist at LUX+12
  430. ; (looks like BDOS+12 when LUX is resident).
  431. ;
  432. REMOVE:
  433.      IF    RCPM
  434.     LD    SP,TPA+100H    ; Use the TPA for a stack
  435.     LD    BC,0        ; First select A0:
  436.     CALL    RESET
  437.     LD    DE,80H        ; Clear the DMA buffer
  438.     PUSH    DE
  439.     PUSH    DE
  440.     LD    B,128        ; Bytes to clear
  441.     XOR    A        ; Easy way to make A=0
  442. ;
  443. RZRLP:    LD    (DE),A        ; Null the location
  444.     INC    DE        ; Next address
  445.     DJNZ    RZRLP        ; Loop until 'B' is zero
  446. ;
  447.     LD    A,BYELEN    ; Store away the length of the command
  448.     LD    HL,BYECMD    ; Now move the commands to the DMA
  449.     LD    (HL),A
  450.     POP    DE        ; Restore the DMA address
  451.     LD    BC,BYELEN
  452.     LDIR
  453. ;
  454.     POP    DE        ; Restore it again
  455.     LD    C,26        ; Reset the DMA
  456.     CALL    BDOS
  457.     LD    DE,SUBFCB    ; Address the .SUB file FCB
  458.     LD    C,22        ; Make the file
  459.     CALL    BDOS
  460.     INC    A        ; Check for errors
  461.     JR    Z,EXITER    ; Oops, no directory space
  462.     LD    DE,SUBFCB    ; Else write the data
  463.     LD    C,21
  464.     CALL    BDOS
  465.     INC    A
  466.     JR    Z,EXITER    ; Oops, no space left
  467.     LD    DE,SUBFCB
  468.     LD    C,16        ; Now close the file
  469.     CALL    BDOS
  470.     LD    HL,0        ; Now make the exit routine go to A0:
  471.     LD    (OLDDRV),HL
  472.      ENDIF            ; RCPM
  473. ;
  474.     JP    UNPATH        ; Unpatch the jump table, and warm boot
  475. ;.....
  476. ;
  477. ;
  478. ; Error handler for REMOVE routine
  479. ;
  480.      IF    RCPM
  481. EXITER:    CALL    ILPRT        ; An error when making the .SUB file
  482.     DB    CR,LF,'+ Error: Can''t remove LUX! Please +'
  483.     DB    CR,LF,'+        type CTRL-C to exit LUX, +'
  484.     DB    CR,LF,'+        then type BYE to logoff. +',0
  485.     LD    SP,STACK
  486.     JP    GETCMD
  487.      ENDIF            ; RCPM
  488. ;.....
  489. ;
  490. ;
  491. ; This is the LUX intialization
  492. ;
  493. INIT:    LD    HL,(0005H+1)    ; Get BDOS start
  494.     LD    (PGMSTR+1),HL    ; Set new jump to BDOS
  495.     LD    HL,PGMSTR    ; Get local bdos vector
  496.     LD    (0005H+1),HL    ; Set it in low memory
  497.     LD    SP,STACK    ; Reset stack
  498.     LD    HL,(0000H+1)    ; Get BIOS warm boot vector
  499.     LD    (BIOS3),HL    ; Save old warm boot vector
  500. ;
  501. ;
  502. ; Save the old BIOS vectors
  503. ;
  504.     LD    HL,(BIOS3)    ; BIOS warm boot address
  505.     LD    DE,OWBOOT    ; Local warm boot address
  506.     LD    BC,12        ; 12 bytes to move
  507.     LDIR            ; Move the block
  508. ;
  509. ;
  510. ; Set up the new BIOS vectors
  511. ;
  512.     LD    HL,WBOOT    ; Source is local table
  513.     LD    DE,(BIOS3)    ; Destination is old BIOS
  514.     LD    BC,12        ; 12 bytes to move
  515.     LDIR            ; Move the block
  516.     LD    A,0FFH        ; Set the auto-directory byte
  517.     LD    (DOADIR),A
  518.     XOR    A        ; Reset the error count
  519.     LD    (HLPCNT),A    ;
  520.     JP    ENTRY        ; Initialize
  521. ;.....
  522. ;
  523. ;
  524. OWBOOT:    DEFB    0,0,0        ; Old WBOOT vector is moved to here
  525. OCONST:    DEFB    0,0,0        ; Old CONSTAT vector is moved to here
  526. OCONIN:    DEFB    0,0,0        ; Old cONIN vector is moved to here
  527. OCONOU:    DEFB    0,0,0        ; Old CONOUT vector is moved to here
  528. ;
  529. WBOOT:    JP    ENTRY        ; Vector warm boot to entry
  530. CONST:    JP    VCONST        ; Check for carrier
  531. CONIN:    JP    VCONIN        ; Vector conin to CONIN
  532. CONOU:    JP    VCONOU        ; Vector to CONOUT
  533. ;
  534. VCONST:    JP    OCONST        ; Jump to old CONSTAT routine
  535. ;
  536. VCONOU:    JP    OCONOU        ; Jump to old CONOUT routine
  537. ;
  538. VCONIN:    CALL    OCONIN        ; Get a byte
  539.     CP    'C'-40H        ; CTL-C?
  540.     JR    Z,VCON1
  541.     CP    'K'-40H        ; CTL-K?
  542.     JR    Z,VCON1
  543.     CP    'X'-40H        ; CTL-X?
  544.     RET    NZ        ; Nope - let BIOS have it
  545. ;
  546. VCON1:    LD    A,(ACTIVE)    ; Is LUX segment active?
  547.     OR    A
  548.     LD    A,3
  549.     RET    Z        ; Not active - let BIOS have it
  550. ;
  551.     LD    SP,TPA        ; Re initialize the stack
  552.     CALL    ILPRT        ; Print the following
  553.     DEFB    ' Exiting LUX',CR,LF,0
  554. ;
  555. UNPATH:    LD    HL,OWBOOT    ; Index old warm boot vector
  556.     LD    DE,(BIOS3)    ; BIOS jump table
  557.     LD    BC,12        ; 12 bytes to move
  558.     LDIR            ; Move the old table back
  559.     CALL    SETOLD        ; Set old drive/user
  560.     JP    0000H        ; Warm boot - end of program
  561. ;.....
  562. ;
  563. ;
  564. ; This is the LUX entry point
  565. ;
  566. ENTRY:    LD    SP,STACK    ; Set up local stack
  567.     LD    HL,PGMSTR    ; Dummy BDOS vector
  568.     LD    (6),HL        ; Set it
  569.     LD    HL,(BIOS3)    ; BIOS warm boot vector
  570.     LD    (1),HL        ; Set it
  571.     LD    A,0C3H        ; (JMP)
  572.     LD    (0),A        ; Reset warm boot jump
  573.     LD    (5),A        ; And BDOS jump
  574.     CALL    OCONST        ; See if character waiting
  575.     OR    A        ; Test result
  576.     JR    Z,ENTR1        ; If no character is waiting
  577.     CALL    OCONIN        ; Get the console character
  578.                 ; This is done to gobble any
  579.                 ; Possible garbage character
  580. ;
  581. ENTR1:    LD    A,0FFH
  582.     LD    (ACTIVE),A    ; Set LUX active
  583. ;
  584. GETCMD:    CALL    SETNEW        ; Reset drive/user
  585.     LD    IX,TBUFF+1    ; Place to put command string
  586.     LD    IY,TBUFF+0    ; Length of command
  587.     XOR    A
  588.     LD    (IY+0),A
  589. ;
  590.      IF    AUTODR
  591.     LD    A,(DOADIR)    ; Shall we do a directory?
  592.     OR    A
  593.     JR    Z,PROMPT    ; Guess not
  594.     XOR    A        ; Else zap the byte
  595.     LD    (DOADIR),A
  596.     LD    A,3        ; Fake a DIR command
  597.     LD    (CMDLEN),A
  598.     LD    HL,'ID'
  599.     LD    (CMDLIN+2),HL
  600.     LD    L,'R'
  601.     LD    H,0
  602.     LD    (CMDLIN+4),HL
  603.     JP    GOCNV        ; And do it
  604.      ENDIF            ; AUTODR
  605. ;.....
  606. ;
  607. ;
  608. PROMPT:
  609.      IF    HLPMSG
  610.     CALL    ILPRT        ; Print the entry message
  611.     DEFB    CR,LF,'LUX v70 - ^C, ^K or ^X to exit, ? for menu'
  612.     DEFB    CR,LF,0
  613.      ENDIF            ; HLPMSG
  614. ;
  615. PRMPT2:    CALL    CRLF
  616.     CALL    DVUPRT        ; Print the LUX prompt
  617.     CALL    NAMPRT        ; Drive/user, library name
  618.     CALL    ILPRT
  619.     DEFB    ' -->',0
  620.     LD    DE,CMDLIN    ; Index command line
  621.     LD    C,10
  622.     CALL    BDOS        ; Read console buffer
  623.     LD    A,(CMDLEN)    ; Get command length
  624.     OR    A        ; Test it
  625.     JR    Z,GETCMD    ; If null command
  626.     LD    A,(CMDLIN+2)    ; Get first character
  627.     CP    ';'        ; Semicolon ok
  628.     JP    Z,PRMPT2
  629. ;
  630. GOCNV:    CALL    CNVBUF        ; Convert the command line to upper case
  631.     LD    DE,CMDLIN+2    ; Index data from the command line
  632.     LD    A,(ARCFLG)    ; Are we looking at .ARC files?
  633.     OR    A
  634.     JR    Z,LBRCMD    ; Nope, do .LBR commands
  635.     BIT    7,A
  636.     JR    Z,ARKFL
  637.     CMDJMP    'FILES',ACFILES
  638.     JR    REST
  639. ;
  640. ARKFL:    CMDJMP    'FILES',AKFILES
  641. ;
  642. REST:    CMDJMP    'TYPE',ATYPE
  643.     CMDJMP    'DIR',UNARC
  644.     CMDJMP    'D',UNARC
  645.     CMDJMP    'SD',UNARC
  646.     CMDJMP    'CHEK',NOARC1
  647.     JR    HLP
  648. ;
  649. LBRCMD:    CMDJMP    'TYPE',TIPE    ; File type command process
  650.     CMDJMP    'DIR',DIR    ; Directory command process
  651.     CMDJMP    'D',DIR        ; Alternate for DIR
  652.     CMDJMP    'SD',DIR    ; Alternate for DIR
  653.     CMDJMP    'FILES',FILES    ; Run DIR.COM in "$L" (.LBR) mode
  654.     CMDJMP    'CHEK',LCHEK    ; Run LCHEK
  655. ;
  656. HLP:    CMDJMP    '?',QKHELP    ; Alternate for HELP
  657.     CMDJMP    'LUX',LUX    ; LUX command process
  658. ;
  659. ;
  660. ; If there are other commands a user may use on your system, and you
  661. ; want to tell him to exit LUX first, then enter below:
  662. ;
  663. ;     CMDJMP  'CMD',NOGOT.
  664. ;
  665. ; Place your command in 'CMD' and it will tell the user that that com-
  666. ; mand is only available outside of LUX.
  667. ;
  668.      IF    RCPM AND KMD
  669.     CMDJMP    'KMD',KKMD    ; KMD command process
  670.      ENDIF            ; RCPM AND KMD
  671. ;
  672.      IF    RCPM AND MBKMD
  673.     CMDJMP    'MBKMD',KKMD    ; NUKMD command process
  674.      ENDIF            ; RCPM and MBKMD
  675. ;
  676.      IF    RCPM AND NUKMD
  677.     CMDJMP    'NUKMD',KKMD    ; NUKMD command process
  678.      ENDIF            ; RCPM and NUKMD
  679. ;
  680.      IF    RCPM
  681.     CMDJMP    'SEND',SEND    ; Synonym for KMD S, MBKMD S or NUKMD S
  682.     CMDJMP    'SENDK',SENDK    ; Synonym for KMD SK, MBkMD SK or NUKMD SK
  683.     CMDJMP    'CHAT',NOGOT    ; Tell user NOGOT here
  684.     CMDJMP    'BYE',NOGOT    ; Tell user NOGOT here
  685.      ENDIF            ; RCPM
  686. ;
  687. ;
  688. ; This will actually print the command in error like this
  689. ;
  690. ;   ERROR, DUR is not a valid LUX command.
  691. ;
  692.     CALL    ILPRT
  693.     DEFB    CR,LF,LF,'ERROR, ',0    ; Point at command error
  694.     CALL    PRTERR        ; Print the command just entered
  695.     LD    A,' '        ; And a space
  696.     CALL    CTYPE
  697.     LD    HL,HLPCNT    ; Address the error count
  698.     INC    (HL)        ; Bump it
  699.     LD    A,HLPERS    ; Have we reached the limit?
  700.     CP    (HL)        ;
  701.     JR    NZ,KPTRYN    ; No, jump around the rest
  702.     LD    (HL),0        ; Else reset the count
  703.     JP    QKHELP        ; And give him help anyway
  704. ;.....
  705. ;
  706. ;
  707. KPTRYN:    CALL    ILPRT        ; Tell them it's no good
  708.     DEFB    ' is not a valid LUX command.',CR,LF,0
  709.     JP    GETCMD
  710. ;.....
  711. ;
  712. ;
  713. PRTERR:    LD    HL,CMDLIN+2    ; Index command just entered
  714.     LD    A,(CMDLEN)    ; Get the length
  715.     LD    B,A        ; Into 'B'
  716. ;
  717. GETCM5:    LD    A,(HL)        ; Get a byte
  718.     CP    020H        ; Space ?
  719.     JR    Z,GETCM6    ; Yes - dont print it
  720.     CP    000H        ; Null
  721.     JR    Z,GETCM6    ; Yes - all done
  722.     CALL    CTYPE        ; Print the character
  723.     INC    HL        ; Next character
  724.     DJNZ    GETCM5        ; Loop for the rest
  725. ;
  726. GETCM6:    RET
  727. ;
  728. ;
  729. ; 'COMMAND TRANSLATION VECTORS
  730. ;
  731. ; 'SUMMARY OF AUX ROUTINES:
  732. ;
  733. ; 'FILTYP' installs the following 'DEFB' into new command line
  734. ;       specify the drive and user area for each command as in
  735. ;       the vectors below.  remember each 'DEFB' must end with a
  736. ;       zero.
  737. ;
  738. ; 'FILNAM' installs the current .LBR name into the new command line
  739. ;
  740. ; 'FILSPC' installs a space character into the new command line
  741. ;
  742. ; 'FILMEM' installs the requested member name into the new command line
  743. ;
  744. ;
  745. ACFILES:DRVUSR    DIRDRV,DIRUSR,'DIR *.ARC'
  746. AKFILES:DRVUSR    DIRDRV,DIRUSR,'DIR *.ARK'
  747. FILES:    DRVUSR    DIRDRV,DIRUSR,'DIR *.LBR'
  748. ;
  749. ATYPE:    DRVUSR    UNADRV,UNAUSR,'UNARC ',FILNAM,FILSPC,FILMEM
  750. DIR:    DRVUSR    DIRDRV,DIRUSR,'DIR ',FILNAM,FILDIR,FILMEM
  751. LCHEK:    DRVUSR    CHKDRV,CHKUSR,'LCHEK ',FILNAM,FILSPC,FILMEM
  752. TIPE:    DRVUSR    TYPDRV,TYPUSR,'TYPE ',FILNAM,FILSPC,FILMEM
  753. UNARC:    DRVUSR    UNADRV,UNAUSR,'UNARC ',FILNAM
  754. ;
  755.      IF    RCPM AND KMD
  756. SEND:    DRVUSR    KMDRV,KMDUSR,'KMD A ',FILNAM,FILSPC,FILMEM
  757. SENDK:    DRVUSR    KMDRV,KMDUSR,'KMD AK ',FILNAM,FILSPC,FILMEM
  758. SENDA:    DRVUSR    KMDRV,KMDUSR,'KMD A ',FILNAM,FILSPC,FILMEM
  759. SENDAK:    DRVUSR    KMDRV,KMDUSR,'KMD AK ',FILNAM,FILSPC,FILMEM
  760.      ENDIF            ; RCPM AND KMD
  761. ;
  762.      IF    RCPM AND NUKMD OR MBKMD
  763. SEND:    LD    A,(ARCFLG)    ; Are we in an .ARC file?
  764.     OR    A
  765.     JP    NZ,SENDA    ; Yes, use 'A' for .ARC
  766.     JP    SEND1        ; No, use 'L' for .LBR
  767. ;
  768. SENDK:    LD    A,(ARCFLG)    ; Are we in an .ARC file?
  769.     OR    A
  770.     JP    NZ,SENDA    ; Yes, use 'A' for .ARC
  771.     JP    SENDK1        ; No, use 'L' for .LBR
  772.      ENDIF            ; RCPM AND MBKMD OR NUKMD
  773. ;
  774.      IF    RCPM AND MBKMD
  775. SEND1:    DRVUSR    KMDRV,KMDUSR,'MBKMD L ',FILNAM,FILSPC,FILMEM
  776. SENDK1:    DRVUSR    KMDRV,KMDUSR,'MBKMD LK ',FILNAM,FILSPC,FILMEM
  777. SENDA:    DRVUSR    KMDRV,KMDUSR,'MBKMD A ',FILNAM,FILSPC,FILMEM
  778. SENDAK:    DRVUSR    KMDRV,KMDUSR,'MBKMD AK ',FILNAM,FILSPC,FILMEM
  779.      ENDIF            ; RCPM AND MBKMD
  780. ;
  781.      IF    RCPM AND NUKMD
  782. SEND1:    DRVUSR    KMDRV,KMDUSR,'NUKMD L ',FILNAM,FILSPC,FILMEM
  783. SENDK1:    DRVUSR    KMDRV,KMDUSR,'NUKMD LK ',FILNAM,FILSPC,FILMEM
  784. SENDA:    DRVUSR    KMDRV,KMDUSR,'NUKMD A ',FILNAM,FILSPC,FILMEM
  785. SENDAK:    DRVUSR    KMDRV,KMDUSR,'NUKMD AK ',FILNAM,FILSPC,FILMEM
  786.      ENDIF            ; RCPM AND NUKMD
  787. ;
  788. ;
  789. ; Quick help summary
  790. ;
  791. QKHELP:    CALL    ILPRT
  792.     DEFB    CR,LF,LF
  793.     DEFB    'You are using the LUX utility to work with an archive '
  794.     DEFB    CR,LF
  795.     DEFB    'or library file.  These are the available commands:'
  796.     DEFB    CR,LF,LF
  797.     DEFB    'CHEK HELLO.EXT     - Runs LCHEK on requested member '
  798.     DEFB    'file',CR,LF
  799.     DEFB    'DIR                - Display member files '
  800.     DEFB    'in this library',CR,LF
  801.     DEFB    'FILES              - Display other .ARC/.ARK/.LBR '
  802.     DEFB    'files available',CR,LF
  803.     DEFB    'LUX NEWNAME        - Attach to another '
  804.     DEFB    'LBR/ARC file ',CR,LF
  805. ;
  806.      IF    RCPM AND KMD
  807.     DEFB    CR,LF
  808.     DEFB    'KMD S HELLO.EXT    - Sends member file '
  809.     DEFB    'via auto-protocol detect',CR,LF
  810.     DEFB    'KMD SK HELLO.EXT   - Sends member file '
  811.     DEFB    'with manual 1k setting',CR,LF
  812.      ENDIF            ; RCPM AND KMD
  813. ;
  814.      IF    RCPM AND MBKMD
  815.     DEFB    'MBKMD S HELLO.EXT  - Sends member file '
  816.     DEFB    'via auto-protocol detect',CR,LF
  817.     DEFB    'MBKMD SK HELLO.EXT - Sends member file '
  818.     DEFB    'with manual 1k setting',CR,LF
  819.      ENDIF            ; RCPM AND MBKMD
  820. ;
  821.      IF    RCPM AND NUKMD
  822.     DEFB    'NUKMD S HELLO.EXT  - Sends member file '
  823.     DEFB    'via auto-protocol detect',CR,LF
  824.     DEFB    'NUKMD SK HELLO.EXT - Sends member file '
  825.     DEFB    'with manual 1k setting',CR,LF
  826.      ENDIF            ; RCPM AND NUKMD
  827. ;
  828.      IF    RCPM
  829.     DEFB    'SEND HELLO.EXT     - Same as ''S'' command',CR,LF
  830.     DEFB    'SENDK HELLO.EXT    - Same as ''SK'' command',CR,LF
  831.      ENDIF            ; RCPM
  832. ;
  833.     DEFB    CR,LF
  834.     DEFB    'TYPE HELLO.EXT     - Display ASCII file contents'
  835.     DEFB    CR,LF,CR,LF
  836.     DEFB    '?                  - Displays this menu'
  837.     DEFB    CR,LF,LF,'(Abort to CP/M with ^C, ^K or ^X)',CR,LF
  838.     DEFB    0
  839.     JP    GETCMD
  840. ;.....
  841. ;
  842. ;
  843. ; Tried entering CHAT - tell him to exit LUX first.  Add other commands
  844. ; as you wish.
  845. ;
  846. NOGOT:    CALL    CRLF
  847.     CALL    CRLF
  848.     CALL    PRTERR        ; Print the command
  849.     CALL    ILPRT        ; And then this
  850.     DEFB    '  <<== Exit LUX with ^C, ^K or ^C',CR,LF,0
  851.     JP    GETCMD        ; Go back for another command
  852. ;.....
  853. ;
  854. ;
  855. NOARC1:    CALL    CRLF
  856.     CALL    CRLF
  857.     CALL    ILPRT
  858.     DEFB    'Use DIR command for CRC values',CR,LF,0
  859.     JP    GETCMD
  860. ;.....
  861. ;
  862. ;
  863. ; KMD is a special case since the 'A' and 'R' options are invalid here
  864. ;
  865.      IF    RCPM
  866. KKMD:    CALL    ADVANC        ; Go to next character
  867.     LD    A,(HL)        ; Get the character
  868.     CP    'S'        ; If 'S' check for
  869.     JR    Z,KKMD1        ; Following 'K'
  870.     CP    'R'        ; Not legal here
  871.     JR    Z,KKMD2        ; Execute error routine
  872.     CP    'A'        ; Not legal here
  873.     JR    Z,KKMD3        ; Execute error routine
  874.     CP    'L'        ; Not legal here
  875.     JR    Z,KKMD3        ; Execute error routine
  876.      ENDIF            ; RCPM
  877. ;
  878.      IF    RCPM AND KMD
  879.     DRVUSR    KMDRV,KMDUSR,'KMD'
  880.      ENDIF            ; RCPM AND KMD
  881. ;
  882.      IF    RCPM AND MBKMD
  883.     DRVUSR    KMDRV,KMDUSR,'MBKMD'
  884.      ENDIF            ; RCPM AND MBKMD
  885. ;
  886.      IF    RCPM AND NUKMD
  887.     DRVUSR    KMDRV,KMDUSR,'NUKMD'
  888.      ENDIF            ; RCPM AND NUKMD
  889. ;
  890.      IF    RCPM
  891. KKMD1:    INC    HL        ; Get next chacter
  892.     LD    A,(HL)
  893.     CP    020H        ; Is it a space?
  894.     JR    Z,KKMD1A
  895.     CP    'K'        ; Or packet request?
  896.     JR    Z,KKMDK
  897. ;
  898. KKMD1A:    CALL    NXTSPC
  899.     LD    A,(ARCFLG)    ; Are we in an .ARC file?
  900.     OR    A
  901.     JP    Z,SEND        ; Nope, send regular
  902.     JP    SENDA        ; Yes, send .ARC
  903. ;.....
  904. ;
  905. ;
  906. KKMDK:    CALL    NXTSPC
  907.     LD    A,(ARCFLG)    ; Are we in an .ARC file?
  908.     OR    A
  909.     JP    Z,SENDK        ; Nope, send regular
  910.     JP    SENDAK        ; Yes, send .ARC
  911. ;.....
  912. ;
  913. ;
  914. KKMD2:    CALL    CRLF
  915.     CALL    PRTERR        ; Print the command
  916.     CALL    ILPRT        ; Print the following
  917.     DEFB    ' can''t (R)eceive while in LUX',CR,LF,0
  918.     JP    GETCMD        ; Return to command
  919. ;.....
  920. ;
  921. ;
  922. KKMD3:    CALL    CRLF
  923.     CALL    PRTERR        ; Print the command
  924.     CALL    ILPRT        ; Print the following
  925.     DEFB    ' uses S or SK options while in LUX',CR,LF,0
  926.     JP    GETCMD
  927.      ENDIF            ; RCPM
  928. ;.....
  929. ;
  930. ;
  931. ; 'LUX' command process
  932. ;
  933. LUX:    LD    A,(CMDLEN)    ; Get the length of the command line
  934.     CP    3        ; Was input only 'LUX'
  935.     JP    Z,LUX04        ; Error...
  936.     CALL    FNDSPC        ; Find a space in command line
  937.     JP    C,LUX05        ; Error if no space found
  938.     CALL    ADVANC        ; Search for the next non-blank character
  939.     JP    C,LUX05        ; Error if no more characters left
  940.     CALL    DRUSR        ; Get drive/user
  941.     JP    C,LUX05        ; If drive/user specification error
  942.     LD    (TMPDRV),BC    ; Save the temporary drive/user
  943.     EX    DE,HL        ; De is source address to create new fcb
  944.     LD    HL,TMPFCB    ; Index temporary fcb
  945.     CALL    SCANR1        ; Create the new fcb
  946.     LD    HL,'BL'        ; Set 'LB' into first two bytes of file type
  947.     LD    (TMPFCB+9),HL
  948.     LD    A,'R'        ; Set 'R' into last byte of file type
  949.     LD    (TMPFCB+11),A
  950.     CALL    SETTMP        ; Log into the requested drive/user
  951.     LD    DE,080H
  952.     LD    C,26        ; BDOS set DMA function
  953.     CALL    5        ; Set DMA address to 80h
  954.     LD    DE,TMPFCB    ; Index temporary FCB
  955.     LD    C,17        ; Bdos search first function
  956.     CALL    5
  957.     INC    A        ; Test for existence
  958.     JR    NZ,LUX01    ; OK, go
  959.     LD    HL,'RA'        ; Check for .ARC file
  960.     LD    (TMPFCB+9),HL
  961.     LD    A,'C'
  962.     LD    (TMPFCB+11),A
  963.     LD    DE,080H
  964.     LD    C,26
  965.     CALL    5
  966.     LD    DE,TMPFCB
  967.     LD    C,17
  968.     CALL    5
  969.     INC    A
  970.     JR    NZ,SETFLG    ; Set ARCFLG
  971.     LD    HL,'RA'        ; Check for .ARK file
  972.     LD    (TMPFCB+9),HL
  973.     LD    A,'K'
  974.     LD    (TMPFCB+11),A
  975.     LD    DE,080H
  976.     LD    C,26
  977.     CALL    5
  978.     LD    DE,TMPFCB
  979.     LD    C,17
  980.     CALL    5
  981.     INC    A
  982.     JR    Z,LUX05        ; Cant find file
  983.     LD    A,07FH
  984.     LD    (ARCFLG),A    ; Set .ARK flag true
  985.     JR    LUX02
  986. ;
  987. SETFLG:    LD    A,0FFH        ; Set .ARC flag true
  988.     LD    (ARCFLG),A
  989.     JP    LUX02
  990. ;.....
  991. ;
  992. ;
  993. LUX01:    LD    A,0        ; Set .ARC flag false
  994.     LD    (ARCFLG),A
  995. ;
  996. LUX02:    LD    HL,(TMPDRV)    ; Get temporary drive/user
  997.     LD    (RQDDRV),HL    ; Set new drive/user
  998.     LD    HL,TMPFCB+1    ; Source address of new name
  999.     LD    DE,LBRNAM    ; Current .lbr name
  1000.     LD    BC,12        ; 8 character file name
  1001.     LDIR            ; Move it
  1002.     CALL    ILPRT        ; For display neatness
  1003.     DEFB    CR,LF,0
  1004.     LD    A,0FFH        ; Set the auto-directory flag
  1005.     LD    (DOADIR),A
  1006.     JP    GETCMD
  1007. ;.....
  1008. ;
  1009. ;
  1010. LUX04:    CALL    ILPRT
  1011.     DEFB    CR,LF,'++ Invalid drive/user number ++',CR,LF,0
  1012.     JP    GETCMD
  1013. ;.....
  1014. ;
  1015. ;
  1016. LUX05:    CALL    ILPRT
  1017.     DEFB    CR,LF,LF,'Can''t find ',0
  1018.     CALL    DVUPR1
  1019.     LD    B,8
  1020.     LD    HL,TMPFCB+1
  1021.     CALL    NAMPR1        ; Print the file name
  1022.     CALL    ILPRT
  1023.     DEFB    ' - check your spelling',CR,LF,0
  1024.     JP    GETCMD
  1025. ;.....
  1026. ;
  1027. ;
  1028. PROCES:    XOR    A        ; Zero last byte of new command line
  1029.     LD    (IX+0),A
  1030.     LD    HL,TBUFF+1
  1031.     LD    (HLPCNT),A    ; Reset the error count
  1032.     CALL    DRUSR        ; Get drive/user
  1033.     LD    (COMDRV),BC    ; Set the .COM drive/user
  1034.     EX    DE,HL        ; De is source address to create new FCB
  1035.     CALL    SCANER        ; Create the new FCB
  1036.     EX    DE,HL        ; Into 'HL'
  1037.     LD    DE,TBUFF+1    ; Start of command buffer
  1038.     PUSH    HL
  1039.     PUSH    DE
  1040.     OR    A        ; Clear any carry
  1041.     SBC    HL,DE        ; Calculate length of move
  1042.     LD    A,(TBUFF)    ; Get command line length
  1043.     SUB    L        ; Calculate new length
  1044.     LD    (TBUFF),A    ; Put new length
  1045.     LD    A,07EH        ; Calculate length of block move
  1046.     SUB    L
  1047.     LD    C,A        ; Set into C
  1048.     LD    B,0        ; 'B' gets zero
  1049.     POP    DE        ; Restore destination
  1050.     POP    HL        ; And source
  1051.     LDIR            ; Move the block down
  1052.     LD    HL,FCB1        ; Set up first FCB
  1053.     LD    DE,TBUFF+1
  1054.     CALL    SCANR1
  1055.     LD    HL,FCB2        ; Set up second FCB
  1056.     CALL    SCANR1
  1057. ;
  1058. ;
  1059. ; Force the default file type (.COM)
  1060. ;
  1061.     LD    HL,'OC'        ; 'CO'
  1062.     LD    (DEFFCB+9),HL
  1063.     LD    A,'M'        ; 'M'
  1064.     LD    (DEFFCB+11),A
  1065.     XOR    A        ; Zero the record count and
  1066.     LD    (DEFFCB+15),A    ;   the extent number
  1067.     LD    (DEFFCB+32),A
  1068.     CALL    SETCOM        ; Set .COM drive/user
  1069.     LD    DE,TPA
  1070.     LD    C,01AH
  1071.     CALL    BDOS        ; Set DMA to TPA
  1072.     LD    DE,DEFFCB
  1073.     LD    C,011H
  1074.     CALL    BDOS        ; Search for first
  1075.     INC    A
  1076.     JR    NZ,PROCE1    ; File found
  1077.     CALL    ILPRT
  1078.     DEFB    CR,LF,'Can''t find ',0
  1079.     LD    B,8
  1080.     LD    HL,DEFFCB+1
  1081.     CALL    NAMPR1        ; Print the file name
  1082.     CALL    ILPRT        ; CR/LF
  1083.     DEFB    CR,LF,0
  1084.     JP    ENTRY        ; Go for more commands
  1085. ;.....
  1086. ;
  1087. ;
  1088. PROCE1:    LD    DE,TPA
  1089.     LD    C,01AH
  1090.     CALL    BDOS        ; Set DMA to TPA
  1091.     LD    DE,DEFFCB
  1092.     LD    C,00FH
  1093.     CALL    BDOS        ; Open file
  1094.     INC    A
  1095.     JR    NZ,PROCE2
  1096.     CALL    ILPRT
  1097.     DEFB    CR,LF,'.COM File error - notify SYSOP',CR,LF,0
  1098.     JP    ENTRY
  1099. ;.....
  1100. ;
  1101. ;
  1102. ; Load the .COM file into memory at 100h and call it
  1103. ;
  1104. PROCE2:    LD    HL,080H
  1105.     LD    DE,080H
  1106. ;
  1107. LODCOM:    ADD    HL,DE        ; Add record size offset
  1108.     EX    DE,HL        ; Get DMA address into 'DE'
  1109.     PUSH    DE        ; Save 'DE' and 'HL'
  1110.     PUSH    HL
  1111.     LD    C,01AH
  1112.     CALL    BDOS        ; Set DMA
  1113.     LD    DE,DEFFCB    ; Index .com file name
  1114.     LD    C,014H
  1115.     CALL    BDOS        ; Read a record
  1116.     POP    HL        ; Restore 'DE' and 'HL'
  1117.     POP    DE
  1118.     EX    DE,HL        ; 'HL' is dma address again
  1119.     OR    A        ; End of file ?
  1120.     JR    Z,LODCOM    ; No - read another record
  1121.     LD    C,13
  1122.     CALL    BDOS        ; Reset drive system
  1123.     CALL    SETNEW        ; Set new drive/user
  1124.     XOR    A
  1125.     LD    (ACTIVE),A    ; Clear command mode active
  1126.     CALL    CRLF
  1127.     CALL    TPA        ; Call the loaded file @100h
  1128.     LD    DE,35        ; Zero out FCB1
  1129.     LD    HL,FCB1
  1130. ;
  1131. ZEROFCB:LD    (HL),0
  1132.     INC    HL
  1133.     DJNZ    ZEROFCB
  1134.     JP    ENTRY        ; Go for more commands
  1135. ;.....
  1136. ;
  1137. ;
  1138. NAMPRT:    LD    B,8        ; 8 character file name
  1139.     LD    HL,LBRNAM    ; Index .LBR name
  1140. ;
  1141. NAMPR1:    LD    A,(HL)        ; Get a byte
  1142.     CP    020H        ; Space?
  1143.     JR    Z,NAMPR2    ; Yes - dont print
  1144.     CALL    CTYPE        ; Else print the character
  1145. ;
  1146. NAMPR2:    INC    HL        ; Next character
  1147.     DJNZ    NAMPR1        ; Process 8 characters
  1148.     LD    A,'.'        ; Print a seperator
  1149.     CALL    CTYPE
  1150.     LD    B,3        ; 3 character file type
  1151. ;
  1152. NAMPR3:    LD    A,(HL)        ; Get a character
  1153.     CALL    CTYPE        ; Print it
  1154.     INC    HL        ; Next character
  1155.     DJNZ    NAMPR3        ; Process 3 characters
  1156.     RET
  1157. ;.....
  1158. ;
  1159. ;
  1160. ; Write a string of characters to the crt
  1161. ;
  1162. ILPRT:    EX    (SP),HL        ; Save return address/get character pointer
  1163. ;
  1164. ILPRT1:    LD    A,(HL)        ; Get a byte
  1165.     OR    A        ; Test it
  1166.     JR    Z,ILPRT2    ; Null - end of string
  1167.     CALL    CTYPE        ; Else type the character
  1168.     INC    HL        ; Next character
  1169.     JR    ILPRT1        ; Loop for more
  1170. ;
  1171. ILPRT2:    INC    HL
  1172.     EX    (SP),HL        ; Restore return address
  1173.     RET            ; Return to caller
  1174. ;.....
  1175. ;
  1176. ;
  1177. ; Write a string of characters to the command line
  1178. ;
  1179. ; (works like ILPRT above)
  1180. ;
  1181. FILTYP:    EX    (SP),HL
  1182. ;
  1183. FILTY1:    LD    A,(HL)
  1184.     OR    A
  1185.     JR    Z,FILTY2
  1186.     CALL    PUTIN
  1187.     INC    HL
  1188.     JR    FILTY1
  1189. ;
  1190. FILTY2:    EX    (SP),HL
  1191.     RET
  1192. ;.....
  1193. ;
  1194. ;
  1195. ; Puts ' $L' on command line
  1196. ;
  1197. FILDIR:    CALL    FILSPC
  1198.     LD    A,'$'
  1199.     CALL    PUTIN
  1200.     LD    A,'L'
  1201.     CALL    PUTIN
  1202. ;
  1203. ;
  1204. ; Fill command line with a space
  1205. ;
  1206. FILSPC:    LD    A,20H        ; Space character
  1207.     JP    PUTIN        ; Fill in
  1208. ;.....
  1209. ;
  1210. ;
  1211. ; Fill command line with .LBR name
  1212. ;
  1213. FILNAM:    LD    B,8        ; 8 character file name
  1214.     LD    HL,LBRNAM    ; Index .LBR name
  1215. ;
  1216. FILNA1:    LD    A,(HL)        ; Get a character
  1217.     CP    020H        ; Space ?
  1218.     JR    Z,FILNA2    ; Yes - dont add to command line
  1219.     CALL    PUTIN        ; Put character into command line
  1220. ;
  1221. FILNA2:    INC    HL        ; Next character
  1222.     DJNZ    FILNA1        ; Process 8 characters
  1223.     LD    A,'.'        ; Put in a seperator character
  1224.     CALL    PUTIN
  1225.     LD    B,3        ; 3 character file type
  1226. ;
  1227. FILNA3:    LD    A,(HL)        ; Get a character
  1228.     CALL    PUTIN        ; Put in command line
  1229.     INC    HL        ; Next character
  1230.     DJNZ    FILNA3        ; Process 3 characters
  1231.     RET            ; Return to caller
  1232. ;.....
  1233. ;
  1234. ;
  1235. ; Fill command line with member name
  1236. ;
  1237. FILMEM:    CALL    PARSER        ; Parse member name
  1238.     LD    HL,MEMBER    ; Index member name
  1239.     LD    B,12        ; 12 character max
  1240. ;
  1241. FILME1:    LD    A,(HL)        ; Get a byte
  1242.     OR    A        ; End of input
  1243.     RET    Z        ; Yes - return
  1244.     CALL    PUTIN        ; Fill in one character
  1245.     INC    HL        ; Next character
  1246.     DJNZ    FILME1        ; Continue looping
  1247.     RET            ; Done
  1248. ;
  1249. PUTIN:    LD    (IX+0),A    ; Stuff the character into command line
  1250.     INC    IX        ; Get ready for next character
  1251.     INC    (IY+0)        ; Bump command line length
  1252.     RET            ; Return to caller
  1253. ;.....
  1254. ;
  1255. ;
  1256. ; Parse out a member name
  1257. ;
  1258. PARSER:    LD    HL,MEMBER    ; Index member name
  1259.     LD    B,12        ; Max 12 character filename
  1260. ;
  1261. PARSE1:    LD    (HL),0        ; Zero character
  1262.     INC    HL        ; Next character
  1263.     DJNZ    PARSE1        ; Clear the entire member name
  1264.     CALL    ADVANC        ; Advance to the next non blank character
  1265.     RET    C        ; If at the end of the line
  1266.     LD    DE,MEMBER    ; DE is index to member, HL set by ADVANC
  1267.     LD    HL,(NXTWRD)
  1268. ;
  1269. PARSE2:    LD    A,(HL)        ; Get source byte
  1270.     OR    A        ; End of input line ?
  1271.     RET    Z        ; Yes - return
  1272. ;
  1273.     LD    (DE),A        ; Put byte
  1274.     INC    HL        ; Next source
  1275.     INC    DE        ; Next destination
  1276.     JR    PARSE2        ; Continue looping
  1277. ;.....
  1278. ;
  1279. ;
  1280. ; Advance the word at NXTWRD to the next non-blank address of the com-
  1281. ; mand line.  Set carry if no more characters available.
  1282. ;
  1283. ADVANC:    LD    HL,(NXTWRD)    ; Get pointer to next word
  1284. ;
  1285. ADVAN1:    LD    A,(HL)        ; Get a byte
  1286.     OR    A        ; Test flags
  1287.     JR    Z,ADVAN3    ; Error - null character
  1288.     CP    020H        ; Space ?
  1289.     JR    NZ,ADVAN2    ; Yes - done
  1290.     INC    HL
  1291.     LD    (NXTWRD),HL    ; Put pointer back
  1292.     JR    ADVAN1        ; Loop for more
  1293. ;
  1294. ADVAN2:    OR    A        ; Clear any carry
  1295.     RET
  1296. ;
  1297. ADVAN3:    SCF            ; Set error condition
  1298.     RET
  1299. ;.....
  1300. ;
  1301. ;
  1302. FNDSPC:    LD    HL,CMDLIN+2    ; Index command line
  1303. ;
  1304. FND01:    LD    A,(HL)        ; Get a byte from command line
  1305.     OR    A        ; Eol ?
  1306.     JP    Z,FNDER        ; Error...
  1307.     CP    020H        ; Space?
  1308.     JP    Z,FNDEX        ; Yes - go find requested file name
  1309.     INC    HL        ; Next character
  1310.     JR    FND01        ; Else continue the search
  1311. ;
  1312. FNDER:    SCF            ; All chars. scanned and no space found
  1313.     RET
  1314. ;
  1315. FNDEX:    LD    (NXTWRD),HL    ; Set character location
  1316.     OR    A        ; Assure carry reset
  1317.     RET            ;
  1318. ;
  1319. NXTSPC:    LD    HL,(NXTWRD)    ; Get pointer to next word
  1320. ;
  1321. NXTSP1:    LD    A,(HL)        ; Get a byte
  1322.     OR    A        ; Is it a null?
  1323.     JR    Z,NXTSP2    ; Yes - return
  1324.     CP    020H        ; If at a space?
  1325.     JR    Z,NXTSP2    ; Yes - return
  1326.     INC    HL        ; Next character
  1327.     JR    NXTSP1        ; And continue looking
  1328. ;
  1329. NXTSP2:    LD    (NXTWRD),HL
  1330.     RET
  1331. ;.....
  1332. ;
  1333. ;
  1334. ; In-line compare.  Compares string addressed by 'DE' to string after
  1335. ; call (ends with zero).  Return with carry set means strings not the
  1336. ; same.  All registers except 'A'-reg are unaffected.
  1337. ;
  1338. ILCMP:    EX    (SP),HL
  1339.     PUSH    DE
  1340. ;
  1341. ILCMP1:    LD    A,(HL)        ; Get a byte from source
  1342.     OR    A        ; Null
  1343.     JR    Z,SAME1        ; Yes - same so far - test next char
  1344.     LD    A,(DE)        ; Get a byte from command string
  1345.     CP    (HL)        ; Same as source
  1346.     JR    NZ,NOTSAM    ; No - not the same
  1347.     INC    HL        ; Next source
  1348.     INC    DE        ; Next compare
  1349.     JR    ILCMP1        ; Loop again
  1350. ;
  1351. NOTSAM:    XOR    A        ; Zero for the test
  1352. ;
  1353. NSLP:    INC    HL        ; Next immediate byte
  1354.     CP    (HL)        ; Null yet ?
  1355.     JR    NZ,NSLP        ; No - continue
  1356. ;
  1357. SAME2:    SCF            ; Set error condition
  1358. ;
  1359. SAME:    EX    DE,HL        ; Get command string pointer
  1360.     LD    (NXTWRD),HL    ; Store it
  1361.     EX    DE,HL        ; Restore return address
  1362.     POP    DE        ; Restore source address
  1363.     INC    HL        ; Adjust to stack
  1364.     EX    (SP),HL        ; Replace return address
  1365.     RET            ; Return
  1366. ;
  1367. SAME1:    LD    A,(DE)        ; Get the next byte from command line
  1368.     OR    A        ; Null ?
  1369.     JR    Z,SAME        ; Yes - its ok
  1370.     CP    20H        ; Space ?
  1371.     JR    Z,SAME        ; Yes - thats ok too...
  1372.     JR    SAME2        ; Not ok- must be another character
  1373. ;.....
  1374. ;
  1375. ;
  1376. CTYPE:    PUSH    AF        ; Save all registers
  1377.     PUSH    BC
  1378.     PUSH    DE
  1379.     PUSH    HL
  1380.     AND    7FH        ; Be sure its ASCII
  1381.     LD    E,A        ; Into 'E'
  1382.     LD    C,2        ; Cpm console function
  1383.     CALL    BDOS
  1384.     POP    HL        ; Restore all registers
  1385.     POP    DE
  1386.     POP    BC
  1387.     POP    AF
  1388.     RET            ; Return to caller
  1389. ;.....
  1390. ;
  1391. ;
  1392. CRLF:    LD    A,13
  1393.     CALL    CTYPE
  1394.     LD    A,10
  1395.     JR    CTYPE
  1396. ;.....
  1397. ;
  1398. ;
  1399. ; Get the drive and user number for a file from command string index by
  1400. ; 'HL'
  1401. ;
  1402. ; On entry:
  1403. ;
  1404. ;    'HL' points to first byte of the command string
  1405. ;
  1406. ; on exit:
  1407. ;
  1408. ;    'HL' points to the byte following ':' in the command string if
  1409. ;      the ':' was found in the first 4 character positions.
  1410. ;    -or-
  1411. ;    'HL' points to the first byte of the command string if no ':'
  1412. ;      was found.
  1413. ;
  1414. ;    'C'  contains the requested drive number (0-15)
  1415. ;
  1416. ;    'B'  contains the requested user number (0-15)
  1417. ;
  1418. ;    'AF' the number of characters thru the ':' in the command string.
  1419. ;
  1420. ;    'CY' is set if drive or user number is out of range (0-15)
  1421. ;
  1422. ;-----------------------------------------------------------------------
  1423. ;
  1424. DRUSR:    LD    (TEMPHL),HL    ; Save the pointer address
  1425.     LD    IX,(TEMPHL)    ; 'IX' get the pointer address
  1426.     LD    BC,5        ;
  1427.     LD    A,':'
  1428.     CPIR            ; Search for the ':'
  1429.     LD    A,C        ; Get 'B' result from 'CPIR' instruction
  1430.     LD    (LENGTH),A    ; Keep for possible adjust
  1431.     EX    DE,HL        ; De points to the byte following ':'
  1432.     LD    HL,VTABLE    ; Index address table
  1433.     ADD    HL,BC        ; Add word offset
  1434.     ADD    HL,BC
  1435.     LD    A,(HL)        ; Get routine lsb
  1436.     INC    HL
  1437.     LD    H,(HL)        ; Get routine msb
  1438.     LD    L,A
  1439.     LD    BC,0        ; Set up drive/user storage
  1440.     JP    (HL)        ; Execute
  1441. ;.....
  1442. ;
  1443. ;
  1444. VTABLE:    DEFW    DRUS0        ; B=0 -     FILENAME.EXT
  1445.     DEFW    DRUS1        ; B=1 - A15:FILENAME.EXT
  1446.     DEFW    DRUS2        ; B=2 -  A1:FILENAME.EXT
  1447.     DEFW    DRUS3        ; B=3 -   A:FILENAME.EXT
  1448.     DEFW    DRUS4        ; B=4 -    :FILENAME.EXT
  1449. ;
  1450. ;
  1451. ; Format was - FILENAME.EXT
  1452. ;
  1453. DRUS0:    CALL    GETDFU        ; Get the default user
  1454.     CALL    GETDFD        ; Get the default drive
  1455.     LD    HL,(TEMPHL)    ; Get old buffer pointer back
  1456.     XOR    A        ; Zero move length
  1457.     RET            ; All done
  1458. ;.....
  1459. ;
  1460. ;
  1461. ; Format was - DUU:FILENAME.EXT
  1462. ;
  1463. DRUS1:    CALL    GETDRV        ; Get the drive parameter
  1464.     LD    A,(IX+0)
  1465.     CP    '0'
  1466.     JR    C,ERROR
  1467.     CP    '9'+1
  1468.     JR    NC,ERROR
  1469.     SUB    '0'
  1470.     LD    B,A        ; Put in drive number
  1471.     SLA    B        ; * 2
  1472.     SLA    B        ; * 4
  1473.     SLA    B        ; * 8
  1474.     ADD    A,A        ; A * 2
  1475.     ADD    A,B        ; + c
  1476.     LD    B,A
  1477.     INC    IX        ; Skip the tens digit
  1478.     JR    GETUSR        ; Get the user number
  1479. ;.....
  1480. ;
  1481. ;
  1482. ; Format was - DU:FILENAME.EXT
  1483. ;
  1484. DRUS2:    CALL    GETDRV        ; Get the drive parameter
  1485.     JR    GETUSR        ; Get the user number
  1486. ;.....
  1487. ;
  1488. ;
  1489. ; Format was - D:FILENAME.EXT
  1490. ;
  1491. DRUS3:    CALL    GETDRV        ; Get the drive parameter
  1492.     CALL    GETDFU        ; Get the default user
  1493. ;
  1494. ;
  1495. ; Format was - :FILENAME.EXT
  1496. ;
  1497. DRUS4:    JR    DRUS5
  1498. ;
  1499. GETDRV:    LD    A,(IX+0)
  1500.     CP    'A'
  1501.     JR    C,ERROR1
  1502.     CP    'Q'
  1503.     JR    NC,ERROR1
  1504.     SUB    'A'
  1505.     LD    C,A        ; Put in drive number
  1506.     INC    IX
  1507.     RET
  1508. ;.....
  1509. ;
  1510. ;
  1511. GETUSR:    LD    A,(IX+0)
  1512.     CP    '0'
  1513.     JR    C,ERROR
  1514.     CP    '9'+1
  1515.     JR    NC,ERROR
  1516.     SUB    '0'
  1517.     ADD    A,B
  1518.     LD    B,A
  1519. ;
  1520. ;
  1521. ; Adjust the byte in 'LENGTH'
  1522. ;
  1523. DRUS5:    EX    DE,HL        ; Hl points to byte following ':' if any
  1524.     LD    A,(LENGTH)    ; Get length of move
  1525.     OR    A        ; Test it
  1526.     RET    Z        ; Return if null/ clear carry
  1527.     LD    E,A
  1528.     LD    A,5
  1529.     SUB    E
  1530.     LD    (LENGTH),A
  1531.     OR    A        ; Clear any error
  1532.     RET
  1533. ;.....
  1534. ;
  1535. ;
  1536. ERROR1:    POP    DE        ; Kill return address from subroutine
  1537. ERROR:    SCF            ; Set error condition
  1538.     RET
  1539. ;.....
  1540. ;
  1541. ;
  1542. ; Get default user
  1543. ;
  1544. GETDFU:    PUSH    BC
  1545.     PUSH    DE
  1546.     PUSH    HL
  1547.     LD    C,020H
  1548.     LD    E,0FFH
  1549.     CALL    BDOS
  1550.     POP    HL
  1551.     POP    DE
  1552.     POP    BC
  1553.     LD    B,A        ; Set 'B' register to current user
  1554.     RET
  1555. ;.....
  1556. ;
  1557. ;
  1558. ; Get default drive
  1559. ;
  1560. GETDFD:    PUSH    BC
  1561.     PUSH    DE
  1562.     PUSH    HL
  1563.     LD    C,19H
  1564.     CALL    BDOS
  1565.     POP    HL
  1566.     POP    DE
  1567.     POP    BC
  1568.     LD    C,A        ; Set 'C' register to current drive
  1569.     RET
  1570. ;.....
  1571. ;
  1572. ;
  1573. ; Extract token from command line and place it into DEFFCB;
  1574. ;   format DEFFCB FCB if token resembles file name and type
  1575. ;   (FILENAME.TYP);
  1576. ;   on input, CIBPTR points to character at which to start scan
  1577. ;   on output, CIBPTR points to character at which to continue
  1578. ;   and zero flag is reset if '?' is in token
  1579. ;
  1580. ; Entry points:
  1581. ;    scaner - load token into first FCB
  1582. ;    scanr1 - load token into FCB poibted to by HL
  1583. ;
  1584. ;
  1585. SCANER:    LD    HL,DEFFCB    ; Point to DEFFCB
  1586. ;
  1587. SCANR1:    XOR    A        ; Set temporary drive number to default
  1588.     LD    (TEMPDR),A
  1589.     CALL    ADVNCE        ; Skip to non-blank or end of line
  1590.     LD    (CIPTR),DE    ; Set pointer to non-blank or end of line
  1591.     LD    A,(DE)
  1592.     OR    A
  1593.     JR    Z,SCANR2
  1594.     SBC    A,'A'-1
  1595.     LD    B,A
  1596.     INC    DE
  1597.     LD    A,(DE)
  1598.     CP    ':'
  1599.     JR    Z,SCANR3
  1600.     DEC    DE
  1601. ;
  1602. SCANR2:    LD    A,(TDRIVE)    ; Set 1st byte of deffcb as default drive
  1603.     LD    (HL),A
  1604.     JR    SCANR4
  1605. ;
  1606. SCANR3:    LD    A,B
  1607.     LD    (TEMPDR),A
  1608.     LD    (HL),B
  1609.     INC    DE
  1610. ;
  1611. SCANR4:    XOR    A        ; A=0
  1612.     LD    (QMCNT),A    ; Init count of # of question marks in FCB
  1613.     LD    B,8        ; Max of 8 characters in file name
  1614.     CALL    SCANF        ; Fill FCB file name
  1615. ;
  1616. ;
  1617. ; Extract file type from possible FILENAME.TYP
  1618. ;
  1619.     LD    B,3        ; Prepare to extract type
  1620.     CP    '.'        ; If (de) delimiter is a '.', we have a type
  1621.     JR    NZ,SCANR5    ; Fill file type bytes with <sp>
  1622.     INC    DE        ; Pt to char in command line after '.'
  1623.     CALL    SCANF        ; Fill FCB file type
  1624.     JR    SCANR6        ; Skip to next processing
  1625. ;
  1626. SCANR5:    CALL    SCANF4        ; Space fill
  1627. ;
  1628. ;
  1629. ; Fill in ex, s1, s2, and rc with zeroes
  1630. ;
  1631. SCANR6:    LD    B,4        ; 4 bytes
  1632. ;
  1633. SCANR7:    INC    HL        ; Point to next byte in DEFFCB
  1634.     LD    (HL),0
  1635.     DJNZ    SCANR7
  1636. ;
  1637. ;
  1638. ; Scan complete -- DE points to delimiter byte after token
  1639. ;
  1640.     LD    (CIBPTR),DE
  1641. ;
  1642. ;
  1643. ; Set zero flag to indicate presence of '?' in FILENAME.TYP
  1644. ;
  1645.     LD    A,(QMCNT)    ; Get number of question marks
  1646.     OR    A        ; Set zero flag to indicate any '?'
  1647.     RET
  1648. ;
  1649. ;
  1650. ;  Scan token pointed to by DE for a maximum of B bytes; place it into
  1651. ;  file name field pointed to by HL; expand and interpret wild cards of
  1652. ;  '*' and '?'; on exit, DE points to terminating delimiter
  1653. ;
  1654. SCANF:    CALL    SDELM        ; Done if delimiter encountered - <sp> fill
  1655.     JR    Z,SCANF4
  1656.     INC    HL        ; Pt to next byte in deffcb
  1657.     CP    '*'        ; Is (de) a wild card?
  1658.     JR    NZ,SCANF1    ; Continue if not
  1659.     LD    (HL),'?'    ; Place '?' in deffcb and dont advance de if so
  1660.     CALL    SCQ        ; Scanner count question marks
  1661.     JR    SCANF2
  1662. ;
  1663. SCANF1:    LD    (HL),A        ; Store filename char in deffcb
  1664.     INC    DE        ; Pt to next char in command line
  1665.     CP    '?'        ; Check for question mark (wild)
  1666.     CALL    Z,SCQ        ; Scanner count question marks
  1667. ;
  1668. SCANF2:    DJNZ    SCANF        ; Decrement char count until 8 elapsed
  1669. ;
  1670. SCANF3:    CALL    SDELM        ; 8 chars or more - skip until delimiter
  1671.     RET    Z        ; Zero flag set if delimiter found
  1672.     INC    DE        ; Pt to next char in command line
  1673.     JR    SCANF3
  1674. ;
  1675. ;
  1676. ; Fill memory pointed to by HL with spaces for B bytes
  1677. ;
  1678. SCANF4:    INC    HL        ; Pt to next byte in deffcb
  1679.     LD    (HL),' '    ; Fill filename part with <sp>
  1680.     DJNZ    SCANF4
  1681.     RET
  1682. ;.....
  1683. ;
  1684. ;
  1685. ; Increment question mark count for scanner - this routine increments
  1686. ; the count of the number of question marks in the current FCB entry
  1687. ;
  1688. SCQ:    LD    A,(QMCNT)    ; Get count
  1689.     INC    A        ; Increment
  1690.     LD    (QMCNT),A    ; Put count
  1691.     RET
  1692. ;.....
  1693. ;
  1694. ;
  1695. ; Check to see if DE points to delimiter; if so, return with zero flag
  1696. ; set.
  1697. ;
  1698. SDELM:    LD    A,(DE)
  1699.     OR    A        ; 0=delimiter
  1700.     RET    Z
  1701.     CP    ' '        ; Error if < <sp>
  1702.     RET    Z        ; <sp>=delimiter
  1703.     CP    '='        ; '='=delimiter
  1704.     RET    Z
  1705.     CP    5FH        ; Underscore=delimiter
  1706.     RET    Z
  1707.     CP    '.'        ; '.'=delimiter
  1708.     RET    Z
  1709.     CP    ':'        ; ':'=delimiter
  1710.     RET    Z
  1711.     CP    ';'        ; ';'=delimiter
  1712.     RET    Z
  1713.     CP    '<'        ; '<'=delimiter
  1714.     RET    Z
  1715.     CP    '>'        ; '>'=delimiter
  1716.     RET
  1717. ;.....
  1718. ;
  1719. ;
  1720. ; Advance input pointr to first non-blank and fall through to SBLANK
  1721. ;
  1722. ADVNCE:    LD    (CIBPTR),DE
  1723. ;
  1724. ; Skip string pointed to by DE (string ends in 0) until end of string
  1725. ; or non-blank encountered (beginning of token)
  1726. ;
  1727. SBLANK:    LD    A,(DE)
  1728.     OR    A
  1729.     RET    Z
  1730.     CP    ' '
  1731.     RET    NZ
  1732.     INC    DE
  1733.     JR    SBLANK
  1734. ;.....
  1735. ;
  1736. ;
  1737. ; Capitalize string (ending in 0) in cmdlin and set pointr for parsing
  1738. ;
  1739. CNVBUF:    LD    HL,CMDLIN+1    ; Point to users command
  1740.     LD    B,(HL)        ; Character count in 'B'
  1741.     INC    B        ; Add 1 in case of zero
  1742. ;
  1743. CNVBF1:    INC    HL        ; Point to 1st valid character
  1744.     LD    A,(HL)        ; Capitalize command character
  1745.     CALL    UCASE
  1746.     LD    (HL),A
  1747.     DJNZ    CNVBF1        ; Continue to end of command line
  1748. ;
  1749. CNVBF2:    LD    (HL),0        ; Store ending <null>
  1750.     LD    HL,CMDLIN+2    ; Set command line pointer to 1st char
  1751.     LD    (CIBPTR),HL
  1752.     RET
  1753. ;.....
  1754. ;
  1755. ;
  1756. ; Convert character in 'A' to upper case
  1757. ;
  1758. UCASE:    CP    61H        ; Lower-case a
  1759.     RET    C
  1760.     CP    7BH        ; Greater than lower-case z?
  1761.     RET    NC
  1762.     AND    5FH        ; Capitalize
  1763.     RET
  1764. ;.....
  1765. ;
  1766. ;
  1767. GETOLD:    CALL    GETDFU        ; Get current user into 'B'
  1768.     CALL    GETDFD        ; Get current drive into 'C'
  1769.     LD    (OLDDRV),BC    ; Get the parameters
  1770.     RET
  1771. ;.....
  1772. ;
  1773. ;
  1774. SETTMP:    LD    BC,(TMPDRV)
  1775.     JR    RESET
  1776. ;.....
  1777. ;
  1778. ;
  1779. SETOLD:    LD    BC,(OLDDRV)
  1780.     JR    RESET
  1781. ;.....
  1782. ;
  1783. ;
  1784. SETNEW:    LD    BC,(RQDDRV)    ; Get the old drive number
  1785.     JR    RESET
  1786. ;.....
  1787. ;
  1788. ;
  1789. SETCOM:    LD    BC,(COMDRV)    ; Get the old drive number
  1790. ;
  1791. RESET:    PUSH    BC        ; Save drive/user
  1792.     PUSH    BC
  1793.     LD    E,C        ; Get selected drive
  1794.     LD    C,14        ; Bdos function
  1795.     CALL    BDOS
  1796.     POP    BC        ; Restore drive/user
  1797.     LD    E,B        ; Get selected user
  1798.     LD    C,32        ; Bdis set user function
  1799.     CALL    BDOS
  1800. ;
  1801. ;
  1802. ; Set up byte at 0004h - some programs may look at it
  1803. ;
  1804.     POP    BC
  1805.     LD    A,B        ; Get user number
  1806.     RLA
  1807.     RLA
  1808.     RLA
  1809.     RLA
  1810.     AND    0F0H
  1811.     OR    C
  1812.     LD    (4),A
  1813.     RET
  1814. ;
  1815. DVUPR1:    LD    A,(TMPUSR)
  1816.     PUSH    AF
  1817.     LD    A,(TMPDRV)
  1818.     JR    DVUPR3
  1819. ;
  1820. DVUPRT:    LD    A,(RQDUSR)    ; Get requested drive
  1821.     PUSH    AF
  1822.     LD    A,(RQDDRV)    ; Get the requested user
  1823. ;
  1824. DVUPR3:    ADD    A,'A'
  1825.     CALL    CTYPE        ; Print the drive 'A'-'P'
  1826.     POP    AF
  1827.     CP    10        ; Less that 10?
  1828.     JR    C,DVUPR2    ; Yes - dont print the '1'
  1829.     PUSH    AF
  1830.     LD    A,'1'
  1831.     CALL    CTYPE
  1832.     POP    AF
  1833.     SUB    10
  1834. ;
  1835. DVUPR2:    ADD    A,'0'
  1836.     CALL    CTYPE
  1837.     LD    A,':'
  1838.     JP    CTYPE
  1839. ;.....
  1840. ;
  1841. ;
  1842.      IF    RCPM
  1843. SUBFCB:    DEFB    0        ; Use current drive
  1844.     DEFB    '$$$     SUB'
  1845.     DEFB    0,0,0,0,0,0,0,0    ; Rest of the FCB
  1846.     DEFB    0,0,0,0,0,0,0,0    ;
  1847.     DEFB    0,0,0,0,0
  1848.     DEFB    0,0,0,0        ; RFU
  1849. ;
  1850. ;
  1851. ; Edit this to contain the console commands necessary to execute the
  1852. ; logoff sequence for your system.
  1853. ;
  1854. BYECMD:    DEFB    0        ; <====== do not touch
  1855.     DEFB    'BYE',CR,LF    ; <====== put any number of cmds here
  1856.     DEFB    'Z'-40H        ; <====== do not touch
  1857. ;
  1858. BYELEN    EQU    $-BYECMD-1
  1859.      ENDIF            ; RCPM
  1860. ;
  1861. ;
  1862. ARCFLG:    DEFB    0
  1863. DOADIR:    DEFB    0
  1864. HLPCNT:    DEFB    0
  1865. BIOS3:    DEFW    0
  1866. TEMPDR:    DEFB    0
  1867. CIPTR:    DEFW    0
  1868. TDRIVE:    DEFB    0
  1869. QMCNT:    DEFB    0
  1870. CIBPTR:    DEFW    0
  1871. TEMPHL:    DEFW    0
  1872. LENGTH:    DEFB    0
  1873. OLDDRV:    DEFB    0
  1874. OLDUSR:    DEFB    0
  1875. RQDDRV:    DEFB    0        ; Requested drive
  1876. RQDUSR:    DEFB    0        ; Requested user
  1877. COMDRV:    DEFB    0        ; Drive to load .COM file
  1878. COMUSR:    DEFB    0        ; User to load .COM file
  1879. TMPDRV:    DEFB    0        ; Temporary drive number
  1880. TMPUSR:    DEFB    0        ; Temporary user number
  1881. ACTIVE:    DEFB    0        ; Attach command mode active
  1882. NXTWRD:    DEFW    0
  1883.     DEFW    0
  1884. CMDLIN:    DEFB    79
  1885. CMDLEN:    DEFB    0
  1886.     DEFS    79
  1887.     DEFB    0
  1888. ;
  1889. MEMBER:    DEFB    '            '
  1890.     DEFB    0
  1891.     DEFB    0
  1892. LBRNAM:    DEFB    '        '    ; Library file name
  1893.     DEFB    'LBR'
  1894. ;
  1895. TMPFCB:    DEFS    36
  1896. DEFFCB:    DEFS    36
  1897. ;
  1898.     DEFS    80        ; Area for stack
  1899. ;
  1900. STACK    EQU    $
  1901. ;
  1902. ;
  1903.     END
  1904.