home *** CD-ROM | disk | FTP | other *** search
/ PC Online 1998 September / PCO_0998.ISO / filesbbs / dos / sbbs_src.exe / MSWAIT / MSWAIT.ASM next >
Encoding:
Assembly Source File  |  1993-07-22  |  3.5 KB  |  161 lines

  1.     .xlist
  2.     include mdef
  3.     page    63,132
  4.     .ilist
  5. ; MSWAIT: Wait up to 30000 milliseconds
  6. ; July 1992, Steve D. @ Vertrauen 714 529-9547
  7.  
  8.     setmod    %mm            ;set memory model
  9.     public    _mswait,_mswtyp
  10.  
  11.     .data
  12. _mswtyp    db    0            ;system type for idle loop
  13. dosidl    equ    1            ;use int 28h
  14. os2idl    equ    2            ;use int 2fh function 1680h
  15.     .code
  16. clkvct    dd    0            ;saved int 1ch vector
  17. brkvct    dd    0            ;saved int 1bh vector
  18. waitct    dw    0            ;local 8254 tick count
  19. cbrk    db    0            ;ctrl-break key pressed
  20.  
  21. clkisr    proc                ;interrupt 1ch (55ms tick) service routine
  22.     dec    mw cs:waitct
  23.     jmp    ml cs:clkvct        ;exec prior service routine
  24. clkisr    endp
  25.  
  26. brkisr    proc                ;interrupt 1bh (ctrl-break) service routine
  27.     mov    mb cs:cbrk,-1        ;ctrl-break depressed, set abort flag
  28.     jmp    ml cs:brkvct        ;exec prior service routine
  29. brkisr    endp
  30.  
  31. _mswait    proc
  32.     push    bp
  33.     mov    bp,sp
  34.  
  35.     mov    al,mb _mswtyp
  36.     push    ax            ;wait type flag at [bp-2]
  37.  
  38.     push    es
  39.     push    ds
  40.  
  41.     mov    ax,351bh
  42.     int    21h            ;get ctrl-break vector
  43.     mov    mw cs:brkvct,bx
  44.     mov    mw cs:brkvct+2,es    ;save old service routine address
  45.  
  46.     mov    mb cs:cbrk,0        ;clear abort flag
  47.     mov    ah,25h
  48.     push    cs
  49.     pop    ds            ;data segment is now inaccessible
  50.     mov    dx,os brkisr
  51.     int    21h            ;set new interrupt service routine
  52.  
  53.     mov    ax,30000        ;maximal wait
  54.     mov    dx,pb[bp]        ;wait time in milliseconds
  55.     cmp    ax,dx
  56.     jc    @f
  57.     xchg    ax,dx            ;within range, use specification
  58. @@:    xor    dx,dx            ;milliseconds in dx:ax
  59.     sub    ax,10            ;0-64 yields 55
  60.     ja    @f
  61.     mov    ax,dx            ;must be at least 0
  62. @@:    mov    cx,55            ;milliseconds per ctc interrupt
  63.     div    cx
  64.     mov    mw cs:waitct,ax        ;number of ctc interrupts to wait
  65.  
  66.     pushf                ;detect cpu type
  67.     mov    ax,4000h
  68.     push    ax
  69.     popf
  70.     pushf
  71.     pop    ax
  72.     popf
  73.     and    ah,0c0h
  74.     js    msxt            ;80186 or earlier
  75.     jz    msxt            ;80286
  76.  
  77.     .386                ;80386
  78.     pushad
  79.     mov    ax,2b01h        ;set date (get desqview version)
  80.     mov    cx,4445h        ;DE
  81.     mov    dx,5351h        ;SQ
  82.     int    21h
  83.     not    al            ;zero if desqview not running
  84.     mov    mb -1[bp],al
  85.  
  86.     xor    cx,cx            ;running count in cx
  87.     mov    ax,40h
  88.     mov    es,ax
  89.     mov    bx,6ch            ;address bios clock
  90.  
  91. stwt:    mov    edx,ml es:[bx]
  92. lpwt:    test    cs:cbrk,-1
  93.     jnz    s mabt            ;exit on ctrl-break
  94.     push    edx
  95.     test    mb -1[bp],-1
  96.     jz    s @f            ;not under desqview
  97.     mov    ax,1000h
  98.     int    15h            ;surrender time slice, desqview
  99.     jmp    s ckwt            ;continue
  100. @@:    test    mb -2[bp],os2idl
  101.     jz    s ckwt            ;no int 2fh call
  102.     mov    ax,1680h
  103.     int    2fh            ;surrender time slice, os/2
  104. ckwt:    test    mb -2[bp],dosidl
  105.     jz    s @f            ;no int 28h call
  106.     int    28h            ;idle
  107. @@:    pop    edx
  108.     mov    eax,ml es:[bx]
  109.     mov    esi,eax            ;save latest clock value
  110.     sub    eax,edx
  111.     jz    lpwt            ;wait for clock change
  112.     jc    stwt            ;crossed midnight, reset
  113.     mov    edx,esi            ;set most current value
  114.     cmp    eax,7fh
  115.     jnc    s mabt            ;swapped out more than 7 seconds
  116.     add    cx,ax            ;add to running total
  117.     cmp    cx,cs:waitct        ;static maximal value
  118.     jna    lpwt            ;not expired, continue
  119.  
  120. mabt:    popad
  121.     mov    ax,386            ;for test purposes
  122.     test    mb -1[bp],-1
  123.     jz    s msex
  124.     mov    ax,10386
  125.     jmp    s msex
  126.  
  127. msxt:    .8086
  128.     mov    ax,351ch
  129.     int    21h            ;get int 1ch vector
  130.     mov    mw cs:clkvct,bx
  131.     mov    mw cs:clkvct+2,es    ;save old service routine address
  132.  
  133.     mov    ah,25h
  134.     push    cs
  135.     pop    ds
  136.     mov    dx,os clkisr
  137.     int    21h            ;set new interrupt service routine
  138.  
  139. mswl:    test    cs:cbrk,-1
  140.     jnz    @f            ;exit on ctrl-break
  141.     mov    ax,cs:waitct
  142.     or    ax,ax
  143.     jns    mswl            ;wait for negative count
  144.  
  145. @@:    mov    ax,251ch
  146.     lds    dx,cs:clkvct
  147.     int    21h            ;restore old clock sr vector
  148.     xor    ax,ax            ;return zero
  149. msex:    push    ax
  150.     mov    ax,251bh
  151.     lds    dx,cs:brkvct
  152.     int    21h            ;restore old ctrl-break sr vector
  153.     pop    ax
  154.     pop    ds
  155.     pop    es
  156.     pop    bx            ;wait type flag
  157.     pop    bp
  158.     ret
  159. _mswait    endp
  160.     end
  161.