.XLIST PAGE 58,132 ;** ; ; This macro library defines the operating environment for the 8086 L ; memory model, which allows 1M bytes of data and 1M bytes 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 1 LDATA EQU 1 ;** ; ; 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