#ifndef RLOEW_MULTCLIB
#define RLOEW_MULTCLIB

struct CORE {
int   zpage,spage;
int   id,core;
DWORD cr3,argb;
DWORD tag,event0;
BYTE  status,command,halted,nmireq,lok,bpact;
WORD  idtl;
DWORD idtp;
DWORD virt;
DWORD usrhalt,signal,exit,bpcall;
DWORD cr2b;
DWORD bpsp;
DWORD eip,ecs,eflags,esp;
DWORD uevent;
DWORD temp,bptemp;
BYTE  x1[156];
DWORD idt[512];                                 //Set 0x100 from Base
BYTE  x2[1536];                                 //0x900
DWORD ustk[16];                                 //Set 0xf00 from Base (top addr)
DWORD stk3[35];                                 //Set 0xf40 from Base (top addr)
DWORD ds,ss,es,fs,gs;
DWORD regs[8];                                  //Set 0xfe0 from Base
};

int   OpenMC();
DWORD CoreCount();
DWORD LockMemory();
DWORD MapMemory(int c);
DWORD StopCore(int c);
DWORD PauseCore(int c);
DWORD ResumeCore(int c);
DWORD FreeCore(int c);
DWORD OpenCore(int c);                          //Zero Get First Free Core
BYTE  CoreStatus(int c);
int   CoreArg(int c);
int   SetCoreArg(int c,int val);
struct CORE *CoreAddress(int c);                //Zero Gets APIC Page
struct CORE **CorePointer(int c);
void  *CoreEvent(int c,void *event);            //Zero Releases User Event
void  *CoreInterrupt(int c,int in,void *vec);
DWORD InterruptCore(int c,void *vec);
BYTE  *StartCore(int c,void *ip,int arg,void *sp); //Returns Status Byte Pointer
int   AbortBPCall(int c);
int   CloseMC();

int   CoreNum();
int   CoreGetArg();
int   CoreSetArg(int val);
void  CoreSignal(int x);
int   CoreWait(int x);
void  CoreExit(int x);
int   BPCall(int n,void *p,...);

#endif
