home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / icon / dos / src / config / msdos / microsft / rswitch.asm < prev    next >
Encoding:
Assembly Source File  |  1992-02-09  |  2.8 KB  |  176 lines

  1. .286c
  2. mem_l=1
  3. include version.inc
  4. .xlist
  5. include cmacros.inc
  6. include msdos.inc
  7. .list
  8. externP syserr
  9. externP new_context
  10.  
  11.  
  12. STACK segment para stack 'STACK'
  13. STACK ends
  14.  
  15.  
  16. sBegin    data
  17. errmsg    db    'INTERP() RETURNED IN COSWITCH',0
  18.  
  19. extrn    _end:word        ; stack bottom
  20. extrn    _sp:word        ; ICON Stack pointer
  21.     public    STKHQQ        ; used by parasitic heap
  22. STKHQQ    dw    dataoffset _end+STACKSLOP ; initial value
  23.  
  24. sEnd
  25. sBegin    code
  26.  
  27.     assumes cs,code
  28.     assumes ds,data
  29. ; void coswitch(oldstate,newstate,first)
  30. ; int *oldstate, *newstate;
  31. ; int first;
  32. cProc    coswitch,<PUBLIC>
  33.     parmD oldstate
  34.     parmD newstate
  35.     parmW first
  36. cBegin
  37. ;
  38. ;  oldstate[0] = stack pointer;
  39. ;
  40.     Les    Bx,oldstate
  41.     Mov    Ax,Ss        ; get current stack address
  42.     Mov    Cx,Sp
  43.     Mov    Es:[Bx+2],Ax    ; stash away..
  44.     Mov    Es:[Bx+0],Cx
  45.     Mov    Es:[Bx+4],Si
  46.     Mov    Es:[Bx+6],Di
  47. ;  if (first) {
  48.     Cmp    first,0
  49.     Jnz    notfirst
  50. ;      stackp = newstate[0];
  51. ;-----
  52. ; We have to do some special processing here..
  53. ; Since this is the first time through, we have to
  54. ; set sp equal to stksize.
  55. ;
  56.     Les    Bx,newstate
  57.     Mov    Ax,Es:[Bx+2]
  58.     Mov    Cx,Es:[Bx+0]
  59.     Mov    Si,Es:[Bx+4]
  60.     Mov    Di,Es:[Bx+6]
  61.     Cli
  62.     Mov    Ss,Ax
  63.     Mov    Sp,Cx
  64.     Sti
  65.     Push    Bp
  66.     Mov    Bp,Sp
  67. ;      new_context(0,NULL);
  68.  
  69.     XOR    ax,ax
  70.     push    ax
  71.     push    ax
  72.     push    ax
  73.     call    new_context
  74.     Add    sp,4
  75. ;    syserr("new_context() returned in coswitch");
  76.     push    ds
  77.     mov    ax,offset errmsg
  78.     push    ax
  79.     call    syserr
  80. ;  }
  81. ;  else {
  82. notfirst:
  83. ;      stackp = newstate[0];
  84.     Les    Bx,newstate
  85.     Mov    Ax,Es:[Bx+2]
  86.     Mov    Cx,Es:[Bx+0]
  87.     Mov    Si,Es:[Bx+4]
  88.     Mov    Di,Es:[Bx+6]
  89.     Cli
  90.     Mov    Ss,Ax
  91.     Mov    Sp,Cx
  92.     Sti
  93.     Mov    Bp,Sp
  94. ;
  95. cEnd
  96.  
  97. externNP _amsg_exit        ; write error and die
  98.     Public __aFchkstk
  99.     Public __chkstk
  100. __aFchkstk Proc Far
  101. __chkstk Label Far
  102.  
  103.     pop    cx        ; get return offset
  104.     pop    dx        ; get return segment
  105.  
  106.     Mov    Bx,Ss
  107.     Cmp    Bx,DGROUP    ; Running with current system stack?
  108.     Jne    COEXSTKCHK
  109.  
  110.     mov    bx,sp
  111.     sub    bx,ax        ; new position
  112.     jc    OMerr        ; error - out of memory
  113.     cmp    bx,[STKHQQ]    ; SP - AX : STKHQQ (for heap/stack)
  114.     jb    OMerr        ;   error - out of memory
  115.  
  116.     mov    sp,bx        ; set new stack pointer
  117.  
  118.     push    dx        ; push segment
  119.     push    cx        ; push offset
  120.     ret            ; far return to dx:cx
  121.  
  122. COEXSTKCHK:
  123.  
  124.     mov    bx,sp
  125.     sub    bx,ax        ; new position
  126.     jc    OMerr        ; error - out of memory
  127.     Mov    ax,_sp
  128.     Add    ax,STACKSLOP
  129.     cmp    bx,ax
  130.     jb    OMerr        ;   error - out of memory
  131.  
  132.     mov    sp,bx
  133.     push    dx
  134.     push    cx
  135.     ret
  136. OMerr:
  137.     xor    ax,ax
  138.     jmp    _amsg_exit    ; give stack overflow and die
  139. __aFchkstk Endp
  140.  
  141.     Public _stackavail
  142. _stackavail Proc Far
  143.  
  144.     Mov    Cx,Ss
  145.     Cmp    Cx,DGROUP
  146.     Jne    Costkavail
  147.  
  148.     Pop    Cx
  149.     Pop    Dx
  150.     Mov    Ax,[STKHQQ]
  151.     Cmp    Ax,Sp
  152.     Jae    L10
  153.     Sub    Ax,Sp
  154.     Neg    Ax
  155. L0D:    Push    Dx
  156.     Push    Cx
  157.     Ret
  158. L10:    Xor    Ax,Ax
  159.     Jmp    L0D
  160.  
  161. Costkavail:
  162.     Pop    Cx
  163.     Pop    Dx
  164.     Mov    Ax,_sp
  165.     Add    Ax,STACKSLOP
  166.     Cmp    Ax,Sp
  167.     Jae    L10
  168.     Sub    Ax,Sp
  169.     Neg    Ax
  170.     Jmp    L0D
  171.  
  172. _stackavail Endp
  173.  
  174. sEnd
  175.     end
  176.