533 lines
11 KiB
Plaintext
533 lines
11 KiB
Plaintext
.XLIST
|
||
PAGE
|
||
;[]------------------------------------------------------------[]
|
||
;| RULES.ASI -- Rules & Structures for assembler |
|
||
;| |
|
||
;| Turbo-C Run Time Library version 2.0 |
|
||
;| |
|
||
;| Copyright (c) 1987,1988 by Borland International Inc. |
|
||
;| All Rights Reserved. |
|
||
;[]------------------------------------------------------------[]
|
||
|
||
; 4/15/88 ah:
|
||
; Emulator segment directives modified for Turbo Pascal
|
||
; using _Pascal_ conditional.
|
||
|
||
;*** First we begin with a few of the major constants of C.
|
||
|
||
false equ 0 ; Beware ! For incoming parameters, non-false = true.
|
||
true equ 1 ; For results, we generate the proper numbers.
|
||
|
||
lesser equ -1 ; Incoming, lesser < 0
|
||
equal equ 0
|
||
greater equ 1 ; Incoming, greater > 0
|
||
PAGE
|
||
;[]------------------------------------------------------------[]
|
||
;| |
|
||
;| Conditional Assembly Directives |
|
||
;| |
|
||
;[]------------------------------------------------------------[]
|
||
|
||
IFDEF __TINY__ ; *** Special case ***
|
||
__SMALL__ equ true
|
||
ENDIF
|
||
|
||
IFDEF __HUGE__ ; *** Special case ***
|
||
__LARGE__ equ true
|
||
ENDIF
|
||
|
||
IFNDEF __TINY__
|
||
IFNDEF __SMALL__
|
||
IFNDEF __MEDIUM__
|
||
IFNDEF __COMPACT__
|
||
IFNDEF __LARGE__
|
||
IFNDEF __HUGE__
|
||
%OUT You must supply a model symbol.
|
||
.ERR
|
||
ENDIF
|
||
ENDIF
|
||
ENDIF
|
||
ENDIF
|
||
ENDIF
|
||
ENDIF
|
||
|
||
IFDEF __SMALL__ ; Small Code - Small Data
|
||
LPROG equ false
|
||
LDATA equ false
|
||
ENDIF
|
||
|
||
IFDEF __MEDIUM__ ; Small Code - Large Data
|
||
LPROG equ true
|
||
LDATA equ false
|
||
ENDIF
|
||
|
||
IFDEF __COMPACT__ ; Large Code - Small Data
|
||
LPROG equ false
|
||
LDATA equ true
|
||
ENDIF
|
||
|
||
IFDEF __LARGE__ ; Large Code - Large Data
|
||
LPROG equ true
|
||
LDATA equ true
|
||
ENDIF
|
||
|
||
IFNDEF LPROG ; *** Default = __COMPACT__ ***
|
||
__COMPACT__ equ true
|
||
LPROG equ false
|
||
LDATA equ true
|
||
ENDIF
|
||
PAGE
|
||
;[]------------------------------------------------------------[]
|
||
;| |
|
||
;| Segment Declarations Macros |
|
||
;| |
|
||
;[]------------------------------------------------------------[]
|
||
|
||
CSeg@ MACRO ;; Open a Code Segment
|
||
_TEXT SEGMENT BYTE PUBLIC 'CODE'
|
||
ASSUME CS:_TEXT
|
||
ENDM
|
||
|
||
CSegEnd@ MACRO ;; Close a Code Segment
|
||
_TEXT ENDS
|
||
ENDM
|
||
|
||
DSeg@ MACRO ;; Open a Data Segment (initialized)
|
||
_DATA SEGMENT WORD PUBLIC 'DATA'
|
||
ENDM
|
||
|
||
DSegEnd@ MACRO ;; Close a Data Segment (initialized)
|
||
_DATA ENDS
|
||
ENDM
|
||
|
||
IFDEF __BSS__
|
||
IFNDEF __HUGE__
|
||
BSeg@ MACRO ;; Open a Data Segment (un-initialized)
|
||
_BSS SEGMENT WORD PUBLIC 'BSS'
|
||
ENDM
|
||
|
||
BSegEnd@ MACRO ;; Close a Data Segment (un-initialized)
|
||
_BSS ENDS
|
||
ENDM
|
||
ENDIF
|
||
ENDIF
|
||
|
||
Header@ MACRO
|
||
_TEXT SEGMENT BYTE PUBLIC 'CODE'
|
||
_TEXT ENDS
|
||
_DATA SEGMENT WORD PUBLIC 'DATA'
|
||
_DATA ENDS
|
||
IFDEF __BSS__
|
||
IFNDEF __HUGE__
|
||
_BSS SEGMENT WORD PUBLIC 'BSS'
|
||
_BSS ENDS
|
||
ENDIF
|
||
ENDIF
|
||
|
||
IFDEF __BSS__
|
||
IFDEF __TINY__
|
||
DGROUP GROUP _TEXT, _DATA, _BSS
|
||
ELSE
|
||
IFDEF __HUGE__
|
||
DGROUP GROUP _DATA
|
||
ELSE
|
||
DGROUP GROUP _DATA, _BSS
|
||
ENDIF
|
||
ENDIF
|
||
ELSE
|
||
IFDEF __TINY__
|
||
DGROUP GROUP _TEXT, _DATA
|
||
ELSE
|
||
DGROUP GROUP _DATA
|
||
ENDIF
|
||
ENDIF
|
||
ASSUME CS:_TEXT, DS:DGROUP
|
||
ENDM
|
||
PAGE
|
||
;[]------------------------------------------------------------[]
|
||
;| |
|
||
;| C Naming Convention Macros |
|
||
;| |
|
||
;[]------------------------------------------------------------[]
|
||
|
||
UNDERSCORE EQU 1
|
||
|
||
ExtSym@ MACRO Sym, sType, sName
|
||
IFNB <sName>
|
||
IFIDN <sName>, <__PASCAL__>
|
||
NAMING = 0
|
||
ELSE
|
||
NAMING = UNDERSCORE
|
||
ENDIF
|
||
ENDIF
|
||
IF NAMING
|
||
EXTRN _&Sym : sType
|
||
Sym&@ equ _&Sym
|
||
ELSE
|
||
EXTRN Sym : sType
|
||
Sym&@ equ Sym
|
||
ENDIF
|
||
ENDM
|
||
|
||
PubSym@ MACRO Sym, Definition, sName
|
||
IFNB <sName>
|
||
IFIDN <sName>, <__PASCAL__>
|
||
NAMING = 0
|
||
ELSE
|
||
NAMING = UNDERSCORE
|
||
ENDIF
|
||
ENDIF
|
||
IF NAMING
|
||
PUBLIC _&Sym
|
||
_&Sym Definition
|
||
Sym&@ equ _&Sym
|
||
ELSE
|
||
PUBLIC Sym
|
||
Sym Definition
|
||
Sym&@ equ Sym
|
||
ENDIF
|
||
ENDM
|
||
|
||
Static@ MACRO Sym, Definition, sName
|
||
IFNB <sName>
|
||
IFIDN <sName>, <__PASCAL__>
|
||
NAMING = 0
|
||
ELSE
|
||
NAMING = UNDERSCORE
|
||
ENDIF
|
||
ENDIF
|
||
IF NAMING
|
||
_&Sym Definition
|
||
Sym&@ equ _&Sym
|
||
ELSE
|
||
Sym Definition
|
||
Sym&@ equ Sym
|
||
ENDIF
|
||
ENDM
|
||
PAGE
|
||
;[]------------------------------------------------------------[]
|
||
;| |
|
||
;| Macros which are Data Size Dependent |
|
||
;| |
|
||
;[]------------------------------------------------------------[]
|
||
|
||
IF LDATA
|
||
DPTR_ equ DWORD PTR
|
||
dPtrSize equ 4
|
||
LES_ equ LES
|
||
ES_ equ ES:
|
||
SS_ equ SS:
|
||
LDS_ equ LDS
|
||
|
||
pushDS_ MACRO
|
||
PUSH DS
|
||
ENDM
|
||
|
||
popDS_ MACRO
|
||
POP DS
|
||
ENDM
|
||
|
||
PushPtr MACRO dPtrOff, dPtrSeg
|
||
PUSH dPtrSeg
|
||
PUSH dPtrOff
|
||
ENDM
|
||
|
||
|
||
dPtr@ MACRO Sym, VALUE, sName ;; Static Data pointer
|
||
Static@ Sym, <DD VALUE>, sName
|
||
ENDM
|
||
|
||
dPtrPub@ MACRO Sym, VALUE, sName ;; Global Data Pointer
|
||
PubSym@ Sym, <DD VALUE>, sName
|
||
ENDM
|
||
|
||
dPtrExt@ MACRO Sym, sName ;; External Data Pointer
|
||
ExtSym@ Sym, DWORD, sName
|
||
ENDM
|
||
ELSE
|
||
DPTR_ equ WORD PTR
|
||
dPtrSize equ 2
|
||
LES_ equ MOV
|
||
ES_ equ DS:
|
||
SS_ equ DS:
|
||
LDS_ equ MOV
|
||
|
||
pushDS_ MACRO
|
||
ENDM
|
||
|
||
popDS_ MACRO
|
||
ENDM
|
||
|
||
PushPtr MACRO dPtrOff, dPtrSeg
|
||
PUSH dPtrOff
|
||
ENDM
|
||
|
||
dPtr@ MACRO Sym, VALUE, sName ;; Static Data pointer
|
||
Static@ Sym, <DW VALUE>, sName
|
||
ENDM
|
||
|
||
dPtrPub@ MACRO Sym, VALUE, sName ;; Global Data Pointer
|
||
PubSym@ Sym, <DW VALUE>, sName
|
||
ENDM
|
||
|
||
dPtrExt@ MACRO Sym, sName ;; External Data Pointer
|
||
ExtSym@ Sym, WORD, sName
|
||
ENDM
|
||
ENDIF
|
||
PAGE
|
||
;[]------------------------------------------------------------[]
|
||
;| |
|
||
;| Macros which are Code Size Dependent |
|
||
;| |
|
||
;[]------------------------------------------------------------[]
|
||
|
||
IF LPROG
|
||
CPTR_ equ DWORD PTR
|
||
cPtrSize equ 4
|
||
|
||
Proc@ MACRO Sym, sName ;; Open a Static function
|
||
Static@ Sym, <PROC FAR>, sName
|
||
ENDM
|
||
|
||
PubProc@ MACRO Sym, sName ;; Open a Public function
|
||
PubSym@ Sym, <PROC FAR>, sName
|
||
ENDM
|
||
|
||
ExtProc@ MACRO Sym, sName ;; External Function
|
||
ExtSym@ Sym, FAR, sName
|
||
ENDM
|
||
|
||
cPtr@ MACRO Sym, VALUE, sName ;; Static Function pointer
|
||
Static@ Sym, <DD VALUE>, sName
|
||
ENDM
|
||
|
||
cPtrPub@ MACRO Sym, VALUE, sName;; Global Function Pointer
|
||
PubSym@ Sym, <DD VALUE>, sName
|
||
ENDM
|
||
|
||
cPtrExt@ MACRO Sym, sName ;; External Function Pointer
|
||
ExtSym@ Sym, DWORD, sName
|
||
ENDM
|
||
ELSE
|
||
CPTR_ equ WORD PTR
|
||
cPtrSize equ 2
|
||
|
||
Proc@ MACRO Sym, sName ;; Open a Static function
|
||
Static@ Sym, <PROC NEAR>, sName
|
||
ENDM
|
||
|
||
PubProc@ MACRO Sym, sName ;; Open a Public function
|
||
PubSym@ Sym, <PROC NEAR>, sName
|
||
ENDM
|
||
|
||
ExtProc@ MACRO Sym, sName ;; External Function
|
||
ExtSym@ Sym, NEAR, sName
|
||
ENDM
|
||
|
||
cPtr@ MACRO Sym, VALUE, sName ;; Static Function pointer
|
||
Static@ Sym, <DW VALUE>, sName
|
||
ENDM
|
||
|
||
cPtrPub@ MACRO Sym, VALUE, sName ;; Global Function Pointer
|
||
PubSym@ Sym, <DW VALUE>, sName
|
||
ENDM
|
||
|
||
cPtrExt@ MACRO Sym, sName ;; External Function Pointer
|
||
ExtSym@ Sym, WORD, sName
|
||
ENDM
|
||
ENDIF
|
||
|
||
EndProc@ MACRO Sym, sName ;; Close a function
|
||
Static@ Sym, ENDP, sName
|
||
ENDM
|
||
PAGE
|
||
;[]------------------------------------------------------------[]
|
||
;| |
|
||
;| Miscellaneous Definitions |
|
||
;| |
|
||
;[]------------------------------------------------------------[]
|
||
|
||
;*** Set up some macros for procedure parameters and export/import
|
||
|
||
nearCall STRUC
|
||
nearBP dw ?
|
||
nearIP dw ?
|
||
nearParam dw ?
|
||
nearCall ENDS
|
||
|
||
farCall STRUC
|
||
farBP dw ?
|
||
farCSIP dd ?
|
||
aParam dw ?
|
||
farCall ENDS
|
||
|
||
;*** Next, we define some convenient structures to access the parts
|
||
; of larger objects.
|
||
|
||
_twoBytes STRUC
|
||
BY0 db ?
|
||
BY1 db ?
|
||
_twoBytes ENDS
|
||
|
||
_fourWords STRUC
|
||
W0 dw ?
|
||
W1 dw ?
|
||
W2 dw ?
|
||
W3 dw ?
|
||
_fourWords ENDS
|
||
|
||
_twoDwords STRUC
|
||
DD0 dd ?
|
||
DD1 dd ?
|
||
_twoDwords ENDS
|
||
|
||
_aFloat STRUC
|
||
double dq ?
|
||
_aFloat ENDS
|
||
|
||
; How to invoke MSDOS.
|
||
|
||
MSDOS@ MACRO
|
||
int 21h
|
||
ENDM
|
||
PAGE
|
||
;[]------------------------------------------------------------[]
|
||
;| |
|
||
;| Emulator Segments and Definitions |
|
||
;| |
|
||
;| The Emu287 module is in a separate model from other |
|
||
;| code. It uses the DSeg@ data segment, but since it |
|
||
;| does not actually share data the important aspect of |
|
||
;| the Data is the class name 'DATA'. It has its own |
|
||
;| stack inside the data segment. The code segment is |
|
||
;| completely separate from other code segments. The |
|
||
;| only contact between Emu287 and other code is via |
|
||
;| soft interrupts 34h..3Eh. |
|
||
;| |
|
||
;[]------------------------------------------------------------[]
|
||
|
||
IFNDEF _Pascal_
|
||
|
||
EmuSeg@ MACRO
|
||
EMU_PROG SEGMENT PARA PUBLIC 'CODE'
|
||
ASSUME CS : EMU_PROG
|
||
ENDM
|
||
|
||
EmuSegEnd@ MACRO
|
||
EMU_PROG ENDS
|
||
ENDM
|
||
|
||
E87Seg@ MACRO
|
||
E87_PROG SEGMENT PARA PUBLIC 'CODE'
|
||
ASSUME CS : E87_PROG
|
||
ENDM
|
||
|
||
E87SegEnd@ MACRO
|
||
E87_PROG ENDS
|
||
ENDM
|
||
|
||
ELSE
|
||
|
||
EmuSeg@ MACRO
|
||
CODE SEGMENT BYTE PUBLIC
|
||
ASSUME CS:CODE
|
||
ENDM
|
||
|
||
EmuSegEnd@ MACRO
|
||
CODE ENDS
|
||
ENDM
|
||
|
||
E87Seg@ MACRO
|
||
CODE SEGMENT BYTE PUBLIC
|
||
ASSUME CS:CODE
|
||
ENDM
|
||
|
||
E87SegEnd@ MACRO
|
||
CODE ENDS
|
||
ENDM
|
||
|
||
ENDIF
|
||
|
||
; The next section concerns the use of registers. SI and DI are used
|
||
; for register variables, and must be conserved.
|
||
|
||
; Registers AX, BX, CX, DX will not be preserved across function calls.
|
||
|
||
; Firstly, the registers to be conserved through function calls, including
|
||
; the setup of local variables.
|
||
|
||
link@ MACRO _si,_di,_ES,locals
|
||
push bp
|
||
mov bp, sp
|
||
IFNB <locals>
|
||
lea sp, locals
|
||
ENDIF
|
||
IFNB <_si>
|
||
push si
|
||
ENDIF
|
||
IFNB <_di>
|
||
push di
|
||
ENDIF
|
||
ENDM
|
||
|
||
unLink@ MACRO _si,_di,_ES,locals
|
||
IFNB <_di>
|
||
pop di
|
||
ENDIF
|
||
IFNB <_si>
|
||
pop si
|
||
ENDIF
|
||
IFNB <locals>
|
||
mov sp, bp
|
||
ENDIF
|
||
pop bp
|
||
ENDM
|
||
PAGE
|
||
;[]------------------------------------------------------------[]
|
||
;| |
|
||
;| iNDP Status and Control words definitions |
|
||
;| |
|
||
;[]------------------------------------------------------------[]
|
||
|
||
;/* 8087/80287 Status Word format */
|
||
|
||
SW_INVALID equ 00001h ;/* Invalid operation */
|
||
SW_DENORMAL equ 00002h ;/* Denormalized operand */
|
||
SW_ZERODIVIDE equ 00004h ;/* Zero divide */
|
||
SW_OVERFLOW equ 00008h ;/* Overflow */
|
||
SW_UNDERFLOW equ 00010h ;/* Underflow */
|
||
SW_INEXACT equ 00020h ;/* Precision (Inexact result) */
|
||
|
||
;/* 8087/80287 Control Word format */
|
||
|
||
MCW_EM equ 0003Fh ;/* interrupt Exception Masks */
|
||
EM_INVALID equ 00001h ;/* invalid */
|
||
EM_DENORMAL equ 00002h ;/* denormal */
|
||
EM_ZERODIVIDE equ 00004h ;/* zero divide */
|
||
EM_OVERFLOW equ 00008h ;/* overflow */
|
||
EM_UNDERFLOW equ 00010h ;/* underflow */
|
||
EM_INEXACT equ 00020h ;/* inexact (precision) */
|
||
|
||
MCW_IC equ 01000h ;/* Infinity Control */
|
||
IC_AFFINE equ 01000h ;/* affine */
|
||
IC_PROJECTIVE equ 00000h ;/* projective */
|
||
|
||
MCW_RC equ 00C00h ;/* Rounding Control */
|
||
RC_CHOP equ 00C00h ;/* chop */
|
||
RC_UP equ 00800h ;/* up */
|
||
RC_DOWN equ 00400h ;/* down */
|
||
RC_NEAR equ 00000h ;/* near */
|
||
|
||
MCW_PC equ 00300h ;/* Precision Control */
|
||
PC_24 equ 00000h ;/* 24 bits */
|
||
PC_53 equ 00200h ;/* 53 bits */
|
||
PC_64 equ 00300h ;/* 64 bits */
|
||
|
||
;/* 8087/80287 Initial Control Word */
|
||
;/* use affine infinity, mask underflow and precision exceptions */
|
||
;/* should be same as in float.h */
|
||
|
||
CW_DEFAULT equ (RC_NEAR+PC_64+IC_AFFINE+EM_UNDERFLOW+EM_INEXACT)
|
||
|
||
.LIST
|
||
|