Include RULES.ASI from every executable's dump file.
Having thought this over for a while, I've decided to stay with the "include
slice" model for now, due to various bugs and other reasons.
We need to compile for the 386 CPU, but this causes TASM to automatically
default every segment to 32-bit mode, which of course is not what we want (and
no, .MODEL USE16 sadly does not help either). Appending USE16 to every segment
declaration in all included files seems to work, but for some reason, this
messes up certain jump instructions. WTF? And even if it did work, we would
still have to do this for every single file we include.
The alternative would be to build proper libraries and let the linker merge
all the code. This would add a lot of unwarranted complexity to the build
process. Not to mention all the EXTERN statements we'd have to maintain.
Ultimately, all of the C runtime ASM code is going to vanish anyway once we've
completed the reduction step. Once we're there, we can simply link to the
original version of the library. These initial dumps are not pretty, and I see
no point in wasting time on making intermediary stages of development look
pretty.
Since including RULES.ASI from every slice seems a bit inefficient (and even
potentiall harmful, considering the age of the development tools we have to
work with), we'll only include it once at the top of every main dump file.
[Binary change] Relocations in TH01's REIIDEN.EXE, again.
2014-08-14 06:01:36 +00:00
|
|
|
; *Not* the original file. All segment-related code was removed in order to
|
|
|
|
; turn it into an includable slice.
|
|
|
|
|
|
|
|
;[]-----------------------------------------------------------------[]
|
|
|
|
;| RULES.ASI -- Rules & Structures for assembler |
|
|
|
|
;[]-----------------------------------------------------------------[]
|
|
|
|
|
|
|
|
; $Copyright: 1987$
|
|
|
|
|
|
|
|
;*** 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 __t__
|
|
|
|
__TINY__ equ 1
|
|
|
|
ENDIF
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
|
|
; 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
|
|
|
|
|
2014-11-09 12:18:19 +00:00
|
|
|
; Remainder of file only used for language denpendent
|
|
|
|
; initialization and trapping.
|
|
|
|
|
|
|
|
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 */
|
|
|
|
; No longer used!
|
|
|
|
;CW_DEFAULT equ (RC_NEAR+PC_64+IC_AFFINE+EM_UNDERFLOW+EM_INEXACT)
|
|
|
|
|
Include RULES.ASI from every executable's dump file.
Having thought this over for a while, I've decided to stay with the "include
slice" model for now, due to various bugs and other reasons.
We need to compile for the 386 CPU, but this causes TASM to automatically
default every segment to 32-bit mode, which of course is not what we want (and
no, .MODEL USE16 sadly does not help either). Appending USE16 to every segment
declaration in all included files seems to work, but for some reason, this
messes up certain jump instructions. WTF? And even if it did work, we would
still have to do this for every single file we include.
The alternative would be to build proper libraries and let the linker merge
all the code. This would add a lot of unwarranted complexity to the build
process. Not to mention all the EXTERN statements we'd have to maintain.
Ultimately, all of the C runtime ASM code is going to vanish anyway once we've
completed the reduction step. Once we're there, we can simply link to the
original version of the library. These initial dumps are not pretty, and I see
no point in wasting time on making intermediary stages of development look
pretty.
Since including RULES.ASI from every slice seems a bit inefficient (and even
potentiall harmful, considering the age of the development tools we have to
work with), we'll only include it once at the top of every main dump file.
[Binary change] Relocations in TH01's REIIDEN.EXE, again.
2014-08-14 06:01:36 +00:00
|
|
|
.LIST
|