developer-toolkit-v1.01/installed/MODEL2.MAC
UTF-8 rendering of a DOS-encoded (CP437 / CRLF) file. Byte-for-byte original:
MODEL2.MAC.
;-----------------------------------------------------------------------
; (C)Copyright Microsoft Corporation, 1984, 1985, 1986
;
; Modified version for Adlib. 1990
;
;--------------------------------------------------------------------------
memS equ 0 ; small model
memM equ 0 ; medium model
memC equ 0 ; compact model
memL equ 1 ; large model
memH equ 0 ; huge model
IF memS
LDATA EQU 0
LPROG EQU 0
ENDIF
IF memM
LDATA EQU 0
LPROG EQU 1
ENDIF
IF memC
LDATA EQU 1
LPROG EQU 0
ENDIF
IF memL
LDATA EQU 1
LPROG EQU 1
ENDIF
IF memH
LDATA EQU 1
LPROG EQU 1
ENDIF
; near DATA segement, for each models:
DATAS MACRO
_DATA SEGMENT WORD PUBLIC 'DATA'
ENDM
EDATAS MACRO
_DATA ENDS
ENDM
DATA?S MACRO
_BSS SEGMENT WORD PUBLIC 'BSS'
ENDM
EDATA?S MACRO
_BSS ENDS
ENDM
CONSTS MACRO
CONST SEGMENT WORD PUBLIC 'CONST'
ENDM
ECONSTS MACRO
CONST ENDS
ENDM
STACKS MACRO
STACK SEGMENT PARA STACK 'STACK'
ENDM
ESTACKS MACRO
STACK ENDS
ENDM
CODES MACRO name
IF memS OR memC
_TEXT SEGMENT WORD PUBLIC 'CODE'
ASSUME CS: _TEXT
ENDIF
IF memM OR memL OR memH
name&_TEXT SEGMENT WORD PUBLIC 'CODE'
ASSUME CS: name&_TEXT
ENDIF
ENDM
ECODES MACRO name
IF memS OR memC
_TEXT ENDS
ENDIF
IF memM OR memL OR memH
name&_TEXT ENDS
ENDIF
ENDM
;-------------------------------- EXTERN -----------------------------------
EXTERN MACRO name
IF LPROG
extrn &name: far
ELSE
extrn &name: near
ENDIF
ENDM
;-------------------------------- BEGIN ------------------------------------
;**
;
; 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 ------------------------------------
ENTRY MACRO name
PUBLIC NAME
IF LPROG
name LABEL FAR
ELSE
name LABEL NEAR
ENDIF
ENDM
;-------------------------------- MCALL ------------------------------------
MCALL MACRO name
IF LPROG
call far ptr name
ELSE
call name
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 -----------------------------------
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 -----------------------------------
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 ;