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 24 extern "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 52 extern 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 67 extern 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 82 extern 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 97 extern 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 112 extern u8 **psxMemWLUT; 113 extern 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 #ifndef PSXREC 126 #if defined(NEW_DYNAREC) || defined(LIGHTREC) 127 #define PSXREC 128 #endif 129 #endif 130 131 int psxMemInit(); 132 void psxMemReset(); 133 void psxMemShutdown(); 134 135 u8 psxMemRead8 (u32 mem); 136 u16 psxMemRead16(u32 mem); 137 u32 psxMemRead32(u32 mem); 138 void psxMemWrite8 (u32 mem, u8 value); 139 void psxMemWrite16(u32 mem, u16 value); 140 void psxMemWrite32(u32 mem, u32 value); 141 void *psxMemPointer(u32 mem); 142 143 #ifdef __cplusplus 144 } 145 #endif 146 #endif 147