]> Shamusworld >> Repos - virtualjaguar/blob - src/memory.h
c2e49df78d23e9cc4596473afbcf587fd46c26fa
[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 "types.h"
11
12 extern uint8 jagMemSpace[];
13
14 extern uint8 * jaguarMainRAM;
15 extern uint8 * jaguarMainROM;
16 extern uint8 jaguarBootROM[];
17 extern uint8 jaguarCDBootROM[];
18 extern uint8 * gpuRAM;
19 extern uint8 * dspRAM;
20
21 extern uint16 & memcon1, & memcon2, & hc, & vc, & lph, & lpv;
22
23 #if 1
24 extern uint32 & butch, & dscntrl;
25 extern uint16 & ds_data;
26 extern uint32 & i2cntrl, & sbcntrl, & subdata, & subdatb, & sb_time, & fifo_data, & i2sdat2, & unknown;
27 #else
28 extern uint32 butch, dscntrl, ds_data, i2cntrl, sbcntrl, subdata, subdatb, sb_time, fifo_data, i2sdat2, unknown;
29 #endif
30
31 extern uint32 obData, olp, obf, vmode, bord1, bord2, hp, hbb, hbe, hs, hvs,
32         hdb1, hdb2, hde, vp, vbb, vbe, vs, vdb, vde, veb, vee, vi, pit0, pit1, heq, bg, int1, int2, clut, lbuf,
33         g_flags, g_mtxc, g_mtxa, g_end, g_pc, g_ctrl, g_hidata, g_remain, g_divctrl,
34         a1_base, a1_pixel, a1_flags, a1_clip, a1_step, a1_fstep, a1_fpixel, a1_inc, a1_finc,
35         a2_base, a2_flags, a2_pixel, a2_mask, a2_step, b_cmd, b_count, b_srcd, b_dstd, b_dstz, b_srcz1, b_srcz2,
36         b_patd, b_iinc, b_zinc, b_stop, b_i3, b_i2, b_i1, b_i0, b_z3, b_z2, b_z1, b_z0,
37         jpit1, jpit2, jpit3, jpit4, clk1, clk2, clk3, j_int, asidata, asistat, asictrl, asiclk, joystick,
38         joybuts, d_flags, d_mtxc, d_mtxa, d_end, d_pc, d_ctrl, d_mod, d_remain, d_divctrl, d_machi,
39         ltxd, rtxd, sstat, sclk, smode;
40
41 // Read/write tracing enumeration
42
43 enum { UNKNOWN, JAGUAR, DSP, GPU, TOM, JERRY, M68K, BLITTER, OP };
44 extern const char * whoName[9];
45
46 // Some handy macros to help converting native endian to big endian (jaguar native)
47 // & vice versa
48
49 #define SET64(r, a, v)  r[(a)] = ((v) & 0xFF00000000000000) >> 56, r[(a)+1] = ((v) & 0x00FF000000000000) >> 48, \
50                                                 r[(a)+2] = ((v) & 0x0000FF0000000000) >> 40, r[(a)+3] = ((v) & 0x000000FF00000000) >> 32, \
51                                                 r[(a)+4] = ((v) & 0xFF000000) >> 24, r[(a)+5] = ((v) & 0x00FF0000) >> 16, \
52                                                 r[(a)+6] = ((v) & 0x0000FF00) >> 8, r[(a)+7] = (v) & 0x000000FF
53 #define GET64(r, a)             (((uint64)r[(a)] << 56) | ((uint64)r[(a)+1] << 48) | \
54                                                 ((uint64)r[(a)+2] << 40) | ((uint64)r[(a)+3] << 32) | \
55                                                 ((uint64)r[(a)+4] << 24) | ((uint64)r[(a)+5] << 16) | \
56                                                 ((uint64)r[(a)+6] << 8) | (uint64)r[(a)+7])
57 #define SET32(r, a, v)  r[(a)] = ((v) & 0xFF000000) >> 24, r[(a)+1] = ((v) & 0x00FF0000) >> 16, \
58                                                 r[(a)+2] = ((v) & 0x0000FF00) >> 8, r[(a)+3] = (v) & 0x000000FF
59 #define GET32(r, a)             ((r[(a)] << 24) | (r[(a)+1] << 16) | (r[(a)+2] << 8) | r[(a)+3])
60 #define SET16(r, a, v)  r[(a)] = ((v) & 0xFF00) >> 8, r[(a)+1] = (v) & 0xFF
61 #define GET16(r, a)             ((r[(a)] << 8) | r[(a)+1])
62
63 // This is GCC specific, but we can fix that if we need to...
64 // Big plus of this approach is that these compile down to single instructions on little
65 // endian machines while one big endian machines we don't have any overhead. :-)
66
67 #include <byteswap.h>
68 #include <endian.h>
69
70 #if __BYTE_ORDER == __LITTLE_ENDIAN
71         #define ESAFE16(x)      bswap_16(x)
72         #define ESAFE32(x)      bswap_32(x)
73         #define ESAFE64(x)      bswap_64(x)
74 #else
75         #define ESAFE16(x)      (x)
76         #define ESAFE32(x)      (x)
77         #define ESAFE64(x)      (x)
78 #endif
79
80 #endif  // __MEMORY_H__