X-Git-Url: http://4ch.mooo.com/gitweb/?a=blobdiff_plain;ds=sidebyside;f=16%2Fwf3d8086%2Frules.asi;fp=16%2Fwf3d8086%2Frules.asi;h=eba71112e2425c556f9fc6616f3465170cfeb111;hb=d564176a4080e188751df2ae2363f272c62bf452;hp=0000000000000000000000000000000000000000;hpb=e3dc8b5d9b956b94d22e8e1d8dd13ab4dd912f3a;p=16.git diff --git a/16/wf3d8086/rules.asi b/16/wf3d8086/rules.asi new file mode 100755 index 00000000..eba71112 --- /dev/null +++ b/16/wf3d8086/rules.asi @@ -0,0 +1,692 @@ +;[]-----------------------------------------------------------------[] +;| RULES.ASI -- Rules & Structures for assembler | +;| | +;| Turbo C++ Run Time Library | +;| | +;| Copyright (c) 1987, 1991 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 | +;| | +;[]------------------------------------------------------------[] + +;memory model aliases, for the convenience of building the library + +IFDEF __s__ +__SMALL__ equ 1 +ENDIF + +IFDEF __c__ +__COMPACT__ equ 1 +ENDIF + +IFDEF __m__ +__MEDIUM__ equ 1 +ENDIF + +IFDEF __l__ +__LARGE__ equ 1 +ENDIF + +IFDEF __h__ +__HUGE__ equ 1 +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 + +;bit masks to extract default pointer types from MMODEL (at run-time) +FCODE equ 8000h +FDATA equ 4000h + +IFDEF __TINY__ ; Small Code - Small Data + LPROG equ false + LDATA equ false + MMODEL equ 0 + _DSSTACK_ equ <> +ENDIF + +IFDEF __SMALL__ ; Small Code - Small Data + LPROG equ false + LDATA equ false + MMODEL equ 1 + _DSSTACK_ equ <> +ENDIF + +IFDEF __MEDIUM__ ; Large Code - Small Data + LPROG equ true + LDATA equ false + MMODEL equ FCODE+2 + _DSSTACK_ equ <> +ENDIF + +IFDEF __COMPACT__ ; Small Code - Large Data + LPROG equ false + LDATA equ true + MMODEL equ FDATA+3 +ENDIF + +IFDEF __LARGE__ ; Large Code - Large Data + LPROG equ true + LDATA equ true + MMODEL equ FCODE+FDATA+4 +ENDIF + +IFDEF __HUGE__ ; Large Code - Large Data + LPROG equ true + LDATA equ true + MMODEL equ FCODE+FDATA+5 +ENDIF + +IF LPROG + DIST equ FAR +ELSE + DIST equ NEAR +ENDIF + + PAGE +;[]------------------------------------------------------------[] +;| | +;| Segment Declarations Macros | +;| | +;[]------------------------------------------------------------[] + +Code_Seg@ MACRO ;; Open a Code Segment +IFDEF __WINDOWS__ +_TEXT SEGMENT WORD PUBLIC 'CODE' +ELSE +_TEXT SEGMENT BYTE PUBLIC 'CODE' +ENDIF + ASSUME CS:_TEXT + ENDM + +Code_EndS@ MACRO ;; Close a Code Segment +_TEXT ENDS + ENDM + +Data_Seg@ MACRO ;; Open a Data Segment (initialized) +_DATA SEGMENT WORD PUBLIC 'DATA' + ENDM + +Data_EndS@ MACRO ;; Close a Data Segment (initialized) +_DATA ENDS + ENDM + +IFNDEF __HUGE__ + BSS_Seg@ MACRO ;; Open a Data Segment (un-initialized) + _BSS SEGMENT WORD PUBLIC 'BSS' + ENDM + + BSS_EndS@ MACRO ;; Close a Data Segment (un-initialized) + _BSS ENDS + ENDM +ENDIF + +FarData_Seg@ MACRO ;; Open a FAR Data Segment +_FARDATA SEGMENT PARA PUBLIC 'FAR_DATA' + ENDM + +FarData_EndS@ MACRO ;; Close a FAR Data Segment +_FARDATA ENDS + ENDM + +FarBSS_Seg@ MACRO ;; Open a FAR BSS Segment +_FARBSS SEGMENT PARA PUBLIC 'FAR_BSS' + ENDM + +FarBSS_EndS@ MACRO ;; Close a FAR BSS Segment +_FARBSS ENDS + ENDM + +Const_Seg@ MACRO ;; Open a CONST Segment +_CONST SEGMENT WORD PUBLIC 'CONST' + ENDM + +Const_EndS@ MACRO ;; Close a CONST Segment +_CONST ENDS + ENDM + +Init_Seg@ MACRO ;; Open a INIT Segment +_INIT_ SEGMENT WORD PUBLIC 'INITDATA' + ENDM + +Init_EndS@ MACRO ;; Close a INIT Segment +_INIT_ ENDS + ENDM + +Exit_Seg@ MACRO ;; Open a EXIT Segment +_EXIT_ SEGMENT WORD PUBLIC 'EXITDATA' + ENDM + +Exit_EndS@ MACRO ;; Close a EXIT Segment +_EXIT_ ENDS + ENDM + +CVT_Seg@ MACRO +_CVTSEG SEGMENT WORD PUBLIC 'DATA' + ENDM + +CVT_EndS@ MACRO +_CVTSEG ENDS + ENDM + +SCN_Seg@ MACRO +_SCNSEG SEGMENT WORD PUBLIC 'DATA' + ENDM + +SCN_EndS@ MACRO +_SCNSEG ENDS + ENDM + +Header@ MACRO +Code_Seg@ +Code_EndS@ +Data_Seg@ +Data_EndS@ +BSS_Seg@ +BSS_EndS@ + ASSUME CS:_TEXT, DS:DGROUP + ENDM + +;[]------------------------------------------------------------[] +;| | +;| Segment Definitions | +;| | +;[]------------------------------------------------------------[] + +IFDEF __C0__ + +IFDEF __WINDOWS__ +_TEXT SEGMENT WORD PUBLIC 'CODE' + ENDS +ELSE +_TEXT SEGMENT BYTE PUBLIC 'CODE' + ENDS +ENDIF + +_FARDATA SEGMENT PARA PUBLIC 'FAR_DATA' + ENDS + +_FARBSS SEGMENT PARA PUBLIC 'FAR_BSS' + ENDS + +IFNDEF __WINDOWS__ + IFNDEF __TINY__ + _OVERLAY_ SEGMENT PARA PUBLIC 'OVRINFO' + ENDS + _1STUB_ SEGMENT PARA PUBLIC 'STUBSEG' + ENDS + ENDIF +ENDIF + +IFDEF __WINDOWS__ +NULL SEGMENT PARA PUBLIC 'BEGDATA' + ENDS +ENDIF + +_DATA SEGMENT PARA PUBLIC 'DATA' + ENDS + ENDS + +_CONST SEGMENT WORD PUBLIC 'CONST' + ENDS + +IFDEF __WINDOWS__ +_FPSEG SEGMENT WORD PUBLIC 'DATA' + ENDS +ENDIF + +_CVTSEG SEGMENT WORD PUBLIC 'DATA' + ENDS + +_SCNSEG SEGMENT WORD PUBLIC 'DATA' + ENDS + +_INIT_ SEGMENT WORD PUBLIC 'INITDATA' +InitStart label byte + ENDS +_INITEND_ SEGMENT BYTE PUBLIC 'INITDATA' +InitEnd label byte + ENDS + +_EXIT_ SEGMENT WORD PUBLIC 'EXITDATA' +ExitStart label byte + ENDS +_EXITEND_ SEGMENT BYTE PUBLIC 'EXITDATA' +ExitEnd label byte + ENDS + +IFNDEF __HUGE__ +_BSS SEGMENT WORD PUBLIC 'BSS' +BeginBSS label byte + ENDS +_BSSEND SEGMENT BYTE PUBLIC 'BSSEND' +EndBSS label byte + ENDS +ENDIF + + +IFDEF __WINDOWS__ + + IFDEF __HUGE__ + DGROUP GROUP NULL,_DATA,_CONST,_FPSEG,_CVTSEG,_SCNSEG,_INIT_,_INITEND_,_EXIT_,_EXITEND_ + ELSE + DGROUP GROUP NULL,_DATA,_CONST,_FPSEG,_CVTSEG,_SCNSEG,_INIT_,_INITEND_,_EXIT_,_EXITEND_,_BSS,_BSSEND + ENDIF + +ELSE + +IFNDEF __NOFLOAT__ + IF LDATA + IFDEF __HUGE__ + DGROUP GROUP _DATA,_CONST,_CVTSEG,_SCNSEG,_INIT_,_INITEND_,_EXIT_,_EXITEND_ + ELSE + DGROUP GROUP _DATA,_CONST,_CVTSEG,_SCNSEG,_INIT_,_INITEND_,_EXIT_,_EXITEND_,_BSS,_BSSEND + ENDIF + ELSE + IFDEF __TINY__ + DGROUP GROUP _TEXT,_DATA,_CONST,_CVTSEG,_SCNSEG,_INIT_,_INITEND_,_EXIT_,_EXITEND_,_BSS,_BSSEND + ELSE + DGROUP GROUP _DATA,_CONST,_CVTSEG,_SCNSEG,_INIT_,_INITEND_,_EXIT_,_EXITEND_,_BSS,_BSSEND + ENDIF + ENDIF +ELSE + IF LDATA + IFDEF __HUGE__ + DGROUP GROUP _DATA,_CONST,_CVTSEG,_SCNSEG,_INIT_,_INITEND_,_EXIT_,_EXITEND_ + ELSE + DGROUP GROUP _DATA,_CONST,_CVTSEG,_SCNSEG,_BSS,_BSSEND + ENDIF + ELSE + IFDEF __TINY__ + DGROUP GROUP _TEXT,_DATA,_CONST,_CVTSEG,_SCNSEG,_INIT_,_INITEND_,_EXIT_,_EXITEND_,_BSS,_BSSEND + ELSE + DGROUP GROUP _DATA,_CONST,_CVTSEG,_SCNSEG,_INIT_,_INITEND_,_EXIT_,_EXITEND_,_BSS,_BSSEND + ENDIF + ENDIF +ENDIF ; __NOFLOAT__ + +ENDIF ; __WINDOWS__ + +ELSE + +Code_Seg@ +Code_EndS@ +Data_Seg@ +Data_EndS@ +DGROUP GROUP _DATA + +ENDIF ; __C0__ + + PAGE +;[]------------------------------------------------------------[] +;| | +;| Old Segment Declarations Macros | +;| | +;[]------------------------------------------------------------[] + + +CSeg@ MACRO ;; Open a Code Segment +IFDEF __WINDOWS__ +_TEXT SEGMENT WORD PUBLIC 'CODE' +ELSE +_TEXT SEGMENT BYTE PUBLIC 'CODE' +ENDIF + 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 +IFDEF __WINDOWS__ +_TEXT SEGMENT WORD PUBLIC 'CODE' +ELSE +_TEXT SEGMENT BYTE PUBLIC 'CODE' +ENDIF +_TEXT ENDS +_DATA SEGMENT WORD PUBLIC 'DATA' +_DATA ENDS +IFDEF __BSS__ + IFNDEF __HUGE__ + _BSS SEGMENT WORD PUBLIC 'BSS' + _BSS ENDS + ENDIF +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 + +; 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 + +.LIST