windows-nt/Source/XPSP1/NT/base/mvdm/wow16/win87em/emstack.asm

109 lines
2.9 KiB
NASM
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
page ,132
subttl emstack.asm - Emulator Stack Management Area
;***
;emstack.asm - Emulator Stack Management Area
;
; Copyright (c) 1986-89, Microsoft Corporation
;
;Purpose:
; Emulator Stack Management Area
;
; This Module contains Proprietary Information of Microsoft
; Corporation and should be treated as Confidential.
;
;Revision History:
; See emulator.hst
;
;*******************************************************************************
ProfBegin STACK
;*********************************************************************;
; ;
; Emulator Stack Management Area ;
; ;
;*********************************************************************;
; The emulator maintains an "finite" stack of 12 byte registers.
; Stand-alone emulator has 1 chunk only.
; This is done using a list of finite length stack chunks, each of
; which has the following format:
; +00 first (deepest) 12 byte register
; +12 next 12 byte register
; (and so on through last possible register)
; MACROS used to manipulate the emulator/8087 memory stack
; This macro allocates a new TOS register, returns SI with its address.
PUSHST MACRO
local pushstok
mov esi,[CURstk] ; 14 get address of current register
cmp esi,[LIMstk] ; 15 is current register end of stack
jne short pushstok ; 16 no, still room in stack
call OverStk ; stack overflow error
pushstok:
add esi,Reg87Len ; 4 increment SI to next free register
mov [CURstk],esi ; 15 set current top of stack
ENDM ; 64 total
; This macro deallocates TOS register, returns SI with new TOS address.
; Note: assumes SI contains TOS address, CURstk
; BASstk converted back to a variable to enable macro use for 8087 stack
; handling. Brad Verheiden, 4-13-84.
POPSTsi MACRO
local popstok
cmp esi,[BASstk] ; 15 was it last register in the chunk ?
jnz short popstok ; 16 no, still room in current chunk
call UnderStk ; stack underflow error
popstok:
sub esi,Reg87Len ; 4 decrement SI to previous register
mov [CURstk],esi ; 15 set current top of stack
ENDM ; 64 total
POPST MACRO
mov esi,[CURstk]
POPSTsi
ENDM
ChangeDIfromTOStoNOS MACRO
sub edi,Reg87Len
ENDM
page
; This area contains two procedures, OverStk and UnderStk,
; which generate a stack overflow error.
; OverStk: invoked within PUSHST macro
; on entry, the stack is full
; on return, SI contains address of base of stack
; UnderStk: invoked within POPST macro
; on entry, the stack is empty
; on return, SI contains address of base of stack
pub OverStk
OR byte ptr [CURerr+1],StackOverflow/256 ; raise stack overflow
CMP [Have8087],0 ; Is 8087 present
JZ short OverStkEnd ; No - don't touch AX
OR AH,StackOverflow/256 ; Indicate memory overflow for 8087
pub OverStkEnd
RET ; finished
pub UnderStk
OR byte ptr [CURerr+1],StackUnderflow/256 ; raise stack underflow
RET ; finished
ProfEnd STACK