; *******************************************************
; *                                                     *
; *     VERSION CONTROL EQUATES                         *
; *                                                     *
; *******************************************************

; Boolean values

FALSE           EQU     0
TRUE            EQU     NOT FALSE

; Version equates

    IFDEF _Windows_
WindowsVersion  EQU     TRUE
DPMIVersion     EQU     FALSE
    ELSE
    IFDEF _DPMI_
WindowsVersion  EQU     FALSE
DPMIVersion     EQU     TRUE
    ELSE
WindowsVersion  EQU     FALSE
DPMIVersion     EQU     FALSE
    ENDIF
    ENDIF

; *******************************************************
; *                                                     *
; *     MACROS                                          *
; *                                                     *
; *******************************************************

        LOCALS  @@

; Public variable definition macro

VAR MACRO Symbol,SType,Count
  PUBLIC Symbol
  Symbol LABEL SType
  IF Count
    DB SType * Count DUP(?)
  ENDIF
ENDM

; Parameter definition macro

ARG MACRO Symbol,SType,Count
  LOCAL Offset
  @AP = @AP + SType * Count
  Offset = @AP
  Symbol EQU (SType PTR [BP+@AF-Offset])
ENDM

@AP = 0
@AF = 0

; Local variables definition macro

LOC MACRO Symbol,SType,Count
  LOCAL Offset
  @LP = @LP + SType * Count
  Offset = @LP
  Symbol EQU (SType PTR [BP+@LF-Offset])
ENDM

@LP = 0
@LF = 0

; Stack frame modifiers

sfFar           EQU     01H             ;FAR frame
sfMarkBP        EQU     02H             ;Make saved BP odd
sfSaveDS        EQU     04H             ;Save DS at [BP-2]
sfInitDS        EQU     08H             ;Init DS using SS

; Default stack frame type

sfDefault = 0

; Stack frame types

    IF WindowsVersion
WINFAR          EQU     sfFar+sfMarkBP+sfSaveDS
    ELSE
WINFAR          EQU     sfFar
    ENDIF

; Entry code generation macro

ENTRY MACRO FrameType
  IFB <FrameType>
    @SF = sfDefault
  ELSE
    IFIDNI <FrameType>,<NEAR>
      @SF = 0
    ELSE
      IFIDNI <FrameType>,<FAR>
        @SF = sfFar
      ELSE
        @SF = FrameType
      ENDIF
    ENDIF
  ENDIF
  IF @SF AND sfMarkBP
    INC BP
  ENDIF
  PUSH BP
  MOV BP,SP
  IF @SF AND sfFar
    @AF = @AP + 6
  ELSE
    @AF = @AP + 4
  ENDIF
  IF @SF AND sfSaveDS
    PUSH DS
    @LF = -2
  ELSE
    @LF = 0
  ENDIF
  IF @LP
    SUB SP,@LP
  ENDIF
  IF @SF AND sfInitDS
    PUSH DS
    PUSH SS
    POP DS
  ENDIF
ENDM

; Exit code generation macro

EXIT MACRO ArgSize
  IF @SF AND sfInitDS
    POP DS
  ENDIF
  IF @LF - @LP
    MOV SP,BP
  ENDIF
  POP BP
  IF @SF AND sfMarkBP
    DEC BP
  ENDIF
  IFNB <ArgSize>
    @AP = ArgSize
  ENDIF
  IF @SF AND sfFar
    RETF @AP
  ELSE
    RETN @AP
  ENDIF
  @AP = 0
  @LP = 0
ENDM

; *******************************************************
; *                                                     *
; *     EQUATES                                         *
; *                                                     *
; *******************************************************

; 10-Byte record

b0              EQU     (BYTE PTR 0)
b1              EQU     (BYTE PTR 1)
b2              EQU     (BYTE PTR 2)
b3              EQU     (BYTE PTR 3)
b4              EQU     (BYTE PTR 4)
b5              EQU     (BYTE PTR 5)
b6              EQU     (BYTE PTR 6)
b7              EQU     (BYTE PTR 7)
b8              EQU     (BYTE PTR 8)
b9              EQU     (BYTE PTR 9)

; 5-Word record

w0              EQU     (WORD PTR 0)
w2              EQU     (WORD PTR 2)
w4              EQU     (WORD PTR 4)
w6              EQU     (WORD PTR 6)
w8              EQU     (WORD PTR 8)

; Pointer record

ofs             EQU     (WORD PTR 0)
seg             EQU     (WORD PTR 2)

; 8087 status word masks

mIE             EQU     0001H
mDE             EQU     0002H
mZE             EQU     0004H
mOE             EQU     0008H
mUE             EQU     0010H
mPE             EQU     0020H
mC0             EQU     0100H
mC1             EQU     0200H
mC2             EQU     0400H
mC3             EQU     4000H

; ASCII equates

bell            EQU     07H
bs              EQU     08H
tab             EQU     09H
lf              EQU     0AH
cr              EQU     0DH
eof             EQU     1AH
esc             EQU     1BH
del             EQU     7FH

; DOS interrupt vector number

DOS             EQU     21H

; DOS function codes

