Annotation of 43BSDTahoe/ucb/tn3270/sys_dos/spintasm.asm, revision 1.1.1.1

1.1       root        1: ;
                      2: ; Copyright (c) 1988 Regents of the University of California.
                      3: ; All rights reserved.
                      4: ;
                      5: ; Redistribution and use in source and binary forms are permitted
                      6: ; provided that this notice is preserved and that due credit is given
                      7: ; to the University of California at Berkeley. The name of the University
                      8: ; may not be used to endorse or promote products derived from this
                      9: ; software without specific prior written permission. This software
                     10: ; is provided ``as is'' without express or implied warranty.
                     11: ;
                     12: ;      @(#)spintasm.asm        3.2 (Berkeley) 3/28/88
                     13: ;
                     14: ; The code in this file complete the spint calls
                     15: ;
                     16: 
                     17: spint  struc
                     18: ; union REGS
                     19: spint_ax       dw      1
                     20: spint_bx       dw      1
                     21: spint_cx       dw      1
                     22: spint_dx       dw      1
                     23: spint_si       dw      1
                     24: spint_di       dw      1
                     25: spint_cflag    dw      1
                     26: ; struct SREGS
                     27: spint_es       dw      1
                     28: spint_cs       dw      1
                     29: spint_ss       dw      1
                     30: spint_ds       dw      1
                     31: ; int intno
                     32: spint_intno    dw      1
                     33: ; int done
                     34: spint_done     dw      1
                     35: ; int rc
                     36: spint_rc       dw      1
                     37: ;
                     38: spint  ends
                     39: 
                     40: 
                     41: ENTER  MACRO
                     42:        ; Begin enter
                     43:        push    bp
                     44:        mov     bp,sp
                     45: 
                     46:        push    ax
                     47:        push    bx
                     48:        push    cx
                     49:        push    dx
                     50:        push    bp
                     51:        push    di
                     52:        push    si
                     53:        push    ds
                     54:        push    es
                     55:        pushf
                     56: 
                     57:        mov     cs:start_sp, sp
                     58:        mov     cs:start_ss, ss
                     59:        ; End enter
                     60:        ENDM
                     61: 
                     62: LEAVE  MACRO
                     63:        ; Begin leave
                     64:        cli
                     65:        mov     sp, cs:start_sp
                     66:        mov     ss, cs:start_ss
                     67:        sti
                     68: 
                     69:        popf
                     70:        pop     es
                     71:        pop     ds
                     72:        pop     si
                     73:        pop     di
                     74:        pop     bp
                     75:        pop     dx
                     76:        pop     cx
                     77:        pop     bx
                     78:        pop     ax
                     79: 
                     80:        mov     sp,bp
                     81:        pop     bp
                     82:        ret
                     83:        ; End leave
                     84:        ENDM
                     85: 
                     86: GETREGS        MACRO   wherefrom
                     87:        mov     si, wherefrom
                     88:        mov     spint_segment, ds
                     89:        mov     spint_offset, si
                     90: 
                     91:        mov     ax, spint_ax[si]
                     92:        mov     bx, spint_bx[si]
                     93:        mov     cx, spint_cx[si]
                     94:        mov     dx, spint_dx[si]
                     95:        ; XXX mov       si, spint_si[si]
                     96:        mov     di, spint_di[si]
                     97:        mov     es, spint_es[si]
                     98:        ; Now, need to do DS, SI
                     99:        push    spint_ds[si]
                    100:        mov     si, spint_si[si]
                    101:        pop     ds
                    102:        ENDM
                    103: 
                    104: 
                    105: SETREGS        MACRO
                    106:        mov     cs:old_si, si
                    107:        mov     cs:old_ds, ds
                    108: 
                    109:        mov     ds, cs:spint_segment
                    110:        mov     si, cs:spint_offset
                    111: 
                    112:        mov     spint_ax[si], ax
                    113:        mov     spint_bx[si], bx
                    114:        mov     spint_cx[si], cx
                    115:        mov     spint_dx[si], dx
                    116: 
                    117:        mov     spint_si[si], si
                    118:        mov     spint_di[si], di
                    119: 
                    120:        mov     spint_cs[si], cs
                    121:        mov     spint_ds[si], ds
                    122:        mov     spint_es[si], es
                    123:        mov     spint_ss[si], ss
                    124:        ; now, need to do SI, DS
                    125:        mov     ax, old_si
                    126:        mov     spint_si[si], ax
                    127:        mov     ax, old_ds
                    128:        mov     spint_ds[si], ax
                    129:        ENDM
                    130: 
                    131: 
                    132: _TEXT  segment byte public 'CODE'
                    133: _TEXT  ends
                    134: 
                    135: _DATA  segment word public 'DATA'
                    136: _DATA  ends
                    137: 
                    138: CONST  segment word public 'CONST'
                    139: CONST  ends
                    140: 
                    141: _BSS   segment word public 'BSS'
                    142: _BSS   ends
                    143: 
                    144: DGROUP group   CONST, _BSS, _DATA
                    145: 
                    146:        assume  cs:_TEXT, ds:DGROUP, ss:DGROUP, es:DGROUP
                    147: 
                    148: _TEXT  segment
                    149: 
                    150: start_sp       dw      1 dup (?)       ; For use in our 'longjmp'
                    151: start_ss       dw      1 dup (?)       ; For use in our 'longjmp'
                    152: 
                    153: spint_segment  dw      1 dup (?)       ; Segment of spawn control block
                    154: spint_offset   dw      1 dup (?)       ; Offset of spawn control block
                    155: 
                    156: old_si         dw      1 dup (?)       ; SI of interrupt issuer (temporary)
                    157: old_ds         dw      1 dup (?)       ; DS of interrupt issuer (temporary)
                    158: 
                    159: issuer_ss      dw      1 dup (?)       ; ss of person who called us (permanent)
                    160: issuer_sp      dw      1 dup (?)       ; sp of person who called us (permanent)
                    161: 
                    162: int21_stack    db      100 dup (?)     ; Stack for int21.
                    163: 
                    164: ;
                    165: ; _spint_int gets control on an interrupt.  It switches the stack
                    166: ; and does a 'return' from _spint_start.
                    167: ;
                    168:        public  __spint_int
                    169: 
                    170: __spint_int    proc    near
                    171:        mov     cs:issuer_sp, sp
                    172:        mov     cs:issuer_ss, ss
                    173:        sti
                    174: 
                    175:        SETREGS
                    176: 
                    177:        LEAVE
                    178: __spint_int    endp
                    179: 
                    180: ;
                    181: ; _spint_start issues the dos interrupt after setting up the passed
                    182: ; registers.  When control returns to it, it sets spint->done to non-zero.
                    183: ;
                    184:        public  __spint_start
                    185: 
                    186: __spint_start  proc    near
                    187:        ENTER
                    188: 
                    189:        GETREGS 4[bp]
                    190: 
                    191:        ; Now, switch to a different (short) stack.  This is so
                    192:        ; that our games won't mess up the stack int 21 (hardware and,
                    193:        ; possibly, software) stores things on.
                    194: 
                    195:        cli
                    196:        mov     cs:int21_stack, cs
                    197:        mov     ss, cs:int21_stack
                    198:        mov     sp, offset int21_stack
                    199:        add     sp, (length int21_stack) - 4
                    200:        sti
                    201: 
                    202:        int     21H             ; Issue DOS interrupt
                    203: 
                    204:        SETREGS
                    205: 
                    206:        mov     ds, cs:spint_segment
                    207:        mov     si, cs:spint_offset
                    208:        mov     spint_done[si], 1       ; We are done
                    209: 
                    210:        LEAVE
                    211: __spint_start  endp
                    212: 
                    213: ;
                    214: ; After _spint_int has faked a return from start_spawn, we come here to
                    215: ; return to the interrupt issuer.
                    216: ;
                    217:        public  __spint_continue
                    218: 
                    219: __spint_continue       proc    near
                    220:        ENTER
                    221: 
                    222:        GETREGS 4[bp]
                    223: 
                    224:        mov     sp, cs:issuer_sp                ; Restore SP
                    225:        mov     ss, cs:issuer_ss                ; Restore SS
                    226: 
                    227:        iret
                    228: __spint_continue       endp
                    229: 
                    230: _TEXT  ends
                    231: 
                    232:        end

unix.superglobalmegacorp.com

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