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