.XLIST PAGE ;[]------------------------------------------------------------[] ;| RULES.ASI -- Rules & Structures for assembler | ;| | ;| Turbo-C Run Time Library version 1.0 | ;| | ;| Copyright (c) 1987 by Borland International Inc. | ;| All Rights Reserved. | ;[]------------------------------------------------------------[] ;*** 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 | ;| | ;[]------------------------------------------------------------[] 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 __TINY__ ; *** Special case *** __SMALL__ equ true ENDIF IFDEF __HUGE__ ; *** Special case *** __LARGE__ equ true 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 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 Header@ MACRO _TEXT SEGMENT BYTE PUBLIC 'CODE' _TEXT ENDS _DATA SEGMENT WORD PUBLIC 'DATA' _DATA ENDS _BSS SEGMENT WORD PUBLIC 'BSS' _BSS ENDS IFDEF __TINY__ DGROUP GROUP _TEXT, _DATA, _BSS ELSE DGROUP GROUP _DATA, _BSS ENDIF ASSUME CS:_TEXT, DS:DGROUP ENDM PAGE ;[]------------------------------------------------------------[] ;| | ;| C Naming Convention Macros | ;| | ;[]------------------------------------------------------------[] UNDERSCORE EQU 1 ExtSym@ MACRO Sym, sType, sName IFNB IFIDN , <__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 IFIDN , <__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 IFIDN , <__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,
, sName ENDM dPtrPub@ MACRO Sym, VALUE, sName ;; Global Data Pointer PubSym@ Sym,
, 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, , sName ENDM dPtrPub@ MACRO Sym, VALUE, sName ;; Global Data Pointer PubSym@ Sym, , 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, , sName ENDM PubProc@ MACRO Sym, sName ;; Open a Public function PubSym@ Sym, , sName ENDM ExtProc@ MACRO Sym, sName ;; External Function ExtSym@ Sym, FAR, sName ENDM cPtr@ MACRO Sym, VALUE, sName ;; Static Function pointer Static@ Sym,
, sName ENDM cPtrPub@ MACRO Sym, VALUE, sName;; Global Function Pointer PubSym@ Sym,
, 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, , sName ENDM PubProc@ MACRO Sym, sName ;; Open a Public function PubSym@ Sym, , sName ENDM ExtProc@ MACRO Sym, sName ;; External Function ExtSym@ Sym, NEAR, sName ENDM cPtr@ MACRO Sym, VALUE, sName ;; Static Function pointer Static@ Sym, , sName ENDM cPtrPub@ MACRO Sym, VALUE, sName ;; Global Function Pointer PubSym@ Sym, , 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. | ;| | ;[]------------------------------------------------------------[] 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 ; 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 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 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 */ CW_DEFAULT equ (RC_NEAR+PC_64+EM_DENORMAL+EM_UNDERFLOW+EM_INEXACT) .LIST