|
|
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;
75: extern uae_u8 *rtarea;
1.1.1.3 root 76:
1.1 root 77: extern addrbank chipmem_bank;
78: extern addrbank kickmem_bank;
79: extern addrbank custom_bank;
80: extern addrbank clock_bank;
81: extern addrbank cia_bank;
82: extern addrbank rtarea_bank;
83: extern addrbank expamem_bank;
84: extern addrbank fastmem_bank;
1.1.1.3 root 85: extern addrbank gfxmem_bank;
1.1 root 86:
87: extern void rtarea_init (void);
1.1.1.2 root 88: extern void rtarea_setup (void);
1.1 root 89: extern void expamem_init (void);
90: extern void expamem_reset (void);
91:
1.1.1.3 root 92: extern uae_u32 gfxmem_start;
93: extern uae_u8 *gfxmemory;
94: extern uae_u32 gfxmem_mask;
95: extern int address_space_24;
1.1 root 96:
97: /* Default memory access functions */
98:
1.1.1.3 root 99: extern int default_check(uaecptr addr, uae_u32 size) REGPARAM;
100: extern uae_u8 *default_xlate(uaecptr addr) REGPARAM;
1.1 root 101:
1.1.1.3 root 102: #define bankindex(addr) (((uaecptr)(addr)) >> 16)
1.1 root 103:
1.1.1.3 root 104: extern addrbank *mem_banks[65536];
1.1.1.8 root 105: extern uae_u8 *baseaddr[65536];
1.1.1.3 root 106: #define get_mem_bank(addr) (*mem_banks[bankindex(addr)])
1.1.1.8 root 107: #define put_mem_bank(addr, b, realstart) do { \
108: (mem_banks[bankindex(addr)] = (b)); \
109: if ((b)->baseaddr) \
110: baseaddr[bankindex(addr)] = (b)->baseaddr - (realstart); \
111: else \
112: baseaddr[bankindex(addr)] = (uae_u8*)(((long)b)+1); \
113: } while (0)
1.1.1.3 root 114:
1.1.1.9 ! root 115: extern void memory_init (void);
! 116: extern void memory_cleanup (void);
! 117: extern void map_banks (addrbank *bank, int first, int count, int realsize);
1.1.1.2 root 118:
119: #ifndef NO_INLINE_MEMORY_ACCESS
120:
1.1.1.3 root 121: #define longget(addr) (call_mem_get_func(get_mem_bank(addr).lget, addr))
122: #define wordget(addr) (call_mem_get_func(get_mem_bank(addr).wget, addr))
123: #define byteget(addr) (call_mem_get_func(get_mem_bank(addr).bget, addr))
124: #define longput(addr,l) (call_mem_put_func(get_mem_bank(addr).lput, addr, l))
125: #define wordput(addr,w) (call_mem_put_func(get_mem_bank(addr).wput, addr, w))
126: #define byteput(addr,b) (call_mem_put_func(get_mem_bank(addr).bput, addr, b))
1.1.1.2 root 127:
128: #else
129:
1.1.1.3 root 130: extern uae_u32 alongget(uaecptr addr);
131: extern uae_u32 awordget(uaecptr addr);
132: extern uae_u32 longget(uaecptr addr);
133: extern uae_u32 wordget(uaecptr addr);
134: extern uae_u32 byteget(uaecptr addr);
135: extern void longput(uaecptr addr, uae_u32 l);
136: extern void wordput(uaecptr addr, uae_u32 w);
137: extern void byteput(uaecptr addr, uae_u32 b);
1.1.1.2 root 138:
139: #endif
140:
141: #ifndef MD_HAVE_MEM_1_FUNCS
142:
143: #define longget_1 longget
144: #define wordget_1 wordget
145: #define byteget_1 byteget
146: #define longput_1 longput
147: #define wordput_1 wordput
148: #define byteput_1 byteput
149:
150: #endif
151:
1.1.1.5 root 152: STATIC_INLINE uae_u32 get_long(uaecptr addr)
1.1 root 153: {
1.1.1.3 root 154: return longget_1(addr);
1.1 root 155: }
1.1.1.5 root 156: STATIC_INLINE uae_u32 get_word(uaecptr addr)
1.1 root 157: {
1.1.1.3 root 158: return wordget_1(addr);
1.1 root 159: }
1.1.1.5 root 160: STATIC_INLINE uae_u32 get_byte(uaecptr addr)
1.1 root 161: {
1.1.1.3 root 162: return byteget_1(addr);
1.1 root 163: }
1.1.1.5 root 164: STATIC_INLINE void put_long(uaecptr addr, uae_u32 l)
1.1 root 165: {
1.1.1.2 root 166: longput_1(addr, l);
1.1 root 167: }
1.1.1.5 root 168: STATIC_INLINE void put_word(uaecptr addr, uae_u32 w)
1.1 root 169: {
1.1.1.2 root 170: wordput_1(addr, w);
1.1 root 171: }
1.1.1.5 root 172: STATIC_INLINE void put_byte(uaecptr addr, uae_u32 b)
1.1 root 173: {
1.1.1.2 root 174: byteput_1(addr, b);
1.1 root 175: }
176:
1.1.1.5 root 177: STATIC_INLINE uae_u8 *get_real_address(uaecptr addr)
1.1 root 178: {
1.1.1.3 root 179: return get_mem_bank(addr).xlateaddr(addr);
1.1 root 180: }
181:
1.1.1.5 root 182: STATIC_INLINE int valid_address(uaecptr addr, uae_u32 size)
1.1 root 183: {
1.1.1.3 root 184: return get_mem_bank(addr).check(addr, size);
1.1 root 185: }
1.1.1.6 root 186:
187: /* For faster access in custom chip emulation. */
188: extern uae_u32 chipmem_lget (uaecptr) REGPARAM;
189: extern uae_u32 chipmem_wget (uaecptr) REGPARAM;
190: extern uae_u32 chipmem_bget (uaecptr) REGPARAM;
191: extern void chipmem_lput (uaecptr, uae_u32) REGPARAM;
192: extern void chipmem_wput (uaecptr, uae_u32) REGPARAM;
193: extern void chipmem_bput (uaecptr, uae_u32) REGPARAM;
1.1.1.8 root 194:
195: #ifdef NATMEM_OFFSET
196:
197: typedef struct shmpiece_reg {
198: uae_u8 *native_address;
199: int id;
200: uae_u32 size;
201: struct shmpiece_reg *next;
202: struct shmpiece_reg *prev;
203: } shmpiece;
204:
205: extern shmpiece *shm_start;
206: extern int canbang;
207:
208: #endif
209:
210: extern uae_u8 *mapped_malloc (size_t, char *);
1.1.1.9 ! root 211: extern void mapped_free (uae_u8 *);
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.