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 / PAUSE11.LBR / PAUSE11.ZZ0 / PAUSE11.Z80
Text File  |  2000-06-30  |  12KB  |  503 lines

  1.  
  2. ;  PROGRAM:    PAUSE [derived from SAK (Strike Any Key) by Richard Conn]
  3. ;  AUTHOR:    Jay Sage
  4. ;  VERSION:    1.1
  5. ;  DATE:    14 September 1987
  6.  
  7.  
  8. ;            * * *   IMPORTANT NOTE   * * *
  9. ;
  10. ; This program is copyrighted 1986 by NAOG/ZSIG.  It may be copied and modified
  11. ; freely for personal use but may not be sold or distributed for a fee.
  12. ; Modified versions must be submitted to and approved by NAOG/ZSIG before they
  13. ; may be distributed.  See the file ZSIGPOL1.DOC on Z-Nodes for the ZSIG policy
  14. ; on signing out and modifying programs.
  15.  
  16.  
  17. ;=============================================================================
  18. ;
  19. ;            R E V I S I O N   H I S T O R Y
  20. ;
  21. ;=============================================================================
  22.  
  23. vers    equ    11    ; Fixed bug in message display configuration control.
  24.             ; The FLAGMSG code was never implemented, and the
  25.             ; configuration setting at the beginning of the code
  26.             ; was ignored.        Jay Sage, 09/14/87
  27.  
  28. ;vers    equ    10    ; New program called PAUSE derived from SAK.  New
  29.             ; features include F option to set or rest the
  30.             ; program error flag instead of aborting command line
  31.             ; or ZEX.  Thus PAUSE can be like "IF INPUT" except that a
  32.             ; a default answer of TRUE is given after pause time
  33.             ; elapses.
  34.             ;     Jay Sage      14 November 1986
  35.  
  36. ;SAK version 22        ; Changed to allow the BIOS to return from
  37.             ; CONIN: with the zero flag set.  CONDIN:
  38.             ; subroutine in SYSLIB assumes, incorrectly,
  39.             ; that this flag will always be non-zero.
  40.             ; Joe Wright  21 September 1985
  41.             ; Program updated by Ken Davidson
  42.  
  43.  
  44. ;    PAUSE is used for the following purposes:
  45. ;        1) to wait for user interaction before continuing
  46. ;            and to allow the user to abort a multiple
  47. ;            command line, abort ZEX, or set/clear the
  48. ;            program error flag; and/or
  49. ;        2) to command the user's attention by ringing the
  50. ;            bell at his console.
  51. ;
  52. ;    The PAUSE command line is:
  53. ;        PAUSE text    or    PAUSE /o... text
  54. ;
  55. ;    PAUSE is invoked with the following options:
  56. ;        A     -- DO NOT Allow the User to Abort MCL
  57. ;        B     -- Ring Bell
  58. ;        F     -- Set/Reset Program Error Flag (No Abort)
  59. ;        Pnnnn -- Pause nnnn seconds and continue if no
  60. ;             response by that time
  61. ;        Z     -- Allow the User to Abort ZEX
  62. ;
  63. ;    The line of prompting text can contain special characters for
  64. ;    allowing the generation of lowercase output and control characters.
  65. ;    In the default version '^' preceding a character causes that
  66. ;    character to be converted to a control character.  The sequence
  67. ;    '%>' causes all subsequent output to be converted to lowercase.  The
  68. ;    sequence '%<' causes uppercase output to resume.  Any other character
  69. ;    after '%' is displayed as is ('%^' will give a caret).  Here is an
  70. ;    example    of the use of these features:
  71. ;
  72. ;    A0>PAUSE P%>ROGRAM PAUSED^M^J^I%<P%>RESS A KEY TO RESUME: <cr>
  73. ;    Program paused
  74. ;        Press a key to resume: _
  75. ;
  76. ;    The most useful control characters are ^M (carriage return),
  77. ;    ^J (linefeed), and ^I (tab).  Since the 'text' begins with the
  78. ;    first nonblank character, putting in '% ' allows one to include
  79. ;    leading blank space.
  80.  
  81.  
  82. ;=============================================================================
  83. ;
  84. ;        C O N F I G U R A T I O N    E Q U A T E S
  85. ;
  86. ;=============================================================================
  87.  
  88. false    equ    0
  89. true    equ    not false
  90. no    equ    false
  91. yes    equ    true
  92.  
  93. upcase    equ    yes        ; Default to upper case string output
  94. casech    equ    '%'        ; Lead-in char for case change control
  95. contch    equ    '^'        ; Lead-in char for control-char output
  96. lcase    equ    '>'        ; Shift to lower case code
  97. ucase    equ    '<'        ; Shift to upper case code
  98.  
  99. fmsgs    equ    yes        ; Yes to show error flag set/clear messages
  100.  
  101. z3env    aset    0fe00h
  102.  
  103. tbuff    equ    80h
  104. cr    equ    0dh
  105. lf    equ    0ah
  106. tab    equ    09h
  107. bel    equ    'G'-'@'
  108. ctrlc    equ    'C'-'@'
  109.  
  110.  
  111. ; External (Z3LIB and SYSLIB) References
  112.  
  113.     ext    z3init,wait1s,getcl1,qprint,qcrlf
  114.     ext    strtzex,stopzex,putzex,getznc,getzrun
  115.     ext    pstr,print,cst,cin,eval10,cout,sksp
  116.     ext    puter2
  117.  
  118.  
  119. ; External ZCPR3 Environment Descriptor
  120.  
  121.     jp    start
  122.     db    'Z3ENV'        ; This is a ZCPR3 Utility
  123.     db    1        ; External Environment Descriptor
  124. z3eadr:
  125.     dw    z3env
  126.  
  127.     db    'CONFIG>'
  128. flagmsg:
  129.     db    fmsgs
  130.  
  131. start:
  132.     ld    hl,(z3eadr)    ; Point to ZCPR3 environment
  133.  
  134.  
  135. ; Start of Program -- Initialize ZCPR3 Environment
  136. ;    NOTE THAT THIS PROGRAM DOES NOT CREATE A LOCAL STACK; IT RELIES
  137. ;    ON THE SYSTEM STACK!
  138.  
  139.     call    z3init        ; Initialize the ZCPR3 environment
  140.  
  141. ;  Init Options and Parse and Interpret Command Line
  142.  
  143.     xor    a        ; Preset all flags to zero
  144.     ld    hl,flags
  145.     ld    b,nflags
  146. flaginit:
  147.     ld    (hl),0
  148.     inc    hl
  149.     djnz    flaginit
  150.  
  151.     dec    a        ; Options turned ON
  152.     ld    (abortf),a    ; ..abort
  153.  
  154.     ld    hl,tbuff+1    ; Point to command line tail
  155.     call    sksp        ; Skip over spaces
  156.     ld    a,(hl)        ; Get first character
  157.     cp    '/'        ; Option?
  158.     jp    nz,optdone
  159.     inc    hl        ; Skip option lead-in char
  160. opt:
  161.     ld    a,(hl)        ; Get option letter
  162.     or    a        ; Done?
  163.     jp    z,optdone
  164.     inc    hl        ; Point to next option
  165.     cp    ' '        ; Process text?
  166.     jp    z,optdone
  167.  
  168.     cp    'A'        ; Abort?
  169.     jp    z,optabort
  170.  
  171.     cp    'B'        ; Bell?
  172.     jp    z,optbell
  173.  
  174.     cp    'P'        ; Pause?
  175.     jp    z,optpause
  176.  
  177.     cp    'Z'        ; ZEX abort?
  178.     jp    z,optzex
  179.  
  180.     cp    'F'        ; Error flag?
  181.     jp    z,opteflag
  182.  
  183. ; Unrecognized options produce help screen
  184.  
  185.     call    print
  186.     db    cr,lf,tab,tab
  187.     db    'PAUSE Version ',[vers/10]+'0','.',[vers mod 10]+'0'
  188.     db    '  [(c)1986 ZSIG]'
  189.     db    cr,lf,lf,'SYNTAX: "ASK text"  or  "ASK /o... text"',cr,lf,lf
  190.     db    'Options:'
  191.     db    tab,    'A     -- DO NOT Allow Abort',cr,lf
  192.     db    tab,tab,'B     -- Ring Bell',cr,lf
  193.     db    tab,tab,'F     -- Set/Reset Program Error Flag (no abort)',cr,lf
  194.     db    tab,tab,'Pnnnn -- Pause nnnn secs',cr,lf
  195.     db    tab,tab,'Z     -- Allow to Abort ZEX',cr,lf,lf
  196.     db    'Special text characters:',cr,lf
  197.     db    tab,contch,'x'
  198.     db    tab,'convert character ''x'' to control character',cr,lf
  199.     db    tab,casech,lcase
  200.     db    tab,'begin lowercase output',cr,lf
  201.     db    tab,casech,ucase
  202.     db    tab,'begin uppercase output',cr,lf
  203.     db    tab,casech,'x'
  204.     db    tab,'output ''x'' directly (e.g., ',casech,casech,
  205.     db    ' or ',casech,contch,')',cr,lf
  206.     db    0
  207.     ret
  208.  
  209.  
  210. ;  Process A option (Abort MCL)
  211.  
  212. optabort:
  213.     xor    a        ; Turn off abort
  214.     ld    (abortf),a
  215.     jp    opt
  216.  
  217.  
  218. ;  Process B option (Ring Bell)
  219.  
  220. optbell:
  221.     ld    a,0ffh        ; Turn on bell
  222.     ld    (bell),a
  223.     jp    opt
  224.  
  225.  
  226. ;  Process Pnnnn option (Pause nnnn seconds)
  227.  
  228. optpause:
  229.     call    eval10        ; Convert argument to decimal value in DE
  230.     ex    de,hl        ; Put value into HL
  231.     ld    (delay),hl
  232.     ex    de,hl        ; HL pts to next char
  233.     jp    opt
  234.  
  235.  
  236. ;  Process Z option (Allow ZEX abort)
  237.  
  238. optzex:
  239.     ld    a,0ffh        ; Allow abort
  240.     ld    (stopz),a
  241.     jp    opt
  242.  
  243.  
  244. ;  Process F option (Program Error Flag Set/Reset)
  245.  
  246. opteflag:
  247.     ld    a,0ffh        ; Enable program error flag set/reset option
  248.     ld    (eflag),a
  249.     jp    opt
  250.  
  251.  
  252. ;  Continue Command Processing
  253.  
  254. optdone:
  255.     ld    a,(hl)        ; Any message?
  256.     or    a
  257.     jp    z,optdn1
  258.     ld    (mpflag),a    ; Set message printed flag
  259.     call    prtmsg        ; Display message in command tail
  260.  
  261. optdn1:
  262.     call    stopzex        ; Suspend ZEX processing
  263.     ld    hl,(delay)    ; Get delay count in HL
  264.  
  265.  
  266. ;  Main Delay Loop
  267.  
  268. askloop:
  269.  
  270. ;  Ring Bell if Option Selected
  271.  
  272.     ld    a,(bell)    ; Get flag
  273.     or    a        ; Set zero flag
  274.     call    nz,bout        ; Ring bell and delay
  275.  
  276. ;  Get character if one is available
  277.  
  278. ;    call    condin        ; Optionally get character
  279. ;    jp    nz,gotchar    ; Process character
  280.  
  281. ;  This change in case the BIOS CONIN: returns with zero flag set.
  282.  
  283.     call    cst
  284.     jr    nz,nochar
  285. getchar:
  286.     call    cin
  287.     jp    gotchar
  288. nochar:
  289.  
  290. ;  Loop if No Delay
  291.  
  292.     ld    a,h        ; Check for no delay
  293.     or    l
  294.     jp    z,askloop
  295.  
  296. ;  Delay and test for input
  297.  
  298.     call    wait1s        ; Delay 1 sec
  299.     dec    hl        ; Count down
  300.     ld    a,h        ; Done?
  301.     or    l
  302.     jp    nz,askloop
  303.  
  304. ;  Process Input Character
  305. ;    If no input and timout instead, A=0 for continuation character
  306.  
  307. gotchar:
  308.     cp    ctrlc        ; Abort?
  309.     jp    z,abort
  310. resume:
  311.     ld    a,(mpflag)    ; Message printed?
  312.     or    a        ; 0=no
  313.     call    nz,qcrlf    ; New line if yes
  314.  
  315.     ld    a,(eflag)    ; See if program error flag is to be reset
  316.     or    a
  317.     jr    z,resume1    ; If not, jump past this
  318.  
  319.     xor    a        ; Reset A
  320.     call    puter2        ; Store value in program error flag
  321.     ld    a,(flagmsg)    ; See if message is to be printed
  322.     or    a
  323.     jr    z,resume0
  324.     call    qprint
  325.     db    cr,'Program Error Flag Cleared ...',0
  326. resume0:
  327.     jp    strtzex        ; Resume ZEX processing
  328.  
  329. resume1:
  330.     ld    a,(flagmsg)    ; See if message is to be printed
  331.     or    a
  332.     jr    z,resume0
  333.     call    qprint
  334.     db    cr,'Resuming ...',0
  335.     jr    resume0        ; Resume ZEX processing
  336.  
  337. ;  Abort Multiple Command Line if there is one
  338.  
  339. abort:
  340.     ld    a,(eflag)    ; See if program error flag is to be set
  341.     or    a
  342.     jr    z,abort0    ; If not, skip
  343.     ld    a,0ffh        ; Set the program error flag
  344.     call    puter2
  345.     ld    a,(mpflag)    ; Message printed?
  346.     or    a        ; 0=no
  347.     call    nz,qcrlf    ; New line if yes
  348.     ld    a,(flagmsg)    ; See if message is to be printed
  349.     or    a
  350.     jr    z,resume0
  351.     call    qprint
  352.     db    cr,'Program Error Flag Set ...',0
  353.     jr    resume0        ; Resume with 'start zex' routine
  354.  
  355. abort0:
  356.     ld    a,(abortf)    ; Abort allowed?
  357.     or    a        ; 0=no
  358.     jp    z,resume
  359.     call    getcl1        ; Get address of command line buffer
  360.     ld    a,h        ; Any buffer?
  361.     or    l
  362.     jp    z,abort1
  363.     ld    e,(hl)        ; Get address of next char
  364.     inc    hl
  365.     ld    d,(hl)
  366.     ex    de,hl        ; HL pts to next char
  367.     ld    (hl),0        ; Set no further command
  368. abort1:
  369.     ld    a,(mpflag)    ; Message printed?
  370.     or    a        ; 0=no
  371.     call    nz,qcrlf    ; New line if yes
  372.     call    qprint
  373.     db    cr,lf,'Aborting ...',0
  374.     call    getzrun        ; Is ZEX running?
  375.     ret    z        ; Done if not
  376.     call    strtzex        ; Resume ZEX processing
  377.     ld    a,(stopz)    ; Stop ZEX?
  378.     or    a        ; 0=no
  379.     ret    z        ; Resume processing
  380.     call    getznc        ; Get next ZEX char
  381.     ld    (hl),0ffh    ; Store abort ZEX code
  382.     ret
  383.  
  384.  
  385. ;-----------------------------------------------------------------------------
  386.  
  387. ;  Ring Bell and Delay Briefly
  388.  
  389. bout:
  390.     ld    a,bel        ; Ring bell
  391.     call    cout
  392.     push    hl        ; Save HL
  393.     ld    hl,(delay)    ; Do not delay if pause already invoked
  394.     ld    a,h        ; Zero delay?
  395.     or    l
  396.     jp    nz,bout1    ; Skip delay
  397.     call    wait1s        ; Delay
  398. bout1:
  399.     pop    hl
  400.     ret
  401.  
  402.  
  403. ;-----------------------------------------------------------------------------
  404.  
  405. ; Output string with lowercase and control-character conversion
  406.  
  407. prtmsg:                ; Set up default output case
  408.  
  409.     xor    a        ; Lower case flag setting
  410.  
  411.      if    upcase        ; If upper case default
  412.     dec    a        ; ..change to nonzero
  413.      endif
  414.  
  415.     ld    (casefl),a    ; Store flag value
  416.  
  417. ; Loop to echo chars
  418.  
  419. prtmsg1:
  420.     call    getnext        ; Get next character (aborts if none)
  421.     cp    contch        ; Control-character lead-in?
  422.     jr    nz,prtmsg2    ; If not, jump
  423.     call    getnext        ; If so, get next character
  424.     and    1fh        ; Convert to control character
  425.     jr    z,prtmsg1    ; If null, skip it
  426.     jr    prtmsg4        ; Else echo it
  427.  
  428. prtmsg2:
  429.     cp    casech        ; Case shift prefix?
  430.     jr    nz,prtmsg4    ; No, normal echo
  431.     call    getnext        ; Get next character
  432.     cp    ucase        ; Up-shift character?
  433.     jr    z,prtmsg3    ; Store non-zero value in case flag
  434.     cp    lcase        ; Lower-case character?
  435.     jr    nz,prtmsg4    ; No, echo the character as is
  436.     xor    a        ; Else, clear case flag
  437.  
  438. prtmsg3:
  439.     ld    (casefl),a
  440.     jr    prtmsg1        ; On to next character
  441.  
  442. prtmsg4:
  443.     call    charout        ; Send char in correct case
  444.     jr    prtmsg1
  445.  
  446.  
  447. ; Output char to printer or console
  448.  
  449. charout:
  450.     ld    c,a        ; Save character in C
  451.     cp    'A'        ; If less than 'a'
  452.     jr    c,charout1    ; ..leave as is
  453.     cp    'Z'+1        ; If greater than 'z'
  454.     jr    nc,charout1    ; ..leave as is
  455.     add    a,20h        ; Else convert to lower case
  456. charout1:
  457.     ld    d,a        ; Save lower case version in d
  458.     ld    a,(casefl)    ; Test case flag
  459.     or    a
  460.     ld    a,c        ; Get ready to display upper case character
  461.     jr    nz,charout2    ; If upper case selected, go on as is
  462.     ld    a,d        ; Else substitute lower case version
  463. charout2:
  464.     jp    cout        ; Display the character
  465.  
  466.  
  467. ; Read a character from the command line; terminate routine if end of
  468. ; line reached.
  469.  
  470. getnext:
  471.     ld    a,(hl)        ; Get character
  472.     inc    hl        ; Point to next one
  473.     or    a        ; Check for end of string
  474.     ret    nz        ; If not end, return
  475.     pop    hl        ; Else, clean up stack
  476.     ret            ; And exit from routine
  477.  
  478.  
  479. ;  Data Buffers
  480.  
  481.     dseg
  482.  
  483. flags:
  484.  
  485. casefl:
  486.     ds    1        ; Upper/lower case output flag
  487. abortf:
  488.     ds    1        ; Abort flag
  489. bell:
  490.     ds    1        ; Bell flag
  491. delay:
  492.     ds    2        ; Delay constant
  493. mpflag:
  494.     ds    1        ; Message printed flag
  495. stopz:
  496.     ds    1        ; Stop ZEX flag
  497. eflag:
  498.     ds    1        ; Error flag set/reset flag
  499.  
  500. nflags    equ    $ - flags
  501.  
  502.     end
  503.