Metropoli BBS
VIEWER: cmicro.mac MODE: TEXT (ASCII)
	.XLIST
	PAGE	58,132

; File that supports LATTICE macros But generates Microsoft C 
; segments or variables memX variable is declared in version.inc



	IFDEF	memS
LDATA	EQU	0
LPROG	EQU	0
	ENDIF
	IFDEF	memM
LDATA	EQU	0
LPROG	EQU	1
	ENDIF
	IFDEF	memC
LDATA	EQU	1
LPROG	EQU	0
	ENDIF
	IFDEF	memL
LDATA	EQU	1
LPROG	EQU	1
	ENDIF
	IFDEF	memH
LDATA	EQU	1
LPROG	EQU	1
	ENDIF


;**
;
; The following symbols are established via LPROG and LDATA as follows:
;
;	S8086	set for small model (small prog, small data)
;	D8086	set for model with large data, small prog
;	P8086	set for model with large prog, small data
;	L8086	set for large model
;
;**
	IF	(LPROG EQ 0) AND (LDATA EQ 0)
S8086	EQU	1
D8086	EQU 	0
P8086	EQU	0
L8086	EQU	0
	ENDIF

	IF	(LPROG EQ 0) AND (LDATA NE 0)
S8086	EQU	0
D8086	EQU	1
P8086	EQU	0
L8086	EQU	0
	ENDIF

	IF	(LPROG NE 0) AND (LDATA EQ 0)
S8086	EQU	0
D8086	EQU	0
P8086	EQU	1
L8086	EQU	0
	ENDIF

	IF	(LPROG NE 0) AND (LDATA NE 0)
S8086	EQU	0
D8086	EQU	0
P8086	EQU	0
L8086	EQU	1
	ENDIF


;**
;
; The DSEG and PSEG macros are defined to generate the appropriate GROUP
; and SEGMENT statements for the memory model being used.  The ENDDS and
; ENDPS macros are then used to end the segments.
;
;**

DSEG	MACRO	
DGROUP	GROUP	_DATA
_DATA	SEGMENT	WORD PUBLIC 'DATA'
	ASSUME	DS:DGROUP, SS:DGROUP
	ENDM
ENDDS	MACRO
_DATA	ENDS
	ENDM


PSEG	MACRO	modname

	IF	LPROG
modname&_TEXT	SEGMENT	WORD PUBLIC 'CODE'
	ASSUME  CS:modname&_TEXT
	ELSE
_TEXT	SEGMENT	WORD PUBLIC 'CODE'
	ASSUME	CS:_TEXT
	ENDIF
	ENDM

ENDPS	MACRO	modname
	IF	LPROG
modname&_TEXT	ENDS
	ELSE
_TEXT	ENDS
	ENDIF
	ENDM


;**
;
; The BEGIN and ENTRY macros establish appropriate function entry points
; depending on whether NEAR or FAR program addressing is being used.  The
; only difference between the two is that BEGIN generates a PROC operation
; to start a segment. 
;
BEGIN	MACRO	NAME			; begin a function
	PUBLIC  NAME
	IF	LPROG
NAME	PROC	FAR
	ELSE
NAME	PROC	NEAR
	ENDIF
	ENDM

ENTRY	MACRO	NAME
	PUBLIC	NAME
	IF	LPROG
NAME	LABEL	FAR
	ELSE
NAME	LABEL	NEAR
	ENDIF
	ENDM

;**
;
; The following symbols are defined to help set up a STRUC defining the
; stack frame:
;
;	CPSIZE -> code pointer size (2 or 4)
;	DPSIZE -> data pointer size (2 or 4)
;
; These wouldn't be necessary if it were possible to use macros or even
; conditionals within a STRUC.
;
	IF	LPROG
CPSIZE	EQU	4
	ELSE
CPSIZE	EQU	2
	ENDIF
	IF	LDATA
DPSIZE	EQU	4
	ELSE
DPSIZE	EQU	2
	ENDIF


penter	MACRO	dyns			; used when we enter a procedure
	push	BP			; save context register
	IF	dyns NE 0
	sub	SP, dyns		; local variables on stack
	ENDIF
	mov	BP, SP			;
	push	DI			; for register variables (MICROSOFT 'C' 3.0)
	push	SI			;
	ENDM				;

pleave	MACRO	dyns			; used when we leave a procedure
	pop	SI			;
	pop	DI			;
	IF	dyns NE 0
	add	SP, dyns		;
	ENDIF
	pop	BP			;
	ret				;
	ENDM				;


	.LIST

[ RETURN TO DIRECTORY ]