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 / ZCPR33 / A-R / RLX16.LBR / RLX16.ZZ0 / RLX16.Z80
Text File  |  2000-06-30  |  24KB  |  982 lines

  1. ;
  2. ;  PROGRAM: RLX
  3. ;  AUTHOR: RICHARD CONN
  4. ;  VERSION: 1.0
  5. ;  DATE: 10 Aug 85
  6. ;
  7. vers    equ    16    ; Modified for compatability with ZCPR33 by using
  8.             ; code from LX15. LX15 still has problems if the
  9.             ; .LBR file is not found, (for instance if WDU is
  10.             ; enabled in zcpr33 & wheel is off) since none of the
  11.             ; code from LX13/LX14 was included. I have therefore
  12.             ; tentatively changed the name of the wheel protected
  13.             ; versions of LXnn to RLXnn. This is to indicate it's
  14.             ; usefullness on a remote access system. I have kept
  15.             ; the version no's the same as for standard LXnn, &
  16.             ; have left the history information intact, so that
  17.             ; all credit to previous contributers/authors will
  18.             ; be shown. In this manner those who have no need
  19.             ; for wheel protection do not have to have this code
  20.             ; in their programs, but those in a remote access (or
  21.             ; office) environment can have it available.
  22.             ; In addition, there is a provision to inhibit the
  23.             ; second default library search. Just patch a 0 in the
  24.             ; first byte of the second library name field or
  25.             ; define the label 'twolibs' as false & reassemble.
  26.             ; Also, since some linkers have problems producing
  27.             ; dseg code properly, I have included an equate to
  28.             ; allow conditional assembly with dseg (usedseg).
  29.             ; Removed the internal COUT routine since it crashed
  30.             ; both my Xerox & Kaypro every time I invoked the
  31.             ; program (I did't try it from Wordstar..I couldn't
  32.             ; get that far).
  33.             ;
  34.             ; 8 June 1987 - Royce Shofner
  35.  
  36. ;vers    equ    15    ; Adapted to coexist as an ECP with error
  37.             ; handling under ZCPR 3.3 and BGii 1.13 or
  38.             ; later.  Also extended Michael's auto-
  39.             ; install code to properly initialize the
  40.             ; copy routine for Z33 type 2 COMfiles
  41.             ; (origin other than 100H).  Bumped versions
  42.             ; past 1.3 & 1.4, which seem to be of interest
  43.             ; mainly to Z-Node sysops (no offense, Royce,
  44.             ; just a personal opinion - b/m).  Note that
  45.             ; there is a problem regarding SYSLIB's
  46.             ; CODEND routine and the use of DSEG as
  47.             ; recommended for the upcoming Z80 versions
  48.             ; of the Conn *LIBs.  The old approach (the
  49.             ; $MEMRY buffer in CSEG) has been recommended
  50.             ; to the LIBs revision team.  All modifiable
  51.             ; LX data buffers are now in DSEG, including
  52.             ; the (now runtime-initialized) ARGV argument
  53.             ; table.  While I was at  it, I got rid of the
  54.             ; unecessary self-modifying code at COPY$CODE.
  55.             ; Remember, we won't be able to get away with
  56.             ; such kludges with the Z280, so we might as
  57.             ; well start getting rid of our bad habits now.
  58.             ; Note that LX now carries its own COUT routine
  59.             ; to enable showing an error or a help screen
  60.             ; under the WordStar "R" command without
  61.             ; crashing anyone's system to a fare-thee-well.
  62.             ; Bruce Morgen @15:03:03 April 24, 1987
  63.  
  64. ;vers    equ    14    ; Fixed bug which caused system hang if default
  65.             ; .LBR file is not found.
  66.             ; 3 March 1987 - Royce Shofner
  67.  
  68. ;vers    equ    13    ; Installed the capability to search for two
  69.             ; default command libraries. The 1st,COMMAND.LBR
  70.             ; does not require the wheel byte. The 2nd,
  71.             ; SYSCMD.LBR does require the wheel byte, as
  72.             ; do any librarys explicitly accessed.
  73.             ; With this arrangement, any program stored in
  74.             ; COMMAND.LBR is available for 'public' use but,
  75.             ; programs stored in other .LBR files can only
  76.             ; be executed by a 'wheel'.
  77.             ; 9 January 1987 - Royce Shofner
  78.  
  79. ;vers    equ    12    ; Auto-installs ZCPR3 utilities.  There is no
  80.             ; need to run Z3INS on utilities run by LX
  81.             ; since, after loading and before executing,
  82.             ; LX looks for "Z3ENV" at the beginning.  If
  83.             ; present, LX inserts the address of the
  84.             ; environment descriptor.  Both concept and
  85.             ; code are based on Jay Sage's experimental CCP.
  86.             ; 3 September 1986 - Michael Bate
  87.  
  88. ;vers    equ    11    ; Extracted ARGV from syslib36 and included
  89.             ; it here, modified so that '=' is also an
  90.             ; argument delimiter if it occurs after
  91.             ; a non-space (sknsp:).  27 Feb 86  jww
  92. ;
  93. ;vers    equ    10    ; Release version
  94.  
  95. z3env    equ    0F400h    ; My Z3 environment location
  96.  
  97. ;
  98. ;    LX is like the old LRUN tools in that it looks at its arguments
  99. ; as a command line to be executed.  LX locks onto a library file, searches
  100. ; for the command verb COM file in it, extracts the COM file into memory
  101. ; at 100H, and sets up the various buffers to look like the COM file was
  102. ; executed by the ZCPR3 command processor.
  103. ;
  104. ;    Unlike the other LRUN tools I've seen and heard of (with the
  105. ; possible exception of LRUNZ), LX truly acts as the ZCPR3 command
  106. ; processor, parsing the command line as ZCPR3 itself would.  Named
  107. ; directory references are allowed, the External FCB is loaded if
  108. ; available, etc.  Any ZCPR3 tool executed by LX sees the environment
  109. ; as it would if ZCPR3 itself executed the tool.
  110. ;
  111. ;    For security, no directory references are allowed (they are
  112. ; ignored) for any arguments if the wheel byte is not set.
  113. ;
  114.  
  115. ;
  116. ;  TEST flag for testing
  117. ;
  118. false    equ    0
  119. true    equ    not false
  120. test    equ    false
  121.  
  122. ;
  123. ;  Externals
  124. ;
  125.     ext    z3init,codend
  126.     ext    eprint,retud,putud,logud,getud,pfn1
  127.     ext    initfcb,f$exist,pstr
  128.     ext    getefcb,zprsfn,z3log,pfind,getwhl
  129.     ext    luinit,luopen,luread
  130.     ext    getcst,putcst    ; b/m, April 24, 1987
  131.  
  132.  
  133. ;
  134. ;  Equates
  135. ;
  136. cr    equ    0dh
  137. lf    equ    0ah
  138. bdose    equ    5
  139. fcb1    equ    5ch
  140. fcb2    equ    6ch
  141. tbuff    equ    80h
  142. tpa    equ    100h
  143. lnsize    equ    40        ; Number of chars allowed for library name
  144. twolibs    equ    true        ; if true search for two default libraries
  145. usedseg    equ    true        ; some linkers have problems with dseg
  146.                 ; set usedseg to false if yours does.
  147. ;
  148. ; External ZCPR3 Environment Descriptor
  149. ;
  150.     jp    start
  151. z3ename:
  152.     db    'Z3ENV'        ; This is a zcpr3 utility
  153.     db    1        ; External environment descriptor
  154. z3eadr:
  155.     dw    z3env
  156. ;
  157. ;  Name of Library File(s)
  158. ;
  159. libname:
  160.     db    'COMMAND:COMMAND.LBR',0    ; or whatever you need
  161.     ds    lnsize-[$-libname]
  162. libnam2:
  163.     if    not twolibs
  164.     db    0
  165.     else
  166.     db    'COMMAND:SYSCMD.LBR',0    ; again your own filename
  167.     endif
  168.     ds    lnsize-[$-libnam2]
  169. ;
  170. ;  Beginning of code; set buffer definitions here
  171. ;
  172. start:
  173.     ld    hl,(z3eadr)    ; Pt to zcpr3 environment
  174. ;
  175.     call    z3init        ; Init zcpr3 environment
  176. start1:
  177.     ld    a,(bdose+2)    ; Get bdos base page
  178.     sub    a,9        ; 9 pages below bdos is 1 page below ccp
  179.     ld    (tpaend),a    ; Set end of tpa
  180.     call    codend        ; Get free space ptr
  181.     ld    (gbuff),hl    ; Set ptr
  182.     ld    de,128        ; 128 bytes
  183.     add    hl,de
  184.     ld    (lfcb),hl    ; Set ptr to local fcb
  185.     add    hl,de
  186.     ld    (cmdline),hl    ; Set ptr to command line
  187.     add    hl,de
  188.     ld    (scratch),hl    ; Free space ptr
  189.     ld    hl,tpa
  190.     ld    (cpytpa),hl
  191. ;
  192. ;  Set status of twolib search
  193. ;
  194.     ld    a,(libnam2)    ; if byte at libnam2 is 0, then
  195.     ld    (lbr$flg),a    ; the second default search is inhibited
  196.  
  197. ;
  198. ;  Save original command line
  199. ;
  200.     ld    hl,tbuff+1    ; Copy from tbuff
  201.     ld    de,(cmdline)
  202.     ld    bc,128        ; 128 bytes
  203.     ldir
  204. ;
  205. ;  Save home directory
  206. ;
  207.     call    putud
  208. ;
  209. ;  First parse of command line to determine if help needed, name of library
  210. ;
  211.     ld    hl,(cmdline)    ; Pt to command line
  212.     ld    de,args        ; Pt to argument table
  213.     ld    a,4        ; Init. for four arguments
  214.     ld    (de),a        ; so table can be in DSEG
  215.     xor    a        ; Do not delimit tokens (A=0)
  216.     call    argv        ; Generate vector
  217.     ld    a,(argc)    ; Check count
  218.     ld    b,a        ; Save arg count in b
  219.     or    a        ; Help if no args
  220.     jr    z,help
  221.     ld    hl,(argv1)    ; Get ptr to first arg
  222.     ld    a,(hl)        ; Get first char of first arg
  223.     cp    '/'
  224.     jp    nz,go1        ; Skip help if not /
  225. ;
  226. ;  Print Help Message
  227. ;
  228. help:
  229.     call    eprint
  230.     db    ' Remote LX, Version '
  231.     db    [vers/10]+'0','.',[vers    mod 10]+'0'
  232.     db    cr,lf,' Syntax: LX command_line'
  233.     db    cr,lf,' or      LX -dir:library command_line',0
  234.  
  235.     ld    a,(libname)
  236.     cp    ' '+1
  237.     ret    c
  238.     call    eprint
  239.     db    cr,lf
  240.     db    cr,lf,' Default library is ',0
  241.     ld    hl,libname    ; get first default library
  242.     call    pstr
  243.     ld    a,(libnam2)
  244.     cp    ' '+1
  245.     ret    c
  246.     call    getwhl
  247.     ret    z
  248.     call    eprint
  249.     db    cr,lf,' Secondary search library is ',0
  250.     ld    hl,libnam2
  251.     call    pstr
  252.     ret
  253. ;
  254. ;  Continue processing; check for and process library reference
  255. ;
  256. go1:
  257.     ld    de,argv1    ; Set pointer for first token
  258.     cp    '-'        ; Library reference?
  259.     jr    nz,go2
  260.     dec    b        ; Reduce argument count by 1
  261.     jp    z,help        ; Library name by itself is not enough
  262. ;
  263. ;  Extract and store library reference
  264. ;
  265.     ld    (lbr$flg),a    ; Remember that lbr name was explicit
  266.     push    bc        ; Save arg count
  267.     ld    de,libname    ; Set library name
  268.     inc    hl        ; Pt to name
  269.     ld    bc,lnsize    ; Size of buffer
  270.     ldir
  271.     ld    hl,libname    ; Terminate name with zero
  272. lnscan:
  273.     ld    a,(hl)        ; Get next char
  274.     cp    ' '        ; Done?
  275.     jr    z,lnscan1
  276.     or    a
  277.     jr    z,lnscan1
  278.     inc    hl        ; Pt to next
  279.     jr    lnscan
  280. lnscan1:
  281.     ld    (hl),0
  282.     ld    de,argv2    ; Set ptr to first token
  283.     pop    bc        ; Get arg count
  284. ;
  285. ;  DE pts to first token of command line
  286. ;  Store command line (next token) into TBUFF
  287. ;
  288. go2:
  289.     push    de        ; Save ptr to first token
  290.     djnz    go3        ; See if any tokens follow the command name
  291.                 ; If no more tokens, then zero gbuff
  292.     ld    hl,(gbuff)    ; Store empty command line into gbuff
  293.     ld    (hl),0
  294.     inc    hl
  295.     ld    (hl),0
  296.     jp    cline
  297. ;
  298. ;  Save command line tail into GBUFF
  299. ;
  300. go3:
  301.     inc    de        ; Pt to next token
  302.     inc    de
  303.     ld    a,(de)        ; Get address
  304.     ld    l,a
  305.     inc    de
  306.     ld    a,(de)
  307.     ld    h,a        ; Hl pts to first token of command line tail
  308.     ld    de,(gbuff)    ; Pt to command line buffer
  309.     inc    de        ; Pt to char after
  310.     ld    a,' '
  311.     ld    (de),a        ; Store leading space
  312.     inc    de
  313.     ld    b,1        ; Set char count to 1
  314. cltsave:
  315.     ld    a,(hl)        ; Get next char
  316.     ld    (de),a        ; Store it
  317.     or    a        ; Eol?
  318.     jr    z,cltsdone
  319.     inc    hl        ; Pt to next
  320.     inc    de
  321.     inc    b        ; Increment count
  322.     jr    cltsave
  323. cltsdone:
  324.     ld    a,b        ; Get count
  325.     ld    hl,(gbuff)    ; Pt to local buffer
  326.     ld    (hl),a        ; Set count
  327. cline:
  328.     call    retud        ; C=current user
  329.     call    getefcb        ; Clear external fcb
  330.     call    nz,clrfcb
  331.     ld    hl,fcb1        ; Clear fcb1
  332.     call    clrfcb
  333.     ld    hl,fcb2        ; Clear fcb2
  334.     call    clrfcb
  335.     pop    hl        ; Get ptr to first token
  336.     ld    a,(hl)        ; Get address
  337.     inc    hl
  338.     ld    h,(hl)
  339.     ld    l,a        ; Hl pts to first token
  340.     ld    de,args        ; Use same argument vector table
  341.     ld    a,0ffh        ; Null-terminate arguments
  342.     call    argv
  343.     ld    c,0        ; Up to 3 tokens to obtain
  344.     ld    de,argv1    ; Pt to first token
  345.     ld    a,(argc)    ; Get argument count
  346.     cp    4        ; Range?
  347.     jr    c,go4
  348.     ld    a,3        ; Set 3 tokens
  349. go4:
  350.     ld    b,a        ; In c
  351. ;
  352. ;  There are three tokens (max) to be extracted:
  353. ;    Program name (external FCB)
  354. ;    FCB 1
  355. ;    FCB 2
  356. ;
  357. go5:
  358.     push    bc        ; Save counters
  359.     call    namebld        ; Build token
  360.     pop    bc        ; Get counters
  361.     inc    c        ; Increment token id
  362.     djnz    go5
  363.     call    getefcb        ; Set file type to com for external fcb
  364.     jr    z,go6        ; No external fcb
  365.     ld    de,9        ; Offset
  366.     add    hl,de
  367.     ld    de,comtyp    ; File type
  368.     ex    de,hl
  369.     ld    bc,3        ; 3 bytes
  370.     ldir
  371. ;
  372. ;  Locate LBR file
  373. ;
  374. go6:    call    lbr$tst        ; test for explicit lbr reference
  375.     call    z,getwhl    ; test for wheel if explicit
  376.     jp    z,no$whl    ; abort if not wheel
  377.     call    find$lf        ; else search for library
  378.     push    af        ; save search status
  379.     call    lbr$tst        ; is lbr$flg = to '-'
  380.     jr    z,last$lbr    ; if so, that's our last chance
  381.     or    a        ; is lbr$flg a zero ?
  382.     jr    z,last$lbr    ; 0 means two library search is off
  383.  
  384.     pop    af        ; get lbr search result
  385.     jr    nz,go7
  386.     call    loadcom
  387.     jr    nz,autoin    ; Do Z3 install if successful
  388. go7:
  389.     call    lbr$tst        ; ok to continue ?
  390.     jr    z,lx$abort
  391.     or    a
  392.     jr    z,lx$abort
  393.     call    getwhl
  394.     jp    z,no$whl    ; wheel required for SYSCMD access
  395.     ld    hl,libnam2    ; move 2nd lbr name into
  396.     ld    de,libname    ; libname buffer
  397.     ld    bc,lnsize
  398.     ldir
  399.  
  400.     ld    a,'-'        ; set 2nd pass flag
  401.     ld    (lbr$flg),a
  402.     call    find$lf        ; search for 2nd library
  403.     push    af
  404.  
  405. last$lbr:    ;no more lbr searches
  406.     pop    af        ; get status of lbr search
  407.     jr    z,get$lbr
  408.  
  409. lx$abort:
  410.     call    getcst        ; Get Cmd. Status Flag (again)
  411.     bit    2,a        ; Are we the ECP?
  412.     jp    z,getud        ; All done if not
  413.     set    1,a        ; Otherwise set error bit
  414.     call    putcst        ; Put it in CSF and we're done,
  415.     jp    getud        ; return via Z3LIB routine
  416.  
  417.  
  418. ;
  419. ;  Load Command from Library into Memory Above LRUN
  420. ;
  421. get$lbr:
  422.     call    loadcom
  423.     jr    z,lx$abort    ; Abort if memory full
  424. ;
  425. ;  Perform Auto-Install if this is a ZCPR3 utility
  426. ;
  427.  
  428. autoin:
  429.     ld    ix,(scratch)
  430.     ld    de,z3ename    ; DE -> "Z3ENV" in this program
  431.     ld    b,5        ; compare 5 bytes
  432. instal0:
  433.     ld    a,(de)        ; Compare "Z3ENV" with location in
  434.     cp    (ix+3)        ; the loaded program that would have it
  435.     jr    nz,install    ; jump if no match - NOT a ZCPR3 utility
  436.     inc    de
  437.     inc    ix        ; index through the 5 bytes
  438.     djnz    instal0
  439.     ld    de,(z3eadr)    ; This is a ZCPR3 utility
  440.     ld    (ix+4),e    ; Store the environment address
  441.     ld    (ix+5),d
  442.     ld    a,(ix+3)    ; Get environment type byte
  443.     cp    2        ; Check for type < 1
  444.     jr    c,install    ; Branch if standard-TPA tool
  445.     ld    e,(ix+6)    ; Runtime address into DE
  446.     ld    d,(ix+7)
  447.     ld    (cpytpa),de    ; Initialize data for copy
  448.                 ; routine and fall through
  449.  
  450. install:
  451.  
  452. ;
  453. ;  Set up TBUFF area
  454. ;
  455.     push    hl        ; save address of next block after load
  456.     ld    hl,(gbuff)    ; Ptr to local buffer
  457.     ld    de,tbuff    ; Ptr to tbuff
  458.     ld    bc,128        ; 128 bytes
  459.     ldir
  460.     pop    de        ; Get address of next block after load
  461. ;
  462. ;  Set up to Copy command down and execute
  463. ;  DE = next block after load
  464. ;
  465.     call    copyset        ; Place copy routine in high memory
  466.     call    getud        ; Return to home directory
  467.     ld    hl,tbuff    ; Set default dma address
  468.     call    setdma
  469. ;
  470.      if    test
  471.     call    testpr
  472.     ret
  473.      endif
  474. ;
  475. ;  Ready to copy program down and transfer to it
  476. ;  The original return address is on the top of the stack
  477. ;
  478.     ld    a,(tpaend)    ; Get address in hl
  479.     ld    h,a
  480.     ld    l,0
  481.     jp    (hl)        ; Process copy command
  482.  
  483. ;
  484. ;  Clear FCB pted to by HL
  485. ;  Current user area is in C
  486. ;
  487. clrfcb:
  488.     ld    (hl),0        ; Current disk
  489.     inc    hl        ; Pt to name
  490.     ld    b,11        ; 11 bytes
  491.     ld    a,' '        ; Space fill
  492.     call    fill
  493.     ld    (hl),0        ; Null
  494.     inc    hl
  495.     ld    (hl),c        ; User area (byte 13)
  496.     inc    hl
  497.     ld    b,4        ; Number of bytes
  498.     ld    a,0        ; Fill with zeroes
  499.     call    fill
  500.     ret
  501. ;
  502. ;  Fill B bytes pted to by HL with A
  503. ;
  504. fill:
  505.     ld    (hl),a        ; Fill
  506.     inc    hl        ; Pt to next
  507.     djnz    fill
  508.     ret
  509. ;
  510. ;  Build name of token whose address is pted to by DE
  511. ;  On input, C=flag:
  512. ;    0    Name of program
  513. ;    1    FCB 1
  514. ;    2    FCB 2
  515. ;
  516. namebld:
  517.     ld    a,(de)        ; Get address of token in hl
  518.     ld    l,a
  519.     inc    de
  520.     ld    a,(de)
  521.     ld    h,a
  522.     inc    de
  523.     push    de        ; Save ptr to next
  524.     ld    a,c        ; Check flag
  525.     cp    1        ; Middle value
  526.     jr    c,namexfcb    ; External fcb if 0
  527.     ld    de,fcb1        ; Assume fcb
  528.     jr    z,nameb1    ; Fcb 1 if 1
  529.     ld    de,fcb2        ; Else fcb2
  530.     jr    nameb1
  531. namexfcb:
  532.     ex    de,hl        ; Save hl
  533.     call    getefcb        ; Get ptr to external fcb
  534.     ex    de,hl        ; Hl pts to token, de pts to external fcb
  535.     jr    nz,nameb1    ; Proceed if external fcb exists
  536.     pop    de        ; External fcb does not exist, so quit
  537.     ret
  538. ;
  539. ;  DE pts to FCB to build into, HL pts to token
  540. ;
  541. nameb1:
  542.     push    de        ; Save fcb ptr
  543.     ld    de,(lfcb)    ; Pt to local fcb
  544.     ld    a,0        ; Dir before du
  545.     call    zprsfn        ; Parse into local fcb
  546.     call    getwhl        ; Check wheel byte
  547.     jr    nz,nameb2    ; Continue with name build if wheel
  548. ;
  549. ;  User is not a wheel, so force all directory references to current dir
  550. ;
  551.     call    retud        ; Get current user in c
  552.     ld    hl,(lfcb)    ; Pt to fcb
  553.     ld    (hl),0        ; Set current disk
  554.     ld    de,13        ; Offset to user
  555.     add    hl,de
  556.     ld    (hl),c        ; Set current user into lfcb
  557. ;
  558. ;  Store FCB data into FCB
  559. ;
  560. nameb2:
  561.     pop    de        ; Get ptr to target fcb
  562.     ld    hl,(lfcb)    ; Pt to fcb
  563.     ld    bc,17        ; Copy 17 bytes
  564.     ldir
  565.     pop    de        ; Get ptr to next token
  566.     ret
  567. ;
  568. ;  Place copy routine in high memory
  569. ;  COM file runs from (SCRATCH) to DE
  570. ;
  571. copyset:
  572.     ld    hl,(scratch)    ; Get start
  573.     ex    de,hl
  574.     or    a        ; Clear carry
  575.     sbc    hl,de        ; Hl=hl-de=size of load
  576.     ld    (copy$count),hl    ; Set count in copy routine
  577.     ld    a,(tpaend)    ; Set de to location of copy routine
  578.     ld    d,a
  579.     ld    e,0        ; Page boundary
  580.     ld    hl,copy$code    ; Copy code
  581.     ld    bc,copy$size    ; Number of bytes
  582.     ldir            ; Place copy routine
  583.     ret
  584. ;  Copy routine - this will be placed in High Memory
  585. ;  The 2-byte values at COPY$STRT, COPY$DEST, COPY$COUNT
  586. ;  and COPY$TPA are set by COPYSET (above) and AUTOIN
  587.  
  588. copy$code:
  589.     ld    hl,(scratch)    ; Start address
  590.     ld    de,(cpytpa)    ; Destination address
  591.     push    de
  592.     ld    bc,(copy$count)    ; Number of bytes
  593.     ldir            ; Do copy
  594.     pop    hl
  595.     jp    (hl)
  596. copy$size equ    $-copy$code
  597.  
  598. ;
  599. ;  Abort with message if wheel byte required
  600. ;
  601.  
  602. no$whl:
  603.     call    eprint
  604.     db    'Wheel byte required', 0
  605.     ret
  606.  
  607. ;
  608. ;  Test for explicit library file reference
  609. ;
  610.  
  611. lbr$tst:
  612.     ld    a,(lbr$flg)
  613.     cp    '-'        ; was lbr name explicit ?
  614.     ret            ; zero flag set if explicit
  615.  
  616. ;
  617. ;  Locate Library File
  618. ;  On exit, A=0 if library file found
  619. ;
  620. find$lf:
  621.     ld    hl,libname    ; Parse library file name
  622.     ld    de,lud$fcb
  623.     ld    a,0        ; Dir before du
  624.     call    zprsfn
  625.     ld    de,lud$fcb+9    ; Set library file type
  626.     ld    hl,lbrtyp    ; Default file type
  627.     ld    bc,3        ; 3 bytes
  628.     ldir
  629. ;
  630. ;  SET SPECIFIED DIRECTORY AS DEFAULT
  631. ;
  632.     ld    de,lud$fcb    ; Pt to fcb
  633.     call    z3log        ; Log into it for default
  634. ;
  635. ;  LOOK INTO DIRECTORY PTED TO BY USER (OR CURRENT IF USER DID NOT SPEC ONE)
  636. ;
  637.     ld    de,lud$fcb    ; Pt to fcb
  638.     call    initfcb        ; Reset fcb
  639.     call    retud        ; Get home location
  640.     call    f$exist        ; Is file there?
  641.     jr    nz,find$lf2
  642. ;
  643. ;  LOOK ALONG PATH FROM CURRENT DIR (NOT INCLUDING CURRENT)
  644. ;
  645.     ld    de,lud$fcb    ; Pt to fcb
  646.     xor    a        ; Don't search current dir also
  647.     call    pfind        ; Search for file
  648.     jr    nz,find$lf2    ; File found, so process
  649. ;
  650. ;  FILE NOT FOUND
  651. ;
  652. find$lf1:
  653.     call    lbr$tst        ; Only print error message
  654.     jr    z,pr$nolbr
  655.     or    a
  656.     jr    nz,no$lbr    ; if last library search
  657. pr$nolbr:
  658.     call    eprint
  659.     db    ' Library File ',0
  660.     ld    de,lud$fcb+1    ; Print file name
  661.     call    pfn1
  662.     call    eprint
  663.     db    ' Not Found',0
  664. no$lbr:    or    0ffh        ; Error code
  665.     ret
  666.  
  667. ;
  668. ;  FILE FOUND
  669. ;
  670. find$lf2:
  671.     call    logud        ; Log into directory
  672.     ld    de,lud        ; Pt to lud
  673.     call    luinit        ; Read to use library
  674.     jr    nz,find$lf1    ; Error
  675.     ret
  676.  
  677. ;
  678. ;  LOAD COM FILE INTO MEMORY
  679. ;  ON EXIT, NZ IF OK and HL = NEXT BLOCK
  680. ;
  681. loadcom:
  682.     ld    de,argv1    ; Pt to command name string
  683.     ld    a,(de)        ; Get address in hl
  684.     ld    l,a
  685.     inc    de
  686.     ld    a,(de)
  687.     ld    h,a
  688.     ld    de,(lfcb)    ; Pt to fcb
  689.     ld    a,0        ; Dir before du
  690.     call    zprsfn        ; Parse into fcb
  691.     ld    hl,9        ; Set type of file to 'com'
  692.     add    hl,de
  693.     ld    de,comtyp    ; File type
  694.     ex    de,hl
  695.     ld    bc,3        ; 3 bytes
  696.     ldir
  697.     ld    de,lud        ; Pt to lud
  698.     ld    hl,(lfcb)    ; Pt to fcb
  699.     inc    hl        ; Pt to file name
  700.     call    luopen        ; Open file
  701.     ld    hl,(scratch)    ; Pt to buffer
  702.     jr    z,lcom        ; Load command if no error
  703.     call    getcst        ; Get Cmd. Status Flag
  704.     bit    2,a        ; Are we the ECP?
  705.     jr    nz,noprnt    ; Skip msg. if so
  706.     call    lbr$tst        ; Only print error message
  707.     jr    z,pr$nofil
  708.     or    a
  709.     jr    nz,noprnt    ; if last library search
  710.  
  711. pr$nofil:
  712.     call    eprint
  713.     db    ' File ',0
  714.     ld    de,(lfcb)    ; Pt to file name
  715.     inc    de
  716.     call    pfn1
  717.     call    eprint
  718.     db    ' Not Found in Library ',0
  719.     ld    de,lud$fcb+1    ; Pt to library file name
  720.     call    pfn1
  721. noprnt:    xor    a        ; Error
  722.     ret
  723. lcom:
  724.     call    setdma        ; Set dma address
  725.     ld    a,(tpaend)    ; Check against end page of tpa
  726.     cp    h        ; If at same page, yes
  727.     jr    z,lcomerror
  728.     ld    de,lud        ; Pt to lud
  729.     call    luread        ; Read block
  730.     ret    nz
  731.     ld    de,128        ; Pt to next block
  732.     add    hl,de
  733.     jr    lcom
  734. lcomerror:
  735.     call    eprint
  736.     db    ' Memory Full',0
  737.     ld    a,'-'
  738.     ld    (lbr$flg),a    ; Kill second lbr search
  739.     xor    a        ; Error code
  740.     ret
  741.  
  742. ;
  743. ;  Set DMA Address to that pted to by HL
  744. ;
  745. setdma:
  746.     push    hl        ; Save hl
  747.     ex    de,hl
  748.     ld    c,26        ; Set dma function
  749.     call    bdose
  750.     pop    hl        ; Restore hl
  751.     ret
  752.  
  753. ;
  754. ; SYSLIB Module Name: SARGV
  755. ; Author: Richard Conn
  756. ; SYSLIB Version Number: 3.6
  757. ; Module Version Number: 1.1
  758.  
  759. ;    public    argv
  760.  
  761. ;
  762. ;    ARGV is a UNIX-style ARGC/ARGV string parser.  It is passed
  763. ; a null-terminated string in HL and the address of a token pointer
  764. ; table in DE as follows:
  765. ;
  766. ;        LXI    H,STRING
  767. ;        LXI    D,ARGV$TABLE
  768. ;        MVI    A,0        ; do not mark token end
  769. ;        CALL    ARGV
  770. ;        JNZ    TOKEN$OVFL    ; indicates more tokens than allowed
  771. ;        ...
  772. ;    ARGV$TABLE:
  773. ;        DB    MAX$ENT ; max number of entries permitted
  774. ;        DS    1    ; number of entries stored by ARGV
  775. ;        DS    2    ; pointer to token 1
  776. ;        DS    2    ; pointer to token 2
  777. ;        ...
  778. ;        DS    2    ; pointer to token MAX$ENT
  779. ;
  780. ;    Tokens are delimited by spaces and tabs.
  781. ;    As well as '='.  27 Feb 86  jww
  782. ;    On input, if A=0, the end of each token is not marked with a null.
  783. ; If A<>0, a null is placed after the last byte of each token.
  784. ;    If all went well, return with A=0 and Zero Flag set.  If there
  785. ; are possibly more tokens than pointers, return with A=0FFH and NZ.
  786. ;
  787. argv:
  788.     push    bc    ; save regs
  789.     push    de
  790.     push    hl
  791.     ld    c,a    ; save mark flag
  792.     ex    de,hl
  793.     ld    b,(hl)    ; get max entry count
  794.     push    hl    ; save address of max entry count
  795.     inc    hl    ; pt to token count
  796.     inc    hl    ; pt to first pointer
  797. ;
  798. ; On each loop, DE = address of next char in string and HL = address of
  799. ; next pointer buffer; B = number of pointer buffers remaining and C =
  800. ; mark flag (0 = no mark)
  801. ;
  802. loop:
  803.     call    sksp    ; skip spaces and tabs in string pted to by DE
  804.     or    a    ; end of string?
  805.     jr    z,done
  806.     ld    (hl),e    ; store low
  807.     inc    hl
  808.     ld    (hl),d    ; store high
  809.     inc    hl
  810.     dec    b    ; count down
  811.     jr    z,loop2
  812.     call    sknsp    ; skip until end of token
  813.     or    a    ; done?
  814.     jr    z,done
  815.     ld    a,c    ; get mark flag
  816.     or    a    ; 0=no mark
  817.     jr    z,loop1
  818.     xor    a    ; mark with null
  819.     ld    (de),a    ; store null
  820.     inc    de    ; pt to next char
  821. loop1:
  822.     ld    a,b    ; check count
  823.     or    a
  824.     jr    nz,loop    ; continue on
  825. loop2:
  826.     call    sknsp    ; skip over token
  827.     call    sksp    ; any tokens left?
  828.     or    a
  829.     jr    z,done    ; none if EOL
  830.     or    0ffh    ; make A = 0FFH to indicate more to come
  831. done:
  832.     pop    hl    ; get address of max token count
  833.     push    af    ; save return flags
  834.     ld    a,(hl)    ; get max token count
  835.     sub    b    ; subtract counter
  836.     inc    hl    ; pt to return count
  837.     ld    (hl),a    ; set return count
  838.     pop    af    ; get return flag
  839.     pop    hl    ; restore regs
  840.     pop    de
  841.     pop    bc
  842.     ret
  843. ;
  844. ;  Skip over space or tab characters
  845. ;
  846. sksp:
  847.     ld    a,(de)    ; get char
  848.     and    7fh    ; mask
  849.     inc    de    ; pt to next
  850.     cp    ' '    ; continue if space
  851.     jr    z,sksp
  852.     cp    9    ; continue if tab
  853.     jr    z,sksp
  854.     dec    de    ; pt to character
  855.     ret
  856. ;
  857. ;  Skip over non-space and non-tab characters
  858. ;  Added '=' so that A:=B: construct yields two arguments.  v1.1  jww
  859. ;
  860. sknsp:
  861.     ld    a,(de)    ; get char
  862.     and    7fh    ; mask
  863.     ret    z        ; done if null
  864.     cp    ' '
  865.     ret    z        ; done if space
  866.     cp    9
  867.     ret    z        ; done if tab
  868.     cp    '='
  869.     ret    z    ; new delimiter
  870.     inc    de    ; pt to next
  871.     jr    sknsp
  872.  
  873. ;    end
  874. ;  End of argv inclusion
  875.  
  876. ;
  877. ;  Test print routine
  878. ;
  879.      if    test
  880.     ext    epstr,pafdc,bout,phl4hc
  881. testpr:
  882.     call    eprint
  883.     db    'External FCB: ',0
  884.     call    getefcb        ; Pt to external fcb
  885.     ex    de,hl
  886.     call    pfn
  887.     call    eprint
  888.     db    cr,lf,'    FCB1: ',0
  889.     ld    de,fcb1
  890.     call    pfn
  891.     call    eprint
  892.     db    cr,lf,'    FCB2: ',0
  893.     ld    de,fcb2
  894.     call    pfn
  895.     call    eprint
  896.     db    cr,lf,'    TBUFF: ',0
  897.     ld    hl,tbuff+1    ; Pt to it
  898.     call    epstr
  899.     call    eprint
  900.     db    cr,lf,'    LIBRARY NAME: ',0
  901.     ld    hl,libname
  902.     call    epstr
  903.     call    eprint
  904.     db    cr,lf,'PROGRAM START ADDRESS: ',0
  905.     ld    hl,(copy$strt)
  906.     call    phl4hc
  907.     call    eprint
  908.     db    cr,lf,'        SIZE:          ',0
  909.     ld    hl,(copy$count)
  910.     call    phl4hc
  911.     call    eprint
  912.     db    cr,lf,'COPY ROUTINE AT: ',0
  913.     ld    a,(tpaend)
  914.     ld    h,a
  915.     ld    l,0
  916.     call    phl4hc
  917.     ret
  918. pfn:
  919.     ld    a,(de)        ; Get disk
  920.     add    a,'@'        ; Convert to letter
  921.     call    bout
  922.     ld    hl,13        ; Offset to user
  923.     add    hl,de
  924.     ld    a,(hl)        ; Get user
  925.     call    pafdc        ; Print as floating
  926.     ld    a,':'
  927.     call    bout
  928.     inc    de        ; Pt to next
  929.     call    pfn1
  930.     ret
  931.      endif
  932. ;
  933. ;  Buffers
  934. ;
  935. lbrtyp:
  936.     db    'LBR'        ; Default lbr file type
  937. comtyp:
  938.     db    'COM'        ; Default com file type
  939.  
  940. ;    Data Area
  941.  
  942.     if    usedseg
  943.     dseg
  944.     endif
  945.  
  946. args:
  947.     ds    1        ; 4 allowed
  948. argc:
  949.     ds    1        ; Argument count
  950. argv1:
  951.     ds    2        ; First argument
  952. argv2:
  953.     ds    2*3        ; 3 more arguments
  954. ;
  955. lud:
  956.     ds    6        ; Dummy used by lu* routines
  957.     ds    11        ; Not of concern here
  958. lud$fcb:
  959.     ds    36        ; Fcb containing library file data
  960. ;
  961. tpaend:
  962.     ds    1        ; Top page of tpa
  963. gbuff:
  964.     ds    2        ; Command line save area
  965. lfcb:
  966.     ds    2        ; Local fcb
  967. cmdline:
  968.     ds    2        ; Saved command line buffer
  969. scratch:
  970.     ds    2        ; Free space start
  971. lbr$flg:
  972.     ds    1        ; library search mode flag
  973.  
  974. ;    For relocated COPY$CODE routine
  975. cpytpa:
  976.     ds    2        ; COMfile runtime origin
  977. copy$count:
  978.     ds    2        ; COMfile length in bytes
  979.  
  980.     end
  981.  
  982.