refactor OSD code and PCNT stuff
[pcsx_rearmed.git] / libpcsxcore / psxmem.h
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 #if !defined(PSXREC) && (defined(__x86_64__) || defined(__i386__) || defined(__ppc__)) && !defined(NOPSXREC)
126 #define PSXREC
127 #endif
128
129 int psxMemInit();
130 void psxMemReset();
131 void psxMemShutdown();
132
133 u8 psxMemRead8 (u32 mem);
134 u16 psxMemRead16(u32 mem);
135 u32 psxMemRead32(u32 mem);
136 void psxMemWrite8 (u32 mem, u8 value);
137 void psxMemWrite16(u32 mem, u16 value);
138 void psxMemWrite32(u32 mem, u32 value);
139 void *psxMemPointer(u32 mem);
140
141 extern u32 event_cycles[7];
142 extern u32 next_interupt;
143
144 #define new_dyna_set_event(e, c) { \
145         s32 c_ = c; \
146         u32 abs_ = psxRegs.cycle + c_; \
147         s32 odi_ = next_interupt - psxRegs.cycle; \
148         event_cycles[e] = abs_; \
149         if (c_ < odi_) { \
150                 /*printf("%u: next_interupt %d -> %d (%u)\n", psxRegs.cycle, odi_, c_, abs_);*/ \
151                 next_interupt = abs_; \
152         } \
153 }
154
155 #ifdef __cplusplus
156 }
157 #endif
158 #endif