home *** CD-ROM | disk | FTP | other *** search
- .286c
- mem_l=1
- include version.inc
- .xlist
- include cmacros.inc
- include msdos.inc
- .list
- externP syserr
- externP new_context
-
-
- STACK segment para stack 'STACK'
- STACK ends
-
-
- sBegin data
- errmsg db 'INTERP() RETURNED IN COSWITCH',0
-
- extrn _end:word ; stack bottom
- extrn _sp:word ; ICON Stack pointer
- public STKHQQ ; used by parasitic heap
- STKHQQ dw dataoffset _end+STACKSLOP ; initial value
-
- sEnd
- sBegin code
-
- assumes cs,code
- assumes ds,data
- ; void coswitch(oldstate,newstate,first)
- ; int *oldstate, *newstate;
- ; int first;
- cProc coswitch,<PUBLIC>
- parmD oldstate
- parmD newstate
- parmW first
- cBegin
- ;
- ; oldstate[0] = stack pointer;
- ;
- Les Bx,oldstate
- Mov Ax,Ss ; get current stack address
- Mov Cx,Sp
- Mov Es:[Bx+2],Ax ; stash away..
- Mov Es:[Bx+0],Cx
- Mov Es:[Bx+4],Si
- Mov Es:[Bx+6],Di
- ; if (first) {
- Cmp first,0
- Jnz notfirst
- ; stackp = newstate[0];
- ;-----
- ; We have to do some special processing here..
- ; Since this is the first time through, we have to
- ; set sp equal to stksize.
- ;
- Les Bx,newstate
- Mov Ax,Es:[Bx+2]
- Mov Cx,Es:[Bx+0]
- Mov Si,Es:[Bx+4]
- Mov Di,Es:[Bx+6]
- Cli
- Mov Ss,Ax
- Mov Sp,Cx
- Sti
- Push Bp
- Mov Bp,Sp
- ; new_context(0,NULL);
-
- XOR ax,ax
- push ax
- push ax
- push ax
- call new_context
- Add sp,4
- ; syserr("new_context() returned in coswitch");
- push ds
- mov ax,offset errmsg
- push ax
- call syserr
- ; }
- ; else {
- notfirst:
- ; stackp = newstate[0];
- Les Bx,newstate
- Mov Ax,Es:[Bx+2]
- Mov Cx,Es:[Bx+0]
- Mov Si,Es:[Bx+4]
- Mov Di,Es:[Bx+6]
- Cli
- Mov Ss,Ax
- Mov Sp,Cx
- Sti
- Mov Bp,Sp
- ;
- cEnd
-
- externNP _amsg_exit ; write error and die
- Public __aFchkstk
- Public __chkstk
- __aFchkstk Proc Far
- __chkstk Label Far
-
- pop cx ; get return offset
- pop dx ; get return segment
-
- Mov Bx,Ss
- Cmp Bx,DGROUP ; Running with current system stack?
- Jne COEXSTKCHK
-
- mov bx,sp
- sub bx,ax ; new position
- jc OMerr ; error - out of memory
- cmp bx,[STKHQQ] ; SP - AX : STKHQQ (for heap/stack)
- jb OMerr ; error - out of memory
-
- mov sp,bx ; set new stack pointer
-
- push dx ; push segment
- push cx ; push offset
- ret ; far return to dx:cx
-
- COEXSTKCHK:
-
- mov bx,sp
- sub bx,ax ; new position
- jc OMerr ; error - out of memory
- Mov ax,_sp
- Add ax,STACKSLOP
- cmp bx,ax
- jb OMerr ; error - out of memory
-
- mov sp,bx
- push dx
- push cx
- ret
- OMerr:
- xor ax,ax
- jmp _amsg_exit ; give stack overflow and die
- __aFchkstk Endp
-
- Public _stackavail
- _stackavail Proc Far
-
- Mov Cx,Ss
- Cmp Cx,DGROUP
- Jne Costkavail
-
- Pop Cx
- Pop Dx
- Mov Ax,[STKHQQ]
- Cmp Ax,Sp
- Jae L10
- Sub Ax,Sp
- Neg Ax
- L0D: Push Dx
- Push Cx
- Ret
- L10: Xor Ax,Ax
- Jmp L0D
-
- Costkavail:
- Pop Cx
- Pop Dx
- Mov Ax,_sp
- Add Ax,STACKSLOP
- Cmp Ax,Sp
- Jae L10
- Sub Ax,Sp
- Neg Ax
- Jmp L0D
-
- _stackavail Endp
-
- sEnd
- end
-