File:  [RetroPC.NET] / np2 / i386c / memory.h
Revision 1.14: download - view: text, annotated - select for diffs
Mon Mar 29 14:50:29 2004 JST (21 years, 7 months ago) by yui
Branches: MAIN
CVS tags: VER_0_77, VER_0_76, HEAD
support IA32 hardware EMS (Test) (T.Yui)

#ifndef	NP2_I386C_MEMORY_H__
#define	NP2_I386C_MEMORY_H__

#ifdef NP2_MEMORY_ASM			// アセンブラ版は 必ずfastcallで
#undef	MEMCALL
#define	MEMCALL	FASTCALL
#endif

#if !defined(MEMCALL)
#define	MEMCALL
#endif

#ifndef GCC_ATTR_REGPARM
#define	GCC_ATTR_REGPARM
#endif

// 000000-0fffff メインメモリ
// 100000-10ffef HMA
// 110000-193fff FONT-ROM/RAM
// 1a8000-1bffff VRAM1
// 1c0000-1c7fff ITF-ROM BAK
// 1c8000-1dffff EPSON RAM
// 1e0000-1e7fff VRAM1
// 1f8000-1fffff ITF-ROM

#define	VRAM_STEP	0x100000
#define	VRAM_B		0x0a8000
#define	VRAM_R		0x0b0000
#define	VRAM_G		0x0b8000
#define	VRAM_E		0x0e0000

#define	VRAMADDRMASKEX(a)	((a) & (VRAM_STEP | 0x7fff))

#define	VRAM0_B		VRAM_B
#define	VRAM0_R		VRAM_R
#define	VRAM0_G		VRAM_G
#define	VRAM0_E		VRAM_E
#define	VRAM1_B		(VRAM_STEP + VRAM_B)
#define	VRAM1_R		(VRAM_STEP + VRAM_R)
#define	VRAM1_G		(VRAM_STEP + VRAM_G)
#define	VRAM1_E		(VRAM_STEP + VRAM_E)

#define	FONT_ADRS	0x110000
#define	ITF_ADRS	0x1f8000

#define	USE_HIMEM		0x110000

#ifdef __cplusplus
extern "C" {
#endif

extern	BYTE	mem[0x200000];

void MEMCALL i286_memorymap(UINT type);
void MEMCALL i286_vram_dispatch(UINT operate);

void MEMCALL i286_memorywrite(UINT32 address, REG8 value) GCC_ATTR_REGPARM;
void MEMCALL i286_memorywrite_w(UINT32 address, REG16 value) GCC_ATTR_REGPARM;
void MEMCALL i286_memorywrite_d(UINT32 address, UINT32 value) GCC_ATTR_REGPARM;
REG8 MEMCALL i286_memoryread(UINT32 address) GCC_ATTR_REGPARM;
REG16 MEMCALL i286_memoryread_w(UINT32 address) GCC_ATTR_REGPARM;
UINT32 MEMCALL i286_memoryread_d(UINT32 address) GCC_ATTR_REGPARM;

#ifdef NP2_MEMORY_ASM
REG8 MEMCALL i286_membyte_read(UINT seg, UINT off) GCC_ATTR_REGPARM;
REG16 MEMCALL i286_memword_read(UINT seg, UINT off) GCC_ATTR_REGPARM;
void MEMCALL i286_membyte_write(UINT seg, UINT off, REG8 dat) GCC_ATTR_REGPARM;
void MEMCALL i286_memword_write(UINT seg, UINT off, REG16 dat) GCC_ATTR_REGPARM;
#else
#define	i286_membyte_read(a, b) \
	i286_memoryread(((UINT32)(a) << 4) + (UINT16)(b))
#define	i286_memword_read(a, b) \
	i286_memoryread_w(((UINT32)(a) << 4) + (UINT16)(b))

#define	i286_membyte_write(a, b, c) \
	i286_memorywrite(((UINT32)(a) << 4) + (UINT16)(b), (c))
#define	i286_memword_write(a, b, c) \
	i286_memorywrite_w(((UINT32)(a) << 4) + (UINT16)(b), (c))
#endif

void MEMCALL memp_read(UINT32 address, void *dat, UINT leng) GCC_ATTR_REGPARM;
void MEMCALL memp_write(UINT32 address, const void *dat, UINT leng) GCC_ATTR_REGPARM;

REG8 MEMCALL meml_read8(UINT seg, UINT off) GCC_ATTR_REGPARM;
REG16 MEMCALL meml_read16(UINT seg, UINT off) GCC_ATTR_REGPARM;
void MEMCALL meml_write8(UINT seg, UINT off, REG8 dat) GCC_ATTR_REGPARM;
void MEMCALL meml_write16(UINT seg, UINT off, REG16 dat) GCC_ATTR_REGPARM;
void MEMCALL meml_readstr(UINT seg, UINT off, void *dat, UINT leng) GCC_ATTR_REGPARM;
void MEMCALL meml_writestr(UINT seg, UINT off, const void *dat, UINT leng) GCC_ATTR_REGPARM;
void MEMCALL meml_read(UINT32 address, void *dat, UINT leng) GCC_ATTR_REGPARM;
void MEMCALL meml_write(UINT32 address, const void *dat, UINT leng) GCC_ATTR_REGPARM;



// ---- Physical Space (DMA)

#define	MEMP_READ8(addr)					\
			i286_memoryread((addr))
#define	MEMP_WRITE8(addr, dat)				\
			i286_memorywrite((addr), (dat))

#define MEMP_READ(addr, dat, leng)			\
			memp_read((addr), (dat), (leng))
#define MEMP_WRITE(addr, dat, leng)			\
			memp_write((addr), (dat), (leng))


// ---- Logical Space (BIOS)

#define	MEML_READ8(seg, off)				\
			meml_read8((seg), (off))
#define	MEML_READ16(seg, off)				\
			meml_read16((seg), (off))
#define	MEML_WRITE8(seg, off, dat)			\
			meml_write8((seg), (off), (dat))
#define	MEML_WRITE16(seg, off, dat)			\
			meml_write16((seg), (off), (dat))
#define MEML_READSTR(seg, off, dat, leng)	\
			meml_readstr((seg), (off), (dat), (leng))
#define MEML_WRITESTR(seg, off, dat, leng)	\
			meml_writestr((seg), (off), (dat), (leng))
#define MEML_READ(addr, dat, leng)			\
			meml_read((addr), (dat), (leng))
#define MEML_WRITE(addr, dat, leng)			\
			meml_write((addr), (dat), (leng))

#ifdef __cplusplus
}
#endif

#endif	/* !NP2_I386C_MEMORY_H__ */

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