// BC4 defines for PMC v1.01 by Tran (a.k.a Thomas Pytel).
#ifndef __PMC_H
#define __PMC_H
// Basic types
#define NULL 0
#define FALSE 0
#define TRUE 1
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned long DWORD;
typedef void * PTR;
typedef char * STR;
typedef int BOOL;
// General macros
#define loBYTE(w) ((BYTE)(w)))
#define hiBYTE(w) ((BYTE)((WORD)(w) >> 8))
#define loWORD(d) ((WORD)(d))
#define hiWORD(d) ((WORD)((DWORD)(d) >> 16))
#define makeWORD(l,h) ((WORD)((BYTE)(h) << 8) + (BYTE)(l))
#define makeDWORD(l,h) ((DWORD)((WORD)(h) << 16) + (WORD)(l))
#define max(a,b) (((a) > (b)) ? (a) : (b))
#define min(a,b) (((a) < (b)) ? (a) : (b))
#define mo(t,v) (*(t *)&(v))
#define rlp(d) ((PTR)((DWORD)(d) - database))
#define lnp(p) ((DWORD)(p) + database)
#define dcp(p) ((DWORD)(p) + code_data)
#define cdp(d) ((PTR)((DWORD)(d) + data_code))
#define SEGOFFtoPTR(so) (DWORDtoPTR (mo (DWORD, (so))))
#define segofftoPTR(o,s) (rlp (((WORD)(s) << 4) + (WORD)(o)))
#define PTRtooff(p) ((WORD)(lnp (p) & 0xf))
#define PTRtoseg(p) ((WORD)(lnp (p) >> 4))
#define PTRtoSEGOFF(so,p) (mo (DWORD, (so)) = PTRtoDWORD (p))
#define SEGOFFtoDWORD(so) (mo (DWORD, (so)))
#define segofftoDWORD makeDWORD
#define DWORDtooff loWORD
#define DWORDtoseg hiWORD
#define DWORDtoSEGOFF(so,d) (mo (DWORD, (so)) = (d))
#define PTRtoDWORD(p) (((lnp (p) & 0xffff0) << 12) + \
(lnp (p) & 0xf))
#define DWORDtoPTR(d) (rlp ((DWORDtoseg (d) << 4) + DWORDtooff (d)))
// Memory and addresses
typedef struct
{
WORD off;
WORD seg;
} SEGOFF;
typedef struct
{
DWORD off;
WORD sel;
} SELOFF;
typedef struct
{
DWORD base;
DWORD size;
DWORD handle;
} MEMBLOCK;
typedef struct
{
DWORD adx;
DWORD size;
BYTE RESTART : 1;
BYTE ALLOCATED : 1;
BYTE LASTAREA : 1;
BYTE CORRUPT : 1;
BYTE UNINIT : 1;
} WALKMBINF;
// Selectors and Descriptors
typedef struct
{
BYTE A : 1;
BYTE WR : 1;
BYTE EC : 1;
BYTE CD : 1;
BYTE must_be_1 : 1;
BYTE DPL : 2;
BYTE P : 1;
BYTE limit_h : 4;
BYTE AVL : 1;
BYTE must_be_0 : 1;
BYTE BD : 1;
BYTE G : 1;
} ACCESS;
typedef struct
{
WORD limit_l;
WORD base_l;
BYTE base_m;
WORD access;
BYTE base_h;
} DESCRIPTOR;
#define dscACCESS(dsc,v) ((*(ACCESS *)&((DESCRIPTOR)(dsc)).access).v)
// Register data structure
typedef struct
{
BYTE CF : 1;
BYTE : 1;
BYTE PF : 1;
BYTE : 1;
BYTE AF : 1;
BYTE : 1;
BYTE ZF : 1;
BYTE SF : 1;
BYTE : 1;
BYTE IF : 1;
BYTE DF : 1;
BYTE OF : 1;
} FLAGS;
typedef struct
{
DWORD EDI;
DWORD ESI;
DWORD EBP;
DWORD reserved0;
DWORD EBX;
DWORD EDX;
DWORD ECX;
DWORD EAX;
WORD reserved1[5];
DWORD CSIP;
DWORD SSSP;
} DWORDREGS;
typedef struct
{
WORD DI, reserved0;
WORD SI, reserved1;
WORD BP, reserved2;
WORD reserved3[2];
WORD BX, reserved4;
WORD DX, reserved5;
WORD CX, reserved6;
WORD AX, reserved7;
WORD FLAGS;
WORD ES;
WORD DS;
WORD FS;
WORD GS;
WORD IP;
WORD CS;
WORD SP;
WORD SS;
} WORDREGS;
typedef struct
{
BYTE reserved0[16];
BYTE BL, BH, reserved1[2];
BYTE DL, DH, reserved2[2];
BYTE CL, CH, reserved3[2];
BYTE AL, AH;
} BYTEREGS;
typedef union
{
DWORDREGS d;
WORDREGS w;
BYTEREGS b;
} REGSTRUCT;
#define rsFLAGS(rs,v) ((*(FLAGS *)&((REGSTRUCT)(rs)).w.flags).v)
#define fCF 0x0001
#define fPF 0x0004
#define fAF 0x0010
#define fZF 0x0040
#define fSF 0x0080
#define fIF 0x0200
#define fDF 0x0400
#define fOF 0x0800
#define fSTD (fCF | fPF | fZF | fSF | fOF)
// System variables
extern int _PMpagetables;
extern int _PMselectors;
extern int _PMrmstacklen;
extern int _PMpmstacklen;
extern int _PMrmstacks;
extern int _PMpmstacks;
extern int _PMcallbacks;
extern int _pmcrmstacklen;
extern int _pmcrmstacks;
extern int _rmcpmstacklen;
extern int _rmcpmstacks;
extern int _stklen;
extern int _lowheaplen;
extern int _extheapmin;
extern int _extheapmax;
extern int _minosversion;
extern PTR _lowbufptr;
extern int _lowbuflen;
extern DWORD codebase;
extern DWORD database;
extern DWORD pspbase;
extern DWORD envbase;
extern int codesel;
extern int datasel;
extern int pspsel;
extern int envsel;
extern int zerosel;
extern int _TEXTseg;
extern int _DATAseg;
extern int _BSSseg;
extern int pspseg;
extern int envseg;
extern PTR zeroptr;
extern DWORD data_code;
extern DWORD code_data;
extern int osversion;
extern BYTE osminor;
extern BYTE osmajor;
extern int DPMIversion;
extern BYTE DPMIminor;
extern BYTE DPMImajor;
extern int CPL;
extern int selinc;
extern int PMtype;
extern int processor;
extern BYTE PICtable[2];
extern BYTE PICmaster;
extern BYTE PICslave;
extern SEGOFF rmstate;
extern SEGOFF rmswitch;
extern SELOFF pmstate;
extern SELOFF pmswitch;
extern int statesize;
extern DWORD pmcrmnoregs;
extern DWORD pmcrmregs;
extern DWORD pmcrminoregs;
extern DWORD pmcrmiregs;
extern SEGOFF rmcpmnoregs;
extern SEGOFF rmcpmregs;
extern SEGOFF rmcpminoregs;
extern SEGOFF rmcpmiregs;
extern DWORD pmstacklen;
extern PTR pmstackbase;
extern PTR volatile pmstacktop;
extern int rmstacklen;
extern int rmstackbase;
extern int volatile rmstacktop;
extern MEMBLOCK lowheapblock;
extern MEMBLOCK extheapblock;
extern REGSTRUCT rs;
// DPMI function error codes
#define _DPMI09ERROR -32768
#define _DPMIUNSUPPORTED -32767
#define _DPMIBADSTATE -32766
#define _DPMISYSINTEGRITY -32765
#define _DPMIDEADLOCK -32764
#define _DPMICANCELLED -32763
#define _DPMINORESOURCE -32752
#define _DPMINODESCRIPTOR -32751
#define _DPMINOLINEARMEM -32750
#define _DPMINOPHYSICALMEM -32749
#define _DPMINOBACKINGSTORE -32748
#define _DPMINOCALLBACK -32747
#define _DPMINOHANDLE -32746
#define _DPMILOCKEXCEEDED -32745
#define _DPMIRESOURCEEXCLUSIVE -32744
#define _DPMIRESOURCESHARED -32743
#define _DPMIBADVALUE -32735
#define _DPMIBADSELECTOR -32734
#define _DPMIBADHANDLE -32733
#define _DPMIBADCALLBACK -32732
#define _DPMIBADLINEARADDRESS -32731
#define _DPMIBADREQUEST -32730
// DOS function error codes
#define _DOSBADFUNCTION -65535
#define _DOSBADFILE -65534
#define _DOSBADPATH -65533
#define _DOSNOHANDLES -65532
#define _DOSACCESSDENIED -65531
#define _DOSBADHANDLE -65530
#define _DOSNOMEM -65528
#define _DOSBADENV -65526
#define _DOSBADFORMAT -65525
#define _DOSBADACCESSCODE -65524
#define _DOSBADDRIVE -65521
#define _DOSCURRENTDIR -65520
#define _DOSNOTSAMEDEVICE -65519
#define _DOSNOMOREFILES -65518
// File open mode codes
#define RDONLY 0
#define WRONLY 1
#define RDWR 2
// File seek from codes
#define SEEK_SET 0
#define SEEK_CUR 1
#define SEEK_END 2
// File find attributes and mode
#define FA_NORMAL 0x00
#define FA_RDONLY 0x01
#define FA_HIDDEN 0x02
#define FA_SYSTEM 0x04
#define FA_LABEL 0x08
#define FA_DIREC 0x10
#define FA_ARCH 0x20
#define FF_FIRST 0x4e
#define FF_NEXT 0x4f
// IRQ mask values
#define IRQENABLED 0
#define IRQDISABLED 1
// Code stub types
#define RMSTUBINRI 0
#define RMSTUBINRC 1
#define RMSTUBFNRI 2
#define RMSTUBFNRC 3
#define RMSTUBIRI 4
#define RMSTUBIRC 5
#define RMSTUBFRI 6
#define RMSTUBFRC 7
#define RMSTUBNRLEN 0x20
#define RMSTUBRLEN 0xc0
#define PMSTUBLEN 0x48
#define CBSTUBLEN 0x38
// IRQ types
#define IRQI 0
#define IRQC 1
#define IRQOWN 2
#define IRQILEN RMSTUBNRLEN
#define IRQCLEN (RMSTUBNRLEN + PMSTUBLEN)
#define IRQOWNLEN 0
// Functions
#ifdef __cplusplus
extern "C" {
#endif
// DPMI functions
long __pascal dsc_alloc (WORD *sel, int count);
long __pascal dsc_free (WORD sel);
long __pascal dsc_getbase (WORD sel, DWORD *base);
long __pascal dsc_setbase (WORD sel, DWORD base);
long __pascal dsc_getlimit (WORD sel, DWORD *limit);
long __pascal dsc_setlimit (WORD sel, DWORD limit);
long __pascal dsc_getaccess (WORD sel, WORD *access);
long __pascal dsc_setaccess (WORD sel, WORD access);
long __pascal dsc_alias (WORD src, WORD *dst);
long __pascal dsc_getdsc (WORD sel, DESCRIPTOR *dsc);
long __pascal dsc_setdsc (WORD sel, DESCRIPTOR *dsc);
void __pascal iv_rmget (int intr, SEGOFF *iv);
void __pascal iv_rmset (int intr, WORD off, WORD seg);
void __pascal iv_pmget (int intr, SELOFF *iv);
long __pascal iv_pmset (int intr, DWORD off, WORD sel);
long __cdecl xlt_simrmint (int intr, REGSTRUCT *rs, int count, ...);
long __cdecl xlt_callrmfar (REGSTRUCT *rs, int count, ...);
long __cdecl xlt_callrmiret (REGSTRUCT *rs, int count, ...);
long __pascal xlt_rmcballoc (SEGOFF *cb, DWORD rsoff, WORD rssel, DWORD funcoff, WORD funcsel);
long __pascal xlt_rmcbfree (DWORD cbsegoff);
DWORD __pascal mb_info (void);
long __pascal mb_alloc (MEMBLOCK *mb, DWORD size);
long __pascal mb_free (MEMBLOCK *mb);
long __pascal mb_resize (MEMBLOCK *mb, DWORD size);
// Memory block functions
DWORD __pascal coreleft (void);
PTR __pascal malloc (DWORD size);
PTR __pascal realloc (PTR ptr, DWORD size);
void __pascal free (PTR ptr);
BOOL __pascal mbinit (MEMBLOCK *mb);
DWORD __pascal mbsquish (MEMBLOCK *mb);
void __pascal mbunsquish (MEMBLOCK *mb, DWORD size);
PTR __pascal mbmalloc (MEMBLOCK *mb, DWORD size);
PTR __pascal mbrealloc (MEMBLOCK *mb, PTR ptr, DWORD size);
void __pascal mbfree (MEMBLOCK *mb, PTR ptr);
DWORD __pascal mbcoreleft (MEMBLOCK *mb);
BOOL __pascal mbcheck (MEMBLOCK *mb);
DWORD __pascal mbgetsize (MEMBLOCK *mb, PTR ptr);
void __pascal mbwalk (MEMBLOCK *mb, WALKMBINF *inf);
#define locoreleft() (mbcoreleft (&lowheapblock))
#define lomalloc(size) (mbmalloc (&lowheapblock, size))
#define lorealloc(ptr, size) (mbrealloc (&lowheapblock, ptr, size))
#define lofree(ptr) (mbfree (&lowheapblock, ptr))
#define hicoreleft() (mbcoreleft (&extheapblock))
#define himalloc(size) (mbmalloc (&extheapblock, size))
#define hirealloc(ptr, size) (mbrealloc (&extheapblock, ptr, size))
#define hifree(ptr) (mbfree (&extheapblock, ptr))
// Memory functions
PTR __pascal memccpy (PTR dst, PTR src, int c, DWORD size);
BOOL __pascal memchk (PTR mem, int c, DWORD size);
PTR __pascal memchr (PTR mem, int c, DWORD size);
int __pascal memcmp (PTR mem1, PTR mem2, DWORD size);
PTR __pascal memcpy (PTR dst, PTR src, DWORD size);
int __pascal memicmp (PTR mem1, PTR mem2, DWORD size);
PTR __pascal memmove (PTR dst, PTR src, DWORD size);
PTR __pascal memset (PTR mem, int c, DWORD size);
#define movmem(src, dst, size) (void)memmove (dst, src, size)
#define setmem(dst, size, val) (void)memset (dst, val, size)
// String functions
STR __pascal stpcpy (STR dst, STR src);
STR __pascal strcat (STR dst, STR src);
STR __pascal strchr (STR str, int c);
int __pascal strcmp (STR str1, STR str2);
STR __pascal strcpy (STR dst, STR src);
DWORD __pascal strcspn (STR str1, STR str2);
STR __pascal strdup (STR str);
int __pascal stricmp (STR str1, STR str2);
DWORD __pascal strlen (STR str);
STR __pascal strlwr (STR str);
STR __pascal strncat (STR dst, STR src, DWORD maxlen);
int __pascal strncmp (STR str1, STR str2, DWORD maxlen);
STR __pascal strncpy (STR dst, STR src, DWORD maxlen);
int __pascal strnicmp (STR str1, STR str2, DWORD maxlen);
STR __pascal strnset (STR str, int c, DWORD maxlen);
STR __pascal strpbrk (STR str1, STR str2);
STR __pascal strrchr (STR str, int c);
STR __pascal strrev (STR str);
STR __pascal strset (STR str, int c);
DWORD __pascal strspn (STR str1, STR str2);
STR __pascal strstr (STR str1, STR str2);
STR __pascal strupr (STR str);
#define strcmpi(str1, str2) stricmp (str1, str2)
#define strncmpi(str1, str2, maxlen) strnicmp (str1, str2, maxlen)
// Intrinsic memory and string functions
PTR __memchr__ (PTR mem, int c, DWORD size);
int __memcmp__ (PTR mem1, PTR mem2, DWORD size);
PTR __memcpy__ (PTR dst, PTR src, DWORD size);
PTR __memset__ (PTR mem, int c, DWORD size);
STR __stpcpy__ (STR dst, STR src);
STR __strcat__ (STR dst, STR src);
STR __strchr__ (STR str, int c);
int __strcmp__ (STR str1, STR str2);
STR __strcpy__ (STR dst, STR src);
DWORD __strlen__ (STR str);
STR __strncat__ (STR dst, STR src, DWORD maxlen);
int __strncmp__ (STR str1, STR str2, DWORD maxlen);
STR __strncpy__ (STR dst, STR src, DWORD maxlen);
STR __strnset__ (STR str, int c, DWORD n);
STR __strrchr__ (STR str, int c);
STR __strset__ (STR str, int c);
#define memchr_ __memchr__
#define memcmp_ __memcmp__
#define memcpy_ __memcpy__
#define memset_ __memset__
#define stpcpy_ __stpcpy__
#define strcat_ __strcat__
#define strchr_ __strchr__
#define strcmp_ __strcmp__
#define strcpy_ __strcpy__
#define strlen_ __strlen__
#define strncat_ __strncat__
#define strncmp_ __strncmp__
#define strncpy_ __strncpy__
#define strnset_ __strnset__
#define strrchr_ __strrchr__
#define strset_ __strset__
// File functions
long __pascal fileopen (STR fnm, int mode);
long __pascal filecreate (STR fnm);
long __pascal fileclose (WORD handle);
long __pascal filelseek (WORD handle, long off, int from);
long __pascal fileread (WORD handle, PTR buf, long size);
long __pascal filewrite (WORD handle, PTR buf, long size);
long __pascal filedelete (STR fnm);
long __pascal filefind (STR buf, STR mask, int mode, int attr);
long __pascal filesize (WORD handle);
long __pascal filerename (STR dst, STR src);
long __pascal filecopy (WORD dst, WORD src, long size);
long __pascal fileexec (STR fnm, STR cline);
long __pascal dircurrent (STR buf);
long __pascal dircreate (STR dir);
long __pascal dirdelete (STR dir);
long __pascal dirchange (STR dir);
long __pascal drivecurrent (void);
long __pascal drivechange (int drive);
long __pascal drivesize (int drive);
long __pascal drivefree (int drive);
// IRQ and mode switch functions
BOOL __pascal callrmnrint (int intr);
BOOL __pascal callrmnrfar (DWORD segoff);
BOOL __pascal callrmnriret (DWORD segoff);
BOOL __pascal callrmrint (int intr);
BOOL __pascal callrmrfar (DWORD segoff);
BOOL __pascal callrmriret (DWORD segoff);
void __pascal setrmstub (PTR stub, void (*func) (void), int type);
void __pascal setpmstub (PTR stub, void (*func) (void));
void __pascal setcbstub (PTR stub, REGSTRUCT *__pascal (*func) (REGSTRUCT *r));
PTR __pascal setcb (SEGOFF *cb, PTR stub, REGSTRUCT *rs, REGSTRUCT *__pascal (*func) (REGSTRUCT *r));
void __pascal resetcb (DWORD cbsegoff, PTR stub);
PTR __pascal setirq (int irq, SEGOFF *ormiv, SELOFF *opmiv, PTR stub, DWORD segoff, void (*func) (void), int type);
void __pascal resetirq (int irq, SEGOFF *ormiv, SELOFF *opmiv, PTR stub);
BOOL __pascal getirqmask (int irq);
void __pascal setirqmask (int irq, BOOL status);
// Other functions
void __emit__ (BYTE, ...);
#define emit_ __emit__
#define cli_ __emit__ (0xfa)
#define sti_ __emit__ (0xfb)
BOOL __pascal kbhit (void);
WORD __pascal getch (void);
STR __pascal getenv (STR var);
STR __pascal getexe (void);
long __pascal dosfunc (STR str, int AXval);
long __pascal dosputstr (STR str);
void __pascal exit (int retval);
#ifdef __cplusplus
}
#endif
#endif /* __PMC_H */