psxmem: set fixed flag on mappings that really need it
[pcsx_rearmed.git] / libpcsxcore / psxmem.h
CommitLineData
ef79bbde
P
1/***************************************************************************
2 * Copyright (C) 2007 Ryan Schultz, PCSX-df Team, PCSX team *
3 * *
4 * This program is free software; you can redistribute it and/or modify *
5 * it under the terms of the GNU General Public License as published by *
6 * the Free Software Foundation; either version 2 of the License, or *
7 * (at your option) any later version. *
8 * *
9 * This program is distributed in the hope that it will be useful, *
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
12 * GNU General Public License for more details. *
13 * *
14 * You should have received a copy of the GNU General Public License *
15 * along with this program; if not, write to the *
16 * Free Software Foundation, Inc., *
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. *
18 ***************************************************************************/
19
20#ifndef __PSXMEMORY_H__
21#define __PSXMEMORY_H__
22
23#ifdef __cplusplus
24extern "C" {
25#endif
26
27#include "psxcommon.h"
28
29#if defined(__BIGENDIAN__)
30
31#define _SWAP16(b) ((((unsigned char *)&(b))[0] & 0xff) | (((unsigned char *)&(b))[1] & 0xff) << 8)
32#define _SWAP32(b) ((((unsigned char *)&(b))[0] & 0xff) | ((((unsigned char *)&(b))[1] & 0xff) << 8) | ((((unsigned char *)&(b))[2] & 0xff) << 16) | (((unsigned char *)&(b))[3] << 24))
33
34#define SWAP16(v) ((((v) & 0xff00) >> 8) +(((v) & 0xff) << 8))
35#define SWAP32(v) ((((v) & 0xff000000ul) >> 24) + (((v) & 0xff0000ul) >> 8) + (((v) & 0xff00ul)<<8) +(((v) & 0xfful) << 24))
36#define SWAPu32(v) SWAP32((u32)(v))
37#define SWAPs32(v) SWAP32((s32)(v))
38
39#define SWAPu16(v) SWAP16((u16)(v))
40#define SWAPs16(v) SWAP16((s16)(v))
41
42#else
43
44#define SWAP16(b) (b)
45#define SWAP32(b) (b)
46
47#define SWAPu16(b) (b)
48#define SWAPu32(b) (b)
49
50#endif
51
52extern s8 *psxM;
53#define psxMs8(mem) psxM[(mem) & 0x1fffff]
54#define psxMs16(mem) (SWAP16(*(s16 *)&psxM[(mem) & 0x1fffff]))
55#define psxMs32(mem) (SWAP32(*(s32 *)&psxM[(mem) & 0x1fffff]))
56#define psxMu8(mem) (*(u8 *)&psxM[(mem) & 0x1fffff])
57#define psxMu16(mem) (SWAP16(*(u16 *)&psxM[(mem) & 0x1fffff]))
58#define psxMu32(mem) (SWAP32(*(u32 *)&psxM[(mem) & 0x1fffff]))
59
60#define psxMs8ref(mem) psxM[(mem) & 0x1fffff]
61#define psxMs16ref(mem) (*(s16 *)&psxM[(mem) & 0x1fffff])
62#define psxMs32ref(mem) (*(s32 *)&psxM[(mem) & 0x1fffff])
63#define psxMu8ref(mem) (*(u8 *)&psxM[(mem) & 0x1fffff])
64#define psxMu16ref(mem) (*(u16 *)&psxM[(mem) & 0x1fffff])
65#define psxMu32ref(mem) (*(u32 *)&psxM[(mem) & 0x1fffff])
66
67extern s8 *psxP;
68#define psxPs8(mem) psxP[(mem) & 0xffff]
69#define psxPs16(mem) (SWAP16(*(s16 *)&psxP[(mem) & 0xffff]))
70#define psxPs32(mem) (SWAP32(*(s32 *)&psxP[(mem) & 0xffff]))
71#define psxPu8(mem) (*(u8 *)&psxP[(mem) & 0xffff])
72#define psxPu16(mem) (SWAP16(*(u16 *)&psxP[(mem) & 0xffff]))
73#define psxPu32(mem) (SWAP32(*(u32 *)&psxP[(mem) & 0xffff]))
74
75#define psxPs8ref(mem) psxP[(mem) & 0xffff]
76#define psxPs16ref(mem) (*(s16 *)&psxP[(mem) & 0xffff])
77#define psxPs32ref(mem) (*(s32 *)&psxP[(mem) & 0xffff])
78#define psxPu8ref(mem) (*(u8 *)&psxP[(mem) & 0xffff])
79#define psxPu16ref(mem) (*(u16 *)&psxP[(mem) & 0xffff])
80#define psxPu32ref(mem) (*(u32 *)&psxP[(mem) & 0xffff])
81
82extern s8 *psxR;
83#define psxRs8(mem) psxR[(mem) & 0x7ffff]
84#define psxRs16(mem) (SWAP16(*(s16 *)&psxR[(mem) & 0x7ffff]))
85#define psxRs32(mem) (SWAP32(*(s32 *)&psxR[(mem) & 0x7ffff]))
86#define psxRu8(mem) (*(u8* )&psxR[(mem) & 0x7ffff])
87#define psxRu16(mem) (SWAP16(*(u16 *)&psxR[(mem) & 0x7ffff]))
88#define psxRu32(mem) (SWAP32(*(u32 *)&psxR[(mem) & 0x7ffff]))
89
90#define psxRs8ref(mem) psxR[(mem) & 0x7ffff]
91#define psxRs16ref(mem) (*(s16*)&psxR[(mem) & 0x7ffff])
92#define psxRs32ref(mem) (*(s32*)&psxR[(mem) & 0x7ffff])
93#define psxRu8ref(mem) (*(u8 *)&psxR[(mem) & 0x7ffff])
94#define psxRu16ref(mem) (*(u16*)&psxR[(mem) & 0x7ffff])
95#define psxRu32ref(mem) (*(u32*)&psxR[(mem) & 0x7ffff])
96
97extern s8 *psxH;
98#define psxHs8(mem) psxH[(mem) & 0xffff]
99#define psxHs16(mem) (SWAP16(*(s16 *)&psxH[(mem) & 0xffff]))
100#define psxHs32(mem) (SWAP32(*(s32 *)&psxH[(mem) & 0xffff]))
101#define psxHu8(mem) (*(u8 *)&psxH[(mem) & 0xffff])
102#define psxHu16(mem) (SWAP16(*(u16 *)&psxH[(mem) & 0xffff]))
103#define psxHu32(mem) (SWAP32(*(u32 *)&psxH[(mem) & 0xffff]))
104
105#define psxHs8ref(mem) psxH[(mem) & 0xffff]
106#define psxHs16ref(mem) (*(s16 *)&psxH[(mem) & 0xffff])
107#define psxHs32ref(mem) (*(s32 *)&psxH[(mem) & 0xffff])
108#define psxHu8ref(mem) (*(u8 *)&psxH[(mem) & 0xffff])
109#define psxHu16ref(mem) (*(u16 *)&psxH[(mem) & 0xffff])
110#define psxHu32ref(mem) (*(u32 *)&psxH[(mem) & 0xffff])
111
112extern u8 **psxMemWLUT;
113extern u8 **psxMemRLUT;
114
115#define PSXM(mem) (psxMemRLUT[(mem) >> 16] == 0 ? NULL : (u8*)(psxMemRLUT[(mem) >> 16] + ((mem) & 0xffff)))
116#define PSXMs8(mem) (*(s8 *)PSXM(mem))
117#define PSXMs16(mem) (SWAP16(*(s16 *)PSXM(mem)))
118#define PSXMs32(mem) (SWAP32(*(s32 *)PSXM(mem)))
119#define PSXMu8(mem) (*(u8 *)PSXM(mem))
120#define PSXMu16(mem) (SWAP16(*(u16 *)PSXM(mem)))
121#define PSXMu32(mem) (SWAP32(*(u32 *)PSXM(mem)))
122
123#define PSXMu32ref(mem) (*(u32 *)PSXM(mem))
124
125#if !defined(PSXREC) && (defined(__x86_64__) || defined(__i386__) || defined(__ppc__)) && !defined(NOPSXREC)
126#define PSXREC
127#endif
128
129int psxMemInit();
130void psxMemReset();
131void psxMemShutdown();
132
133u8 psxMemRead8 (u32 mem);
134u16 psxMemRead16(u32 mem);
135u32 psxMemRead32(u32 mem);
136void psxMemWrite8 (u32 mem, u8 value);
137void psxMemWrite16(u32 mem, u16 value);
138void psxMemWrite32(u32 mem, u32 value);
139void *psxMemPointer(u32 mem);
140
141#ifdef __cplusplus
142}
143#endif
144#endif