|
|
1.1.1.3 root 1: /*
1.1 root 2: * UAE - The Un*x Amiga Emulator
1.1.1.3 root 3: *
1.1 root 4: * memory management
1.1.1.3 root 5: *
1.1 root 6: * Copyright 1995 Bernd Schmidt
7: */
8:
1.1.1.8 root 9: extern void memory_reset (void);
1.1.1.3 root 10:
1.1.1.7 root 11: extern int special_mem;
12: #define S_READ 1
13: #define S_WRITE 2
14:
1.1.1.3 root 15: typedef uae_u32 (*mem_get_func)(uaecptr) REGPARAM;
16: typedef void (*mem_put_func)(uaecptr, uae_u32) REGPARAM;
17: typedef uae_u8 *(*xlate_func)(uaecptr) REGPARAM;
18: typedef int (*check_func)(uaecptr, uae_u32) REGPARAM;
1.1.1.2 root 19:
20: extern char *address_space, *good_address_map;
1.1.1.3 root 21: extern uae_u8 *chipmemory;
1.1.1.2 root 22:
1.1.1.4 root 23: extern uae_u32 allocated_chipmem;
24: extern uae_u32 allocated_fastmem;
25: extern uae_u32 allocated_bogomem;
26: extern uae_u32 allocated_gfxmem;
27: extern uae_u32 allocated_z3fastmem;
28: extern uae_u32 allocated_a3000mem;
29:
1.1.1.2 root 30: #undef DIRECT_MEMFUNCS_SUCCESSFUL
1.1.1.4 root 31: #include "machdep/maccess.h"
1.1.1.2 root 32:
33: #ifndef CAN_MAP_MEMORY
34: #undef USE_COMPILER
35: #endif
36:
37: #if defined(USE_COMPILER) && !defined(USE_MAPPED_MEMORY)
38: #define USE_MAPPED_MEMORY
39: #endif
40:
1.1 root 41: #define kickmem_size 0x080000
42:
1.1.1.3 root 43: #define chipmem_start 0x00000000
44: #define bogomem_start 0x00C00000
45: #define a3000mem_start 0x07000000
46: #define kickmem_start 0x00F80000
1.1 root 47:
48: extern int ersatzkickfile;
1.1.1.9 root 49: extern int cloanto_rom;
1.1 root 50:
1.1.1.8 root 51: extern uae_u8* baseaddr[];
52:
1.1 root 53: typedef struct {
54: /* These ones should be self-explanatory... */
1.1.1.3 root 55: mem_get_func lget, wget, bget;
1.1.1.2 root 56: mem_put_func lput, wput, bput;
1.1.1.3 root 57: /* Use xlateaddr to translate an Amiga address to a uae_u8 * that can
58: * be used to address memory without calling the wget/wput functions.
1.1 root 59: * This doesn't work for all memory banks, so this function may call
60: * abort(). */
61: xlate_func xlateaddr;
62: /* To prevent calls to abort(), use check before calling xlateaddr.
63: * It checks not only that the memory bank can do xlateaddr, but also
1.1.1.3 root 64: * that the pointer points to an area of at least the specified size.
1.1 root 65: * This is used for example to translate bitplane pointers in custom.c */
66: check_func check;
1.1.1.8 root 67: /* For those banks that refer to real memory, we can save the whole trouble
68: of going through function calls, and instead simply grab the memory
69: ourselves. This holds the memory address where the start of memory is
70: for this particular bank. */
71: uae_u8 *baseaddr;
1.1 root 72: } addrbank;
73:
1.1.1.8 root 74: extern uae_u8 *filesysory;
1.1.1.3 root 75:
1.1 root 76: extern addrbank chipmem_bank;
77: extern addrbank kickmem_bank;
78: extern addrbank custom_bank;
79: extern addrbank clock_bank;
80: extern addrbank cia_bank;
81: extern addrbank rtarea_bank;
82: extern addrbank expamem_bank;
83: extern addrbank fastmem_bank;
1.1.1.3 root 84: extern addrbank gfxmem_bank;
1.1 root 85:
86: extern void rtarea_init (void);
1.1.1.2 root 87: extern void rtarea_setup (void);
1.1 root 88: extern void expamem_init (void);
89: extern void expamem_reset (void);
90:
1.1.1.3 root 91: extern uae_u32 gfxmem_start;
92: extern uae_u8 *gfxmemory;
93: extern uae_u32 gfxmem_mask;
94: extern int address_space_24;
1.1 root 95:
96: /* Default memory access functions */
97:
1.1.1.3 root 98: extern int default_check(uaecptr addr, uae_u32 size) REGPARAM;
99: extern uae_u8 *default_xlate(uaecptr addr) REGPARAM;
1.1 root 100:
1.1.1.3 root 101: #define bankindex(addr) (((uaecptr)(addr)) >> 16)
1.1 root 102:
1.1.1.3 root 103: extern addrbank *mem_banks[65536];
1.1.1.8 root 104: extern uae_u8 *baseaddr[65536];
1.1.1.3 root 105: #define get_mem_bank(addr) (*mem_banks[bankindex(addr)])
1.1.1.8 root 106: #define put_mem_bank(addr, b, realstart) do { \
107: (mem_banks[bankindex(addr)] = (b)); \
108: if ((b)->baseaddr) \
1.1.1.11 root 109: baseaddr[bankindex(addr)] = (b)->baseaddr - (realstart); \
1.1.1.8 root 110: else \
1.1.1.11 root 111: baseaddr[bankindex(addr)] = (uae_u8*)(((long)b)+1); \
1.1.1.8 root 112: } while (0)
1.1.1.3 root 113:
1.1.1.9 root 114: extern void memory_init (void);
115: extern void memory_cleanup (void);
116: extern void map_banks (addrbank *bank, int first, int count, int realsize);
1.1.1.2 root 117:
118: #ifndef NO_INLINE_MEMORY_ACCESS
119:
1.1.1.3 root 120: #define longget(addr) (call_mem_get_func(get_mem_bank(addr).lget, addr))
121: #define wordget(addr) (call_mem_get_func(get_mem_bank(addr).wget, addr))
122: #define byteget(addr) (call_mem_get_func(get_mem_bank(addr).bget, addr))
123: #define longput(addr,l) (call_mem_put_func(get_mem_bank(addr).lput, addr, l))
124: #define wordput(addr,w) (call_mem_put_func(get_mem_bank(addr).wput, addr, w))
125: #define byteput(addr,b) (call_mem_put_func(get_mem_bank(addr).bput, addr, b))
1.1.1.2 root 126:
127: #else
128:
1.1.1.3 root 129: extern uae_u32 alongget(uaecptr addr);
130: extern uae_u32 awordget(uaecptr addr);
131: extern uae_u32 longget(uaecptr addr);
132: extern uae_u32 wordget(uaecptr addr);
133: extern uae_u32 byteget(uaecptr addr);
134: extern void longput(uaecptr addr, uae_u32 l);
135: extern void wordput(uaecptr addr, uae_u32 w);
136: extern void byteput(uaecptr addr, uae_u32 b);
1.1.1.2 root 137:
138: #endif
139:
140: #ifndef MD_HAVE_MEM_1_FUNCS
141:
142: #define longget_1 longget
143: #define wordget_1 wordget
144: #define byteget_1 byteget
145: #define longput_1 longput
146: #define wordput_1 wordput
147: #define byteput_1 byteput
148:
149: #endif
150:
1.1.1.5 root 151: STATIC_INLINE uae_u32 get_long(uaecptr addr)
1.1 root 152: {
1.1.1.3 root 153: return longget_1(addr);
1.1 root 154: }
1.1.1.5 root 155: STATIC_INLINE uae_u32 get_word(uaecptr addr)
1.1 root 156: {
1.1.1.3 root 157: return wordget_1(addr);
1.1 root 158: }
1.1.1.5 root 159: STATIC_INLINE uae_u32 get_byte(uaecptr addr)
1.1 root 160: {
1.1.1.3 root 161: return byteget_1(addr);
1.1 root 162: }
1.1.1.5 root 163: STATIC_INLINE void put_long(uaecptr addr, uae_u32 l)
1.1 root 164: {
1.1.1.2 root 165: longput_1(addr, l);
1.1 root 166: }
1.1.1.5 root 167: STATIC_INLINE void put_word(uaecptr addr, uae_u32 w)
1.1 root 168: {
1.1.1.2 root 169: wordput_1(addr, w);
1.1 root 170: }
1.1.1.5 root 171: STATIC_INLINE void put_byte(uaecptr addr, uae_u32 b)
1.1 root 172: {
1.1.1.2 root 173: byteput_1(addr, b);
1.1 root 174: }
175:
1.1.1.5 root 176: STATIC_INLINE uae_u8 *get_real_address(uaecptr addr)
1.1 root 177: {
1.1.1.3 root 178: return get_mem_bank(addr).xlateaddr(addr);
1.1 root 179: }
180:
1.1.1.5 root 181: STATIC_INLINE int valid_address(uaecptr addr, uae_u32 size)
1.1 root 182: {
1.1.1.3 root 183: return get_mem_bank(addr).check(addr, size);
1.1 root 184: }
1.1.1.6 root 185:
186: /* For faster access in custom chip emulation. */
187: extern uae_u32 chipmem_lget (uaecptr) REGPARAM;
188: extern uae_u32 chipmem_wget (uaecptr) REGPARAM;
189: extern uae_u32 chipmem_bget (uaecptr) REGPARAM;
190: extern void chipmem_lput (uaecptr, uae_u32) REGPARAM;
191: extern void chipmem_wput (uaecptr, uae_u32) REGPARAM;
192: extern void chipmem_bput (uaecptr, uae_u32) REGPARAM;
1.1.1.8 root 193:
194: #ifdef NATMEM_OFFSET
195:
196: typedef struct shmpiece_reg {
197: uae_u8 *native_address;
198: int id;
199: uae_u32 size;
200: struct shmpiece_reg *next;
201: struct shmpiece_reg *prev;
202: } shmpiece;
203:
204: extern shmpiece *shm_start;
205: extern int canbang;
206:
207: #endif
208:
209: extern uae_u8 *mapped_malloc (size_t, char *);
1.1.1.9 root 210: extern void mapped_free (uae_u8 *);
1.1.1.10 root 211:
212: #define ROMTYPE_KICK 1
213: #define ROMTYPE_KICKCD32 2
214: #define ROMTYPE_EXTCD32 4
215: #define ROMTYPE_EXTCDTV 8
216: #define ROMTYPE_AR 16
217: #define ROMTYPE_KEY 32
218: #define ROMTYPE_ARCADIA 64
219:
220: struct romdata {
221: char *name;
222: int version, revision;
223: uae_u32 crc32;
224: uae_u32 size;
225: int id;
226: int cpu;
227: int cloanto;
228: int type;
229: };
230:
1.1.1.11 root 231: extern struct romdata *getromdatabycrc (uae_u32 crc32);
232: extern struct romdata *getromdatabydata (uae_u8 *rom, int size);
233: extern struct romdata *getromdatabyid (int id);
234: extern struct romdata *getarcadiarombyname (char *name);
235: extern void getromname (struct romdata*, char*);
236: extern struct romdata *getromdatabyname (char*);
1.1.1.10 root 237: extern void romlist_add (char *path, struct romdata *rd);
238: extern char *romlist_get (struct romdata *rd);
239: extern void romlist_clear (void);
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.