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 / MENUCK.MAC < prev    next >
Text File  |  2000-06-30  |  11KB  |  546 lines

  1. ;
  2. ;  PROGRAM:  MENUCK
  3. ;  AUTHOR:  RICHARD CONN
  4. ;  VERSION:  1.0
  5. ;  DATE:  18 May 84
  6. ;  PREVIOUS VERSIONS:  None
  7. ;  DERIVATION:  MCHECK 1.1 (6 Jan 83)
  8. ;
  9. VERS    EQU    10    ;VERSION NUMBER
  10. z3env    SET    0f400h
  11.  
  12. ;
  13. ;    MENUCK is used to check the syntax of a MENU.MNU file for the ZCPR3
  14. ; menu processor, MENU.  MENU was optimized for size and runtime speed, and
  15. ; I tried to keep the size under 2K (and succeeded, for that matter).  In
  16. ; keeping MENU small, the error diagnostics it gives are quite limited, with
  17. ; a variety of errors producing the message "Str Err" for MENU.MNU
  18. ; structure error.
  19. ;
  20. ;    MENUCK is intended to be used to check the syntax and other features
  21. ; of a user's MENU.MNU before allowing MENU to run with it.  In this way,
  22. ; many errors may be caught before the MENU.MNU file comes into common use,
  23. ; and there is plenty of space for informative diagnostics.
  24. ;
  25.  
  26. ;
  27. ;  MENU Constants
  28. ;
  29. MCMD    EQU    ':'    ;Menu Jump Command
  30. RSM    EQU    '$'    ;System Menu Indic
  31. MINDIC    EQU    '#'    ;Menu Indic
  32. GOPTION    EQU    '-'    ;Global Option Indic
  33. COPTION    EQU    'C'    ;Option chars
  34. DOPTION    EQU    'D'
  35. POPTION    EQU    'P'
  36. XOPTION    EQU    'X'
  37. VARFLAG    EQU    '$'    ;Variable Flag
  38.  
  39. ;
  40. ;  CP/M Constants
  41. ;
  42. bentry    equ    5    ;BDOS Entry
  43. fcb    equ    5ch    ;FCB
  44. tbuff    equ    80h    ;Temp I/O Buffer
  45. cr    equ    0dh
  46. lf    equ    0ah
  47. EOF    equ    'Z'-'@'    ;^Z=EOF
  48.  
  49. ;
  50. ;  Externals
  51. ;
  52.     ext    z3init,zfname,z3log
  53.  
  54.     ext    caps,crlf,eval10,retud
  55.     ext    f$open,f$close,f$read
  56.     ext    print,cout
  57.     ext    moveb
  58.     ext    phldc,padc,pfn2,pafdc
  59.     ext    codend
  60.  
  61. ;
  62. ; Environment Definition
  63. ;
  64.     if    z3env ne 0
  65. ;
  66. ; External ZCPR3 Environment Descriptor
  67. ;
  68.     jmp    start
  69.     db    'Z3ENV'    ;This is a ZCPR3 Utility
  70.     db    1    ;External Environment Descriptor
  71. z3eadr:
  72.     dw    z3env
  73. start:
  74.     lhld    z3eadr    ;pt to ZCPR3 environment
  75. ;
  76.     else
  77. ;
  78. ; Internal ZCPR3 Environment Descriptor
  79. ;
  80.     MACLIB    Z3BASE.LIB
  81.     MACLIB    SYSENV.LIB
  82. z3eadr:
  83.     jmp    start
  84.     SYSENV
  85. start:
  86.     lxi    h,z3eadr    ;pt to ZCPR3 environment
  87.     endif
  88.  
  89. ;
  90. ; Start of Program -- Initialize ZCPR3 Environment
  91. ;
  92.     call    z3init    ;initialize the ZCPR3 Env and the VLIB Env
  93.  
  94.     call    print
  95.     db    'MENUCK  Version '
  96.     db    (vers/10)+'0','.',(vers mod 10)+'0',0
  97.  
  98.     lda    fcb+1    ;get first char
  99.     cpi    ' '    ;no file name?
  100.     jz    help
  101.     cpi    '/'    ;option?
  102.     jnz    start1
  103. ;
  104. ;  Print Help Message
  105. ;
  106. help:
  107.     call    print
  108.     db    cr,lf,'Syntax:'
  109.     db    cr,lf,'  MENUCK dir:filename.typ <-- Check File'
  110.     db    cr,lf,'  MENUCK dir:filename     <-- Check filename.MNU'
  111.     db    0
  112.     ret
  113.  
  114. ;
  115. ;  Begin serious processing -- locate the file pted to by HL
  116. ;
  117. start1:
  118.     lxi    d,fcb        ;pt to FCB
  119.     call    z3log        ;log into indicated FCB
  120.  
  121. ;
  122. ;  Set File Type to MNU if not specified
  123. ;
  124. start2:
  125.     lxi    h,fcb+9        ;pt to file type
  126.     mov    a,m        ;get first char
  127.     cpi    ' '        ;set type if <SP>
  128.     jnz    start3
  129.     push    b        ;save BC
  130.     lxi    d,mnutyp    ;set type to MNU
  131.     xchg
  132.     mvi    b,3        ;3 bytes
  133.     call    moveb
  134.     pop    b        ;get BC
  135. ;
  136. ;  Try to Open the File
  137. ;
  138. start3:
  139.     lxi    d,fcb        ;prepare to open file
  140.     xra    a        ;A=0 to select current disk
  141.     stax    d
  142.     call    f$open        ;open file
  143.     jz    readfile    ;read in file if OK
  144.     call    print
  145.     db    cr,lf,' File Not Found',0
  146.     ret
  147. ;
  148. ;  Read in File
  149. ;
  150. readfile:
  151.     call    codend        ;get address of first block
  152. readloop:
  153.     lxi    d,fcb        ;read block
  154.     call    f$read        ;do it
  155.     ora    a        ;check for error
  156.     jnz    readdone
  157.     lxi    d,tbuff        ;pt to block just read in
  158.     mvi    b,128        ;128 bytes
  159. readmove:
  160.     ldax    d        ;get byte
  161.     ani    7fh        ;mask MSB
  162.     mov    m,a        ;put byte
  163.     inx    h        ;pt to next
  164.     inx    d
  165.     dcr    b        ;count down
  166.     jnz    readmove
  167.     xchg            ;DE pts to next block
  168.     lhld    bentry+1    ;get address of BDOS
  169.     mov    a,h        ;check for possible overflow
  170.     sui    10        ;10 pages below BDOS is limit
  171.     cmp    d        ;within range?
  172.     xchg            ;HL pts to next block
  173.     jnc    readloop    ;continue read if within range
  174.     call    print
  175.     db    cr,lf,' TPA Overflow -- MENU File is Too Big',0
  176.     ret
  177. ;
  178. ;  Read is Done -- Store Ending ^Z and Set Initial Values
  179. ;
  180. readdone:
  181.     mvi    m,EOF    ;Store ^Z to ensure EOF
  182.     lxi    d,fcb        ;Close File
  183.     call    f$close
  184.     mvi    a,0ffh        ;A = -1
  185.     sta    menunum        ;set menu number
  186.     sta    maxnum        ;set max number of all menus
  187.     lxi    h,0        ;HL=0
  188.     shld    errors        ;Set Error Count to 0
  189.     inx    h        ;HL=1
  190.     shld    linenum        ;Set Line Number to 1
  191. ;
  192. ;  Count Number of Menus
  193. ;
  194.     call    codend        ;Pt to First Byte
  195.     mov    a,m        ;get first byte
  196. ;
  197. ;  Skip to Beginning of Menu Display
  198. ;
  199. mdskip:
  200.     cpi    EOF        ;EOF?
  201.     jz    mdone
  202.     cpi    MINDIC        ;beginning of display?
  203.     jz    mcgo        ;now go skip commands
  204.     call    lskip        ;skip to next line
  205.     jmp    mdskip
  206. mcgo:
  207.     inx    h        ;pt to char after MINDIC
  208.     mov    a,m        ;another MINDIC?
  209.     cpi    MINDIC
  210.     jz    mdone        ;done if 2 in a row
  211.     lda    maxnum        ;get menu number count
  212.     inr    a        ;found another one
  213.     sta    maxnum
  214. mcskip:
  215.     call    lskip        ;skip to next line
  216.     jz    mdone        ;done if premature EOF
  217.     cpi    MINDIC        ;end of display?
  218.     jnz    mcskip
  219.     inx    h        ;pt to char after MINDIC
  220.     mov    a,m        ;get it
  221.     jmp    mdskip
  222. ;
  223. ;  Check for Valid First Character
  224. ;
  225. mdone:
  226.     call    print
  227.     db    cr,lf,'Menu Syntax Check on ',0
  228.     call    retud        ;get dir
  229.     mov    a,b        ;get disk
  230.     adi    'A'
  231.     call    cout
  232.     mov    a,c        ;get user
  233.     call    pafdc
  234.     mvi    a,':'
  235.     call    cout
  236.     lxi    d,fcb+1        ;pt to FCB
  237.     call    pfn2
  238.     call    print        ;Print Header
  239.     db    cr,lf
  240.     db    cr,lf,' Line Comment/Error Message'
  241.     db    cr,lf,' ---- ---------------------',0
  242.  
  243.     xra    a        ;set no global option
  244.     sta    gopt
  245.     call    codend        ;get address of first byte
  246.     mov    a,m        ;get first char
  247.     cpi    GOPTION        ;global options?
  248.     jnz    newmenu        ;process globals
  249.     mvi    a,0ffh        ;set global option
  250.     sta    gopt
  251.     call    lprint
  252.     db    '** Global Options Detected **',0
  253.     call    optchk        ;check options
  254.     xra    a        ;set no global option
  255.     sta    gopt
  256.     call    nxtline        ;advance to next line
  257. ;
  258. ;  This is the main entry point for processing a menu
  259. ;
  260. newmenu:
  261.     mov    a,m        ;get Menu Indicator
  262.     cpi    MINDIC        ;must be MINDIC
  263.     jz    nm1
  264.     call    newerr        ;add to error count
  265.     call    lprint
  266.     db    ' New Menu Expected, But ',MINDIC,' NOT Found -- '
  267.     db    'Aborting',0
  268.     jmp    errxit
  269. ;
  270. ;  Print that we have a new menu
  271. ;
  272. nm1:
  273.     call    lprint
  274.     db    '** Menu Number ',0
  275.     lda    menunum        ;increment menu number
  276.     inr    a
  277.     sta    menunum
  278.     call    padc
  279.     call    optchk        ;check options
  280. ;
  281. ;  Skip Thru Display
  282. ;
  283. nm2:
  284.     call    nxtline        ;skip to next line
  285.     jnz    nm2a        ;continue if no EOF
  286. earlyeof:
  287.     call    newerr        ;add to error count
  288.     call    lprint
  289.     db    ' Premature EOF Encountered',0
  290.     jmp    errxit
  291. nm2a:
  292.     cpi    MINDIC        ;Menu Indicator?
  293.     jnz    nm2        ;Continue
  294. ;
  295. ;  Move Thru Menu Commands
  296. ;
  297. nm3:
  298.     call    mcmd1        ;check Menu Command Line
  299.     jz    earlyeof
  300.     call    lcheck        ;check line
  301.     cpi    MINDIC        ;check for menu indicator
  302.     jnz    nm3        ;continue until menu indicator encountered
  303.     inx    h        ;check for 2 indicators in a row for end
  304.     mov    a,m        ;get 2nd char
  305.     dcx    h        ;back up in case it is not
  306.     cpi    MINDIC        ;2 in a row?
  307.     jnz    newmenu        ;process as new menu if not
  308. errxit:
  309.     call    lprint
  310.     db    '** End of Menu Check **',cr,lf,'    ',0
  311.     lhld    errors        ;check error count
  312.     mov    a,h        ;check for Zero
  313.     ora    l
  314.     jnz    err1
  315.     call    print
  316.     db    'No',0
  317.     jmp    err2
  318. err1:
  319.     call    phldc        ;print as decimal
  320. err2:
  321.     call    print
  322.     db    ' Errors Detected',0
  323.     ret
  324.  
  325. ;
  326. ;  Utilities
  327. ;
  328.  
  329. ;
  330. ;  LPRINT -- Print "Line # "+text
  331. ;
  332. lprint:
  333.     call    crlf        ;new line
  334.     push    h        ;save HL
  335.     lhld    linenum        ;get line number
  336.     call    phldc        ;print as decimal
  337.     pop    h        ;restore HL
  338.     mvi    a,' '        ;print <sp>
  339.     call    cout
  340.     jmp    print        ;print text
  341. ;
  342. ;  NXTLINE -- Advance to next line, check for EOF, and increment Line Number
  343. ;  LSKIP -- Advance to next line and check for EOF
  344. ;    Return with HL pting to first char of next line and Z Set if EOF
  345. ;
  346. nxtline:
  347.     push    h        ;increment line count
  348.     lhld    linenum        ;add 1
  349.     inx    h
  350.     shld    linenum
  351.     pop    h        ;fall thru to skipping
  352. lskip:
  353.     mov    a,m        ;get char
  354.     cpi    EOF        ;EOF?
  355.     rz
  356.     inx    h        ;pt to next
  357.     cpi    lf        ;line feed?
  358.     jnz    lskip        ;continue if not
  359.     mov    a,m        ;get first char of next line
  360.     cpi    EOF        ;check for EOF
  361.     ret
  362. ;
  363. ;  MCMD1 -- Check Menu Line, check for EOF, and increment Line Number
  364. ;    Return with HL pting to first char of next line and Z Set if EOF
  365. ;
  366. mcmd1:
  367.     mov    a,m        ;get char
  368.     cpi    EOF        ;EOF?
  369.     jz    mcmdx
  370.     inx    h        ;pt to next
  371.     cpi    VARFLAG        ;variable?
  372.     jz    mcmd2
  373.     cpi    lf        ;line feed?
  374.     jnz    mcmd1        ;continue if not
  375. mcmdx:
  376.     push    h        ;increment line count
  377.     lhld    linenum        ;add 1
  378.     inx    h
  379.     shld    linenum
  380.     pop    h        ;fall thru to skipping
  381.     mov    a,m        ;get first char of next line
  382.     cpi    EOF        ;check for EOF
  383.     ret
  384. ;
  385. ; Check Variable
  386. ;
  387. mcmd2:
  388.     mov    a,m        ;get char
  389.     ani    7fh        ;mask
  390.     call    caps        ;capitalize
  391.     inx    h        ;pt to next
  392.     cpi    VARFLAG        ;OK if double VARFLAG
  393.     jz    mcmd1
  394.     cpi    'D'        ;OK if D
  395.     jz    mcmd1
  396.     cpi    'U'        ;OK if U
  397.     jz    mcmd1
  398.     cpi    'F'        ;filename.typ?
  399.     jz    mcmd3
  400.     cpi    'N'        ;filename?
  401.     jz    mcmd3
  402.     cpi    'T'        ;filetype?
  403.     jz    mcmd3
  404. ;
  405. ; Invalid Variable
  406. ;
  407.     dcx    h        ;pt to previous (bad char)
  408.     push    psw        ;save char
  409.     call    lprint
  410.     db    ' Variable Error (Not $, D, U, F, N, or T) - ',0
  411.     pop    psw        ;get char
  412.     call    cout        ;print it
  413.     call    newerr        ;increment error count
  414.     jmp    mcmd1
  415. ;
  416. ; Digit from 1 to 4 should follow
  417. ;
  418. mcmd3:
  419.     mov    a,m        ;get next char
  420.     inx    h        ;pt to next
  421.     ani    7fh        ;mask and cap
  422.     call    caps
  423.     cpi    '1'        ;must be from 1 to 4
  424.     jc    mcmd4
  425.     cpi    '5'
  426.     jc    mcmd1
  427. ;
  428. ; Invalid Digit
  429. ;
  430. mcmd4:
  431.     dcx    h        ;pt to offending char
  432.     push    psw
  433.     call    lprint
  434.     db    ' Invalid Digit for F, N, or T Variable (not 1-4) - ',0
  435.     pop    psw
  436.     call    cout
  437.     call    newerr        ;increment error count
  438.     jmp    mcmd1
  439.  
  440. ;
  441. ;  OPTCHK -- Check Line Pted to by HL for Valid GOPTION and MINDIC options
  442. ;    Do Not Affect HL
  443. ;    Print Error Message and Character if Invalid Option Found
  444. ;
  445. optchk:
  446.     push    h        ;save HL
  447.     push    b
  448.     inx    h        ;skip indicator
  449. optclp:
  450.     mov    a,m        ;get char
  451.     call    caps        ;capitalize
  452.     inx    h        ;pt to next
  453.     cpi    cr        ;EOL?
  454.     jz    optcdn
  455.     mov    b,a        ;char in B
  456.     lda    gopt        ;global option?
  457.     ora    a        ;0=no
  458.     mov    a,b        ;get char
  459.     jnz    optcl1        ;skip RSM test if it is global
  460.     cpi    RSM        ;System Menu?
  461.     jz    optclp
  462. optcl1:
  463.     cpi    COPTION        ;check options
  464.     jz    optclp
  465.     cpi    DOPTION
  466.     jz    optclp
  467.     cpi    POPTION
  468.     jz    optclp
  469.     cpi    XOPTION
  470.     jz    optclp
  471.     call    newerr        ;increment error count
  472.     call    lprint
  473.     db    ' Invalid Option: ',0
  474.     mov    a,b        ;get char
  475.     call    cout        ;print char
  476.     jmp    optclp
  477. optcdn:
  478.     pop    b
  479.     pop    h        ;restore ptr
  480.     ret
  481. ;
  482. ;  Increment Error Count
  483. ;
  484. newerr:
  485.     push    h    ;save HL
  486.     lhld    errors    ;increment error count
  487.     inx    h
  488.     shld    errors
  489.     pop    h    ;restore HL
  490.     ret
  491. ;
  492. ;  Check Line, especially looking for Menu Jump
  493. ;
  494. lcheck:
  495.     push    h    ;save ptr to first char
  496.     inx    h    ;pt to 2nd char
  497.     mov    a,m    ;get it
  498.     cpi    MCMD    ;menu jump?
  499.     jnz    lchk1
  500.     inx    h    ;pt to menu number
  501.     call    eval10    ;convert to binary in DE
  502.     mov    a,d    ;D must be 0
  503.     ora    a    ;check
  504.     jz    lchk0
  505. lchker:
  506.     call    newerr    ;increment error count
  507.     call    lprint
  508.     db    ' Menu Number Out of Range',0
  509.     jmp    lchk1
  510. lchk0:
  511.     lda    maxnum    ;get max menu number
  512.     cmp    e    ;check for range
  513.     jc    lchker
  514. lchk1:
  515.     pop    h    ;restore ptr
  516.     mov    a,m    ;get first char in line
  517.     ret
  518. ;
  519. ;  Skip HL over Blanks
  520. ;
  521. sblank:
  522.     mov    a,m    ;get char
  523.     inx    h    ;pt to next
  524.     cpi    ' '    ;blank?
  525.     jz    sblank    ;continue skipping
  526.     dcx    h    ;pt to non-blank
  527.     ret
  528.  
  529. ;
  530. ;  Buffers
  531. ;
  532. mnutyp:
  533.     db    'MNU'
  534. errors:
  535.     ds    2    ;error count
  536. linenum:
  537.     ds    2    ;current line number
  538. menunum:
  539.     ds    1    ;current menu number
  540. maxnum:
  541.     ds    1    ;max menu number
  542. gopt:
  543.     ds    1    ;global option flag
  544.  
  545.     end
  546.