]> Shamusworld >> Repos - virtualjaguar/blob - src/memory.h
Removed some cruft and nonstandard int/uint types, added M series BIOS.
[virtualjaguar] / src / memory.h
1 //
2 // MEMORY.H: Header file
3 //
4 // All Jaguar related memory and I/O locations are contained in this file
5 //
6
7 #ifndef __MEMORY_H__
8 #define __MEMORY_H__
9
10 #include <stdint.h>
11
12 extern uint8_t jagMemSpace[];
13
14 extern uint8_t * jaguarMainRAM;
15 extern uint8_t * jaguarMainROM;
16 extern uint8_t * gpuRAM;
17 extern uint8_t * dspRAM;
18
19 #if 1
20 extern uint32_t & butch, & dscntrl;
21 extern uint16_t & ds_data;
22 extern uint32_t & i2cntrl, & sbcntrl, & subdata, & subdatb, & sb_time, & fifo_data, & i2sdat2, & unknown;
23 #else
24 extern uint32_t butch, dscntrl, ds_data, i2cntrl, sbcntrl, subdata, subdatb, sb_time, fifo_data, i2sdat2, unknown;
25 #endif
26
27 extern uint16_t & memcon1, & memcon2, & hc, & vc, & lph, & lpv;
28 extern uint64_t & obData;
29 extern uint32_t & olp;
30 extern uint16_t & obf, & vmode, & bord1, & bord2, & hp, & hbb, & hbe, & hs,
31         & hvs, & hdb1, & hdb2, & hde, & vp, & vbb, & vbe, & vs, & vdb, & vde,
32         & veb, & vee, & vi, & pit0, & pit1, & heq;
33 extern uint32_t & bg;
34 extern uint16_t & int1, & int2;
35 extern uint8_t * clut, * lbuf;
36 extern uint32_t & g_flags, & g_mtxc, & g_mtxa, & g_end, & g_pc, & g_ctrl,
37         & g_hidata, & g_divctrl;
38 extern uint32_t g_remain;
39 extern uint32_t & a1_base, & a1_flags, & a1_clip, & a1_pixel, & a1_step,
40         & a1_fstep, & a1_fpixel, & a1_inc, & a1_finc, & a2_base, & a2_flags,
41         & a2_mask, & a2_pixel, & a2_step, & b_cmd, & b_count;
42 extern uint64_t & b_srcd, & b_dstd, & b_dstz, & b_srcz1, & b_srcz2, & b_patd;
43 extern uint32_t & b_iinc, & b_zinc, & b_stop, & b_i3, & b_i2, & b_i1, & b_i0, & b_z3,
44         & b_z2, & b_z1, & b_z0;
45 extern uint16_t & jpit1, & jpit2, & jpit3, & jpit4, & clk1, & clk2, & clk3, & j_int,
46         & asidata, & asictrl;
47 extern uint16_t asistat;
48 extern uint16_t & asiclk, & joystick, & joybuts;
49 extern uint32_t & d_flags, & d_mtxc, & d_mtxa, & d_end, & d_pc, & d_ctrl,
50         & d_mod, & d_divctrl;
51 extern uint32_t d_remain;
52 extern uint32_t & d_machi;
53 extern uint16_t & ltxd, lrxd, & rtxd, rrxd;
54 extern uint8_t & sclk, sstat;
55 extern uint32_t & smode;
56 /*
57 uint16_t & ltxd      = *((uint16_t *)&jagMemSpace[0xF1A148]);
58 uint16_t lrxd;                                                                  // Dual register with $F1A148
59 uint16_t & rtxd      = *((uint16_t *)&jagMemSpace[0xF1A14C]);
60 uint16_t rrxd;                                                                  // Dual register with $F1A14C
61 uint8_t  & sclk      = *((uint8_t *) &jagMemSpace[0xF1A150]);
62 uint8_t sstat;                                                                  // Dual register with $F1A150
63 uint32_t & smode     = *((uint32_t *)&jagMemSpace[0xF1A154]);
64 */
65
66 // Read/write tracing enumeration
67
68 enum { UNKNOWN, JAGUAR, DSP, GPU, TOM, JERRY, M68K, BLITTER, OP };
69 extern const char * whoName[9];
70
71 // BIOS identification enum
72
73 //enum { BIOS_NORMAL=0x01, BIOS_CD=0x02, BIOS_STUB1=0x04, BIOS_STUB2=0x08, BIOS_DEV_CD=0x10 };
74 //extern int biosAvailable;
75
76 // Some handy macros to help converting native endian to big endian (jaguar native)
77 // & vice versa
78
79 #define SET64(r, a, v)  r[(a)] = ((v) & 0xFF00000000000000) >> 56, r[(a)+1] = ((v) & 0x00FF000000000000) >> 48, \
80                                                 r[(a)+2] = ((v) & 0x0000FF0000000000) >> 40, r[(a)+3] = ((v) & 0x000000FF00000000) >> 32, \
81                                                 r[(a)+4] = ((v) & 0xFF000000) >> 24, r[(a)+5] = ((v) & 0x00FF0000) >> 16, \
82                                                 r[(a)+6] = ((v) & 0x0000FF00) >> 8, r[(a)+7] = (v) & 0x000000FF
83 #define GET64(r, a)             (((uint64_t)r[(a)] << 56) | ((uint64_t)r[(a)+1] << 48) | \
84                                                 ((uint64_t)r[(a)+2] << 40) | ((uint64_t)r[(a)+3] << 32) | \
85                                                 ((uint64_t)r[(a)+4] << 24) | ((uint64_t)r[(a)+5] << 16) | \
86                                                 ((uint64_t)r[(a)+6] << 8) | (uint64_t)r[(a)+7])
87 #define SET32(r, a, v)  r[(a)] = ((v) & 0xFF000000) >> 24, r[(a)+1] = ((v) & 0x00FF0000) >> 16, \
88                                                 r[(a)+2] = ((v) & 0x0000FF00) >> 8, r[(a)+3] = (v) & 0x000000FF
89 #define GET32(r, a)             ((r[(a)] << 24) | (r[(a)+1] << 16) | (r[(a)+2] << 8) | r[(a)+3])
90 #define SET16(r, a, v)  r[(a)] = ((v) & 0xFF00) >> 8, r[(a)+1] = (v) & 0xFF
91 #define GET16(r, a)             ((r[(a)] << 8) | r[(a)+1])
92
93 //This doesn't seem to work on OSX. So have to figure something else out. :-(
94 //byteswap.h doesn't exist on OSX.
95 #if 0
96 // This is GCC specific, but we can fix that if we need to...
97 // Big plus of this approach is that these compile down to single instructions on little
98 // endian machines while one big endian machines we don't have any overhead. :-)
99
100 #include <byteswap.h>
101 #include <endian.h>
102
103 #if __BYTE_ORDER == __LITTLE_ENDIAN
104         #define ESAFE16(x)      bswap_16(x)
105         #define ESAFE32(x)      bswap_32(x)
106         #define ESAFE64(x)      bswap_64(x)
107 #else
108         #define ESAFE16(x)      (x)
109         #define ESAFE32(x)      (x)
110         #define ESAFE64(x)      (x)
111 #endif
112 #endif
113
114 #if 0
115 Stuff ripped out of Hatari, that may be useful:
116
117 /* Can the actual CPU access unaligned memory? */
118 #ifndef CPU_CAN_ACCESS_UNALIGNED
119 # if defined(__i386__) || defined(powerpc) || defined(__mc68020__)
120 #  define CPU_CAN_ACCESS_UNALIGNED 1
121 # else
122 #  define CPU_CAN_ACCESS_UNALIGNED 0
123 # endif
124 #endif
125
126
127 /* If the CPU can access unaligned memory, use these accelerated functions: */
128 #if CPU_CAN_ACCESS_UNALIGNED
129
130 #include <SDL_endian.h>
131
132
133 static inline uae_u32 do_get_mem_long(void *a)
134 {
135         return SDL_SwapBE32(*(uae_u32 *)a);
136 }
137
138 static inline uae_u16 do_get_mem_word(void *a)
139 {
140         return SDL_SwapBE16(*(uae_u16 *)a);
141 }
142
143
144 static inline void do_put_mem_long(void *a, uae_u32 v)
145 {
146         *(uae_u32 *)a = SDL_SwapBE32(v);
147 }
148
149 static inline void do_put_mem_word(void *a, uae_u16 v)
150 {
151         *(uae_u16 *)a = SDL_SwapBE16(v);
152 }
153
154
155 #else  /* Cpu can not access unaligned memory: */
156
157
158 static inline uae_u32 do_get_mem_long(void *a)
159 {
160         uae_u8 *b = (uae_u8 *)a;
161
162         return (b[0] << 24) | (b[1] << 16) | (b[2] << 8) | b[3];
163 }
164
165 static inline uae_u16 do_get_mem_word(void *a)
166 {
167         uae_u8 *b = (uae_u8 *)a;
168
169         return (b[0] << 8) | b[1];
170 }
171
172
173 static inline void do_put_mem_long(void *a, uae_u32 v)
174 {
175         uae_u8 *b = (uae_u8 *)a;
176
177         b[0] = v >> 24;
178         b[1] = v >> 16;    
179         b[2] = v >> 8;
180         b[3] = v;
181 }
182
183 static inline void do_put_mem_word(void *a, uae_u16 v)
184 {
185         uae_u8 *b = (uae_u8 *)a;
186
187         b[0] = v >> 8;
188         b[1] = v;
189 }
190
191
192 #endif  /* CPU_CAN_ACCESS_UNALIGNED */
193
194
195 /* These are same for all architectures: */
196
197 static inline uae_u8 do_get_mem_byte(uae_u8 *a)
198 {
199         return *a;
200 }
201
202 static inline void do_put_mem_byte(uae_u8 *a, uae_u8 v)
203 {
204         *a = v;
205 }
206 #endif
207
208 #endif  // __MEMORY_H__