--- /dev/null
+if1
+LARGE equ 1 ; define your memory model here
+
+ifdef SMALL
+ ; default, so do nothing
+ else
+
+ifdef MEDIUM
+ LARGE_CODE equ 1
+ else
+
+ifdef COMPACT
+ LARGE_DATA equ 1
+ else
+
+ifdef LARGE
+ LARGE_DATA equ 1
+ LARGE_CODE equ 1
+
+else
+ %out No memory model defined--assuming SMALL
+
+endif ; LARGE
+endif ; COMPACT
+endif ; MEDIUM
+endif ; SMALL
+
+
+beginproc macro procname
+
+ifdef LARGE_CODE
+ procname proc far
+else
+ procname proc near
+endif ; LARGE_CODE
+
+ endm ; beginproc
+
+
+endif ; if1
+
+
+_TEXT SEGMENT BYTE PUBLIC 'CODE'
+_TEXT ENDS
+_DATA SEGMENT WORD PUBLIC 'DATA'
+_DATA ENDS
+CONST SEGMENT WORD PUBLIC 'CONST'
+CONST ENDS
+_BSS SEGMENT WORD PUBLIC 'BSS'
+_BSS ENDS
+
+DGROUP GROUP CONST, _BSS, _DATA
+ assume cs:_text, ds:dgroup, ss:dgroup, es:dgroup
+
+; define X as the offset of first argument on stack frame
+
+ifdef LARGE_CODE
+ X equ 6 ; return offset and segment + old BP
+else
+ X equ 4 ; return offset + old BP
+endif ; LARGE_CODE