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 / ZSYS / SIMTEL20 / ZCPR3 / SHVAR.MAC < prev    next >
Text File  |  2000-06-30  |  11KB  |  656 lines

  1. ;
  2. ; Program: SHVAR
  3. ; Author: Richard Conn
  4. ; Version: 1.0
  5. ; Date: 5 Mar 84
  6. ;
  7. version    equ    10
  8.  
  9. ;
  10. ;    SHVAR is used to define a shell variable for the Shell SH.
  11. ; It makes entries into the file SH.VAR in the ROOT directory.  The
  12. ; syntax of its use is:
  13. ;        SHVAR variable text    <-- define/redefine variable
  14. ;        SHVAR variable        <-- delete variable
  15. ;        SHVAR            <-- list variables
  16. ;
  17.  
  18. ;
  19. ; Equates for Key Values
  20. ;
  21. z3env    SET    0f400h    ;address of ZCPR3 environment
  22. backup    equ    0    ;backup old file? 1 for yes, 0 for no
  23. ctrlz    equ    'Z'-'@'    ;^Z for EOF
  24. fcb    equ    5ch
  25. tbuff    equ    80h
  26. cr    equ    0dh
  27. lf    equ    0ah
  28.  
  29. ;
  30. ; External Z3LIB and SYSLIB Routines
  31. ;
  32.     ext    cout,qcout,getquiet,sort,crlf
  33.     ext    sksp,fillb,moveb
  34.     ext    initfcb,f$open,f$read,f$close,f$make,f$delete,f$write,f$rename
  35.     ext    z3init,qprint,codend,hmovb,root,logud,getwhl,print
  36.     ext    getfn1,pfn1,cline
  37.  
  38. ;
  39. ; Environment Definition
  40. ;
  41.     if    z3env ne 0
  42. ;
  43. ; External ZCPR3 Environment Descriptor
  44. ;
  45.     jmp    start
  46.     db    'Z3ENV'    ;This is a ZCPR3 Utility
  47.     db    1    ;External Environment Descriptor
  48. z3eadr:
  49.     dw    z3env
  50. start:
  51.     lhld    z3eadr    ;pt to ZCPR3 environment
  52. ;
  53.     else
  54. ;
  55. ; Internal ZCPR3 Environment Descriptor
  56. ;
  57.     MACLIB    Z3BASE.LIB
  58.     MACLIB    SYSENV.LIB
  59. z3eadr:
  60.     jmp    start
  61.     SYSENV
  62. start:
  63.     lxi    h,z3eadr    ;pt to ZCPR3 environment
  64.     endif
  65.  
  66. ;
  67. ; Start of Program -- Initialize ZCPR3 Environment
  68. ;
  69.     call    z3init    ;initialize the ZCPR3 Environment
  70.     call    banner    ;print banner
  71. ;
  72. ; Check for Wheel
  73. ;
  74.     call    getwhl    ;get wheel byte
  75.     jnz    start0
  76.     call    print
  77.     db    cr,lf,' Not Wheel - Aborting',0
  78.     ret
  79. ;
  80. ; Try to Load Variables
  81. ;
  82. start0:
  83. ;
  84. ; Check for Help
  85. ;
  86.     lda    fcb+1    ;get first char of FCB
  87.     cpi    '/'    ;also help?
  88.     jnz    start0x
  89. ;
  90. ; Print Help Message
  91. ;
  92.     call    print
  93.     db    cr,lf,'SHVAR - Define/Redefine/Delete a Shell Variable'
  94.     db    cr,lf,'Syntax:'
  95.     db    cr,lf,'    SHVAR variable text    <-- to Define/Redefine'
  96.     db    cr,lf,'    SHVAR variable        <-- to Delete'
  97.     db    cr,lf,'    SHVAR            <-- to List Variable Names'
  98.     db    0
  99.     ret
  100. ;
  101. ; Define File to Work With
  102. ;
  103. start0x:
  104.     call    getfn1    ;get name of shell
  105.     lxi    d,shvfcb+1    ;variable FCB
  106.     mvi    b,11    ;11 chars
  107.     mov    a,m    ;any name given?
  108.     cpi    ' '    ;space if none
  109.     cnz    moveb    ;set name
  110. ;
  111. ; Define $$$ and BAK Files
  112. ;
  113.     lxi    h,shvfcb+1
  114.     lxi    d,shvtmp+1    ;set $$$ name
  115.     mvi    b,8        ;8 chars
  116.     call    moveb
  117. ;
  118.     if    backup
  119.     lxi    d,shvbak+1    ;set BAK name
  120.     call    moveb
  121.     endif
  122. ;
  123. ;
  124. ; Save Command Line
  125. ;
  126.     lxi    h,tbuff        ;save line
  127.     call    cline
  128.     shld    lineptr        ;set ptr to line
  129. ;
  130. ; Load Variables
  131. ;
  132.     call    varload
  133.     jnz    start1
  134. ;
  135. ; Initialize Shell Variables if File Not Found
  136. ;
  137.     call    print
  138.     db    cr,lf,' Shell Variable File ',0
  139.     lxi    d,shvfcb+1
  140.     call    pfn1
  141.     call    print
  142.     db    ' Not Found',0
  143.     ret
  144. ;
  145. ; Process User Command
  146. ;
  147. start1:
  148.     lda    fcb+1    ;check for list option
  149.     cpi    ' '    ;no args = list
  150.     jz    list
  151.     call    doit    ;process command
  152.     call    varsave    ;save new shell variables
  153.     ret
  154. ;
  155. ; Print Names of Variables
  156. ;
  157. list:
  158.     call    lpack    ;pack just names
  159.     xchg        ;set ptr to ptr table
  160.     inx    h
  161.     shld    ptrbuf    ;ptr buffer for sort
  162.     lhld    vcount    ;run sort?
  163.     mov    a,h
  164.     ora    l
  165.     cnz    lsort    ;sort names
  166.     call    print
  167.     db    cr,lf,' Shell Variables --',cr,lf,0
  168.     mvi    c,0    ;set counter
  169.     call    codend    ;pt to first variable
  170.     mov    a,m    ;empty?
  171.     cpi    ctrlz
  172.     jnz    list1
  173.     call    print
  174.     db    '  -- No Variables Defined --',0
  175.     ret
  176. ;
  177. ; Print Next Variable
  178. ;
  179. list1:
  180.     mov    a,m    ;end of list?
  181.     cpi    ctrlz
  182.     jz    list3
  183.     call    print
  184.     db    '  ',0
  185.     mvi    b,8    ;print 8 chars
  186. list2:
  187.     mov    a,m    ;get char
  188.     inx    h    ;pt to next
  189.     call    cout    ;print it
  190.     dcr    b    ;count down
  191.     jnz    list2
  192.     inr    c    ;increment count
  193.     mov    a,c    ;new line?
  194.     ani    3
  195.     cz    crlf
  196.     jmp    list1
  197. list3:
  198.     mov    a,c    ;new line to end?
  199.     ani    3
  200.     cnz    crlf
  201.     ret
  202. ;
  203. ; Sort Variables
  204. ;
  205. lsort:
  206.     call    codend    ;pt to first variable
  207.     shld    ssb    ;set ptr
  208.     lxi    d,ssb    ;pt to SSB
  209.     jmp    sort    ;perform sort
  210. ;
  211. ; Compare Routine
  212. ;
  213. compare:
  214.     push    h    ;save regs
  215.     push    d
  216.     push    b
  217.     mvi    b,8    ;8 chars
  218. comp1:
  219.     ldax    d    ;get char
  220.     cmp    m    ;compare
  221.     jnz    comp2
  222.     inx    h    ;pt to next
  223.     inx    d
  224.     dcr    b    ;count down
  225.     jnz    comp1
  226. comp2:
  227.     pop    b    ;restore regs
  228.     pop    d
  229.     pop    h
  230.     ret
  231.  
  232. ;
  233. ; Pack Variables Down to a Minimum (Just 8-char Names)
  234. ;
  235. lpack:
  236.     lxi    h,0    ;set count
  237.     shld    vcount
  238.     call    codend    ;pt to first variable
  239.     mov    d,h    ;DE=HL
  240.     mov    e,l
  241. lpack1:
  242.     mov    a,m    ;get next char
  243.     stax    d    ;set possible EOF
  244.     cpi    ctrlz    ;done?
  245.     rz
  246.     push    h    ;increment variable count
  247.     lhld    vcount
  248.     inx    h
  249.     shld    vcount
  250.     pop    h
  251.     mvi    b,8    ;save 8 chars
  252. lpack2:
  253.     mov    a,m    ;get next char
  254.     stax    d    ;store it
  255.     inx    h    ;pt to next
  256.     inx    d
  257.     dcr    b    ;count down
  258.     jnz    lpack2
  259. lpack3:
  260.     mov    a,m    ;skip to next variable
  261.     inx    h
  262.     ora    a    ;done?
  263.     jnz    lpack3
  264.     jmp    lpack1    ;resume
  265. ;
  266. ; Input and Process User Commands
  267. ;
  268. doit:
  269.     call    nadd    ;add/delete/redefine variable
  270. ;
  271. ; Pack Names
  272. ;
  273. pack:
  274.     call    codend    ;pack entries in table
  275.     mov    d,h    ;HL=DE
  276.     mov    e,l
  277. ;
  278. ; Check Next Entry
  279. ;
  280. pack1:
  281.     mov    a,m    ;get next char
  282.     stax    d    ;put it
  283.     cpi    ctrlz    ;done?
  284.     rz
  285.     cpi    ' '    ;deleted?
  286.     jz    pack3
  287. ;
  288. ; Copy Entry
  289. ;
  290. pack2:
  291.     mov    a,m    ;get char
  292.     stax    d    ;put it
  293.     inx    h    ;pt to next
  294.     inx    d
  295.     ora    a    ;done?
  296.     jnz    pack2
  297.     jmp    pack1    ;resume
  298. ;
  299. ; Skip Entry
  300. ;
  301. pack3:
  302.     mov    a,m    ;get char
  303.     inx    h    ;pt to next
  304.     ora    a    ;done?
  305.     jnz    pack3
  306.     jmp    pack1    ;resume
  307.  
  308. ;
  309. ; Add Names to Table
  310. ;
  311. nadd:
  312.     lhld    lineptr    ;pt to user line
  313.     call    sksp    ;skip to first non-blank
  314.     ora    a    ;done?
  315.     rz        ;exit if no change
  316.     call    qprint
  317.     db    cr,lf,' Shell Variable ',0
  318. ;
  319. ; Copy Input Name into Shell Buffer SHVAR
  320. ;
  321.     push    h    ;save ptr to name
  322.     lxi    h,shvar    ;init name buffer
  323.     mvi    a,' '    ;space fill
  324.     mvi    b,8    ;8 chars
  325.     call    fillb
  326.     xchg        ;pt to buffer in DE
  327.     pop    h    ;pt to name
  328.     mvi    b,8    ;8 chars max
  329. nadd1:
  330.     mov    a,m    ;get name char
  331.     call    delck    ;check for delimiter
  332.     jz    nadd3
  333.     stax    d    ;store char
  334.     call    qcout    ;print chars of variable name
  335.     inx    h    ;pt to next
  336.     inx    d
  337.     dcr    b    ;count down
  338.     jnz    nadd1
  339. nadd2:
  340.     mov    a,m    ;flush to delimiter
  341.     inx    h
  342.     call    delck    ;check for delimiter
  343.     jnz    nadd2
  344.     dcx    h    ;pt to delimiter
  345. ;
  346. ; Search for Name
  347. ;
  348. nadd3:
  349.     shld    lineptr    ;set ptr to rest of line
  350.     call    codend    ;pt to first element
  351. ;
  352. ; Check for End of Entries
  353. ;
  354. nadd4:
  355.     mov    a,m    ;get first char of next string
  356.     cpi    ctrlz
  357.     jz    addit    ;add name at HL
  358. ;
  359. ; Compare Names
  360. ;
  361.     lxi    d,shvar    ;pt to variable
  362.     mvi    b,8    ;compare
  363.     shld    curname    ;save ptr to current name in case of delete
  364. nadd5:
  365.     ldax    d    ;check for duplicate
  366.     cmp    m
  367.     jnz    nadd6
  368.     inx    h    ;pt to next
  369.     inx    d
  370.     dcr    b    ;count down
  371.     jnz    nadd5
  372.     jmp    nadd7
  373. ;
  374. ; No Match, so Skip Rest of String
  375. ;
  376. nadd6:
  377.     mov    a,m    ;skip to end of string
  378.     inx    h    ;pt to next
  379.     ora    a    ;done?
  380.     jnz    nadd6
  381.     jmp    nadd4    ;resume
  382. ;
  383. ; Match - Determine What User Wants to Do
  384. ;
  385. nadd7:
  386.     lhld    lineptr    ;see if any text follows name
  387.     call    sksp    ;skip to text
  388.     ora    a    ;EOL?
  389.     jz    delete    ;delete name
  390. ;
  391. ; Redefine Name
  392. ;
  393.     lhld    curname    ;pt to name in buffer
  394.     mvi    b,8    ;space fill it
  395.     mvi    a,' '
  396.     call    fillb
  397.     jmp    nadd6    ;resume in case another duplicate
  398. ;
  399. ; Delete Name
  400. ;
  401. delete:
  402.     call    qprint
  403.     db    ' Deleted',0
  404.     lhld    curname    ;pt to name in buffer
  405.     mvi    b,8    ;space fill it
  406.     mvi    a,' '
  407.     call    fillb
  408.     ret
  409. ;
  410. ; Add Name
  411. ;
  412. addit:
  413.     call    qprint
  414.     db    ' = ',0
  415.     shld    curname    ;save ptr to new name
  416.     xchg        ;dest in DE
  417.     lxi    h,shvar    ;pt to name
  418.     mvi    b,8    ;8 chars
  419.     call    hmovb    ;copy name into buffer
  420.     xchg        ;pt to after name with HL
  421.     push    h    ;save ptr
  422.     mvi    m,0    ;store ending 0 and ^Z in case of abort
  423.     inx    h
  424.     mvi    m,ctrlz    ;store ^Z
  425.     lhld    lineptr    ;point to user text
  426.     call    sksp    ;skip to non-space
  427.     pop    d    ;pt to destination
  428. ;
  429. ; Copy User Input into Buffer
  430. ;
  431. addit1:
  432.     mov    a,m    ;get char
  433.     stax    d    ;put char
  434.     ani    7FH    ;done?
  435.     cnz    qcout    ;print chars of definition
  436.     inx    h    ;pt to next
  437.     inx    d
  438.     ora    a    ;done?
  439.     jnz    addit1
  440.     mvi    a,ctrlz    ;mark end
  441.     stax    d
  442.     ret
  443.  
  444. ;
  445. ; Print Banner
  446. ;
  447. banner:
  448.     call    qprint
  449.     db    'SHVAR, Version '
  450.     db    (version/10)+'0','.',(version mod 10)+'0'
  451.     db    0
  452.     ret
  453. ;
  454. ; Check to see if char in A is a delimiter
  455. ;    Return with Z if so
  456. ;
  457. delck:
  458.     push    h        ;pt to table
  459.     push    b        ;save BC
  460.     mov    b,a        ;char in B
  461.     lxi    h,dtable    ;pt to delimiter table
  462. delck1:
  463.     mov    a,m        ;get delimiter
  464.     ora    a        ;done?
  465.     jz    notdel
  466.     cmp    b        ;compare
  467.     jz    yesdel
  468.     inx    h        ;pt to next
  469.     jmp    delck1
  470. notdel:
  471.     mov    a,b        ;get char
  472.     ora    a        ;set Z if null, else NZ
  473. yesdel:
  474.     mov    a,b        ;restore char
  475.     pop    b        ;restore regs
  476.     pop    h
  477.     ret
  478.  
  479. ;
  480. ; Delimiter Table
  481. ;
  482. dtable:
  483.     db    '<>;:,.=-_ ',0
  484.  
  485. ;
  486. ; Save Shell Variable List
  487. ;    Return with Z if Error
  488. ;
  489. varsave:
  490.     call    getquiet    ;get quiet flag
  491.     jnz    vars0
  492.     call    print
  493.     db    cr,lf,' Writing Shell Variable File ',0
  494.     lxi    d,shvfcb+1
  495.     call    pfn1        ;print file name
  496. vars0:
  497.     lxi    d,shvtmp    ;open temp
  498.     call    initfcb
  499.     call    f$delete    ;delete if any exists
  500.     call    f$make        ;create new file
  501.     inr    a        ;error?
  502.     rz
  503.     call    codend        ;pt to scratch area
  504. ;
  505. ; Save Loop
  506. ;
  507. vars1:
  508.     lxi    d,tbuff        ;copy into buffer
  509.     mvi    b,128        ;128 bytes
  510.     call    hmovb
  511.     lxi    d,shvtmp    ;write block
  512.     call    f$write
  513.     jnz    werr        ;write error
  514.     lxi    d,tbuff        ;check for done
  515.     mvi    b,128        ;128 bytes
  516. ;
  517. ; Check for Done
  518. ;
  519. vars2:
  520.     ldax    d        ;look for ^Z
  521.     cpi    ctrlz
  522.     jz    varsx
  523.     inx    d        ;pt to next
  524.     dcr    b        ;count down
  525.     jnz    vars2
  526.     jmp    vars1
  527. ;
  528. ; Done
  529. ;
  530. varsx:
  531.     lxi    d,shvtmp    ;close temp file
  532.     call    f$close
  533. ;
  534. ; Delete Old Backup File SH.BAK
  535. ;
  536.     if    backup
  537. ;
  538.     lxi    d,shvbak    ;delete any old backups
  539.     call    initfcb
  540.     call    f$delete
  541. ;
  542. ; Create New Backup File SH.BAK=SH.VAR
  543. ;
  544.     lxi    h,shvbak    ;new name
  545.     lxi    d,shvfcb    ;old name
  546.     call    f$rename    ;create backup file
  547. ;
  548.     else
  549. ;
  550. ; Delete Original File
  551. ;
  552.     lxi    d,shvfcb    ;pt to FCB
  553.     call    initfcb
  554.     call    f$delete
  555. ;
  556.     endif        ;backup
  557. ;
  558. ; Create New Shell Variable File SH.VAR=SH.$$$
  559. ;
  560.     lxi    h,shvfcb    ;new name
  561.     lxi    d,shvtmp    ;old name
  562.     call    f$rename    ;create new file
  563.     xra    a        ;return OK
  564.     dcr    a        ;NZ
  565.     ret
  566. ;
  567. ; File Write Error
  568. ;
  569. werr:
  570.     call    print
  571.     db    cr,lf,'Error in Writing File - Aborting',0
  572.     xra    a        ;error code
  573.     ret
  574.  
  575. ;
  576. ; Load Shell Variable List
  577. ;    Return with Z if Error
  578. ;
  579. varload:
  580. ;
  581. ; Look for Variable File
  582. ;
  583.     call    root        ;determine DU of root
  584.     call    logud        ;goto root
  585.     call    codend        ;pt to scratch area
  586.     mvi    m,ctrlz        ;prep for no file
  587.     lxi    d,shvfcb    ;try to open file
  588.     call    initfcb        ;init FCB
  589.     call    f$open
  590.     rnz            ;file not found
  591. ;
  592. ; Read in Variable File
  593. ;
  594. varl1:
  595.     lxi    d,shvfcb    ;read in file
  596.     call    f$read
  597.     jnz    varl2
  598.     lxi    d,tbuff        ;pt to data
  599.     xchg            ;copy into memory
  600.     mvi    b,128        ;128 bytes
  601.     call    hmovb
  602.     xchg
  603.     jmp    varl1
  604. varl2:
  605.     lxi    d,shvfcb    ;close file
  606.     call    f$close
  607. ;
  608. ; Say List is Already Loaded
  609. ;
  610.     xra    a        ;return NZ for OK
  611.     dcr    a
  612.     ret
  613.  
  614. ;
  615. ; Buffers
  616. ;
  617. lineptr:
  618.     ds    2        ;ptr to next char in line
  619. curname:
  620.     ds    2        ;ptr to current variable name
  621. shvar:
  622.     ds    8        ;shell variable name
  623. ;
  624.     if    backup
  625. shvbak:
  626.     db    0
  627.     db    'SH      '    ;name of shell variable file
  628.     db    'BAK'
  629.     ds    24        ;36 bytes total
  630.     endif        ;backup
  631. ;
  632. shvtmp:
  633.     db    0
  634.     db    'SH      '    ;name of shell variable file
  635.     db    '$$$'
  636.     ds    24        ;36 bytes total
  637. shvfcb:
  638.     db    0
  639.     db    'SH      '    ;name of shell variable file
  640.     db    'VAR'
  641.     ds    24        ;36 bytes total
  642. ;
  643. ; Sort Specification Block
  644. ;
  645. ssb:
  646.     ds    2        ;address of first record
  647. vcount:
  648.     ds    2        ;number of records to sort
  649.     dw    8        ;size of each record in bytes
  650.     dw    compare        ;compare routine
  651. ptrbuf:
  652.     ds    2        ;address of pointer buffer
  653.     dw    0ffh        ;use pointers
  654.  
  655.     end
  656.