File:  [RetroPC.NET] / np2 / i286x / Attic / i286.h
Revision 1.4: download - view: text, annotated - select for diffs
Mon Dec 1 19:45:46 2003 JST (21 years, 11 months ago) by yui
Branches: MAIN
CVS tags: HEAD
optimize memory (for ver0.72 statsave) (T.Yui)

//----------------------------------------------------------------------------
//
//  i286c : 80286 Engine for Pentium  ver0.02
//
//                               Copyright by Yui/Studio Milmake 1999-2000
//
//----------------------------------------------------------------------------

enum {
	I286_MEMREADMAX		= 0xa4000,
	I286_MEMWRITEMAX	= 0xa0000
};

#ifndef CPUCALL
#define	CPUCALL			__fastcall
#endif

#if defined(BYTESEX_LITTLE)

typedef struct {
	UINT8	al;
	UINT8	ah;
	UINT8	cl;
	UINT8	ch;
	UINT8	dl;
	UINT8	dh;
	UINT8	bl;
	UINT8	bh;
	UINT8	sp_l;
	UINT8	sp_h;
	UINT8	bp_l;
	UINT8	bp_h;
	UINT8	si_l;
	UINT8	si_h;
	UINT8	di_l;
	UINT8	di_h;
	UINT8	es_l;
	UINT8	es_h;
	UINT8	cs_l;
	UINT8	cs_h;
	UINT8	ss_l;
	UINT8	ss_h;
	UINT8	ds_l;
	UINT8	ds_h;
	UINT8	flag_l;
	UINT8	flag_h;
	UINT8	ip_l;
	UINT8	ip_h;
} I286REG8;

#else

typedef struct {
	UINT8	ah;
	UINT8	al;
	UINT8	ch;
	UINT8	cl;
	UINT8	dh;
	UINT8	dl;
	UINT8	bh;
	UINT8	bl;
	UINT8	sp_h;
	UINT8	sp_l;
	UINT8	bp_h;
	UINT8	bp_l;
	UINT8	si_h;
	UINT8	si_l;
	UINT8	di_h;
	UINT8	di_l;
	UINT8	es_h;
	UINT8	es_l;
	UINT8	cs_h;
	UINT8	cs_l;
	UINT8	ss_h;
	UINT8	ss_l;
	UINT8	ds_h;
	UINT8	ds_l;
	UINT8	flag_h;
	UINT8	flag_l;
	UINT8	ip_h;
	UINT8	ip_l;
} I286REG8;

#endif

typedef struct {
	UINT16	ax;
	UINT16	cx;
	UINT16	dx;
	UINT16	bx;
	UINT16	sp;
	UINT16	bp;
	UINT16	si;
	UINT16	di;
	UINT16	es;
	UINT16	cs;
	UINT16	ss;
	UINT16	ds;
	UINT16	flag;
	UINT16	ip;
} I286REG16;

typedef struct {
	UINT16	limit;
	UINT16	base;
	UINT8	base24;
	UINT8	reserved;
} I286DTR;

typedef struct {
	union {
		I286REG8	b;
		I286REG16	w;
	}		r;
	SINT32	remainclock;
	SINT32	baseclock;
	UINT32	clock;
	UINT32	adrsmask;						// ver0.72
	UINT32	es_base;
	UINT32	cs_base;
	UINT32	ss_base;
	UINT32	ds_base;
	UINT32	ss_fix;
	UINT32	ds_fix;
	UINT16	prefix;
	UINT8	trap;
	UINT8	cpu_type;
	UINT32	pf_semaphore;
	UINT32	repbak;
	UINT32	inport;
	BYTE	prefetchque[4];
	I286DTR	GDTR;
	I286DTR	IDTR;
	UINT16	MSW;
	UINT8	resetreq;						// ver0.72
	UINT8	itfbank;						// ver0.72
} I286STAT;

typedef struct {							// for ver0.73
	UINT	dummy;
} I286EXT;

typedef struct {
	I286STAT	s;							// STATsave‚³‚ê‚é“z
	I286EXT		e;
} I286CORE;


#ifdef __cplusplus
extern "C" {
#endif

extern	I286CORE	i286core;
extern	const BYTE	iflags[];


#define		I286_MEM		mem

#define		I286_REG		i286core.s.r
#define		I286_SEGREG		i286core.s.r.w.es

#define		I286_AX			i286core.s.r.w.ax
#define		I286_BX			i286core.s.r.w.bx
#define		I286_CX			i286core.s.r.w.cx
#define		I286_DX			i286core.s.r.w.dx
#define		I286_SI			i286core.s.r.w.si
#define		I286_DI			i286core.s.r.w.di
#define		I286_BP			i286core.s.r.w.bp
#define		I286_SP			i286core.s.r.w.sp
#define		I286_CS			i286core.s.r.w.cs
#define		I286_DS			i286core.s.r.w.ds
#define		I286_ES			i286core.s.r.w.es
#define		I286_SS			i286core.s.r.w.ss
#define		I286_IP			i286core.s.r.w.ip

#define		SEG_BASE		i286core.s.es_base
#define		ES_BASE			i286core.s.es_base
#define		CS_BASE			i286core.s.cs_base
#define		SS_BASE			i286core.s.ss_base
#define		DS_BASE			i286core.s.ds_base
#define		SS_FIX			i286core.s.ss_fix
#define		DS_FIX			i286core.s.ds_fix

#define		I286_AL			i286core.s.r.b.al
#define		I286_BL			i286core.s.r.b.bl
#define		I286_CL			i286core.s.r.b.cl
#define		I286_DL			i286core.s.r.b.dl
#define		I286_AH			i286core.s.r.b.ah
#define		I286_BH			i286core.s.r.b.bh
#define		I286_CH			i286core.s.r.b.ch
#define		I286_DH			i286core.s.r.b.dh

#define		I286_FLAG		i286core.s.r.w.flag
#define		I286_FLAGL		i286core.s.r.b.flag_l
#define		I286_FLAGH		i286core.s.r.b.flag_h
#define		I286_TRAP		i286core.s.trap
#define		I286_OV			i286core.s.ovflag

#define		I286_REMCLOCK	i286core.s.remainclock
#define		I286_BASECLOCK	i286core.s.baseclock
#define		I286_CLOCK		i286core.s.clock


enum {
	C_FLAG			= 0x0001,
	P_FLAG			= 0x0004,
	A_FLAG			= 0x0010,
	Z_FLAG			= 0x0040,
	S_FLAG			= 0x0080,
	T_FLAG			= 0x0100,
	I_FLAG			= 0x0200,
	D_FLAG			= 0x0400,
	O_FLAG			= 0x0800
};

#define		CPUTYPE			i286core.s.cpu_type
#define		CPUTYPE_V30		0x01

// ver0.28
#define		REPPOSBAK		i286core.s.repbak
#define		PREFIX_SMP		i286core.s.pf_semaphore

#define		isI286DI		(!(I286_FLAG & I_FLAG))
#define		isI286EI		(I286_FLAG & I_FLAG)
#define		I286_CLI		I286_FLAG &= ~I_FLAG;				\
							I286_TRAP = 0;
#define		I286_STI		I286_FLAG |= I_FLAG;				\
							I286_TRAP = (I286_FLAG >> 8) & 1;


void i286_initialize(void);
void i286_reset(void);
void i286_resetprefetch(void);

void CPUCALL i286_interrupt(BYTE vect);

void i286(void);
void i286_step(void);

void v30(void);
void v30_step(void);

#ifdef __cplusplus
}
#endif


RetroPC.NET-CVS <cvs@retropc.net>