~ubuntu-branches/ubuntu/lucid/audacious-plugins/lucid

« back to all changes in this revision

Viewing changes to src/psf/mamemem.h

  • Committer: Bazaar Package Importer
  • Author(s): Andreas Moog, Bhavani Shankar, Andreas Moog
  • Date: 2009-07-23 13:02:52 UTC
  • mfrom: (1.1.11 upstream) (2.1.3 squeeze)
  • Revision ID: james.westby@ubuntu.com-20090723130252-88k8ejg21lwmh5ma
Tags: 2.1-1ubuntu1
[ Bhavani Shankar ]
* Merge from debian unstable, remaining changes: LP: #399617
  - debian/control:
    + audacious-plugins-extra depends on audacious-plugins
    + audacious-plugins suggests timidiy for midi playback
    + Move PulseAudio from description of extra to main package.
  - debian/rules:
    + Install pulse_audio.so in audacious-plugins dir.
    + Add --disable-arts to ./configure
* Remove debian/patches/cuesheet.patch as its already superceeded in 
  debian.

[ Andreas Moog ]
* install /usr/lib/audacious/General/gtkui.so to audacious-plugins.
* Fixes also: LP: #403387

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#ifndef _MEMORY_H
 
2
#define _MEMORY_H
 
3
 
 
4
#include <stddef.h>
 
5
 
 
6
#ifdef __cplusplus
 
