2 // MEMORY.H: Header file
4 // All Jaguar related memory and I/O locations are contained in this file
12 extern uint8 jagMemSpace[];
14 extern uint8 * jaguarMainRAM;
15 extern uint8 * jaguarMainROM;
16 //extern uint8 jaguarBootROM[];
17 //extern uint8 jaguarCDBootROM[];
18 //extern uint8 jaguarDevBootROM1[];
19 //extern uint8 jaguarDevBootROM2[];
20 //extern uint8 jaguarDevCDBootROM[];
21 extern uint8 * gpuRAM;
22 extern uint8 * dspRAM;
25 extern uint32 & butch, & dscntrl;
26 extern uint16 & ds_data;
27 extern uint32 & i2cntrl, & sbcntrl, & subdata, & subdatb, & sb_time, & fifo_data, & i2sdat2, & unknown;
29 extern uint32 butch, dscntrl, ds_data, i2cntrl, sbcntrl, subdata, subdatb, sb_time, fifo_data, i2sdat2, unknown;
32 extern uint16 & memcon1, & memcon2, & hc, & vc, & lph, & lpv;
33 extern uint64 & obData;
35 extern uint16 & obf, & vmode, & bord1, & bord2, & hp, & hbb, & hbe, & hs,
36 & hvs, & hdb1, & hdb2, & hde, & vp, & vbb, & vbe, & vs, & vdb, & vde,
37 & veb, & vee, & vi, & pit0, & pit1, & heq;
39 extern uint16 & int1, & int2;
40 extern uint8 * clut, * lbuf;
41 extern uint32 & g_flags, & g_mtxc, & g_mtxa, & g_end, & g_pc, & g_ctrl,
42 & g_hidata, & g_divctrl;
43 extern uint32 g_remain;
44 extern uint32 & a1_base, & a1_flags, & a1_clip, & a1_pixel, & a1_step,
45 & a1_fstep, & a1_fpixel, & a1_inc, & a1_finc, & a2_base, & a2_flags,
46 & a2_mask, & a2_pixel, & a2_step, & b_cmd, & b_count;
47 extern uint64 & b_srcd, & b_dstd, & b_dstz, & b_srcz1, & b_srcz2, & b_patd;
48 extern uint32 & b_iinc, & b_zinc, & b_stop, & b_i3, & b_i2, & b_i1, & b_i0, & b_z3,
49 & b_z2, & b_z1, & b_z0;
50 extern uint16 & jpit1, & jpit2, & jpit3, & jpit4, & clk1, & clk2, & clk3, & j_int,
52 extern uint16 asistat;
53 extern uint16 & asiclk, & joystick, & joybuts;
54 extern uint32 & d_flags, & d_mtxc, & d_mtxa, & d_end, & d_pc, & d_ctrl,
56 extern uint32 d_remain;
57 extern uint32 & d_machi;
58 extern uint16 & ltxd, lrxd, & rtxd, rrxd;
59 extern uint8 & sclk, sstat;
60 extern uint32 & smode;
62 uint16 & ltxd = *((uint16 *)&jagMemSpace[0xF1A148]);
63 uint16 lrxd; // Dual register with $F1A148
64 uint16 & rtxd = *((uint16 *)&jagMemSpace[0xF1A14C]);
65 uint16 rrxd; // Dual register with $F1A14C
66 uint8 & sclk = *((uint8 *) &jagMemSpace[0xF1A150]);
67 uint8 sstat; // Dual register with $F1A150
68 uint32 & smode = *((uint32 *)&jagMemSpace[0xF1A154]);
71 // Read/write tracing enumeration
73 enum { UNKNOWN, JAGUAR, DSP, GPU, TOM, JERRY, M68K, BLITTER, OP };
74 extern const char * whoName[9];
76 // BIOS identification enum
78 //enum { BIOS_NORMAL=0x01, BIOS_CD=0x02, BIOS_STUB1=0x04, BIOS_STUB2=0x08, BIOS_DEV_CD=0x10 };
79 //extern int biosAvailable;
81 // Some handy macros to help converting native endian to big endian (jaguar native)
84 #define SET64(r, a, v) r[(a)] = ((v) & 0xFF00000000000000) >> 56, r[(a)+1] = ((v) & 0x00FF000000000000) >> 48, \
85 r[(a)+2] = ((v) & 0x0000FF0000000000) >> 40, r[(a)+3] = ((v) & 0x000000FF00000000) >> 32, \
86 r[(a)+4] = ((v) & 0xFF000000) >> 24, r[(a)+5] = ((v) & 0x00FF0000) >> 16, \
87 r[(a)+6] = ((v) & 0x0000FF00) >> 8, r[(a)+7] = (v) & 0x000000FF
88 #define GET64(r, a) (((uint64)r[(a)] << 56) | ((uint64)r[(a)+1] << 48) | \
89 ((uint64)r[(a)+2] << 40) | ((uint64)r[(a)+3] << 32) | \
90 ((uint64)r[(a)+4] << 24) | ((uint64)r[(a)+5] << 16) | \
91 ((uint64)r[(a)+6] << 8) | (uint64)r[(a)+7])
92 #define SET32(r, a, v) r[(a)] = ((v) & 0xFF000000) >> 24, r[(a)+1] = ((v) & 0x00FF0000) >> 16, \
93 r[(a)+2] = ((v) & 0x0000FF00) >> 8, r[(a)+3] = (v) & 0x000000FF
94 #define GET32(r, a) ((r[(a)] << 24) | (r[(a)+1] << 16) | (r[(a)+2] << 8) | r[(a)+3])
95 #define SET16(r, a, v) r[(a)] = ((v) & 0xFF00) >> 8, r[(a)+1] = (v) & 0xFF
96 #define GET16(r, a) ((r[(a)] << 8) | r[(a)+1])
98 //This doesn't seem to work on OSX. So have to figure something else out. :-(
99 //byteswap.h doesn't exist on OSX.
101 // This is GCC specific, but we can fix that if we need to...
102 // Big plus of this approach is that these compile down to single instructions on little
103 // endian machines while one big endian machines we don't have any overhead. :-)
105 #include <byteswap.h>
108 #if __BYTE_ORDER == __LITTLE_ENDIAN
109 #define ESAFE16(x) bswap_16(x)
110 #define ESAFE32(x) bswap_32(x)
111 #define ESAFE64(x) bswap_64(x)
113 #define ESAFE16(x) (x)
114 #define ESAFE32(x) (x)
115 #define ESAFE64(x) (x)
120 Stuff ripped out of Hatari, that may be useful:
122 /* Can the actual CPU access unaligned memory? */
123 #ifndef CPU_CAN_ACCESS_UNALIGNED
124 # if defined(__i386__) || defined(powerpc) || defined(__mc68020__)
125 # define CPU_CAN_ACCESS_UNALIGNED 1
127 # define CPU_CAN_ACCESS_UNALIGNED 0
132 /* If the CPU can access unaligned memory, use these accelerated functions: */
133 #if CPU_CAN_ACCESS_UNALIGNED
135 #include <SDL_endian.h>
138 static inline uae_u32 do_get_mem_long(void *a)
140 return SDL_SwapBE32(*(uae_u32 *)a);
143 static inline uae_u16 do_get_mem_word(void *a)
145 return SDL_SwapBE16(*(uae_u16 *)a);
149 static inline void do_put_mem_long(void *a, uae_u32 v)
151 *(uae_u32 *)a = SDL_SwapBE32(v);
154 static inline void do_put_mem_word(void *a, uae_u16 v)
156 *(uae_u16 *)a = SDL_SwapBE16(v);
160 #else /* Cpu can not access unaligned memory: */
163 static inline uae_u32 do_get_mem_long(void *a)
165 uae_u8 *b = (uae_u8 *)a;
167 return (b[0] << 24) | (b[1] << 16) | (b[2] << 8) | b[3];
170 static inline uae_u16 do_get_mem_word(void *a)
172 uae_u8 *b = (uae_u8 *)a;
174 return (b[0] << 8) | b[1];
178 static inline void do_put_mem_long(void *a, uae_u32 v)
180 uae_u8 *b = (uae_u8 *)a;
188 static inline void do_put_mem_word(void *a, uae_u16 v)
190 uae_u8 *b = (uae_u8 *)a;
197 #endif /* CPU_CAN_ACCESS_UNALIGNED */
200 /* These are same for all architectures: */
202 static inline uae_u8 do_get_mem_byte(uae_u8 *a)
207 static inline void do_put_mem_byte(uae_u8 *a, uae_u8 v)
213 #endif // __MEMORY_H__