home *** CD-ROM | disk | FTP | other *** search
- ; pcdecl.mac
- ;
- ; 3/3/88 by Ted
- ;
- ; Macros for PC assembly code.
- ;
- ; 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.
- ;------------------------------------------------------------------------------;
- ;-- ** Compiler selection ** -------;
- MSFT = 0
- TURB = 0
- LATC = 0
- MWHC = 0
- PHAR = 0
- ;-- ** Memory model selection ** ---;
- SMALL_MODEL = 0
- LPROG_MODEL = 0
- LDATA_MODEL = 0
- LARGE_MODEL = 0
- ;-----------------------------------;
- IFDEF M1 ; Microsoft C 5.1
- MSFT = 1
- ENDIF
- IFDEF M5 ; Microsoft C 5.0
- MSFT = 1
- ENDIF
- IFDEF M4 ; Microsoft C 4.0
- MSFT = 1
- ENDIF
- ;-------------------;
- IF MSFT
- 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
- ;-----------------------------------;
- IFDEF T2 ; Borland Turbo C 2.0
- TURB = 1
- ENDIF
- ;-------------------;
- IF TURB
- 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
- ;-----------------------------------;
- ; For Lattice -
- IFDEF LC ; Lattice C 4.0
- IF (LC GE 50)
- LATC = 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
- ;-----------------------------------;
- IFDEF MW ; MetaWare High C 1.4
- MWHC = 1
- ENDIF
- ;-------------------;
- IF MWHC
- PHAR = 1
- SMALL_MODEL = 1
- 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 MWHC
- 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 MWHC
- 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
- ;-----------------------------------;
- IF (MSFT) OR (TURB) OR (LATC) OR (MWHC)
- 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
- ENDIF
- ;------------------------------------------------------------------------------;
- ;-- ** Define "dseg" and "msname" macros ** ---;
- ;----------------------------------------------;
- IF (MSFT) OR (TURB)
- defdseg _DATA
-
- msname macro word1, msnam, word2
- word1 _&msnam word2
- endm
- ENDIF
- IF (LATC) OR (MWHC)
- defdseg DATA
-
- msname macro word1, msnam, word2
- word1 msnam word2
- endm
- ENDIF
- ;------------------------------------------------------------------------------;
- ;-- ** Define other macros ** --;
- ;-------------------------------;
- IF (PHAR)
- LOWMEG = 34h
- near_offs equ 8 ; Offset into stack frame for near
- far_offs equ 12 ; Offset into stack frame for far
- ELSE
- near_offs equ 4 ; Offset into stack frame for near
- far_offs equ 6 ; Offset into stack frame for far
- 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 ;; if makenear is not 0 that means a near function
- 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 ;; if makenear is not 0 that means a near function
- 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
- msname <> data_name <label dsize>
- msname public data_name <>
- endm
- ;-----------------------------------;
- extdata macro data_name, dsize ;extrn data declaration
- msname extrn data_name <:&dsize>
- msname <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
- ;------------------------------------------------------------------------------;
-