194 lines
3.4 KiB
Plaintext
194 lines
3.4 KiB
Plaintext
.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 PUBLIC 'CODE'
|
|
ASSUME CS:_CODE
|
|
ENDM
|
|
ENDPS MACRO
|
|
_CODE ENDS
|
|
ENDM
|
|
ENDIF
|
|
|
|
IF L8086
|
|
PSEG MACRO
|
|
_PROG SEGMENT BYTE PUBLIC 'PROG'
|
|
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
|
|
|
|
;
|
|
; The SETX macro sets the symbol X to 4 if LPROG is 0 or to 6 otherwise.
|
|
; X can then be used to skip past the BP and return address save area
|
|
; in the stack frame when accessing the function arguments.
|
|
;
|
|
SETX MACRO
|
|
IF LPROG
|
|
X EQU 6
|
|
ELSE
|
|
X EQU 4
|
|
ENDIF
|
|
ENDM
|
|
|
|
;
|
|
; The PEXTRN macro defines an external pointer in the data segment.
|
|
;
|
|
PEXTRN MACRO NAME
|
|
IF LDATA
|
|
EXTRN NAME:DWORD
|
|
ELSE
|
|
EXTRN NAME:WORD
|
|
ENDIF
|
|
ENDM
|
|
|
|
.LIST
|
|
|