dosSetDrive     EQU     0EH
dosGetDrive     EQU     19H
dosSetDTA       EQU     1AH
dosSetInt       EQU     25H
dosParse        EQU     29H
dosGetDate      EQU     2AH
dosSetDate      EQU     2BH
dosGetTime      EQU     2CH
dosSetTime      EQU     2DH
dosGetVersion   EQU     30H
dosGetInt       EQU     35H
dosCreateDir    EQU     39H
dosRemoveDir    EQU     3AH
dosSetDir       EQU     3BH
dosCreate       EQU     3CH
dosOpen         EQU     3DH
dosClose        EQU     3EH
dosRead         EQU     3FH
dosWrite        EQU     40H
dosDelete       EQU     41H
dosSeek         EQU     42H
dosAttrib       EQU     43H
dosIOCtl        EQU     44H
dosGetDir       EQU     47H
dosSetMem       EQU     4AH
dosExec         EQU     4BH
dosExit         EQU     4CH
dosGetExit      EQU     4DH
dosFindFirst    EQU     4EH
dosSetPSP       EQU     50H
dosGetPSP       EQU     51H
dosMakePSP      EQU     55H
dosRename       EQU     56H
dosFDate        EQU     57H

; Program segment prefix variables

pspMemTop       EQU     (WORD PTR 02H)
pspFileTab      EQU     (BYTE PTR 18H)
pspEnvSeg       EQU     (WORD PTR 2CH)
pspFCB1         EQU     (BYTE PTR 5CH)
pspFCB2         EQU     (BYTE PTR 6CH)
pspCmdLine      EQU     (BYTE PTR 80H)

; Free-list memory record layout

mNext           EQU     (DWORD PTR 0)
mSize           EQU     (DWORD PTR 4)
mRecSize        EQU     8

; File record layout

fHandle         EQU     (WORD PTR 0)
fMode           EQU     (WORD PTR 2)
fBufSize        EQU     (WORD PTR 4)
fPrivate        EQU     (WORD PTR 6)
fBufPos         EQU     (WORD PTR 8)
fBufEnd         EQU     (WORD PTR 10)
fBufPtr         EQU     (DWORD PTR 12)
fOpenProc       EQU     (DWORD PTR 16)
fInOutProc      EQU     (DWORD PTR 20)
fFlushProc      EQU     (DWORD PTR 24)
fCloseProc      EQU     (DWORD PTR 28)
fUserData       EQU     (BYTE PTR 32)
fName           EQU     (BYTE PTR 48)
fBuffer         EQU     (BYTE PTR 128)
fRecSize        EQU     256
fLFName         EQU     (BYTE PTR 256)
; fMode values

fmClosed        EQU     0D7B0H
fmInput         EQU     0D7B1H
fmOutput        EQU     0D7B2H
fmInOut         EQU     0D7B3H

; Overlay header record

ovSignature     EQU     (WORD PTR 0)
ovSaveReturn    EQU     (WORD PTR 2)
ovFilePos       EQU     (WORD PTR 4)
ovCodeSize      EQU     (WORD PTR 8)
ovFixupSize     EQU     (WORD PTR 10)
ovJumpCount     EQU     (WORD PTR 12)
ovLink          EQU     (WORD PTR 14)
ovSegment       EQU     (WORD PTR 16)
ovRetryCount    EQU     (WORD PTR 18)
ovNext          EQU     (WORD PTR 20)
ovEmsPage       EQU     (WORD PTR 22)
ovEmsOffset     EQU     (WORD PTR 24)
ovUserData      EQU     (BYTE PTR 26)
ovVectors       EQU     (BYTE PTR 32)
ovRecSize       EQU     32

; Windows data segment variables

pPtrCount       EQU     (WORD PTR DS:04H)
pLocalHeap      EQU     (WORD PTR DS:06H)
pAtomTable      EQU     (WORD PTR DS:08H)
pStackTop       EQU     (WORD PTR DS:0AH)
pStackBot       EQU     (WORD PTR DS:0CH)
pStackMin       EQU     (WORD PTR DS:0EH)

; DPMI interrupt vector

DPMI            EQU     31H

; DPMI function codes

dpmiGetDesc     EQU     0000H           ;Allocate descriptors
dpmiFreeDesc    EQU     0001H           ;Free descriptor
dpmiSegToDesc   EQU     0002H           ;Map segment to descriptor
dpmiGetSelInc   EQU     0003H           ;Get selector increment value
dpmiGetSegBase  EQU     0006H           ;Get segment base address
dpmiSetSegBase  EQU     0007H           ;Set segment base address
dpmiSetSegSize  EQU     0008H           ;Set segment size
dpmiGetRealInt  EQU     0200H           ;Get real mode int handler
dpmiSetRealInt  EQU     0201H           ;Set real mode int handler
dpmiGetExcept   EQU     0202H           ;Get exception handler
dpmiSetExcept   EQU     0203H           ;Set exception handler
dpmiGetInt      EQU     0204H           ;Get interrupt handler
dpmiSetInt      EQU     0205H           ;Set interrupt handler
dpmiGetRMCB     EQU     0303H           ;Get real mode call-back
dpmiGetVersion  EQU     0400H           ;Get version information

; Real mode call-back registers structure

realDI          EQU     (DWORD PTR 00H)
realSI          EQU     (DWORD PTR 04H)
realBP          EQU     (DWORD PTR 08H)
realBX          EQU     (DWORD PTR 10H)
realDX          EQU     (DWORD PTR 14H)
realCX          EQU     (DWORD PTR 18H)
realAX          EQU     (DWORD PTR 1CH)
realFlags       EQU     (WORD PTR 20H)
realES          EQU     (WORD PTR 22H)
realDS          EQU     (WORD PTR 24H)
realFS          EQU     (WORD PTR 26H)
realGS          EQU     (WORD PTR 28H)
realIP          EQU     (WORD PTR 2AH)
realCS          EQU     (WORD PTR 2CH)
realSP          EQU     (WORD PTR 2EH)
realSS          EQU     (WORD PTR 30H)
realRegsSize    EQU     32H
