home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / ZCPR33 / A-R / EDITND.LBR / EDITND.ZZ0 / EDITND.Z80
Text File  |  2000-06-30  |  41KB  |  1,542 lines

  1. ; Program: EDITND  - EDIT the resident Named Directory
  2.  
  3. ;EDITND is copyright by A. E. Hawley January 30, 1987.
  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.  The author may be reached 
  7. ;via electronic mail at the Ladera Z-Node in Los Angeles,
  8. ;213-670-9465, or through the Lillipute Z-Node in Chicago 
  9. ;at 312-649-1730.
  10. ;
  11. ;EDITND is released for beta test through the Z-system 
  12. ;users group Z-SIG on January 30, 1987 by the author.
  13.  
  14.     .sall        ;suppress macro code
  15.  
  16. ; Author: Al Hawley, Ladera Z-Node, (213) 670-9465
  17.  
  18. Vers    equ '1'        ;version number, ascii
  19. rev    equ '0'        ;revision number, ascii
  20.  
  21. ;the following will normally be a quoted space character
  22. ;in released versions. The letter is meaningful during the
  23. ;testing of modified versions until modifications are complete.
  24. beta    equ 'a'        ;quoted lc letter for test versions
  25.  
  26. ; Version Date: 01/21/87
  27. ; Previous versions: none
  28. ;
  29. ; PROGRAM FUNCTION:
  30. ;      Edit the System Named Directory. Change, add,
  31. ; or delete directory names and passwords. The changes
  32. ; are to the resident Named Directory buffer, but may
  33. ; be aborted (restored to original) if desired.
  34. ;      Multiple commands on the command line or in
  35. ; interactive mode are supported. Commands on the invoking
  36. ; command line produce no unsolicited console output, so
  37. ; this program can execute silently in an alias or RAS
  38. ; environment. In the interactive mode, command errors are
  39. ; explained only on request. The HELP screen is automatically
  40. ; maintained; so if you change the name of the program, the
  41. ; version number, or the command separator character, the
  42. ; HELP information will remain relevant.
  43. ;      If an error condition occurs during execution of commands
  44. ; from the invoking command line, the error code is placed in
  45. ; the ZCPR3 program error code byte. There, it can be tested
  46. ; by IF.COM and appropriate action taken.
  47. ; See EDITND.DOC for details.
  48.  
  49. ;***************************************************
  50. ;THIS SOURCE FILE IS CODED TO ASSEMBLE WITH THE
  51. ; ZAS (FROM ECHELON) AND COMPATIBLE ASSEMBLERS.
  52. ; OTHERS MAY REQUIRE SOME TRANSLATION.
  53. ;***************************************************
  54.  
  55. ;The following tells ZAS to pass
  56. ;names of libraries to ZLINK. The link command line
  57. ;does not need to name the libraries
  58.  
  59.     .REQUEST Z3LIB,SYSLIB
  60.  
  61. ; External Z3LIB Routines
  62.     EXT    Z3INIT,GETNDR,GETEFCB,GETMDISK
  63.     EXT    GETWHL,DUTDIR,DNSCAN,GETER2,PUTER2
  64.  
  65. ; External SYSLIB Routines
  66.     EXT    CODEND,SUA,RETUD,LOGUD
  67.     EXT    SKSP,SKNSP,ACASE3,ARGV
  68.     EXT    MULHD,SSBINIT,SORT,COMPB
  69.     EXT    COUT,CRLF,PADC,PSTR,PRINT
  70.     EXT    BLINE
  71.  
  72. ;
  73. ; External VLIB Routines
  74. ;
  75. ; Other External Library Routines
  76. ;
  77. ; COMMON ASCII & SYSTEM DEFINITIONS
  78.     .xlist
  79.     .IN    SYSDEF
  80.     .list
  81. ;DEFINITIONS UNIQUE TO THIS PROGRAM
  82.  
  83. ENTLEN    equ    18    ; NDR Entry Len = 18 bytes
  84.  
  85. ;***************************************************
  86. ;MACRO DEFINITIONS
  87.  
  88. ;Toggle the value of a named memory location
  89. ;typically, the values toggle between 00 and ffh
  90. ; (i.e., False and True)
  91. TOGGLE    MACRO    FLAG
  92.     LD    A,(FLAG)
  93.     CPL
  94.     LD    (FLAG),A
  95.     ENDM
  96.  
  97. ;set a value into a memory variable
  98. ;typically True or False
  99. MAKE    MACRO    FLAG,VAL
  100.     LD    A,VAL
  101.     LD    (FLAG),A
  102.     ENDM
  103.  
  104. ;load reg hl from the address in hl
  105. LDHLHL    MACRO
  106.     LD    A,(HL)
  107.     INC    HL
  108.     LD    H,(HL)
  109.     LD    L,A
  110.     ENDM
  111.  
  112. ;LOAD (HL) FROM DE
  113. STDEHL    MACRO
  114.     LD    (HL),E
  115.     INC    HL
  116.     LD    (HL),D
  117.     ENDM
  118.  
  119. ;***************************************************
  120.  
  121. ;program code starts here..
  122.  
  123.     JP    START
  124.     DB    'Z3ENV'        ;This is a ZCPR3 Utility
  125.     DB    1        ;External Environment Descriptor
  126.  
  127. Z3EADR: DW    0fe00h        ;this is corrected by Z3INS
  128.  
  129. ;***************************************************
  130.  
  131. ctermd:    db    '\'    ;multiple cmd separator
  132. hlprqd:    db    true    ;show help after error note
  133. errbel:    db    true    ;sound terminal bell on error
  134. ernote:    db    true    ;emit error warning msg
  135.  
  136. ;***************************************************
  137.  
  138. START:    LD    HL,(Z3EADR)    ;pt to ZCPR3 environment
  139.     CALL    Z3INIT        ;initialize the ZCPR3 Environment
  140.  
  141. ;***************************************************
  142. ;This is the main routine, from which all other
  143. ;functions are called.
  144.  
  145. MAIN:    ld    (stak), sp    ; save callers stack for exit
  146.     ld    sp, stak    ; set up local stack
  147.     call    init        ; test for z3env and sys NDR,
  148.                 ; initialize local ndr buffer
  149.                 ; store data for NDR, default disk
  150.  
  151.     call    copyin        ; save a system NDR copy for abort
  152.                 ; after changes were made.
  153.  
  154.     call    getail        ;move command tail to cl buffer
  155.     call    nz,doline    ;parse & execute commands if present
  156.     make    lclcmd,true    ;declare interactive mode
  157.  
  158. main1:    call    kbdin        ;get user command line input
  159.     call    doline        ;parse & execute commands
  160.     jr    nz,main1    ;do cmds until exit condition
  161.  
  162. exit:    call    wrapup        ;deinitialization
  163.     ld    sp, (stak)    ;done. Return quiet (no warm boot)
  164.     ret
  165.  
  166. ;***************************************************
  167.  
  168. ;wrapup: set/reset system messages, disk system,
  169. ; and any other miscellaneous housecleaning
  170. ; before returning to the operating system.
  171.  
  172. wrapup:
  173. ;reset the warm boot trap
  174.     ld    hl,(1)        ;->bios wbjump
  175.     inc    hl        ;.. the jmp addr
  176.     ld    de,(wbaddr)    ;recover the saved addr
  177.     stdehl            ;(hl)<-de
  178.  
  179. ;if in Z3 commandline mode and an error has been
  180. ;detected (causing an exit) then set the error flag
  181. ;value into the Z3 program error code.
  182.     xor    a
  183.     call    puter2        ;reset pgm error code
  184.     ld    a,(lclcmd)
  185.     or    a        ;exiting from invoking CL?
  186.     ld    a,(errflg)    ;get the error flag (0 if no error)
  187.     call    z,puter2    ;z=yes, pass error msg to system
  188.  
  189. ;If no changes have been made, skip the following.
  190.     ld    a,(chgflg)
  191.     or    a
  192.     ret    z
  193.  
  194. ;if the abort flag is set, replace the
  195. ; ndr with the local copy saved at the
  196. ; start of the program.
  197.     ld    a,(abtflg)
  198.     or    a
  199.     jp    nz,copyout    ;copy local ndr buffer to system ndr
  200.  
  201. ;If sort flag is set, sort the ndr
  202.     ld    a,(srtflg)
  203.     or    a
  204.     call    nz,ndrsrt    ;sort the entries into D/U order
  205.  
  206.     ret
  207.  
  208. ;***************************************************
  209.  
  210. ;transfer the command line tail into the local
  211. ; input buffer (keybuf) for execution.
  212. getail:    ld    hl,tbuf        ;point to command tail
  213.     ld    a,(hl)        ;get character count
  214.     ld    (keycnt),a    ;..save in keybuf counter
  215.     or    a,a        ;test for null
  216.     ret    z        ;don't move empty tail..
  217.                 ;..return false instead
  218.     inc    hl        ;point to command tail
  219.     ld    de,keybuf    ;destination
  220.     ld    c,a        ;for ldir
  221.     ld    b,0
  222.     ldir            ;move the tail
  223.     ld    a,b        ;enter the...
  224.     ld    (de),a        ;terminating null
  225.     ld    (eoline),a    ;say last cmd not done yet
  226.     dec    a
  227.     ret            ;return true
  228.  
  229. ;***************************************************
  230.  
  231. ; doline: scan the command line for commands.
  232. ; If none are found, then display the current directories
  233. ; and return to caller.
  234. ; Else execute the commands.
  235. ; Return TRUE after completion of commands.
  236. ; Return FALSE after completion of any command that
  237. ;  requires an abort to the system.
  238.  
  239. doline:
  240.  
  241. tfetch:    call    cfetch        ;move a single command to cmbuf
  242.     jr    z,tpexit    ;exit if no more commands
  243.     call    cmproc
  244.     jr    nz,tfetch    ;repeat if no error
  245. ;arrive here on a command error
  246.     ld    a,(lclcmd)    ;if invoked by Z3 cmd line
  247.     or    a
  248.     jr    z,exit        ;..terminate the pgm
  249. ;any error is recorded by error flag and will
  250. ;be detected on the next cycle through cmproc
  251. tpexit:    xor    a        ;normal exit
  252.     dec    a
  253.     ret            ;return true
  254.  
  255. fpexit:    xor    a
  256.     ret            ;return False
  257.  
  258. ;***************************************************
  259.  
  260. cmproc:
  261.  
  262.     ld    hl,spaces    ;initialise argv pointers
  263.     ld    (arg1),hl
  264.     ld    (arg2),hl
  265.     ld    (arg3),hl
  266.     ld    hl,0        ;..and parameter codes
  267.     ld    (a1code),hl
  268.     ld    (a3code),hl
  269.  
  270.     ld    de,argvtb    ;result table
  271.     ld    hl,cmdbuf    ;->command to parse
  272.     ld    a,h        ;null terminate tokens
  273.     call    argv        ;ret. pointers to 1 to 4 args.
  274. ;returns True if more args than allowed, else False
  275.     ld    a,5        ;error code for too many args
  276.     jr    nz,cmerr    ;jump if true return
  277.  
  278.     ld    a,(argnum)    ;is the number of args
  279.     or    a        ;..zero?
  280.     jr    z,makey        ;finish up if yes
  281.  
  282.     call    tst1ch        ;single ltr command?
  283.     jr    nz,makey    ;finish up if yes(nz)
  284.     or    a        ;test error return code
  285.     jr    nz,cmerr    ;invalid character error
  286.  
  287.     call    tstdir        ;analyse arg1
  288.     jr    z,cmerr        ;if invalid, error exit
  289.  
  290.     call    tsta23        ;analyse arg2 & arg3
  291.     jr    z,cmerr
  292.  
  293. makey:    ld    bc,(a2code)    ;get arg parameters
  294.     ld    a,(a1code)
  295.     ld    hl,argnum
  296.     add    b        ;calculate sum (=ckey)
  297.     add    c        ;ckey = argnum + a1code...
  298.     add    (hl)        ;..+ a2code + a3code
  299.     ld    (ckey),a    ;key for indexing in case call
  300.     ld    de,ctable    ;table of keys & cmd routines
  301.     call    acase3        ;go execute command
  302.     jr    z,cmerr        ;error/abort if z. error type in acc
  303.                 ;else eoline flag in acc?????
  304.  
  305. tcmxit:    xor    a        ;True CMproc eXIT
  306.     ld    (errflg),a    ;clear error flag
  307.     dec    a
  308.     ret            ;return true
  309.  
  310. cmerr:    ld    (errflg),a    ;record the error type
  311.     ld    (errhst),a
  312.     ld    hl,cmdcnt    ;source: single command buff
  313.     ld    de,cmdhst    ;dest: command history buff
  314.     ld    a,(hl)        ;get cmd char count
  315.     ldi            ;transfer to dest, dec hl,de
  316.     ld    b,a        ;loop counter
  317. cmerr1:    ld    a,(hl)        ;pick up a char
  318.     or    a        ;is it null?
  319.     jr    nz,cmerr2
  320.     ld    a,' '        ;yes, change to a space
  321. cmerr2:    ld    (de),a        ;copy to history buff
  322.     inc    de        ;bump pointers
  323.     inc    hl
  324.     djnz    cmerr1        ;repeat b times
  325.     xor    a        ;make a null
  326.     ld    (de),a        ;terminate string in cmdhst
  327.     ret            ;return False, showing error
  328.  
  329. ;***************************************************
  330.  
  331. tst1ch:
  332. ;test arg1 to see if only one character.
  333. ;if so, get the char in acc, subtract the
  334. ;value in argnum, and store it in a1code.
  335. ;The subtraction compensates for later addition
  336. ; of (argnum) during calculation of ckey, and
  337. ; preserves the ascii value for use in the case table.
  338. ;returns true if arg1 is one character, else false
  339.     ld    hl,(arg1)
  340.     push    hl
  341.     inc    hl        ;->2nd char
  342.     ld    a,(hl)
  343.     or    a        ;terminator?
  344.     jr    nz,not1        ;no, more than one char
  345.     dec    hl        ;->char
  346.     ld    a,(hl)        ;get it
  347.  
  348.     cp    a,'/'
  349.     jr    z,tst1ok
  350.     cp    a,'>'        ;'?' or alpha?
  351.     jr    c,badchr    ;cy=no, bad char
  352.  
  353. tst1ok:    ld    hl,argnum
  354.     sub    (hl)        ;subtract argnum
  355.     ld    (a1code),a    ;store the parameter
  356.     pop    hl
  357. optx:    xor    a
  358.     dec    a
  359.     ret            ;return true
  360.  
  361. not1:    pop    hl
  362.     ld    a,(hl)
  363.     cp    '/'        ;option char?
  364.     jr    z,optch        ;z=yes
  365.     xor    a        ;not a single char arg
  366.     ret            ;return false
  367.  
  368. optch:    ld    a,1        ;put data in argnum
  369.     ld    (argnum),a
  370.     ld    a,8        ;..and in a1code to
  371.     ld    (a1code),a    ;make a case key of 9
  372.     jr    optx        ;return true & calc. ckey
  373.  
  374. badchr:    pop    hl        ;clear stack
  375.     xor    a        ;set z flg, mark error
  376.     ld    a,1        ;error code - bad cmd
  377.     ret
  378.  
  379. ;***************************************************
  380.  
  381. tstdir:
  382. ;test for valid du|dir form in first arg
  383. ; (validity is in terms of max du from sysenv
  384. ; or of existance of dir in the NDR buffer)
  385. ; if invalid, set an error flag & return False
  386. ;else test returns pointer to the ndr entry.
  387.  
  388.     ld    hl,(arg1)    ;->arg to test
  389. ;to be a valid DU or DIR, the first char must
  390. ;be alpha. (dnscan would accept a number, then
  391. ;use the default drive to complete the DU)
  392.     ld    a,(hl)        ;get first char
  393.     cp    'A'        ;must be >=
  394.     jr    c,ftstdu    ;cy if < 'A', so
  395.                 ; set error
  396.     xor    a
  397.     call    dnscan        ;valid du|dir?
  398. ;if valid, returns bc=d/u (d=0..max, u=1..max)
  399. ;and acc=TRUE. if invalid, acc=FALSE
  400. ;NOTE: Named Directory uses drive designators
  401. ;  in the range (d=1,2,3,....), so reg. b must
  402. ;  be incremented before use for entry/compare
  403. ;  of NDR data.
  404.     ld    a,2        ;error code
  405.     ret    z        ;no, can't process
  406.                 ;ret false, error code in acc
  407. ;ARG1 is valid, but may not be present in the NDR
  408.     ld    (ndrdu),bc    ;store user at ndrdu,
  409.     ld    a,c        ;drive at Z3fcb
  410.     ld    (fcbusr),a    ;..user in z3fcb(13)
  411. ;Test for presence in the NDR
  412.     call    dutdir        ;du in the ndr?
  413. ;returns hl->name, a=true if present in ndr;
  414. ;  hl->next entry, a=false if not in ndr
  415. ; True return means there is an entry to change.
  416. ; False means any change will be an append
  417.  
  418.     jr    z,enpntr    ;if z, hl->append loc
  419.     dec    hl        ;else hl-> entry name loc
  420.     dec    hl        ;and must be decremented
  421. enpntr:    ld    (ndrloc),hl    ;->NDR entry/append loc
  422.     ld    (appflg),a    ;0=du NOT present in NDR
  423.                 ;0FFH=du present in NDR
  424.     xor    a
  425.     dec    a
  426.     ret            ;return TRUE, valid du
  427.  
  428. ftstdu:    xor    a        ;return showing error
  429.     ld    a,2        ;error code
  430.     ret
  431.  
  432. ;***************************************************
  433.  
  434. tsta23:
  435. ;part of the encoding scheme to make unique keys for
  436. ;the case routine to use for selecting action routines.
  437. ;If arg2 -> ',' then set a2code = 2 else a2code =0
  438. ;if arg3 -> ',' then set a3code = 3 else a3code = 0
  439. ;if arg4 -> ',' then it is in error. set error flg
  440. ;count commas. if more than one, set error flg.
  441.  
  442.     ld    bc,0        ;default values
  443.     ld    d,b        ;for counting commas
  444.     ld    a,','        ;comma to test for
  445.     ld    hl,(arg3)    ;test arg3
  446.     cp    (hl)
  447.     jr    nz,tsta2    ;use default if not ','
  448.     ld    b,3        ;for a3code
  449.     inc    d
  450. tsta2:    ld    hl,(arg2)    ;test arg2
  451.     cp    (hl)        ;comma?
  452.     jr    nz,tsta4    ;nz=no, use default
  453.     ld    c,2        ;for a2code
  454.     inc    d
  455. tsta4:    ld    hl,(arg4)    ;check comma in arg4
  456.     cp    (hl)        ;comma?
  457.     jr    z,ftstax    ;error if so    
  458.     ld    a,1
  459.     cp    a,d        ;more than 1 comma?
  460.     jr    c,ftstax    ;cy=yes, use error exit
  461.  
  462. ttstax:    ld    (a2code),bc    ;store both at once
  463.     xor    a
  464.     dec    a
  465.     ret
  466.  
  467. ftstax:    xor    a        ;return False
  468.     make errflg,6        ;store error code
  469.     ret
  470.  
  471. ;***************************************************
  472.  
  473. ctable:
  474. ;table used by acase3 to dispatch commands based on
  475. ;the key value passed in the acc. The key is compared
  476. ;with each db value in the table. when a match is
  477. ;found, control is passed to the corresponding adddress.
  478.     db    16        ;number of cases
  479.     dw    scerr        ;here if not found
  480. ;the search for a match starts here
  481.     db    '?'        ;display help
  482.     dw    help        ;
  483.     db    '/'        ;display help
  484.     dw    help        ;
  485.     db    'Q'        ;exit to Z, ignore changes
  486.     dw    abort        ;
  487.     db    'R'        ;recover ndr, start over
  488.     dw    copyout        ;(recovery from 'Z' cmd)
  489.     db    'X'        ;exit to Z, keep changes
  490.     dw    exit        ;
  491.     db    'S'        ;Sort the system NDR entries
  492.     dw    ndrsrt        ;
  493.     db    'Z'        ;Zap (erase) all NDR entries
  494.     dw    erandr        ;
  495.     db    0        ;
  496.     dw    pwd        ;show the ndr contents
  497.     db    1        ;
  498.     dw    era1        ;erase entry if present
  499.     db    2        ;
  500.     dw    case2        ;replace|append dirname
  501.     db    3        ;
  502.     dw    chgndr        ;add|change to new name,pw
  503.     db    4        ;
  504.     dw    case4        ;delete a password
  505.     db    5        ;
  506.     dw    case5        ;add|change a password
  507.     db    6        ;
  508.     dw    case6        ;new dirname with blank pw
  509.     db    7        ;
  510.     dw    case7        ;add|change to new name,pw
  511.     db    9        ;case 9 - specify options
  512.     dw    optsel        ;decode & set any options
  513.  
  514. ;***************************************************
  515.  
  516. ;this is the default case - unrecognized command 
  517. scerr:    xor    a        ;set z to mark error
  518.     ld    a,1        ;error code - bad command
  519.     ret
  520.  
  521. ;***************************************************
  522.  
  523. ;erase all entries from the NDR buffer
  524. erandr:    ld    hl,(bcb1)    ;->system NDR
  525.     ld    d,h
  526.     ld    e,l
  527.     inc    de        ;->2nd byte
  528.     xor    a
  529.     ld    (hl),a        ;enter a zero,
  530.     ld    bc,(size0)
  531.     dec    bc        ;bytes yet to zero out
  532.     ldir            ;chase thru the buffer
  533.     dec    a        ;return True
  534.     ld    (chgflg),a    ;report changed NDR
  535.     ret
  536.  
  537. ;***************************************************
  538.  
  539. era1:        ;erase entry if present
  540.     ld    a,(appflg)
  541.     or    a
  542.     jr    z,cant3        ;not present, can't erase
  543.  
  544.     ld    bc,entlen    ;18
  545.     ld    hl,(ndrloc)    ;->entry
  546.     ld    d,h        ;destination
  547.     ld    e,l
  548.     add    hl,bc        ;->source (next entry)
  549.     xor    a,a        ;make null for cp(hl)
  550. ovrite:    cp    (hl)        ;done if null
  551.     jr    z,back0
  552.     push    bc
  553.     ldir            ;copy over preceding record
  554.     pop    bc
  555.     jr    ovrite
  556. ;
  557. back0:    ld    d,h        ;hl->terminal null
  558.     ld    e,l
  559.     dec    de        ;de->last byte of last
  560.                 ;record, now redundant
  561.     push    bc        ;save block counter
  562.     lddr            ;chase null through record
  563.     pop    bc
  564. ;update the data in bcb1:
  565.     ld    hl,bcb1+2
  566.     dec    (hl)        ;number of entries decreased
  567.     ld    hl,(bcb1+6)
  568.     sbc    hl,bc        ;next free loc is 18 less
  569.     ld    (bcb1+6),hl
  570.     dec    a        ;make 0ffh, nz
  571.     ld    (chgflg),a    ;report changed NDR
  572.     ret            ;return true
  573.  
  574. ;***************************************************
  575.  
  576. cant3:
  577. ;error return. A du form was used in arg1 which
  578. ;was not present in the NDR, so there is no entry
  579. ;from which to get the default name for arg2.
  580.     xor    a
  581.     ld    a,3    ;error code
  582.     ret
  583.  
  584. ;***************************************************
  585.  
  586. case2:        ;replace|append dirname
  587.     ld    a,(appflg)
  588.     or    a
  589.     jr    z,case6        ;append with blank pw
  590.  
  591.     ld    hl,(ndrloc)    ;->ndr entry
  592.     ld    bc,10        ;->dir password
  593.     add    hl,bc
  594.     ld    (arg3),hl    ;preserve it
  595.     jp    chgndr
  596.  
  597. ;***************************************************
  598.  
  599. case4:        ;delete a password
  600.     ld    a,(appflg)
  601.     or    a
  602.     jr    z,cant3        ;z=none to delete
  603.  
  604.     ld    hl,spaces
  605.     ld    (arg3),hl    ;blank password
  606.     
  607. ;fall through to case5 to get the extant name ptr.
  608. ;***************************************************
  609.  
  610. case5:        ;add|change a password
  611.     ld    a,(appflg)
  612.     or    a
  613.     jr    z,cant3        ;z=nothing to change
  614.  
  615.     ld    hl,(ndrloc)    ;->ndr entry
  616.     inc    hl
  617.     inc    hl        ;->dirname
  618.     ld    (arg2),hl    ;replace the ','
  619.     jp    chgndr
  620.  
  621. ;***************************************************
  622.  
  623. case6:        ;new dirname with blank pw
  624.     ld    hl,spaces
  625.     ld    (arg3),hl    ;replace the comma
  626.     jp    chgndr
  627.  
  628. ;***************************************************
  629.  
  630. case7:        ;add|change to new name,pw
  631.     ld    hl,(arg4)
  632.     ld    (arg3),hl    ;replace the comma
  633.  
  634. ;fall through to chgndr
  635. ;***************************************************
  636.  
  637. chgndr:
  638. ;over-writes an extant name-pw entry or appends
  639. ; to the end of the ndr if possible.
  640.     ld    a,(appflg)
  641.     or    a
  642.     jp    z,appndr    ;z=no entry, append rqd.
  643.  
  644. ldname:
  645. ;first, initialize a prototype ndr entry buffer
  646.     ld    hl,spaces
  647.     ld    de,entnm
  648.     ld    bc,16
  649.     ldir
  650. ;copy the data pointed to by arg2 and arg3
  651. ;into the name and password fields of buffer
  652.     ld    hl,(arg2)    ;->new name
  653.     ld    de,entnm
  654.     ld    bc,8        ;max # to copy
  655.     xor    a        ;arg terminator=0
  656.     call    strcpy
  657.     ld    hl,(arg3)    ;->new password
  658.     ld    de,entpw
  659.     ld    bc,8
  660.     call    strcpy
  661. ;copy the name & pw into the system ndr
  662.     ld    hl,entnm
  663.     ld    de,(ndrloc)    ;->ndr entry
  664.     inc    de
  665.     inc    de        ;->ndr name
  666.     ld    bc,16
  667.     ldir            ;copy the name,pw
  668.     dec    a        ;make logic True
  669.     ld    (chgflg),a    ;report changed NDR
  670.     ret    ;True, no problems
  671.  
  672. appndr:
  673. ;append a new entry to ndr if possible
  674.     ld    hl,bcb1+2    ;current # of entries
  675.     ld    a,(ndblks)    ;max # allowed
  676.     cp    a,(hl)        ;are they the same yet?
  677.     jr    z,fappnd    ;error abort if yes, else..
  678.     inc    (hl)        ;..count the new entry
  679. ;get the d/u and load into the system ndr
  680.     ld    hl,(ndrloc)    ;append location
  681.     ld    bc,(ndrdu)    ;d/u from arg1
  682.     inc    b        ;convert to ndr form (1...n)
  683.     ld    (hl),b        ;enter drive
  684.     inc    hl
  685.     ld    (hl),c        ;enter user
  686.     inc    hl
  687. ; then move the name and pw
  688.     call    ldname        ;enter name, pw
  689. ;ldname returns acc=True
  690.     ld    (srtflg),a    ;sort required
  691.     ret            ;return True, no problems
  692.  
  693. fappnd:    xor    a        ;return False
  694.     ld    a,4        ;error code
  695.     ret            ;No room to append
  696.  
  697. ;***************************************************
  698.  
  699. abort:    ld    a,-1        ;set abort flag and
  700.     ld    (abtflg),a    ; take action as
  701.     jp    exit        ; needed in wrapup
  702.  
  703. ;***************************************************
  704.  
  705. ; copyin: copy the existing NDBuff into buffer 0
  706. ; Enter buffer data in bcb0 to permit access.
  707.  
  708. copyin:
  709.  
  710. ;first, initialize the buffer to nulls
  711.     ld    hl,(bcb0)    ;source
  712.     ld    d,h
  713.     ld    e,l
  714.     inc    de        ;destination = HL+1
  715.     ld    bc,(size0)
  716.     dec    bc        ;number of bytes to fill
  717.     xor    a        ;fill byte = 00
  718.     ld    (hl),a        ;fill first loc, and..
  719.     ldir            ;chase it through the buffer
  720.  
  721.     push    ix
  722.     ld    ix,bcb0+2    ;for counting number of entries
  723.     ld    de, (bcb0)
  724.     ld    hl, (z3ndb)    ; prepare copying, (hl) to (de)
  725.     jr    cpin02
  726.  
  727. cpin01:    ld    bc, entlen
  728.     ldir            ; no, load it.
  729.     inc    (ix)        ;count entries in bcb0+2
  730. cpin02:    xor    a        ; Disk == 0 means end
  731.     or    (hl)        ;end of ND entries?
  732.     jr    nz, cpin01    ;if no, get more
  733.  
  734. ;transfer complete. Now complete filling in BCB0 & BCB1
  735.     ld    (bcb0+6),de    ;save pointer to next avail. loc
  736.     push    de        ;save for (bcb1+6) calculation
  737.     ld    hl,(bcb0+2)
  738.     ld    (bcb1+2),hl    ;number of entries in sys ndr
  739.     ld    hl,(size0)    ;offset to end+1
  740.     ld    de,(bcb1)    ;start of system ndr
  741.     add    hl,de
  742.     ld    (bcb1+8),hl
  743.     ld    hl,(bcb0)    ;HL->local, de-> sys ndr
  744.     ex    de,hl        ;put larger in hl
  745.     sbc    hl,de        ;offset in hl
  746.     pop    de        ;-> empty entry in local ndr
  747.     add    hl,de        ;addr of empty entry in sys ndr
  748.     ld    (bcb1+6),hl
  749.     pop    ix
  750.     ret
  751.  
  752. ;***************************************************
  753.  
  754. ;cfetch: copy a string terminated by 'cterm' or null
  755. ; from the address at keyptr: to cmdbuf, replacing
  756. ; the terminator with a null. Delimit commas with
  757. ; spaces during transfer so argv will parse
  758. ; them out as tokens for interpreting the command.
  759. ; Update the address at keyptr to point to the
  760. ; source byte which follows the terminator.
  761.  
  762. cfetch:    ld    a,(eoline)    ;no more commands?
  763.     inc    a        ;yes, if eoline is 0ffh
  764.     ret    z        ;return false if so
  765.  
  766.     ld    b,0        ;character counter
  767.     ld    hl,ctermd
  768.     ld    c,(hl)        ;command separator in c
  769.  
  770. ;note the inversion of assignments here
  771.     ld    de,(keyptr)    ;source
  772.     ld    hl,cmdbuf    ;destination
  773.  
  774. cfet1:    ld    a,(de)        ;get char from input buff
  775.     inc    de        ;-> next byte
  776.  
  777.     cp    a,c        ;terminator?
  778.     jr    z,cfetx        ;branch if done
  779.     or    a,a        ;null (end-of-line) terminator?
  780.     jr    z,cfeol        ;branch if done
  781.     cp    ','        ; comma?
  782.     call    z,schas        ; if so, delimit with spaces
  783.  
  784.     cp    ':'        ;colon?
  785.     jr    nz,cfet2    ;no, go on..
  786.     ld    a,' '        ;yes, replace with space
  787.  
  788. cfet2:    ld    (hl),a        ;copy to dest.
  789.     inc    hl        ;rdy for next
  790.     inc    b        ;count the char
  791.     jr    cfet1        ;..and do it
  792.  
  793. cfeol:    dec    a        ; set last-command flag true
  794.     ld    (eoline),a
  795. cfetx:    ld    a,b
  796.     ld    (cmdcnt),a    ; store char count
  797.     xor    a,a        ; make a null
  798.     ld    (hl),a        ; terminator in dest.
  799.     ld    (keyptr),de    ; save for next time
  800.     dec    a        ; return logic true
  801.     ret
  802.  
  803. schas:    ;Space CHAr Space - delimit char with
  804.     ; spaces so argv won't miss it.
  805.  
  806.     ld    (hl),' '    ;store leading space
  807.     inc    hl
  808.     inc    b        ;count the char
  809.     ld    (hl),','    ;store comma
  810.     inc    hl
  811.     inc    b        ;count the char
  812.     ld    a,' '        ;trailing space
  813.     ret            ; finish up in caller
  814.  
  815. ;***************************************************
  816.  
  817. ;issue prompt & get a line of input from con:
  818. kbdin:
  819.     ld    a,(errflg)
  820.     or    a
  821.     jr    z,prompt
  822.  
  823.     ld    a,(errbel)
  824.     or    a        ;sound bell on error?
  825.     jr    z,eprmpt    ;skip it if false
  826.     call    print
  827.     db    bel,bel,bel,bel,0
  828.  
  829. eprmpt:    ld    a,(ernote)
  830.     or    a        ;emit the error note?
  831.     jr    z,prompt    ;skip the note if false
  832.     call    print
  833.     db    'type ? or / for error diagnosis'cr,lf,0
  834.  
  835. prompt:    call    print
  836.     db    'Command (? for help): '
  837.     db    0    ;string terminator
  838.  
  839.     xor    a        ;make a null
  840.     ld    (eoline),a    ;reset last-command flag
  841.     dec    a        ;capitalize like zrdos
  842.     ld    hl,keysiz    ;->local command input buffer
  843.     call    bline        ;get multiple command line with editing
  844.     ld    (keyptr),hl    ;save the parameters
  845.     ld    (keycnt),a
  846.     call    crlf        ;give user his cr
  847.     ret
  848.  
  849. ;***************************************************
  850.  
  851. ; PWD routine
  852. ; Print Names of Directory Elements in system NDR
  853. ; on entry, IX -> BCB for the buffer to be printed
  854.  
  855. pwd:    ld    ix,bcb1        ;supply entry param for sys ndr
  856.     call    crlf        ; new line
  857.     ld    a,(ix+2)    ;check count first
  858.     or    a        ;no entries?
  859.     jp    nz,pwd01
  860.     call    print
  861.     db    ' No Entries in Directory',0
  862.     ret
  863. ;
  864. ; Print Header for Password Entries
  865. ;
  866. pwd01:
  867.     ld    b,2        ;2 times
  868. pwd0a:
  869.     call    print
  870.     db    ' DU : DIR Name - Password    ',0
  871.     dec    b        ;count down
  872.     jp    nz,pwd0a
  873.     call    crlf
  874.     ld    b,2
  875. pwd0b:
  876.     call    print
  877.     db    '----  --------   --------    ',0
  878.     dec    b        ;count down
  879.     jp    nz,pwd0b
  880.     call    crlf
  881. ;
  882. ; Begin Output Processing
  883. ;
  884.     ld    c,0        ;set entry count
  885.     ld    b,1        ;set disk 1
  886.     ld    l,(ix)        ;pt to buffer containing
  887.     ld    h,(ix+1)    ;directory data
  888. ;
  889. ; Print Each Resident Command Name
  890. ;
  891. pwd1:
  892.     ld    a,(hl)        ;get table entry
  893.     or    a        ;end of table?
  894.     jr    z,pwdx        ;exit
  895.     cp    b        ;same disk?
  896.     jp    z,pwd2
  897. ;
  898. ; Advance to Next Set of Entries for New Disk
  899. ;
  900.     ld    b,a        ;set new disk
  901.     call    cnline        ;newline if needed
  902.     call    crlf        ;1 additional line
  903.     ld    c,0        ;reset count
  904. pwd2:
  905.     push    bc        ;save counters
  906. ;
  907. ; Print DU:
  908. ;
  909.     ld    a,(hl)        ;get disk
  910.     add    '@'        ;convert to letter (A to P)
  911.     call    cout
  912.     inc    hl        ;pt to user
  913.     ld    a,(hl)        ;get user
  914.     call    padc        ;print user number
  915.     call    print        ;print separator
  916.     db    ': ',0
  917.     inc    hl        ;pt to name
  918. ;
  919. ; Print DIR
  920. ;
  921.     call    prname        ;print name of directory
  922.     call    print
  923.     db    ' - ',0
  924.     call    prname        ;print password
  925.     pop    bc        ;get counters
  926.     inc    c        ;another entry
  927.     push    bc        ;save counters
  928. ;
  929. ; Print Separator
  930. ;
  931.     call    print        ;print separator
  932.     db    '    ',0
  933.     pop    bc        ;get counters
  934. ;
  935. ; New Line Counter
  936. ;
  937.     inc    c        ;increment entry counter
  938.     ld    a,c        ;check for done
  939.     and    3        ;every 4
  940.     call    z,crlf        ;new line
  941.     jp    pwd1
  942. ;
  943. ; Print 8-char name (directory or password) and advance ptr
  944. ;
  945. prname:
  946.     ld    b,8        ;print name
  947. prn1:
  948.     ld    a,(hl)        ;get char
  949.     call    cout
  950.     inc    hl        ;pt to next
  951.     dec    b        ;count down
  952.     jp    nz,prn1
  953.     ret
  954.  
  955. cnline:
  956.     ld    a,c        ;get count
  957.     and    3        ;see if newline already given
  958.     call    nz,crlf        ;complete current line
  959.     ret
  960.  
  961. pwdx:    call    cnline        ;finish off display with
  962.     call    crlf        ;1 or 2 newlines as rqd.
  963.     xor    a
  964.     dec    a        ;return logic true
  965.     ret
  966.  
  967. ;***************************************************
  968.  
  969. init:
  970. ;save the address of the warm boot routine IN BIOS
  971. ;then replace it with the address of our local exit
  972. ;routine, where it will be restored. This traps ^C
  973. ; so that housekeeping activity is performed
  974. ; before the return to the operating system. 
  975.     ld    hl,(1)        ;->bios wb jump
  976.     inc    hl        ;->wb routine addr
  977.     push    hl
  978.     ldhlhl            ;get the address
  979.     ld    (wbaddr),hl    ;save it for WRAPUP
  980.     pop    hl        ;now replace it..
  981.     ld    de,exit        ; with local exit
  982.     stdehl            ;(hl)<-de
  983.  
  984. ;test for valid z3env
  985.     ld    hl,(z3eadr)
  986.     inc    hl        
  987.     inc    hl
  988.     inc    hl        ;->'Z3ENV' in sys env.
  989.     ld    de,[z3eadr-6]    ;->local 'Z3ENV' string
  990.     ld    b,5        ;compare 5 bytes
  991.     call    compb
  992.     jp    nz,noenv    ;if nz, pgm not installed
  993.  
  994. ; test for wheel. Only priviledged users modify the system.
  995.     call    getwhl
  996.     jp    z,nowhl        ;deny use if no wheel
  997.  
  998. ; get Named Directory pointer, exit with error if none
  999.     call    getndr        ; get ndr addr & length
  1000.     jp    z, noNDB    ; exit if none (0, Z)
  1001.     ld    (z3ndb),hl    ; store the address, and
  1002.     ld    (ndblks),a    ; the max number of entries
  1003.  
  1004. ; initial memory allocation
  1005.     call    codend        ;set hl-> first free memory
  1006.     ld    (freesp),hl    ;store in freespace pointer
  1007.     ld    (bcb0),hl    ; setup bcb0 as local ndr buff
  1008.  
  1009. ; initialize Buffer Control Block 0 as the
  1010. ; descriptor for the local buffer which will
  1011. ; contain the copy of system NDR entries.
  1012.  
  1013.     ld    hl,(ndblks)    ; max number of blocks
  1014.     ld    de,entlen    ; length of each block
  1015.     ld    (bcb0+4),de    ; store in Buffer Control Block
  1016.     call    mulhd        ; hl*de = buffer data bytes
  1017.  
  1018. ; The system NDR is a multiple of 128 bytes in length
  1019.     ld    de,80h        ; round off to the
  1020.     add    hl,de        ; ..next higher multiple
  1021.     ld    a,l        ; ..of 128 bytes (80h)
  1022.     and    a,80h
  1023.     ld    l,a        ; hl = buffer length
  1024. ; save this to avoid another calculation later
  1025.     ld    (size0),hl    ; save for copyout:
  1026.     push    hl
  1027.     ld    de,(bcb0)    ; buffer start addr
  1028.     add    hl,de        ; loc for next buffer
  1029.     ld    (bcb0+8),hl    ; save in Buf. Cntl. Blk.
  1030.     ld    (freesp),hl    ; ..and for global use
  1031. ; also calc end+1 of system NDR buff for bcb1
  1032.     ld    de,(bcb1)
  1033.     pop    hl
  1034.     add    hl,de
  1035.     ld    (bcb1+8),hl
  1036.  
  1037. ; initialize flags in case of re-entry
  1038.     xor    a
  1039.     ld    (lclcmd),a
  1040.  
  1041. ;get the name under which this program was
  1042. ; invoked and put it in the help message
  1043. ; if this is the first invocation
  1044.     ld    a,(myname)
  1045.     cp    a,' '        ;space if first time
  1046.     jr    nz,xinit    ;jmp if already done
  1047.  
  1048.     ld    a,(ctermd)    ;transfer cmd terminator
  1049.     ld    (ctrm),a    ;to the help text
  1050.  
  1051.     call    getefcb
  1052.     jr    z,xinit        ;jmp if no ext fcb
  1053.     inc    hl        ;point to pgm name
  1054.     ld    de,myname
  1055.     ld    bc,8
  1056.     ldir            ;transfer the name...
  1057.  
  1058. xinit:    xor    a
  1059.     dec    a        ;mark successful return(-1, NZ)
  1060.     ret
  1061.  
  1062. ;***************************************************
  1063.  
  1064. ;Error exits which result from unrecoverable
  1065. ;conditions during initialization.
  1066.  
  1067. nowhl:    ld    hl, nowhlm    ;'no wheel' message
  1068.     jr    fatalerror
  1069.  
  1070. noenv:    ld    hl, noenvm    ;not installed for ZCPR3
  1071.     jr    fatalerror
  1072.  
  1073. nondb:    ld    hl, nondbs    ;can't find NDR
  1074. fatalerror:
  1075.     call    pstr
  1076.     jp    exit        ; ERROR EXIT
  1077.  
  1078. ;***************************************************
  1079.  
  1080.  
  1081. optsel:
  1082. ;Routine for setting/executing options in
  1083. ;response to '/ooo...' in the command line.
  1084. ;If there are no options, then it was a command
  1085. ;to display the help screen.
  1086.  
  1087.     ld    hl,(arg1)
  1088.     inc    hl        ;->first option chr
  1089.     ld    a,(hl)
  1090.     or    a        ;end?
  1091.     jp    z,help        ;/ was only char - means help
  1092.  
  1093. optse1:    push    hl        ;save pointer to option
  1094.     ld    (ckey),a
  1095.     ld    de,optble
  1096.     call    acase3        ;execute the option & return
  1097.     pop    hl        ;recover option pointer
  1098.     ret    z        ;stop if error. code is in reg A
  1099.     inc    hl        ;->next option or end of arg1
  1100.     ld    a,(hl)
  1101.     or    a        ;done if 0
  1102.     jr    nz,optse1
  1103. ;finished processing options. Return nz for success.
  1104. toptx:    xor    a        ;used by others so xor is rqd.
  1105.     dec    a
  1106.     ret
  1107.  
  1108. ;***************************************************
  1109.  
  1110. ;these are the cases executed by acase3
  1111. ;during option function execution. They
  1112. ;are referenced from optble:
  1113.  
  1114. hopt:    toggle hlprqd
  1115.     jr    toptx
  1116.  
  1117. bopt:    toggle errbel
  1118.     jr    toptx
  1119.  
  1120. eopt:    toggle ernote
  1121.     jr    toptx
  1122.  
  1123. ohelp:    ld    hl,ohelpm
  1124.     jr    pinfo
  1125.  
  1126. echelp:    ld    hl,ehelpm
  1127. pinfo:    call    pstr
  1128.     jr    toptx
  1129.  
  1130. setsep:    ld    hl,(arg1)
  1131.     inc    hl
  1132.     inc    hl    ;->new cmd separator
  1133.     ld    a,(hl)    ;get it
  1134.     or    a    ;if null, it's not there
  1135.     jr    z,setser;jmp if not there
  1136. ;see if it's one of the command/option characters
  1137.     ld    c,a    ;tuck away during test
  1138.     ld    hl,ctable    ;check command chars
  1139.     call    allow
  1140.     ret    z        ;error. code 9 in A reg
  1141.     ld    hl,optble    ;check option chars
  1142.     call    allow
  1143.     ret    z        ;error. code 9 in A reg
  1144.     ld    a,c        ;all ok, recover new separator
  1145. ;store the new separator where pgm & help can find it.
  1146.     ld    (ctermd),a
  1147.     ld    (ctrm),a
  1148.     jr    toptx
  1149.  
  1150. setser:    ld    a,7    ;error code
  1151.     ret        ;no new command separator
  1152.  
  1153. badopt:    xor    a
  1154.     ld    a,8    ;error code
  1155.     ret        ;bad option character
  1156.  
  1157. allow:
  1158. ;search a case table pointed to by hl
  1159. ;for the character in reg c. If found,
  1160. ;ret z with error code 9 in accumulator
  1161.     ld    b,(hl)    ;get number of cases
  1162.     inc    hl
  1163.     inc    hl
  1164.     inc    hl
  1165. allow1:    ld    a,(hl)    ;get a char
  1166.     cp    c    ;found it?
  1167.     ld    a,9    ;..in case yes
  1168.     ret    z    ;..ret with 9
  1169.     inc    hl    ;not found..
  1170.     inc    hl
  1171.     inc    hl    ;->next entry
  1172.     djnz    allow1    ;test more
  1173.     ret        ;done, z-flag is nz
  1174.  
  1175. ;***************************************************
  1176.  
  1177. optble:
  1178.     db    8
  1179.     dw    badopt
  1180.     db    '/'
  1181.     dw    help
  1182.     db    'H'    ;toggle auto help-after-error
  1183.     dw    hopt
  1184.     db    'B'    ;toggle bell-after-error
  1185.     dw    bopt
  1186.     db    'E'    ;toggle error reminder note
  1187.     dw    eopt
  1188.     db    'O'    ;display options
  1189.     dw    ohelp
  1190.     db    '0'    ;same as 'O' for those who
  1191.     dw    ohelp    ;..can't see the difference
  1192.     db    'C'    ;display error codes
  1193.     dw    echelp
  1194.     db    'S'    ;set new cmd separator
  1195.     dw    setsep
  1196.  
  1197. ;***************************************************
  1198.  
  1199. help:    ld    a,(errhst)    ;get error flag for
  1200.     or    a        ;last bad cmd, test
  1201.     jr    z,help1        ;normal help if no error
  1202. ;an error condition is present. Show the
  1203. ;discrepant command, the error message, and the
  1204. ;help screeen without the Program Banner
  1205.     dec    a        ;for indexing, codes must
  1206.                 ;start from 00h.
  1207.     add    a        ;make an index to table
  1208.     ld    c,a
  1209.     ld    b,0
  1210.     ld    hl,errndx    ;->index table
  1211.     add    hl,bc        ;->error msg address
  1212.     ldhlhl            ;load hl from (hl)
  1213.     push    hl
  1214.  
  1215.     call    print        ;delimit the command
  1216.     db    cr,lf,'???????--->',0
  1217.     ld    hl,cmdhst+1    ;->command in error
  1218.     call    pstr        ;send to console
  1219.     call    print        ;complete the line
  1220.     db    '<---'cr,lf,lf,0
  1221.  
  1222.     pop    hl        ;->error msg
  1223.     call    ptstrl        ;display message
  1224.     call    crlf
  1225.     xor    a        ;make 0
  1226.     ld    (errhst),a    ;only display error once
  1227.  
  1228.     ld    hl,cmdhlp    ;->body of help msg
  1229.     ld    a,(hlprqd)    ;get option byte
  1230.     or    a        ;test true/false
  1231.     jr    nz,help2    ;show help if true
  1232.     dec    a        ;else, make true
  1233.     ret            ;and return no error
  1234.  
  1235. ;display help & return to caller in interactive mode.
  1236. ;When invoked from the Z command line, display HELP
  1237. ;screen and exit immediately.
  1238. help1:    ld    hl,hlpmsg    ;->entire help msg
  1239. help2:    call    pstr
  1240.     ld    a,(lclcmd)
  1241.     or    a        ;local interactive mode?
  1242.                 ;don't do the exit if local
  1243.     ret    nz        ;..return True (no error)
  1244.     jp    exit        ;exit if this came from cmd line
  1245.  
  1246. ;*************************************************************
  1247.  
  1248. ;ndrsrt: sets up the Sort Specification Block for
  1249. ; sorting the system NDR buffer in d/u order, then
  1250. ; calls dosort: for the actual buffer allocation
  1251. ; and sorting.
  1252.  
  1253. ndrsrt:    push    hl
  1254.     push    de
  1255.     push    bc
  1256.     ld    hl,bcb1
  1257.     ld    de,ssb        ;Sort Specification Block
  1258.     ld    bc,6
  1259.     ldir            ;copy 1st 3 words from bcb1
  1260.     ld    hl,(freesp)    ;tell where to work
  1261.     ld    (ssb+8),hl
  1262.     call    dosort        ;sort system NDR buffer
  1263.     pop    bc
  1264.     pop    de
  1265.     pop    hl
  1266.     ret
  1267.  
  1268. ;***************************************************
  1269.  
  1270. ; copyout: copy new NDR into System Named Directory
  1271.  
  1272. copyout:
  1273.     ld    hl, (bcb0)    ; source is local NDR image
  1274.     ld    de, (z3ndb)    ; dest is system NDR buffer
  1275.     ld    bc, (size0)    ; buffer size, bytes
  1276.     ldir
  1277.     ld    (chgflg),bc    ;reset flags
  1278.     ld    (abtflg),bc    ;reset flags
  1279.     ld    (eoline),bc    ;reset flags
  1280.     xor    a,a
  1281.     dec    a
  1282.     ret
  1283.  
  1284. ;***************************************************
  1285.  
  1286. ; dosort: is called to sort the contents of a
  1287. ; buffer using memory space starting at addr in HL.
  1288. ; Assumes the sort parameters in SSB: have been
  1289. ; correctly entered therein.
  1290. ; BC,DE,HL are preserved
  1291.  
  1292. dosort:    push    bc        ;save for caller
  1293.     push    de
  1294.     push    hl
  1295.     ld    bc,(ssb)
  1296.     push    bc        ;save for sort
  1297.     ld    de,ssb
  1298.     call    ssbinit        ;munches (ssb)
  1299.     pop    bc
  1300.     ld    (ssb),bc    ;restore (ssb)
  1301.     call    sort
  1302.     pop    hl
  1303.     pop    de
  1304.     pop    bc
  1305.     ret
  1306.  
  1307. ;***************************************************
  1308.  
  1309. ;compdu: is referenced indirectly through the
  1310. ;Sort Specification Block. It is the compare
  1311. ;routine used by Sort (from Syslib)
  1312.  
  1313. compdu:    push    bc    ;preserve for caller
  1314.     ld    b,2    ;number of bytes in comp vector
  1315.     ex    de,hl    ;for ascending sort order
  1316.     call    compb    ;vector compare routine
  1317.     ex    de,hl
  1318.     pop    bc
  1319.     ret
  1320.  
  1321. ;***************************************************
  1322.  
  1323. strcpy:
  1324. ;copy a string terminated by (Acc) from HL to DE.
  1325. ;If a terminator is not encountered, copy BC bytes
  1326. ;all registers used.
  1327.     cp    (hl)    ;terminator?
  1328.     ret    z    ;quit if so
  1329.     ldi        ;copy a byte
  1330.     ret    po    ;return if bc=0
  1331.     jr    strcpy    ;copy more
  1332.  
  1333. ;***************************************************
  1334.  
  1335. ptstrl:
  1336. ;copy a string terminated by line feed to con
  1337.     ld    a,lf
  1338. ptstr:    ;Print Terminated STRing
  1339. ;copy a string terminated by (Acc) to console
  1340. ;on entry, hl->string
  1341. ;on exit, hl->next char past the terminator
  1342. ;THE TERMINATOR IS SENT TO THE CONSOLE
  1343.     push    bc
  1344.     ld    c,a
  1345. ptstr1:    ld    a,(hl)
  1346.     call    cout
  1347.     inc    hl
  1348.     sub    c
  1349.     jr    nz,ptstr1
  1350.     dec    a
  1351.     pop    bc
  1352.     ret
  1353.  
  1354. ;***************************************************
  1355.  
  1356. ;MESSAGES
  1357. nowhlm:    db 'Sorry - Wheel privileges are required for this pgm.'
  1358.     db    cr,lf,0
  1359.  
  1360. nondbs:    db 'Can''t find System Named Directory!'
  1361.     db    cr,lf,0
  1362.  
  1363. noenvm:    db 'This is a ZCPR3 program which must ',cr,lf
  1364.     db 'be installed with Z3INS.'
  1365.     db    cr,lf,0
  1366.  
  1367. ;table for indexing into the cmd error messages
  1368. errndx:    dw errm01,errm02,errm03,errm04
  1369.     dw errm05,errm06,errm07,errm08
  1370.     dw errm09
  1371.  
  1372. ;these are the error messages
  1373. ehelpm:    db lf,tab,tab,'ERROR CODE DESCRIPTIONS'cr,lf,lf
  1374. errm01:    db 'Code 1 - First argument is invalid. Missing space?'cr,lf
  1375. errm02:    db 'Code 2 - First arg interpreted as invalid DU or DIR form.'cr,lf
  1376. errm03:    db 'Code 3 - For this command, the DU must exist in the NDR.'cr,lf
  1377. errm04:    db 'Code 4 - NDR buffer is full. The append was not performed.'cr,lf
  1378. errm05:    db 'Code 5 - Too many arguments. Missing command separator?'cr,lf
  1379. errm06:    db 'Code 6 - Too many commas. Only one has syntactic meaning.'cr,lf
  1380. errm07:    db 'Code 7 - New command separator was not supplied.'cr,lf
  1381. errm08:    db 'Code 8 - Invalid option character. Missing command separator?'cr,lf
  1382. errm09:    db 'Code 9 - Invalid separater. It''s a command or option char!'cr,lf
  1383.     db lf
  1384.     db 'One of these code values will be placed in the ZCPR3 program'cr,lf
  1385.     db 'error byte (where IF can find it) when an error occurs in a'cr,lf
  1386.     db 'command in the invoking command line. In the interactive mode'cr,lf
  1387.     db 'no errors are reported to the operating system.'cr,lf
  1388.     db    lf,0    ;marks end of error msg table
  1389.  
  1390. ;option list screen
  1391. ohelpm:    db lf,tab,tab,'COMMAND OPTIONS (preceded by "/")'cr,lf,lf
  1392.     db '/',tab,'Display Help. If error, show error diagnostic'cr,lf
  1393.     db 'H',tab,'Toggle display of help after error diagnostic'cr,lf
  1394.     db 'B',tab,'Toggle audible notice of command error'cr,lf
  1395.     db 'E',tab,'Toggle visual notice of command error'cr,lf
  1396.     db 'S<ch>',tab,'Change command separator to character <ch>'cr,lf
  1397.     db 'O',tab,'Display this screen of option selections'cr,lf
  1398.     db 'C',tab,'Display the list of error codes'cr,lf
  1399.     db    lf
  1400.     db 'Option commands start with ''/'' and end with a carriage'cr,lf
  1401.     db 'return or command separator. Multiple options from the'cr,lf
  1402.     db 'list above may be included in any order. For example,'cr,lf
  1403.     db tab,'/hbeo<cr>',tab,'is perfectly acceptable.'cr,lf
  1404.     db 'Note that if you assign a new separator, the assignment'cr,lf
  1405.     db 'takes place immediately, and your next separator must be'cr,lf
  1406.     db 'the one you assigned!'cr,lf
  1407.     db    lf,0        ;0 marks end of option screen
  1408.  
  1409. hlpmsg:    db    lf,tab,tab,'EDITND version ',vers,'.',rev,beta,cr,lf
  1410.     db    tab,'CHange Resident Named DiRectory',cr,lf,lf
  1411. cmdhlp:    db    'SYNTAX:   '
  1412. myname:    db    ' EDITND '
  1413.     db    ' [<command>  [ '
  1414. ctrm:    db    '\',' <command>]...]',cr,lf
  1415.     db tab,'<command> = <verb> [name] [,] [password]'cr,lf,lf
  1416.     db 'Typical Commands ( [xxx] means xxx is optional)',cr,lf
  1417.     db '(DU/DIR)[:]',tab,tab,'delete Named Directory entry',cr,lf
  1418.     db '(DU/DIR)[:] NAME',tab,'add/change a directory name only',cr,lf
  1419.     db '(DU/DIR)[:] NAME,[PW]',tab,'add/change name & password',cr,lf
  1420.     db '(DU/DIR)[:] ,[PW]',tab,'Change password only',cr,lf
  1421.     db '(DU/DIR)[:] [NAME],',tab,'Password is deleted.',cr,lf,lf
  1422.     db '? or / or //',tab,tab,'Display Help & Explain last error.'cr,lf
  1423.     db '<CR>',tab,tab,tab,'empty cmd shows current NDR.',cr,lf
  1424.     db 'Q or q',tab,tab,tab,'Quit & return to Z (no changes)',cr,lf
  1425.     db 'R or r',tab,tab,tab,'Restart with original NDR',cr,lf
  1426.     db 'S or s',tab,tab,tab,'Sort the NDR entries',cr,lf
  1427.     db 'X or x',tab,tab,tab,'eXit to Z with .NDR updated',cr,lf
  1428.     db 'Z or z',tab,tab,tab,'Zap (erase) ALL NDR entries',cr,lf
  1429.     db '/oo...',tab,tab,tab,'Other options. Type /O to see them.'cr,lf
  1430.     db    lf,0
  1431.  
  1432. ;misc data
  1433. spaces:    ds    16,20h    ;fill data for blank name,password
  1434.  
  1435. ;working temporary storage
  1436. ndrloc:    dw    0    ;place to change/append in NDR
  1437. wbaddr:    dw    0    ;addr of wb routine in bios
  1438.  
  1439. ;the following comprise a single structure, accessed by
  1440. ; both word and byte instrctions. Keep 'em together.
  1441. ndrdu:    db    0    ;d/u for current NDR entry
  1442. z3fcb:    db    0    ;ZCPR3 style fcb
  1443. z3fcbn:    ds    11,20h
  1444.     db    0
  1445. fcbusr:    ds    1    ;last byte in the fcb
  1446. ;end structure
  1447.  
  1448. ;working buffer in NDR entry format.
  1449. entdu:    ds    2
  1450. entnm:    ds    8
  1451. entpw:    ds    8
  1452. ;end structure
  1453.  
  1454. ;table of results from argv used to process command arguments.
  1455. argvtb:    db    4        ;parse 4 arguments
  1456. argnum:    ds    1        ;count of tokens found
  1457. arg1:    ds    2        ;-> token
  1458. arg2:    ds    2        ;-> token
  1459. arg3:    ds    2        ;-> token
  1460. arg4:    ds    2        ;-> token
  1461. ;end structure
  1462.  
  1463. ;command arg parameter data structure
  1464. a1code:    ds    1
  1465. a2code:    ds    1
  1466. a3code:    ds    1
  1467. ckey:    ds    1
  1468. ;end structure
  1469.  
  1470. ;status flags
  1471. chgflg:    db    0    ;nz if sys ndr is changed
  1472. srtflg:    db    0    ;nz if sort is required
  1473. abtflg:    db    0    ;nz if abort to Z in progress
  1474. appflg:    db    0    ;z if current cmd requires NDR append
  1475. eoline:    db    0    ;nz if current cmd is last one on line
  1476. errflg:    db    0    ;contains current error code. 0=no error
  1477. lclcmd:    db    0    ;0=cmds from invoking cmd, 0ffh for interactive
  1478.             ;this flag used to distinguish between the
  1479.             ;two modes for routines that act differently,
  1480.             ;like HELP.
  1481. ;single-command buffer
  1482. cmdcnt:    db    0
  1483. cmdbuf:    ds    40
  1484. ;end structure
  1485.  
  1486. ;previous command here for error reporting
  1487. cmdhst:    ds    41
  1488. errhst:    ds    1    ;error code
  1489. ;end structure
  1490.  
  1491. ;buffer for local keyboard input
  1492. ; may contain multiple commands
  1493. keyptr:    dw    keybuf        ;pointer to next char
  1494. keysiz:    db    200
  1495. keycnt:    db    0        ;character count
  1496. keybuf:    ds    201,0        ;command buffer
  1497. ;end structure
  1498.  
  1499. ndblks:    dw    0        ;sys NDR max number of entries
  1500. freesp:    dw    0        ;start of free mem after buffer alloc
  1501.  
  1502. ;Sort Specification Block
  1503. ;Controls operation of the SORT routine
  1504.  
  1505. ssb:    dw    0    ;addr of first record
  1506.     dw    0    ;number of records to sort
  1507.     dw    0    ;record size, bytes
  1508.     dw    compdu    ;addr of compare routine to use
  1509.     dw    0    ;addr of scratch area for sort
  1510.     db    true    ;use pointers (false/no = don't)
  1511.  
  1512. ; Buffer Control Blocks - contain pointers and data
  1513. ; for the dynamically allocated buffers
  1514.  
  1515. ; Buffer 0 - for copy of system Named Directory buffer
  1516. bcb0:    dw    0    ; buffer start address
  1517.     dw    0    ; number of records/blocks
  1518.     dw    entlen    ; number of bytes/(record/block)
  1519.     dw    0    ; pointer to next loc in buffer
  1520.     dw    0    ; next buffer start/freespace
  1521.  
  1522. size0:    dw    0    ;(bcb0+8) - (bcb0)
  1523. ;end structure
  1524.  
  1525. ;this data has the same structure as bcb0: --
  1526. z3ndb:            ;system NDR address
  1527. bcb1:    ds    4,0    ; for Buffer 1 - for System NDR buffer
  1528.     dw    entlen
  1529.     ds    4,0
  1530. ;end structure
  1531.  
  1532.  
  1533. ;***************************************************
  1534.  
  1535. stak_space:
  1536.     ds     64        ; This seems enough
  1537. stak:    dw     0
  1538.  
  1539. ;***************************************************
  1540.  
  1541.     end
  1542.