home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol040 / pauswait.asm < prev    next >
Assembly Source File  |  1984-04-29  |  8KB  |  211 lines

  1. ;
  2. ;      PAUSE/WAIT.ASM Version 1.0 as of April 19, 1981
  3. ;             by: Kelly Smith, CP/M-Net "SYSOP"
  4. ;  This  program  is intended for usage with  SUBMIT.COM  as 
  5. ; either a 'PAUSE' (contine SUBMIT file when any key  struck 
  6. ; on  your  keyboard)  function,  or as a  'WAIT'  (continue 
  7. ; SUBMIT  file when any key struck on your keyboard  OR  the 
  8. ; programmable delay (up to 90 seconds) times out) function.
  9. ;  PAUSEWAIT.ASM is handy,  if you need time to do something 
  10. ; between  functions in your SUBMIT file (i.e,  run  to  the 
  11. ; 'frig'  for another beer and don't want to miss  anything, 
  12. ; etc.).  This  program was NOT inspired by any direct  need
  13. ; for  it,  as much as in RETALIATION to SuperSoft selling a 
  14. ; CP/M  utilities  diskette ("...that no programmer  can  be 
  15. ; without")  that  includes PUBLIC DOMAIN software  programs 
  16. ; like XDIR, SORT, (looks like Ward's SORT-V12 to me), PRINT 
  17. ; (probably   from  CPMUG  by  Tony  Gold),   PG   (MLIST42) 
  18. ; etc.,etc...really  'ticks-me-off' when I see  stuff  being 
  19. ; sold to the people thats FREE...so much for my ranting and 
  20. ; raving.  PAUSWAIT.ASM  is intended to go one step  further 
  21. ; with SuperSoft's PAUSE utility.  Not to hack SuperSoft too 
  22. ; much,  the  DIAGNOSTICS  II software package is  excellent 
  23. ; (although  they still don't understand how the  PSW  works 
  24. ; for  various 'flavors' of 8080/8085/Z80 CPU's in their CPU 
  25. ; test)...Gee, and I said I wasn't going to hack them...
  26. ;  PAUSWAIT.ASM  may be assembled for 'PAUSE' by setting the 
  27. ; equate 'pause' to TRUE (as supplied here) or assembled  as 
  28. ; 'WAIT', by setting the equate 'pause' to FALSE.
  29. ;  Additional  conditional  assemblies  may  be  set-up,  by 
  30. ; various  TRUE/FALSE configurations for 'upper'  (uppercase 
  31. ; only  terminals),   'stdcpm'  (standard  CP/M),   'altcpm' 
  32. ; (alternate CP/M),  'mpmprl' (MP/M program relocatable), or 
  33. ; 'fastclk' (4 Mhz CPU system clock).
  34. ;  When  assembled  as  'PAUSE',  just enter PAUSE  in  your 
  35. ; SUBMIT  file...then when it's running,  strike any key  on 
  36. ; your keyboard to continue.  When assembled as 'WAIT', just 
  37. ; enter  WAIT  1 (for 10 seconds delay) up to  WAIT  9  (you 
  38. ; guessed  it,  90 seconds delay) in your SUBMIT file,  then 
  39. ; wait  out the programmed delay or strike any key  on  your 
  40. ; keyboard  to  continue.  If 'WAIT' does not have  a  value 
  41. ; specified  (or you followed it with something  weird),  it 
  42. ; defaults to a 90 second delay time...
  43. ;
  44. ;
  45. ;
  46. true    equ    -1    ; define true
  47. false    equ    not true; define false
  48. ;
  49. pause    equ    true    ; true, if "pause" assembly
  50.             ; false, if "wait" assembly
  51. upper    equ    false    ; true if uppercase only terminal
  52. stdcpm    equ    true    ; true if regular CP/M (base address 0000h)
  53. altcpm    equ    false    ; true if alternate CP/M (base address 4200h)
  54. mpmprl    equ    false    ; true if MP/M program relocatable format
  55. fastclk    equ    false    ; true if 4 mhz system clock
  56. ;
  57.     if    stdcpm    ; if standard CP/M...
  58. base    equ    0000h    ; bsae for standard CP/M system
  59.     endif        ; end if...
  60. ;
  61.     if    altcpm    ; if alternate CP/M...
  62. base    equ    4200h    ; base for H8 or TRS-80 CP/M system
  63.     endif        ; end if...
  64. ;
  65. bdos    equ    base+5    ; CP/M BDOS entry address for function call
  66. tfcb    equ    base+5ch; transient file control block base address
  67. ;
  68. rdcon    equ    1    ; read console character
  69. wrcbuf    equ    9    ; write buffer contents to console
  70. const    equ    11    ; console (data available) status
  71. ;
  72. lf    equ    00ah    ; (^j) line feed
  73. cr    equ    00dh    ; (^m) carriage return
  74. bel    equ    007h    ; (^g) bell - human attention required
  75.  
  76.     if    mpmprl    ; if MP/M program relocatable...
  77.     org    base
  78.     endif        ; end if...
  79. ;
  80.     if    not mpmprl    ; if not MP/M program relocatable...
  81.     org    base+100h
  82.     endif        ; end if...
  83.  
  84.     if    pause    ; if "pause"
  85. start:    lxi    h,0    ; save "old" CP/M stack pointer
  86.     dad    sp
  87.     shld    oldstk
  88.     lxi    sp,stack; make "new" stack pointer
  89.     lxi    d,msg1    ; display "Pausing, for any keyboard entry to continue"
  90.     mvi    c,wrcbuf; write console buffer function
  91.     call    bdos    ; let CP/M do the work...
  92. pausek:    mvi    c,const    ; get console status function
  93.     call    bdos    ; let CP/M do the work...
  94.     rrc        ; any key struck?
  95.     jnc    pausek    ; pause until any key struck, to exit
  96.     mvi    c,rdcon    ; read console character function
  97.     call    bdos
  98.     lhld    oldstk    ; get "old" CP/M stack pointer
  99.     sphl        ; and restore for...
  100.     ret        ; return to CP/M
  101.     endif        ; end if "pause"
  102. ;
  103.     if    pause and upper    ; if uppercase only terminal...
  104. MSG1:    DB    BEL,'PAUSING, FOR ANY KEYBOARD ENTRY TO CONTINUE: $'
  105.     endif        ; end if...
  106. ;
  107.     if    pause and not upper    ; if not uppercase only terminal...
  108. msg1:    db    bel,'Pausing, for any keyboard entry to continue: $'
  109.     endif        ; end if...
  110.  
  111.     if    not pause    ; if not "pause" assembly
  112. start:    lxi    h,0    ; save "old" CP/M stack pointer
  113.     dad    sp
  114.     shld    oldstk
  115.     lxi    sp,stack; make "new" stack pointer
  116.     lxi    d,msg1    ; display "Waiting for any keyboard entry, or timeout"
  117.     mvi    c,wrcbuf; write console buffer function
  118.     call    bdos    ; let CP/M do the work...
  119.     lda    tfcb+1    ; get number of ten second delays required
  120.     sui    '0'    ; make hex value from ASCII value
  121.     cpi    1    ; < 10 seconds requested?
  122.     jc    timebad    ; if so, bad time requested
  123.     cpi    9    ; > 90 seconds requested?
  124.     jz    timeok    ; if = 90 seconds, that's o.k.
  125.     jc    timeok    ; if not, time is o.k.
  126. timebad:lxi    d,msg2    ; display "Bad entry equals 90 seconds "
  127.     mvi    c,wrcbuf; write console buffer function
  128.     call    bdos    ; let CP/M do the work...
  129.     mvi    a,9    ; force 90 second delay on this dummy...
  130. timeok:    sta    cnt    ; save number of ten second delays
  131. next:    call    delay    ; do ten second delay
  132.     lda    cnt    ; de-bump number of 10 second delays to left to do
  133.     dcr    a
  134.     sta    cnt    ; and save for next time...
  135.     push    psw    ; save temporarily...
  136.     lxi    d,msg3    ; display "bel" and ". "
  137.     mvi    c,wrcbuf; write console buffer function
  138.     call    bdos    ; let CP/M do the work...
  139.     pop    psw    ; get flags, check for all timed out
  140.     jnz    next    ; if not timed out, do next 10 second delay
  141.     jmp    exitold    ; exit, on CP/M's "old" stack pointer
  142.     endif        ; end if...
  143. ;
  144.     if    not pause and fastclk    ; 4 mhz system clock
  145. delay:    mvi    a,44    ; 10 seconds, with 4 Mhz system clock
  146.     endif        ; end if...
  147.     if    not pause and not fastclk
  148. delay:    mvi    a,22    ; 10 seconds, with 2 Mhz system clock
  149.     endif        ; end if...
  150.     if    not pause    ; if not "pause" assembly...
  151. delay1:    lxi    h,0
  152.     lxi    d,33    ; loop delay value (fine tuned)...
  153. waitcnt:dad    d    ; wait between bell rings
  154.     push    psw    ; exile all registers
  155.     push    b
  156.     push    d
  157.     push    h
  158.     mvi    c,const    ; get console status function
  159.     call    bdos    ; let CP/M do the work...
  160.     rrc        ; any key struck?
  161.     jc    exit    ; exit via CP/M "old" stack pointer, if any key entry
  162.     pop    h    ; get all registers back from exile
  163.     pop    d
  164.     pop    b
  165.     pop    psw
  166.     jnc    waitcnt    ; minor delay loop done?
  167.     dcr    a    ; major delay loop done?
  168.     jnz    delay1    ; no, loop
  169.     ret        ; return from "delay", no keyboard entry yet
  170. exit:    mvi    c,rdcon    ; read console character function
  171.     call    bdos
  172. exitold:lhld    oldstk    ; get "old" CP/M stack pointer
  173.     sphl        ; and restore for...
  174.     ret        ; return to CP/M
  175.     endif        ; end if "not pause"
  176.     if    not pause and upper    ; if uppercase only terminal...
  177. MSG1:    DB    'WAITING FOR ANY KEYBOARD ENTRY, OR TIMEOUT: $'
  178. ;
  179. MSG2:    DB    CR,LF,'BAD ENTRY (MUST BE 1 TO 9) EQUALS 90 SECONDS! $'
  180.     endif        ; end if...
  181. ;
  182.     if    not pause and not upper    ; if not uppercase only terminal...
  183. msg1:    db    'Waiting for any keyboard entry, or timeout: $'
  184. msg2:    db    cr,lf,'Bad entry (must be 1 to 9) equals 90 seconds! $'
  185.     endif        ; end if...
  186. ;
  187.     if    not pause    ; if not "pause" assembly...
  188. msg3:    db    bel,'. $'
  189. ;
  190. cnt:    ds    1    ; 10 second increments storage counter
  191.     endif        ; end if "not pause"
  192.  
  193. oldstk:    ds    2    ; storage for "old" CP/M stack pointer
  194.     ds    32    ; storage for 16 level stack
  195. stack    equ    $    ; storage for "new" stack pointer
  196. ;
  197.     if    mpmprl
  198.     db    0    ; force allocation of storage space
  199.     endif
  200.     end    start
  201.