|
|
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;
49:
1.1.1.8 ! root 50: extern uae_u8* baseaddr[];
! 51:
1.1 root 52: typedef struct {
53: /* These ones should be self-explanatory... */
1.1.1.3 root 54: mem_get_func lget, wget, bget;
1.1.1.2 root 55: mem_put_func lput, wput, bput;
1.1.1.3 root 56: /* Use xlateaddr to translate an Amiga address to a uae_u8 * that can
57: * be used to address memory without calling the wget/wput functions.
1.1 root 58: * This doesn't work for all memory banks, so this function may call
59: * abort(). */
60: xlate_func xlateaddr;
61: /* To prevent calls to abort(), use check before calling xlateaddr.
62: * It checks not only that the memory bank can do xlateaddr, but also
1.1.1.3 root 63: * that the pointer points to an area of at least the specified size.
1.1 root 64: * This is used for example to translate bitplane pointers in custom.c */
65: check_func check;
1.1.1.8 ! root 66: /* For those banks that refer to real memory, we can save the whole trouble
! 67: of going through function calls, and instead simply grab the memory
! 68: ourselves. This holds the memory address where the start of memory is
! 69: for this particular bank. */
! 70: uae_u8 *baseaddr;
1.1 root 71: } addrbank;
72:
1.1.1.8 ! root 73: extern uae_u8 *filesysory;
! 74: extern uae_u8 *rtarea;
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) \
! 109: baseaddr[bankindex(addr)] = (b)->baseaddr - (realstart); \
! 110: else \
! 111: baseaddr[bankindex(addr)] = (uae_u8*)(((long)b)+1); \
! 112: } while (0)
1.1.1.3 root 113:
114: extern void memory_init(void);
1.1.1.8 ! root 115: extern void map_banks(addrbank *bank, int first, int count, int realsize);
1.1.1.2 root 116:
117: #ifndef NO_INLINE_MEMORY_ACCESS
118:
1.1.1.3 root 119: #define longget(addr) (call_mem_get_func(get_mem_bank(addr).lget, addr))
120: #define wordget(addr) (call_mem_get_func(get_mem_bank(addr).wget, addr))
121: #define byteget(addr) (call_mem_get_func(get_mem_bank(addr).bget, addr))
122: #define longput(addr,l) (call_mem_put_func(get_mem_bank(addr).lput, addr, l))
123: #define wordput(addr,w) (call_mem_put_func(get_mem_bank(addr).wput, addr, w))
124: #define byteput(addr,b) (call_mem_put_func(get_mem_bank(addr).bput, addr, b))
1.1.1.2 root 125:
126: #else
127:
1.1.1.3 root 128: extern uae_u32 alongget(uaecptr addr);
129: extern uae_u32 awordget(uaecptr addr);
130: extern uae_u32 longget(uaecptr addr);
131: extern uae_u32 wordget(uaecptr addr);
132: extern uae_u32 byteget(uaecptr addr);
133: extern void longput(uaecptr addr, uae_u32 l);
134: extern void wordput(uaecptr addr, uae_u32 w);
135: extern void byteput(uaecptr addr, uae_u32 b);
1.1.1.2 root 136:
137: #endif
138:
139: #ifndef MD_HAVE_MEM_1_FUNCS
140:
141: #define longget_1 longget
142: #define wordget_1 wordget
143: #define byteget_1 byteget
144: #define longput_1 longput
145: #define wordput_1 wordput
146: #define byteput_1 byteput
147:
148: #endif
149:
1.1.1.5 root 150: STATIC_INLINE uae_u32 get_long(uaecptr addr)
1.1 root 151: {
1.1.1.3 root 152: return longget_1(addr);
1.1 root 153: }
1.1.1.5 root 154: STATIC_INLINE uae_u32 get_word(uaecptr addr)
1.1 root 155: {
1.1.1.3 root 156: return wordget_1(addr);
1.1 root 157: }
1.1.1.5 root 158: STATIC_INLINE uae_u32 get_byte(uaecptr addr)
1.1 root 159: {
1.1.1.3 root 160: return byteget_1(addr);
1.1 root 161: }
1.1.1.5 root 162: STATIC_INLINE void put_long(uaecptr addr, uae_u32 l)
1.1 root 163: {
1.1.1.2 root 164: longput_1(addr, l);
1.1 root 165: }
1.1.1.5 root 166: STATIC_INLINE void put_word(uaecptr addr, uae_u32 w)
1.1 root 167: {
1.1.1.2 root 168: wordput_1(addr, w);
1.1 root 169: }
1.1.1.5 root 170: STATIC_INLINE void put_byte(uaecptr addr, uae_u32 b)
1.1 root 171: {
1.1.1.2 root 172: byteput_1(addr, b);
1.1 root 173: }
174:
1.1.1.5 root 175: STATIC_INLINE uae_u8 *get_real_address(uaecptr addr)
1.1 root 176: {
1.1.1.3 root 177: return get_mem_bank(addr).xlateaddr(addr);
1.1 root 178: }
179:
1.1.1.5 root 180: STATIC_INLINE int valid_address(uaecptr addr, uae_u32 size)
1.1 root 181: {
1.1.1.3 root 182: return get_mem_bank(addr).check(addr, size);
1.1 root 183: }
1.1.1.6 root 184:
185: /* For faster access in custom chip emulation. */
186: extern uae_u32 chipmem_lget (uaecptr) REGPARAM;
187: extern uae_u32 chipmem_wget (uaecptr) REGPARAM;
188: extern uae_u32 chipmem_bget (uaecptr) REGPARAM;
189: extern void chipmem_lput (uaecptr, uae_u32) REGPARAM;
190: extern void chipmem_wput (uaecptr, uae_u32) REGPARAM;
191: extern void chipmem_bput (uaecptr, uae_u32) REGPARAM;
1.1.1.8 ! root 192:
! 193: #ifdef NATMEM_OFFSET
! 194:
! 195: typedef struct shmpiece_reg {
! 196: uae_u8 *native_address;
! 197: int id;
! 198: uae_u32 size;
! 199: struct shmpiece_reg *next;
! 200: struct shmpiece_reg *prev;
! 201: } shmpiece;
! 202:
! 203: extern shmpiece *shm_start;
! 204: extern int canbang;
! 205:
! 206: #endif
! 207:
! 208: extern uae_u8 *mapped_malloc (size_t, char *);
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.