|
|
1.1 root 1: /*
2: * UAE - The Un*x Amiga Emulator
3: *
4: * Memory management
5: *
6: * (c) 1995 Bernd Schmidt
7: */
8:
9: #include "sysconfig.h"
10: #include "sysdeps.h"
11:
12: #include "config.h"
13: #include "options.h"
1.1.1.3 root 14: #include "uae.h"
1.1 root 15: #include "memory.h"
16: #include "ersatz.h"
17: #include "zfile.h"
18:
1.1.1.2 root 19: #ifdef USE_MAPPED_MEMORY
1.1 root 20: #include <sys/mman.h>
21: #endif
22:
23: int ersatzkickfile = 0;
24:
1.1.1.4 root 25: uae_u32 allocated_chipmem;
26: uae_u32 allocated_fastmem;
27: uae_u32 allocated_bogomem;
28: uae_u32 allocated_gfxmem;
29: uae_u32 allocated_z3fastmem;
30: uae_u32 allocated_a3000mem;
31:
1.1.1.3 root 32: #ifdef SAVE_MEMORY_BANKS
33: addrbank *mem_banks[65536];
34: #else
35: addrbank mem_banks[65536];
36: #endif
1.1 root 37:
1.1.1.2 root 38: #ifdef NO_INLINE_MEMORY_ACCESS
1.1.1.5 root 39: __inline__ uae_u32 longget (uaecptr addr)
1.1.1.2 root 40: {
1.1.1.5 root 41: return call_mem_get_func (get_mem_bank (addr).lget, addr);
1.1.1.2 root 42: }
1.1.1.5 root 43: __inline__ uae_u32 wordget (uaecptr addr)
1.1.1.2 root 44: {
1.1.1.5 root 45: return call_mem_get_func (get_mem_bank (addr).wget, addr);
1.1.1.2 root 46: }
1.1.1.5 root 47: __inline__ uae_u32 byteget (uaecptr addr)
1.1.1.2 root 48: {
1.1.1.5 root 49: return call_mem_get_func (get_mem_bank (addr).bget, addr);
1.1.1.2 root 50: }
1.1.1.5 root 51: __inline__ void longput (uaecptr addr, uae_u32 l)
1.1.1.2 root 52: {
1.1.1.5 root 53: call_mem_put_func (get_mem_bank (addr).lput, addr, l);
1.1.1.2 root 54: }
1.1.1.5 root 55: __inline__ void wordput (uaecptr addr, uae_u32 w)
1.1.1.2 root 56: {
1.1.1.5 root 57: call_mem_put_func (get_mem_bank (addr).wput, addr, w);
1.1.1.2 root 58: }
1.1.1.5 root 59: __inline__ void byteput (uaecptr addr, uae_u32 b)
1.1.1.2 root 60: {
1.1.1.5 root 61: call_mem_put_func (get_mem_bank (addr).bput, addr, b);
1.1.1.2 root 62: }
63: #endif
64:
1.1.1.3 root 65: uae_u32 chipmem_mask, kickmem_mask, bogomem_mask, a3000mem_mask;
1.1 root 66:
1.1.1.3 root 67: /* A dummy bank that only contains zeros */
68:
1.1.1.4 root 69: static uae_u32 dummy_lget (uaecptr) REGPARAM;
70: static uae_u32 dummy_wget (uaecptr) REGPARAM;
71: static uae_u32 dummy_bget (uaecptr) REGPARAM;
72: static void dummy_lput (uaecptr, uae_u32) REGPARAM;
73: static void dummy_wput (uaecptr, uae_u32) REGPARAM;
74: static void dummy_bput (uaecptr, uae_u32) REGPARAM;
75: static int dummy_check (uaecptr addr, uae_u32 size) REGPARAM;
76:
77: uae_u32 REGPARAM2 dummy_lget (uaecptr addr)
78: {
79: if (currprefs.illegal_mem)
80: write_log ("Illegal lget at %08lx\n", addr);
81:
1.1 root 82: return 0;
83: }
84:
1.1.1.4 root 85: uae_u32 REGPARAM2 dummy_wget (uaecptr addr)
1.1 root 86: {
1.1.1.4 root 87: if (currprefs.illegal_mem)
88: write_log ("Illegal wget at %08lx\n", addr);
89:
1.1 root 90: return 0;
91: }
92:
1.1.1.4 root 93: uae_u32 REGPARAM2 dummy_bget (uaecptr addr)
1.1 root 94: {
1.1.1.4 root 95: if (currprefs.illegal_mem)
96: write_log ("Illegal bget at %08lx\n", addr);
97:
1.1 root 98: return 0;
99: }
100:
1.1.1.4 root 101: void REGPARAM2 dummy_lput (uaecptr addr, uae_u32 l)
1.1 root 102: {
1.1.1.4 root 103: if (currprefs.illegal_mem)
104: write_log ("Illegal lput at %08lx\n", addr);
1.1.1.3 root 105: }
1.1.1.4 root 106: void REGPARAM2 dummy_wput (uaecptr addr, uae_u32 w)
1.1.1.3 root 107: {
1.1.1.4 root 108: if (currprefs.illegal_mem)
109: write_log ("Illegal wput at %08lx\n", addr);
1.1.1.3 root 110: }
1.1.1.4 root 111: void REGPARAM2 dummy_bput (uaecptr addr, uae_u32 b)
1.1.1.3 root 112: {
1.1.1.4 root 113: if (currprefs.illegal_mem)
114: write_log ("Illegal bput at %08lx\n", addr);
1.1 root 115: }
116:
1.1.1.4 root 117: int REGPARAM2 dummy_check (uaecptr addr, uae_u32 size)
1.1 root 118: {
1.1.1.4 root 119: if (currprefs.illegal_mem)
120: write_log ("Illegal check at %08lx\n", addr);
121:
1.1 root 122: return 0;
123: }
124:
1.1.1.3 root 125: /* A3000 "motherboard resources" bank. */
1.1.1.4 root 126: static uae_u32 mbres_lget (uaecptr) REGPARAM;
127: static uae_u32 mbres_wget (uaecptr) REGPARAM;
128: static uae_u32 mbres_bget (uaecptr) REGPARAM;
129: static void mbres_lput (uaecptr, uae_u32) REGPARAM;
130: static void mbres_wput (uaecptr, uae_u32) REGPARAM;
131: static void mbres_bput (uaecptr, uae_u32) REGPARAM;
132: static int mbres_check (uaecptr addr, uae_u32 size) REGPARAM;
1.1.1.3 root 133:
134: static int mbres_val = 0;
135:
1.1.1.4 root 136: uae_u32 REGPARAM2 mbres_lget (uaecptr addr)
1.1.1.3 root 137: {
1.1.1.4 root 138: if (currprefs.illegal_mem)
139: write_log ("Illegal lget at %08lx\n", addr);
140:
1.1 root 141: return 0;
142: }
143:
1.1.1.4 root 144: uae_u32 REGPARAM2 mbres_wget (uaecptr addr)
1.1 root 145: {
1.1.1.4 root 146: if (currprefs.illegal_mem)
147: write_log ("Illegal wget at %08lx\n", addr);
148:
1.1 root 149: return 0;
150: }
151:
1.1.1.4 root 152: uae_u32 REGPARAM2 mbres_bget (uaecptr addr)
1.1.1.3 root 153: {
1.1.1.4 root 154: if (currprefs.illegal_mem)
155: write_log ("Illegal bget at %08lx\n", addr);
156:
1.1.1.3 root 157: return (addr & 0xFFFF) == 3 ? mbres_val : 0;
158: }
159:
1.1.1.4 root 160: void REGPARAM2 mbres_lput (uaecptr addr, uae_u32 l)
1.1 root 161: {
1.1.1.4 root 162: if (currprefs.illegal_mem)
163: write_log ("Illegal lput at %08lx\n", addr);
1.1 root 164: }
1.1.1.4 root 165: void REGPARAM2 mbres_wput (uaecptr addr, uae_u32 w)
1.1 root 166: {
1.1.1.4 root 167: if (currprefs.illegal_mem)
168: write_log ("Illegal wput at %08lx\n", addr);
1.1 root 169: }
1.1.1.4 root 170: void REGPARAM2 mbres_bput (uaecptr addr, uae_u32 b)
1.1 root 171: {
1.1.1.4 root 172: if (currprefs.illegal_mem)
173: write_log ("Illegal bput at %08lx\n", addr);
174:
1.1.1.3 root 175: if ((addr & 0xFFFF) == 3)
176: mbres_val = b;
1.1 root 177: }
178:
1.1.1.4 root 179: int REGPARAM2 mbres_check (uaecptr addr, uae_u32 size)
1.1 root 180: {
1.1.1.4 root 181: if (currprefs.illegal_mem)
182: write_log ("Illegal check at %08lx\n", addr);
183:
1.1 root 184: return 0;
185: }
186:
187: /* Chip memory */
188:
1.1.1.3 root 189: uae_u8 *chipmemory;
1.1 root 190:
1.1.1.4 root 191: static int chipmem_check (uaecptr addr, uae_u32 size) REGPARAM;
192: static uae_u8 *chipmem_xlate (uaecptr addr) REGPARAM;
1.1 root 193:
1.1.1.4 root 194: uae_u32 REGPARAM2 chipmem_lget (uaecptr addr)
1.1 root 195: {
1.1.1.3 root 196: uae_u32 *m;
1.1 root 197: addr -= chipmem_start & chipmem_mask;
1.1.1.2 root 198: addr &= chipmem_mask;
1.1.1.3 root 199: m = (uae_u32 *)(chipmemory + addr);
1.1.1.5 root 200: return do_get_mem_long (m);
1.1 root 201: }
202:
1.1.1.4 root 203: uae_u32 REGPARAM2 chipmem_wget (uaecptr addr)
1.1 root 204: {
1.1.1.3 root 205: uae_u16 *m;
1.1 root 206: addr -= chipmem_start & chipmem_mask;
1.1.1.2 root 207: addr &= chipmem_mask;
1.1.1.3 root 208: m = (uae_u16 *)(chipmemory + addr);
1.1.1.5 root 209: return do_get_mem_word (m);
1.1 root 210: }
211:
1.1.1.4 root 212: uae_u32 REGPARAM2 chipmem_bget (uaecptr addr)
1.1 root 213: {
214: addr -= chipmem_start & chipmem_mask;
1.1.1.2 root 215: addr &= chipmem_mask;
1.1 root 216: return chipmemory[addr];
217: }
218:
1.1.1.4 root 219: void REGPARAM2 chipmem_lput (uaecptr addr, uae_u32 l)
1.1 root 220: {
1.1.1.3 root 221: uae_u32 *m;
1.1 root 222: addr -= chipmem_start & chipmem_mask;
1.1.1.2 root 223: addr &= chipmem_mask;
1.1.1.3 root 224: m = (uae_u32 *)(chipmemory + addr);
1.1.1.5 root 225: do_put_mem_long (m, l);
1.1 root 226: }
227:
1.1.1.4 root 228: void REGPARAM2 chipmem_wput (uaecptr addr, uae_u32 w)
1.1 root 229: {
1.1.1.3 root 230: uae_u16 *m;
1.1 root 231: addr -= chipmem_start & chipmem_mask;
1.1.1.2 root 232: addr &= chipmem_mask;
1.1.1.3 root 233: m = (uae_u16 *)(chipmemory + addr);
1.1.1.5 root 234: do_put_mem_word (m, w);
1.1 root 235: }
236:
1.1.1.4 root 237: void REGPARAM2 chipmem_bput (uaecptr addr, uae_u32 b)
1.1 root 238: {
239: addr -= chipmem_start & chipmem_mask;
1.1.1.2 root 240: addr &= chipmem_mask;
1.1 root 241: chipmemory[addr] = b;
242: }
243:
1.1.1.4 root 244: int REGPARAM2 chipmem_check (uaecptr addr, uae_u32 size)
1.1 root 245: {
246: addr -= chipmem_start & chipmem_mask;
1.1.1.2 root 247: addr &= chipmem_mask;
1.1.1.4 root 248: return (addr + size) <= allocated_chipmem;
1.1 root 249: }
250:
1.1.1.4 root 251: uae_u8 REGPARAM2 *chipmem_xlate (uaecptr addr)
1.1 root 252: {
253: addr -= chipmem_start & chipmem_mask;
1.1.1.2 root 254: addr &= chipmem_mask;
1.1 root 255: return chipmemory + addr;
256: }
257:
258: /* Slow memory */
259:
1.1.1.3 root 260: static uae_u8 *bogomemory;
1.1 root 261:
1.1.1.4 root 262: static uae_u32 bogomem_lget (uaecptr) REGPARAM;
263: static uae_u32 bogomem_wget (uaecptr) REGPARAM;
264: static uae_u32 bogomem_bget (uaecptr) REGPARAM;
265: static void bogomem_lput (uaecptr, uae_u32) REGPARAM;
266: static void bogomem_wput (uaecptr, uae_u32) REGPARAM;
267: static void bogomem_bput (uaecptr, uae_u32) REGPARAM;
268: static int bogomem_check (uaecptr addr, uae_u32 size) REGPARAM;
269: static uae_u8 *bogomem_xlate (uaecptr addr) REGPARAM;
1.1 root 270:
1.1.1.4 root 271: uae_u32 REGPARAM2 bogomem_lget (uaecptr addr)
1.1 root 272: {
1.1.1.3 root 273: uae_u32 *m;
1.1 root 274: addr -= bogomem_start & bogomem_mask;
1.1.1.2 root 275: addr &= bogomem_mask;
1.1.1.3 root 276: m = (uae_u32 *)(bogomemory + addr);
1.1.1.5 root 277: return do_get_mem_long (m);
1.1 root 278: }
279:
1.1.1.4 root 280: uae_u32 REGPARAM2 bogomem_wget (uaecptr addr)
1.1 root 281: {
1.1.1.3 root 282: uae_u16 *m;
1.1 root 283: addr -= bogomem_start & bogomem_mask;
1.1.1.2 root 284: addr &= bogomem_mask;
1.1.1.3 root 285: m = (uae_u16 *)(bogomemory + addr);
1.1.1.5 root 286: return do_get_mem_word (m);
1.1 root 287: }
288:
1.1.1.4 root 289: uae_u32 REGPARAM2 bogomem_bget (uaecptr addr)
1.1 root 290: {
291: addr -= bogomem_start & bogomem_mask;
1.1.1.2 root 292: addr &= bogomem_mask;
1.1 root 293: return bogomemory[addr];
294: }
295:
1.1.1.4 root 296: void REGPARAM2 bogomem_lput (uaecptr addr, uae_u32 l)
1.1 root 297: {
1.1.1.3 root 298: uae_u32 *m;
1.1 root 299: addr -= bogomem_start & bogomem_mask;
1.1.1.2 root 300: addr &= bogomem_mask;
1.1.1.3 root 301: m = (uae_u32 *)(bogomemory + addr);
1.1.1.5 root 302: do_put_mem_long (m, l);
1.1 root 303: }
304:
1.1.1.4 root 305: void REGPARAM2 bogomem_wput (uaecptr addr, uae_u32 w)
1.1 root 306: {
1.1.1.3 root 307: uae_u16 *m;
1.1 root 308: addr -= bogomem_start & bogomem_mask;
1.1.1.2 root 309: addr &= bogomem_mask;
1.1.1.3 root 310: m = (uae_u16 *)(bogomemory + addr);
1.1.1.5 root 311: do_put_mem_word (m, w);
1.1 root 312: }
313:
1.1.1.4 root 314: void REGPARAM2 bogomem_bput (uaecptr addr, uae_u32 b)
1.1 root 315: {
316: addr -= bogomem_start & bogomem_mask;
1.1.1.2 root 317: addr &= bogomem_mask;
1.1 root 318: bogomemory[addr] = b;
319: }
320:
1.1.1.4 root 321: int REGPARAM2 bogomem_check (uaecptr addr, uae_u32 size)
1.1 root 322: {
1.1.1.2 root 323: addr -= bogomem_start & bogomem_mask;
324: addr &= bogomem_mask;
1.1.1.4 root 325: return (addr + size) <= allocated_bogomem;
1.1 root 326: }
327:
1.1.1.4 root 328: uae_u8 REGPARAM2 *bogomem_xlate (uaecptr addr)
1.1 root 329: {
1.1.1.2 root 330: addr -= bogomem_start & bogomem_mask;
331: addr &= bogomem_mask;
1.1 root 332: return bogomemory + addr;
333: }
334:
1.1.1.3 root 335: /* A3000 motherboard fast memory */
336:
337: static uae_u8 *a3000memory;
1.1 root 338:
1.1.1.4 root 339: static uae_u32 a3000mem_lget (uaecptr) REGPARAM;
340: static uae_u32 a3000mem_wget (uaecptr) REGPARAM;
341: static uae_u32 a3000mem_bget (uaecptr) REGPARAM;
342: static void a3000mem_lput (uaecptr, uae_u32) REGPARAM;
343: static void a3000mem_wput (uaecptr, uae_u32) REGPARAM;
344: static void a3000mem_bput (uaecptr, uae_u32) REGPARAM;
345: static int a3000mem_check (uaecptr addr, uae_u32 size) REGPARAM;
346: static uae_u8 *a3000mem_xlate (uaecptr addr) REGPARAM;
1.1.1.3 root 347:
1.1.1.4 root 348: uae_u32 REGPARAM2 a3000mem_lget (uaecptr addr)
1.1.1.3 root 349: {
350: uae_u32 *m;
351: addr -= a3000mem_start & a3000mem_mask;
352: addr &= a3000mem_mask;
353: m = (uae_u32 *)(a3000memory + addr);
1.1.1.5 root 354: return do_get_mem_long (m);
1.1.1.3 root 355: }
1.1 root 356:
1.1.1.4 root 357: uae_u32 REGPARAM2 a3000mem_wget (uaecptr addr)
1.1.1.3 root 358: {
359: uae_u16 *m;
360: addr -= a3000mem_start & a3000mem_mask;
361: addr &= a3000mem_mask;
362: m = (uae_u16 *)(a3000memory + addr);
1.1.1.5 root 363: return do_get_mem_word (m);
1.1.1.3 root 364: }
1.1 root 365:
1.1.1.4 root 366: uae_u32 REGPARAM2 a3000mem_bget (uaecptr addr)
1.1 root 367: {
1.1.1.3 root 368: addr -= a3000mem_start & a3000mem_mask;
369: addr &= a3000mem_mask;
370: return a3000memory[addr];
1.1 root 371: }
372:
1.1.1.4 root 373: void REGPARAM2 a3000mem_lput (uaecptr addr, uae_u32 l)
1.1 root 374: {
1.1.1.3 root 375: uae_u32 *m;
376: addr -= a3000mem_start & a3000mem_mask;
377: addr &= a3000mem_mask;
378: m = (uae_u32 *)(a3000memory + addr);
1.1.1.5 root 379: do_put_mem_long (m, l);
1.1.1.3 root 380: }
381:
1.1.1.4 root 382: void REGPARAM2 a3000mem_wput (uaecptr addr, uae_u32 w)
1.1.1.3 root 383: {
384: uae_u16 *m;
385: addr -= a3000mem_start & a3000mem_mask;
386: addr &= a3000mem_mask;
387: m = (uae_u16 *)(a3000memory + addr);
1.1.1.5 root 388: do_put_mem_word (m, w);
1.1.1.3 root 389: }
390:
1.1.1.4 root 391: void REGPARAM2 a3000mem_bput (uaecptr addr, uae_u32 b)
1.1.1.3 root 392: {
393: addr -= a3000mem_start & a3000mem_mask;
394: addr &= a3000mem_mask;
395: a3000memory[addr] = b;
396: }
397:
1.1.1.4 root 398: int REGPARAM2 a3000mem_check (uaecptr addr, uae_u32 size)
1.1.1.3 root 399: {
400: addr -= a3000mem_start & a3000mem_mask;
401: addr &= a3000mem_mask;
1.1.1.4 root 402: return (addr + size) <= allocated_a3000mem;
1.1 root 403: }
404:
1.1.1.3 root 405: uae_u8 REGPARAM2 *a3000mem_xlate(uaecptr addr)
406: {
407: addr -= a3000mem_start & a3000mem_mask;
408: addr &= a3000mem_mask;
409: return a3000memory + addr;
410: }
411:
412: /* Kick memory */
413:
414: uae_u8 *kickmemory;
415:
1.1.1.4 root 416: static uae_u32 kickmem_lget (uaecptr) REGPARAM;
417: static uae_u32 kickmem_wget (uaecptr) REGPARAM;
418: static uae_u32 kickmem_bget (uaecptr) REGPARAM;
419: static void kickmem_lput (uaecptr, uae_u32) REGPARAM;
420: static void kickmem_wput (uaecptr, uae_u32) REGPARAM;
421: static void kickmem_bput (uaecptr, uae_u32) REGPARAM;
422: static int kickmem_check (uaecptr addr, uae_u32 size) REGPARAM;
423: static uae_u8 *kickmem_xlate (uaecptr addr) REGPARAM;
1.1.1.3 root 424:
1.1.1.4 root 425: uae_u32 REGPARAM2 kickmem_lget (uaecptr addr)
1.1 root 426: {
1.1.1.3 root 427: uae_u32 *m;
1.1 root 428: addr -= kickmem_start & kickmem_mask;
1.1.1.2 root 429: addr &= kickmem_mask;
1.1.1.3 root 430: m = (uae_u32 *)(kickmemory + addr);
1.1.1.5 root 431: return do_get_mem_long (m);
1.1 root 432: }
433:
1.1.1.4 root 434: uae_u32 REGPARAM2 kickmem_wget (uaecptr addr)
1.1 root 435: {
1.1.1.3 root 436: uae_u16 *m;
1.1 root 437: addr -= kickmem_start & kickmem_mask;
1.1.1.2 root 438: addr &= kickmem_mask;
1.1.1.3 root 439: m = (uae_u16 *)(kickmemory + addr);
1.1.1.5 root 440: return do_get_mem_word (m);
1.1 root 441: }
442:
1.1.1.4 root 443: uae_u32 REGPARAM2 kickmem_bget (uaecptr addr)
1.1 root 444: {
445: addr -= kickmem_start & kickmem_mask;
1.1.1.2 root 446: addr &= kickmem_mask;
1.1 root 447: return kickmemory[addr];
448: }
449:
1.1.1.4 root 450: void REGPARAM2 kickmem_lput (uaecptr addr, uae_u32 b)
1.1 root 451: {
1.1.1.4 root 452: if (currprefs.illegal_mem)
453: write_log ("Illegal kickmem lput at %08lx\n", addr);
1.1 root 454: }
455:
1.1.1.4 root 456: void REGPARAM2 kickmem_wput (uaecptr addr, uae_u32 b)
1.1 root 457: {
1.1.1.4 root 458: if (currprefs.illegal_mem)
459: write_log ("Illegal kickmem wput at %08lx\n", addr);
1.1 root 460: }
461:
1.1.1.4 root 462: void REGPARAM2 kickmem_bput (uaecptr addr, uae_u32 b)
1.1 root 463: {
1.1.1.4 root 464: if (currprefs.illegal_mem)
465: write_log ("Illegal kickmem lput at %08lx\n", addr);
1.1 root 466: }
467:
1.1.1.4 root 468: int REGPARAM2 kickmem_check (uaecptr addr, uae_u32 size)
1.1 root 469: {
1.1.1.2 root 470: addr -= kickmem_start & kickmem_mask;
471: addr &= kickmem_mask;
1.1.1.4 root 472: return (addr + size) <= kickmem_size;
1.1 root 473: }
474:
1.1.1.4 root 475: uae_u8 REGPARAM2 *kickmem_xlate (uaecptr addr)
1.1 root 476: {
1.1.1.2 root 477: addr -= kickmem_start & kickmem_mask;
478: addr &= kickmem_mask;
1.1 root 479: return kickmemory + addr;
480: }
481:
1.1.1.3 root 482: /* Default memory access functions */
483:
1.1.1.4 root 484: int REGPARAM2 default_check (uaecptr a, uae_u32 b)
1.1.1.3 root 485: {
486: return 0;
487: }
488:
1.1.1.4 root 489: uae_u8 REGPARAM2 *default_xlate (uaecptr a)
1.1.1.3 root 490: {
491: write_log ("Your Amiga program just did something terribly stupid\n");
492: uae_reset();
493: return kickmem_xlate (get_long (0xF80000)); /* So we don't crash. */
494: }
495:
1.1.1.4 root 496: static int load_kickstart (void)
1.1 root 497: {
498: int i;
1.1.1.3 root 499: uae_u32 cksum = 0, prevck = 0;
500: unsigned char buffer[20];
501:
1.1.1.6 root 502: FILE *f = zfile_open (currprefs.romfile, "rb");
1.1.1.3 root 503:
504: if (f == NULL) {
505: write_log ("No Kickstart ROM found.\n");
1.1.1.6 root 506: #if defined AMIGA || defined __POS__
1.1.1.2 root 507: #define USE_UAE_ERSATZ "USE_UAE_ERSATZ"
1.1.1.6 root 508: if (!getenv (USE_UAE_ERSATZ)) {
509: fprintf (stderr, "Using current ROM. (create ENV:%s to "
510: "use uae's ROM replacement)\n", USE_UAE_ERSATZ);
511: memcpy (kickmemory, (char*)0x1000000 - kickmem_size, kickmem_size);
1.1.1.2 root 512: goto chk_sum;
513: }
514: #endif
1.1 root 515: return 0;
516: }
1.1.1.3 root 517:
518: i = fread (buffer, 1, 11, f);
519: if (strncmp ((char *)buffer, "AMIROMTYPE1", 11) != 0)
520: fseek (f, 0, SEEK_SET);
521:
522: i = fread (kickmemory, 1, kickmem_size, f);
1.1 root 523: if (i == kickmem_size/2) {
524: memcpy (kickmemory + kickmem_size/2, kickmemory, kickmem_size/2);
525: } else if (i != kickmem_size) {
1.1.1.3 root 526: write_log ("Error while reading Kickstart.\n");
1.1 root 527: return 0;
528: }
529: zfile_close (f);
1.1.1.3 root 530:
531: cloanto_rom = 0;
532: if (strncmp ((char *)buffer, "AMIROMTYPE1", 11) == 0) {
533: FILE *keyf;
534: uae_u8 *p;
535: long size, cnt, t;
536:
537: cloanto_rom = 1;
538: write_log ("ROM image is an encrypted \"Amiga Forever\" ROM file.\n");
1.1.1.6 root 539: if (strlen (currprefs.keyfile) == 0) {
1.1.1.3 root 540: write_log ("No filename given for ROM key file.\n");
541: return 0;
542: }
1.1.1.6 root 543: keyf = zfile_open (currprefs.keyfile, "rb");
1.1.1.3 root 544: if (keyf == 0) {
545: write_log ("Could not find ROM key file.\n");
546: return 0;
547: }
548: p = (uae_u8 *)xmalloc (524288);
549: size = fread (p, 1, 524288, keyf);
550:
551: for (t = cnt = 0; cnt < kickmem_size; cnt++, t = (t + 1) % size) {
552: kickmemory[cnt] ^= p[t];
553: if (i == cnt+1)
554: t = size-1;
555: }
556: fclose (keyf);
557: free (p);
558: }
1.1.1.2 root 559: #if defined(AMIGA)
560: chk_sum:
561: #endif
562:
1.1 root 563: for (i = 0; i < kickmem_size; i+=4) {
1.1.1.3 root 564: uae_u32 data = kickmemory[i]*65536*256 + kickmemory[i+1]*65536 + kickmemory[i+2]*256 + kickmemory[i+3];
1.1 root 565: cksum += data;
566: if (cksum < prevck)
567: cksum++;
568: prevck = cksum;
569: }
1.1.1.2 root 570: if (cksum != 0xFFFFFFFFul) {
1.1.1.4 root 571: write_log ("Kickstart checksum incorrect. You probably have a corrupted ROM image.\n");
1.1 root 572: }
573: return 1;
574: }
575:
576: /* Address banks */
577:
578: addrbank dummy_bank = {
579: dummy_lget, dummy_wget, dummy_bget,
580: dummy_lput, dummy_wput, dummy_bput,
581: default_xlate, dummy_check
582: };
583:
1.1.1.3 root 584: addrbank mbres_bank = {
585: mbres_lget, mbres_wget, mbres_bget,
586: mbres_lput, mbres_wput, mbres_bput,
587: default_xlate, mbres_check
588: };
589:
1.1 root 590: addrbank chipmem_bank = {
591: chipmem_lget, chipmem_wget, chipmem_bget,
592: chipmem_lput, chipmem_wput, chipmem_bput,
593: chipmem_xlate, chipmem_check
594: };
595:
596: addrbank bogomem_bank = {
597: bogomem_lget, bogomem_wget, bogomem_bget,
598: bogomem_lput, bogomem_wput, bogomem_bput,
599: bogomem_xlate, bogomem_check
600: };
601:
1.1.1.3 root 602: addrbank a3000mem_bank = {
603: a3000mem_lget, a3000mem_wget, a3000mem_bget,
604: a3000mem_lput, a3000mem_wput, a3000mem_bput,
605: a3000mem_xlate, a3000mem_check
606: };
607:
1.1 root 608: addrbank kickmem_bank = {
609: kickmem_lget, kickmem_wget, kickmem_bget,
610: kickmem_lput, kickmem_wput, kickmem_bput,
611: kickmem_xlate, kickmem_check
612: };
613:
614: char *address_space, *good_address_map;
615: int good_address_fd;
1.1.1.4 root 616:
617: static void init_mem_banks (void)
618: {
619: int i;
620: for (i = 0; i < 65536; i++)
621: put_mem_bank (i<<16, &dummy_bank);
622: }
623:
1.1.1.2 root 624: #define MAKE_USER_PROGRAMS_BEHAVE 1
1.1.1.4 root 625: void memory_init (void)
1.1 root 626: {
627: char buffer[4096];
628: char *nam;
629: int i, fd;
1.1.1.3 root 630: int custom_start;
1.1 root 631:
1.1.1.4 root 632: allocated_chipmem = currprefs.chipmem_size;
633: allocated_bogomem = currprefs.bogomem_size;
634: allocated_a3000mem = currprefs.a3000mem_size;
1.1.1.3 root 635:
1.1.1.2 root 636: #ifdef USE_MAPPED_MEMORY
1.1.1.4 root 637: fd = open ("/dev/zero", O_RDWR);
638: good_address_map = mmap (NULL, 1 << 24, PROT_READ, MAP_PRIVATE, fd, 0);
1.1.1.2 root 639: /* Don't believe USER_PROGRAMS_BEHAVE. Otherwise, we'd segfault as soon
640: * as a decrunch routine tries to do color register hacks. */
1.1.1.4 root 641: address_space = mmap (NULL, 1 << 24, PROT_READ | (USER_PROGRAMS_BEHAVE || MAKE_USER_PROGRAMS_BEHAVE? PROT_WRITE : 0), MAP_PRIVATE, fd, 0);
1.1.1.2 root 642: if ((int)address_space < 0 || (int)good_address_map < 0) {
1.1.1.3 root 643: write_log ("Your system does not have enough virtual memory - increase swap.\n");
1.1.1.4 root 644: abort ();
1.1.1.2 root 645: }
646: #ifdef MAKE_USER_PROGRAMS_BEHAVE
1.1.1.4 root 647: memset (address_space + 0xDFF180, 0xFF, 32*2);
1.1.1.2 root 648: #else
649: /* Likewise. This is mostly for mouse button checks. */
650: if (USER_PROGRAMS_BEHAVE)
1.1.1.4 root 651: memset (address_space + 0xA00000, 0xFF, 0xF00000 - 0xA00000);
1.1.1.2 root 652: #endif
1.1.1.4 root 653: chipmemory = mmap (address_space, 0x200000, PROT_READ|PROT_WRITE, MAP_PRIVATE | MAP_FIXED, fd, 0);
654: kickmemory = mmap (address_space + 0xF80000, 0x80000, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, fd, 0);
1.1 root 655:
656: close(fd);
657:
1.1.1.4 root 658: good_address_fd = open (nam = tmpnam (NULL), O_CREAT|O_RDWR, 0600);
1.1.1.3 root 659: memset (buffer, 1, sizeof(buffer));
660: write (good_address_fd, buffer, sizeof buffer);
661: unlink (nam);
1.1 root 662:
1.1.1.4 root 663: for (i = 0; i < allocated_chipmem; i += 4096)
664: mmap (good_address_map + i, 4096, PROT_READ, MAP_FIXED | MAP_PRIVATE,
665: good_address_fd, 0);
1.1 root 666: for (i = 0; i < kickmem_size; i += 4096)
1.1.1.4 root 667: mmap (good_address_map + i + 0x1000000 - kickmem_size, 4096, PROT_READ,
668: MAP_FIXED | MAP_PRIVATE, good_address_fd, 0);
1.1 root 669: #else
1.1.1.4 root 670: kickmemory = (uae_u8 *)xmalloc (kickmem_size);
671: chipmemory = (uae_u8 *)malloc (allocated_chipmem);
1.1.1.3 root 672:
1.1.1.4 root 673: while (! chipmemory && allocated_chipmem > 512*1024) {
674: allocated_chipmem >>= 1;
675: chipmemory = (uae_u8 *)malloc (allocated_chipmem);
1.1.1.3 root 676: if (chipmemory)
1.1.1.4 root 677: fprintf (stderr, "Reducing chipmem size to %dkb\n", allocated_chipmem >> 10);
1.1.1.3 root 678: }
1.1.1.4 root 679: if (! chipmemory) {
1.1.1.3 root 680: write_log ("virtual memory exhausted (chipmemory)!\n");
1.1.1.4 root 681: abort ();
1.1.1.2 root 682: }
1.1 root 683: #endif
1.1.1.6 root 684:
685: do_put_mem_long ((uae_u32 *)(chipmemory + 4), 0);
1.1.1.4 root 686: init_mem_banks ();
1.1.1.3 root 687:
1.1 root 688: /* Map the chipmem into all of the lower 16MB */
1.1.1.3 root 689: map_banks (&chipmem_bank, 0x00, 256);
690: custom_start = 0xC0;
1.1 root 691:
1.1.1.3 root 692: map_banks (&custom_bank, custom_start, 0xE0-custom_start);
693: map_banks (&cia_bank, 0xA0, 32);
694: map_banks (&clock_bank, 0xDC, 1);
695:
696: /* @@@ Does anyone have a clue what should be in the 0x200000 - 0xA00000
697: * range on an Amiga without expansion memory? */
1.1.1.4 root 698: custom_start = allocated_chipmem >> 16;
1.1.1.3 root 699: if (custom_start < 0x20)
700: custom_start = 0x20;
701: map_banks (&dummy_bank, custom_start, 0xA0 - custom_start);
702: /*map_banks (&mbres_bank, 0xDE, 1);*/
703:
1.1.1.4 root 704: if (allocated_bogomem > 0)
705: bogomemory = (uae_u8 *)xmalloc (allocated_bogomem);
706: if (bogomemory != 0)
707: map_banks (&bogomem_bank, 0xC0, allocated_bogomem >> 16);
708: else
709: allocated_bogomem = 0;
710:
711: if (allocated_a3000mem > 0)
712: a3000memory = (uae_u8 *)xmalloc (allocated_a3000mem);
713: if (a3000memory != 0)
714: map_banks (&a3000mem_bank, a3000mem_start >> 16, allocated_a3000mem >> 16);
715: else
716: allocated_a3000mem = 0;
1.1.1.3 root 717:
718: map_banks (&rtarea_bank, 0xF0, 1);
1.1.1.4 root 719: if (! load_kickstart ()) {
1.1.1.3 root 720: init_ersatz_rom (kickmemory);
1.1 root 721: ersatzkickfile = 1;
722: }
1.1.1.3 root 723: map_banks (&kickmem_bank, 0xF8, 8);
724: map_banks (&expamem_bank, 0xE8, 1);
725:
726: if (cloanto_rom)
727: map_banks (&kickmem_bank, 0xE0, 8);
1.1.1.4 root 728:
729: chipmem_mask = allocated_chipmem- 1;
730: kickmem_mask = kickmem_size - 1;
731: bogomem_mask = allocated_bogomem - 1;
732: a3000mem_mask = allocated_a3000mem - 1;
733:
1.1 root 734: }
735:
1.1.1.4 root 736: void map_banks (addrbank *bank, int start, int size)
1.1 root 737: {
738: int bnr;
1.1.1.3 root 739: unsigned long int hioffs = 0, endhioffs = 0x100;
740:
741: if (start >= 0x100) {
742: for (bnr = start; bnr < start + size; bnr++)
743: put_mem_bank (bnr << 16, bank);
744: return;
745: }
746: /* Some '020 Kickstarts apparently require a 24 bit address space... */
747: if (currprefs.address_space_24)
748: endhioffs = 0x10000;
749: for (hioffs = 0; hioffs < endhioffs; hioffs += 0x100)
750: for (bnr = start; bnr < start+size; bnr++)
1.1.1.5 root 751: put_mem_bank ((bnr + hioffs) << 16, bank);
1.1 root 752: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.