Files correlati : Ricompilazione Demo : [ ] Commento : Aggiunti i sorgenti per Greenleaf Math Library (gfm.dll) git-svn-id: svn://10.65.10.50/trunk@10079 c028cbd2-c16b-5b4b-a496-9718f37d4682
498 lines
13 KiB
C
Executable File
498 lines
13 KiB
C
Executable File
.xlist
|
|
; prologue.h - Macro Header for Microsoft C v3.0,4.0 & 5.x, ASM files.
|
|
;
|
|
; Copyright (C) 1984-1989 Greenleaf Software Inc. All rights reserved.
|
|
;
|
|
; Include this with all assembler modules, preceded by the proper
|
|
; version of MODEL.H to select the compiler and memory model.
|
|
;
|
|
; Modified 7/22/85 DK to add leading underscore char to names
|
|
; Modified 7/24/85 DN to add leading underscore char to alias label
|
|
;
|
|
;; David Nienhiser 11-JUN-1986 16:17:46.80
|
|
; Modified for Microsoft C 4.0, compact and huge memory models.
|
|
;; David Nienhiser 14-JUL-1986 16:58:23.77
|
|
; Added DefineVar and ReferVar macros & added LABEL option to
|
|
; ?cproc macro.
|
|
;; David Nienhiser 28-MAY-1987 10:06:18.71
|
|
; Added GetDsAx macro.
|
|
|
|
.xcref mesg,?cproc,?moderr
|
|
.cref
|
|
|
|
mesg macro txt
|
|
if1
|
|
%out txt
|
|
endif
|
|
endm
|
|
|
|
?moderr = 0
|
|
|
|
ifndef _MSC3
|
|
ifdef _MSC
|
|
_MSC3 equ 0
|
|
endif
|
|
endif
|
|
|
|
ifndef _MSC
|
|
ifdef _MSC3
|
|
_MSC equ 3
|
|
else
|
|
?moderr = 1
|
|
endif
|
|
else
|
|
if (_MSC ne 3) and (_MSC ne 4) and (_MSC ne 5)
|
|
?moderr = 1
|
|
endif
|
|
endif
|
|
|
|
ifndef _HUGE
|
|
_HUGE equ 0
|
|
endif
|
|
|
|
|
|
if _HUGE eq 1
|
|
if (_LCODE ne 1) or (_LDATA ne 1)
|
|
mesg <Options Conflict in Model.h>
|
|
?moderr = 1
|
|
endif
|
|
|
|
endif
|
|
|
|
if ?moderr eq 0
|
|
mesg <Greenleaf Software Prologue.h Version 4.04 23-JUN-1988>
|
|
if _MSC eq 3
|
|
mesg <Microsoft C Version 3.0>
|
|
endif
|
|
|
|
if (_MSC eq 4) or (_MSC eq 5)
|
|
mesg <Microsoft C Version 5 / Quick-C>
|
|
endif
|
|
mesg <Copyright (C) 1985-1989 Greenleaf Software Inc. All rights reserved>
|
|
|
|
if (_LCODE eq 0) and (_LDATA eq 0) and (_HUGE eq 0);;Small Model
|
|
mesg <Small Memory Model>
|
|
endif
|
|
|
|
if (_LCODE eq 0) and (_LDATA ne 0) and (_HUGE eq 0);;
|
|
mesg <Compact Memory Model>
|
|
endif
|
|
|
|
if (_LCODE ne 0) and (_LDATA eq 0) and (_HUGE eq 0);;Medium Model
|
|
mesg <Medium Memory Model>
|
|
endif
|
|
|
|
if (_LCODE ne 0) and (_LDATA ne 0) and (_HUGE eq 0);;Large Model
|
|
mesg <Large Memory Model>
|
|
endif
|
|
|
|
if (_LCODE ne 0) and (_LDATA ne 0) and (_HUGE ne 0);;Huge Model
|
|
mesg <Huge Memory Model>
|
|
endif
|
|
|
|
|
|
; Argument Base address on stack:
|
|
;
|
|
if _LCODE
|
|
@ab equ 6 ; arg offset if far call
|
|
parm1_ equ [bp+6]
|
|
parm2_ equ [bp+8]
|
|
parm3_ equ [bp+10]
|
|
parm4_ equ [bp+12]
|
|
parm5_ equ [bp+14]
|
|
parm6_ equ [bp+16]
|
|
parm7_ equ [bp+18]
|
|
parm8_ equ [bp+20]
|
|
parm9_ equ [bp+22]
|
|
parm10_ equ [bp+24]
|
|
parm11_ equ [bp+26]
|
|
parm12_ equ [bp+28]
|
|
parm14_ equ [bp+30]
|
|
else
|
|
@ab equ 4 ; ..if near call
|
|
parm1_ equ [bp+4]
|
|
parm2_ equ [bp+6]
|
|
parm3_ equ [bp+8]
|
|
parm4_ equ [bp+10]
|
|
parm5_ equ [bp+12]
|
|
parm6_ equ [bp+14]
|
|
parm7_ equ [bp+16]
|
|
parm8_ equ [bp+18]
|
|
parm9_ equ [bp+20]
|
|
parm10_ equ [bp+22]
|
|
parm11_ equ [bp+24]
|
|
parm12_ equ [bp+26]
|
|
parm13_ equ [bp+28]
|
|
parm14_ equ [bp+30]
|
|
endif
|
|
|
|
if _LDATA
|
|
ptrsize equ 2 ; Number of words in pointer
|
|
else
|
|
ptrsize equ 1
|
|
endif
|
|
|
|
|
|
; The DSEG and PSEG macros are defined to generate the appropriate GROUP
|
|
; and SEGMENT statements for the compiler and memory model in use.
|
|
; In addition, ENDDS and ENDPS are used to end these segments.
|
|
;
|
|
pseg macro segname
|
|
|
|
ifb <segname>
|
|
mesg <Missing Segment Name on pseg macro>
|
|
error
|
|
endif
|
|
|
|
if (_LCODE eq 0) ;; Small Model Program Segment
|
|
_TEXT segment byte public 'CODE'
|
|
assume cs:_TEXT
|
|
|
|
endps ¯o
|
|
_TEXT ends
|
|
purge endps
|
|
&endm
|
|
endif
|
|
|
|
if (_LCODE ne 0) ;; Medium or Large model
|
|
segname&_TEXT segment byte public 'CODE'
|
|
assume cs:&segname&_TEXT
|
|
|
|
endps ¯o
|
|
segname&_TEXT ends
|
|
purge endps
|
|
&endm
|
|
endif
|
|
|
|
endm ;;pseg
|
|
|
|
|
|
dseg macro
|
|
|
|
DGROUP group _DATA
|
|
_DATA segment word public 'DATA'
|
|
assume ds:DGROUP
|
|
|
|
endds ¯o
|
|
_DATA ends
|
|
purge endds
|
|
&endm
|
|
endm
|
|
|
|
GetDsAx macro
|
|
mov ax,DGROUP
|
|
endm
|
|
|
|
cproc macro name1,name2,name1s,name2s,storage,options
|
|
?N1L = 0
|
|
?N2L = 0
|
|
ifb <name1>
|
|
error label not specified
|
|
endif
|
|
irpc ?x,name1
|
|
?N1L = ?N1L + 1
|
|
endm
|
|
|
|
if ?N1L gt 8
|
|
ifb <name1s>
|
|
error short name for name1 not specified
|
|
else
|
|
??NS = 0
|
|
irpc ?x,name1s
|
|
??NS = ??NS + 1
|
|
endm
|
|
if ??NS gt 8
|
|
error name1s too long
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
ifnb <name2>
|
|
irpc ?x,name2
|
|
?N2L = ?N2L + 1
|
|
endm
|
|
if ?N2L gt 8
|
|
ifb <name2s>
|
|
error short name for name2 not specified
|
|
else
|
|
??NS = 0
|
|
irpc ?x,name2s
|
|
??NS = ??NS + 1
|
|
endm
|
|
if ??NS gt 8
|
|
error name2s too long
|
|
endif
|
|
endif
|
|
endif
|
|
endif
|
|
?cproc <name1>,<name2>,storage,<options>
|
|
endm ;; cproc
|
|
|
|
?cproc macro name1,name2,storage,options
|
|
public _&name1
|
|
ifnb <name2>
|
|
public _&name2
|
|
endif
|
|
if _LCODE
|
|
_&name1 proc far
|
|
ifnb <name2>
|
|
_&name2 label far
|
|
endif
|
|
else
|
|
_&name1 proc near
|
|
ifnb <name2>
|
|
_&name2 label near
|
|
endif
|
|
endif ;;_LCODE
|
|
|
|
??LRA = 0
|
|
??SDS = 0 ;; Save ds?
|
|
??SES = 0 ;; Save es?
|
|
??SSI = 1 ;; Default for push si
|
|
??SDI = 1 ;; Default for push di
|
|
??EXIT = 0 ;; exit point wanted?
|
|
??EREXIT = 0 ;; error exit point
|
|
??OKEXIT = 0 ;; OK Exit point
|
|
|
|
ifnb <options>
|
|
irp x,<options>
|
|
|
|
ifidn <x>,<LABEL>
|
|
if _LCODE
|
|
name1 label far
|
|
else
|
|
name1 label near
|
|
endif
|
|
endif
|
|
|
|
ifidn <x>,<LRA> ;; Leave registers alone
|
|
??LRA = 1
|
|
endif
|
|
ifidn <x>,<DS> ;; Save ds
|
|
??SDS = 1
|
|
endif
|
|
ifidn <x>,<ES> ;; Save es
|
|
??SES = 1
|
|
endif
|
|
ifidn <x>,<NOSI>
|
|
??SSI = 0
|
|
endif
|
|
ifidn <x>,<NODI>
|
|
??SDI = 0
|
|
endif
|
|
ifidn <x>,<EXIT>
|
|
??EXIT = 1
|
|
endif
|
|
ifidn <x>,<ERROREXIT>
|
|
??EREXIT = 1
|
|
??EXIT = 1
|
|
endif
|
|
ifidn <x>,<OKEXIT>
|
|
??OKEXIT = 1
|
|
??EXIT = 1
|
|
endif
|
|
|
|
endm
|
|
endif
|
|
|
|
if ??LRA eq 0
|
|
push bp
|
|
endif
|
|
|
|
ifnb <storage>
|
|
sub sp,storage
|
|
endif
|
|
|
|
if ??LRA eq 0
|
|
mov bp,sp
|
|
if ??SSI eq 1
|
|
push si
|
|
endif
|
|
if ??SDI eq 1
|
|
push di
|
|
endif
|
|
endif
|
|
if ??SDS eq 1
|
|
push ds
|
|
endif
|
|
if ??SES eq 1
|
|
push es
|
|
endif
|
|
|
|
cproce ¯o
|
|
|
|
if ??EXIT eq 1
|
|
name1&exit:
|
|
endif
|
|
if ??SES eq 1
|
|
pop es
|
|
endif
|
|
if ??SDS eq 1
|
|
pop ds
|
|
endif
|
|
if ??LRA eq 0
|
|
if ??SDI eq 1
|
|
pop di
|
|
endif
|
|
if ??SSI eq 1
|
|
pop si
|
|
endif
|
|
endif
|
|
ifnb <storage>
|
|
add sp,storage
|
|
endif
|
|
if ??LRA eq 0
|
|
pop bp
|
|
endif
|
|
ret
|
|
if ??OKEXIT eq 1
|
|
name1&success: xor ax,ax
|
|
jmp name1&exit
|
|
endif
|
|
if ??EREXIT eq 1
|
|
name1&error: mov ax,-1
|
|
jmp name1&exit
|
|
endif
|
|
|
|
_&name1 endp
|
|
purge cproce
|
|
&endm
|
|
|
|
funcerror ¯o
|
|
jmp name1&error
|
|
&endm
|
|
funcok ¯o
|
|
jmp name1&success
|
|
&endm
|
|
funcexit ¯o
|
|
jmp name1&exit
|
|
&endm
|
|
|
|
endm ;; ?cproc
|
|
|
|
|
|
ReferFunc macro name
|
|
if _LCODE
|
|
extrn _&name:far
|
|
else
|
|
extrn _&name:near
|
|
endif
|
|
name equ _&name
|
|
endm
|
|
|
|
DefineVar macro name,type,value
|
|
ifb <type>
|
|
error Type missing on DefineVAr
|
|
endif
|
|
ifb <value>
|
|
error Value missing on DefineVar
|
|
endif
|
|
|
|
ifnb <name>
|
|
public _&name
|
|
endif
|
|
|
|
ifidn <type>,<cByte>
|
|
ifnb <name>
|
|
_&name db value
|
|
else
|
|
db value
|
|
endif
|
|
endif
|
|
|
|
ifidn <type>,<cWord>
|
|
ifnb <name>
|
|
_&name dw value
|
|
else
|
|
dw value
|
|
endif
|
|
endif
|
|
|
|
|
|
ifidn <type>,<cLong>
|
|
ifnb <name>
|
|
_&name dd value
|
|
else
|
|
dd value
|
|
endif
|
|
endif
|
|
|
|
|
|
ifidn <type>,<cDataPointer>
|
|
if _LDATA
|
|
ifnb <name>
|
|
_&name dd value
|
|
else
|
|
dd value
|
|
endif
|
|
else
|
|
ifnb <name>
|
|
_&name dw value
|
|
else
|
|
dw value
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
ifidn <type>,<cFuncPointer>
|
|
if _LCODE
|
|
ifnb <name>
|
|
_&name dd value
|
|
else
|
|
dd value
|
|
endif
|
|
else
|
|
ifnb <name>
|
|
_&name dw value
|
|
else
|
|
dw value
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
ifnb <name>
|
|
name equ _&name
|
|
endif
|
|
endm
|
|
|
|
ReferVar macro name,type
|
|
ifb <name>
|
|
error Name missing on ReferVar
|
|
endif
|
|
ifb <type>
|
|
error Type missing on ReferVar
|
|
endif
|
|
ifidn <type>,<cByte>
|
|
extrn _&name:byte
|
|
endif
|
|
ifidn <type>,<cWord>
|
|
extrn _&name:word
|
|
endif
|
|
ifidn <type>,<cLong>
|
|
extrn _&name:dword
|
|
endif
|
|
ifidn <type>,<cDataPointer>
|
|
if _LDATA
|
|
extrn _&name:dword
|
|
else
|
|
extrn _&name:word
|
|
endif
|
|
endif
|
|
ifidn <type>,<cFuncPointer>
|
|
if _LCODE
|
|
extrn _&name:dword
|
|
else
|
|
extrn _&name:word
|
|
endif
|
|
endif
|
|
name equ _&name
|
|
endm
|
|
|
|
|
|
|
|
else
|
|
mesg <Incorrect Model.h file>
|
|
endif
|
|
|
|
.list
|