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 / ENTERPRS / CPM / UTILS / S / ZCNFG23.LBR / ZCNFG.ZY0 / ZCNFG.ZY0
Text File  |  2000-06-30  |  73KB  |  2,638 lines

  1. ;Program name: ZCNFG
  2.  
  3. ;ZCNFG is copyright by A. E. Hawley January, 1988.
  4. ;It may be freely distributed, but it must not be sold 
  5. ;either separately or as part of a package without the 
  6. ;written consent of the author.
  7. ;The author may be reached via electronic mail at the 
  8. ;Ladera Znode (Znode 2) in Los Angeles, 213-670-9465
  9.  
  10. ;ZCNFG is released for distribution through the Z-system 
  11. ;users group, ZSIG. Many Znodes include ZSIG releases
  12. ;among their programs available for download.
  13. ;Several such nodes are:
  14. ;    Znode 3,  Newton Centre, MA    617-965-7259
  15. ;    Znode 32  S.Plainfield, NJ    908-754-9067
  16. ;    Znode 45  Houston, TX        713-937-8886
  17.  
  18. ;See ZCNFG.HST for previous version data and changes.
  19.  
  20. VERS    EQU    2
  21. REV    EQU    3
  22. ;version date
  23. MONTH    EQU    02
  24. DAY    EQU    10
  25. YEAR    EQU    92
  26.  
  27. ;Program Function:
  28. ;General purpose configuration program. Loads the first block
  29. ;of program code, displays current option values, accepts
  30. ;interactive user option selections, overwrites the program
  31. ;block to make the changes permanent. A configuration data
  32. ;file for the target program must be available for loading by
  33. ;ZCNFG to provide MENU and HELP screens. See ZCNFG.HLP, ZCFG.HLP,
  34. ;ZCNFGMDL.Z80, ZCNFGOVL.DOC, and ZCNFGCFG.LBR.
  35.  
  36. ;ASSEMBLY & LINK with ZMAC/ZML
  37. ;    ZMAC ZCNFG;ZMAC CFGSUBS
  38. ;    ZML ZCNFG,CFGSUBS
  39. ;link note: .request statements in ZCNFG cause the
  40. ; following REL libraries to be appended to the link
  41. ; list:        CFGLIB/, VLIB/, Z3LIB/, SYSLIB/
  42. ;If you are using a linker which does not support the
  43. ;.request statement, you must include these files in
  44. ;the link list as libraries to search in the above order.
  45.  
  46. ;References in CFGSUBS
  47.     EXT    B2BCD,CLSFIL,CIN,CONIN,COUT,COUTB,CRLF
  48.     EXT    DEF_FT,DEF_DU,DEF_FN,OPNFIL,ISTXTF,ISFNC
  49.     EXT    RANGE,RDFILE,RDREC,RELOC,RELOCL,STORDT,STRCPY
  50.     EXT    HLINE,TYPLIN,WRREC,VCOUT,MOVE2Z,SKIP2Z
  51.  
  52. ;References in CFGLIB
  53.     .REQUEST CFGLIB
  54.     EXT    DUSCN,FILL,FNAME,INIFCB,MPY16,NTSPCS,PKGOFF
  55.     EXT    PUTZDU,PUTZFN,PUTZFS,RJIP,SDELM,SKSP,UCASE
  56.  
  57. ;from VLIB
  58.     .REQUEST VLIB
  59.     EXT    CLS,GZ3INIT,TINIT,DINIT,AT
  60.  
  61. ;from Z3LIB
  62.     .REQUEST Z3LIB
  63.     EXT    GETCRT,GETEFCB
  64.  
  65. ;from SYSLIB
  66.     .REQUEST SYSLIB
  67.     EXT    BBLINE,MA2HC,MADC,MAFDC,MHL4HC,MHLDC
  68.     EXT    PA2HC,PHL4HC,PHLFDC,ISPRINT,ISALNUM
  69.     EXT    RETUD,LOGUD,LUINIT,LUOPEN,LUREAD
  70.     EXT    SETDMA,COMPB,@FNCMP,SUA
  71.     EXT    ISDIGIT,EVAL10,EVAL16
  72.  
  73. ;For use by other modules
  74.     PUBLIC    Z3ENV,DEFDU,COLCNT,ROWCNT,QUIT
  75.     PUBLIC    UCFLAG,Z3ENVF,RELOCC,RELFLG,NCRECS
  76.     PUBLIC    TGTBUF,BADOVL,GZ3FLG
  77.  
  78. ;For use by the linker
  79.     PUBLIC    $MEMRY
  80.  
  81. ;For use during debug
  82.     public begin,signon,init,help,quit,pgmini,badfil
  83.     public filinit,exit,assist,menlst
  84.     public simage,castbl,hlpscr,offset,cfgd,s_addr,s_list
  85.     public ctsrch,ctlcs0,hlpmsg,stack
  86.     public mnuhlp,sndhlp,sndh_1,ps_eos
  87.     public gt_cfg,ovrlay,scr_ld,scr_l0
  88.     public tgtcfg,namchk,ovlusr,ovlfcb,ovlfn
  89.     public testid,TGTUSR,tgtfcb,tmpusr,tmpfcb
  90.     public gotolm,gotonm,ldmenl,mnadj,mnumb,lmnumb
  91.     public menu0,cmenu,newmnu,reload
  92.     public in_fn0,in_fn1,in_fn2,in_fn3,in_fn4
  93.     public in_fn5,infn5,in_fn6,in_fn7,in_fn8
  94.     public ld_fn0,ld_fn1,ldfn1,ld_fn2,ld_fn3,ld_fn4
  95.     public ld_fn5,ld_fn6,ld_fn7,ld_fn8
  96.     public lud,ludfil,ludfcb,ludfn,lbrini
  97.     public xltadu,xlt1,xlt2,xlt3,xlt4,xlterr
  98.     public in_fn9,hotkey,hotmsg,ld_fn9,ldfn9,xascii
  99.     public deldat,spcdat,chrdat,ctldat
  100.  
  101. ;define program constants and data locations
  102.  
  103. ;----------------------
  104. ;system addresses
  105. FCB    EQU    5CH
  106. TBUF    EQU    80H        ;SYSTEM BUFFER
  107. CREC    EQU    20H        ;offset to Current Record in an FCB
  108.  
  109. ;----------------------
  110. ;offsets in the first page of the target program.
  111. ;A 256-byte page is read in from the program to a
  112. ;buffer which starts at TGTBUF:.
  113.  
  114. Z3MOFF    EQU    03H        ;'Z3ENV' identifies ZCPR3x Utility
  115. ENVTYP    EQU    08H        ;Z3 environment type byte
  116. Z3EOFF    EQU    09H        ;Z3 environment address
  117. FIDOFF    EQU    0DH        ;program identifier, like 'ZCNFG'
  118. ;Target program-specific offsets are defined in the programs
  119. ;overlay file.
  120.  
  121. IDLEN    EQU    5    ;length of 'Z3ENV' string (NOT an offset)
  122.  
  123. ;----------------------
  124. ;ASCII definitions
  125. CTLC    EQU    3
  126. BS    EQU    8        ;backspace
  127. HT    EQU    9        ;horizontal tab
  128. LF    EQU    10        ;line feed
  129. CR    EQU    13        ;carriage return
  130. ESC    EQU    1BH        ;escape key char
  131. SPC    EQU    20H        ;space char
  132. DEL    EQU    7FH        ;DEL char
  133. DIM    EQU    1        ;highlight on
  134. BRIGHT    EQU    2        ;highlight off
  135.  
  136. ;----------------------
  137. ;    MACROS
  138.  
  139. ;load bc indirect at hl
  140. LDBCHL    MACRO
  141.     LD    C,(HL)
  142.     INC    HL
  143.     LD    B,(HL)
  144.     INC    HL
  145.     ENDM
  146.  
  147. ;load de indirect at hl
  148. LDDEHL    MACRO
  149.     LD    E,(HL)
  150.     INC    HL
  151.     LD    D,(HL)
  152.     INC    HL
  153.     ENDM
  154.  
  155. ;load hl indirect at hl
  156. LDHLHL    MACRO
  157.     LD    A,(HL)
  158.     INC    HL
  159.     LD    H,(HL)
  160.     LD    L,A
  161.     ENDM
  162.  
  163.     .SBTTL MAIN ROUTINE
  164.     PAGE
  165. ;=========================================================
  166. ;    START OF PROGRAM CODE
  167. ;=========================================================
  168.  
  169. ZCNFG:    JP    BEGIN
  170. Z3MARK:    DB    'Z3ENV'        ;identifies program as ZCPR3x utility
  171.     DB    1        ;external environment
  172. Z3ENV:    DW    0        ;this address set by Z3INS or ZCPR33/4
  173.     DW    ZCNFG        ;compatible with type 4 enviroment
  174. ;configuration block for THIS program. ZCNFG can
  175. ;alter is own default parameters.
  176. CNFGID:    DB    'ZCNFG'        ;ID string, null terminated
  177.     DB    VERS+'0',REV+'0'
  178.     DS    2,0        ;total: 8 bytes + null terminator
  179.                 ; plus $ or null terminator
  180. VSNSTR:    DS    3        ;room for 3 ascii digit version number
  181. ALTUSR:    DB    -1        ;-1 = search default user
  182. ALTDRV:    DB    -1        ;-1 = search default drive
  183.  
  184. TGTTYP:    DB    'COM'        ;default tgt file type
  185. OVLTYP:    DB    'CFG'        ;default configuration data file type
  186.  
  187. SCRNLN:    DB    24        ;lines per screen
  188. Z3INST:    DB    0        ;install z3env in target if true
  189.  
  190. CLBRFN:    DB    'CONFIG  '    ;CFG library NAME
  191. CLBRFT:    DB    'LBR'        ;..and TYPE
  192. ZCOPT0:    DB    0FFh        ;default is target file DU if FALSE
  193.                 ;..and logged DU if TRUE
  194.  
  195. ;=========================================================
  196. ;=========================================================
  197.  
  198. BEGIN:    LD    (STACK),SP    ;save system stack pointer
  199.     LD    SP,STACK    ;set up local stack
  200.     CALL    INIT        ;set current du, Test for Z3
  201.     LD    DE,SIGNON
  202.     CALL    TYPLIN
  203.     CALL    HELP        ;provide help if requested & quit
  204.     CALL    PGMINI        ;Get file spec from FCB, open file
  205.                 ;abort with message if bad file spec
  206.     CALL    FILINIT        ;identify & load the overlay file
  207.     CALL    SCR_LD        ;load screen image(s)
  208.     JP    C,BADCFG    ;first byte not RST 0 or RET
  209.  
  210. ;select & set options interactively
  211. ;display the screen and the user prompt
  212. ;This is a loop whose exit is one of the cases
  213. SETOPT:    CALL    Z3CLS        ;clear screen
  214.     LD    DE,(SIMAGE)    ;-> screen image
  215.     CALL    TYPLIN        ;display the screen
  216. ;provide a CR,LF if there was none in the screen
  217.     DEC    DE
  218.     DEC    DE        ;->last screen char
  219.     LD    A,(DE)
  220.     CP    LF
  221.     CALL    NZ,CRLF        ;supply missing crlf
  222. DOPRMT:    LD    A,(Z3ENVF)
  223.     OR    A
  224.     JR    Z,NOT1Z3
  225.     CALL    AT
  226. ATPRPT:    DB    19,1        ;prompt near screen bottom
  227. NOT1Z3:
  228.     LD    B,28
  229.     CALL    HLINE
  230.     LD    DE,ZMENU0    ;' ZCNFG COMMANDS '
  231.     CALL    TYPLIN
  232.     LD    B,28
  233.     CALL    HLINE
  234.     LD    DE,ZMENU1    ;-> prompt line(s)
  235.     CALL    TYPLIN
  236.  
  237. ;get user input. Make changes as requested, update the
  238. ;screen image and the configuration block.
  239. GETINP:    CALL    CONIN        ;wait for & get user input
  240.     CALL    UCASE        ;make upper case
  241.     CALL    ISPRINT        ;printable character?
  242.     CALL    Z,COUT        ;echo it if so
  243.     LD    HL,(CASTBL)    ;->case table
  244.     CALL    MCASE        ;do case, ret to here if no exit
  245.     JR    C,NUPRMP
  246.     CALL    MARKER        ;Mark changed & update screen image
  247.     JR    SETOPT        ;redisplay screen & prompt after update
  248.  
  249. ;erase the prompt line
  250. NUPRMP:    LD    A,CR
  251.     CALL    COUT
  252.     LD    B,75
  253. ..ERA:    LD    A,SPC
  254.     CALL    COUT
  255.     DJNZ    ..ERA
  256.     LD    A,CR
  257.     CALL    COUT
  258.     JR    DOPRMT        ;get a new prompt
  259.  
  260.     .SBTTL MENU MANAGEMENT
  261.     PAGE
  262. ;=========================================================
  263. ;    MENU MANAGEMENT
  264. ;=========================================================
  265.  
  266.     DSEG
  267. menlst:
  268. ;data which defines the current menu environment
  269. ;used by setopt. Changed by menu commands.
  270. ;Loaded initially by pgmini routine.
  271.  
  272. LASTM:    DS    2        ;->previous menu list
  273. NEXTM:    DS    2        ;->next menu list
  274. SIMAGE:    DS    2        ;->screen image
  275. CASTBL:    DS    2        ;->case table
  276. HLPSCR:    DS    2        ;->help screen
  277. EMENLST:        ;for calc list length
  278.  
  279. ;MENU Environments - lastm,nextm,simage,castbl,hlpscr
  280. ;An instance of this 10 byte data structure occurs in
  281. ;in the overlay for each menu data item. The objects
  282. ;addressed are all located in the overlay. There is an
  283. ;overlay for each configuration target (like ZFILER, e.g.)
  284.  
  285. ;=========================================================
  286.  
  287. ;standard data block holds parameters for the current
  288. ;menu item. This data is copied from the case table
  289. ;and relocated each time a menu item is selected.
  290.  
  291. OFFSET:    DS    2        ;->config block data to modify
  292. CFGD:    DS    1        ;data used by function routine
  293. S_ADDR:    DS    2        ;->screen location for this menu item
  294. S_LIST:    DS    2        ;->data structure (alt. screen data, e.g)
  295.  
  296. ;=========================================================
  297.  
  298.     CSEG
  299.  
  300. ;Table of function routines accessed via MCASE, MAPPER
  301. ;The function# is an entry in every record of the case table.
  302. ;The init entry points are indirectly referenced through
  303. ;their positional relation to the update entries.
  304.  
  305. ;        update    init    function#, name, & use
  306. FNTBLE:
  307.     DW    IN_FN0,    LD_FN0    ;0 switch, toggle a bit in a byte
  308.     DW    IN_FN1,    LD_FN1    ;1 text,   change text string, length n
  309.     DW    IN_FN2,    LD_FN2    ;2 duspec, change default drive/user
  310.     DW    IN_FN3,    LD_FN3    ;3 hexrad, change a byte or word,
  311.                 ; HEX radix
  312.     DW    IN_FN4,    LD_FN4    ;4 decrad, change a byte or word,
  313.                 ; DECimal radix
  314.     DW    IN_FN5,    LD_FN5    ;5 textlc, change text, LCase OK, length n
  315.     DW    IN_FN6, LD_FN6    ;6 filesp, change all or part
  316.                 ; of Z3-filespec
  317.     DW    IN_FN7,    LD_FN7    ;7 togl3,  toggle among 001B, 010B, 100B
  318.     DW    IN_FN8,    LD_FN8    ;8 togltf, toggle a byte true/false (-1/0)
  319.     DW    IN_FN9,    LD_FN9    ;9 asciic, change ascii byte from keyboard
  320. FNTBLX:        ;used for error checking on function # range
  321.                       
  322. ;=========================================================
  323.     PAGE
  324.  
  325. MCASE:
  326. ;searches a case table for a match with the byte in A
  327. ;If found, jumps to the associated function routine.
  328. ;if not found, searches the built-in menu/control case
  329. ;table, the last entry for which is a default routine which
  330. ;is unconditionally executed for an unrecognized command.
  331.  
  332. ;The case table structure is
  333. ;    db    n    ;n = number of entries in list
  334. ;    db    m    ;m = number of bytes per rcrd
  335. ;there are n records in the case table in addition to the default
  336. ;rcrd:    db    <srch char>
  337. ;    ds    2    ;target address for routine to execute
  338. ;    ds    m-3    ;data bytes passed to the routine
  339.  
  340. ;entry-
  341. ;    A  = char to match for case selection
  342. ;    HL -> 'case' table
  343. ;Jump to Target routine with
  344. ;    HL -> parameter list (if any)
  345. ;    DE = Number of bytes in parm list
  346. ;    BC = Target routine address
  347.  
  348.     CALL    CTSRCH        ;search the case table for identifier
  349.     JR    NC,RFND        ;jump if found,
  350.     LD    HL,CTLCS0    ;..else -> built in command table
  351.     CALL    CTSRCH        ;search for control command
  352. RFND:    INC    HL        ;->target address
  353.     DEC    DE        ;bytes remaining
  354.     LD    C,(HL)
  355.     INC    HL
  356.     DEC    DE        ;bytes remaining
  357.     LD    B,(HL)        ;bc contains target routine addr
  358.     INC    HL        ;->balance of parameter list
  359.     INC    B
  360.     DEC    B        ;if high byte is 0, this is a
  361.     CALL    Z,FNXLT        ;function number to translate
  362.     PUSH    BC        ;and set up for indirect jump
  363. ;if e=0, then there are no parameters, so avoid
  364. ;the parameter block load in that case.
  365.     DEC    E        ;bytes left in record (parameters)
  366.     RET    Z        ;really a jump to (BC)
  367. ;transfer case parameters to standard parameter block
  368.     LD    B,D
  369.     LD    C,E
  370.     LD    DE,OFFSET
  371.     LDIR
  372.     RET            ;jump to service routine
  373.  
  374. ;=========================================================
  375.     PAGE
  376. ;=========================================================
  377.  
  378. CTSRCH:
  379. ;search a case table for a record whose key
  380. ;is specified.
  381. ;entry-     A = key
  382. ;exit-    DE = record length
  383. ;  if found
  384. ;    HL -> record
  385. ;    flags = Z,NC
  386. ;  if not found
  387. ;    HL = address following last entry
  388. ;    flags = C,NZ
  389.  
  390. ;A default case entry (pointing to BADCMD:)
  391. ;follows the internal case table at CTLCS0:
  392. ;for execution when no matching key is found.
  393.  
  394.     LD    B,(HL)        ;number of entries in table
  395.     INC    HL
  396.     LD    E,(HL)        ;entry length in de (>=2)
  397.     INC    HL        ;->first record
  398.     LD    D,0
  399.     LD    C,A
  400. TSLOOP:    LD    A,(HL)        ;is this the desired record?
  401.     CALL    UCASE
  402.     CP    C
  403.     RET    Z        ;..ret NC if so
  404.     ADD    HL,DE        ;->next record
  405.     DJNZ    TSLOOP        ;repeat up to B times
  406.     LD    A,C        ;recover search char
  407. CRNTRY:    SCF            ;nothing found if CY set
  408.     RET            ;hl -> addr AFTER last table entry
  409.  
  410. ;--------------------------------------------
  411.  
  412. ;Indexing routine to convert function numbers
  413. ;to subroutine addresses for MCASE and MAPPER
  414. ;MCASE uses the first address in each table entry,
  415. ;MAPPER uses the second for screen initialization.
  416.  
  417. ;entry-
  418. ;    BC = function number
  419. ;exit-
  420. ;    HL, DE are preserved
  421. ;    BC = routine address
  422.  
  423. FNXLTI:    PUSH    HL        ;entry for MAPPER
  424.     LD    HL,(FNTBLX-FNTBLE)/4 - 1
  425.     OR    A
  426.     SBC    HL,BC        ;function # out of range?
  427.     JP    C,BADOVL    ;oops, if so. CFG file error.
  428.  
  429.     LD    HL,FNTBLE+2    ;use second addr for init
  430.     JR    FNXLT0
  431.  
  432. FNXLT:    PUSH    HL        ;entry for MCASE
  433.     LD    HL,FNTBLE    ;uses first address
  434. FNXLT0:    ADD    HL,BC        ;index to proper function addr
  435.     ADD    HL,BC        ;..4 bytes per function
  436.     ADD    HL,BC
  437.     ADD    HL,BC
  438.     LD    C,(HL)
  439.     INC    HL
  440.     LD    B,(HL)        ;routine addr in BC
  441.     POP    HL
  442.     RET
  443.  
  444. ;=========================================================
  445.  
  446.     .SBTTL CONTROL ROUTINES
  447.     PAGE
  448. ;=========================================================
  449. ;  CONTROL ROUTINES EXECUTED FROM MCASE CALLS
  450. ;=========================================================
  451.  
  452. GOTOLM:    LD    HL,(LASTM)    ;get previous menu
  453.     LD    E,-1        ;decrement menu number
  454.     JR    NEWMNU
  455.  
  456. GOTONM:    LD    HL,(NEXTM)    ;Get next menu
  457.     LD    E,1        ;increment menu number
  458.  
  459. NEWMNU:    CALL    MNADJ        ;track the menu number
  460.     LD    A,(UPDFLG)    ;update all screen
  461.     OR    A        ;images if required.
  462.     JP    NZ,RELOAD
  463.  
  464. ;load the new menu descriptor at (HL)
  465. LDMENL:    LD    (CMENU),HL    ;new current menu source
  466.     LD    DE,MENLST
  467.     LD    BC,EMENLST-MENLST
  468.     LDIR
  469.     XOR    A
  470.     RET
  471.  
  472. MNADJ:    LD    A,(LMNUMB)
  473.     LD    D,A
  474.     LD    A,(MNUMB)
  475.     ADD    E        ;inc or dec, depending on E
  476.     CP    -1        ;going from menu0 to last menu?
  477.     JR    Z,SETLMN
  478.     CP    D        ;going from last menu to menu0?
  479.     JR    Z,MNADJX    ;no, if z
  480.     JR    C,MNADJX    ;no, if c
  481.     LD    D,0        ;..else yes, set menu0
  482. SETLMN:    LD    A,D        ;d contains next menu number
  483. MNADJX:    LD    (MNUMB),A    ;new current menu number
  484.     OR    A
  485.     RET
  486.  
  487. ;=========================================================
  488.  
  489. BADCMD:
  490. ;This is the default routine when mcase cannot
  491. ;find the command letter in its case table or
  492. ;in the built-in menu/control case table.
  493.  
  494.     LD    DE,BADMSG
  495.     CALL    TYPLIN
  496.     POP    HL        ;dump return addr
  497.     JP    GETINP        ;get new input
  498.  
  499. ;=========================================================
  500.  
  501. ;Normal exit after changes are made and need to be
  502. ;saved. Assumes that tgtbuf has been updated before 
  503. ;writing the first block back to the file.
  504.  
  505. EXIT:    LD    A,(Z3INST)
  506.     OR    A        ;allow Z3 installation?
  507.     JR    Z,EXIT1        ;no, if logical false
  508.     LD    HL,(Z3ENV)    ;install current ENV address
  509.     LD    (TGTBUF+Z3EOFF),HL
  510.  
  511. EXIT1:    LD    A,(FCB_CR)    ;set current record for writing
  512.     LD    (TGTFCB+CREC),A    ;back the configuration block
  513.  
  514.     LD    A,(TGTUSR)    ;make sure CP/M+ knows the user
  515.     CALL    SUA        ;(Drive is automatic, from FCB)
  516.  
  517.     LD    HL,TGTBUF
  518.     CALL    SETDMA
  519.     LD    DE,TGTFCB    ;fcb pointer
  520.     CALL    WRREC
  521.     LD    HL,TGTBUF+80H
  522.     CALL    SETDMA
  523.     LD    A,(NCRECS)    ;length of config block, records
  524.     DEC    A
  525.     CALL    NZ,WRREC    ;write second record if present
  526.     CALL    CLSFIL        ;close the file
  527.     CALL    Z3CLS        ;clear the screen
  528.  
  529. ;=========================================================
  530.  
  531. QUIT:
  532. ;Here to exit without saving current changes. This is
  533. ;effectively an abort. Assumes that the saved stack pointer
  534. ;points to a safe execution address. This is the case when
  535. ;the program is executed as a normal .com file.
  536.     LD    A,(Z3ENVF)
  537.     OR    A
  538.     CALL    NZ,DINIT    ;deinit terminal
  539.     LD    SP,(STACK)
  540.     RET
  541.  
  542. ;=========================================================
  543.  
  544. CMDHLP:
  545. ;Display the internal command information screen.
  546.     CALL    Z3CLS        ;Start with clean screen
  547.     LD    HL,CMDMSG
  548.     JR    SNDH_3
  549.  
  550. ;=========================================================
  551.  
  552. MNUHLP:
  553. ;Display the information screen in response to '/'
  554. ;entered at the menu level.
  555.  
  556.     LD    HL,(HLPSCR)
  557.     LD    A,H
  558.     OR    L        ;a zero entry?
  559.     RET    Z        ;ret if help screen not there.
  560.  
  561.     CALL    Z3CLS        ;clear screen if possible
  562.  
  563. SNDHLP:
  564. ;send text to the screen with prompted pageing
  565. ;entry- HL-> null terminated message
  566.  
  567.     LD    A,(HL)
  568.     CP    ':'
  569.     JR    NZ,SNDH_3
  570.     INC    HL        ;ignore leading colon
  571.     JR    SNDH_3        ;at start of the block
  572.  
  573. ;sndh_1 sends a line of text, starting a
  574. ;new screen page if the first char is a
  575. ;colon or formfeed, or if the screen is full.
  576. SNDH_1:    LD    A,(HL)
  577.     INC    HL        ;ready for next
  578.     CALL    C,NEWPAGE    ;new screen required?
  579.     JR    C,SNDH_2    ;yes, if Cy set
  580.     OR    A        ;if terminator,
  581.     JR    Z,PS_EOS    ;..then quit
  582.     CALL    VCOUT        ;else send the byte
  583.     CP    LF
  584.     JR    NZ,SNDH_1    ;continue if not lf
  585.     SCF            ;show LF sent
  586.     DJNZ    SNDH_1        ;else count & continue if not eos
  587.  
  588. SNDH_2:    CALL    PS_EOS        ;pause at End Of Screen
  589.     CP    CTLC        ;control-c?
  590.     RET    Z        ;abort help if so
  591.  
  592. SNDH_3:    LD    A,(SCRNLN)    ;lines per screen
  593.     SUB    2        ;allow for prompt line
  594.     LD    B,A
  595.     JR    SNDH_1        ;do another screen until 0
  596.  
  597. PS_EOS:    LD    A,(Z3ENVF)
  598.     OR    A
  599.     JR    Z,HPAUSE    ;skip screen stuff if not Z3
  600.     CALL    AT        ;position cursor
  601. HLPAT:    DB    24,1        ;row,column (home=1,1)
  602.  
  603. HPAUSE:    LD    DE,PSEMSG    ;'SAK' message + CR
  604.     CALL    TYPLIN        ;send it
  605. HPAUSL:    CALL    CONIN        ;wait for, get any char
  606.  
  607. Z3CLS:    PUSH    AF        ;save the char for caller
  608.     PUSH    HL        ;preserve source pointer
  609.     LD    A,(Z3ENVF)
  610.     OR    A
  611.     CALL    NZ,CLS        ;home & clear scren
  612.     LD    HL,ROWCNT
  613.     LD    (HL),0        ;reseet line counter
  614.     POP    HL
  615.     POP    AF
  616.     OR    A        ;clear flags
  617.     RET
  618.  
  619. NEWPAGE:
  620.     CP    ':'        ;leading colon?
  621.     JR    Z,NEWP_2    ;new page if so
  622.     CP    'L'-'@'        ;formfeed?
  623.     JR    Z,NEWP_2    ;new page if so
  624.     OR    A        ;reset carry
  625.     RET            ;NOT a new page
  626.  
  627. NEWP_2:    LD    A,(Z3ENVF)
  628.     OR    A        ;using ZCPR3?
  629.     SCF
  630.     RET    NZ        ;yes, cursor will be positioned,
  631.     LD    A,LF        ;else scroll to bottom of screen
  632. NEWP_3:    CALL    VCOUT
  633.     DJNZ    NEWP_3
  634.     SCF            ;signal for prompt
  635.     RET
  636.  
  637. ;=========================================================
  638.  
  639.     .SBTTL USER FUNCTION ROUTINES
  640.     PAGE
  641. ;=========================================================
  642. ;  FUNCTION ROUTINES EXECUTED FROM MCASE & MAPPER
  643. ;=========================================================
  644.  
  645. ;    FUNCTION 0 - TOGGLE A SINGLE BIT MAPPED OPTION
  646.  
  647. IN_FN0:
  648. ;toggles the bit defined by (cfgd) in the byte
  649. ;at (offset), then toggles the screen image at
  650. ;(s_addr) using the two member list at (s_list)
  651.  
  652. ;entry-    HL -> parameter list
  653. ;exit-    all registers undefined
  654.  
  655.     LD    HL,(OFFSET)    ;config byte address
  656.     LD    A,(CFGD)    ;bit mask
  657.     LD    C,A        ;save bit mask in c
  658.     XOR    A,(HL)        ;toggle config byte into A
  659.     LD    (HL),A        ;and put it back
  660.     XOR    A        ;NC for update made
  661.     RET
  662.  
  663. LD_FN0:                ;entry for initial screen load
  664. ;deposit one of two strings in the screen image,
  665. ;The choice of string is based on the value of
  666. ;the bit specified by the bit mask.
  667.  
  668.     LD    HL,(S_LIST)
  669.     LD    A,H
  670.     OR    L
  671.     JP    Z,BADOVL    ;error if no list
  672.  
  673.     LD    HL,(OFFSET)    ;config byte address
  674.     LD    A,(CFGD)    ;bit mask
  675.     AND    (HL)        ;isolate configuration bit
  676.  
  677. TOGL0:                ;shared with initialization
  678. ;on entry, A is zero except for one bit position
  679. ;which is significant. Z flag is set according to
  680. ;the contents of that bit.
  681.     LD    DE,(S_ADDR)
  682.     LD    HL,(S_LIST)    ;hl -> screen data pair
  683.     CALL    Z,SKIP2Z    ;skip first data element if false
  684.     JP    MOVE2Z        ;copy to screen image
  685.  
  686. ;=========================================================
  687.  
  688. ;    FUNCTION 1 - PROCESS ASCII STRING
  689.  
  690. IN_FN1:
  691. ;get (cfgd) characters from the console. Deposit them in
  692. ;the configuration block at (offset) and in the screen image
  693. ;at (s_addr). If the entry is null (only a CR), then
  694. ;nothing is done.
  695. ;user input is capitalized (LC is lost)
  696.     LD    A,1        ;specify caps 
  697.  
  698. INFN5:    LD    HL,ERRCTL    ;->error test level byte
  699.     OR    (HL)
  700.     AND    81H        ;use bits 0 & 7
  701.     LD    (UCFLAG),A    ;save HBS & caps flags
  702.     LD    A,(CFGD)    ;put field size in prompt
  703.     LD    DE,FTMSG1
  704.     CALL    MAFDC
  705.     LD    DE,FTMSG
  706.     CALL    TYPLIN        ;ask for new string
  707.  
  708.     LD    A,(UCFLAG)    ;caps/nocaps flag
  709.     RRA            ;propagate bit 0
  710.     SBC    A,A        ;  through all 8 bits of A
  711.     CALL    BBLINE        ;get user string, RET HL->string
  712.     OR    A        ;A=string length, incl spaces
  713.     SCF
  714.     RET    Z        ;ignore empty string
  715. ;if string is longer than field, truncate it
  716.     LD    C,A        ;actual str length, incl leading spc
  717.     LD    A,(CFGD)    ;Max length allowed
  718.     SUB    C
  719.     JR    NC,INFN51    ;NC = .LE. max len
  720.     ADD    C        ;recover max len
  721.     LD    C,A        ;truncate the string
  722.     XOR    A        ;0 unused space
  723. ;copy string from bbline buffer to cnfg block
  724. INFN51:    LD    B,A        ;trailing unused space
  725.     PUSH    BC
  726.     LD    DE,(OFFSET)
  727.     LD    B,C
  728. INFN52:    LD    A,(DE)        ;get dest byte
  729.     AND    1 SHL 7        ;preserve high bit
  730.     OR    (HL)        ;add in low 7 bits of ASCII
  731.     LD    (DE),A        ;update destination
  732.     INC    HL
  733.     INC    DE
  734.     DJNZ    INFN52
  735.     POP    BC        ;B=unused, C=string length
  736.  
  737.     LD    hl,(S_LIST)    ;get current string terminator
  738.     LD    A,H
  739.     OR    L
  740.     LD    A,(HL)        ;possible terminator
  741.     JR    NZ,NOTERM    ;no terminator if Z
  742.     LD    A,SPC        ;use default space fill
  743. NOTERM:    LD    H,A        ;save for istxtf
  744.     INC    B
  745.     DEC    B        ;any empty space in field?
  746.     CALL    NZ,FILL        ;fill remainder of field
  747.     XOR    A        ;ret NC to cause screen update
  748.     RET
  749.  
  750. ;-------------------------
  751.  
  752. ;Initial error check of string in CFG block.
  753. ;If no error, then copy string to screen image.
  754. ;CALLed from MAPPER
  755.  
  756. LD_FN1:    LD    A,1        ;FN 1 - string is all caps
  757.     JR    LDFN1
  758.  
  759. LD_FN5:    XOR    A        ;FN 5 - both UC and LC
  760.  
  761. LDFN1:    LD    HL,ERRCTL    ;->error test level byte
  762.     OR    (HL)
  763.     AND    81H        ;use bits 0 & 7
  764.     LD    (UCFLAG),A
  765.     LD    A,(CFGD)    ;MAX number of bytes
  766.     OR    A
  767.     JP    Z,BADOVL    ;0 length field must be an error
  768.     BIT    7,A
  769.     JP    NZ,BADOVL    ;>128 byte field must be error
  770.     LD    B,A
  771.  
  772.     LD    HL,(S_LIST)
  773.     LD    A,H
  774.     OR    L
  775.     LD    A,(HL)        ;possible string terminator
  776.     JR    NZ,LDFN2    ;NZ = actual terminator
  777.     LD    A,SPC        ; else use space as default
  778. LDFN2:    LD    HL,(OFFSET)    ;HL ->config data
  779. ;compute string length, test for illegal characters
  780.     CALL    ISTXTF
  781.     JP    C,BADOVL    ;C = ERROR, nonprinting char found
  782.  
  783. ;transfer a string of text from the
  784. ;configuration block to the screen image.
  785. ;entry-    HL -> string in CFG block
  786. ;     B = trailing unused bytes in string field
  787. ;     C = length of the string, incl leading spc
  788. ;     D = number of leading spaces
  789. ;     E = trailing fill byte (terminator)
  790.  
  791. LDTXT:    LD    DE,(S_ADDR)    ;DE ->screen location
  792.     INC    C
  793.     DEC    C
  794.     JR    Z,LDTXT2    ;don't try to move 0 len str!
  795.     PUSH    BC        ;save for fill after string
  796.     LD    B,0
  797.     LDIR            ;transfer string to screen
  798.     POP    BC
  799.  
  800. LDTXT2:    INC    B        ;trailing spaces
  801.     DEC    B
  802.     LD    A,SPC
  803.     CALL    NZ,FILL        ;trailing spaces fill screen field
  804.     RET
  805.     
  806. ;=========================================================
  807. ;    FUNCTION 2 - UPDATE A DU SPEC WITH ALTDU WILDCARD
  808.  
  809. IN_FN2:
  810. ; Transfer a DU spec from bbline input to screen image, left
  811. ; justified in a field of 3. Error if illegal DU.
  812. ; Nothing done for a null string entry.
  813.  
  814. ;get the new DU from the user
  815.     LD    DE,DUMSG    ;-> prompt msg
  816.     CALL    TYPLIN        ;send user prompt
  817.     LD    DE,DUMSG1    ;include '?' if 1-based drive code
  818.     LD    A,(CFGD)    ;get flag byte
  819.     OR    A        ;is it 1-based?
  820.     CALL    NZ,TYPLIN    ;if so, send '?' default msg
  821.     LD    DE,PRMPT1
  822.     CALL    TYPLIN        ;finish the prompt
  823.  
  824.     LD    A,-1        ;capitalize user input
  825.     CALL    BBLINE        ;get DU token from user
  826.     OR    A
  827.     SCF
  828.     RET    Z        ;do nothing if null entry
  829.     CALL    XLTADU        ;translate ascii to D,U in BC
  830.     RET    C
  831. ;transfer the new DU to the config block
  832.     LD    HL,(OFFSET)    ;->user/drive in config block
  833.     LD    (HL),C        ;store User
  834.     INC    HL
  835.     LD    (HL),B        ;..and the Drive
  836.     XOR    A        ;ret NC to cause screen update
  837.     RET
  838.  
  839. LD_FN2:
  840. ;get the alternate du from the configuration
  841. ;block. Translate from binary form to standard
  842. ;DU form in the screen. A 0ffh value for either
  843. ;D or U translates to '?' on the screen and means
  844. ;that the program being configured is to use the
  845. ;run-time current default DU. (NOT the Current
  846. ;default for ZCNFG!)
  847.     LD    A,(CFGD)    ;only 0 or 1 allowed
  848.     AND    0FEH        ;select bits 1..7
  849.     JP    NZ,BADOVL    ;bad, if any are set!
  850.  
  851.     LD    HL,(OFFSET)    ;->user/drive in config block
  852.     LDBCHL            ;drive in B, User in C
  853. LDFN2A:    LD    DE,(S_ADDR)    ;screen addr in DE
  854.  
  855. ;convert drive # in B to '?' or Drive letter
  856.     LD    A,(CFGD)    ;if data byte is 0...
  857.     XOR    41H        ;0->41, 1->40
  858.     ADD    B        ;0FFH+40H='?', (1..16)+40='A'..'P'
  859.  
  860.     LD    (DE),A        ;install in screen
  861.     INC    DE        ;->loc for User number
  862. ;convert the user number to decimal and store in screen
  863.     LD    A,SPC        ;fill with spaces to erase
  864.     LD    (DE),A        ;previous data
  865.     INC    DE
  866.     LD    (DE),A
  867.     DEC    DE        ;->user number area
  868.  
  869.     LD    A,C        ;bin user number
  870.     CP    0FFH        ;use default?
  871.     CALL    NZ,MAFDC    ;store in decimal if not
  872.     JR    NZ,REDRAW    ;done if not 0ffh
  873.     LD    A,"?"        ;indicate default
  874.     LD    (DE),A
  875.     INC    DE
  876.     LD    (DE),A
  877.     RET
  878.  
  879. REDRAW:    XOR    A
  880.     RET
  881.  
  882. ;=========================================================
  883. ;    FUNCTION 3 - UPDATE HEX ASCII BYTE/WORD
  884.  
  885. IN_FN3:
  886. ;Transfer either 2 max or 4 max characters from
  887. ;bbline input to 1 or 2 bytes in configuration
  888. ;block, interpreting the characters in HEXADECIMAL.
  889. ;Copy the input string to the screen image.
  890. ;(cfgd) specifies the number of bytes to be replaced
  891. ;in the configuration block, and is 1 or 2. When 2
  892. ;bytes are specified, they are interpreted as a WORD,
  893. ;and stored in the standard low-byte-first order. A
  894. ;word (2 byte) is accepted from the terminal and 
  895. ;displayed in the screen (at (s_addr)) in human-readable
  896. ;high-byte-first order.
  897.  
  898.     LD    HL,HMMOUT    ;set up routines to be called
  899.     LD    (ROUTE1+1),HL    ;during xmmout execution
  900.     LD    (ROUTE2+1),HL
  901.     LD    DE,PRMPH0    ;first part of prompt for HEX
  902.     CALL    TYPLIN        ;send it
  903.     CALL    XMMOUT        ;send min/max if specified in ovly
  904.     LD    DE,PRMPT1    ;stuff after min/max if present
  905.     CALL    TYPLIN
  906.  
  907.     LD    A,-1        ;capitalize
  908.     CALL    BBLINE        ;user input
  909.     OR    A        ;any input besides CR?
  910.     SCF
  911.     RET    Z        ;do nothing on empty argument
  912.     CALL    EVAL16        ;interpret as hexadecimal
  913.     CALL    RNGTST        ;test for within range if required
  914.     RET    C        ;do nothing on range error
  915.  
  916. ;binary value is in DE, asci hex is in tmpscr buffer
  917.     LD    A,(CFGD)    ;number of cfg bytes (1 or 2)
  918.     LD    B,A        ;in counter
  919.     LD    C,A        ;save for entry at LDFN3A
  920.     LD    HL,(OFFSET)    ;->1 or 2 cnfg bytes
  921.  
  922. HEXIN2:    LD    (HL),E        ;send one or two bytes
  923.     LD    E,D        ;to the cnfg block
  924.     INC    HL
  925.     DJNZ    HEXIN2
  926.  
  927.     XOR    A        ;ret NC to cause screen update
  928.     RET
  929.  
  930. ;---------------------------------------------------------
  931.  
  932. LD_FN3:
  933. ; Get data from configuration block and store
  934. ; as ASCII HEX in the screen image.
  935. ;CALL  (from mapper -- indirect call)
  936.  
  937.     LD    A,(CFGD)    ;number of cnfg bytes
  938.     LD    C,A        ;save for dispatch use
  939.     DEC    A
  940.     AND    11111110B    ;remove lsb
  941.     JP    NZ,BADOVL
  942.  
  943. LDFN3A:    LD    HL,(OFFSET)    ;hl->config byte(s)
  944.     LD    DE,(S_ADDR)    ;get screen loc
  945.     DEC    C        ;make 0 or 1
  946.     JR    NZ,LD2HEX    ;dispatch to byte or word code
  947. ;here for byte data
  948.     LD    A,(HL)        ;get the data
  949.     CALL    MA2HC        ;store 2 hex ascii in screen
  950.     XOR    A        ;mark no error
  951.     RET
  952.  
  953. LD2HEX:        ;here for word data
  954.     LDHLHL
  955.     CALL    MHL4HC        ;store 4 hex ascii in screen
  956.     XOR    A
  957.     RET
  958.  
  959. ;=========================================================
  960. ;    FUNCTION 4 - BYTE/WORD UPDATE WITH DECIMAL RADIX
  961.  
  962. IN_FN4:
  963. ;get user ascii decimal input, convert to bin
  964. ;and store in config block and screen.
  965. ;The byte at cfgd: defines the number of bytes
  966. ;referenced in the configuration block. The
  967. ;pointer at s_list: identifies location of the
  968. ;16 bit min and max values permitted for the entry. If
  969. ;that pointers value is 0000 (before relocation)
  970. ;then no range testing is done; any value is OK.
  971. ;If the number entered by the user is outside the
  972. ;range specified by the min/max word pair, then
  973. ;nothing is done.
  974.  
  975. ;get user input
  976.     LD    HL,PHLFDC    ;send up to 5 decimal digits
  977.     LD    (ROUTE1+1),HL
  978.     LD    (ROUTE2+1),HL
  979.     LD    DE,PRMPD0    ;first part of prompt for DEC
  980.     CALL    TYPLIN        ;send it
  981.     CALL    XMMOUT        ;send min/max if specified in ovly
  982.     LD    DE,PRMPT1    ;stuff after min/max if present
  983.     CALL    TYPLIN        ;finish the prompt
  984.  
  985.     LD    A,-1
  986.     CALL    BBLINE        ;get user input
  987.     OR    A
  988.     SCF
  989.     RET    Z        ;ret if nothing entered
  990.     CALL    EVAL10        ;convert to BIN in DE
  991. ;decimal input converted to bin in A, BC, and DE
  992.     CALL    RNGTST        ;test for within range if required
  993.     RET    C        ;do nothing on range error
  994.  
  995. ;value in DE, HL->input string
  996.     LD    A,(CFGD)    ;get number of bytes to update
  997.     LD    B,A
  998.  
  999. ;update the config block entry
  1000.     LD    HL,(OFFSET)    ;config block destination
  1001. FN4_1:    LD    (HL),E        ;update it
  1002.     INC    HL        ;->next
  1003.     LD    E,D        ;in case high byte needed
  1004.     DJNZ    FN4_1
  1005.     XOR    A        ;ret NC to cause screen update
  1006.     RET
  1007.  
  1008. ;---------------------------------------------------------
  1009.  
  1010. LD_FN4:
  1011. ; Get data from configuration block and store
  1012. ; as ASCII decimal in the screen. BYTE configuration
  1013. ; data uses up to 3 screen bytes, WORD configuration
  1014. ; data ( a 2 at cfgd: ) uses up to 5 screen bytes.
  1015.  
  1016.     LD    HL,(OFFSET)    ;hl->config byte(s)
  1017.     LD    DE,(S_ADDR)    ;get screen loc
  1018.     LD    A,(CFGD)    ;number of cnfg bytes
  1019.     CP    1
  1020.     JR    Z,LD1DEC
  1021.     CP    2
  1022.     JR    Z,LD2DEC
  1023.     JP    NZ,BADOVL
  1024.  
  1025. LD1DEC:
  1026. ;here for byte data, stored in up to 3 bytes
  1027.     LD    A,(HL)        ;get the data
  1028.     CALL    MADC        ;store decimal ascii in screen
  1029.     XOR    A        ;mark no error
  1030.     RET
  1031.  
  1032. LD2DEC:
  1033. ;here for word data, stored in up to 5 bytes
  1034.     LDHLHL
  1035.     CALL    MHLDC        ;up to 5 digits, no space fill
  1036.     XOR    A
  1037.     RET
  1038.  
  1039. ;=========================================================
  1040.  
  1041. ;    FUNCTION 5 - PROCESS ASCII INCLUDING LC
  1042. ;same as function 1, except lower case allowed
  1043.  
  1044. IN_FN5:    XOR    A        ;specify both LC & UC
  1045.     JP    INFN5        ;(entry in LD_FN1: routine)
  1046.  
  1047. ;LD_FN5:    ;function 5 uses same load as function 1.
  1048.         ;and shares the LD_FN1 address
  1049.  
  1050. ;=========================================================
  1051.  
  1052. ;        FUNCTION 6
  1053. ;    PROCESS ALL OR PART OF A Z3 FILESPEC
  1054.  
  1055. IN_FN6:
  1056. ;The configuration block contains one of the forms:
  1057. ;    FN,FT        (FCB format, 11 bytes blank filled)
  1058. ;    Drive        (1 byte)
  1059. ;    user,drive    (2 bytes)
  1060. ;    User,Drive,FN,FT (User, standard FCB - total 13 bytes)
  1061. ;The cfgd byte contains 0..3 to identify these forms. This code
  1062. ;is used to control transfer of all or portions of the filespec
  1063. ;from user input to tmpfcb, and between tmpfcb and the cnfg block.
  1064. ;Data transfer from tmpfcb to the screen image is also controlled
  1065. ;by (cfgd) in the sense of selecting the appropriate PUTZ.. routine.
  1066. ;Both configuration data and user input are transferred to tmpfcb.
  1067. ;Transfer to and from the cnfg block is also controlled by bit 2 of
  1068. ;(cfgd) which specifies interpretation of Drive byte values. If the
  1069. ;bit is 1, then Drive A is represented by 1; bit 2 = 0 implies that
  1070. ;Drive A=0. Thus (cfgd) may have values from 0..3 for 0-based drive
  1071. ;specification and 4..7 for 1-based drive specs. (FNAME and the
  1072. ;tmpfcb buffer always use 1-based drive designation)
  1073.  
  1074.     LD    DE,FN6MSG    ;-> prompt message
  1075.     CALL    TYPLIN
  1076.     LD    A,-1
  1077.     CALL    BBLINE        ;get user input, capitalize
  1078.     OR    A
  1079.     SCF
  1080.     RET    Z        ;don't process empty string!
  1081.     LD    C,A        ;length of input string
  1082.     CALL    COLON        ;install terminating colon for fname parse
  1083.     LD    BC,100H        ;default DU=A0 for fname (1=A:)
  1084.     LD    DE,TMPFCB    ;full fcb preceded by user byte
  1085. ;a full fcb is required for fname to initialize
  1086.     CALL    FNAME        ;parse user input to tmpfcb
  1087.     SCF
  1088.     RET    NZ        ;on DU error
  1089. ;fname data uses the A=1 convention for the drive byte
  1090. ;convert to A=0 form unless A=1 is specified
  1091.     LD    A,(CFGD)
  1092.     BIT    2,A        ;A=1 specified
  1093.     JR    NZ,INN61    ;jump if A=1 specified
  1094.     LD    HL,TMPFCB
  1095.     DEC    (HL)        ;convert to A=0 form
  1096. ;copy the relevant portion of tmpfcb to cfg block
  1097. INN61:    CALL    SETUP6        ;get source, dest, byte count
  1098.     LDIR    
  1099.     XOR    A        ;ret NC to cause screen update
  1100.     RET
  1101.  
  1102. COLON:    LD    A,(CFGD)    ;check for colon required
  1103.     AND    3        ;remove drive range bit
  1104.     RET    Z        ;not required for fn.ft
  1105.     CP    3        ;..or for full filespec
  1106.     RET    Z
  1107.     PUSH    HL        ;save ptr to input string
  1108.     LD    B,0
  1109.     ADD    HL,BC        ;->terminating null
  1110.     DEC    HL        ;->last char
  1111.     LD    A,':'
  1112.     CP    (HL)        ;did user provide colon?
  1113.     JR    Z,COLONX    ;skip if so
  1114.     INC    HL        ;->terminator
  1115.     LD    (HL),A        ;provide colon
  1116.     INC    HL
  1117.     LD    (HL),0        ;..and new terminator
  1118. COLONX:    POP    HL        ;hl -> colon terminated D or DU
  1119.     RET
  1120.  
  1121. SETUP6:
  1122. ;perform lookup of field length and location
  1123. ;in tmpfcb structure for portions of Z3 filespec
  1124. ;specified by the value (0..3) in cfgd:.
  1125.     LD    A,(CFGD)
  1126.     CP    8        ;if >7, it's bad data
  1127.     JP    NC,BADOVL    ;error msg & abort if so
  1128.     AND    3        ;remove A=1 flag
  1129.     LD    C,A
  1130.     ADD    A
  1131.     ADD    C
  1132.     LD    C,A        ;for index to table of 3 byte records
  1133.     LD    B,0
  1134.     LD    HL,TBLI6
  1135.     ADD    HL,BC
  1136.     LD    C,(HL)        ;number of bytes to transfer
  1137.     INC    HL
  1138.     LD    A,(HL)        ;get tmpfcb location
  1139.     INC    HL
  1140.     LD    H,(HL)
  1141.     LD    L,A
  1142.     LD    DE,(OFFSET)    ;config block location
  1143.     RET
  1144.  
  1145. TBLI6:    DB    11        ;fn+ft
  1146.     DW    TMPFCB+1    ;source
  1147.     DB    1        ;Drive byte
  1148.     DW    TMPFCB        ;location
  1149.     DB    2        ;U+D
  1150.     DW    TMPFCB-1
  1151.     DB    13        ;U+D+FN+FT
  1152.     DW    TMPFCB-1
  1153.  
  1154. LD_FN6:
  1155. ;load tmpfcb from the cnfg block
  1156.     CALL    SETUP6        ;de=source,hl=dest,bc=count
  1157.     EX    DE,HL        ;hl=source, de=dest
  1158.     LDIR
  1159. ;convert to A=1 if necessary
  1160.     LD    A,(CFGD)
  1161.     BIT    2,A        ;A=1 specified?
  1162.     JR    NZ,PUTFN6    ;jump if so. It's already correct
  1163.     LD    HL,TMPFCB    ;..else..
  1164.     INC    (HL)        ;convert to A=1    for the screen load.
  1165. ;fall through to load the screen
  1166.  
  1167. ;load the screen image from tmpfcb
  1168. PUTFN6:    LD    HL,TMPFCB+1    ;->file name field of parsed input
  1169.     LD    DE,(S_ADDR)
  1170.     LD    A,(CFGD)
  1171.     AND    3        ;remove A=0/1 flag
  1172.     JR    Z,PUTFNFT    ;0 = display <fn>.<ft> only
  1173.     DEC    A
  1174.     JR    Z,PUTZDD    ;1 = display D: only
  1175.     DEC    A
  1176.     JR    NZ,PUTFSPEC    ;3 = display full filespec
  1177.     JP    PUTZDU        ;2 = display DU: only
  1178. ;PUTZDU returns CY set on DU error
  1179.  
  1180. PUTZDD:    DEC    HL        ;->drive byte
  1181.     LD    A,(HL)
  1182.     DEC    A
  1183.     CP    16        ;test for within range
  1184.     CCF
  1185.     RET    C        ;not in range A..P
  1186.     ADD    'A'        ;convert to ascii
  1187.     LD    (DE),A
  1188.     RET
  1189.  
  1190. PUTFNFT:
  1191.     CALL    PUTZFN        ;send FN.FT to screen dest,
  1192.     LD    B,12        ;field width.
  1193.     JR    RJUSTIFY    ; C contains # of trailing spaces
  1194.  
  1195. PUTFSPEC:
  1196.     CALL    PUTZFS        ;send full filespec to screen
  1197.     RET    C        ;DU range error
  1198.     LD    B,16        ;field width, C=trailing spaces
  1199. RJUSTIFY:
  1200.     LD    HL,(S_ADDR)
  1201.     CALL    RJIP
  1202.     XOR    A
  1203.     RET
  1204.  
  1205. ;=========================================================
  1206.  
  1207. ;        FUNCTION 7
  1208. ;    ROTATE A BIT WITHIN A FIELD IN A BYTE
  1209.  
  1210. IN_FN7:
  1211. ;entry-    (CFGD:) = mask defining the field
  1212. ;    (OFFSET:) = address of cfg data byte
  1213. ;exit-    byte at (OFFSET:) contains rotated field.
  1214. ;    Screen image is updated with a string
  1215. ;    corresponding to the new bit position.
  1216. ;    all registers used.
  1217.  
  1218.     LD    HL,(OFFSET)    ;->configurable data
  1219.     LD    A,(CFGD)    ;mask
  1220.     LD    E,(HL)        ;data byte in reg E
  1221.     LD    B,A        ;field mask in B
  1222.     CPL
  1223.     LD    C,A        ;.not. mask in C
  1224.     CPL            ;recover mask
  1225.     AND    E        ;isolate the bit field
  1226.     RLCA            ;left circular rotate
  1227.     LD    D,A        ;save rotated field
  1228.     INC    C
  1229.     DEC    C        ;8 bit field?
  1230.     JR    Z,INFN7X    ;..done if so
  1231.     AND    C        ;test for overflow beyond field
  1232.     JR    Z,INFN7X    ;z=no overflow
  1233. ;a bit has shifted out of the high position
  1234. ;of the field. The field is now all 0s and
  1235. ;the shifted bit belongs in the lsb of the field.
  1236.     LD    A,C        ;synthesize a new field
  1237.     RLCA            ; with lsb set
  1238.     AND    B        ;remove all other bits
  1239.     LD    D,A        ;save the initialized field
  1240.  
  1241. INFN7X:
  1242.     LD    A,(HL)        ;data byte
  1243.     AND    C        ;remove bit field
  1244.     OR    D        ;and replace with rotated field
  1245.     LD    (HL),A        ;new data byte
  1246.     XOR    A        ;ret NC to cause screen update
  1247.     RET
  1248.  
  1249. LD_FN7:
  1250. ;This is the entry from MAPPER
  1251. ;Copy the string in the overlay corresponding
  1252. ;to the bit set in the field to the screen image.
  1253. ;entry- same as IN_FN7
  1254. ;    S_ADDR: & S_LIST: contain valid addresses
  1255. ;exit-    (normal) AF = 0,NZ,NC
  1256. ;    (error) program abort with message
  1257. ;        on bad CFGD byte.
  1258.  
  1259.     LD    HL,(S_LIST)
  1260.     LD    A,H
  1261.     OR    L
  1262.     JP    Z,BADOVL    ;list must be present!
  1263.  
  1264.     LD    A,(CFGD)
  1265. ;test for illogical mask with less than 2 bits set
  1266.     LD    B,A        ;save the byte
  1267.     DEC    A        ;invert low order 0s and
  1268.                 ;the first 1 encountered
  1269.     AND    B        ;restore 0's from original byte
  1270.                 ;and set Zflag (NZ if 1's remain)
  1271.     LD    A,B        ;restore original byte in A
  1272.     JP    Z,BADOVL    ;Z if < 2 bits in the mask
  1273.  
  1274.     LD    HL,(OFFSET)
  1275.     AND    (HL)        ;bit field only in A
  1276.  
  1277. LDFN7A:
  1278. ;This is the entry from IN_FN7.
  1279. ;shift bit field right to lsb position for indexing
  1280. ;entry-    A = field from cfg data, masked
  1281. ;    B = mask for field data
  1282. ;    HL -> cfg data byte
  1283.     BIT    0,B        ;mask & data right justified yet?
  1284.     JR    NZ,LDFN7B    ;yes, if nz
  1285.     RRCA            ;move bit field right
  1286.     RRC    B        ;and also the mask
  1287.     JR    LDFN7A        ;and repeat
  1288.  
  1289. LDFN7B:
  1290. ;index to the proper string in S_LIST
  1291.     LD    HL,(S_LIST)    ;->field data list for screen
  1292.     LD    C,A        ;cfg field in C
  1293. ..INDX:    BIT    0,C        ;lsb set?
  1294.     JR    NZ,LDFN7X    ;use current list item if so
  1295.     CALL    SKIP2Z        ;else skip to next list item
  1296.     RRC    C        ;and put next field bit in lsb
  1297.     JR    ..INDX        ;..and repeat
  1298.  
  1299. LDFN7X:
  1300. ;copy S_LIST string to screen image
  1301.     LD    DE,(S_ADDR)
  1302.     CALL    MOVE2Z        ;copy null terminated string
  1303.     XOR    A        ;no error
  1304.     RET
  1305.  
  1306. ;=========================================================
  1307.  
  1308. ;    FUNCTION 8 - TOGGLE BYTE BETWEEN TRUE & FALSE
  1309.  
  1310. IN_FN8:
  1311. ;Toggle a byte in the configuration block at (offset)
  1312. ;between 00 and 0ffh (=-1), then update the screen image
  1313. ;at (s_addr) with the appropriate one of two choices of
  1314. ;null terminated ascii strings at (s_list).
  1315.  
  1316.     LD    HL,(OFFSET)    ;->configuration byte
  1317.     LD    A,(HL)        ;get it
  1318.     OR    A        ;adjust flags
  1319.     JR    Z,BYTOG1    ;continue if zero
  1320.     LD    A,-1        ;else be sure it's 0ffh
  1321. BYTOG1:    CPL            ;toggle the byte
  1322.     LD    (HL),A        ;restore to config block
  1323.     OR    A        ;adjust flags
  1324.     XOR    A        ;ret NC to cause screen update
  1325.     RET
  1326.  
  1327. LD_FN8:
  1328. ;load the screen according to the logic
  1329. ;value in the configuration byte
  1330.     LD    HL,(S_LIST)
  1331.     LD    A,H
  1332.     OR    L
  1333.     JP    Z,BADOVL    ;list must be present!
  1334.     LD    A,(CFGD)    ;not used, but partially identifies
  1335.     DEC    A        ;proper function if its value is 1
  1336.     JP    NZ,BADOVL
  1337.     LD    HL,(OFFSET)    ;->configuration byte
  1338.     LD    A,(HL)        ;get it
  1339.     OR    A        ;adjust flags
  1340.     JP    TOGL0        ;send ascii to screen
  1341.  
  1342. ;=========================================================
  1343.  
  1344. ;    FUNCTION 9 - UPDATE A 7-BIT ASCII BYTE
  1345.  
  1346.     .comment ~
  1347. Function 9 configures a single ASCII byte in the target
  1348. configuration block. The screen display is in a right
  1349. justified field of 3 spaces. Printable characters are
  1350. displayed literally, control characters are converted to
  1351. the ^C type display, and unprintable characters are shown
  1352. with a 3 character mnemonic. The mnemonics are ASCII.
  1353.     end comment~
  1354.  
  1355. IN_FN9:
  1356. ;Gets a keyboard character from user.
  1357. ;Deposits the 7-bit character in the
  1358. ;configuration block.
  1359. ;Uses LDFN9 to update the screen image.
  1360.  
  1361.     LD    DE,HOTMSG    ;Send the prompt
  1362.     CALL    TYPLIN
  1363.  
  1364. HOTKEY:    CALL    CONIN        ;Get user keypress
  1365.     LD    C,A
  1366.     LD    HL,(OFFSET)    ;Store in CFG block
  1367.     LD    A,(HL)
  1368.     AND    1 SHL 7        ;preserve high bit
  1369.     OR    C        ;add new ASCII portion
  1370.     LD    (HL),A
  1371.     XOR    A        ;ret NC to cause screen update
  1372.     RET
  1373.  
  1374. HOTMSG:    DB    ') Enter a keystroke:',0
  1375.  
  1376. ;Entry from initial screen load (SCR-LD:)
  1377. LD_FN9:
  1378.  
  1379. ;Get byte from CFG block
  1380.     LD    HL,(OFFSET)
  1381.     LD    A,(HL)
  1382.  
  1383. ;Entry from IN_FN9 bypasses error checking
  1384. LDFN9:
  1385. ;copy the character to the screen image, with
  1386. ;translation of non-printing bytes to ASCII or
  1387. ;"^C" format.
  1388.  
  1389.     CALL    XASCII        ;translate to mnemonic
  1390.                 ;HL-> 3 byte mnemonic
  1391.     LD    BC,300H        ;length in B for strcpy
  1392.     LD    DE,(S_ADDR)
  1393.     JP    STRCPY        ;Copy mnemonic to screen image
  1394.  
  1395. XASCII:
  1396. ;Translate an ASCII byte into a printable
  1397. ;3 character string with ^ notation for
  1398. ;control characters, SP, DEL, or the
  1399. ;printable char right justified in the field.
  1400.  
  1401. ;entry-     A = 7 bit ascii char
  1402. ;exit-    HL -> 3 byte translated string
  1403. ;    AF used
  1404.  
  1405.     LD    HL,DELDAT
  1406.     CP    DEL
  1407.     RET    Z        ;del char
  1408.     LD    HL,SPCDAT
  1409.     CP    SPC
  1410.     RET    Z        ;space
  1411.     LD    (CHRDAT+2),A
  1412.     LD    HL,CHRDAT
  1413.     RET    NC        ;printable character
  1414.     ADD    40H        ;cnvt to equivalent UC char
  1415.     LD    (CTLDAT+2),A
  1416.     LD    HL,CTLDAT
  1417.     RET            ;show '^char'
  1418.  
  1419. DELDAT:    DB    'DEL'
  1420. SPCDAT:    DB    ' SP'
  1421. CHRDAT:    DB    '   '
  1422. CTLDAT:    DB    ' ^ '
  1423.  
  1424. ;=========================================================
  1425.  
  1426.     .SBTTL SERVICE ROUTINES
  1427.     PAGE
  1428. ;=========================================================
  1429. ; MISC SERVICE ROUTINES
  1430. ;=========================================================
  1431.  
  1432. RNGTST:
  1433. ;Test current numeric user input against min/max values
  1434. ;pointed to by the address at s_list. If that pointer
  1435. ;is equal to the relocation constant, then its original
  1436. ;value was 0000h, and no range testing is required. i.e.,
  1437. ;any value is OK. Returns CY set if out of range, else NC.
  1438.  
  1439. ;entry-    DE = value to be tested
  1440. ;exit-    DE, HL preserved, BC is munched
  1441. ;    CY SET = DE > MAX or DE < MIN
  1442.  
  1443.     PUSH    HL
  1444.     LD    HL,(S_LIST)    ;->possible range data
  1445.     LD    A,H
  1446.     OR    L        ;test for presence
  1447.     JR    Z,RNGX        ;z = no range test
  1448.     LDBCHL            ;get min value in BC
  1449.     LDHLHL            ;get max value in HL
  1450.     CALL    RANGE        ;preserves DE (test value)
  1451. RNGX:    POP    HL
  1452.     RET
  1453.  
  1454. ;=========================================================
  1455.  
  1456. XLTADU:
  1457. ;parse token as DU spec with '?' wildcards to BC.
  1458. ;'?' becomes -1, default is at OFFSET:, used if
  1459. ;there is nothing present for D or U. '?' means
  1460. ;default is deferred until target run-time.
  1461.  
  1462. ;entry-    HL ->token, null terminated
  1463. ;    valid data structure at OFFSET
  1464. ;exit-    BC = D,U with deferred default
  1465. ;    AF, DE, HL used
  1466. ;    errors are simply ignored and
  1467. ;     cause default to return in B/C
  1468.  
  1469.     EX    DE,HL
  1470.     LD    HL,(OFFSET)
  1471.     LDBCHL            ;default DU
  1472.     EX    DE,HL
  1473.     LD    A,(HL)        ;first character
  1474.     CP    SPC
  1475.     JR    Z,XLT2        ;leave drive default alone
  1476.     CP    '?'        ;wild card drive?
  1477.     JR    NZ,XLT1        ;no, check for drive letter
  1478.     LD    B,-1        ;yes, use deferred default
  1479.     JR    XLT2        ;and goto next character
  1480.  
  1481. XLT1:    CALL    ISDIGIT        ;user number?
  1482.     JR    Z,XLT4        ;yes,do it and quit
  1483.     SUB    'A'        ;legal drive is 0..15
  1484.     RET    C        ;error, <'A'
  1485.     CP    16        ; > P?
  1486.     CCF
  1487.     RET    C        ;error if so
  1488.     LD    B,A        ;drive range 0..15
  1489.  
  1490.     LD    A,(CFGD)    ;0 or 1
  1491.     ADD    B        ;adjust range
  1492.     LD    B,A        ;1..16 if CFGD=1
  1493.  
  1494. XLT2:    INC    HL        ;->second character
  1495.     LD    A,(HL)
  1496.     OR    A
  1497.     RET    Z        ;done if terminator
  1498.     CP    SPC        ;leave default as is?
  1499.     RET    Z        ;yes, if space
  1500.     CP    '?'        ;deferred default?
  1501.     JR    NZ,XLT3
  1502.     LD    C,-1        ;use deferred default
  1503.     RET            ;done
  1504. XLT3:    CALL    ISDIGIT
  1505.     SCF
  1506.     RET    NZ        ;error if not a digit
  1507.  
  1508. XLT4:    CALL    EVAL10        ;get user number
  1509.     LD    C,E        ;user # in C
  1510. XLTERR:    XOR    A        ;ret with Z,NC
  1511.     RET
  1512.  
  1513. ;=========================================================
  1514.  
  1515. XMMOUT:
  1516.     LD    HL,(S_LIST)    ;-> possible min/max words
  1517.     LD    A,H
  1518.     OR    L        ;no data if 0
  1519.     RET    Z
  1520.  
  1521.     LD    DE,FROMP    ;'from ' part of prompt
  1522.     CALL    TYPLIN
  1523.  
  1524.     LDDEHL            ;min val in DE
  1525.     LDHLHL            ;max val in HL
  1526.     PUSH    HL        ;save for route2
  1527.     EX    DE,HL        ;min val in HL
  1528. ROUTE1:    CALL    0        ;filled in by xmmout caller
  1529.  
  1530.     LD    DE,TOMSG    ;' to ' part of prompt
  1531.     CALL    TYPLIN
  1532.  
  1533.     POP    HL        ;max value
  1534. ROUTE2:    CALL    0        ;filled in by xmmout caller
  1535.     RET
  1536.  
  1537. HMMOUT:
  1538. ;select the syslib routine to use for data transfer
  1539.     LD    A,(CFGD)    ;number of bytes
  1540.     DEC    A
  1541.     JP    NZ,PHL4HC    ;for hex word data
  1542.     LD    A,L
  1543.     JP    PA2HC        ;for hex byte data
  1544.  
  1545. ;=========================================================
  1546.     .SBTTL INITIALIZATION ROUTINES
  1547.     PAGE
  1548. ;=========================================================
  1549. ;    PROGRAM STARTUP & INITIALIZATION
  1550. ;=========================================================
  1551.  
  1552. INIT:    LD    HL,UDSTART    ;zero uninitialized data
  1553.     LD    BC,UDLEN
  1554.     LD    D,H
  1555.     LD    E,L
  1556.     INC    DE
  1557.     LD    (HL),0
  1558.     LDIR
  1559.  
  1560.     CALL    RETUD        ;get current DU
  1561.     INC    B        ;make drive 1..16
  1562.     LD    (DEFDU),BC    ;store the default
  1563.  
  1564. ;ZCNFG's Alternate DU may contain 0FFh for D and/or U,
  1565. ;marking a '?' entry during configuration.
  1566. ;Replace such wildcards with the corresponding D or
  1567. ;U in (DEFDU), the DU at invocation.
  1568. ;entry-    BC = default D/U
  1569.     LD    HL,PATH11
  1570.     LD    (PATH),HL    ;init path pointer
  1571.  
  1572.     LD    HL,(ALTUSR)
  1573.     CALL    DEF_DU        ;provide defaults from DEFDU
  1574.  
  1575.     LD    (PATH12),HL    ;install in the two
  1576.     LD    (PATH21),HL    ;alternate paths
  1577.     LD    (LBRDU),HL    ;save for finding a CFG LBR
  1578.  
  1579. ;install current configuration data in HELP screen
  1580.     LD    HL,LBRDU+2    ;Drv + 1 for PUTZDU
  1581.     LD    DE,HLP001    ;default ALT: field
  1582.     LD    A,SPC        ;fill character
  1583.     LD    B,3        ;field length
  1584.     PUSH    DE
  1585.     CALL    FILL        ;initialize alt: field
  1586.     POP    DE
  1587.     CALL    PUTZDU
  1588.     LD    HL,HLP001
  1589.     LD    BC,3
  1590.     CALL    NTSPCS
  1591.     CALL    RJIP
  1592.  
  1593.     LD    HL,CLBRFN    ;default LBR FN.FT
  1594.     LD    DE,HLP002
  1595.     CALL    PUTZFN
  1596.  
  1597. ;test for ZCPR3 or ZCPR33 availability
  1598.     LD    HL,(Z3ENV)    ;get env address into hl
  1599.     CALL    GZ3INIT        ;init ENV, TCAP, GRAPHICS pointers
  1600.     LD    (GZ3FLG),A    ;bit mapped TCAP capabilities
  1601.     LD    A,H        ;see if environment implemented
  1602.     OR    L
  1603.     RET    Z        ;NZ=Z3ENV available, Z=use CP/M only
  1604.     OR    0FFH        ;show ENV present
  1605.     LD    (Z3ENVF),A    ;0=no ENV, 0ffh=ENV present
  1606.     CALL    TINIT        ;init terminal if required
  1607.     CALL    GETCRT
  1608.     INC    HL
  1609.     LD    A,(HL)        ;get screen length
  1610.     LD    (SCRNLN),A    ;use this length instead of cnfg.
  1611. ;install the program name in the help screen
  1612.     LD    DE,HLP000    ;->help screen name
  1613.     LD    A,(DE)
  1614.     CP    SPC
  1615.     RET    NZ        ;name already there
  1616.     CALL    GETEFCB        ;HL->EXTFCB
  1617.     RET    Z        ;quit if no EXTFCB
  1618.     INC    HL
  1619.     LD    BC,8
  1620.     LDIR
  1621.     RET
  1622.  
  1623. ;=========================================================
  1624.  
  1625. HELP:
  1626. ;provide the help screen if requested
  1627.     LD    A,(FCB+1)
  1628.     CALL    ISALNUM        ;alphanumeric char present?
  1629.     RET    Z        ; no help if so
  1630.  
  1631. DOHELP:    CALL    ASSIST        ;give help screen & quit
  1632.     JP    QUIT
  1633.  
  1634. ASSIST:    LD    DE,HLPMSG    ;print the Help screen
  1635.     CALL    TYPLIN        ; with no side effects
  1636.     XOR    A
  1637.     RET
  1638.  
  1639. ;=========================================================
  1640.  
  1641. PGMINI:
  1642.     LD    A,(SCRNLN)    ;install fixed screen addresses
  1643.     LD    (HLPAT),A    ;for the standard prompts
  1644.     SUB    5        ;depending on screen length
  1645.     LD    (ATPRPT),A    ;menu prompt location
  1646.  
  1647.     LD    DE,OVLFCB    ;initialize CFG file FCB
  1648.     CALL    INIFCB
  1649.     LD    DE,TGTFCB    ;..and target file FCB
  1650.     CALL    INIFCB
  1651.  
  1652. ;arg1:
  1653. ;Parse the first token in the command tail
  1654. ;into the target FCB.
  1655.     LD    DE,TGTFCB    ;fcb for target file
  1656.     LD    HL,TBUF+1    ;->command tail
  1657.     CALL    SKSP        ;skip spaces, tabs
  1658.     LD    BC,(DEFDU)
  1659.     CALL    FNAME        ;parse the filespec into TGTFCB
  1660.     JP    NZ,BADDU    ;jmp to error if bad d/u
  1661.  
  1662.     CALL    SKSP        ;->next non-space, non-tab byte
  1663.  
  1664. ;arg2:
  1665. ;parse a possible CFG file spec
  1666.     CALL    CPARSE
  1667.     JP    C,BADDU
  1668.  
  1669. ;arg3:
  1670. ;parse a possible configuration LBR filespec
  1671.     CALL    CPARSE
  1672.     JP    C,BADDU
  1673.  
  1674. ;select the default DU for the overlay file
  1675. ;and for the default DU in the path
  1676.     LD    BC,(TGTUSR)
  1677.     LD    A,(ZCOPT0)
  1678.     AND    1        ;use logged DU?
  1679.     JR    Z,SETPTH    ;no, if bit 0 reset
  1680.     LD    BC,(DEFDU)    ;..use logged du if set
  1681. SETPTH:    LD    (PATH11),BC    ;install elements in the
  1682.     LD    (PATH22),BC    ;two alternate paths
  1683.     
  1684. ;reinitialize the two search paths to
  1685. ;the directory defined for CFG file if
  1686. ;user specified a D or U for CFG file
  1687.     LD    HL,(OVLUSR)
  1688.     INC    HL        ;0FFFFH -> 0000
  1689.     LD    A,H
  1690.     OR    L        ;neither D nor U specified if 0
  1691.     JR    Z,LBRINI    ;use LBR if unspecified D|U
  1692.     DEC    HL        ;recover original DU spec
  1693.     CALL    DEF_DU        ;defaults from DEFDU | TGTDU
  1694.  
  1695.     LD    (PATH11),HL    ;redefine both paths to a
  1696.     LD    (PATH21),HL    ;single directory, (OVLUSR)
  1697.     SBC    HL,HL        ;make 0
  1698.     LD    (PATH12),HL    ;terminate the paths
  1699.     LD    (PATH22),HL
  1700.     OR    0FFH        ;install code to
  1701.     JR    LBRINX        ;turn off lbr access
  1702.  
  1703. LBRINI:
  1704. ;initialize the lbr LUD
  1705.     LD    HL,CLBRFN    ;configured default LBR FN
  1706.     LD    DE,LUDFCB
  1707.     CALL    DEF_FN        ;provide default FN if needed
  1708.     LD    HL,CLBRFT    ;default LBR FT
  1709.     CALL    DEF_FT        ;provide default FT if needed
  1710.  
  1711.     LD    BC,(LBRDU)    ;default LBR loc
  1712.     LD    HL,(LUDUSR)    ;ambiguous LBR DU
  1713.     CALL    DEF_DU        ;provide defaults
  1714.     LD    (LBRDU),HL    ;new DU for LBR file
  1715.     LD    B,H
  1716.     LD    C,L
  1717.     XOR    A        ;restore DU area used in LUD
  1718.     SBC    HL,HL        ;to 0000
  1719.     LD    (LUDUSR),HL
  1720.  
  1721.     DEC    B        ;make drive A=0 for LOGUD
  1722.     CALL    LOGUD
  1723.     LD    DE,LUD
  1724.     CALL    LUINIT
  1725. LBRINX:    LD    (LUSTAT),A    ;lbr status flags
  1726.     RET
  1727.  
  1728. ;=========================================================
  1729.  
  1730. CPARSE:
  1731. ;Parse a token into tmpfcb, then copy the full
  1732. ;FS into LBRFCB if there is a leading slash OR 
  1733. ;if the FT is LBR OR if a CFG file has already 
  1734. ;been parsed (ie if this is arg3). Else copy
  1735. ;the FS to OVLFCB.
  1736. ;entry-    HL -> token to parse
  1737. ;exit-    HL -> token terminator
  1738. ;    CY set on bad DU
  1739.  
  1740.     CALL    SKSP        ;skip spaces, return non-space in A
  1741.     XOR    '/'        ;LBR marker?
  1742.     JR    NZ,CPARS0    ;CY reset
  1743.     INC    HL        ;skip over the '/'
  1744.     SCF            ;show '/' present
  1745. CPARS0:    SBC    A,A        ;copy CY to all bits in A
  1746.     PUSH    AF        ;LBR marker, flags
  1747.  
  1748.     LD    DE,TMPFCB
  1749.     LD    BC,-1
  1750.     CALL    FNAME
  1751.     POP    BC        ;LBR marker in B, flags in C
  1752.     SCF            ;mark possible bad DU
  1753.     RET    NZ        ;and quit if Bad DU
  1754.  
  1755.     PUSH    HL        ;save token pointer
  1756.     LD    A,(CFGFLG)    ;if CFG has already been
  1757.     OR    B        ;parsed, then the current
  1758.     LD    (LBRFLG),A    ;will be declared a LBR FS
  1759.  
  1760.     LD    HL,TMPFT    ;test for .LBR FT
  1761.     LD    DE,CLBRFN+8    ;->'LBR'
  1762.     LD    B,3
  1763.     CALL    @FNCMP        ;string compare from SYSLIB
  1764.     SCF            ;show possible LBR file type
  1765.     JR    Z,CPARS2
  1766.     CCF            ;not LBR file type
  1767. CPARS2:    SBC    A,A        ;make -1 for LBR, else 0
  1768.  
  1769.     LD    HL,LBRFLG    ;if either is true, then this
  1770.     OR    (HL)        ;is a LBR specification
  1771.     LD    (HL),A        ;save for DU installation
  1772. ;set up OVLFCB for CFG file or LUDFCB for LBR file
  1773.     LD    DE,LUDUSR    ;assume LBR
  1774.     JR    NZ,CPARS3
  1775.     LD    DE,OVLUSR
  1776.     DEC    A        ;make FF
  1777.     LD    (CFGFLG),A    ;show CFG file declared
  1778.  
  1779. CPARS3:    LD    HL,TMPUSR    ;copy FS to destination FCB
  1780.     LD    BC,13        ;DU+FN+FT length
  1781.     LDIR
  1782.     POP    HL        ;restore token pointer
  1783.     XOR    A        ;reset CY, good return.
  1784.     RET
  1785.  
  1786. ;=========================================================
  1787.  
  1788. FILINIT:
  1789. ;Open the target file, read in the configuration page,
  1790. ;locate and load the configuration overlay.
  1791.     LD    DE,TGTFCB
  1792.     LD    HL,TGTTYP    ;->default FT in ZCNFG config block
  1793.     CALL    DEF_FT        ;set default file type if required
  1794.  
  1795.     CALL    OPNFIL        ;open the target file
  1796.     JP    Z,BADFIL    ;error exit, file not found
  1797.  
  1798.     CALL    RPAGE        ;get first 256 bytes of pgm
  1799.  
  1800. ;look for the 'Z3ENV' marker at relative location 003
  1801.     LD    DE,Z3MARK
  1802.     LD    HL,TGTBUF+3
  1803.     LD    B,IDLEN        ;length of strings
  1804.     CALL    COMPB        ;compare 2 strings
  1805.     JR    Z,ZUTIL        ;ok, check for env type
  1806.  
  1807. ;if not found, it's not a ZCPR3x utility
  1808.     XOR    A        ;logic false value
  1809.     LD    (Z3INST),A    ;prevent zcpr installation
  1810.     JP    GT_CFG
  1811.  
  1812. ;-------------------------------------------------------
  1813.  
  1814. ZUTIL:    LD    HL,TGTBUF
  1815.     LD    DE,ENVTYP    ;offset to env type byte
  1816.     ADD    HL,DE
  1817.     LD    A,4
  1818.     CP    (HL)        ;type four header?
  1819.     CALL    Z,RPAGE        ;skip the header if so, and
  1820.                 ;read in the first page of the pgm
  1821.     JR    GT_CFG
  1822.  
  1823. ;-------------------------------------------------------
  1824.  
  1825. RPAGE:
  1826. ;Read one page of 256 bytes from the target program
  1827. ;into the local configuration block buffer
  1828. ;save the Current Record byte in the FCB for restoration when
  1829. ;the updated configuration block is rewritten
  1830.  
  1831.     LD    A,(TGTFCB+CREC)    ;get Current Record byte
  1832.     LD    (FCB_CR),A    ;save it
  1833.     LD    HL,TGTBUF    ;cnfg block buffer
  1834.     CALL    SETDMA
  1835.     LD    DE,TGTFCB    ;fcb pointer for target program
  1836.     CALL    RDREC        ;get first 128 bytes in tgtbuf
  1837.     JP    C,BADFIL    ;premature EOF
  1838.     LD    HL,TGTBUF+80H
  1839.     CALL    SETDMA
  1840.     CALL    RDREC        ;get second 128 bytes and return
  1841.     LD    A,(FCB_CR)    ;starting record
  1842.     LD    B,A
  1843.     LD    A,(TGTFCB+CREC)    ;number of next record
  1844.     SUB    B
  1845.     LD    (NCRECS),A    ;may only be 1 rcrd if
  1846.                 ;the file is that short.
  1847.     RET
  1848.  
  1849. ;-------------------------------------------------------
  1850.  
  1851. GT_CFG:
  1852. ;This routine identifies the CFG file name, searches
  1853. ;in explicitly named or default directories for it,
  1854. ;and loads the file in free memory at OVRLAY:.
  1855. ;The name of the overlay is copied from one of three
  1856. ;sources, listed in order of priority:
  1857. ;    1. from the command line (argument 2).
  1858. ;    2. from offset 0DH in the configuration page.
  1859. ;    3. the target program name. (cmd line arg 1)
  1860. ;The highest priority is a command line name. The
  1861. ;first valid filename in this list is taken as the 
  1862. ;name of the overlay.
  1863. ;A one or two element directory search path has already
  1864. ;been defined. If a directory was explicitly declared for
  1865. ;the CFG file on the command line then that is the only
  1866. ;directory searched. Otherwise, the search path contains
  1867. ;three elements: ALT:CONFIG.LBR, the ALT: directory, and
  1868. ;a default directory which is configured as either the
  1869. ;directory at ZCNFG invocation (DEFDU) or the DU in which 
  1870. ;the target file resides (TGTUSR).
  1871.  
  1872. ;Path element order (search priority) 
  1873. ;If an explicit DIR form is present for the overlay file,
  1874. ;then that directory alone is accessed to load the overlay.
  1875.  
  1876. ;If NO dir form is present for the overlay file, then the
  1877. ;CONFIG.LBR is searched first, followed by a search of the
  1878. ;two directories in the search path, as follows..
  1879.  
  1880. ;If the CFG filename came from the Targets configuration 
  1881. ;page then the ALT ;directory is searched first. Otherwise, 
  1882. ;the configured default is searched first.
  1883.  
  1884. ;If the CFG file is not found, an error message is issued.
  1885.  
  1886.     LD    HL,OVLTYP
  1887.     LD    DE,OVLFCB
  1888.     CALL    DEF_FT        ;install default ovly FT if needed
  1889.  
  1890. ;OVLFN contains a FN from the command line
  1891. ;or is blank if FN was not specified.
  1892.     CALL    TGTCFG        ;install FN from overlay if needed
  1893.                 ;and if present.
  1894. ;OVLFN is still blank if there was no FN
  1895. ;in the command line or in the overlay.
  1896.     LD    HL,TGTFN
  1897.     LD    DE,OVLFCB
  1898.     CALL    DEF_FN        ;install Target FN if needed
  1899. ;The name of the CFG file and the 
  1900. ; search paths are now completely defined.
  1901.     INC    DE        ;->OVLFN
  1902.     LD    HL,TESTID    ;->possible FN from Target CFG area
  1903.     LD    B,8        ;FN field length
  1904.     CALL    @FNCMP        ;same as OVLFN?
  1905.     LD    HL,ERRCTL
  1906.     LD    A,(HL)        ;error test control byte
  1907.     SET    7,A        ;assume OVLFN same as in CFG block
  1908.     JR    Z,GTCFG1    ;same, so minimize error checking
  1909.     RES    7,A        ;not the same, increase error checking
  1910. GTCFG1:    LD    (HL),A
  1911. ;get the CFG file from the CFG LBR if it exists and
  1912. ;if the user did not specify an explicit D and/or U
  1913.     CALL    GET_LF
  1914.     RET    Z        ;Z = CFG file loaded
  1915.  
  1916. ;get the CFG file from one of the directories
  1917. ;on the search path.
  1918.     LD    DE,OVLFCB
  1919.     CALL    GETFIL        ;open first file found on the path
  1920.     JP    Z,BADFIL    ;file not found
  1921.  
  1922. ;load CFG overlay and return to FILINIT caller
  1923.     LD    HL,(OVRLAY)    ;place to load the file
  1924.     JP    RDFILE        ;read in the entire .CFG file
  1925.  
  1926. ;-------------------------------------------------------
  1927. ;    ROUTINES CALLED FROM FILINIT
  1928. ;-------------------------------------------------------
  1929.  
  1930. TGTCFG:
  1931. ;Verify a possible filename at offset 0Dh in the
  1932. ;targets configuration page. If found, copy the
  1933. ;name to the overlay FCB and adjust the path
  1934. ;pointer to change search priority so that the
  1935. ;alternate directory is searched first.
  1936.     LD    DE,TMPFCB
  1937.     CALL    INIFCB
  1938.     CALL    NAMCHK        ;check for up to 8 AN characters
  1939.     RET    C        ;quit if illegal filename string
  1940.     LD    DE,TMPFN
  1941.     LD    C,0
  1942.     CALL    STRCPY        ;copy FN to tmpfn
  1943.  
  1944.     LD    HL,TMPFN    ;->verified ID string
  1945.     LD    DE,OVLFCB
  1946.     CALL    DEF_FN        ;copy to OVLFN if needed
  1947. ;change paths only if replacement occurs
  1948.     JR    NZ,TCFGX
  1949.     LD    HL,PATH21    ;use the second path, which results
  1950.     LD    (PATH),HL    ; in search of the alternate du first
  1951. TCFGX:    OR    0FFH        ;ret NC,NZ=success
  1952.     RET
  1953.  
  1954. ;-------------------------------------------------------
  1955.  
  1956. GETFIL:
  1957. ;traverse the DIR path, using each entry
  1958. ;to attempt to open the file in FCB.
  1959. ;entry-    DE ->FCB for file to be opened
  1960. ;exit-    Z = file not found or can't open.
  1961. ;    NZ = file found and opened
  1962. ;    DE is preserved, others used
  1963.  
  1964.     LD    HL,(PATH)
  1965.     LDBCHL            ;get next dir on path
  1966.     LD    (PATH),HL
  1967.     LD    A,B        ;test for end of path
  1968.     OR    C
  1969.     RET    Z        ;Z = reached end of path
  1970.  
  1971.     EX    DE,HL
  1972.     LD    (HL),B        ;install new DU in FCB
  1973.     DEC    HL
  1974.     LD    (HL),C
  1975.     INC    HL
  1976.     LD    A,C        ;user number
  1977.     LD    BC,13        ;offset to FCB+13
  1978.     ADD    HL,BC
  1979.     LD    (HL),A        ;store user number like Z3
  1980.     SBC    HL,BC        ;recover FCB pointer
  1981.     EX    DE,HL        ;..in DE
  1982.     CALL    OPNFIL
  1983.     JR    Z,GETFIL    ;not found, try next DIR
  1984.     RET            ;found, return NZ
  1985.  
  1986. ;-------------------------------------------------------
  1987.  
  1988. GET_LF:
  1989. ;If the user has specified a DU/DIR
  1990. ;assume that the CFG file is in that
  1991. ;directory and don't bother looking in
  1992. ;a library.
  1993. ; otherwise....
  1994. ;Open the file from OVLFCB in the
  1995. ;LBR named in the LUD data structure.
  1996. ;After successful open, read the CFG
  1997. ;file into memory at (OVRLAY).
  1998. ;entry-    LUD is initialized
  1999. ;    LBR DIR has been logged in
  2000. ;exit-     Z = CFG file has been loaded
  2001. ;    NZ = CFG file not loaded because
  2002. ;      valid LBR or CFG file not found
  2003.  
  2004.     LD    A,(LUSTAT)
  2005.     OR    A
  2006.     RET    NZ        ;no valid LBR
  2007.     LD    BC,(LBRDU)
  2008.     DEC    B        ;make drive A=0 for LOGUD
  2009.     CALL    LOGUD        ;login for LBR access
  2010.     LD    HL,OVLFN
  2011.     LD    DE,LUD
  2012.     CALL    LUOPEN
  2013.     JR    NZ,GETLFE    ;CFG file not found
  2014. ;file open. Read it into memory
  2015.     LD    HL,(OVRLAY)
  2016. LREAD:    CALL    SETDMA
  2017.     CALL    LUREAD
  2018.     LD    BC,80H
  2019.     ADD    HL,BC        ;bump dma pointer
  2020.     JR    Z,LREAD
  2021. ;EOF encountered
  2022.     XOR    A        ;mark success
  2023.     RET
  2024.  
  2025. GETLFE:    LD    BC,(DEFDU)
  2026.     DEC    B        ;make 0...15
  2027.     CALL    LOGUD        ;restore default directory
  2028.     OR    0FFH        ;ensure NZ return
  2029.     RET
  2030.  
  2031. ;-------------------------------------------------------
  2032.  
  2033. NAMCHK:
  2034. ;Copy a possibly null,$,space, or High bit set
  2035. ;terminated FN from (HL) to a local buffer.
  2036. ;Return an error if illegal FN characters are
  2037. ;present.
  2038. ;entry-    HL-> possible FN
  2039. ;exit-    all used
  2040. ;    Cy set = not a FN
  2041. ;  else NC,
  2042. ;    HL -> FN in local buffer, space filled
  2043. ;     B = length
  2044.  
  2045.     LD    HL,FIDOFF+TGTBUF    ;->potential ID string
  2046.     LD    DE,TESTID    ;temporary buffer
  2047.     LD    BC,820H        ;B=maximum length,C=extra terminator
  2048.     PUSH    DE        ;for exit
  2049.  
  2050.     CALL    STRCPY
  2051.     LD    C,B        ;save for length calc.
  2052.     LD    A,SPC
  2053.     INC    B
  2054.     DEC    B        ;any to fill?
  2055.     CALL    NZ,FILL        ;trailing spaces
  2056.     LD    A,8        ;field length
  2057.     SUB    C        ;calc string length
  2058.     LD    B,A        ; in B
  2059.     POP    HL        ;->potential FN buffer
  2060.     CP    2        ;too short for a filename?
  2061.     RET    C        ;yes, if Cy set
  2062. ;test possible FN for illegal characters
  2063.     PUSH    HL
  2064.     PUSH    BC
  2065. FNTEST:    LD    A,(HL)        ;get next char
  2066.     INC    HL
  2067.     CALL    ISFNC        ;test it
  2068.     JR    C,FNTSTX    ;C = illegal FN char
  2069.     DJNZ    FNTEST
  2070. FNTSTX:    POP    BC        ;B=length, C=unused length
  2071.     POP    HL        ;-> FN buffer
  2072.     RET
  2073.  
  2074. ;-------------------------------------------------------
  2075. ;    End of routines called from FILINIT
  2076. ;=========================================================
  2077.  
  2078. SCR_LD:
  2079. ;Called once during initialization at start
  2080. ; of the program to load config items to screen.
  2081. ;Traverses the circular que of menu lists,
  2082. ;loading the screen image for each menu
  2083. ;from data in the target configuration block.
  2084.  
  2085.     LD    HL,(OVRLAY)    ;->config data just loaded
  2086.     LD    A,(HL)
  2087.     CP    0C7H        ;Is first byte RST 0?
  2088.     JR    Z,SCRLD0
  2089.     CP    0C9H        ;..or RET?
  2090.     SCF            ;set error flag
  2091.     RET    NZ        ;and return if no RET or RST 0
  2092. SCRLD0:    INC    HL        ;skip over protective rst0
  2093.     LD    E,(HL)        ;get assembled menu0 addr
  2094.     INC    HL
  2095.     LD    D,(HL)        ;..in DE
  2096.     INC    HL        ;->first menu list
  2097.     LD    (MENU0),HL
  2098.     PUSH    HL
  2099.     OR    A        ;clear carry flag
  2100.     SBC    HL,DE        ;relocation constant
  2101.     LD    (RELOCC),HL    ;save for RELOCL & RELOC routines
  2102.     POP    HL        ;->first menu
  2103.  
  2104. ;initialize the internal counter to track menu number
  2105.     XOR    A
  2106.     LD    (MNUMB),A    ;start with menu0
  2107.     DEC    A
  2108.     LD    (LMNUMB),A    ;count from -1 to allow for a
  2109.                 ;final count that is one too much
  2110.  
  2111. SCR_L0:
  2112. ;For each menu in the CFG file, relocate the main
  2113. ;menu list and load the associated screen from the
  2114. ;configuration data block in the target file.
  2115. ;Abort with an informative error message if data
  2116. ;in the target is inconsistent with CFG file format.
  2117. ;Count the number of menus and save the count.
  2118. ;entry-    (MENU0) = (OVRLAY)+3
  2119. ;    (RELOCC) is valid
  2120. ;    HL = (MENU0)
  2121. ;exit-    The first menu (menu 0) is current
  2122. ;    All registers used
  2123.  
  2124.     LD    B,(EMENLST-MENLST)/2
  2125.     LD    DE,(RELOCC)    ;relocation constant
  2126.     CALL    RELOCL        ;relocate menu list in cfg file image
  2127.     CALL    LDMENL        ;and transfer to local menu list
  2128.  
  2129.     CALL    MAPPER        ;load the screen, relocate parameters
  2130.     JP    C,CFGBAD    ;target data/cfg format mismatch
  2131.  
  2132.     LD    HL,LMNUMB    ;bump last menu number
  2133.     INC    (HL)
  2134.     LD    HL,MNUMB    ;..and current menu number
  2135.     INC    (HL)
  2136.  
  2137.     LD    DE,(NEXTM)    ;->next menu list
  2138.     LD    HL,(MENU0)    ;..and menu 0
  2139.     OR    A
  2140.     SBC    HL,DE        ;are they the same?
  2141.     EX    DE,HL        ;HL -> next menu list
  2142.     JR    NZ,SCR_L0    ;continue while not menu0
  2143.  
  2144.     CALL    LDMENL        ;reload menu0 list
  2145.     XOR    A
  2146.     LD    (MNUMB),A    ;and show which one it is
  2147.     DEC    A
  2148.     LD    (RELFLG),A    ;show relocation done
  2149.     RET
  2150.  
  2151. ;=========================================================
  2152.  
  2153. RELOAD:
  2154. ;Reload all screen images from target configuration
  2155. ;data buffer.
  2156. ;entry-    Menu lists have already been relocated
  2157. ;    HL -> source of current menu list
  2158. ;exit-    The menu (and screen) which was current at
  2159. ;    invokation is restored with updated data.
  2160. ;    All registers used
  2161.  
  2162. ;save the current menu state
  2163.     LD    DE,(MNUMB)
  2164.     PUSH    DE        ;current menu number & last menu number
  2165.     PUSH    HL        ;current menu pointer
  2166.  
  2167.     XOR    A        ;start reload with menu 0
  2168.     LD    (MNUMB),A
  2169.     LD    HL,(MENU0)
  2170.  
  2171. ;loop through all menus, updating each screen
  2172. RLDSC0:    CALL    LDMENL        ;load current menu
  2173.     CALL    MAPPER        ;load the associated screen
  2174.     
  2175.     LD    HL,(NEXTM)    ;->next menu to load
  2176.     LD    E,1        ;increment menu number
  2177.     CALL    MNADJ        ;returns A=(MNUMB)
  2178.     OR    A        ;back to menu 0 yet?
  2179.     JR    NZ,RLDSC0    ;continue while not menu0
  2180.  
  2181. ;restore the initial current menu
  2182. RLDSCX:    POP    HL        ;current menu pointer
  2183.     POP    DE        ;current, last menu number
  2184.     LD    (MNUMB),DE    ;restore them
  2185.     CALL    LDMENL        ;reload current menu & return
  2186.     LD    (UPDFLG),A    ;use 0 returned by ldmenl
  2187.     RET            ; to declare no pending changes
  2188.  
  2189. ;=========================================================
  2190.     .SBTTL SCREEN UPDATE FROM CFG BLOCK
  2191.     PAGE
  2192. ;=========================================================
  2193. ;ROUTINES TO TRANSFER CONFIGURATION BLOCK DATA TO THE
  2194. ;    SCREEN IMAGE
  2195. ;=========================================================
  2196.  
  2197. MARKER:
  2198. ;called from GETINP code when a change to the
  2199. ;target cfg block is made. Marks CFG block
  2200. ;changed and updates all items on current screen.
  2201.     LD    A,-1
  2202.     LD    (UPDFLG),A    ;show change made
  2203.  
  2204. ;fall through and update the current screen
  2205. ;=========================================================
  2206.  
  2207. MAPPER:
  2208. ;MAPPER traverses a list of records which
  2209. ;contain the data required to maintain one
  2210. ;Menu screen and associated cfg data.
  2211. ;Each record contains the parameters required for
  2212. ;maintaining one menu item. For each record,
  2213. ;the parameter list is copied to the local data
  2214. ;structure at OFFSET and then the initialization
  2215. ;portion of the function named in the record is
  2216. ;called to transfer data from the CFG block to the
  2217. ;screen image.
  2218. ;entry- none
  2219. ;exit-    all registers used.
  2220. ;    HL -> next address after last record
  2221.  
  2222.     LD    HL,(CASTBL)    ;get current case table
  2223.     LD    B,(HL)        ;number of entries
  2224.     INC    HL
  2225.     LD    E,(HL)        ;length of each entry
  2226.     INC    HL        ;->first record
  2227.     LD    D,0
  2228.     LD    (MAPER3+1),DE
  2229.     DEC    E        ;discount menu ID byte
  2230.     DEC    E        ;..and Function number word
  2231.     DEC    E        ;de=length of parameter list
  2232.     LD    (MAPER1+1),DE
  2233.  
  2234. ;visit each record, calling the function required
  2235. ;to load the screen image for each menu item.
  2236. MAPER0:    PUSH    BC        ;save record counter
  2237.     PUSH    HL        ;..and start of current record
  2238.     LD    A,(HL)        ;get menu ID letter
  2239.     LD    (CURITM),A    ;save for possible error report
  2240.     INC    HL
  2241.     LD    C,(HL)        ;get function address
  2242.     INC    HL
  2243.     LD    B,(HL)        ;...in BC
  2244.     INC    HL        ;->start of parameter list
  2245.     CALL    FNXLTI        ;cnvt function number to address
  2246.     PUSH    BC        ;and save for indirect call
  2247.  
  2248.     PUSH    HL
  2249.     CALL    RELOC        ;add tgtbuf to offset, reloc addresses
  2250.     POP    HL
  2251.  
  2252. ;transfer the parameter list at HL to the standard block
  2253.     LD    DE,OFFSET
  2254. MAPER1:    LD    BC,0        ;parm list length entered above
  2255.     LDIR            ;copy to standard parm list
  2256.  
  2257.     POP    HL        ;function address
  2258.     CALL    JPHL        ;Call function via HL
  2259. ;The called routine uses data in the standard block
  2260. ;as required to update the screen image.
  2261. MAPER2:    POP    HL        ;recover the record pointer
  2262.     POP    BC
  2263.     RET    C        ;quit on error from LD function
  2264. MAPER3:    LD    DE,0        ;filled at run time
  2265.     ADD    HL,DE        ;-> next table entry
  2266.     DJNZ    MAPER0
  2267.     RET
  2268.  
  2269. JPHL:    JP    (HL)        ;for indirect calls
  2270.  
  2271. ;=========================================================
  2272.  
  2273.     .SBTTL ERROR HANDLING
  2274.     PAGE
  2275. ;=========================================================
  2276. ;    ERROR HANDLERS
  2277. ;=========================================================
  2278.  
  2279. BADDU:
  2280. ;here if FNAME finds a bad DU in cmd tail
  2281.     LD    DE,BDUMSG
  2282.     CALL    TYPLIN
  2283.     JP    DOHELP        ;show help and abort
  2284.  
  2285. ;=========================================================
  2286.  
  2287. BADCFG:
  2288. ;The overlay file does not start with
  2289. ;RST 0 or RET code. Must be damaged.
  2290.     LD    DE,ERMSG0
  2291.     JR    EABORT
  2292.  
  2293. ;=========================================================
  2294.  
  2295. CFGBAD:
  2296. ;Data in the target is inappropriate for
  2297. ;the screen format specified by the overlay.
  2298.     LD    DE,ERMSG2
  2299.     JR    EABORT
  2300.  
  2301. ;=========================================================
  2302.  
  2303. BADOVL:    LD    HL,OVLFN
  2304.     LD    DE,OVFNAM
  2305.     CALL    PUTZFS        ;send ovl filename to msg
  2306.     LD    A,(MNUMB)
  2307.     LD    DE,BADMNU
  2308.     CALL    MAFDC        ;send menu number to msg
  2309.     LD    DE,OVLMSG
  2310.     JR    EABORT
  2311.  
  2312. ;=========================================================
  2313.  
  2314. BADFIL:
  2315. ;Here if a file cannot be opened. Usually a bad filename.
  2316. ;entry- DE->fcb for the attempted operation
  2317.  
  2318.     INC    DE        ;->file name
  2319.     LD    B,8
  2320.     CALL    BADLOP        ;send filename to console
  2321.     LD    A,'.'
  2322.     CALL    COUT        ;send '.' in FN.FT
  2323.     LD    B,3
  2324.     CALL    BADLOP        ;send file type
  2325.     LD    DE,ERMSG1    ;report not found
  2326.     JR    EABORT
  2327.  
  2328. ;send up to B characters to console, skipping spaces
  2329. BADLOP:    LD    A,(DE)
  2330.     INC    DE
  2331.     CP    ' '
  2332.     JR    Z,BADSKP
  2333.     CALL    COUT
  2334. BADSKP:    DJNZ    BADLOP
  2335.     RET
  2336.  
  2337. ;=========================================================
  2338.  
  2339. EABORT:
  2340. ;send an error message to console and abort
  2341. ;entry-    DE->error message
  2342.     CALL    TYPLIN
  2343.     JP    QUIT
  2344.  
  2345. ;=========================================================
  2346.  
  2347.     .SBTTL DATA & MESSAGES
  2348.     PAGE
  2349. ;=========================================================
  2350. ;    INITIALIZED DATA AREA
  2351. ;=========================================================
  2352.  
  2353. OVRLAY:                ;overlay is loaded in free memory
  2354. $MEMRY:    DS    2        ;filled in by linker
  2355.  
  2356. ;=========================================================
  2357. ;    MESSAGES
  2358.  
  2359. SIGNON:        ;signon banner
  2360.     DB CR,LF,LF,'ZCNFG CONFIGURATION UTILITY, V'
  2361.     DB    VERS+'0','.',REV+'0',' ('
  2362.     DB    MONTH/10+'0',MONTH MOD 10+'0','/'
  2363.     DB    DAY/10+'0',DAY MOD 10+'0','/'
  2364.     DB    YEAR/10+'0',YEAR MOD 10+'0',')'
  2365.     DB    CR,LF,0
  2366.  
  2367. BADMSG:    DB    cr,'Invalid command. Try Again: ',0
  2368.  
  2369. FTMSG:    DB    ')  -Enter up to '
  2370. FTMSG1:    DB    '3  characters: ',0
  2371.  
  2372. PRMPD0:    DB    ') Enter a number ',0
  2373. PRMPH0:    DB    ') Enter HEX ',0
  2374. PRMPT1:    DB    ' =>',0
  2375. FROMP:    DB    'from ',0
  2376. TOMSG:    DB    ' to ',0
  2377.  
  2378. BDUMSG:    DB cr,lf,'Check for possible Drive or user error..',cr,lf,lf
  2379.  
  2380. DUMSG:    DB    ") New DU",0
  2381. DUMSG1:    DB    " ('?' for default) ",0
  2382.  
  2383. PSEMSG:        ;prompt for next menu help screen
  2384.     DB    '(Space or CR to continue, ^C for Menu)',cr
  2385.     DB    0        ;string terminator
  2386.  
  2387. ERMSG0:        ;Invalid overlay file
  2388.     DB    'BAD CFG FILE - Does not start with RST 0'
  2389.     DB    ' or RET code.',CR,LF
  2390.     DB    0        ;string terminator
  2391.  
  2392. ERMSG1:        ;report not found
  2393.     DB    ' was not found.',cr,lf
  2394.     DB    0        ;string terminator
  2395.  
  2396. ERMSG2:    DB    'Target data inappropriate for this overlay - '
  2397.     DB    'WRONG CONFIGURATION OVERLAY?',CR,LF
  2398.     DB    0        ;string terminator
  2399.  
  2400. FN6MSG:    DB    ') Enter filespec option ',0
  2401.  
  2402. OVLMSG:    DB    CR,LF,'BAD DATA IN '
  2403. OVFNAM:    DB    '                '
  2404.     DB    ' in the case table for menu #'
  2405. BADMNU:    DB    '   , item '
  2406. CURITM:    DB    ' '        ;current menu choice
  2407.     DZ    CR,LF
  2408.  
  2409. ;=========================================================
  2410.  
  2411. SPACES:    DB    '      '    ;for an empty field....
  2412.     DB    0        ;string terminator
  2413.  
  2414. ;======================================================
  2415.     .SBTTL CONTROL SCREEN IMAGE
  2416.     PAGE
  2417. ;=========================================================
  2418.  
  2419. ;screen image for menu & pgm control selections.
  2420. ;This screen is always appended to target-specific
  2421. ;menus provided by the configuration overlay.
  2422.  
  2423. ZMENU0:    DB    '  ZCNFG COMMANDS  ',0
  2424. ZMENU1:    DB    CR,LF
  2425.     DB    ' / ',DIM,' Explain Options    ',BRIGHT,'   >'
  2426.     DB    ' ',DIM,' Next Menu        ',BRIGHT,'  Esc ',DIM
  2427.     DB    ' Save Changes & eXit  ',BRIGHT,'  ',CR,LF
  2428.     DB    ' ? ',DIM,' Explain Commands   ',BRIGHT,'   <'
  2429.     DB    ' ',DIM,' Previous Menu    ',BRIGHT,'  ^C  ',DIM
  2430.     DB    ' Quit with no changes ',BRIGHT,'  ',CR,LF
  2431.     DB    CR,LF
  2432. BAR000:    DB    ' Which choice? ',0
  2433.  
  2434. ;=========================================================
  2435.  
  2436. ;Menu & Pgm control options case table
  2437. ;This table is searched last for program control
  2438. ;options. If a match is not found, then the entry
  2439. ;at CTLCSE is executed as a default.
  2440. CTLCS0:    DB    (ctlcse-ctlcs1)/(ctlcs2-ctlcs1)    ;number of cases
  2441.     DB    ctlcs2-ctlcs1            ;bytes per record
  2442. CTLCS1:    DB    '/'        ;explain CFG menu items
  2443.     DW    MNUHLP
  2444. CTLCS2:    DB    '?'        ;explain internal menu items
  2445.     DW    CMDHLP
  2446.     DB    'Q'        ;quit - no update
  2447.     DW    QUIT
  2448.     DB    'Q'-'@'        ;quit - no update
  2449.     DW    QUIT
  2450.     DB    CTLC        ;also quit on ^C
  2451.     DW    QUIT
  2452.     DB    CR        ;Re-prompt if CR
  2453.     DW    CRNTRY
  2454.     DB    '>'        ;next menu
  2455.     DW    GOTONM
  2456.     DB    'D'-'@'        ;next menu
  2457.     DW    GOTONM
  2458.     DB    'F'-'@'        ;next menu
  2459.     DW    GOTONM
  2460.     DB    '.'        ;next menu
  2461.     DW    GOTONM
  2462.     DB    '<'        ;previous menu
  2463.     DW    GOTOLM
  2464.     DB    'A'-'@'        ;previous menu
  2465.     DW    GOTOLM
  2466.     DB    'S'-'@'        ;previous menu
  2467.     DW    GOTOLM
  2468.     DB    ','        ;previous menu
  2469.     DW    GOTOLM
  2470.     DB    'X'        ;quit with options updated
  2471.     DW    EXIT
  2472.     DB    'X'-'@'        ;quit with options updated
  2473.     DW    EXIT
  2474.     DB    'W'        ;quit with options updated
  2475.     DW    EXIT
  2476.     DB    'W'-'@'        ;quit with options updated
  2477.     DW    EXIT
  2478.     DB    ESC        ;quit with options updated
  2479.     DW    EXIT
  2480. CTLCSE:        ;label used to calc number of entries
  2481.     DB    0        ;dummy entry for default case
  2482.     DW    BADCMD        ;default case, err msg & ret C
  2483.  
  2484.     PAGE
  2485. ;=========================================================
  2486.  
  2487. CMDMSG:        ;Help for command keystrokes
  2488.     DB    CR,LF
  2489.     DB    'Other keys perform the same functions as those'
  2490.     DB    ' shown at the',CR,LF
  2491.     DB    'bottom of the main screen. Use them if that''s'
  2492.     DB    ' what your fingers',CR,LF
  2493.     DB    'prefer. If X, W, or Q are present as selections'
  2494.     DB    ' in the main menu',CR,LF
  2495.     DB    'then they perform the configuration function'
  2496.     DB    ' and NOT the function',CR,LF
  2497.     DB    'shown below.',CR,LF,CR,LF
  2498.     DB    'Command         Alternates  ',HT,'Function performed'
  2499.     DB    CR,LF,CR,LF
  2500.     DB    '   /               (none)   ',HT,'display CFG'
  2501.     DB    ' help screens',CR,LF
  2502.     DB    '   ?               (none)   ',HT,'display this'
  2503.     DB    ' screen',CR,LF
  2504.     DB    '   >               . ^D ^F  ',HT,'display next'
  2505.     DB    ' CFG menu',CR,LF
  2506.     DB    '   <               , ^A ^S  ',HT,'display previous'
  2507.     DB    ' CFG menu',CR,LF
  2508.     DB    '   Esc             X ^X W ^W',HT,'save changes'
  2509.     DB    ' and exit',CR,LF
  2510.     DB    '   ^C              Q ^Q     ',HT,'exit without'
  2511.     DB    ' saving changes',CR,LF
  2512.     DB    0
  2513.  
  2514. ;=========================================================
  2515.  
  2516. HLPMSG:        ;The Help Screen
  2517.     DB    CR,LF
  2518.     DB    'Configures option data in Executable files (TFS), using'
  2519.     DB    ' a configuration',CR,LF
  2520.     DB    'data file (FS) which may be in a LBR (/FS or [DIR:]FN.LBR).'
  2521.     DB    CR,LF,CR,LF
  2522.     DB    'Syntax: '
  2523. HLP000:    DB    ' ZCNFG   TFS  [[/]FS]  [[/]FS]',CR,LF,CR,LF
  2524.     DB    'Examples:  (Configure TGT.COM, default LBR is '
  2525. HLP001:    DB    '   :'
  2526. HLP002:    DB    'config.lbr  )',CR,LF,CR,LF
  2527.     DB    '     ZCNFG TGT TGT /CFG01     ;uses TGT.CFG in CFG01.LBR'
  2528.     DB    CR,LF
  2529.     DB    '     ZCNFG TGT /CFG01 TGT     ;order of args 2,3 optional'
  2530.     DB    ' with ''/''',CR,LF
  2531.     DB    '     ZCNFG TGT TGT CFG01      ;''/'' optional if LBR is'
  2532.     DB    ' 3rd argument',CR,LF
  2533.     DB    '     ZCNFG TGT CFG01.LBR      ;''/'' optional with explicit'
  2534.     DB    ' .LBR',CR,LF
  2535.     DB    '     ZCNFG TGT TGT            ;TGT.CFG on Path (includes'
  2536.     DB    ' default LBR)',CR,LF
  2537.     DB    '     ZCNFG TGT                ;<internal FN.CFG> or TGT.CFG'
  2538.     DB    ' on Path',CR,LF
  2539.     DB    '     ZCNFG ZCNFG              ;configures itself to assign'
  2540.     DB    ' ALT:, etc.',CR,LF,CR,LF
  2541.     DB    'FS, TFS are ZCPR style filespecs. All parts optional except'
  2542.     DB    ' TGT FN.',CR,LF
  2543.     DB    'Seeks FS files on a configurable internal path which includes'
  2544.     DB    CR,LF
  2545.     DB    ' Alt Directory unless superseded by a DIR: form in FS.'
  2546.     DB    CR,LF
  2547.     DB    'See ZCNFG.HLP for full syntax and usage. ',CR,LF
  2548.     DB    0
  2549.  
  2550. ;=========================================================
  2551. ;    UNINITIALIZED DATA
  2552.  
  2553.     DSEG
  2554. UDSTART:            ;labels DS block for initialization
  2555. Z3ENVF:    DS    1        ;0=no Z3ENV, 0ffh=Z3ENV address present
  2556. GZ3FLG:    DS    1        ;bit mapped TCAP capability limits
  2557. DEFDU:    DS    2        ;default DU at signon, drv is 1..16
  2558. COLCNT:    DS    1        ;screen column counter
  2559. ROWCNT:    DS    1        ;screen line counter
  2560. RELOCC:    DS    2,0        ;overlay relocation constant
  2561. FCB_CR:    DS    1        ;current record at start of cfg block
  2562. NCRECS:    DS    1        ;number rcrds in cfg block (1 or 2)
  2563. CFGFLG:    DS    1        ;TRUE if CFG file named on cmd line
  2564. LBRFLG:    DS    1        ;TRUE if LBR file named on cmd line
  2565. RELFLG:    DS    1        ;Set to NZ after relocation
  2566. UPDFLG:    DS    1        ;NZ = Screen update required
  2567.  
  2568.  
  2569. VSNDAT:    DS    3        ;month,day,year - packed bcd
  2570.  
  2571. TIMSTR:    DS    6,0FFH        ;room for standard date/time,
  2572.                 ;yy mm dd hr min sec
  2573.  
  2574. TESTID:    DS    8        ;trial FN buffer
  2575.  
  2576. ;these are initialized at scr_ld
  2577. MNUMB:    DS    1        ;current menu number, for error reports
  2578. LMNUMB:    DS    1        ;last menu number (first is 0)
  2579. MENU0:    DS    2        ;memory address for menu 0
  2580. ;maintained by LDMENL
  2581. CMENU:    DS    2        ;memory address for current menu
  2582.  
  2583. UCFLAG:    DS    1        ;bitmapped string processing control
  2584.                 ;bit 0:0=UC only, 1=both LC,UC
  2585.                 ;bit 7:0=HBS not allowed, 1=HBS is OK
  2586. ERRCTL:    DS    1        ;bit mapped error test control flag
  2587.  
  2588. ;CFG file search paths
  2589. PATH:    DS    2        ;Current path pointer
  2590. PATH11:    DS    2
  2591. PATH12:    DS    2
  2592.     DS    2        ;first path terminator
  2593. PATH21:    DS    2
  2594. PATH22:    DS    2
  2595.     DS    2        ;second path terminator
  2596.  
  2597. ;note the extended FCBs. User number precedes
  2598. ;the drive byte in the normal FCB. Routines in
  2599. ;ZCNFG use this byte for auto-select. (see OPNFIL)
  2600. OVLUSR:    DS    1        ;user area for overlay
  2601. OVLFCB:    DS    1        ;overlay drive
  2602. OVLFN:    DS    8        ;overlay filename
  2603. OVLFT:    DS    3        ;filetype
  2604.     DS    24        ;balance of fcb
  2605.  
  2606. LBRDU:    DS    2        ;DU used for LBR, drv is 0..15
  2607. LUD:    DS    2        ;Length of LBR directory
  2608.     DS    2        ;Next block of current file
  2609.     DS    2        ;Remaining blocks, current
  2610. LUDFIL:    DS    11        ;current FN
  2611. LUDFCB:    DS    36        ;FCB for Library
  2612. LUDFN    EQU    LUDFCB+1
  2613. LUDFT    EQU    LUDFCB+9
  2614. LUDUSR    EQU    LUDFCB-1
  2615. LUSTAT:    DS    1        ;return from LUINIT
  2616.  
  2617. TMPSCR:    DS    30,0        ;temporary input data buffer
  2618. TMPUSR:    DS    1        ;user byte for temp fcb
  2619. TMPFCB:    DS    36        ;temp fcb for fname destination
  2620. TMPFN    EQU    TMPFCB+1    ; and for CFG file name
  2621. TMPFT    EQU    TMPFCB+9
  2622.  
  2623. TGTUSR:    DS    1        ;user number for tgt
  2624. TGTFCB:    DS    1        ;drive
  2625. TGTFN:    DS    8        ;target filename
  2626. TGTFT:    DS    3        ;target file type
  2627.     DS    24        ;balance of tgt fcb
  2628.  
  2629. UDLEN    EQU    $-UDSTART
  2630.  
  2631. ;local stack & system stack pointer
  2632.     DS    40
  2633. STACK:    DS    2
  2634.  
  2635. TGTBUF:    DS    100H        ;working buffer for first
  2636.                 ;two records from target file
  2637.     END
  2638.