1 /***************************************************************************
2 * Copyright (C) 2007 Ryan Schultz, PCSX-df Team, PCSX team *
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. *
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. *
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 ***************************************************************************/
20 #ifndef __PSXMEMORY_H__
21 #define __PSXMEMORY_H__
27 #include "psxcommon.h"
29 #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
31 #define SWAP16(v) __builtin_bswap16(v)
32 #define SWAP32(v) __builtin_bswap32(v)
33 #define SWAPu32(v) SWAP32((u32)(v))
34 #define SWAPs32(v) SWAP32((s32)(v))
36 #define SWAPu16(v) SWAP16((u16)(v))
37 #define SWAPs16(v) SWAP16((s16)(v))
44 #define SWAPu16(b) (b)
45 #define SWAPu32(b) (b)
49 #define INVALID_PTR ((void *)-1)
52 #define psxMs8(mem) psxM[(mem) & 0x1fffff]
53 #define psxMs16(mem) (SWAP16(*(s16 *)&psxM[(mem) & 0x1fffff]))
54 #define psxMs32(mem) (SWAP32(*(s32 *)&psxM[(mem) & 0x1fffff]))
55 #define psxMu8(mem) (*(u8 *)&psxM[(mem) & 0x1fffff])
56 #define psxMu16(mem) (SWAP16(*(u16 *)&psxM[(mem) & 0x1fffff]))
57 #define psxMu32(mem) (SWAP32(*(u32 *)&psxM[(mem) & 0x1fffff]))
59 #define psxMs8ref(mem) psxM[(mem) & 0x1fffff]
60 #define psxMs16ref(mem) (*(s16 *)&psxM[(mem) & 0x1fffff])
61 #define psxMs32ref(mem) (*(s32 *)&psxM[(mem) & 0x1fffff])
62 #define psxMu8ref(mem) (*(u8 *)&psxM[(mem) & 0x1fffff])
63 #define psxMu16ref(mem) (*(u16 *)&psxM[(mem) & 0x1fffff])
64 #define psxMu32ref(mem) (*(u32 *)&psxM[(mem) & 0x1fffff])
67 #define psxPs8(mem) psxP[(mem) & 0xffff]
68 #define psxPs16(mem) (SWAP16(*(s16 *)&psxP[(mem) & 0xffff]))
69 #define psxPs32(mem) (SWAP32(*(s32 *)&psxP[(mem) & 0xffff]))
70 #define psxPu8(mem) (*(u8 *)&psxP[(mem) & 0xffff])
71 #define psxPu16(mem) (SWAP16(*(u16 *)&psxP[(mem) & 0xffff]))
72 #define psxPu32(mem) (SWAP32(*(u32 *)&psxP[(mem) & 0xffff]))
74 #define psxPs8ref(mem) psxP[(mem) & 0xffff]
75 #define psxPs16ref(mem) (*(s16 *)&psxP[(mem) & 0xffff])
76 #define psxPs32ref(mem) (*(s32 *)&psxP[(mem) & 0xffff])
77 #define psxPu8ref(mem) (*(u8 *)&psxP[(mem) & 0xffff])
78 #define psxPu16ref(mem) (*(u16 *)&psxP[(mem) & 0xffff])
79 #define psxPu32ref(mem) (*(u32 *)&psxP[(mem) & 0xffff])
82 #define psxRs8(mem) psxR[(mem) & 0x7ffff]
83 #define psxRs16(mem) (SWAP16(*(s16 *)&psxR[(mem) & 0x7ffff]))
84 #define psxRs32(mem) (SWAP32(*(s32 *)&psxR[(mem) & 0x7ffff]))
85 #define psxRu8(mem) (*(u8* )&psxR[(mem) & 0x7ffff])
86 #define psxRu16(mem) (SWAP16(*(u16 *)&psxR[(mem) & 0x7ffff]))
87 #define psxRu32(mem) (SWAP32(*(u32 *)&psxR[(mem) & 0x7ffff]))
89 #define psxRs8ref(mem) psxR[(mem) & 0x7ffff]
90 #define psxRs16ref(mem) (*(s16*)&psxR[(mem) & 0x7ffff])
91 #define psxRs32ref(mem) (*(s32*)&psxR[(mem) & 0x7ffff])
92 #define psxRu8ref(mem) (*(u8 *)&psxR[(mem) & 0x7ffff])
93 #define psxRu16ref(mem) (*(u16*)&psxR[(mem) & 0x7ffff])
94 #define psxRu32ref(mem) (*(u32*)&psxR[(mem) & 0x7ffff])
97 #define psxHs8(mem) psxH[(mem) & 0xffff]
98 #define psxHs16(mem) (SWAP16(*(s16 *)&psxH[(mem) & 0xffff]))
99 #define psxHs32(mem) (SWAP32(*(s32 *)&psxH[(mem) & 0xffff]))
100 #define psxHu8(mem) (*(u8 *)&psxH[(mem) & 0xffff])
101 #define psxHu16(mem) (SWAP16(*(u16 *)&psxH[(mem) & 0xffff]))
102 #define psxHu32(mem) (SWAP32(*(u32 *)&psxH[(mem) & 0xffff]))
104 #define psxHs8ref(mem) psxH[(mem) & 0xffff]
105 #define psxHs16ref(mem) (*(s16 *)&psxH[(mem) & 0xffff])
106 #define psxHs32ref(mem) (*(s32 *)&psxH[(mem) & 0xffff])
107 #define psxHu8ref(mem) (*(u8 *)&psxH[(mem) & 0xffff])
108 #define psxHu16ref(mem) (*(u16 *)&psxH[(mem) & 0xffff])
109 #define psxHu32ref(mem) (*(u32 *)&psxH[(mem) & 0xffff])
111 extern u8 **psxMemWLUT;
112 extern u8 **psxMemRLUT;
114 #define PSXM(mem) (psxMemRLUT[(mem) >> 16] == INVALID_PTR ? INVALID_PTR : (u8*)(psxMemRLUT[(mem) >> 16] + ((mem) & 0xffff)))
115 #define PSXMs8(mem) (*(s8 *)PSXM(mem))
116 #define PSXMs16(mem) (SWAP16(*(s16 *)PSXM(mem)))
117 #define PSXMs32(mem) (SWAP32(*(s32 *)PSXM(mem)))
118 #define PSXMu8(mem) (*(u8 *)PSXM(mem))
119 #define PSXMu16(mem) (SWAP16(*(u16 *)PSXM(mem)))
120 #define PSXMu32(mem) (SWAP32(*(u32 *)PSXM(mem)))
122 #define PSXMu32ref(mem) (*(u32 *)PSXM(mem))
126 void psxMemShutdown();
128 u8 psxMemRead8 (u32 mem);
129 u16 psxMemRead16(u32 mem);
130 u32 psxMemRead32(u32 mem);
131 void psxMemWrite8 (u32 mem, u8 value);
132 void psxMemWrite16(u32 mem, u16 value);
133 void psxMemWrite32(u32 mem, u32 value);
134 void *psxMemPointer(u32 mem);