home *** CD-ROM | disk | FTP | other *** search
- ; pcdecl.mac
- ;
- ; 3/3/88 by Ted
- ;
- ; Macros for PC assembly code.
- ;
- ; OWL-PCA 1.2
- ; Copyright (c) 1988, 1989 Oakland Group Inc.
- ; ALL RIGHTS RESERVED
- ;
- ; There are a few variables in this file which select the memory model
- ; for which the code will be assembled.
- ;
- ; MAKE SURE THAT THE CORRECT MEMORY MODEL AND COMPILER ARE SELECTED.
- ;
- ;------------------------REVISION HISTORY--------------------------------------;
- ; 1/19/89 Ted Changed segment names for Lattice 3.0
- ; 6/30/89 ted Added Phar Lap support.
- ; 1/21/90 ted Removed ms 4.0 flag references, added Turbo C 3.0 support.
- ; 1/30/90 Ted Added Rational Systems DOS extender support.
- ; 2/15/90 jmd Added Watcom stuff
- ; 4/04/90 jsm Added Zortech and M6 stuff
- ; 4/08/90 ted Restructured.
- ; 4/16/90 ted Fixed Zortech stuff.
- ; 6/13/90 jmd Added flag for Turbo C++
- ; 6/21/90 ted Added flag for Watcom 8.0 '386
- ; 10/04/90 ted Added flag for Watcom 8.0 16-bit and Turbo C++.
- ; 12/06/90 ted Added flag for JPI Topspeed C.
- ;------------------------------------------------------------------------------;
- ;-- ** Compiler selection ** -------;
- MSFT = 0
- TURB = 0
- TCPP = 0
- LATC = 0
- MWHC = 0
- ZORT = 0
- WATC = 0
- WATC3 = 0
- JPIC = 0
- PHAR = 0
- RATL = 0
- ;-----------------------------------;
- IFDEF M1 ; Microsoft C 5.1
- MSFT = 1
- ENDIF
- IFDEF M5 ; Microsoft C 5.0
- MSFT = 1
- ENDIF
- IFDEF M6 ; Microsoft C 6.0
- MSFT = 1
- ENDIF
- ;-------------------;
- IFDEF T2 ; Borland Turbo C 2.0
- TURB = 1
- ENDIF
- IFDEF T3 ; Borland Turboc C 3.0
- TURB = 1
- ENDIF
- IFDEF TP ; Borland Turboc C++
- TCPP = 1
- ENDIF
- ;-------------------;
- ; For Lattice -
- IFDEF LC ; Lattice C 6.0
- IF (LC GE 50)
- LATC = 1
- ENDIF
- ENDIF
- ;-------------------;
- IFDEF MW ; MetaWare High C 1.4
- MWHC = 1
- ENDIF
- ;-------------------;
- IFDEF Z2 ; Zortech C 2.0
- ZORT = 1
- ENDIF
- ;-------------------;
- IFDEF W8 ; Watcom C 8.0
- WATC = 1
- ENDIF
- ;-------------------;
- IFDEF W3 ; Watcom C 8.0 '386
- WATC3 = 1
- ENDIF
- ;-------------------;
- IFDEF J1 ; JPI Topspeed C 1.06
- JPIC = 1
- ENDIF
- ;-----------------------------------;
- IFDEF RS ; Rational Systems '286 DOS extender
- RATL = 1
- ENDIF
- ;------------------------------------------------------------------------------;
- ;-- ** Memory model selection ** ---;
- SMALL_MODEL = 0
- LPROG_MODEL = 0
- LDATA_MODEL = 0
- LARGE_MODEL = 0
- ;-----------------------------------;
- IF (MSFT) OR (ZORT)
- IFDEF SMOD
- SMALL_MODEL = 1
- ENDIF
- IFDEF MMOD
- LPROG_MODEL = 1
- ENDIF
- IFDEF CMOD
- LDATA_MODEL = 1
- ENDIF
- IFDEF LMOD
- LARGE_MODEL = 1
- ENDIF
- ENDIF
- ;-------------------;
- IF (TURB) OR (TCPP) OR (WATC) OR (WATC3) OR (JPIC)
- IFDEF sMOD
- SMALL_MODEL = 1
- ENDIF
- IFDEF mMOD
- LPROG_MODEL = 1
- ENDIF
- IFDEF cMOD
- LDATA_MODEL = 1
- ENDIF
- IFDEF lMOD
- LARGE_MODEL = 1
- ENDIF
- ENDIF
- ;-------------------;
- IF (LATC)
- IFDEF sMOD
- SMALL_MODEL = 1
- ENDIF
- IFDEF pMOD
- LPROG_MODEL = 1
- ENDIF
- IFDEF dMOD
- LDATA_MODEL = 1
- ENDIF
- IFDEF lMOD
- LARGE_MODEL = 1
- ENDIF
- ENDIF
- ;-------------------;
- IF (MWHC)
- SMALL_MODEL = 1
- ENDIF
- ;-----------------------------------;
- IF (MWHC) OR (WATC3) ; Phar Lap '386 DOS Extender
- IF (SMALL_MODEL)
- PHAR = 1
- ENDIF
- ENDIF
- ;------------------------------------------------------------------------------;
- ;-- ** Set up FAR_DATA and FAR_PROC macros
- ;-----------------------------------;
- IF (LARGE_MODEL) OR (LDATA_MODEL)
- FAR_DATA = 1
- ELSE
- FAR_DATA = 0
- ENDIF
-
- IF (LARGE_MODEL) OR (LPROG_MODEL)
- FAR_PROC = 1
- ELSE
- FAR_PROC = 0
- ENDIF
- ;------------------------------------------------------------------------------;
- ;-- ** Set up "defdseg" and "defpseg" macros ** --;
- ;-------------------------------------------------;
- IF (PHAR)
- defdseg macro segname
- DSEG MACRO
- DGROUP GROUP segname
- segname SEGMENT DWORD PUBLIC USE32 'DATA'
- ASSUME DS:DGROUP
- ASSUME ES:DGROUP
- ASSUME FS:DGROUP
- ASSUME GS:DGROUP
- ENDM
- ;
- ENDDS MACRO
- segname ENDS
- ENDM
- endm
- ;-----------------------------------;
- defpseg macro segname
- PSEG MACRO
- CGROUP GROUP segname
- segname SEGMENT DWORD PUBLIC USE32 'CODE'
- ASSUME CS:CGROUP
- ENDM
-
- ENDPS MACRO
- segname ENDS
- ENDM
- endm
- ELSE ;; not PHAR
- defdseg macro segname
- DSEG MACRO
- DGROUP GROUP segname
- segname SEGMENT WORD PUBLIC 'DATA'
- ASSUME DS:DGROUP
- ASSUME ES:DGROUP
- ENDM
-
- ENDDS MACRO
- segname ENDS
- ENDM
- endm
- ;-----------------------------------;
- defpseg macro segname
- IF (FAR_PROC)
- PSEG MACRO
- segname&_TEXT SEGMENT BYTE PUBLIC 'CODE'
- ASSUME CS:&segname&_TEXT
- ENDM
-
- ENDPS MACRO
- segname&_TEXT ENDS
- ENDM
- ELSE
- PSEG MACRO
- _TEXT SEGMENT BYTE PUBLIC 'CODE'
- ASSUME CS:_TEXT
- ENDM
-
- ENDPS MACRO
- _TEXT ENDS
- ENDM
- ENDIF
- endm
- ENDIF
- ;------------------------------------------------------------------------------;
- ;-- ** Private segment Near/Far selection; define "pseg" macro ** ---;
- ;--------------------------------------------------------------------;
- donear = 1
- dofar = 0
- bad = 0
- ;-----------------------------------;
- IFDEF DIGSEG
- defpseg PCDIG
- DIGPRIV equ donear
- OWLPRIV equ bad ; If digseg defined, no owl funcs allowed in source.
- ELSE
- IFDEF OWLSEG
- defpseg OWL
- OWLPRIV equ donear
- DIGPRIV equ donear ; If owlseg defined, it may include dig code.
- ELSE
- defpseg ASM
- OWLPRIV equ dofar
- DIGPRIV equ dofar ; If no private seg defined, use far procs.
- ENDIF
- ENDIF
- ;------------------------------------------------------------------------------;
- ;-- ** Define "dseg" and "msname" macros ** ---;
- ;----------------------------------------------;
- IF (MSFT) OR (TURB) OR (TCPP) OR (ZORT) OR (WATC) OR (WATC3) OR (JPIC)
- defdseg _DATA
- msdname macro word1, msnam, word2
- word1 _&msnam word2
- endm
-
- msname macro word1, msnam, word2
- word1 _&msnam word2
- endm
- ELSE
- defdseg DATA
- msdname macro word1, msnam, word2
- word1 msnam word2
- endm
-
- msname macro word1, msnam, word2
- word1 msnam word2
- endm
- ENDIF
- ;------------------------------------------------------------------------------;
- ;-- ** Define other macros ** --;
- ;-------------------------------;
- IF (PHAR)
- near_offs equ 8 ; Offset into stack frame for near
- far_offs equ 10 ; Offset into stack frame for far
- LOWMEG = 34h
- ELSE
- near_offs equ 4 ; Offset into stack frame for near
- far_offs equ 6 ; Offset into stack frame for far
- ENDIF
- IF (RATL)
- DOS_IVECSEG = 10h ; selector for protected mode interrupt vector table
- .286p ; enable full 80286 instruction set
- ELSE
- DOS_IVECSEG = 0 ; seg for interrupt vector table
- ENDIF
- ;-----------------------------------;
- pubproc macro arg1, arg2, arg3 ;procedure header macro
-
- IFDIF <DIGPRIV>, <arg1> ; if arg 1 is not DIGPRIV
- IFDIF <OWLPRIV>, <arg1> ; if arg 1 is not OWLPRIV either
- pubprocsub dofar, arg1, <arg2>
- ELSE
- pubprocsub arg1, arg2, <arg3> ; arg 1 is OWLPRIV
- ENDIF
- ELSE
- pubprocsub arg1, arg2, <arg3> ; arg 1 is DIGPRIV
- ENDIF
- endm
- ;------------------;
- pubprocsub macro makenear, proc_name, args
-
- IF (FAR_PROC) AND NOT (makenear) ;; makenear != 0 means a near proc
- count = far_offs
- ELSE
- count = near_offs
- ENDIF
- irp tag,<args>
- IFDIF <tag>, <dptr>
- tag = count
- IF (PHAR)
- count = count + 4
- ELSE
- count = count + 2
- ENDIF
- ELSE
- IF (FAR_DATA)
- count = count + 2 ;; far address takes a 2-byte seg after offset
- ENDIF
- ENDIF
- endm
-
- IF (FAR_PROC) AND NOT (makenear) ;; makenear != 0 means a near proc
- msname <> proc_name <proc far>
- ELSE
- msname <> proc_name <proc near>
- ENDIF
- msname <public> proc_name <>
- endm
- ;-----------------------------------;
- endproc macro proc_name ;end procedure macro
- msname <> proc_name <endp>
- endm
- ;-----------------------------------;
- extproc macro proc_name ;external procedure declaration
- IF (FAR_PROC)
- msname extrn proc_name <:far>
- ELSE
- msname extrn proc_name <:near>
- ENDIF
- endm
- ;-----------------------------------;
- ocall macro proc_name ;call public function
- IF (FAR_PROC)
- msname <call far ptr> proc_name <>
- ELSE
- msname call proc_name <>
- ENDIF
- endm
- ;-----------------------------------;
- pubdata macro data_name, dsize ;public data declaration
- msdname <> data_name <label dsize>
- msdname public data_name <>
- endm
- ;-----------------------------------;
- extdata macro data_name, dsize ;extrn data declaration
- msdname extrn data_name <:&dsize>
- msdname <data_name&_ext equ> data_name <>
- endm
- ;-----------------------------------;
- pushm macro regs
- irp r,<regs>
- push r ;push register
- endm
- endm
- ;-----------------------------------;
- popm macro regs
- irp r,<regs>
- pop r ;pop register
- endm
- endm
- ;------------------------------------------------------------------------------;
-
-