;	emuVars.asi		last modified :- 13 Jul 88

;	Turbo-C Run Time Library	version 2.0

;	Copyright (c) 1986,87,88 by Borland International Inc.
;	All Rights Reserved.

;	This file is designed to be included both by the start-up
;	module (C0.asm, for TC) and by the emulator.  The data is
;	actually allocated in startup, and externally referenced
;	from the emulator.

;	4/15/88 ah:
;	Modified for Turbo Pascal using _Pascal_ conditional.
;	7/13/88 rss:
;	Data initialization removed, moved to emualor FINIT code.
;	Added Safety Stamp so debugger can detect emulator.

IFNDEF	_Pascal_	; if Turbo C version

IFNDEF	_InsideEmu87_
	PUBLIC	emws_limitSP,	emws_initialSP,
	PUBLIC	emws_saveVector,emws_nmiVector
	PUBLIC	emws_status,	emws_control,	emws_TOS,	emws_adjust
	PUBLIC	emws_fixSeg,	emws_BPsafe
	PUBLIC	emws_stamp, emws_version

	IF _Strict87_
		PUBLIC    emws_instrnPtr, emws_dataPtr, emws_instruction 
	ENDIF
ENDIF

; The Use of Interrupt Vectors

;	There are 11 interrupt vectors.  The first 8 map onto the 8 floating
;	point instruction patterns:

;		{WAIT	ESC n } -->  INT (34h + n), where n is in (0..7)

;	No segment prefixes may apply to these patterns.

;	The ninth interrupt provides instructions with segment prefixes:

;		{WAIT	ES: ESC n } --> INT (3Ch), byte (C0h + n)
;		{WAIT	CS: ESC n } --> INT (3Ch), byte (80h + n)
;		{WAIT	SS: ESC n } --> INT (3Ch), byte (40h + n)
;		{WAIT	DS: ESC n } --> INT (3Ch), byte (00h + n)


;	The tenth interrupt corresponds to the sequence NOP, FWAIT, and
;	is a no-op for emulation purposes.

;	The eleventh interrupt provides Borland-defined shortcuts.



;	Data space is actually allocated in the stack segment by C0.asm,
;	the start-up module, and accessed by the emulator via externs.
;	It is initialized during the first emulated FINIT instruction.

IFNDEF	_InsideEmu87_		; if we are building C0.obj

; Allocate a set of 8 iNDP registers, plus extras for workspace

emws_limitSP	label	word

	db	(16 * 12) DUP (?)

emws_initialSP	label	word

; Append a spare for underflow situations.

	dw	6 dup (?)


emws_saveVector dd	?	; prior contents of NMI vector
emws_nmiVector	dd	?	; PC/AT error vector for 80287 exceptions

emws_status	dw	?	; result of comparisons
emws_control	dw	?	; processing options and exceptions.

emws_TOS	dw	?	; current level of e87 register stack
emws_adjust	dw	?	; adjusts TOS at exit

emws_fixSeg	dw	?	; selector implied by segFix
emws_BPsafe	dw	?	; keep BP --> userRegs here for safety.
emws_stamp	dd	?	; after initialization, 'emu', 87h
emws_version	dw	?	; 1 for TC2, TP5; 2 for TB2

IF _Strict87_
    emws_instrnPtr	dd	?	; used with error recovery
    emws_dataPtr	dd	?	; --------- " ------------
    emws_instruction 	dw	?	; bytes swapped, used for error recovery
ENDIF

ELSE			; _InsideEmu87_, we are building the emulator

	EXTRN	emws_limitSP	: WORD
	EXTRN	emws_initialSP	: WORD
	EXTRN	emws_saveVector : DWORD
	EXTRN	emws_nmiVector	: DWORD
	EXTRN	emws_status	: WORD
	EXTRN	emws_control	: WORD
	EXTRN	emws_TOS	: WORD
	EXTRN	emws_adjust	: WORD
	EXTRN	emws_fixSeg	: WORD
	EXTRN	emws_BPsafe	: WORD
	EXTRN	emws_stamp	: DWORD
	EXTRN	emws_version	: WORD

	IF _Strict87_
		EXTRN	emws_instrnPtr	: DWORD
		EXTRN	emws_dataPtr	: DWORD
		EXTRN	emws_instruction: DWORD
	ENDIF

	EmuAssume@	MACRO	aSeg
		ASSUME	aSeg : SEG emws_TOS
	ENDM
	EmuNothing@	MACRO	aSeg
		ASSUME	aSeg : NOTHING
	ENDM
ENDIF

ELSE			; _Pascal_, Turbo Pascal version

; Turbo Pascal's linker does not allow explicit references to the
; stack segment, so instead of the above PUBLICs and EXTRNs we
; define the following equates for the emulators variables. These
; declarations cause the assembler to use DS as the default segment
; register, so an SS: override MUST be coded in places where DS is
; not yet set up.

; Note: The Turbo Pascal runtime library assumes that an FINIT will
; correctly initialize all emulator variables. Turbo Pascal never
; initializes them, nor does it ever directly reference any of them.

emws_limitSP	equ	(word ptr DS: 0)
emws_initialSP	equ	(word ptr DS: 192)
emws_saveVector equ	(dword ptr DS: 204)
emws_nmiVector	equ	(dword ptr DS: 208)
emws_status	equ	(word ptr DS: 212)
emws_control	equ	(word ptr DS: 214)
emws_TOS	equ	(word ptr DS: 216)
emws_adjust	equ	(word ptr DS: 218)
emws_fixSeg	equ	(word ptr DS: 220)
emws_BPsafe	equ	(word ptr DS: 222)
emws_stamp	equ	(word ptr DS: 224)
emws_version	equ	(word ptr DS: 228)

EmuAssume@	MACRO	aSeg
	ASSUME	aSeg : NOTHING
ENDM
EmuNothing@	MACRO	aSeg
	ASSUME	aSeg : NOTHING
ENDM

ENDIF
