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 / LUX80.ARK / LUX80.MAC < prev    next >
Text File  |  1987-03-04  |  59KB  |  2,107 lines

  1. ;
  2. ; LUX v8.0 - 03/04/87 {tmb}
  3. ;
  4. ; LUX enables you to "enter" .LBR, .ARK and .ARC files to view, transfer
  5. ; and otherwise manipulate their individual file members.
  6. ;
  7. ;    LUX Version 1.2B was Copyright 1983 by Steven R. Holtzclaw
  8. ;    and entered into the public domain.
  9. ;
  10. ; 03/04/87  Unfortunately for all of us, Irv Hoff now considers LUX to
  11. ;   v8.0    be "his" -- where he gets the idea that LUX5x is a series
  12. ;        unto itself, much less that I claim it as my own, is beyond
  13. ;        my comprehension.  LUX is a terrific public domain utility,
  14. ;        which has grown in quality as a result of various people's
  15. ;        contributions.  In an effort to keep LUX free of Irv Hoff's
  16. ;        attempts to claim ownership of yet another fine public domain
  17. ;        work (not to mention ignoring the LUX v5.4 I released, which
  18. ;        predated his v7.0 release by a month), I will continue to
  19. ;        return all the features/code which he decided none of us want
  20. ;        or need.  I also did nothing so feeble/petty as renaming v5.4
  21. ;        to v7.5 to prevent him from "contributing to the development"
  22. ;        of this utility -- I merely added the abort support which he
  23. ;        had put into v7.0 and made an appropriate note to this effect.
  24. ;        His actions are clear and are not a "contribution" to the
  25. ;        majority of us who believe CP/M public domain exists for all
  26. ;        to enjoy and benefit from.    I leave Irv's comments below,
  27. ;        although, as he states, v7.7 is nothing more than v7.0 renamed.
  28. ;        Irv, if you want to grab onto yet another public domain work
  29. ;        and claim it as your own, I suggest that you give it a different
  30. ;        name and "contribute to its development" as you see fit.
  31. ;        Otherwise, follow the proper update tradition and leave code/mods
  32. ;        and comments in as contributors intend and as the majority of
  33. ;        users/sysops want.
  34. ;
  35. ;        The code which was in my release v5.4 already supported MBKMD,
  36. ;        so only the addition of an MBKMD equate was required, along with
  37. ;        MBKMD being added to NUKMD conditionals.  Irv's v7.0 assumes
  38. ;        those who run NUKMD/MBKMD force their users to learn yet another
  39. ;        command - wrong -- the "KMD" command option is adopted as a
  40. ;        fairly "universal" user command, so a bunch of duplicated code
  41. ;        is not required as is found in v7.0/7.7....  Most of us try to
  42. ;        make life easier for the user and have their file transfer
  43. ;        program (whatever it may be) online as KMD.COM and XMODEM.COM.
  44. ;
  45. ;        Have added a couple of RCP/M equate options (Gary Inman is
  46. ;        using similar features and suggested some of these) - will
  47. ;        display on menu, only if set YES (and then some by WHEEL state):
  48. ;
  49. ;        CHATOK for those who allow online CHAT attempts - you provide
  50. ;          your own CHAT program.
  51. ;        NOTEOK for those who allow NOTE to be left to sysop - you provide
  52. ;          your own NOTE program - if you CHAT program already has this
  53. ;          feature built-in, set NOTEOK to NO.
  54. ;        SZAPOK for those who want optional WHEEL access to the John
  55. ;          Hastwell-Batten utility, SuperZAP -- v3.3 is included.  If you
  56. ;          prefer a different disk-editor, set this equate YES and rename
  57. ;          yours to ZAP.COM for LUX to find.
  58. ;        NSWPOK for those who wish to have WHEEL access to Dave Rand's
  59. ;          NSWEEP utility -- v2.07 is included.
  60. ;
  61. ;        Simplified setting drive areas for various files -- just
  62. ;        enter the letter of each drive as required for LUX to find
  63. ;        each utility.
  64. ;         {tmb}
  65. ;
  66. ; 03/01/78  NOTICE TO TOM BRADY:  LEAVE YOUR FINGERS OFF THIS PROGRAM.
  67. ;   v77     IF YOU WANT TO CONTINUE MUCKING WITH LUX, SUGGEST YOU USE
  68. ;        THE NUMBER LUX55 TO FOLLOW YOUR OWN LUX54.    I INTENTIONALLY
  69. ;        SKIPPED TO LUX70 SO AS TO NOT PROHIBIT YOU FROM DOING JUST
  70. ;        THAT, BUT WILL NOT TOLERATE YOUR USING THIS SERIES IN AN
  71. ;        OBVIOUS ATTEMPT TO PREVENT ME FROM CONTRIBUTING TO THE DE-
  72. ;        VELOPMENT OF THIS PROGRAM.
  73. ;
  74. ;        Restored LUX v77 to the original intent of the LUX 7x ver-
  75. ;        sion.  I had already skipped to LUX70 to not place Tom Brady
  76. ;        in a position where he could not continue working with his
  77. ;        LUX54, calling any subsequent version LUX55.  Instead he
  78. ;        elected to try to totally obliterate any work I had put into
  79. ;        this program.  I will not allow that to occur.  Many people
  80. ;        prefer my version to his, since it can be installed on any
  81. ;        RCPM as fast as you can extract the files from the libaray.
  82. ;
  83. ;        (Tom Brady totally replaced everything in the LUX70A version
  84. ;        including all auxiliary programs in the library with his own
  85. ;        LUX54 version.  He further decided to jump to LUX75.  This
  86. ;        was done in an obvious attempt to force people to use only
  87. ;        his version.)
  88. ;                    - Irv Hoff
  89. ;
  90. ; 03/01/87  Removed excessive code incorporated by {nlb} and {kdj} in
  91. ;  v7.5     .ARK/.ARC file check routines and replaced with simple loop
  92. ;        routines.
  93. ;
  94. ;        This returns the fine LUX RCP/M utility to its former
  95. ;        "pre-Irv Hoff" quality, including WHEEL and MAX D/U
  96. ;        checking.  Also returned is the perfectly fine LUXCRC,
  97. ;        LUXCHK and LUXDIR files -- .MAC (source) and .COM files.
  98. ;        Every time Irv Hoff decides to put his fingers into things
  99. ;        another twist of the knife speeds along the agonizing death
  100. ;        of the public domain CP/M world and I'm sick and tired of
  101. ;        this crap.    I like LUXDIR's simple handling of listing the
  102. ;        .LBR's internal file members -- SD (and those similar) are
  103. ;        far too busy and are best used by LUX when listing other
  104. ;        .LBR/.ARK/.ARC files on the drive/user areas.  LT18 is also
  105. ;        returned, as is the UNARC overlay for easy customization.
  106. ;
  107. ;        Irv Hoff may well have been "testing" his own personal LUX
  108. ;        version on various of his friend's systems, but I worked
  109. ;        extensively on release v5.4 and released same before he decided
  110. ;        the world was ready for "his" blessed release.  So, as I have
  111. ;        come to expect from those quarters, all historical update notes
  112. ;        from my v5.4 release were conveniently missing from "his" v7.0
  113. ;        release.  As far as his comments about NUKMD regularly
  114. ;        adopting features found in KMD, *bull* -- the *only* feature
  115. ;        adopted from KMD since I broke away from my work on KMD (way
  116. ;        back in KMD v1.5E) has been the .ARK/.ARC member extraction
  117. ;        support -- NOTHING ELSE.  Lies are easily spread and just as
  118. ;        easily believed, but the record is quite clear.
  119. ;
  120. ;        Irv claimed v7.0 was a "radical departure" -- yes, he removed
  121. ;        much useful code, removed source files of useful LUX utilities
  122. ;        and added his magic touch to what has always been a fine RCP/M
  123. ;        utility.  However, a major update it was not, nor does that
  124. ;        give him the right to jump from v5.x to v7.x at a whim.  What
  125. ;        was actually added/modified is acredited in the history notes
  126. ;        below - my v5.4 already had many updates which he claimed as
  127. ;        his own with v7.0 release almost a month later.   [tmb]
  128. ;
  129. ; 02/22/87  Removed "EQU $" at START {it's back - tmb}.  Added support for
  130. ;  v7.0     abort from LUX with ^X and ^K.        Irv Hoff
  131. ;
  132. ; 02/10/87  Modified to use command "DU" to get directory of
  133. ;  v5.41    a different drive/user than now in, no need to leave
  134. ;        LUX to see what's on another drive.  Just "DU", then
  135. ;        LUX to the next drive/file.  Also, fixed so you may now
  136. ;        move from an .ARK to an .ARC (or vice versa) from within
  137. ;        LUX. [kdj]
  138. ;
  139. ; 02/01/87  Modified to support NUKMD (v1.10 & later), which uses
  140. ;  v5.4     "L" for .LBR and "A" for .ARK/.ARC member extractions.
  141. ;        Set NUKMD or KMD to YES, depending on which you use.
  142. ;        There are many MS-DOS .ARC files which are required to
  143. ;        be passed on intact -- for those of you who wish to
  144. ;        honor this tradition, set EXTARC to NO and users will
  145. ;        be able to manipulate .ARC member files in every way but
  146. ;        will not be able to download them (does not effect .LBR
  147. ;        member extractions).  Removed the unecessary code which
  148. ;        told you NULU was unavailable in .ARC files -- this menu
  149. ;        option is only shown when in .LBR files.  Also, eliminated
  150. ;        the unecessary code which told you that CHEK and CRCK were
  151. ;        unavailable in .ARC files -- just defaulted to UNARC.  When
  152. ;        in .LBR files, added support to also get a directory listing
  153. ;        of .ARK/.ARC files (i.e. AFILES) -- when in .ARK/.ARC files,
  154. ;        you may also get a directory listing of .LBR files (LFILES).
  155. ;        The FILES command will display a directory of files which
  156. ;        match the currently open file type, as always. Restored
  157. ;        operation of BYE from within LUX.  Removed LUXTYP22 from
  158. ;        distribution file -- this is an antiquated utility, which
  159. ;        I have replaced with the excellent LT utility.  LT will
  160. ;        display ASCII, squeezed and crunched files -- also accepts
  161. ;        wildcards.     [tmb]
  162. ;
  163. ; 06-27-86  Modified for .ARC file support, using UNARCxx for dir
  164. ;  v5.2     and Type commands....fully automatic determination of
  165. ;        ARC or LBR file extents, (ext not necessary)  Supports
  166. ;        Arc member transfer...    [nlb]
  167. ;
  168. ; 08-26-85  Modified for KMD support throughout.  Other cosmetic
  169. ;  v5.1k    changes.  KMD04 (and up) offers total automatic protocol
  170. ;        detect, as well as YAM-mode batch transfers (NOT supported
  171. ;        in LUX, though). - [tmb]
  172. ;
  173. ; 07-21-85  Added new XMODEM SK and SENDK options for new 1k packet
  174. ; v5.0        protocol used by MEX114 and XMODEM110.  - [sls]
  175. ;
  176. ; 11-29-84  Added a NOGOT routine for CHAT, NEW, and TIME commands
  177. ; v4.4        to tell user to exit LUX to use the above mentioned
  178. ;        commands.  Also added OFF, QUIT, and /OFF synonyms for
  179. ;        the BYE command.
  180. ;
  181. ; NOTE:  This is a special version for use with XMODEM.COM called
  182. ;     LUXMODEM.COM (modified XMDM105). - [sls]
  183. ;
  184. ; 11-09-84  Changed LUX commands, removed CHAT & TIME for internal
  185. ;  v4.3     reasons.  Also removed NEW command. - [sls]
  186. ;
  187. ; 10-07-84  Changed extended command mode to be useable with NULU10
  188. ;  v4.2     instead of LU300's command structure.  NULU is re-entrant
  189. ;        and only needs to be loaded into memory for use.
  190. ;        The extended commands are now "-L" to load NULU into the
  191. ;        command mode and list the directory, or "-F" which loads
  192. ;        NULU into the filesweep mode.  From either mode, NULU is
  193. ;        left in command mode until terminated. - [sls]
  194. ;
  195. ; 09-12-84  Added HARDCD equate for those of us supporting ZCPRs wheel
  196. ;  v4.1     but not using the maxdrv/maxusr values poked by ZCPR.
  197. ;        Also added RCPM functions for TIME (TOS) and NEW (WHATSNEW)
  198. ;        modules (impliment them as desired.)  Also added CMDJMP
  199. ;        equates for D and SD commands to work the same as DIR.
  200. ;        Changed internal error-handling to point out command
  201. ;        in error. - [sls]
  202. ;
  203. ; 09-07-84  Added auto-directory logic, added BYE function, with vector
  204. ;  v4.0     accessible from external program to force the removal of LUX.
  205. ;        Removed system-specific and trivial textual code.
  206. ;        Condensed revision info for quick reading. - [ mah ]
  207. ;
  208. ;
  209. ; [ srh ] - Steve R. Holtzclaw
  210. ; [ mah ] - Mark A. Howard    CNY TECHNICAL RCP/M     (315) 437-4890
  211. ; [ sls ] - Steve L. Sanders    DATA COM NETWORK SYSTEMS (813) 937-3608
  212. ; [ tmb ] - Tom M. Brady    DECIBEL PBBS         (404) 288-6858
  213. ; [ nlb ] - Norman L. Beeler    ZeeMachine RBBS -RAS     (408) 245-1420
  214. ;                Multi-User/Line      (408) 735-0176
  215. ; [ kdj ] - Kim D. Johnson    Midwest Sysop Board     (612) 824-7550
  216. ;
  217. ; 11/26/83  Original release.  Adapted from ATTACH program. - [ srh ]
  218. ;
  219. ; -----
  220. ;
  221.     .Z80
  222. ;
  223. NO    EQU    0
  224. YES    EQU    NOT NO
  225. ;
  226. ;
  227. ; ==========================
  228. ; USER CONFIGURATION EQUATES
  229. ; ==========================
  230. ;
  231. AUTODR    EQU    yes        ; YES, if auto-dir wanted when LUX is
  232.                 ;    first attached to a LBR file
  233. BELL    EQU    7        ; Set to 20H for silence, or 7 for bells...
  234. HLPERS    EQU    2        ; Give auto-help after this many errors
  235. HLPMSG    EQU    yes        ; YES, if helpful messages are wanted
  236. ;
  237. ; Note: If RCPM is YES and your logoff program is NOT online as
  238. ;    BYE.COM, edit at label BYECMD: (near end of file) as necessary.
  239. ;
  240. RCPM    EQU    yes        ; YES, if being used with a RCP/M system
  241. ;
  242. ; Note: If RCPM is YES, the following options are available.  SZAPOK and
  243. ;    NSWPOK are only available when WHEEL is on.
  244. ;
  245. BYEOK    EQU    yes        ; YES, exit system from within LUX
  246. CHATOK    EQU    yes        ; YES, if CHAT is available
  247. NOTEOK    EQU    yes        ; YES, if NOTE is available
  248. SZAPOK    EQU    yes        ; YES, if SuperZAP or similar is available
  249. NSWPOK    EQU    yes        ; YES, if NSWEEP is available
  250. NULUOK    EQU    yes        ; YES, if you want to use NULU or similar
  251. ;
  252. ; NUKMD and MBKMD differentiates between the "L" option (.LBR member
  253. ; extractions) and the "A" option (.ARK/.ARC member extractions), while
  254. ; KMD does not.
  255. ;
  256. NUKMD    EQU    yes        ; YES, if using NUKMD (v1.10 or higher)
  257. MBKMD    EQU    no        ; YES, if using MBKMD
  258. KMD    EQU    no        ; YES, if using KMD
  259. ;
  260. ; If you want users to use LUX to "enter" .ARK/.ARC files, but do not want
  261. ; to allow them to extract any individual members, set EXTARC to NO.
  262. ;
  263. EXTARC    EQU    yes        ; YES, if allowing .ARK/.ARC extractions
  264. ;
  265. ; ---
  266. ;
  267. ; The following equates define the drive/user area where each required
  268. ; .COM utility is to be found by LUX (i.e. TYPE, DIR, UNARC, LUXDIR,
  269. ; LUXCHK, LUXCRC, NUKMD, MBKMD, KMD, CHAT, NOTE, NSWEEP, ZAP and NULU).
  270. ;
  271. ; Note: DIR.COM is used for "DIR *.LBR" and "DIR *.AR?" displays, so
  272. ;       can be most any kind.  It is also used to provide support of
  273. ;       the DU command which will allow full DIR command options as if
  274. ;       outside of LUX.
  275. ;    LUXDIR.COM is called by LUX to actually display an internal
  276. ;       DIRectory listing of .LBR files.
  277. ;    LUXCRC/CHK provides crc/checksum of file members.
  278. ;    NUKMD/MBKMD/KMD provide file transfer support.
  279. ;    TYPE.COM is LTxx, which displays normal ASCII, squeezed and
  280. ;       crunched files -- also accepts wild cards.
  281. ;    UNARC.COM is used for all .ARK/.ARC file manipulations.
  282. ;    CHAT.COM is supplied by you for online CHAT in LUX.
  283. ;    NOTE.COM is supplied by you (not needed if CHAT has NOTE feature).
  284. ;    NULU.COM is NULU151 or higher for .LBR member manipulations (WHEEL).
  285. ;    ZAP.COM is SUPZAP33 or higher (a disk editor - WHEEL).
  286. ;    SWEEP.COM is NSWP207 or higher (general file maintenance - WHEEL).
  287. ;
  288. ; Place required drive letter between the quotations as shown.
  289. ;
  290. TYPDRV    EQU    'A'    ; drive for TYPE.COM
  291. TYPUSR    EQU    0    ;   and user number
  292. DIRDRV    EQU    'A'    ; drive for DIR.COM and UNARC.COM
  293. DIRUSR    EQU    0    ;   and user number
  294. CHTDRV    EQU    'A'    ; drive for CHAT.COM
  295. CHTUSR    EQU    0    ;   and user number
  296. NOTDRV    EQU    'A'    ; drive for NOTE.COM
  297. NOTUSR    EQU    0    ;   and user number
  298. ;
  299. LDIRDR    EQU    'B'    ; drive for LUXDIR.COM
  300. LDIRUS    EQU    15    ;   and user number
  301. ;
  302. CHKDRV    EQU    'B'    ; drive for LUXCHK
  303. CHKUSR    EQU    15    ;   and user number
  304. CRCDRV    EQU    'B'    ; drive for LUXCRC
  305. CRCUSR    EQU    15    ;   and user number
  306. ;
  307. XFRDRV    EQU    'A'    ; drive for NUKMD/MBKMD/KMD
  308. XFRUSR    EQU    0    ;   and user number
  309. ;
  310. ; -----
  311. ;
  312. ZCPR    EQU    yes        ; YES, if using nzcpr/zcmd/zcpr2/zcpr3
  313. ZPRDRV    EQU    3DH        ; zcpr max drive location
  314. ZPRUSR    EQU    3FH        ; zcpr max user location
  315. WHEEL    EQU    3EH        ; zcpr wheel byte location
  316. ;
  317. ; Note: If ZCPR is YES, the following are only available (and extended
  318. ;    command options will be shown in help menu) when WHEEL byte
  319. ;    is ON.    If ZCPR is NO and any of these are YES, they will be
  320. ;    available to everyone...
  321. ;
  322. ; Place required drive letter between the quotations as shown.
  323. ;
  324. LUDRV    EQU    'A'        ; drive for NULU
  325. LUUSR    EQU    15        ;   and user number
  326. ZAPDRV    EQU    'A'        ; drive for SuperZAP
  327. ZAPUSR    EQU    15        ;   and user number
  328. NSWDRV    EQU    'A'        ; drive for NSWEEP
  329. NSWUSR    EQU    15        ;   and user number
  330. ;
  331. ; If running MBBS, PBBS or similar message base which sets a user's
  332. ; maximum accessible drive/user area, leave HARDCD set NO.  If your
  333. ; message base does not do this, set HARDCD to YES which forces LUX
  334. ; to follow the HARD CODED choice...
  335. ;
  336. HARDCD    EQU    no        ; YES, use hard coded max values instead of
  337.                 ;   BYE's maximum drive/user settings.
  338.     IF    HARDCD
  339. MAXDRV    EQU    3        ; Max drive (0-15) 0=A, 1=B, etc...
  340. MAXUSR    EQU    5        ; Max user area (0-31)
  341.     ENDIF
  342. ;
  343. ; end of user configurable EQUates
  344. ;
  345. ; -----
  346. ;
  347. VERS    EQU    80        ; version number
  348. MODLVL    EQU    ' '        ; modification level
  349. BDOS    EQU    5
  350. TPA    EQU    100H        ; cpm program area
  351. FCB1    EQU    5CH        ; first file control block
  352. FCB2    EQU    6CH        ; second file control block
  353. REBOOT    EQU    0        ;
  354. CBUFF    EQU    80H        ; default command buffer
  355. ;
  356. ; Macros used
  357. ;
  358. DRVUSR    MACRO    DRIVNO,USERNO,FNCNAM,RTN1,RTN2,RTN3,RTN4
  359.     CALL    FILTYP
  360.     DEFB    DRIVNO+'A'
  361. USERN1    DEFL    USERNO
  362.      IF    USERN1 GT 9
  363.     DEFB    (USERN1    /10)+'0'
  364.     USERN1    DEFL USERN1-10
  365.      ENDIF
  366.     DEFB    USERN1+'0'
  367.     DEFB    ':'
  368.     DEFB    FNCNAM
  369.     DEFB    0
  370.      IF    NOT NUL    RTN1
  371.     CALL    RTN1
  372.      ENDIF
  373.      IF    NOT NUL    RTN2
  374.     CALL    RTN2
  375.      ENDIF
  376.      IF    NOT NUL    RTN3
  377.     CALL    RTN3
  378.      ENDIF
  379.      IF    NOT NUL    RTN4
  380.     CALL    RTN4
  381.      ENDIF
  382.     JP    PROCES
  383.      ENDM
  384. ;
  385. DVUS    MACRO    DRIVNO,USERNO,FNCNAM,RTN1,RTN2,RTN3,RTN4
  386.     CALL    FILTYP
  387.     DEFB    DRIVNO+'A'
  388. USERN2    DEFL    USERNO
  389.      IF    USERN2 GT 9
  390.     DEFB    (USERN2    /10)+'0'
  391.     USERN2    DEFL USERN2-10
  392.      ENDIF
  393.     DEFB    USERN2+'0'
  394.     DEFB    ':'
  395.     DEFB    FNCNAM
  396.     DEFB    0
  397.      ENDM
  398. ;
  399. CMDJMP    MACRO    VERB,VECTOR
  400.     CALL    ILCMP
  401.     DEFB    VERB
  402.     DEFB    0
  403.     JP    NC,VECTOR
  404.      ENDM
  405. ;
  406. START    EQU    $
  407.     LD    SP,SSTACK    ; starting stack
  408.     CALL    ILPRT
  409.     DEFB    13,10,'LUX v',(VERS/10)+'0','.'
  410.     DEFB    (VERS MOD 10)+'0',MODLVL
  411.     DEFB    ' 03/04/87  [tmb]',13,10,0
  412. ;
  413. ; set up max drive/user
  414. ;
  415.      IF    HARDCD        ; if HARDCD true, use spec'd values
  416.     LD    A,MAXDRV    ; hard coded max drive
  417.     LD    (DRVMAX),A
  418.     LD    A,MAXUSR    ; hard coded max user
  419.     LD    (USRMAX),A
  420. ;
  421.      ELSE
  422. ;
  423.     LD    A,(ZPRDRV)    ; if not HARDCD, use ZCPR maximums
  424.     LD    (DRVMAX),A    ; max drive
  425.     LD    A,(ZPRUSR)    ; max user
  426.     DEC    A
  427.     LD    (USRMAX),A
  428.      ENDIF
  429. ;
  430. ; check for a blank or null command line
  431. ;
  432.     LD    A,(CBUFF+1)    ; get byte from default command buffer
  433.     OR    A        ; if non-zero then there is a possible
  434.     JP    NZ,GTDVUS    ;    file specified
  435. ;
  436. SPCERR:    CALL    ILPRT        ; print the error message
  437.     DEFB    13,10
  438.     DEFB    '++ Examples of valid LUX commands ++',13,10
  439.     DEFB    '      (Extension is optional)',13,10,10
  440.     DEFB    '   LUX filename     <- Attach to FILENAME'
  441.     DEFB    ' on current drive/user',13,10
  442.     DEFB    '   LUX A4:filename  <- Attach to FILENAME'
  443.     DEFB    ' on drive A:- USER 4',13,10
  444.     DEFB    '   LUX B1:filename  <- Attach to FILENAME'
  445.     DEFB    ' on drive B:- USER 1',13,10,10
  446.     DEFB    ' Note:  FILENAME must be a .LBR/.ARK/.ARC file',13,10
  447.     DEFB    0
  448.  
  449.     JP    REBOOT        ; reboot since we have destroyed the ccp
  450. ;
  451. BDDRUS:    CALL    ILPRT
  452.     DEFB    13,10
  453.     DEFB    '++ Invalid drive/user area ++',BELL,13,10,0
  454.     JP    SPCERR
  455. ;
  456. ;
  457. GTDVUS:    LD    HL,CBUFF+2    ; index default key buffer
  458.     CALL    DRUSR        ; get requested drive/user
  459.     JP    C,SPCERR
  460. ;
  461. ; test for drive/user within range
  462. ;
  463.     PUSH    BC        ; save drive/user spec
  464.     PUSH    HL        ; save command line pointer
  465.     LD    A,(DRVMAX)    ; get max drive
  466.     CP    C
  467.     JP    C,BDDRUS
  468.     LD    A,(USRMAX)
  469.     CP    B
  470.     JP    C,BDDRUS
  471.     POP    HL
  472.     POP    BC
  473.     LD    (RQDDRV),BC    ; set the requested drive/user
  474.     EX    DE,HL        ; de is source address to create new fcb
  475.     LD    HL,FCB1        ; index fcb
  476.     CALL    SCANR1        ; create the new fcb
  477. ;
  478. ; force the default file type
  479. ;
  480.     LD    HL,'BL'        ; set 'LB' into first two bytes of file type
  481.     LD    (FCB1+9),HL
  482.     LD    A,'R'        ; set 'R' into last byte of file type
  483.     LD    (FCB1+11),A
  484. ;
  485. ; get the library name from the fcb and store it
  486. ;
  487.     LD    HL,FCB1        ; source for move
  488.     LD    DE,LBRNAM-1    ; destination for move
  489.     LD    BC,9        ; max 8 character filename
  490.     LDIR            ; move to local name
  491. ;
  492. AMBTST:    LD    HL,FCB1+1    ; first byte of filename
  493.     LD    A,'?'        ; character to look for
  494.     LD    BC,11        ; search thru 11 bytes
  495.     CPIR            ; do search
  496.     JR    NZ,LOOKUP    ; no ? found - continue
  497. ;
  498. NOAMBG:    CALL    ILPRT        ; print the error message
  499.     DEFB    13,10
  500.     DEFB    '++ Ambiguous filename not allowed ++',BELL,13,10,0
  501.     JP    SPCERR
  502. ;
  503. ; look for the filename on directory
  504. ;
  505. LOOKUP:    CALL    GETOLD        ; get the current drive/user
  506.     CALL    SETNEW        ; set requested drive/user
  507.     LD    DE,80H        ; default dma address
  508.     LD    C,26
  509.     CALL    BDOS        ; set the dma address
  510. ;
  511. LKUP00:    LD    DE,FCB1        ; index filename specified
  512.     LD    C,17
  513.     CALL    BDOS        ; search for first
  514.     INC    A        ; does file exist?
  515.     JP    NZ,LKUP1    ; yes, skip rest
  516.     LD    A,(TRYCHR)
  517.     CP    'C'        ; done with arc?
  518.     JP    Z,LKUP01    ; yes, skip next
  519.     CP    'K'        ; tried both already?
  520.     JP    Z,NOFILE    ; yes, report
  521.     LD    HL,'RA'        ; check for arc file
  522.     LD    (FCB1+9),HL
  523.     LD    A,'C'
  524.     LD    (FCB1+11),A
  525.     LD    (TRYCHR),A
  526.     JP    LKUP00        ; loop back for test
  527. ;
  528. LKUP01:    LD    A,'K'        ; force .arK
  529.     LD    (FCB1+11),A
  530.     LD    (TRYCHR),A
  531.     JP    LKUP00        ; loop back for test
  532. ;
  533. LKUP1:    LD    A,(TRYCHR)
  534.     OR    A        ; .lbr?
  535.     JP    Z,PGMSTR    ; yes, else fall through
  536.     XOR    A
  537.     LD    (TRYCHR),A    ; clear flag for later
  538.     LD    A,0FFH        ; set arcflg true
  539.     LD    (ARCFLG),A
  540.     LD    HL,FCB1
  541.     LD    DE,LBRNAM-1    ; update library name (arc)
  542.     LD    BC,12
  543.     LDIR
  544.     JP    PGMSTR        ; go do it
  545. ;
  546. NOFILE:    CALL    ILPRT
  547.     DEFB    13,10,'Can''t find ',0
  548.     CALL    DVUPRT        ; show d/u
  549.     CALL    NAMPRT        ; show name of checked file
  550.     CALL    ILPRT
  551.     DEFB    ' - check the DIRectory...',BELL,13,10,10,0
  552.     CALL    SETOLD
  553.     JP    0        ; reboot since we have destroyed the ccp
  554. ;
  555.     DEFS    64        ; 32 level stack for here
  556. SSTACK    EQU    $
  557. FINIS    EQU    $        ; finish of program loader
  558. ;
  559. LODLEN    EQU    FINIS-START    ; length of loader
  560.                 ; keep the program in line
  561.     DEFS    300H-LODLEN    ; add extra bytes here to make
  562.                 ; 'PGMSTR' start on a 100h byte boundary
  563. ;
  564. ; -----
  565. ; this is the start of the relocated program - all of the code
  566. ; from 'START' to here is thrown away once lux begins execution
  567. ; -----
  568. ;
  569. ; set up the bdos and bios patches
  570. ;
  571. PGMSTR:    JP    INIT           ; jump to start of this module
  572.     DEFB    'LUX v8.0 [tmb]'   ; the name 'LUX' is a clue to other
  573.                    ; programs that enables them to determine
  574.                    ; if lux is resident. 'L' is at bdos+3 when
  575.                    ; lux is resident
  576. ;
  577. ; this is the LUX removal routine, jumped to by the BYE command
  578. ; it is accessable to external programs, and is defined to exist at
  579. ; LUX+12 (looks like BDOS+12 when LUX is resident)
  580. ;
  581. REMOVE:     IF    RCPM
  582.     LD    SP,TPA+100H    ; use the TPA for a stack
  583.     LD    BC,0        ; first select A0:
  584.     CALL    RESET
  585.     LD    DE,80H        ; clear the DMA buffer
  586.     PUSH    DE
  587.     PUSH    DE
  588.     LD    B,80H        ; bytes to clear
  589.     XOR    A
  590. ;
  591. RZRLP:    LD    (DE),A
  592.     INC    DE
  593.     DJNZ    RZRLP
  594.     LD    A,BYELEN    ; store away the length of the command
  595.     LD    HL,BYECMD    ; now move the commands to the DMA
  596.     LD    (HL),A
  597.     POP    DE        ; restore the DMA addr
  598.     LD    BC,BYELEN
  599.     LDIR
  600.     POP    DE        ; restore it again
  601.     LD    C,26        ; reset the DMA
  602.     CALL    BDOS
  603.     LD    DE,SUBFCB    ; address the .SUB file FCB
  604.     LD    C,22        ; make the file
  605.     CALL    BDOS
  606.     INC    A        ; check for errors
  607.     JR    Z,EXITER    ; oooops, no dir space
  608.     LD    DE,SUBFCB    ; else write the data
  609.     LD    C,21
  610.     CALL    BDOS
  611.     INC    A
  612.     JR    Z,EXITER    ; oooops, no space left
  613.     LD    DE,SUBFCB
  614.     LD    C,16        ; now close the file
  615.     CALL    BDOS
  616.     LD    HL,0        ; now make the exit routine go to A0:
  617.     LD    (OLDDRV),HL
  618.      ENDIF            ;RCPM
  619. ;
  620.     JP    UNPATH        ; unpatch the jump table, and warm boot
  621. ;
  622. ; error handler for REMOVE routine
  623. ;
  624.      IF    RCPM
  625. EXITER:    CALL    ILPRT        ; we had an error trying to make the .sub file
  626.     DB    13,10,BELL,'+ Error: Can''t remove LUX! Please +'
  627.     DB    13,10,'+        type CTRL-C to exit LUX, +'
  628.     DB    13,10,'+        then type BYE to logoff. +',0
  629.     LD    SP,STACK    ;
  630.     JP    GETCMD        ;
  631.      ENDIF
  632. ;
  633. ; this is the LUX intialization
  634. ;
  635. INIT:    LD    HL,(1)        ; get warm boot vector
  636.     LD    (BIOS3),HL    ; save old warm boot vector
  637.     LD    HL,(6)        ; get bdos start
  638.     LD    (PGMSTR+1),HL    ; set new jump to bdos
  639.     LD    HL,PGMSTR    ; get local bdos vector
  640.     LD    (6),HL        ; set it in low memory
  641.     LD    SP,STACK    ; reset stack
  642. ;
  643. ; save the old bios vectors
  644. ;
  645.     LD    HL,(BIOS3)    ; bios wboot address
  646.     LD    DE,OWBOOT    ; local wboot address
  647.     LD    BC,12        ; 12 bytes to move
  648.     LDIR            ; move the block
  649. ;
  650. ; set up the new bios vectors
  651. ;
  652.     LD    HL,WBOOT    ; source is local table
  653.     LD    DE,(BIOS3)    ; destination is old bios
  654.     LD    BC,12        ; 12 bytes to move
  655.     LDIR            ; move the block
  656.     LD    A,0FFH        ; set the auto-dir byte
  657.     LD    (DOADIR),A    ;
  658.     XOR    A        ; reset the error count
  659.     LD    (HLPCNT),A    ;
  660.     JP    ENTRY        ; initialize
  661. ;
  662. OWBOOT:    DEFB    0,0,0        ; old wboot vector is moved to here
  663. OCONST:    DEFB    0,0,0        ; old constat vector is moved to here
  664. OCONIN:    DEFB    0,0,0        ; old conin vector is moved to here
  665. OCONOU:    DEFB    0,0,0        ; old conout vector is moved to here
  666. ;
  667. WBOOT:    JP    ENTRY        ; vector warm boot to entry
  668. CONST:    JP    VCONST        ; check for carrier
  669. CONIN:    JP    VCONIN        ; vector conin to vconin
  670. CONOU:    JP    VCONOU        ; vector to conout
  671. ;
  672. VCONST:    JP    OCONST        ; jump to old constat routine
  673. VCONOU:    JP    OCONOU        ; jump to old conout routine
  674. VCONIN:    CALL    OCONIN        ; get a byte
  675.     CP    'C'-40H        ; ^C?
  676.     JR    Z,VCON1
  677.     CP    'K'-40H        ; ^K?
  678.     JR    Z,VCON1
  679.     CP    'X'-40H        ; ^X?
  680.     RET    NZ        ; nope - let bios have it
  681. ;
  682. VCON1:    LD    A,(ACTIVE)    ; is lux segment active?
  683.     OR    A
  684.     LD    A,3
  685.     RET    Z        ; not active - let bios have it
  686.     LD    SP,TPA        ; re initialize the stack
  687.     CALL    ILPRT
  688.     DEFB    13,10,10
  689.     DEFB    '           >> exiting LUX - standby',0
  690. ;
  691. UNPATH:    LD    HL,OWBOOT    ; index old warm boot vector
  692.     LD    DE,(BIOS3)    ; bios jump table
  693.     LD    BC,12        ; 12 bytes to move
  694.     LDIR            ; move the old table back
  695.     CALL    SETOLD        ; set old drive/user
  696.     JP    0        ; warm boot - end of program
  697. ;
  698. ;    This is the LUX entry point
  699. ;
  700. ENTRY:    LD    SP,STACK    ; set up local stack
  701.     LD    HL,PGMSTR    ; dummy bdos vector
  702.     LD    (6),HL        ; set it
  703.     LD    HL,(BIOS3)    ; bios warm boot vector
  704.     LD    (1),HL        ; set it
  705.     LD    A,0C3H        ; (jmp)
  706.     LD    (0),A        ; reset warm boot jump
  707.     LD    (5),A        ; ...and bdos jump
  708.     CALL    OCONST        ; see if character waiting
  709.     OR    A        ; test result
  710.     JR    Z,ENTR1        ; ...if no character is waiting
  711.     CALL    OCONIN        ; get the console character
  712.                 ;    this is done to gobble any
  713.                 ;    possible garbage character
  714. ;
  715. ENTR1:    LD    A,0FFH
  716.     LD    (ACTIVE),A    ; set LUX active
  717. ;
  718. GETCMD:    CALL    SETNEW        ; reset drive/user
  719.     LD    IX,CBUFF+1    ; place to put command string
  720.     LD    IY,CBUFF+0    ; length of command
  721.     XOR    A
  722.     LD    (IY+0),A
  723. ;
  724.      IF    AUTODR
  725.     LD    A,(DOADIR)    ; shall we do a directory?
  726.     OR    A
  727.     JR    Z,PROMPT    ; guess not
  728.     XOR    A        ; else zap the byte
  729.     LD    (DOADIR),A
  730.     LD    A,3        ; fake a DIR command
  731.     LD    (CMDLEN),A
  732.     LD    HL,'ID'
  733.     LD    (CMDLIN+2),HL
  734.     LD    L,'R'
  735.     LD    H,0
  736.     LD    (CMDLIN+4),HL
  737.     JP    GOCNV        ; and do it
  738.      ENDIF
  739. ;
  740. PROMPT:     IF    HLPMSG
  741.     CALL    ILPRT        ; print the entry message
  742.     DEFB    13,10
  743.     DEFB    '[ in LUX  ^C, ^K or ^X exits  --  ? for Command Menu ]'
  744.     DEFB    13,10,0
  745.      ENDIF
  746. ;
  747. PRMPT2:    CALL    CRLF
  748.     CALL    DVUPRT        ; print the LUX prompt
  749.     CALL    NAMPRT        ; drive/user, library name
  750.     CALL    ILPRT
  751.     DEFB    ' -->',0
  752.     LD    DE,CMDLIN    ; index command line
  753.     LD    C,10
  754.     CALL    BDOS        ; read console buffer
  755.     LD    A,(CMDLEN)    ; get command length
  756.     OR    A        ; test it
  757.     JP    Z,GETCMD    ; if null command
  758.     LD    A,(CMDLIN+2)    ; get first character
  759.     CP    ';'        ; ignore all after this?
  760.     JP    Z,PRMPT2    ; yes
  761. ;
  762. GOCNV:    CALL    CNVBUF        ; convert the command line to upper case
  763. ;
  764. GETCM4:    LD    DE,CMDLIN+2    ; index data from the command line
  765.     CMDJMP    '?',QKHELP    ; alternate for HELP
  766.     CMDJMP    'LUX',LUX    ; lux command process
  767.     CMDJMP    'SD',SD        ; normal DIR of d/u area with/without filespec
  768. ;
  769.      IF    RCPM AND BYEOK
  770.     CMDJMP    'BYE',REMOVE    ; Leave system via BYE - remove LUX first
  771.      ENDIF
  772. ;
  773.      IF    RCPM AND CHATOK
  774.     CMDJMP    'CHAT',CHAT    ; Chat with sysop if available
  775.      ENDIF
  776. ;
  777.      IF    RCPM AND NOTEOK
  778.     CMDJMP    'NOTE',NOTE    ; Leave note to sysop
  779.      ENDIF
  780. ;
  781.     LD    A,(ARCFLG)
  782.     OR    A        ; in .arc file?
  783.     JR    Z,LBRCMD    ; nope, do .lbr cmds
  784.     CMDJMP    'TYPE',ATYPE    ; view ASCII text file
  785.     CMDJMP    'DIR',UNARC
  786.     CMDJMP    'D',UNARC
  787.     CMDJMP    'FILES',AFILES    ; display files (defaults to *.ARC)
  788.     CMDJMP    'LFILES',FILES    ; display .LBR files
  789.     CMDJMP    'CHEK',UNARC    ; CRC displayed with normal UNARC directory
  790.     CMDJMP    'CRCK',UNARC    ; CRC displayed with normal UNARC directory
  791. ;
  792.      IF    RCPM AND EXTARC
  793.     CMDJMP    'KMD',XFR
  794.     CMDJMP    'SEND',SENDA    ; i.e. 'KMD A'
  795.     CMDJMP    'SENDK',SENDAK    ; i.e. 'KMD AK'
  796.      ENDIF
  797. ;
  798.     JP    LSTCHK        ; Final check of NOGOTs before error
  799. ;
  800. LBRCMD:    CMDJMP    'TYPE',TIPE    ; file type command process
  801.     CMDJMP    'DIR',DIR    ; dir command process
  802.     CMDJMP    'D',DIR        ; alternate for DIR
  803.     CMDJMP    'FILES',FILES    ; display files (defaults to *.LBR)
  804.     CMDJMP    'AFILES',AFILES    ; display .ARC files
  805.     CMDJMP    'CHEK',CHEK    ; run lchek
  806.     CMDJMP    'CRCK',CRCK    ; run lcrck
  807. ;
  808.      IF    RCPM
  809.     CMDJMP    'KMD',XFR
  810.     CMDJMP    'SEND',SEND    ; i.e. 'KMD L'
  811.     CMDJMP    'SENDK',SENDK    ; i.e. 'KMD LK'
  812.      ENDIF
  813. ;
  814.      IF    ZCPR AND RCPM AND (NULUOK OR SZAPOK OR NSWPOK)
  815.     LD    A,(WHEEL)
  816.     OR    A        ; WHEEL?
  817.     JP    Z,LSTCHK    ; No, skip NULU and check NOGOTs before error
  818.      ENDIF
  819. ;
  820.      IF    NULUOK
  821.     CMDJMP    '-L',LOAD    ; load NULU in command mode and display dir
  822.     CMDJMP    '-F',FSWP    ; load NULU in filesweep mode
  823.      ENDIF
  824. ;
  825.      IF    SZAPOK
  826.     CMDJMP    'ZAP',SZAP    ; Run disk-editor
  827.      ENDIF
  828. ;
  829.      IF    NSWPOK
  830.     CMDJMP    'SWEEP',NSWP    ; Run NSWEEP
  831.      ENDIF
  832. ;
  833. ; If there are other commands a user may use on your system, and you want
  834. ; to tell him to exit LUX first, then enter below: CMDJMP  'cmd',NOGOT.
  835. ; Place your command in 'cmd' and it will tell the user that that command
  836. ; is only available outside of LUX.
  837. ;
  838. LSTCHK:     IF    RCPM
  839.     CMDJMP    'command',NOGOT    ; tell user NOGOT here
  840.      ENDIF
  841. ;
  842. ; this is where the actual error is displayed after all other checks fail...
  843. ;
  844. ;        ERROR --> dur <-- is not a valid LUX command.
  845. ;
  846. CMDERR:    CALL    ILPRT
  847.     DEFB    13,10,10,'ERROR --> ',0
  848.     CALL    PRTERR        ; display the command just entered
  849. KPTRYN:    CALL    ILPRT
  850.     DEFB    ' <-- Is not a valid LUX command.',BELL,13,10,0
  851.     LD    HL,HLPCNT    ; get error counter
  852.     INC    (HL)        ; bump it up one
  853.     LD    A,HLPERS    ; get error limit
  854.     CP    (HL)        ; reached it?
  855.     JP    NZ,GETCMD    ; no, skip rest and try again, else...
  856.     LD    (HL),0        ; reset the count
  857.     JP    QKHELP        ; and give help anyway
  858. ;
  859. PRTERR:    LD    HL,CMDLIN+2    ; index command just entered
  860.     LD    A,(CMDLEN)    ; get the length
  861.     LD    B,A        ; into 'B'
  862. GETCM5:    LD    A,(HL)        ; get a byte
  863.     CP    ' '        ; space ?
  864.     JR    Z,GETCM6    ; yes - dont print it
  865.     CP    0        ; null
  866.     JR    Z,GETCM6    ; yes - all done
  867.     CALL    CTYPE        ; print the character
  868.     INC    HL        ; next character
  869.     DJNZ    GETCM5        ; loop for the rest
  870. ;
  871. GETCM6:    RET
  872. ;
  873. ; COMMAND TRANSLATION VECTORS
  874. ;
  875. ; SUMMARY OF AUX ROUTINES:
  876. ;
  877. ; 'FILTYP' installs the following 'DEFB' into new command line
  878. ;       specify the drive and user area for each command as in
  879. ;       the vectors below.  remember each 'DEFB' must end with a
  880. ;       zero.
  881. ;
  882. ; 'FILNAM' installs the current .lbr name into the new command line
  883. ;
  884. ; 'FILSPC' installs a space character into the new command line
  885. ;
  886. ; 'FILMEM' installs the requested member name into the new command line
  887. ;
  888. ;
  889. TIPE:    DRVUSR    TYPDRV-41H,TYPUSR,'TYPE ',FILNAM,FILSPC,FILMEM
  890. ATYPE:    DRVUSR    TYPDRV-41H,TYPUSR,'UNARC ',FILNAM,FILSPC,FILMEM
  891. ;
  892. DIR:    DRVUSR    LDIRDR-41H,LDIRUS,'LUXDIR ',FILNAM,FILSPC,FILMEM
  893. UNARC:    DRVUSR    DIRDRV-41H,DIRUSR,'UNARC ',FILNAM
  894. ;
  895. SD:    DRVUSR    DIRDRV-41H,DIRUSR,'DIR',FILSPC,FILMEM
  896. FILES:    DRVUSR    DIRDRV-41H,DIRUSR,'DIR *.LBR'
  897. AFILES:    DRVUSR    DIRDRV-41H,DIRUSR,'DIR *.AR?'
  898. ;
  899. CHEK:    DRVUSR    CHKDRV-41H,CHKUSR,'LUXCHK ',FILNAM,FILSPC,FILMEM
  900. CRCK:    DRVUSR    CRCDRV-41H,CRCUSR,'LUXCRC ',FILNAM,FILSPC,FILMEM
  901. ;
  902.      IF    RCPM AND CHATOK
  903. CHAT:    DRVUSR    CHTDRV-41H,CHTUSR,'CHAT'
  904.      ENDIF
  905. ;
  906.      IF    RCPM AND NOTEOK
  907. NOTE:    DRVUSR    NOTDRV-41H,NOTUSR,'NOTE'
  908.      ENDIF
  909. ;
  910.      IF    SZAPOK
  911. SZAP:    DRVUSR    ZAPDRV-41H,ZAPUSR,'ZAP ',FILSPC,FILMEM
  912.      ENDIF
  913. ;
  914.      IF    NSWPOK
  915. NSWP:    DRVUSR    NSWDRV-41H,NSWUSR,'SWEEP ',FILSPC,FILMEM
  916.      ENDIF
  917. ;
  918.      IF    RCPM
  919. SEND:    DRVUSR    XFRDRV-41H,XFRUSR,'KMD L ',FILNAM,FILSPC,FILMEM
  920. SENDK:    DRVUSR    XFRDRV-41H,XFRUSR,'KMD LK ',FILNAM,FILSPC,FILMEM
  921.      ENDIF
  922. ;
  923.      IF    RCPM AND (NUKMD    OR MBKMD) AND EXTARC
  924. SENDA:    DRVUSR    XFRDRV-41H,XFRUSR,'KMD A ',FILNAM,FILSPC,FILMEM
  925. SENDAK:    DRVUSR    XFRDRV-41H,XFRUSR,'KMD AK ',FILNAM,FILSPC,FILMEM
  926.      ENDIF
  927. ;
  928.      IF    NULUOK
  929. LOAD:    DVUS    LUDRV-41H,LUUSR,'NULU -O '
  930.     CALL    FILNAM
  931.     CALL    FILTYP            ; * load NULU in command mode *
  932.     DEFB    ' -L',0            ; * and display the directory *
  933.     JP    PROCES
  934. ;
  935. FSWP:    DVUS    LUDRV-41H,LUUSR,'NULU -O '
  936.     CALL    FILNAM
  937.     CALL    FILTYP
  938.     DEFB    ' -F',0            ; * load NULU in filesweep mode *
  939.     JP    PROCES
  940. ;
  941. ; parse the ambiguous user/drive spec & filename, and place in command line
  942. ;
  943. AFNPRS:    CALL    FNDSPC            ; find the first space
  944.     JP    C,CMDERR        ; error if all scanned and no space
  945.     CALL    ADVANC            ; advance to next non-blank
  946.     JP    C,CMDERR        ; premature eol is error
  947.     PUSH    IX            ; drusr uses this ...
  948.     CALL    DRUSR            ; get drive/user, if any
  949.     POP    IX
  950.     OR    A            ; did drive/user change?
  951.     JP    Z,SKPDVU
  952.     PUSH    BC            ; skip over the drive spec in cmd line
  953.     LD    B,A            ; get bytes to skip
  954.     LD    HL,NXTWRD        ; address cmd pointer
  955. ;
  956. SKPTR:    INC    (HL)
  957.     DJNZ    SKPTR
  958.     POP    BC            ; restore user/drive spec
  959.     CALL    BDSDVU            ; convert to BDS usr/drv
  960.     JP    C,BDDRUS        ; if cy, then limits exceeded
  961. ;
  962. SKPDVU:    CALL    FILMEM            ; the rest is normal stuff
  963.     JP    PROCES
  964.      ENDIF                ;NULUOK
  965. ;
  966. ; quick help summary
  967. ;
  968. QKHELP:    CALL    ILPRT
  969.     DEFB    13,10,10
  970.     DEFB    'You are "inside" an .LBR or .ARC file via LUX and may',13,10
  971.     DEFB    'manipulate file members using these commands:',13,10,10
  972.     DEFB    '?                    - Displays this help menu'
  973.     DEFB    13,10
  974.     DEFB    'DIR or D             - Display DIRectory of file members'
  975.     DEFB    13,10
  976.     DEFB    'SD du:               - Display full external du: DIRectory'
  977.     DEFB    13,10
  978.     DEFB    '                         (du:filename.ext or *.??? optional)'
  979.     DEFB    13,10
  980.     DEFB    'LUX    filename      - Attach to another .LBR/.ARC file'
  981.     DEFB    13,10
  982.     DEFB    'FILES                - Display current type files this du:'
  983.     DEFB    13,10,0
  984.     LD    A,(ARCFLG)
  985.     OR    A        ; in .arc file?
  986.     JP    NZ,QKHLP1    ; Yes, don't show AFILES option
  987.     CALL    ILPRT
  988.     DEFB    'AFILES               - Display .ARC files this du:'
  989.     DEFB    13,10,0
  990.     JR    QKHLP2        ; skip LFILES option
  991. ;
  992. QKHLP1:    CALL    ILPRT
  993.     DEFB    'LFILES               - Display .LBR files this du:'
  994.     DEFB    13,10,0
  995. ;
  996. QKHLP2:    CALL    ILPRT
  997.     DEFB    'TYPE   filename.ext  - View ASCII text files'
  998.     DEFB    13,10
  999.     DEFB    'CHEK   filename.ext  - Get CRC on .LBR/.ARC member'
  1000.     DEFB    13,10
  1001.     DEFB    'CRCK   filename.ext  - Get CRC on .LBR/.ARC member'
  1002.     DEFB    13,10
  1003. ;
  1004.      IF    RCPM AND EXTARC
  1005.     DEFB    'SEND   filename.ext  - Sends .LBR/.ARC member using'
  1006.      ENDIF
  1007. ;
  1008.      IF    RCPM AND (NOT EXTARC)
  1009.     DEFB    'SEND   filename.ext  - Sends .LBR member using'
  1010.      ENDIF
  1011. ;
  1012.      IF    RCPM
  1013.     DEFB    13,10
  1014.     DEFB    '                         automatic protocol detect'
  1015.     DEFB    13,10
  1016.      ENDIF
  1017. ;
  1018.      IF    RCPM AND EXTARC
  1019.     DEFB    'SENDK  filename.ext  - Sends .LBR/.ARC member manually'
  1020.      ENDIF
  1021. ;
  1022.      IF    RCPM AND (NOT EXTARC)
  1023.     DEFB    'SENDK  filename.ext  - Sends .LBR member manually'
  1024.      ENDIF
  1025. ;
  1026.      IF    RCPM
  1027.     DEFB    13,10
  1028.     DEFB    '                         setting 1k Ymodem protocol'
  1029.     DEFB    13,10
  1030.     DEFB    'KMD S  filename.ext  - Same as SEND'
  1031.     DEFB    13,10
  1032.     DEFB    'KMD SK filename.ext  - Same as SENDK'
  1033.     DEFB    13,10
  1034.      ENDIF
  1035. ;
  1036.      IF    RCPM AND CHATOK
  1037.     DEFB    'CHAT                 - CHAT with Sysop (if available)'
  1038.     DEFB    13,10
  1039.      ENDIF
  1040. ;
  1041.      IF    RCPM AND NOTEOK
  1042.     DEFB    'NOTE                 - Leave private note to Sysop'
  1043.     DEFB    13,10
  1044.      ENDIF
  1045. ;
  1046.      IF    RCPM AND BYEOK
  1047.     DEFB    'BYE                  - Log off system {Goodbye...}'
  1048.     DEFB    13,10
  1049.      ENDIF
  1050. ;
  1051.      IF    NOT HLPMSG
  1052.     DEFB    13,10,'[ in LUX   ^C exits,  ? for Command Menu ]',13,10
  1053.      ENDIF
  1054. ;
  1055.     DEFB    0
  1056. ;
  1057.      IF    RCPM AND ZCPR AND (NULUOK OR SZAPOK OR NSWPOK)
  1058.     LD    A,(WHEEL)    ; should we display extended commands?
  1059.     OR    A
  1060.     JP    Z,GETCMD    ; if wheel byte is reset, no
  1061.     CALL    ILPRT
  1062.     DEFB    13,10,'[Hit any key] ',0
  1063.     LD    C,1
  1064.     CALL    BDOS
  1065.      ENDIF
  1066. ;
  1067.      IF    NULUOK OR SZAPOK OR NSWPOK
  1068.     CALL    ILPRT
  1069.     DEFB    13,' ++ Extended Commands ++',13,10,10
  1070.      ENDIF
  1071. ;
  1072.      IF    SZAPOK
  1073.     DEFB    'ZAP                  - SuperZAP Disk-Editor'
  1074.     DEFB    '  (du:filename.ext optional)'
  1075.     DEFB    13,10
  1076.      ENDIF
  1077. ;
  1078.      IF    NSWPOK
  1079.     DEFB    'NSWEEP               - Disk/File maintenance'
  1080.     DEFB    ' (du:filename.ext optional)'
  1081.     DEFB    13,10
  1082.      ENDIF
  1083. ;
  1084.      IF    NULUOK OR SZAPOK OR NSWPOK
  1085.     DEFB    0
  1086.      ENDIF
  1087. ;
  1088.      IF    NULUOK
  1089.     LD    A,(ARCFLG)
  1090.     OR    A        ; in .arc file?
  1091.     JP    NZ,GETCMD    ; Yes, NULU unavailable
  1092.     CALL    ILPRT
  1093.     DEFB    '-L                   - Load NULU in command mode and display'
  1094.     DEFB    ' DIRectory',13,10
  1095.     DEFB    '-F                   - Load NULU in filesweep mode'
  1096.     DEFB    13,10,10,0
  1097.      ENDIF
  1098. ;
  1099.     JP    GETCMD
  1100. ;
  1101. ; Tried entering a command specifically set as NOGOT -- tell user to exit
  1102. ; LUX and use the command in normal CP/M.
  1103. ;
  1104. NOGOT:    CALL    CRLF
  1105.     CALL    CRLF
  1106.     CALL    PRTERR        ;print the command
  1107.     CALL    ILPRT        ;and then this
  1108.     DEFB    '  <-- command only used in CP/M, must exit LUX with ^C'
  1109.     DEFB    BELL,13,10,10    ;ring bell and point at the error
  1110.     DEFB    0
  1111.     JP    GETCMD        ;go back for another command
  1112. ;
  1113. ; NUKMD/MBKMD can handle the 'L' option, while KMD can't.
  1114. ;
  1115.      IF    RCPM
  1116. XFR:    CALL    ADVANC        ; go to next character
  1117.     LD    A,(HL)        ; get the character
  1118.     CP    'S'        ; upload?
  1119.     JR    Z,XFR1        ; check for 'K'
  1120.     CP    'R'        ; upload?
  1121.     JR    Z,XFR2        ; no can do...
  1122.     CP    'L'        ; .LBR?
  1123.      ENDIF
  1124. ;
  1125.      IF    RCPM AND (NUKMD    OR MBKMD)
  1126.     JR    NZ,XFR0        ; no, check for 'A'
  1127.     LD    A,(ARCFLG)
  1128.     OR    A        ; in .ARC file?
  1129.     JR    Z,XFR1        ; no, leave as is, else...
  1130.     LD    (HL),'A'    ; replace 'L' with 'A'
  1131.     JR    XFR1
  1132.      ENDIF
  1133. ;
  1134.      IF    RCPM AND KMD
  1135.     JR    Z,XFR3        ; KMD can't handle 'L' option
  1136.      ENDIF
  1137. ;
  1138. XFR0:     IF    RCPM AND EXTARC
  1139.     CP    'A'        ; .ARC?
  1140.     JR    Z,XFR1        ; yes, check for 'K'
  1141.      ENDIF
  1142. ;
  1143.      IF    RCPM
  1144.     DRVUSR    XFRDRV-41H,XFRUSR,'KMD'
  1145. ;
  1146. XFR1:    INC    HL        ; get next chr
  1147.     LD    A,(HL)
  1148.     CP    ' '        ; space?
  1149.     JR    Z,XFR1A        ; yes
  1150.     CP    'K'        ; 1k request?
  1151.     JR    Z,XFRK        ; yes
  1152. ;
  1153. XFR1A:    CALL    NXTSPC
  1154.      ENDIF
  1155. ;
  1156.      IF    RCPM AND EXTARC
  1157.     LD    A,(ARCFLG)    ; Are we in an arc file?
  1158.     OR    A
  1159.     JP    NZ,SENDA    ; Yes, send arc
  1160.      ENDIF
  1161. ;
  1162.      IF    RCPM
  1163.     JP    SEND        ; No, send regular
  1164. ;
  1165. XFRK:    CALL    NXTSPC
  1166.      ENDIF
  1167. ;
  1168.      IF    RCPM AND EXTARC
  1169.     LD    A,(ARCFLG)    ; Are we in an arc file?
  1170.     OR    A
  1171.     JP    NZ,SENDAK    ; Yes, send arc
  1172.      ENDIF
  1173. ;
  1174.      IF    RCPM
  1175.     JP    SENDK        ; Nope, send regular
  1176. ;
  1177. XFR2:    CALL    CRLF
  1178.     CALL    PRTERR        ; print the command
  1179.     CALL    ILPRT        ; print the following
  1180.     DEFB    ' can''t (R)eceive while in LUX',BELL,13,10,0
  1181.     JP    GETCMD        ; return to command
  1182.      ENDIF
  1183. ;
  1184.      IF    RCPM AND KMD
  1185. XFR3:    CALL    CRLF
  1186.     CALL    PRTERR        ; print the command
  1187.     CALL    ILPRT        ; print the following
  1188.     DEFB    ' use S or SK options while in LUX',BELL,13,10,0
  1189.     JP    GETCMD
  1190.     ENDIF
  1191. ;
  1192. ; 'LUX' command process
  1193. ;
  1194. LUX:    LD    A,(CMDLEN)    ; get the length of the command line
  1195.     CP    3        ; was input only 'LUX'
  1196.     JP    Z,LUX04        ; error...
  1197.     CALL    FNDSPC        ; find a space in command line
  1198.     JP    C,LUX05        ; error if no space found
  1199.     CALL    ADVANC        ; search for the next non-blank character
  1200.     JP    C,LUX05        ; error if no more characters left
  1201.     CALL    DRUSR        ; get drive/user
  1202.     JP    C,LUX05        ; if drive/user specification error
  1203.     LD    (TMPDRV),BC    ; save the temporary drive/user
  1204.     PUSH    BC        ; save drive/user spec
  1205.     PUSH    HL        ; save command line pointer
  1206.     LD    A,(DRVMAX)    ; get max drive
  1207.     CP    C
  1208.     JP    C,LUX03        ; if out of range
  1209.     LD    A,(USRMAX)
  1210.     CP    B
  1211.     JP    C,LUX03        ; if out of range
  1212.     POP    HL
  1213.     POP    BC
  1214.     EX    DE,HL        ; de is source address to create new fcb
  1215.     LD    HL,TMPFCB    ; index temporary fcb
  1216.     CALL    SCANR1        ; create the new fcb
  1217.     LD    HL,'BL'        ; set 'LB' into first two bytes of file type
  1218.     LD    (TMPFCB+9),HL
  1219.     LD    A,'R'        ; set 'R' into last byte of file type
  1220.     LD    (TMPFCB+11),A
  1221.     CALL    SETTMP        ; log into the requested drive/user
  1222. ;
  1223. LUX000:    LD    DE,80H
  1224.     LD    C,26        ; bdos set dma function
  1225.     CALL    5        ; set dma address to 80h
  1226.     LD    DE,TMPFCB    ; index temporary fcb
  1227.     LD    C,17        ; bdos search first function
  1228.     CALL    5
  1229.     INC    A        ; test for existence
  1230.     JR    NZ,LUX01    ; OK, go
  1231.     LD    A,(TRYCHR)
  1232.     CP    'C'        ; done with arc?
  1233.     JP    Z,LUX001    ; yes, skip next
  1234.     CP    'K'        ; tried both already?
  1235.     JP    Z,LUX05        ; Yes, report
  1236.     LD    HL,'RA'        ; check for arc file
  1237.     LD    (TMPFCB+9),HL
  1238.     LD    A,'C'
  1239.     LD    (TMPFCB+11),A
  1240.     LD    (TRYCHR),A
  1241.     JP    LUX000        ; loop back for test
  1242. ;
  1243. LUX001:    LD    A,'K'        ; force .arK
  1244.     LD    (TMPFCB+11),A
  1245.     LD    (TRYCHR),A
  1246.     JP    LUX000        ; loop back for test
  1247. ;
  1248. LUX01:    LD    A,(TRYCHR)
  1249.     OR    A        ; .lbr?
  1250.     JP    Z,LUX01X    ; yes, else fall through
  1251.     LD    (ARCFLG),A    ; set flag true
  1252.     XOR    A
  1253.     LD    (TRYCHR),A    ; clear flag for later use
  1254.     JP    LUX02
  1255. ;
  1256. LUX01X:    XOR    A        ; clear register
  1257.     LD    (ARCFLG),A    ; set flag false
  1258. ;
  1259. LUX02:    LD    HL,(TMPDRV)    ; get temporary drive/user
  1260.     LD    (RQDDRV),HL    ; set new drive/user
  1261.     LD    HL,TMPFCB+1    ; source address of new name
  1262.     LD    DE,LBRNAM    ; current .lbr name
  1263.     LD    BC,12        ; 8 character file name
  1264.     LDIR            ; move it
  1265.     CALL    CRLF        ; for neatness
  1266.     LD    A,0FFH        ; set the auto-directory flag
  1267.     LD    (DOADIR),A
  1268.     JP    GETCMD
  1269. ;
  1270. LUX03:    POP    HL
  1271.     POP    BC
  1272. ;
  1273. LUX04:    CALL    ILPRT
  1274.     DEFB    13,10,'++ Invalid drive/user number ++',BELL,13,10,0
  1275.     JP    GETCMD
  1276. ;
  1277. LUX05:    CALL    ILPRT
  1278.     DEFB    13,10,10,'Can''t find ',0
  1279.     CALL    DVUPR1
  1280.     LD    B,8
  1281.     LD    HL,TMPFCB+1
  1282.     CALL    NAMPR1        ; print the file name
  1283.     CALL    ILPRT
  1284.     DEFB    8,8,8
  1285.     DEFB    'LBR/.ARK/.ARC - check your spelling',BELL,13,10,0
  1286.     XOR    A
  1287.     LD    (TRYCHR),A    ; clear flag for later use
  1288.     JP    GETCMD
  1289. ;
  1290. PROCES:    XOR    A        ; zero last byte of new command line
  1291.     LD    (IX+0),A
  1292.     LD    HL,CBUFF+1
  1293.     LD    (HLPCNT),A    ; reset the error count
  1294.     CALL    DRUSR        ; get drive/user
  1295.     LD    (COMDRV),BC    ; set the com drive/user
  1296.     EX    DE,HL        ; de is source address to create new fcb
  1297.     CALL    SCANER        ; create the new fcb
  1298.     EX    DE,HL        ; into 'HL'
  1299.     LD    DE,CBUFF+1    ; start of command buffer
  1300.     PUSH    HL
  1301.     PUSH    DE
  1302.     OR    A        ; clear any cy
  1303.     SBC    HL,DE        ; calculate length of move
  1304.     LD    A,(CBUFF)    ; get command line length
  1305.     SUB    L        ; calculate new length
  1306.     LD    (CBUFF),A    ; put new length
  1307.     LD    A,7EH        ; calculate length of block move
  1308.     SUB    L
  1309.     LD    C,A        ; set into c
  1310.     LD    B,0        ; 'b' gets zero
  1311.     POP    DE        ; restore destination
  1312.     POP    HL        ;    and source
  1313.     LDIR            ; move the block down
  1314.     LD    HL,FCB1        ; set up first fcb
  1315.     LD    DE,CBUFF+1
  1316.     CALL    SCANR1
  1317.     LD    HL,FCB2        ; set up second fcb
  1318.     CALL    SCANR1
  1319. ;
  1320. ; force the default file type (.com)
  1321. ;
  1322.     LD    HL,'OC'        ; 'CO'
  1323.     LD    (DEFFCB+9),HL
  1324.     LD    A,'M'        ; 'M'
  1325.     LD    (DEFFCB+11),A
  1326.     XOR    A        ; zero the record count and
  1327.                 ;   the extent number
  1328.     LD    (DEFFCB+15),A
  1329.     LD    (DEFFCB+32),A
  1330.     CALL    SETCOM        ; set com drive/user
  1331.     LD    DE,TPA
  1332.     LD    C,1AH
  1333.     CALL    BDOS        ; set dma to tpa
  1334.     LD    DE,DEFFCB
  1335.     LD    C,11H
  1336.     CALL    BDOS        ; search for first
  1337.     INC    A
  1338.     JR    NZ,PROCE1    ; file found
  1339.     CALL    ILPRT
  1340.     DEFB    13,10,'Can''t find ',0
  1341.     LD    B,8
  1342.     LD    HL,DEFFCB+1
  1343.     CALL    NAMPR1        ; print the file name
  1344.     CALL    ILPRT        ; cr/lf
  1345.     DEFB    BELL,13,10,0
  1346.     JP    ENTRY        ; go for more commands
  1347. ;
  1348. PROCE1:    LD    DE,TPA
  1349.     LD    C,1AH
  1350.     CALL    BDOS        ; set dma to tpa
  1351.     LD    DE,DEFFCB
  1352.     LD    C,0FH
  1353.     CALL    BDOS        ; open file
  1354.     INC    A
  1355.     JR    NZ,PROCE2
  1356.     CALL    ILPRT
  1357.     DEFB    13,10,'.COM File error - notify SYSOP',BELL,BELL,13,10,0
  1358.     JP    ENTRY
  1359. ;
  1360. ; load the .com file into memory @100h and call it
  1361. ;
  1362. PROCE2:    LD    HL,80H
  1363.     LD    DE,80H
  1364. ;
  1365. LODCOM:    ADD    HL,DE        ; add record size offset
  1366.     EX    DE,HL        ; get dma address into 'DE'
  1367.     PUSH    DE        ; save 'DE' and 'HL'
  1368.     PUSH    HL
  1369.     LD    C,1AH
  1370.     CALL    BDOS        ; set dma
  1371.     LD    DE,DEFFCB    ; index .com file name
  1372.     LD    C,14H
  1373.     CALL    BDOS        ; read a record
  1374.     POP    HL        ; restore 'DE' and 'HL'
  1375.     POP    DE
  1376.     EX    DE,HL        ; 'HL' is dma address again
  1377.     OR    A        ; end of file ?
  1378.     JR    Z,LODCOM    ; no - read another record
  1379.     LD    C,13
  1380.     CALL    BDOS        ; reset drive system
  1381.     CALL    SETNEW        ; set new drive/user
  1382.     XOR    A
  1383.     LD    (ACTIVE),A    ; clear command mode active
  1384.     CALL    CRLF
  1385.     CALL    TPA        ; call the loaded file @100h
  1386.     LD    DE,35        ; zero out fcb1
  1387.     LD    HL,FCB1
  1388. ;
  1389. ZEROFCB: LD    (HL),0
  1390.     INC    HL
  1391.     DJNZ    ZEROFCB
  1392.     JP    ENTRY        ; go for more commands
  1393. ;
  1394. NAMPRT:    LD    B,8        ; 8 character file name
  1395.     LD    HL,LBRNAM    ; index .lbr name
  1396. ;
  1397. NAMPR1:    LD    A,(HL)        ; get a byte
  1398.     CP    ' '        ; space?
  1399.     JR    Z,NAMPR2    ; yes - dont print
  1400.     CALL    CTYPE        ; else print the character
  1401. ;
  1402. NAMPR2:    INC    HL        ; next character
  1403.     DJNZ    NAMPR1        ; process 8 characters
  1404.     LD    A,'.'        ; print a seperator
  1405.     CALL    CTYPE
  1406.     LD    B,3        ; 3 character file type
  1407. ;
  1408. NAMPR3:    LD    A,(HL)        ; get a character
  1409.     CALL    CTYPE        ; print it
  1410.     INC    HL        ; next character
  1411.     DJNZ    NAMPR3        ; process 3 characters
  1412.     RET
  1413. ;
  1414. ; write a string of characters to the crt
  1415. ;
  1416. ILPRT:    EX    (SP),HL        ; save return address/get character pointer
  1417. ;
  1418. ILPRT1:    LD    A,(HL)        ; get a byte
  1419.     OR    A        ; test it
  1420.     JR    Z,ILPRT2    ; null - end of string
  1421.     CALL    CTYPE        ; else type the character
  1422.     INC    HL        ; next character
  1423.     JR    ILPRT1        ; loop for more
  1424. ;
  1425. ILPRT2:    INC    HL
  1426.     EX    (SP),HL        ; restore return address
  1427.     RET            ; return to caller
  1428. ;
  1429. ; write a string of characters to the command line
  1430. ;
  1431. ; works like ilprt above
  1432. ;
  1433. FILTYP:    EX    (SP),HL
  1434. ;
  1435. FILTY1:    LD    A,(HL)
  1436.     OR    A
  1437.     JR    Z,FILTY2
  1438.     CALL    PUTIN
  1439.     INC    HL
  1440.     JR    FILTY1
  1441. ;
  1442. FILTY2:    EX    (SP),HL
  1443.     RET
  1444. ;
  1445. ; fill command line with a space
  1446. ;
  1447. FILSPC:    LD    A,' '
  1448.     CALL    PUTIN        ; fill in
  1449.     RET
  1450. ;
  1451. ; fill command line with .lbr name
  1452. ;
  1453. FILNAM:    LD    B,8        ; 8 character file name
  1454.     LD    HL,LBRNAM    ; index .lbr name
  1455. ;
  1456. FILNA1:    LD    A,(HL)        ; get a character
  1457.     CP    ' '        ; space ?
  1458.     JR    Z,FILNA2    ; yes - dont add to command line
  1459.     CALL    PUTIN        ; put character into command line
  1460. ;
  1461. FILNA2:    INC    HL        ; next character
  1462.     DJNZ    FILNA1        ; process 8 characters
  1463.     LD    A,'.'        ; put in a seperator character
  1464.     CALL    PUTIN
  1465.     LD    B,3        ; 3 character file type
  1466. ;
  1467. FILNA3:    LD    A,(HL)        ; get a character
  1468.     CALL    PUTIN        ; put in command line
  1469.     INC    HL        ; next character
  1470.     DJNZ    FILNA3        ; process 3 characters
  1471.     RET            ; return to caller
  1472. ;
  1473. ; fill command line with member name
  1474. ;
  1475. FILMEM:    CALL    PARSER        ; parse member name
  1476.     LD    HL,MEMBER    ; index member name
  1477.     LD    B,12        ; 12 character max
  1478. ;
  1479. FILME1:    LD    A,(HL)        ; get a byte
  1480.     OR    A        ; end of input
  1481.     RET    Z        ; yes - return
  1482.     CALL    PUTIN        ; fill in one character
  1483.     INC    HL        ; next character
  1484.     DJNZ    FILME1        ; continue looping
  1485.     RET            ; done
  1486. ;
  1487. PUTIN:    LD    (IX+0),A    ; stuff the character into command line
  1488.     INC    IX        ; get ready for next character
  1489.     INC    (IY+0)        ; bump command line length
  1490.     RET            ; return to caller
  1491. ;
  1492. ; parse out a member name
  1493. ;
  1494. PARSER:    LD    HL,MEMBER    ; index member name
  1495.     LD    B,12        ; max 12 character filename
  1496. ;
  1497. PARSE1:    LD    (HL),0        ; zero character
  1498.     INC    HL        ; next character
  1499.     DJNZ    PARSE1        ; clear the entire member name
  1500.     CALL    ADVANC        ; advance to the next non blank character
  1501.     RET    C        ; if at the end of the line
  1502.     LD    DE,MEMBER    ; de is index to member (hl set by advanc)
  1503.     LD    HL,(NXTWRD)
  1504. ;
  1505. PARSE2:    LD    A,(HL)        ; get source byte
  1506.     OR    A        ; end of input line ?
  1507.     RET    Z        ; yes - return
  1508.     LD    (DE),A        ; put byte
  1509.     INC    HL        ; next source
  1510.     INC    DE        ; next destination
  1511.     JR    PARSE2        ; continue looping
  1512. ;
  1513. ; advanc - advance the word at nxtwrd to the next non blank address
  1514. ; of the command line.    set carry if no more characters available
  1515. ;
  1516. ADVANC:    LD    HL,(NXTWRD)    ; get pointer to next word
  1517. ;
  1518. ADVAN1:    LD    A,(HL)        ; get a byte
  1519.     OR    A        ; test flags
  1520.     JR    Z,ADVAN3    ; error - null character
  1521.     CP    ' '        ; space ?
  1522.     JR    NZ,ADVAN2    ; yes - done
  1523.     INC    HL
  1524.     LD    (NXTWRD),HL    ; put pointer back
  1525.     JR    ADVAN1        ; loop for more
  1526. ;
  1527. ADVAN2:    OR    A        ; clear any carry
  1528.     RET
  1529. ;
  1530. ADVAN3:    SCF            ; set error condition
  1531.     RET
  1532. ;
  1533. FNDSPC:    LD    HL,CMDLIN+2    ; index command line
  1534. ;
  1535. FND01:    LD    A,(HL)        ; get a byte from command line
  1536.     OR    A        ; eol ?
  1537.     JP    Z,FNDER        ; error...
  1538.     CP    ' '        ; space?
  1539.     JP    Z,FNDEX        ; ...yes - go find requested file name
  1540.     INC    HL        ; next character
  1541.     JR    FND01        ; else continue the search
  1542. ;
  1543. FNDER:    SCF            ; all characters scanned and no space found
  1544.     RET            ;
  1545. ;
  1546. FNDEX:    LD    (NXTWRD),HL    ; set character location
  1547.     OR    A        ; assure carry reset
  1548.     RET            ;
  1549. ;
  1550. NXTSPC:    LD    HL,(NXTWRD)    ; get pointer to next word
  1551. ;
  1552. NXTSP1:    LD    A,(HL)        ; get a byte
  1553.     OR    A        ; is it a null?
  1554.     JR    Z,NXTSP2    ; ...yes - return
  1555.     CP    ' '        ; if at a space?
  1556.     JR    Z,NXTSP2    ; ...yes - return
  1557.     INC    HL        ; next character
  1558.     JR    NXTSP1        ; and continue looking
  1559. ;
  1560. NXTSP2:    LD    (NXTWRD),HL
  1561.     RET
  1562. ;
  1563. ; in-line compare.  compares string addressed by 'de' to string after
  1564. ; call (ends with zero).  return with carry set means strings not the
  1565. ; same.  all registers except 'a'-reg are unaffected.
  1566. ;
  1567. ILCMP:    EX    (SP),HL
  1568.     PUSH    DE
  1569. ;
  1570. ILCMP1:    LD    A,(HL)        ; get a byte from source
  1571.     OR    A        ; null
  1572.     JR    Z,SAME1        ; yes - same so far - test next char
  1573.     LD    A,(DE)        ; get a byte from command string
  1574.     CP    (HL)        ; same as source
  1575.     JR    NZ,NOTSAM    ; no - not the same
  1576.     INC    HL        ; next source
  1577.     INC    DE        ; next compare
  1578.     JR    ILCMP1        ; loop again
  1579. ;
  1580. NOTSAM:    XOR    A        ; zero for the test
  1581. ;
  1582. NSLP:    INC    HL        ; next immediate byte
  1583.     CP    (HL)        ; null yet ?
  1584.     JR    NZ,NSLP        ; no - continue
  1585. ;
  1586. SAME2:    SCF            ; set error condition
  1587. ;
  1588. SAME:    EX    DE,HL        ; get command string pointer
  1589.     LD    (NXTWRD),HL    ; store it
  1590.     EX    DE,HL        ; restore return address
  1591.     POP    DE        ; restore source address
  1592.     INC    HL        ; adjust to stack
  1593.     EX    (SP),HL        ; replace return address/
  1594.     RET            ; return
  1595. ;
  1596. SAME1:    LD    A,(DE)        ; get the next byte from command line
  1597.     OR    A        ; null ?
  1598.     JR    Z,SAME        ; yes - its ok
  1599.     CP    ' '        ; space ?
  1600.     JR    Z,SAME        ; yes - thats ok too...
  1601.     JR    SAME2        ; not ok- must be another character
  1602. ;
  1603. CTYPE:    PUSH    AF        ; save all registers
  1604.     PUSH    BC
  1605.     PUSH    DE
  1606.     PUSH    HL
  1607.     AND    7FH        ; be sure its ascii
  1608.     LD    E,A        ; into 'E'
  1609.     LD    C,2        ; cpm console function
  1610.     CALL    BDOS
  1611.     POP    HL        ; restore all registers
  1612.     POP    DE
  1613.     POP    BC
  1614.     POP    AF
  1615.     RET            ; return to caller
  1616. ;
  1617. CRLF:    CALL    ILPRT
  1618.     DEFB    13,10,0
  1619.     RET
  1620. ;
  1621. ; get the drive and user number for a file from command string
  1622. ; index by 'HL'
  1623. ;
  1624. ; on entry:
  1625. ;
  1626. ;    'HL' points to first byte of the command string
  1627. ;
  1628. ; on exit:
  1629. ;
  1630. ;    'HL' points to the byte following ':' in the command string if
  1631. ;      the ':' was found in the first 4 character positions.
  1632. ;    -or-
  1633. ;    'HL' points to the first byte of the command string if no ':'
  1634. ;      was found.
  1635. ;
  1636. ;    'C'  contains the requested drive number (0-15)
  1637. ;    'B'  contains the requested user number  (0-15)
  1638. ;    'AF' the number of characters thru the ':' in the command string.
  1639. ;    'CY' is set if drive or user number is out of range (0-15)
  1640. ;
  1641. DRUSR:    LD    (TEMPHL),HL    ; save the pointer address
  1642.     LD    IX,(TEMPHL)    ; 'IX' get the pointer address
  1643.     LD    BC,5        ;
  1644.     LD    A,':'
  1645.     CPIR            ; search for the ':'
  1646.     LD    A,C        ; get 'B' result from 'CPIR' instruction
  1647.     LD    (LENGTH),A    ; keep for possible adjust
  1648.     EX    DE,HL        ; de points to the byte following ':'
  1649.     LD    HL,VTABLE    ; index address table
  1650.     ADD    HL,BC        ; add word offset
  1651.     ADD    HL,BC
  1652.     LD    A,(HL)        ; get routine lsb
  1653.     INC    HL
  1654.     LD    H,(HL)        ; get routine msb
  1655.     LD    L,A
  1656.     LD    BC,0        ; set up drive/user storage
  1657.     JP    (HL)        ; execute
  1658. ;
  1659. VTABLE:    DEFW    DRUS0        ; b=0 -     filename.ext
  1660.     DEFW    DRUS1        ; b=1 - a15:filename.ext
  1661.     DEFW    DRUS2        ; b=2 -  a1:filename.ext
  1662.     DEFW    DRUS3        ; b=3 -   a:filename.ext
  1663.     DEFW    DRUS4        ; b=4 -    :filename.ext
  1664. ;
  1665. ; format was - filename.ext
  1666. ;
  1667. DRUS0:    CALL    GETDFU        ; get the default user
  1668.     CALL    GETDFD        ; get the default drive
  1669.     LD    HL,(TEMPHL)    ; get old buffer pointer back
  1670.     XOR    A        ; zero move length
  1671.     RET            ; all done
  1672. ;
  1673. ; format was - duu:filename.ext
  1674. ;
  1675. DRUS1:    CALL    GETDRV        ; get the drive parameter
  1676.     LD    A,(IX+0)
  1677.     CP    '0'
  1678.     JR    C,ERROR
  1679.     CP    '9'+1
  1680.     JR    NC,ERROR
  1681.     SUB    '0'
  1682.     LD    B,A        ; put in drive number
  1683.     SLA    B        ; * 2
  1684.     SLA    B        ; * 4
  1685.     SLA    B        ; * 8
  1686.     ADD    A,A        ; a * 2
  1687.     ADD    A,B        ; + c
  1688.     LD    B,A
  1689.     INC    IX        ; skip the tens digit
  1690.     JR    GETUSR        ; get the user number
  1691. ;
  1692. ; format was - du:filename.ext
  1693. ;
  1694. DRUS2:    CALL    GETDRV        ; get the drive parameter
  1695.     JR    GETUSR        ; get the user number
  1696. ;
  1697. ; format was - d:filename.ext
  1698. ;
  1699. DRUS3:    CALL    GETDRV        ; get the drive parameter
  1700.     CALL    GETDFU        ; get the default user
  1701. ;
  1702. ; format was - :filename.ext
  1703. ;
  1704. DRUS4:    JR    DRUS5
  1705. ;
  1706. GETDRV:    LD    A,(IX+0)
  1707.     CP    'A'
  1708.     JR    C,ERROR1
  1709.     CP    'Q'
  1710.     JR    NC,ERROR1
  1711.     SUB    'A'
  1712.     LD    C,A        ; put in drive number
  1713.     INC    IX
  1714.     RET
  1715. ;
  1716. GETUSR:    LD    A,(IX+0)
  1717.     CP    '0'
  1718.     JR    C,ERROR
  1719.     CP    '9'+1
  1720.     JR    NC,ERROR
  1721.     SUB    '0'
  1722.     ADD    A,B
  1723.     LD    B,A
  1724. ;
  1725. ; adjust the byte in 'LENGTH'
  1726. ;
  1727. DRUS5:    EX    DE,HL        ; hl points to byte following ':' if any
  1728.     LD    A,(LENGTH)    ; get length of move
  1729.     OR    A        ; test it
  1730.     RET    Z        ; return if null/ clear carry
  1731.     LD    E,A
  1732.     LD    A,5
  1733.     SUB    E
  1734.     LD    (LENGTH),A
  1735.     OR    A        ; clear any error
  1736.     RET
  1737. ;
  1738. ERROR1:    POP    DE        ; kill return address from subroutine
  1739. ;
  1740. ERROR:    SCF            ; set error condition
  1741.     RET
  1742. ;
  1743. ; get default user
  1744. ;
  1745. GETDFU:    PUSH    BC
  1746.     PUSH    DE
  1747.     PUSH    HL
  1748.     LD    C,20H
  1749.     LD    E,0FFH
  1750.     CALL    BDOS
  1751.     POP    HL
  1752.     POP    DE
  1753.     POP    BC
  1754.     LD    B,A        ; set 'B' register to current user
  1755.     RET
  1756. ;
  1757. ; get default drive
  1758. ;
  1759. GETDFD:    PUSH    BC
  1760.     PUSH    DE
  1761.     PUSH    HL
  1762.     LD    C,19H
  1763.     CALL    BDOS
  1764.     POP    HL
  1765.     POP    DE
  1766.     POP    BC
  1767.     LD    C,A        ; set 'C' register to current drive
  1768.     RET
  1769. ;
  1770. ; convert the drive/user bytes in BC to a BDS-C user/drive specification
  1771. ; and place in command line
  1772. ;
  1773. BDSDVU:    PUSH    BC        ; save drive/user spec
  1774.     PUSH    HL        ; save command line pointer
  1775.     LD    A,(DRVMAX)    ; check for max's exceeded
  1776.     CP    C
  1777.     JP    C,DUERR
  1778.     LD    A,(USRMAX)
  1779.     CP    B
  1780.     JP    C,DUERR
  1781.     POP    HL
  1782.     POP    BC
  1783.     LD    A,B        ; get the user number
  1784.     CP    10        ; is it less than 10?
  1785.     JR    C,BDS2        ; yes, don't insert the '1'
  1786.     LD    A,'1'
  1787.     CALL    PUTIN
  1788.     LD    A,B        ; reget the user number
  1789.     SUB    10        ; subtract 10
  1790. ;
  1791. BDS2:    ADD    A,'0'        ; add in ascii bias
  1792.     CALL    PUTIN
  1793.     LD    A,'/'        ; now the stupid bds-c slash
  1794.     CALL    PUTIN
  1795.     LD    A,C        ; get the drive number
  1796.     ADD    A,'A'        ; add ascii bias
  1797.     CALL    PUTIN
  1798.     LD    A,':'
  1799.     CALL    PUTIN
  1800.     XOR    A        ; to indicate successfullness
  1801.     RET
  1802. ;
  1803. DUERR:    POP    HL        ; justify the stack
  1804.     POP    BC
  1805.     SCF            ; error flag
  1806.     RET
  1807. ;
  1808. ; extract token from command line and place it into deffcb;
  1809. ;   format deffcb fcb if token resembles file name and type (filename.typ);
  1810. ;   on input, cibptr pts to char at which to start scan;
  1811. ;   on output, cibptr pts to char at which to continue and zero flag is reset
  1812. ;     if '?' is in token
  1813. ;
  1814. ; entry points:
  1815. ;    scaner - load token into first fcb
  1816. ;    scanr1 - load token into fcb pted to by hl
  1817. ;
  1818. SCANER:    LD    HL,DEFFCB    ; point to deffcb
  1819. ;
  1820. SCANR1:    XOR    A        ; set temporary drive number to default
  1821.     LD    (TEMPDR),A
  1822.     CALL    ADVNCE        ; skip to non-blank or end of line
  1823.     LD    (CIPTR),DE    ; set ptr to non-blank or end of line
  1824.     LD    A,(DE)
  1825.     OR    A
  1826.     JR    Z,SCANR2
  1827.     SBC    A,'A'-1
  1828.     LD    B,A
  1829.     INC    DE
  1830.     LD    A,(DE)
  1831.     CP    ':'
  1832.     JR    Z,SCANR3
  1833.     DEC    DE
  1834. ;
  1835. SCANR2:    LD    A,(TDRIVE)    ; set 1st byte of deffcb as default drive
  1836.     LD    (HL),A
  1837.     JR    SCANR4
  1838. ;
  1839. SCANR3:    LD    A,B
  1840.     LD    (TEMPDR),A
  1841.     LD    (HL),B
  1842.     INC    DE
  1843. ;
  1844. SCANR4:    XOR    A        ; a=0
  1845.     LD    (QMCNT),A    ; init count of number of question marks in fcb
  1846.     LD    B,8        ; max of 8 chars in file name
  1847.     CALL    SCANF        ; fill fcb file name
  1848. ;
  1849. ; extract file type from possible filename.typ
  1850. ;
  1851.     LD    B,3        ; prepare to extract type
  1852.     CP    '.'        ; if (de) delimiter is a '.', we have a type
  1853.     JR    NZ,SCANR5    ; fill file type bytes with <sp>
  1854.     INC    DE        ; pt to char in command line after '.'
  1855.     CALL    SCANF        ; fill fcb file type
  1856.     JR    SCANR6        ; skip to next processing
  1857. ;
  1858. SCANR5:    CALL    SCANF4        ; space fill
  1859. ;
  1860. ; fill in ex, s1, s2, and rc with zeroes
  1861. ;
  1862. SCANR6:    LD    B,4        ; 4 bytes
  1863. ;
  1864. SCANR7:    INC    HL        ; pt to next byte in deffcb
  1865.     LD    (HL),0
  1866.     DJNZ    SCANR7
  1867. ;
  1868. ; scan complete -- de pts to delimiter byte after token
  1869. ;
  1870.     LD    (CIBPTR),DE
  1871. ;
  1872. ; set zero flag to indicate presence of '?' in filename.typ
  1873. ;
  1874.     LD    A,(QMCNT)    ; get number of question marks
  1875.     OR    A        ; set zero flag to indicate any '?'
  1876.     RET
  1877. ;
  1878. ;  scanf -- scan token pted to by de for a max of b bytes; place it into
  1879. ;    file name field pted to by hl; expand and interpret wild cards of
  1880. ;    '*' and '?'; on exit, de pts to terminating delimiter
  1881. ;
  1882. SCANF:    CALL    SDELM        ; done if delimiter encountered - <sp> fill
  1883.     JR    Z,SCANF4
  1884.     INC    HL        ; pt to next byte in deffcb
  1885.     CP    '*'        ; is (de) a wild card?
  1886.     JR    NZ,SCANF1    ; continue if not
  1887.     LD    (HL),'?'    ; place '?' in deffcb and dont advance de if so
  1888.     CALL    SCQ        ; scanner count question marks
  1889.     JR    SCANF2
  1890. ;
  1891. SCANF1:    LD    (HL),A        ; store filename char in deffcb
  1892.     INC    DE        ; pt to next char in command line
  1893.     CP    '?'        ; check for question mark (wild)
  1894.     CALL    Z,SCQ        ; scanner count question marks
  1895. ;
  1896. SCANF2:    DJNZ    SCANF        ; decrement char count until 8 elapsed
  1897. ;
  1898. SCANF3:    CALL    SDELM        ; 8 chars or more - skip until delimiter
  1899.     RET    Z        ; zero flag set if delimiter found
  1900.     INC    DE        ; pt to next char in command line
  1901.     JR    SCANF3
  1902. ;
  1903. ;  fill memory pointed to by hl with spaces for b bytes
  1904. ;
  1905. SCANF4:    INC    HL        ; pt to next byte in deffcb
  1906.     LD    (HL),' '    ; fill filename part with <sp>
  1907.     DJNZ    SCANF4
  1908.     RET
  1909. ;
  1910. ;  increment question mark count for scanner
  1911. ;    this routine increments the count of the number of question marks in
  1912. ;    the current fcb entry
  1913. ;
  1914. SCQ:    LD    A,(QMCNT)    ; get count
  1915.     INC    A        ; increment
  1916.     LD    (QMCNT),A    ; put count
  1917.     RET
  1918. ;
  1919. ; check to see if de pts to delimiter; if so, ret w/zero flag set
  1920. ;
  1921. SDELM:    LD    A,(DE)
  1922.     OR    A        ; 0=delimiter
  1923.     RET    Z
  1924.     CP    ' '        ; error if < <sp>
  1925.     RET    Z        ; <sp>=delimiter
  1926.     CP    '='        ; '='=delimiter
  1927.     RET    Z
  1928.     CP    5FH        ; underscore=delimiter
  1929.     RET    Z
  1930.     CP    '.'        ; '.'=delimiter
  1931.     RET    Z
  1932.     CP    ':'        ; ':'=delimiter
  1933.     RET    Z
  1934.     CP    ';'        ; ';'=delimiter
  1935.     RET    Z
  1936.     CP    '<'        ; '<'=delimiter
  1937.     RET    Z
  1938.     CP    '>'        ; '>'=delimiter
  1939.     RET
  1940. ;
  1941. ; advance input ptr to first non-blank and fall through to sblank
  1942. ;
  1943. ADVNCE:    LD    (CIBPTR),DE
  1944. ;
  1945. ; skip string pted to by de (string ends in 0) until end of string
  1946. ;   or non-blank encountered (beginning of token)
  1947. ;
  1948. SBLANK:    LD    A,(DE)
  1949.     OR    A
  1950.     RET    Z
  1951.     CP    ' '
  1952.     RET    NZ
  1953.     INC    DE
  1954.     JR    SBLANK
  1955. ;
  1956. ; capitalize string (ending in 0) in cmdlin and set ptr for parsing
  1957. ;
  1958. CNVBUF:    LD    HL,CMDLIN+1    ; pt to users command
  1959.     LD    B,(HL)        ; char count in b
  1960.     INC    B        ; add 1 in case of zero
  1961. ;
  1962. CNVBF1:    INC    HL        ; pt to 1st valid char
  1963.     LD    A,(HL)        ; capitalize command char
  1964.     CALL    UCASE
  1965.     LD    (HL),A
  1966.     DJNZ    CNVBF1        ; continue to end of command line
  1967. ;
  1968. CNVBF2:    LD    (HL),0        ; store ending <null>
  1969.     LD    HL,CMDLIN+2    ; set command line ptr to 1st char
  1970.     LD    (CIBPTR),HL
  1971.     RET
  1972. ;
  1973. ; convert char in a to upper case
  1974. ;
  1975. UCASE:    CP    61H        ; lower-case a
  1976.     RET    C
  1977.     CP    7BH        ; greater than lower-case z?
  1978.     RET    NC
  1979.     AND    5FH        ; capitalize
  1980.     RET
  1981. ;
  1982. GETOLD:    CALL    GETDFU        ; get current user into 'B'
  1983.     CALL    GETDFD        ; get current driv into 'C'
  1984.     LD    (OLDDRV),BC    ; get the parameters
  1985.     RET
  1986. ;
  1987. SETTMP:    LD    BC,(TMPDRV)
  1988.     JR    RESET
  1989. ;
  1990. SETOLD:    LD    BC,(OLDDRV)
  1991.     JR    RESET
  1992. ;
  1993. SETNEW:    LD    BC,(RQDDRV)    ; get the old drive number
  1994.     JR    RESET
  1995. ;
  1996. SETCOM:    LD    BC,(COMDRV)    ; get the old drive number
  1997. ;
  1998. RESET:    PUSH    BC        ; save drive/user
  1999.     PUSH    BC
  2000.     LD    E,C        ; get selected drive
  2001.     LD    C,14        ; bdos function
  2002.     CALL    BDOS
  2003.     POP    BC        ; restore drive/user
  2004.     LD    E,B        ; get selected user
  2005.     LD    C,32        ; bdis set user function
  2006.     CALL    BDOS
  2007. ;
  2008. ; set up byte at 4h - some programs may look at it
  2009. ;
  2010.     POP    BC
  2011.     LD    A,B        ; get user number
  2012.     RLA
  2013.     RLA
  2014.     RLA
  2015.     RLA
  2016.     AND    0F0H
  2017.     OR    C
  2018.     LD    (4),A
  2019.     RET
  2020. ;
  2021. DVUPR1:    LD    A,(TMPUSR)
  2022.     PUSH    AF
  2023.     LD    A,(TMPDRV)
  2024.     JR    DVUPR3
  2025. ;
  2026. DVUPRT:    LD    A,(RQDUSR)    ; get requested drive
  2027.     PUSH    AF
  2028.     LD    A,(RQDDRV)    ; get the requested user
  2029. ;
  2030. DVUPR3:    ADD    A,'A'
  2031.     CALL    CTYPE        ; print the drive 'A'-'P'
  2032.     POP    AF
  2033.     CP    10        ; less that 10?
  2034.     JR    C,DVUPR2    ; yes - dont print the '1'
  2035.     PUSH    AF
  2036.     LD    A,'1'
  2037.     CALL    CTYPE
  2038.     POP    AF
  2039.     SUB    10
  2040. ;
  2041. DVUPR2:    ADD    A,'0'
  2042.     CALL    CTYPE
  2043.     LD    A,':'
  2044.     JP    CTYPE
  2045. ;
  2046.      IF    RCPM
  2047. SUBFCB:    DEFB    0        ; use current drive
  2048.     DEFB    '$$$     SUB'    ;
  2049.     DEFB    0,0,0,0,0    ; rest of the fcb
  2050.     DEFB    0,0,0,0,0
  2051.     DEFB    0,0,0,0,0
  2052.     DEFB    0,0,0,0,0
  2053.     DEFB    0,0,0,0,0
  2054. ;
  2055. ; Edit this to contain the console commands necessary to
  2056. ; execute the logoff sequence for your system.
  2057. ;
  2058. BYECMD:    DEFB    0    ;<====== do not modify
  2059.     DEFB    'BYE',13,10    ;<====== put any number of cmds here
  2060.     DEFB    'Z'-40H    ;<====== do not modify
  2061. ;
  2062. BYELEN    EQU    $-BYECMD-1
  2063.      ENDIF
  2064. ;
  2065. TRYCHR:    DEFB    0
  2066. ARCFLG:    DEFB    0
  2067. DOADIR:    DEFB    0
  2068. HLPCNT:    DEFB    0
  2069. BIOS3:    DEFW    0
  2070. DRVMAX:    DEFB    0
  2071. USRMAX:    DEFB    0
  2072. TEMPDR:    DEFB    0
  2073. CIPTR:    DEFW    0
  2074. TDRIVE:    DEFB    0
  2075. QMCNT:    DEFB    0
  2076. CIBPTR:    DEFW    0
  2077. TEMPHL:    DEFW    0
  2078. LENGTH:    DEFB    0
  2079. OLDDRV:    DEFB    0
  2080. OLDUSR:    DEFB    0
  2081. RQDDRV:    DEFB    0        ; requested drive
  2082. RQDUSR:    DEFB    0        ; requested user
  2083. COMDRV:    DEFB    0        ; drive to load com file
  2084. COMUSR:    DEFB    0        ; user to load com file
  2085. TMPDRV:    DEFB    0        ; temporary drive number
  2086. TMPUSR:    DEFB    0        ; temporary user number
  2087. ACTIVE:    DEFB    0        ; attach command mode active
  2088. NXTWRD:    DEFW    0
  2089.     DEFW    0
  2090. CMDLIN:    DEFB    79
  2091. CMDLEN:    DEFB    0
  2092.     DEFS    79
  2093.     DEFB    0
  2094. ;
  2095. MEMBER:    DEFB    '            '
  2096.     DEFB    0
  2097.     DEFB    0
  2098. LBRNAM:    DEFB    '        '    ; library file name
  2099.     DEFB    'LBR'
  2100. ;
  2101. TMPFCB:    DEFS    36
  2102. DEFFCB:    DEFS    36
  2103.     DEFS    80
  2104. STACK    EQU    $
  2105. ;
  2106.     END
  2107.