7
extern "C" {
 
8
#endif
 
9
 
 
10
#ifdef __GNU__
 
11
#define UNUSEDARG __attribute__((__unused__))
 
12
#else
 
13
#define UNUSEDARG
 
14
#endif
 
15
 
 
16
#define MAX_BANKS               20
 
17
 
 
18
 
 
19
/* obsolete, to be removed */
 
20
#define READ_WORD(a)              (*(UINT16 *)(a))
 
21
#define WRITE_WORD(a,d)           (*(UINT16 *)(a) = (d))
 
22
#define COMBINE_WORD(w,d)         (((w) & ((d) >> 16)) | ((d) & 0xffff))
 
23
#define COMBINE_WORD_MEM(a,d) (WRITE_WORD((a), (READ_WORD(a) & ((d) >> 16)) | (d)))
 
24
 
 
25
#define ASSERT_LINE (1)
 
26
#define CLEAR_LINE  (0)
 
27
#define TIME_NEVER (0)
 
28
 
 
29
#define TIME_IN_HZ(hz)        (1.0 / (double)(hz))
 
30
#define TIME_IN_MSEC(ms)      ((double)(ms) * (1.0 / 1000.0))
 
31
#define TIME_IN_USEC(us)      ((double)(us) * (1.0 / 1000000.0))
 
32
 
 
33
/***************************************************************************
 
34
 
 
35
Note that the memory hooks are not passed the actual memory address where
 
36
the operation takes place, but the offset from the beginning of the block
 
37
they are assigned to. This makes handling of mirror addresses easier, and
 
38
makes the handlers a bit more "object oriented". If you handler needs to
 
39
read/write the main memory area, provide a "base" pointer: it will be
 
40
initialized by the main engine to point to the beginning of the memory block
 
41
assigned to the handler. You may also provided a pointer to "size": it
 
42
will be set to the length of the memory area processed by the handler.
 
43
 
 
44
***************************************************************************/
 
45
 
 
46
#define MEMORY_WIDTH_MASK               0x00000003
 
47
#define MEMORY_WIDTH_8                  0x00000001
 
48
#define MEMORY_WIDTH_16                 0x00000002
 
49
#define MEMORY_WIDTH_32                 0x00000003
 
50
 
 
51
#define MEMORY_TYPE_MASK                0x30000000
 
52
#define MEMORY_TYPE_MEM                 0x10000000
 
53
#define MEMORY_TYPE_IO                  0x20000000
 
54
 
 
55
#define MEMORY_DIRECTION_MASK   0xc0000000
 
56
#define MEMORY_DIRECTION_READ   0x40000000
 
57
#define MEMORY_DIRECTION_WRITE  0x80000000
 
58
 
 
59
typedef unsigned int offs_t;
 
60
typedef offs_t (*opbase_handler)(UNUSEDARG offs_t address);
 
61
 
 
62
/***************************************************************************
 
63
        8-BIT   Core memory read/write/opbase handler types
 
64
***************************************************************************/
 
65
 
 
66
typedef unsigned char data8_t;
 
67
typedef unsigned short data16_t;
 
68
 
 
69
typedef data8_t (*mem_read_handler)(UNUSEDARG offs_t offset);
 
70
typedef void (*mem_write_handler)(UNUSEDARG offs_t offset, UNUSEDARG data8_t data);
 
71
 
 
72
#define READ_HANDLER(name) data8_t name(UNUSEDARG offs_t offset)
 
73
#define WRITE_HANDLER(name) void name(UNUSEDARG offs_t offset, UNUSEDARG data8_t data)
 
74
#define OPBASE_HANDLER(name) offs_t name(UNUSEDARG offs_t address)
 
75
 
 
76
#define READ16_HANDLER(name) data16_t name(UNUSEDARG offs_t offset, UNUSEDARG UINT32 mem_mask)
 
77
#define WRITE16_HANDLER(name) void name(UNUSEDARG offs_t offset, UNUSEDARG data16_t data, UNUSEDARG UINT32 mem_mask)
 
78
#define OPBASE16_HANDLER(name) offs_t name(UNUSEDARG offs_t address)
 
79
 
 
80
#define MRA_NOP 0                           /* don't care, return 0 */
 
81
#define MWA_NOP 0                                                       /* do nothing */
 
82
#define MRA_RAM ((mem_read_handler)-1)          /* plain RAM location (return its contents) */
 
83
#define MWA_RAM ((mem_write_handler)-1)         /* plain RAM location (store the value) */
 
84
#define MRA_ROM ((mem_read_handler)-2)          /* plain ROM location (return its contents) */
 
85
#define MWA_ROM ((mem_write_handler)-2)         /* plain ROM location (do nothing) */
 
86
/**************************************************************************
 
87
 * If the CPU opcodes are encrypted, they are fetched from a different
 
88
 * memory space. In such a case, if the program dynamically creates code
 
89
 * in RAM and executes it, it won't work unless you use MWA_RAMROM
 
90
 * to affect both memory spaces.
 
91
 **************************************************************************/
 
92
#define MWA_RAMROM ((mem_write_handler)-3)
 
93
 
 
94
/* bank memory */
 
95
#define MRA_BANK1 ((mem_read_handler)-10)
 
96
#define MWA_BANK1 ((mem_write_handler)-10)
 
97
#define MRA_BANK2 ((mem_read_handler)-11)
 
98
#define MWA_BANK2 ((mem_write_handler)-11)
 
99
#define MRA_BANK3 ((mem_read_handler)-12)
 
100
#define MWA_BANK3 ((mem_write_handler)-12)
 
101
#define MRA_BANK4 ((mem_read_handler)-13)
 
102
#define MWA_BANK4 ((mem_write_handler)-13)
 
103
#define MRA_BANK5 ((mem_read_handler)-14)
 
104
#define MWA_BANK5 ((mem_write_handler)-14)
 
105
#define MRA_BANK6 ((mem_read_handler)-15)
 
106
#define MWA_BANK6 ((mem_write_handler)-15)
 
107
#define MRA_BANK7 ((mem_read_handler)-16)
 
108
#define MWA_BANK7 ((mem_write_handler)-16)
 
109
#define MRA_BANK8 ((mem_read_handler)-17)
 
110
#define MWA_BANK8 ((mem_write_handler)-17)
 
111
#define MRA_BANK9 ((mem_read_handler)-18)
 
112
#define MWA_BANK9 ((mem_write_handler)-18)
 
113
#define MRA_BANK10 ((mem_read_handler)-19)
 
114
#define MWA_BANK10 ((mem_write_handler)-19)
 
115
#define MRA_BANK11 ((mem_read_handler)-20)
 
116
#define MWA_BANK11 ((mem_write_handler)-20)
 
117
#define MRA_BANK12 ((mem_read_handler)-21)
 
118
#define MWA_BANK12 ((mem_write_handler)-21)
 
119
#define MRA_BANK13 ((mem_read_handler)-22)
 
120
#define MWA_BANK13 ((mem_write_handler)-22)
 
121
#define MRA_BANK14 ((mem_read_handler)-23)
 
122
#define MWA_BANK14 ((mem_write_handler)-23)
 
123
#define MRA_BANK15 ((mem_read_handler)-24)
 
124
#define MWA_BANK15 ((mem_write_handler)-24)
 
125
#define MRA_BANK16 ((mem_read_handler)-25)
 
126
#define MWA_BANK16 ((mem_write_handler)-25)
 
127
#define MRA_BANK17 ((mem_read_handler)-26)
 
128
#define MWA_BANK17 ((mem_write_handler)-26)
 
129
#define MRA_BANK18 ((mem_read_handler)-27)
 
130
#define MWA_BANK18 ((mem_write_handler)-27)
 
131
#define MRA_BANK19 ((mem_read_handler)-28)
 
132
#define MWA_BANK19 ((mem_write_handler)-28)
 
133
#define MRA_BANK20 ((mem_read_handler)-29)
 
134
#define MWA_BANK20 ((mem_write_handler)-29)
 
135
 
 
136
struct Memory_ReadAddress
 
137
{
 
138
        offs_t start, end;
 
139
        mem_read_handler handler;                               /* see special values above */
 
140
};
 
141
 
 
142
struct Memory_WriteAddress
 
143
{
 
144
    offs_t start, end;
 
145
        mem_write_handler handler;                              /* see special values above */
 
146
        data8_t **base;                                                 /* optional (see explanation above) */
 
147
    size_t *size;                           /* optional (see explanation above) */
 
148
};
 
149
 
 
150
#define MEMORY_MARKER ((offs_t)~0)
 
151
 
 
152
#define MEMORY_END { MEMORY_MARKER, 0 } };
 
153
 
 
154
#define IS_MEMORY_MARKER( ma ) ((ma)->start == MEMORY_MARKER && (ma)->end < MEMORY_MARKER)
 
155
#define IS_MEMORY_END( ma ) ((ma)->start == MEMORY_MARKER && (ma)->end == 0)
 
156
 
 
157
#define MEMORY_READ_START(name) const struct Memory_ReadAddress name[] = { \
 
158
        { MEMORY_MARKER, MEMORY_DIRECTION_READ | MEMORY_TYPE_MEM | MEMORY_WIDTH_8 },
 
159
#define MEMORY_WRITE_START(name) const struct Memory_WriteAddress name[] = { \
 
160
        { MEMORY_MARKER, MEMORY_DIRECTION_WRITE | MEMORY_TYPE_MEM | MEMORY_WIDTH_8 },
 
161
 
 
162
/***************************************************************************
 
163
        16-BIT  Core memory read/write/opbase handler types
 
164
***************************************************************************/
 
165
 
 
166
typedef data16_t (*mem_read16_handler)(UNUSEDARG offs_t offset);
 
167
typedef void (*mem_write16_handler)(UNUSEDARG offs_t offset, UNUSEDARG data16_t data, UNUSEDARG UINT32 mem_mask);
 
168
 
 
169
#define READ16_HANDLER(name) data16_t name(UNUSEDARG offs_t offset, UNUSEDARG UINT32 mem_mask)
 
170
#define WRITE16_HANDLER(name) void name(UNUSEDARG offs_t offset, UNUSEDARG data16_t data, UNUSEDARG UINT32 mem_mask)
 
171
#define OPBASE16_HANDLER(name) offs_t name(UNUSEDARG offs_t address)
 
172
 
 
173
#define MRA16_NOP 0                                             /* don't care, return 0 */
 
174
#define MWA16_NOP 0                                             /* do nothing */
 
175
#define MRA16_RAM ((mem_read16_handler)-1)  /* plain RAM location (return its contents) */
 
176
#define MWA16_RAM ((mem_write16_handler)-1) /* plqain RAM location (store the value) */
 
177
#define MRA16_ROM ((mem_read16_handler)-2)      /* plain ROM location (return its contents) */
 
178
#define MWA16_ROM ((mem_write16_handler)-2) /* plain ROM location (do nothing) */
 
179
/**************************************************************************
 
180
 * If the CPU opcodes are encrypted, they are fetched from a different
 
181
 * memory space. In such a case, if the program dynamically creates code
 
182
 * in RAM and executes it, it won't work unless you use MWA_RAMROM
 
183
 * to affect both memory spaces.
 
184
 **************************************************************************/
 
185
#define MWA16_RAMROM ((mem_write16_handler)-3)
 
186
 
 
187
/* bank memory */
 
188
#define MRA16_BANK1 ((mem_read16_handler)-10)
 
189
#define MWA16_BANK1 ((mem_write16_handler)-10)
 
190
#define MRA16_BANK2 ((mem_read16_handler)-11)
 
191
#define MWA16_BANK2 ((mem_write16_handler)-11)
 
192
#define MRA16_BANK3 ((mem_read16_handler)-12)
 
193
#define MWA16_BANK3 ((mem_write16_handler)-12)
 
194
#define MRA16_BANK4 ((mem_read16_handler)-13)
 
195
#define MWA16_BANK4 ((mem_write16_handler)-13)
 
196
#define MRA16_BANK5 ((mem_read16_handler)-14)
 
197
#define MWA16_BANK5 ((mem_write16_handler)-14)
 
198
#define MRA16_BANK6 ((mem_read16_handler)-15)
 
199
#define MWA16_BANK6 ((mem_write16_handler)-15)
 
200
#define MRA16_BANK7 ((mem_read16_handler)-16)
 
201
#define MWA16_BANK7 ((mem_write16_handler)-16)
 
202
#define MRA16_BANK8 ((mem_read16_handler)-17)
 
203
#define MWA16_BANK8 ((mem_write16_handler)-17)
 
204
#define MRA16_BANK9 ((mem_read16_handler)-18)
 
205
#define MWA16_BANK9 ((mem_write16_handler)-18)
 
206
#define MRA16_BANK10 ((mem_read16_handler)-19)
 
207
#define MWA16_BANK10 ((mem_write16_handler)-19)
 
208
#define MRA16_BANK11 ((mem_read16_handler)-20)
 
209
#define MWA16_BANK11 ((mem_write16_handler)-20)
 
210
#define MRA16_BANK12 ((mem_read16_handler)-21)
 
211
#define MWA16_BANK12 ((mem_write16_handler)-21)
 
212
#define MRA16_BANK13 ((mem_read16_handler)-22)
 
213
#define MWA16_BANK13 ((mem_write16_handler)-22)
 
214
#define MRA16_BANK14 ((mem_read16_handler)-23)
 
215
#define MWA16_BANK14 ((mem_write16_handler)-23)
 
216
#define MRA16_BANK15 ((mem_read16_handler)-24)
 
217
#define MWA16_BANK15 ((mem_write16_handler)-24)
 
218
#define MRA16_BANK16 ((mem_read16_handler)-25)
 
219
#define MWA16_BANK16 ((mem_write16_handler)-25)
 
220
#define MRA16_BANK17 ((mem_read16_handler)-26)
 
221
#define MWA16_BANK17 ((mem_write16_handler)-26)
 
222
#define MRA16_BANK18 ((mem_read16_handler)-27)
 
223
#define MWA16_BANK18 ((mem_write16_handler)-27)
 
224
#define MRA16_BANK19 ((mem_read16_handler)-28)
 
225
#define MWA16_BANK19 ((mem_write16_handler)-28)
 
226
#define MRA16_BANK20 ((mem_read16_handler)-29)
 
227
#define MWA16_BANK20 ((mem_write16_handler)-29)
 
228
 
 
229
struct Memory_ReadAddress16
 
230
{
 
231
        offs_t start, end;
 
232
        mem_read16_handler handler;                     /* see special values above */
 
233
};
 
234
 
 
235
struct Memory_WriteAddress16
 
236
{
 
237
        offs_t start, end;
 
238
        mem_write16_handler handler;                    /* see special values above */
 
239
        data16_t **base;                                                /* optional (see explanation above) */
 
240
    size_t *size;                           /* optional (see explanation above) */
 
241
};
 
242
 
 
243
#define MEMORY_READ16_START(name) const struct Memory_ReadAddress16 name[] = { \
 
244
        { MEMORY_MARKER, MEMORY_DIRECTION_READ | MEMORY_TYPE_MEM | MEMORY_WIDTH_16 },
 
245
#define MEMORY_WRITE16_START(name) const struct Memory_WriteAddress16 name[] = { \
 
246
        { MEMORY_MARKER, MEMORY_DIRECTION_WRITE | MEMORY_TYPE_MEM | MEMORY_WIDTH_16 },
 
247
 
 
248
/***************************************************************************
 
249
        32-BIT  Core memory read/write/opbase handler types
 
250
***************************************************************************/
 
251
 
 
252
typedef UINT32 data32_t;
 
253
 
 
254
typedef data32_t (*mem_read32_handler)(UNUSEDARG offs_t offset);
 
255
typedef void (*mem_write32_handler)(UNUSEDARG offs_t offset, UNUSEDARG data32_t data, UNUSEDARG UINT32 mem_mask);
 
256
 
 
257
#define READ32_HANDLER(name) data32_t name(UNUSEDARG offs_t offset, UNUSEDARG UINT32 mem_mask)
 
258
#define WRITE32_HANDLER(name) void name(UNUSEDARG offs_t offset, UNUSEDARG data32_t data, UNUSEDARG UINT32 mem_mask)
 
259
#define OPBASE32_HANDLER(name) offs_t name(UNUSEDARG offs_t address)
 
260
 
 
261
#define MRA32_NOP 0                                             /* don't care, return 0 */
 
262
#define MWA32_NOP 0                                             /* do nothing */
 
263
#define MRA32_RAM ((mem_read32_handler)-1)  /* plain RAM location (return its contents) */
 
264
#define MWA32_RAM ((mem_write32_handler)-1) /* plain RAM location (store the value) */
 
265
#define MRA32_ROM ((mem_read32_handler)-2)      /* plain ROM location (return its contents) */
 
266
#define MWA32_ROM ((mem_write32_handler)-2) /* plain ROM location (do nothing) */
 
267
/**************************************************************************
 
268
 * If the CPU opcodes are encrypted, they are fetched from a different
 
269
 * memory space. In such a case, if the program dynamically creates code
 
270
 * in RAM and executes it, it won't work unless you use MWA_RAMROM
 
271
 * to affect both memory spaces.
 
272
 **************************************************************************/
 
273
#define MWA32_RAMROM ((mem_write32_handler)-3)
 
274
 
 
275
/* bank memory */
 
276
#define MRA32_BANK1 ((mem_read32_handler)-10)
 
277
#define MWA32_BANK1 ((mem_write32_handler)-10)
 
278
#define MRA32_BANK2 ((mem_read32_handler)-11)
 
279
#define MWA32_BANK2 ((mem_write32_handler)-11)
 
280
#define MRA32_BANK3 ((mem_read32_handler)-12)
 
281
#define MWA32_BANK3 ((mem_write32_handler)-12)
 
282
#define MRA32_BANK4 ((mem_read32_handler)-13)
 
283
#define MWA32_BANK4 ((mem_write32_handler)-13)
 
284
#define MRA32_BANK5 ((mem_read32_handler)-14)
 
285
#define MWA32_BANK5 ((mem_write32_handler)-14)
 
286
#define MRA32_BANK6 ((mem_read32_handler)-15)
 
287
#define MWA32_BANK6 ((mem_write32_handler)-15)
 
288
#define MRA32_BANK7 ((mem_read32_handler)-16)
 
289
#define MWA32_BANK7 ((mem_write32_handler)-16)
 
290
#define MRA32_BANK8 ((mem_read32_handler)-17)
 
291
#define MWA32_BANK8 ((mem_write32_handler)-17)
 
292
#define MRA32_BANK9 ((mem_read32_handler)-18)
 
293
#define MWA32_BANK9 ((mem_write32_handler)-18)
 
294
#define MRA32_BANK10 ((mem_read32_handler)-19)
 
295
#define MWA32_BANK10 ((mem_write32_handler)-19)
 
296
#define MRA32_BANK11 ((mem_read32_handler)-20)
 
297
#define MWA32_BANK11 ((mem_write32_handler)-20)
 
298
#define MRA32_BANK12 ((mem_read32_handler)-21)
 
299
#define MWA32_BANK12 ((mem_write32_handler)-21)
 
300
#define MRA32_BANK13 ((mem_read32_handler)-22)
 
301
#define MWA32_BANK13 ((mem_write32_handler)-22)
 
302
#define MRA32_BANK14 ((mem_read32_handler)-23)
 
303
#define MWA32_BANK14 ((mem_write32_handler)-23)
 
304
#define MRA32_BANK15 ((mem_read32_handler)-24)
 
305
#define MWA32_BANK15 ((mem_write32_handler)-24)
 
306
#define MRA32_BANK32 ((mem_read32_handler)-25)
 
307
#define MWA32_BANK32 ((mem_write32_handler)-25)
 
308
#define MRA32_BANK17 ((mem_read32_handler)-26)
 
309
#define MWA32_BANK17 ((mem_write32_handler)-26)
 
310
#define MRA32_BANK18 ((mem_read32_handler)-27)
 
311
#define MWA32_BANK18 ((mem_write32_handler)-27)
 
312
#define MRA32_BANK19 ((mem_read32_handler)-28)
 
313
#define MWA32_BANK19 ((mem_write32_handler)-28)
 
314
#define MRA32_BANK20 ((mem_read32_handler)-29)
 
315
#define MWA32_BANK20 ((mem_write32_handler)-29)
 
316
 
 
317
struct Memory_ReadAddress32
 
318
{
 
319
        offs_t start, end;
 
320
        mem_read32_handler handler;                     /* see special values above */
 
321
};
 
322
 
 
323
struct Memory_WriteAddress32
 
324
{
 
325
        offs_t start, end;
 
326
        mem_write32_handler handler;                    /* see special values above */
 
327
        data32_t **base;                                                /* optional (see explanation above) */
 
328
        size_t *size;                                                   /* optional (see explanation above) */
 
329
};
 
330
 
 
331
#define MEMORY_READ32_START(name) const struct Memory_ReadAddress32 name[] = { \
 
332
        { MEMORY_MARKER, MEMORY_DIRECTION_READ | MEMORY_TYPE_MEM | MEMORY_WIDTH_32 },
 
333
#define MEMORY_WRITE32_START(name) const struct Memory_WriteAddress32 name[] = { \
 
334
        { MEMORY_MARKER, MEMORY_DIRECTION_WRITE | MEMORY_TYPE_MEM | MEMORY_WIDTH_32 },
 
335
 
 
336
/***************************************************************************
 
337
 
 
338
IN and OUT ports are handled like memory accesses, the hook template is the
 
339
same so you can interchange them. Of course there is no 'base' pointer for
 
340
IO ports.
 
341
 
 
342
***************************************************************************/
 
343
 
 
344
struct IO_ReadPort
 
345
{
 
346
        offs_t start,end;
 
347
        mem_read_handler handler;                               /* see special values below */
 
348
};
 
349
 
 
350
#define IORP_NOP 0      /* don't care, return 0 */
 
351
 
 
352
 
 
353
struct IO_WritePort
 
354
{
 
355
        offs_t start,end;
 
356
        mem_write_handler handler;                              /* see special values below */
 
357
};
 
358
 
 
359
#define IOWP_NOP 0      /* do nothing */
 
360
 
 
361
#define PORT_READ_START(name) const struct IO_ReadPort name[] = { \
 
362
        { MEMORY_MARKER, MEMORY_DIRECTION_READ | MEMORY_TYPE_IO | MEMORY_WIDTH_8 },
 
363
#define PORT_WRITE_START(name) const struct IO_WritePort name[] = { \
 
364
        { MEMORY_MARKER, MEMORY_DIRECTION_WRITE | MEMORY_TYPE_IO | MEMORY_WIDTH_8 },
 
365
#define PORT_END        MEMORY_END
 
366
 
 
367
/***************************************************************************
 
368
 
 
369
If a memory region contains areas that are outside of the ROM region for
 
370
an address space, the memory system will allocate an array of structures
 
371
to track the external areas.
 
372
 
 
373
***************************************************************************/
 
374
 
 
375
#define MAX_EXT_MEMORY 64
 
376
 
 
377
struct ExtMemory
 
378
{
 
379
        offs_t start,end,region;
 
380
    UINT8 *data;
 
381
};
 
382
 
 
383
extern struct ExtMemory ext_memory[MAX_EXT_MEMORY];
 
384
 
 
385
 
 
386
 
 
387
/***************************************************************************
 
388
 
 
389
For a given number of address bits, we need to determine how many elements
 
390
there are in the first and second-order lookup tables. We also need to know
 
391
how many low-order bits to ignore. The ABITS* values represent these
 
392
constants for each address space type we support.
 
393
 
 
394
***************************************************************************/
 
395
 
 
396
/* memory element block size */
 
397
#define MH_SBITS                8                       /* sub element bank size */
 
398
#define MH_PBITS                8                       /* port current element size */
 
399
#define MH_ELEMAX               64                      /* sub elements limit */
 
400
#define MH_HARDMAX              64                      /* hardware functions limit */
 
401
 
 
402
/* 16 bits address */
 
403
#define ABITS1_16               12
 
404
#define ABITS2_16               4
 
405
#define ABITS_MIN_16    0                       /* minimum memory block is 1 byte */
 
406
/* 16 bits address (word access) */
 
407
#define ABITS1_16W      12
 
408
#define ABITS2_16W      3
 
409
#define ABITS_MIN_16W 1                 /* minimum memory block is 2 bytes */
 
410
/* 20 bits address */
 
411
#define ABITS1_20               12
 
412
#define ABITS2_20               8
 
413
#define ABITS_MIN_20    0                       /* minimum memory block is 1 byte */
 
414
/* 21 bits address */
 
415
#define ABITS1_21               13
 
416
#define ABITS2_21               8
 
417
#define ABITS_MIN_21    0                       /* minimum memory block is 1 byte */
 
418
/* 24 bits address */
 
419
#define ABITS1_24               16
 
420
#define ABITS2_24               8
 
421
#define ABITS_MIN_24    0                       /* minimum memory block is 1 byte */
 
422
/* 24 bits address (word access) */
 
423
#define ABITS1_24W      15
 
424
#define ABITS2_24W      8
 
425
#define ABITS_MIN_24W 1                 /* minimum memory block is 2 bytes */
 
426
/* 24 bits address (dword access) */
 
427
#define ABITS1_24DW     14
 
428
#define ABITS2_24DW     8
 
429
#define ABITS_MIN_24DW 2                        /* minimum memory block is 4 bytes */
 
430
/* 26 bits address (dword access) */
 
431
#define ABITS1_26DW     16
 
432
#define ABITS2_26DW     8
 
433
#define ABITS_MIN_26DW 2                        /* minimum memory block is 4 bytes */
 
434
/* 29 bits address (word access) */
 
435
#define ABITS1_29W      20
 
436
#define ABITS2_29W      8
 
437
#define ABITS_MIN_29W   1                       /* minimum memory block is 2 bytes */
 
438
/* 32 bits address (word access) */
 
439
#define ABITS1_32W      23
 
440
#define ABITS2_32W      8
 
441
#define ABITS_MIN_32W   1                       /* minimum memory block is 2 bytes */
 
442
/* 32 bits address (dword access) */
 
443
#define ABITS1_32DW     22
 
444
#define ABITS2_32DW     8
 
445
#define ABITS_MIN_32DW  2                       /* minimum memory block is 4 bytes */
 
446
/* mask bits */
 
447
#define MHMASK(abits)    (0xffffffff >> (32 - abits))
 
448
 
 
449
 
 
450
/***************************************************************************
 
451
 
 
452
        Global variables
 
453
 
 
454
***************************************************************************/
 
455
 
 
456
typedef unsigned char MHELE;
 
457
 
 
458
extern MHELE ophw;                              /* opcode handler */
 
459
extern MHELE *cur_mrhard;               /* current set of read handlers */
 
460
extern MHELE *cur_mwhard;               /* current set of write handlers */
 
461
 
 
462
extern UINT8 *OP_RAM;                   /* opcode RAM base */
 
463
extern UINT8 *OP_ROM;                   /* opcode ROM base */
 
464
extern UINT8 *cpu_bankbase[];   /* array of bank bases */
 
465
 
 
466
 
 
467
/* global memory access width and mask (16-bit and 32-bit under-size accesses) */
 
468
//extern UINT32 mem_width;
 
469
//extern UINT32 mem_mask;
 
470
//extern UINT32 mem_offs;
 
471
 
 
472
/***************************************************************************
 
473
 
 
474
        Macros
 
475
 
 
476
***************************************************************************/
 
477
 
 
478
/* ----- 16-bit memory accessing ----- */
 
479
#define COMBINE_DATA(varptr)    (*(varptr) = (*(varptr) & mem_mask) | (data & ~mem_mask))
 
480
#define ACCESSING_LSB ((mem_mask & 0x00ff) == 0)
 
481
#define ACCESSING_MSB ((mem_mask & 0xff00) == 0)
 
482
 
 
483
//extern unsigned char prgrom[128*1024];
 
484
 
 
485
/* ----- opcode reading ----- */
 
486
#define cpu_readop cpu_readmem16
 
487
//#define cpu_readop16(A)       READ_WORD(&prgrom[A&0x3fff])
 
488
//#define cpu_readop32(A)       READ_DWORD(&prgrom[A&0x3fff])
 
489
 
 
490
/* ----- opcode argument reading ----- */
 
491
#define cpu_readop_arg cpu_readmem16
 
492
//#define cpu_readop_arg16(A) READ_WORD(&prgrom[A&0x3fff])
 
493
//#define cpu_readop_arg32(A) READ_DWORD(&prgrom[A&0x3fff])
 
494
 
 
495
/* ----- bank switching for CPU cores ----- */
 
496
#define change_pc_generic(pc,abits2,abitsmin,shift,setop)       \
 
497
{                                                                                                                       \
 
498
        if (cur_mrhard[(pc)>>(abits2+abitsmin+shift)] != ophw)  \
 
499
                setop(pc);                                                                                      \
 
500
}
 
501
#define change_pc16(pc)          
 
502
//change_pc_generic(pc, ABITS2_16, ABITS_MIN_16, 0, cpu_setOPbase16)
 
503
#define change_pc20(pc)          change_pc_generic(pc, ABITS2_20, ABITS_MIN_20, 0, cpu_setOPbase20)
 
504
#define change_pc21(pc)          change_pc_generic(pc, ABITS2_21, ABITS_MIN_21, 0, cpu_setOPbase21)
 
505
#define change_pc24(pc)          change_pc_generic(pc, ABITS2_24, ABITS_MIN_24, 0, cpu_setOPbase24)
 
506
#define change_pc16bew(pc)       change_pc_generic(pc, ABITS2_16W,   ABITS_MIN_16W,   0, cpu_setOPbase16bew)
 
507
#define change_pc16lew(pc)       change_pc_generic(pc, ABITS2_16W,   ABITS_MIN_16W,   0, cpu_setOPbase16lew)
 
508
#define change_pc24bew(pc)       change_pc_generic(pc, ABITS2_24W,   ABITS_MIN_24W,   0, cpu_setOPbase24bew)
 
509
#define change_pc29lew(pc)   change_pc_generic(pc, ABITS2_29W,   ABITS_MIN_29W,   3, cpu_setOPbase29lew)
 
510
#define change_pc32bew(pc)       change_pc_generic(pc, ABITS2_32W,   ABITS_MIN_32W,   0, cpu_setOPbase32bew)
 
511
#define change_pc32lew(pc)       change_pc_generic(pc, ABITS2_32W,   ABITS_MIN_32W,   0, cpu_setOPbase32lew)
 
512
#define change_pc24bedw(pc)      change_pc_generic(pc, ABITS2_24DW,  ABITS_MIN_24DW,  0, cpu_setOPbase24bedw)
 
513
#define change_pc26ledw(pc)      change_pc_generic(pc, ABITS2_26DW,  ABITS_MIN_26DW,  0, cpu_setOPbase26ledw)
 
514
#define change_pc32bedw(pc)  change_pc_generic(pc, ABITS2_32DW,  ABITS_MIN_32DW,  0, cpu_setOPbase32bedw)
 
515
 
 
516
/* backward compatibility */
 
517
#define change_pc(pc)
 
518
// change_pc16(pc)
 
519
 
 
520
/* ----- for use OPbaseOverride driver, request override callback to next cpu_setOPbase ----- */
 
521
#define catch_nextBranch()      (ophw = 0xff)
 
522
 
 
523
/* -----  bank switching macro ----- */
 
524
#define cpu_setbank(bank, base)                                                 \
 
525
{                                                                                                               \
 
526
        if (bank >= 1 && bank <= MAX_BANKS)                             \
 
527
        {                                                                                                       \
 
528
                cpu_bankbase[bank] = (UINT8 *)(base);                   \
 
529
                if (ophw == bank)                                                               \
 
530
                {                                                                                               \
 
531
                        ophw = 0xff;                                                            \
 
532
                        cpu_set_op_base(cpu_get_pc());                          \
 
533
                }                                                                                               \
 
534
        }                                                                                                       \
 
535
}
 
536
 
 
537
 
 
538
/***************************************************************************
 
539
 
 
540
        Function prototypes
 
541
 
 
542
***************************************************************************/
 
543
 
 
544
/* ----- memory setup function ----- */
 
545
 
 
546
/* ----- memory read functions ----- */
 
547
data8_t cpu_readmem16(offs_t address);
 
548
data8_t cpu_readmem20(offs_t address);
 
549
data8_t cpu_readmem21(offs_t address);
 
550
data8_t cpu_readmem24(offs_t address);
 
551
 
 
552
data16_t cpu_readmem16bew(offs_t address);
 
553
data16_t cpu_readmem16bew_word(offs_t address);
 
554
data16_t cpu_readmem16lew(offs_t address);
 
555
data16_t cpu_readmem16lew_word(offs_t address);
 
556
data16_t cpu_readmem24bew(offs_t address);
 
557
data16_t cpu_readmem24bew_word(offs_t address);
 
558
data16_t cpu_readmem29lew(offs_t address);
 
559
data16_t cpu_readmem29lew_word(offs_t address);
 
560
data16_t cpu_readmem32bew(offs_t address);
 
561
data16_t cpu_readmem32bew_word(offs_t address);
 
562
data16_t cpu_readmem32lew(offs_t address);
 
563
data16_t cpu_readmem32lew_word(offs_t address);
 
564
 
 
565
data32_t cpu_readmem24bedw(offs_t address);
 
566
data32_t cpu_readmem24bedw_word(offs_t address);
 
567
data32_t cpu_readmem24bedw_dword(offs_t address);
 
568
data32_t cpu_readmem26ledw(offs_t address);
 
569
data32_t cpu_readmem26ledw_word(offs_t address);
 
570
data32_t cpu_readmem26ledw_dword(offs_t address);
 
571
data32_t cpu_readmem27bedw(offs_t address);
 
572
data32_t cpu_readmem27bedw_word(offs_t address);
 
573
data32_t cpu_readmem27bedw_dword(offs_t address);
 
574
data32_t cpu_readmem32bedw(offs_t address);
 
575
data32_t cpu_readmem32bedw_word(offs_t address);
 
576
data32_t cpu_readmem32bedw_dword(offs_t address);
 
577
 
 
578
/* ----- memory write functions ----- */
 
579
void cpu_writemem16(offs_t address,data8_t data);
 
580
void cpu_writemem20(offs_t address,data8_t data);
 
581
void cpu_writemem21(offs_t address,data8_t data);
 
582
void cpu_writemem24(offs_t address,data8_t data);
 
583
 
 
584
void cpu_writemem16bew(offs_t address,data16_t data);
 
585
void cpu_writemem16bew_word(offs_t address,data16_t data);
 
586
void cpu_writemem16lew(offs_t address,data16_t data);
 
587
void cpu_writemem16lew_word(offs_t address,data16_t data);
 
588
void cpu_writemem24bew(offs_t address,data16_t data);
 
589
void cpu_writemem24bew_word(offs_t address,data16_t data);
 
590
void cpu_writemem29lew(offs_t address,data16_t data);
 
591
void cpu_writemem29lew_word(offs_t address,data16_t data);
 
592
void cpu_writemem32bew(offs_t address,data16_t data);
 
593
void cpu_writemem32bew_word(offs_t address,data16_t data);
 
594
void cpu_writemem32lew(offs_t address,data16_t data);
 
595
void cpu_writemem32lew_word(offs_t address,data16_t data);
 
596
 
 
597
void cpu_writemem24bedw(offs_t address,data32_t data);
 
598
void cpu_writemem24bedw_word(offs_t address,data32_t data);
 
599
void cpu_writemem24bedw_dword(offs_t address,data32_t data);
 
600
void cpu_writemem26ledw(offs_t address,data32_t data);
 
601
void cpu_writemem26ledw_word(offs_t address,data32_t data);
 
602
void cpu_writemem26ledw_dword(offs_t address,data32_t data);
 
603
void cpu_writemem27bedw(offs_t address,data32_t data);
 
604
void cpu_writemem27bedw_word(offs_t address,data32_t data);
 
605
void cpu_writemem27bedw_dword(offs_t address,data32_t data);
 
606
void cpu_writemem32bedw(offs_t address,data32_t data);
 
607
void cpu_writemem32bedw_word(offs_t address,data32_t data);
 
608
void cpu_writemem32bedw_dword(offs_t address,data32_t data);
 
609
 
 
610
/* ----- port I/O functions ----- */
 
611
int cpu_readport(int port);
 
612
void cpu_writeport(int port, int value);
 
613
 
 
614
/* ----- dynamic memory/port mapping ----- */
 
615
void *install_mem_read_handler(int cpu, int start, int end, mem_read_handler handler);
 
616
void *install_mem_read16_handler(int cpu, int start, int end, mem_read16_handler handler);
 
617
void *install_mem_read32_handler(int cpu, int start, int end, mem_read32_handler handler);
 
618
void *install_mem_write_handler(int cpu, int start, int end, mem_write_handler handler);
 
619
void *install_mem_write16_handler(int cpu, int start, int end, mem_write16_handler handler);
 
620
void *install_mem_write32_handler(int cpu, int start, int end, mem_write32_handler handler);
 
621
void *install_port_read_handler(int cpu, int start, int end, mem_read_handler handler);
 
622
void *install_port_write_handler(int cpu, int start, int end, mem_write_handler handler);
 
623
 
 
624
/* ----- dynamic bank handlers ----- */
 
625
void cpu_setbankhandler_r(int bank, mem_read_handler handler);
 
626
void cpu_setbankhandler_w(int bank, mem_write_handler handler);
 
627
 
 
628
/* ----- opcode base control ---- */
 
629
void cpu_setOPbase16(offs_t pc);
 
630
void cpu_setOPbase20(offs_t pc);
 
631
void cpu_setOPbase21(offs_t pc);
 
632
void cpu_setOPbase24(offs_t pc);
 
633
void cpu_setOPbase16bew(offs_t pc);
 
634
void cpu_setOPbase16lew(offs_t pc);
 
635
void cpu_setOPbase24bew(offs_t pc);
 
636
void cpu_setOPbase24bedw(offs_t pc);
 
637
void cpu_setOPbase26ledw(offs_t pc);
 
638
void cpu_setOPbase29lew(offs_t pc);
 
639
void cpu_setOPbase32bew(offs_t pc);
 
640
void cpu_setOPbase32lew(offs_t pc);
 
641
void cpu_setOPbaseoverride(int cpu, opbase_handler function);
 
642
 
 
643
/* ----- harder-to-explain functions ---- */
 
644
 
 
645
/* use this to set the a different opcode base address when using a CPU with
 
646
   opcodes and data encrypted separately */
 
647
void memory_set_opcode_base(int cpu, void *base);
 
648
 
 
649
/* look up a chunk of memory and get its start/end addresses, and its base.
 
650
Pass in the cpu number and the offset. It will find the chunk containing
 
651
that offset and return the start and end addresses, along with a pointer to
 
652
the base of the memory.
 
653
This can be used (carefully!) by drivers that wish to access memory directly
 
654
without going through the readmem/writemem accessors (e.g., blitters). */
 
655
void *findmemorychunk(int cpu, int offset, int *chunkstart, int *chunkend);
 
656
 
 
657
#ifdef __cplusplus
 
658
}
 
659
#endif
 
660
 
 
661
#endif  /* !_MEMORY_H */
 
662