Metropoli BBS
VIEWER: stacks.asm MODE: TEXT (ASCII)
;
; File:
;			  stacks.asm
; Description:
;     Assembly support routines for stack manipulation, etc.
;
;			Copyright (c) 1995
;			Pasquale J. Villani
;			All Rights Reserved
;
; This file is part of DOS-C.
;
; DOS-C is free software; you can redistribute it and/or
; modify it under the terms of the GNU General Public License
; as published by the Free Software Foundation; either version
; 2, or (at your option) any later version.
;
; DOS-C is distributed in the hope that it will be useful, but
; WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
; the GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public
; License along with DOS-C; see the file COPYING.  If not,
; write to the Free Software Foundation, 675 Mass Ave,
; Cambridge, MA 02139, USA.
;
; $Logfile:   C:/dos-c/src/kernel/stacks.asv  $
;
; $Header:   C:/dos-c/src/kernel/stacks.asv   1.1   01 Sep 1995 17:54:24   patv  $
;
; $Log:   C:/dos-c/src/kernel/stacks.asv  $
;
;   Rev 1.1   01 Sep 1995 17:54:24   patv
;First GPL release.
;
;   Rev 1.0   02 Jul 1995  9:05:50   patv
;Initial revision.
;

		page	60,132
		title	Assembly support routines for stack manipulation, etc.

IFDEF ??version
_TEXT		segment	byte public 'CODE'
DGROUP		group	_DATA,_BSS,_BSSEND		; small model
		assume	cs:_TEXT,ds:DGROUP,ss:DGROUP
_TEXT		ends

_DATA		segment word public 'DATA'
_DATA		ends

_BSS		segment word public 'BSS'
_BSS		ends

_BSSEND		segment byte public 'STACK'
_BSSEND		ends

ELSE
_TEXT		segment	byte public 'CODE'
_TEXT		ends

_DATA		segment word public 'DATA'
_DATA		ends

CONST		segment word public 'CONST'
CONST		ends

_BSS		segment word public 'BSS'
_BSS		ends

_BSSEND		segment byte public 'STACK'
_BSSEND		ends

DGROUP		group	CONST,_DATA,_BSS,_BSSEND	; small/tiny model
		assume	ds:DGROUP, ss:DGROUP
ENDIF



		extrn	_api_sp:word		; api stacks - for context
		extrn	_api_ss:word		; switching
		extrn	_usr_sp:word		; user stacks
		extrn	_usr_ss:word

_TEXT      	segment
		assume	cs: _TEXT
		public	_user_stack
;
; void far user_stack(void) - 
;	switch to user stack area
;
_user_stack	proc	far

		; save foreground stack

		; we need to get the return values from the stack 
		; since the current stack will change
		pop	ax			;get return offset
		pop	bx			;get return segment

		; Save the flags so that we can restore correct interrupt
		; state later. We need to disable interrupts so that we
		; don't trash memory with new sp-old ss combination
		pushf
		pop	dx
		cli

		; save away foreground process' stack
		mov	word ptr DGROUP:_usr_ss,ss
		mov	word ptr DGROUP:_usr_sp,sp

		; setup our local stack
		mov	ss,word ptr DGROUP:_api_ss
		mov	sp,word ptr DGROUP:_api_sp

		; make bp relative to our stack frame
		mov	bp,sp

		; setup for ret
		push	bx  
		push	ax

		; now restore interrupt state
		push	dx
		popf

		ret

_user_stack	endp

;
; void far kernel_stack(void) - 
;	restore foreground stack, throw ours away 
;
		public	_kernel_stack
_kernel_stack  proc    far

	; we need to get the return values from the stack 
	; since the current stack will change
		pop	cx			;get return offset
		pop	bx			;get return segment

		; Save the flags so that we can restore correct interrupt
		; state later. We need to disable interrupts so that we
		; don't trash memory with new sp-old ss combination
		pushf
		pop	dx
		cli

		; save background stack
		mov	word ptr DGROUP:_api_ss,ss
		mov	word ptr DGROUP:_api_sp,sp

		; restore foreground stack here
		mov	ss,word ptr DGROUP:_usr_ss
		mov	sp,word ptr DGROUP:_usr_sp

		; make bp relative to our stack frame
		mov	bp,sp   

		; setup for ret
		push	bx 
		push	cx
            
		; now restore interrupt state
		push	dx
		popf

		ret
_kernel_stack  endp

_TEXT		ends

		end

[ RETURN TO DIRECTORY ]