Annotation of sbbs/mswait/mswait.asm, revision 1.1

1.1     ! root        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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.