--- /dev/null
+;[]-----------------------------------------------------------------[]\r
+;| RULES.ASI -- Rules & Structures for assembler |\r
+;| |\r
+;| Turbo C++ Run Time Library |\r
+;| |\r
+;| Copyright (c) 1987, 1991 by Borland International Inc. |\r
+;| All Rights Reserved. |\r
+;[]-----------------------------------------------------------------[]\r
+\r
+;*** First we begin with a few of the major constants of C.\r
+\r
+false equ 0 ; Beware ! For incoming parameters, non-false = true.\r
+true equ 1 ; For results, we generate the proper numbers.\r
+\r
+lesser equ -1 ; Incoming, lesser < 0\r
+equal equ 0\r
+greater equ 1 ; Incoming, greater > 0\r
+\r
+ PAGE\r
+;[]------------------------------------------------------------[]\r
+;| |\r
+;| Conditional Assembly Directives |\r
+;| |\r
+;[]------------------------------------------------------------[]\r
+\r
+;memory model aliases, for the convenience of building the library\r
+\r
+IFDEF __s__\r
+__SMALL__ equ 1\r
+ENDIF\r
+\r
+IFDEF __c__\r
+__COMPACT__ equ 1\r
+ENDIF\r
+\r
+IFDEF __m__\r
+__MEDIUM__ equ 1\r
+ENDIF\r
+\r
+IFDEF __l__\r
+__LARGE__ equ 1\r
+ENDIF\r
+\r
+IFDEF __h__\r
+__HUGE__ equ 1\r
+ENDIF\r
+\r
+IFNDEF __TINY__\r
+ IFNDEF __SMALL__\r
+ IFNDEF __MEDIUM__\r
+ IFNDEF __COMPACT__\r
+ IFNDEF __LARGE__\r
+ IFNDEF __HUGE__\r
+ %OUT You must supply a model symbol.\r
+ .ERR\r
+ ENDIF\r
+ ENDIF\r
+ ENDIF\r
+ ENDIF\r
+ ENDIF\r
+ENDIF\r
+\r
+;bit masks to extract default pointer types from MMODEL (at run-time)\r
+FCODE equ 8000h\r
+FDATA equ 4000h\r
+\r
+IFDEF __TINY__ ; Small Code - Small Data\r
+ LPROG equ false\r
+ LDATA equ false\r
+ MMODEL equ 0 \r
+ _DSSTACK_ equ <>\r
+ENDIF\r
+\r
+IFDEF __SMALL__ ; Small Code - Small Data\r
+ LPROG equ false\r
+ LDATA equ false\r
+ MMODEL equ 1 \r
+ _DSSTACK_ equ <>\r
+ENDIF\r
+\r
+IFDEF __MEDIUM__ ; Large Code - Small Data\r
+ LPROG equ true\r
+ LDATA equ false\r
+ MMODEL equ FCODE+2 \r
+ _DSSTACK_ equ <>\r
+ENDIF\r
+\r
+IFDEF __COMPACT__ ; Small Code - Large Data\r
+ LPROG equ false\r
+ LDATA equ true\r
+ MMODEL equ FDATA+3 \r
+ENDIF\r
+\r
+IFDEF __LARGE__ ; Large Code - Large Data\r
+ LPROG equ true\r
+ LDATA equ true\r
+ MMODEL equ FCODE+FDATA+4\r
+ENDIF\r
+\r
+IFDEF __HUGE__ ; Large Code - Large Data\r
+ LPROG equ true\r
+ LDATA equ true\r
+ MMODEL equ FCODE+FDATA+5\r
+ENDIF\r
+\r
+IF LPROG\r
+ DIST equ FAR\r
+ELSE\r
+ DIST equ NEAR\r
+ENDIF\r
+\r
+ PAGE\r
+;[]------------------------------------------------------------[]\r
+;| |\r
+;| Segment Declarations Macros |\r
+;| |\r
+;[]------------------------------------------------------------[]\r
+\r
+Code_Seg@ MACRO ;; Open a Code Segment\r
+IFDEF __WINDOWS__\r
+_TEXT SEGMENT WORD PUBLIC 'CODE'\r
+ELSE\r
+_TEXT SEGMENT BYTE PUBLIC 'CODE'\r
+ENDIF\r
+ ASSUME CS:_TEXT\r
+ ENDM\r
+\r
+Code_EndS@ MACRO ;; Close a Code Segment\r
+_TEXT ENDS\r
+ ENDM\r
+\r
+Data_Seg@ MACRO ;; Open a Data Segment (initialized)\r
+_DATA SEGMENT WORD PUBLIC 'DATA'\r
+ ENDM\r
+\r
+Data_EndS@ MACRO ;; Close a Data Segment (initialized)\r
+_DATA ENDS\r
+ ENDM\r
+\r
+IFNDEF __HUGE__\r
+ BSS_Seg@ MACRO ;; Open a Data Segment (un-initialized)\r
+ _BSS SEGMENT WORD PUBLIC 'BSS'\r
+ ENDM\r
+\r
+ BSS_EndS@ MACRO ;; Close a Data Segment (un-initialized)\r
+ _BSS ENDS\r
+ ENDM\r
+ENDIF\r
+\r
+FarData_Seg@ MACRO ;; Open a FAR Data Segment\r
+_FARDATA SEGMENT PARA PUBLIC 'FAR_DATA'\r
+ ENDM\r
+\r
+FarData_EndS@ MACRO ;; Close a FAR Data Segment\r
+_FARDATA ENDS\r
+ ENDM\r
+\r
+FarBSS_Seg@ MACRO ;; Open a FAR BSS Segment\r
+_FARBSS SEGMENT PARA PUBLIC 'FAR_BSS'\r
+ ENDM\r
+\r
+FarBSS_EndS@ MACRO ;; Close a FAR BSS Segment\r
+_FARBSS ENDS\r
+ ENDM\r
+\r
+Const_Seg@ MACRO ;; Open a CONST Segment\r
+_CONST SEGMENT WORD PUBLIC 'CONST'\r
+ ENDM\r
+\r
+Const_EndS@ MACRO ;; Close a CONST Segment\r
+_CONST ENDS\r
+ ENDM\r
+\r
+Init_Seg@ MACRO ;; Open a INIT Segment\r
+_INIT_ SEGMENT WORD PUBLIC 'INITDATA'\r
+ ENDM\r
+\r
+Init_EndS@ MACRO ;; Close a INIT Segment\r
+_INIT_ ENDS\r
+ ENDM\r
+\r
+Exit_Seg@ MACRO ;; Open a EXIT Segment\r
+_EXIT_ SEGMENT WORD PUBLIC 'EXITDATA'\r
+ ENDM\r
+\r
+Exit_EndS@ MACRO ;; Close a EXIT Segment\r
+_EXIT_ ENDS\r
+ ENDM\r
+\r
+CVT_Seg@ MACRO\r
+_CVTSEG SEGMENT WORD PUBLIC 'DATA'\r
+ ENDM\r
+\r
+CVT_EndS@ MACRO\r
+_CVTSEG ENDS\r
+ ENDM\r
+\r
+SCN_Seg@ MACRO\r
+_SCNSEG SEGMENT WORD PUBLIC 'DATA'\r
+ ENDM\r
+\r
+SCN_EndS@ MACRO\r
+_SCNSEG ENDS\r
+ ENDM\r
+\r
+Header@ MACRO\r
+Code_Seg@\r
+Code_EndS@\r
+Data_Seg@\r
+Data_EndS@\r
+BSS_Seg@\r
+BSS_EndS@\r
+ ASSUME CS:_TEXT, DS:DGROUP\r
+ ENDM\r
+\r
+;[]------------------------------------------------------------[]\r
+;| |\r
+;| Segment Definitions |\r
+;| |\r
+;[]------------------------------------------------------------[]\r
+\r
+IFDEF __C0__\r
+\r
+IFDEF __WINDOWS__\r
+_TEXT SEGMENT WORD PUBLIC 'CODE'\r
+ ENDS\r
+ELSE\r
+_TEXT SEGMENT BYTE PUBLIC 'CODE'\r
+ ENDS\r
+ENDIF\r
+\r
+_FARDATA SEGMENT PARA PUBLIC 'FAR_DATA'\r
+ ENDS\r
+\r
+_FARBSS SEGMENT PARA PUBLIC 'FAR_BSS'\r
+ ENDS\r
+\r
+IFNDEF __WINDOWS__\r
+ IFNDEF __TINY__\r
+ _OVERLAY_ SEGMENT PARA PUBLIC 'OVRINFO'\r
+ ENDS\r
+ _1STUB_ SEGMENT PARA PUBLIC 'STUBSEG'\r
+ ENDS\r
+ ENDIF\r
+ENDIF\r
+\r
+IFDEF __WINDOWS__\r
+NULL SEGMENT PARA PUBLIC 'BEGDATA'\r
+ ENDS\r
+ENDIF\r
+\r
+_DATA SEGMENT PARA PUBLIC 'DATA'\r
+ ENDS\r
+ ENDS\r
+\r
+_CONST SEGMENT WORD PUBLIC 'CONST'\r
+ ENDS\r
+\r
+IFDEF __WINDOWS__\r
+_FPSEG SEGMENT WORD PUBLIC 'DATA'\r
+ ENDS\r
+ENDIF\r
+\r
+_CVTSEG SEGMENT WORD PUBLIC 'DATA'\r
+ ENDS\r
+\r
+_SCNSEG SEGMENT WORD PUBLIC 'DATA'\r
+ ENDS\r
+\r
+_INIT_ SEGMENT WORD PUBLIC 'INITDATA'\r
+InitStart label byte\r
+ ENDS\r
+_INITEND_ SEGMENT BYTE PUBLIC 'INITDATA'\r
+InitEnd label byte\r
+ ENDS\r
+\r
+_EXIT_ SEGMENT WORD PUBLIC 'EXITDATA'\r
+ExitStart label byte\r
+ ENDS\r
+_EXITEND_ SEGMENT BYTE PUBLIC 'EXITDATA'\r
+ExitEnd label byte\r
+ ENDS\r
+\r
+IFNDEF __HUGE__\r
+_BSS SEGMENT WORD PUBLIC 'BSS'\r
+BeginBSS label byte\r
+ ENDS\r
+_BSSEND SEGMENT BYTE PUBLIC 'BSSEND'\r
+EndBSS label byte\r
+ ENDS\r
+ENDIF\r
+\r
+\r
+IFDEF __WINDOWS__\r
+\r
+ IFDEF __HUGE__\r
+ DGROUP GROUP NULL,_DATA,_CONST,_FPSEG,_CVTSEG,_SCNSEG,_INIT_,_INITEND_,_EXIT_,_EXITEND_\r
+ ELSE\r
+ DGROUP GROUP NULL,_DATA,_CONST,_FPSEG,_CVTSEG,_SCNSEG,_INIT_,_INITEND_,_EXIT_,_EXITEND_,_BSS,_BSSEND\r
+ ENDIF\r
+\r
+ELSE\r
+\r
+IFNDEF __NOFLOAT__\r
+ IF LDATA\r
+ IFDEF __HUGE__\r
+ DGROUP GROUP _DATA,_CONST,_CVTSEG,_SCNSEG,_INIT_,_INITEND_,_EXIT_,_EXITEND_\r
+ ELSE\r
+ DGROUP GROUP _DATA,_CONST,_CVTSEG,_SCNSEG,_INIT_,_INITEND_,_EXIT_,_EXITEND_,_BSS,_BSSEND\r
+ ENDIF\r
+ ELSE\r
+ IFDEF __TINY__\r
+ DGROUP GROUP _TEXT,_DATA,_CONST,_CVTSEG,_SCNSEG,_INIT_,_INITEND_,_EXIT_,_EXITEND_,_BSS,_BSSEND\r
+ ELSE\r
+ DGROUP GROUP _DATA,_CONST,_CVTSEG,_SCNSEG,_INIT_,_INITEND_,_EXIT_,_EXITEND_,_BSS,_BSSEND\r
+ ENDIF\r
+ ENDIF\r
+ELSE\r
+ IF LDATA\r
+ IFDEF __HUGE__\r
+ DGROUP GROUP _DATA,_CONST,_CVTSEG,_SCNSEG,_INIT_,_INITEND_,_EXIT_,_EXITEND_\r
+ ELSE\r
+ DGROUP GROUP _DATA,_CONST,_CVTSEG,_SCNSEG,_BSS,_BSSEND\r
+ ENDIF\r
+ ELSE\r
+ IFDEF __TINY__\r
+ DGROUP GROUP _TEXT,_DATA,_CONST,_CVTSEG,_SCNSEG,_INIT_,_INITEND_,_EXIT_,_EXITEND_,_BSS,_BSSEND\r
+ ELSE\r
+ DGROUP GROUP _DATA,_CONST,_CVTSEG,_SCNSEG,_INIT_,_INITEND_,_EXIT_,_EXITEND_,_BSS,_BSSEND\r
+ ENDIF\r
+ ENDIF\r
+ENDIF ; __NOFLOAT__\r
+\r
+ENDIF ; __WINDOWS__\r
+\r
+ELSE\r
+\r
+Code_Seg@\r
+Code_EndS@\r
+Data_Seg@\r
+Data_EndS@\r
+DGROUP GROUP _DATA\r
+\r
+ENDIF ; __C0__\r
+\r
+ PAGE\r
+;[]------------------------------------------------------------[]\r
+;| |\r
+;| Old Segment Declarations Macros |\r
+;| |\r
+;[]------------------------------------------------------------[]\r
+\r
+\r
+CSeg@ MACRO ;; Open a Code Segment\r
+IFDEF __WINDOWS__\r
+_TEXT SEGMENT WORD PUBLIC 'CODE'\r
+ELSE\r
+_TEXT SEGMENT BYTE PUBLIC 'CODE'\r
+ENDIF\r
+ ASSUME CS:_TEXT\r
+ ENDM\r
+\r
+CSegEnd@ MACRO ;; Close a Code Segment\r
+_TEXT ENDS\r
+ ENDM\r
+\r
+DSeg@ MACRO ;; Open a Data Segment (initialized)\r
+_DATA SEGMENT WORD PUBLIC 'DATA'\r
+ ENDM\r
+\r
+DSegEnd@ MACRO ;; Close a Data Segment (initialized)\r
+_DATA ENDS\r
+ ENDM\r
+\r
+IFDEF __BSS__\r
+ IFNDEF __HUGE__\r
+ BSeg@ MACRO ;; Open a Data Segment (un-initialized)\r
+ _BSS SEGMENT WORD PUBLIC 'BSS'\r
+ ENDM\r
+\r
+ BSegEnd@ MACRO ;; Close a Data Segment (un-initialized)\r
+ _BSS ENDS\r
+ ENDM\r
+ ENDIF\r
+ENDIF\r
+\r
+Header@ MACRO\r
+IFDEF __WINDOWS__\r
+_TEXT SEGMENT WORD PUBLIC 'CODE'\r
+ELSE\r
+_TEXT SEGMENT BYTE PUBLIC 'CODE'\r
+ENDIF\r
+_TEXT ENDS\r
+_DATA SEGMENT WORD PUBLIC 'DATA'\r
+_DATA ENDS\r
+IFDEF __BSS__\r
+ IFNDEF __HUGE__\r
+ _BSS SEGMENT WORD PUBLIC 'BSS'\r
+ _BSS ENDS\r
+ ENDIF\r
+ENDIF\r
+\r
+ ASSUME CS:_TEXT, DS:DGROUP\r
+ ENDM\r
+\r
+ PAGE\r
+;[]------------------------------------------------------------[]\r
+;| |\r
+;| C Naming Convention Macros |\r
+;| |\r
+;[]------------------------------------------------------------[]\r
+\r
+UNDERSCORE EQU 1\r
+\r
+ExtSym@ MACRO Sym, sType, sName\r
+ IFNB <sName>\r
+ IFIDN <sName>, <__PASCAL__>\r
+NAMING = 0\r
+ ELSE\r
+NAMING = UNDERSCORE\r
+ ENDIF\r
+ ENDIF\r
+ IF NAMING\r
+ EXTRN _&Sym : sType\r
+Sym&@ equ _&Sym\r
+ ELSE\r
+ EXTRN Sym : sType\r
+Sym&@ equ Sym\r
+ ENDIF\r
+ ENDM\r
+\r
+PubSym@ MACRO Sym, Definition, sName\r
+ IFNB <sName>\r
+ IFIDN <sName>, <__PASCAL__>\r
+NAMING = 0\r
+ ELSE\r
+NAMING = UNDERSCORE\r
+ ENDIF\r
+ ENDIF\r
+ IF NAMING\r
+ PUBLIC _&Sym\r
+_&Sym Definition\r
+Sym&@ equ _&Sym\r
+ ELSE\r
+ PUBLIC Sym\r
+Sym Definition\r
+Sym&@ equ Sym\r
+ ENDIF\r
+ ENDM\r
+\r
+Static@ MACRO Sym, Definition, sName\r
+ IFNB <sName>\r
+ IFIDN <sName>, <__PASCAL__>\r
+NAMING = 0\r
+ ELSE\r
+NAMING = UNDERSCORE\r
+ ENDIF\r
+ ENDIF\r
+ IF NAMING\r
+_&Sym Definition\r
+Sym&@ equ _&Sym\r
+ ELSE\r
+Sym Definition\r
+Sym&@ equ Sym\r
+ ENDIF\r
+ ENDM\r
+\r
+ PAGE\r
+;[]------------------------------------------------------------[]\r
+;| |\r
+;| Macros which are Data Size Dependent |\r
+;| |\r
+;[]------------------------------------------------------------[]\r
+\r
+IF LDATA\r
+DPTR_ equ DWORD PTR\r
+dPtrSize equ 4\r
+LES_ equ LES\r
+ES_ equ ES:\r
+SS_ equ SS:\r
+LDS_ equ LDS\r
+\r
+pushDS_ MACRO\r
+ PUSH DS\r
+ ENDM\r
+\r
+popDS_ MACRO\r
+ POP DS\r
+ ENDM\r
+\r
+PushPtr MACRO dPtrOff, dPtrSeg\r
+ PUSH dPtrSeg\r
+ PUSH dPtrOff\r
+ ENDM\r
+\r
+\r
+dPtr@ MACRO Sym, VALUE, sName ;; Static Data pointer\r
+Static@ Sym, <DD VALUE>, sName\r
+ ENDM\r
+\r
+dPtrPub@ MACRO Sym, VALUE, sName ;; Global Data Pointer\r
+PubSym@ Sym, <DD VALUE>, sName\r
+ ENDM\r
+\r
+dPtrExt@ MACRO Sym, sName ;; External Data Pointer\r
+ExtSym@ Sym, DWORD, sName\r
+ ENDM\r
+ELSE\r
+DPTR_ equ WORD PTR\r
+dPtrSize equ 2\r
+LES_ equ MOV\r
+ES_ equ DS:\r
+SS_ equ DS:\r
+LDS_ equ MOV\r
+\r
+pushDS_ MACRO\r
+ ENDM\r
+\r
+popDS_ MACRO\r
+ ENDM\r
+\r
+PushPtr MACRO dPtrOff, dPtrSeg\r
+ PUSH dPtrOff\r
+ ENDM\r
+\r
+dPtr@ MACRO Sym, VALUE, sName ;; Static Data pointer\r
+Static@ Sym, <DW VALUE>, sName\r
+ ENDM\r
+\r
+dPtrPub@ MACRO Sym, VALUE, sName ;; Global Data Pointer\r
+PubSym@ Sym, <DW VALUE>, sName\r
+ ENDM\r
+\r
+dPtrExt@ MACRO Sym, sName ;; External Data Pointer\r
+ExtSym@ Sym, WORD, sName\r
+ ENDM\r
+ENDIF\r
+ PAGE\r
+;[]------------------------------------------------------------[]\r
+;| |\r
+;| Macros which are Code Size Dependent |\r
+;| |\r
+;[]------------------------------------------------------------[]\r
+\r
+IF LPROG\r
+CPTR_ equ DWORD PTR\r
+cPtrSize equ 4\r
+\r
+Proc@ MACRO Sym, sName ;; Open a Static function\r
+Static@ Sym, <PROC FAR>, sName\r
+ ENDM\r
+\r
+PubProc@ MACRO Sym, sName ;; Open a Public function\r
+PubSym@ Sym, <PROC FAR>, sName\r
+ ENDM\r
+\r
+ExtProc@ MACRO Sym, sName ;; External Function\r
+ExtSym@ Sym, FAR, sName\r
+ ENDM\r
+\r
+cPtr@ MACRO Sym, VALUE, sName ;; Static Function pointer\r
+Static@ Sym, <DD VALUE>, sName\r
+ ENDM\r
+\r
+cPtrPub@ MACRO Sym, VALUE, sName;; Global Function Pointer\r
+PubSym@ Sym, <DD VALUE>, sName\r
+ ENDM\r
+\r
+cPtrExt@ MACRO Sym, sName ;; External Function Pointer\r
+ExtSym@ Sym, DWORD, sName\r
+ ENDM\r
+ELSE\r
+CPTR_ equ WORD PTR\r
+cPtrSize equ 2\r
+\r
+Proc@ MACRO Sym, sName ;; Open a Static function\r
+Static@ Sym, <PROC NEAR>, sName\r
+ ENDM\r
+\r
+PubProc@ MACRO Sym, sName ;; Open a Public function\r
+PubSym@ Sym, <PROC NEAR>, sName\r
+ ENDM\r
+\r
+ExtProc@ MACRO Sym, sName ;; External Function\r
+ExtSym@ Sym, NEAR, sName\r
+ ENDM\r
+\r
+cPtr@ MACRO Sym, VALUE, sName ;; Static Function pointer\r
+Static@ Sym, <DW VALUE>, sName\r
+ ENDM\r
+\r
+cPtrPub@ MACRO Sym, VALUE, sName ;; Global Function Pointer\r
+PubSym@ Sym, <DW VALUE>, sName\r
+ ENDM\r
+\r
+cPtrExt@ MACRO Sym, sName ;; External Function Pointer\r
+ExtSym@ Sym, WORD, sName\r
+ ENDM\r
+ENDIF\r
+\r
+EndProc@ MACRO Sym, sName ;; Close a function\r
+Static@ Sym, ENDP, sName\r
+ ENDM\r
+\r
+ PAGE\r
+;[]------------------------------------------------------------[]\r
+;| |\r
+;| Miscellaneous Definitions |\r
+;| |\r
+;[]------------------------------------------------------------[]\r
+\r
+;*** Set up some macros for procedure parameters and export/import\r
+\r
+nearCall STRUC\r
+nearBP dw ?\r
+nearIP dw ?\r
+nearParam dw ?\r
+nearCall ENDS\r
+\r
+farCall STRUC\r
+farBP dw ?\r
+farCSIP dd ?\r
+aParam dw ?\r
+farCall ENDS\r
+\r
+;*** Next, we define some convenient structures to access the parts\r
+; of larger objects.\r
+\r
+_twoBytes STRUC\r
+BY0 db ?\r
+BY1 db ?\r
+_twoBytes ENDS\r
+\r
+_fourWords STRUC\r
+W0 dw ?\r
+W1 dw ?\r
+W2 dw ?\r
+W3 dw ?\r
+_fourWords ENDS\r
+\r
+_twoDwords STRUC\r
+DD0 dd ?\r
+DD1 dd ?\r
+_twoDwords ENDS\r
+\r
+_aFloat STRUC\r
+double dq ?\r
+_aFloat ENDS\r
+\r
+; How to invoke MSDOS.\r
+\r
+MSDOS@ MACRO\r
+ int 21h\r
+ ENDM\r
+ PAGE\r
+\r
+; The next section concerns the use of registers. SI and DI are used\r
+; for register variables, and must be conserved.\r
+\r
+; Registers AX, BX, CX, DX will not be preserved across function calls.\r
+\r
+; Firstly, the registers to be conserved through function calls, including\r
+; the setup of local variables.\r
+\r
+link@ MACRO _si,_di,_ES,locals\r
+ push bp\r
+ mov bp, sp\r
+ IFNB <locals>\r
+ lea sp, locals\r
+ ENDIF\r
+ IFNB <_si>\r
+ push si\r
+ ENDIF\r
+ IFNB <_di>\r
+ push di\r
+ ENDIF\r
+ENDM\r
+\r
+unLink@ MACRO _si,_di,_ES,locals\r
+ IFNB <_di>\r
+ pop di\r
+ ENDIF\r
+ IFNB <_si>\r
+ pop si\r
+ ENDIF\r
+ IFNB <locals>\r
+ mov sp, bp\r
+ ENDIF\r
+ pop bp\r
+ENDM\r
+\r
+.LIST\r