File:  [RetroPC.NET] / np2 / i386c / memory.h
Revision 1.4: download - view: text, annotated - select for diffs
Fri Dec 12 00:02:16 2003 JST (21 years, 10 months ago) by monaka
Branches: MAIN
CVS tags: HEAD
delete unused macro.


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


// 000000-0fffff メインメモリ
// 100000-10ffef HMA
// 110000-193fff FONT-ROM/RAM
// 1a8000-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

#if defined(CPUCORE_IA32)
#if 0
#define	LOWMEM		0x100000
#else
#define	LOWMEM		0x10fff0
#endif
#endif	/* CPUCORE_IA32 */


#if defined(BYTESEX_LITTLE)

#define	MEM_SETB(pos, data)		mem[pos] = data
#define	MEM_ANDB(pos, data)		mem[pos] &= data
#define	MEM_XORB(pos, data)		mem[pos] ^= data
#define	MEM_ORB(pos, data)		mem[pos] |= data
#define	MEM_SETW(pos, data)		*(WORD *)(mem + (pos)) = (data)
#define	MEM_SETD(pos, data)		*(DWORD *)(mem + (pos)) = (data)
#define	MEM_GETB(pos)			(mem[pos])
#define	MEM_GETW(pos)			(*(WORD *)(mem + (pos)))
#define	MEM_GETD(pos)			(*(DWORD *)(mem + (pos)))

#elif defined(BYTESEX_BIG)

#define	MEM_SETB(pos, data)		mem[pos] = data
#define	MEM_ANDB(pos, data)		mem[pos] &= data
#define	MEM_XORB(pos, data)		mem[pos] ^= data
#define	MEM_ORB(pos, data)		mem[pos] |= data
#define	MEM_SETW(pos, data)												\
			mem[(pos)] = (BYTE)data;									\
			mem[(pos) + 1] = (BYTE)(data >> 8);
#define	MEM_SETD(pos, data)												\
			mem[(pos)] = (BYTE)data;									\
			mem[(pos) + 1] = (BYTE)(data >> 8);							\
			mem[(pos) + 2] = (BYTE)(data >> 16);						\
			mem[(pos) + 3] = (BYTE)(data >> 24);
#define	MEM_GETB(pos)			(mem[pos])
#define	MEM_GETW(pos)													\
			(((WORD)mem[(pos) + 1] << 8) | mem[(pos)])
#define	MEM_GETD(pos)													\
			(((DWORD)mem[(pos) + 3] << 24) |							\
			 ((DWORD)mem[(pos) + 2] << 16) |							\
			  ((WORD)mem[(pos) + 1] <<  8) | mem[(pos)])
#endif


#ifdef __cplusplus
extern "C" {
#endif

extern	BYTE	mem[0x200000];

void MEMCALL i286_vram_dispatch(UINT operate);

void MEMCALL __i286_memorywrite(UINT32 address, REG8 value);
void MEMCALL __i286_memorywrite_w(UINT32 address, REG16 value);
void MEMCALL __i286_memorywrite_d(UINT32 address, UINT32 value);
REG8 MEMCALL __i286_memoryread(UINT32 address);
REG16 MEMCALL __i286_memoryread_w(UINT32 address);
UINT32 MEMCALL __i286_memoryread_d(UINT32 address);

#ifndef CPUCORE_IA32
#define	i286_memorywrite(a,v)	__i286_memorywrite(a,v)
#define	i286_memorywrite_w(a,v)	__i286_memorywrite_w(a,v)
#define	i286_memorywrite_d(a,v)	__i286_memorywrite_d(a,v)
#define	i286_memoryread(a)		__i286_memoryread(a)
#define	i286_memoryread_w(a)	__i286_memoryread_w(a)
#define	i286_memoryread_d(a)	__i286_memoryread_d(a)
#else	/* CPUCORE_IA32 */
void MEMCALL cpu_memorywrite(DWORD address, BYTE value);
void MEMCALL cpu_memorywrite_w(DWORD address, WORD value);
void MEMCALL cpu_memorywrite_d(DWORD address, DWORD value);
BYTE MEMCALL cpu_memoryread(DWORD address);
WORD MEMCALL cpu_memoryread_w(DWORD address);
DWORD MEMCALL cpu_memoryread_d(DWORD address);
#define	i286_memorywrite(a,v)	cpu_memorywrite(a,v)
#define	i286_memorywrite_w(a,v)	cpu_memorywrite_w(a,v)
#define	i286_memorywrite_d(a,v)	cpu_memorywrite_d(a,v)
#define	i286_memoryread(a)		cpu_memoryread(a)
#define	i286_memoryread_w(a)	cpu_memoryread_w(a)
#define	i286_memoryread_d(a)	cpu_memoryread_d(a)
#endif	/* !CPUCORE_IA32 */

#ifdef NP2_MEMORY_ASM
BYTE MEMCALL i286_membyte_read(WORD seg, WORD off);
WORD MEMCALL i286_memword_read(WORD seg, WORD off);
void MEMCALL i286_membyte_write(WORD seg, WORD off, BYTE dat);
void MEMCALL i286_memword_write(WORD seg, WORD off, WORD dat);
#else
#define	i286_membyte_read(a, b)										\
				i286_memoryread(((DWORD)(a) << 4) + (WORD)(b))
#define	i286_memword_read(a, b)										\
				i286_memoryread_w(((DWORD)(a) << 4) + (WORD)(b))

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

void MEMCALL i286_memstr_read(UINT seg, UINT off, void *dat, UINT leng);
void MEMCALL i286_memstr_write(UINT seg, UINT off,
												const void *dat, UINT leng);
void MEMCALL i286_memx_read(UINT32 address, void *dat, UINT leng);
void MEMCALL i286_memx_write(UINT32 address, const void *dat, UINT leng);

#ifdef __cplusplus
}
#endif

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