	.XLIST
	PAGE	58,132
;**
;
; This macro library defines the operating environment for the 8086 S
; memory model, which allows 64Kbytes of data and 64Kbytes of program.
;
;**
MSDOS	EQU 	2

;**
;
; The following symbols define the 8086 memory mode being used.  Set LPROG
; to 1 for a large program segment (greater than 64K-bytes), and set LDATA
; to 1 for a large data segment.  Set COM to 1 to generate .COM files
; instead of .EXE files.  Note that if COM is not zero, then LPROG and
; LDATA must be 0.
;
;**
COM	EQU	0
LPROG	EQU	0
LDATA	EQU	0

;**
;
; 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
	ENDM
ENDDS	MACRO
DATA	ENDS
	ENDM

	IF	S8086
PSEG	MACRO
PGROUP	GROUP	PROG
PROG	SEGMENT	BYTE PUBLIC 'PROG'
	ASSUME	CS:PGROUP
	ENDM
ENDPS	MACRO
PROG	ENDS
	ENDM
	ENDIF

	IF	D8086
PSEG	MACRO
CGROUP	GROUP	CODE
CODE	SEGMENT	BYTE PUBLIC 'CODE'
	ASSUME	CS:CGROUP
	ENDM
ENDPS	MACRO
CODE	ENDS
	ENDM
	ENDIF

	IF	P8086
PSEG	MACRO
_CODE	SEGMENT	BYTE
	ASSUME  CS:_CODE
	ENDM
ENDPS	MACRO
_CODE	ENDS
	ENDM
	ENDIF

	IF	L8086
PSEG	MACRO
_PROG	SEGMENT	BYTE
	ASSUME	CS:_PROG
	ENDM
ENDPS	MACRO
_PROG	ENDS
	ENDM
	ENDIF

;**
;
; 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
	.LIST
