|
|
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"
14: #include "memory.h"
15: #include "custom.h"
16: #include "cia.h"
17: #include "ersatz.h"
18: #include "zfile.h"
19: #include "events.h"
1.1.1.2 ! root 20: #include "readcpu.h"
1.1 root 21: #include "newcpu.h"
22: #include "compiler.h"
23:
1.1.1.2 ! root 24: #ifdef USE_MAPPED_MEMORY
1.1 root 25: #include <sys/mman.h>
26: #endif
27:
28: int ersatzkickfile = 0;
29:
30: int buserr;
31: addrbank membanks[65536];
32:
1.1.1.2 ! root 33: #ifdef NO_INLINE_MEMORY_ACCESS
! 34: __inline__ ULONG alongget(CPTR addr)
! 35: {
! 36: return call_mem_get_func(membanks[bankindex(addr)].alget, addr);
! 37: }
! 38: __inline__ ULONG awordget(CPTR addr)
! 39: {
! 40: return call_mem_get_func(membanks[bankindex(addr)].awget, addr);
! 41: }
! 42: __inline__ ULONG longget(CPTR addr)
! 43: {
! 44: return call_mem_get_func(membanks[bankindex(addr)].lget, addr);
! 45: }
! 46: __inline__ ULONG wordget(CPTR addr)
! 47: {
! 48: return call_mem_get_func(membanks[bankindex(addr)].wget, addr);
! 49: }
! 50: __inline__ ULONG byteget(CPTR addr)
! 51: {
! 52: return call_mem_get_func(membanks[bankindex(addr)].bget, addr);
! 53: }
! 54: __inline__ void longput(CPTR addr, ULONG l)
! 55: {
! 56: call_mem_put_func(membanks[bankindex(addr)].lput, addr, l);
! 57: }
! 58: __inline__ void wordput(CPTR addr, ULONG w)
! 59: {
! 60: call_mem_put_func(membanks[bankindex(addr)].wput, addr, w);
! 61: }
! 62: __inline__ void byteput(CPTR addr, ULONG b)
! 63: {
! 64: call_mem_put_func(membanks[bankindex(addr)].bput, addr, b);
! 65: }
! 66: #endif
! 67:
1.1 root 68: /* Default memory access functions */
69:
1.1.1.2 ! root 70: int REGPARAM2 default_check(CPTR a, ULONG b)
1.1 root 71: {
72: return 0;
73: }
74:
1.1.1.2 ! root 75: UBYTE REGPARAM2 *default_xlate(CPTR a)
1.1 root 76: {
77: fprintf(stderr, "Your Amiga program just did something terribly stupid\n");
78: return 0;
79: }
80:
1.1.1.2 ! root 81: ULONG REGPARAM2 default_awget(CPTR addr)
1.1 root 82: {
83: default_xlate(addr);
84: return 0;
85: }
86:
1.1.1.2 ! root 87: ULONG REGPARAM2 default_alget(CPTR addr)
1.1 root 88: {
89: default_xlate(addr);
90: return 0;
91: }
92:
93: /* A dummy bank that only contains zeros */
94:
95: static ULONG dummy_lget(CPTR) REGPARAM;
1.1.1.2 ! root 96: static ULONG dummy_wget(CPTR) REGPARAM;
! 97: static ULONG dummy_bget(CPTR) REGPARAM;
1.1 root 98: static void dummy_lput(CPTR, ULONG) REGPARAM;
1.1.1.2 ! root 99: static void dummy_wput(CPTR, ULONG) REGPARAM;
! 100: static void dummy_bput(CPTR, ULONG) REGPARAM;
1.1 root 101: static int dummy_check(CPTR addr, ULONG size) REGPARAM;
102:
1.1.1.2 ! root 103: ULONG REGPARAM2 dummy_lget(CPTR addr)
1.1 root 104: {
105: if (illegal_mem) printf("Illegal lget at %08lx pc=%08lx\n",addr,m68k_getpc());
106: return 0;
107: }
108:
1.1.1.2 ! root 109: ULONG REGPARAM2 dummy_wget(CPTR addr)
1.1 root 110: {
111: if (illegal_mem) printf("Illegal wget at %08lx pc=%08lx\n",addr,m68k_getpc());
112: return 0;
113: }
114:
1.1.1.2 ! root 115: ULONG REGPARAM2 dummy_bget(CPTR addr)
1.1 root 116: {
117: if (illegal_mem) printf("Illegal bget at %08lx pc=%08lx\n",addr,m68k_getpc());
118: return 0;
119: }
120:
1.1.1.2 ! root 121: void REGPARAM2 dummy_lput(CPTR addr, ULONG l)
1.1 root 122: {
123: if (illegal_mem) printf("Illegal lput at %08lx pc=%08lx\n",addr,m68k_getpc());
124: }
1.1.1.2 ! root 125: void REGPARAM2 dummy_wput(CPTR addr, ULONG w)
1.1 root 126: {
127: if (illegal_mem) printf("Illegal wput at %08lx pc=%08lx\n",addr,m68k_getpc());
128: }
1.1.1.2 ! root 129: void REGPARAM2 dummy_bput(CPTR addr, ULONG b)
1.1 root 130: {
131: if (illegal_mem) printf("Illegal bput at %08lx pc=%08lx\n",addr,m68k_getpc());
132: }
133:
1.1.1.2 ! root 134: int REGPARAM2 dummy_check(CPTR addr, ULONG size)
1.1 root 135: {
136: if (illegal_mem) printf("Illegal check at %08lx pc=%08lx\n",addr,m68k_getpc());
137: return 0;
138: }
139:
140: /* Chip memory */
141:
142: ULONG chipmem_mask,kickmem_mask,bogomem_mask;
143:
144: UBYTE *chipmemory;
145:
146: static ULONG chipmem_alget(CPTR) REGPARAM;
1.1.1.2 ! root 147: static ULONG chipmem_awget(CPTR) REGPARAM;
1.1 root 148:
149: static ULONG chipmem_lget(CPTR) REGPARAM;
1.1.1.2 ! root 150: static ULONG chipmem_wget(CPTR) REGPARAM;
! 151: static ULONG chipmem_bget(CPTR) REGPARAM;
1.1 root 152: static void chipmem_lput(CPTR, ULONG) REGPARAM;
1.1.1.2 ! root 153: static void chipmem_wput(CPTR, ULONG) REGPARAM;
! 154: static void chipmem_bput(CPTR, ULONG) REGPARAM;
1.1 root 155:
156: static int chipmem_check(CPTR addr, ULONG size) REGPARAM;
157: static UBYTE *chipmem_xlate(CPTR addr) REGPARAM;
158:
1.1.1.2 ! root 159: ULONG REGPARAM2 chipmem_alget(CPTR addr)
1.1 root 160: {
1.1.1.2 ! root 161: ULONG *m;
1.1 root 162: addr -= chipmem_start & chipmem_mask;
1.1.1.2 ! root 163: addr &= chipmem_mask;
! 164: m = (ULONG *)(chipmemory + addr);
! 165: return do_get_mem_long(m);
1.1 root 166: }
167:
1.1.1.2 ! root 168: ULONG REGPARAM2 chipmem_awget(CPTR addr)
1.1 root 169: {
1.1.1.2 ! root 170: UWORD *m;
1.1 root 171: addr -= chipmem_start & chipmem_mask;
1.1.1.2 ! root 172: addr &= chipmem_mask;
! 173: m = (UWORD *)(chipmemory + addr);
! 174: return do_get_mem_word(m);
1.1 root 175: }
176:
1.1.1.2 ! root 177: ULONG REGPARAM2 chipmem_lget(CPTR addr)
1.1 root 178: {
1.1.1.2 ! root 179: ULONG *m;
1.1 root 180: addr -= chipmem_start & chipmem_mask;
1.1.1.2 ! root 181: addr &= chipmem_mask;
! 182: m = (ULONG *)(chipmemory + addr);
! 183: return do_get_mem_long(m);
1.1 root 184: }
185:
1.1.1.2 ! root 186: ULONG REGPARAM2 chipmem_wget(CPTR addr)
1.1 root 187: {
1.1.1.2 ! root 188: UWORD *m;
1.1 root 189: addr -= chipmem_start & chipmem_mask;
1.1.1.2 ! root 190: addr &= chipmem_mask;
! 191: m = (UWORD *)(chipmemory + addr);
! 192: return do_get_mem_word(m);
1.1 root 193: }
194:
1.1.1.2 ! root 195: ULONG REGPARAM2 chipmem_bget(CPTR addr)
1.1 root 196: {
197: addr -= chipmem_start & chipmem_mask;
1.1.1.2 ! root 198: addr &= chipmem_mask;
1.1 root 199: return chipmemory[addr];
200: }
201:
1.1.1.2 ! root 202: void REGPARAM2 chipmem_lput(CPTR addr, ULONG l)
1.1 root 203: {
1.1.1.2 ! root 204: ULONG *m;
1.1 root 205: addr -= chipmem_start & chipmem_mask;
1.1.1.2 ! root 206: addr &= chipmem_mask;
! 207: m = (ULONG *)(chipmemory + addr);
! 208: do_put_mem_long(m, l);
1.1 root 209: }
210:
1.1.1.2 ! root 211: void REGPARAM2 chipmem_wput(CPTR addr, ULONG w)
1.1 root 212: {
1.1.1.2 ! root 213: UWORD *m;
1.1 root 214: addr -= chipmem_start & chipmem_mask;
1.1.1.2 ! root 215: addr &= chipmem_mask;
! 216: m = (UWORD *)(chipmemory + addr);
! 217: do_put_mem_word(m, w);
1.1 root 218: }
219:
1.1.1.2 ! root 220: void REGPARAM2 chipmem_bput(CPTR addr, ULONG b)
1.1 root 221: {
222: addr -= chipmem_start & chipmem_mask;
1.1.1.2 ! root 223: addr &= chipmem_mask;
1.1 root 224: chipmemory[addr] = b;
225: }
226:
1.1.1.2 ! root 227: int REGPARAM2 chipmem_check(CPTR addr, ULONG size)
1.1 root 228: {
229: addr -= chipmem_start & chipmem_mask;
1.1.1.2 ! root 230: addr &= chipmem_mask;
1.1 root 231: return (addr + size) < chipmem_size;
232: }
233:
1.1.1.2 ! root 234: UBYTE REGPARAM2 *chipmem_xlate(CPTR addr)
1.1 root 235: {
236: addr -= chipmem_start & chipmem_mask;
1.1.1.2 ! root 237: addr &= chipmem_mask;
1.1 root 238: return chipmemory + addr;
239: }
240:
241: /* Slow memory */
242:
243: static UBYTE *bogomemory;
244:
245: static ULONG bogomem_alget(CPTR) REGPARAM;
1.1.1.2 ! root 246: static ULONG bogomem_awget(CPTR) REGPARAM;
1.1 root 247: static ULONG bogomem_lget(CPTR) REGPARAM;
1.1.1.2 ! root 248: static ULONG bogomem_wget(CPTR) REGPARAM;
! 249: static ULONG bogomem_bget(CPTR) REGPARAM;
1.1 root 250: static void bogomem_lput(CPTR, ULONG) REGPARAM;
1.1.1.2 ! root 251: static void bogomem_wput(CPTR, ULONG) REGPARAM;
! 252: static void bogomem_bput(CPTR, ULONG) REGPARAM;
1.1 root 253: static int bogomem_check(CPTR addr, ULONG size) REGPARAM;
254: static UBYTE *bogomem_xlate(CPTR addr) REGPARAM;
255:
1.1.1.2 ! root 256: ULONG REGPARAM2 bogomem_alget(CPTR addr)
1.1 root 257: {
1.1.1.2 ! root 258: ULONG *m;
1.1 root 259: addr -= bogomem_start & bogomem_mask;
1.1.1.2 ! root 260: addr &= bogomem_mask;
! 261: m = (ULONG *)(bogomemory + addr);
! 262: return do_get_mem_long(m);
1.1 root 263: }
264:
1.1.1.2 ! root 265: ULONG REGPARAM2 bogomem_awget(CPTR addr)
1.1 root 266: {
1.1.1.2 ! root 267: UWORD *m;
1.1 root 268: addr -= bogomem_start & bogomem_mask;
1.1.1.2 ! root 269: addr &= bogomem_mask;
! 270: m = (UWORD *)(bogomemory + addr);
! 271: return do_get_mem_word(m);
1.1 root 272: }
273:
1.1.1.2 ! root 274: ULONG REGPARAM2 bogomem_lget(CPTR addr)
1.1 root 275: {
1.1.1.2 ! root 276: ULONG *m;
1.1 root 277: addr -= bogomem_start & bogomem_mask;
1.1.1.2 ! root 278: addr &= bogomem_mask;
! 279: m = (ULONG *)(bogomemory + addr);
! 280: return do_get_mem_long(m);
1.1 root 281: }
282:
1.1.1.2 ! root 283: ULONG REGPARAM2 bogomem_wget(CPTR addr)
1.1 root 284: {
1.1.1.2 ! root 285: UWORD *m;
1.1 root 286: addr -= bogomem_start & bogomem_mask;
1.1.1.2 ! root 287: addr &= bogomem_mask;
! 288: m = (UWORD *)(bogomemory + addr);
! 289: return do_get_mem_word(m);
1.1 root 290: }
291:
1.1.1.2 ! root 292: ULONG REGPARAM2 bogomem_bget(CPTR addr)
1.1 root 293: {
294: addr -= bogomem_start & bogomem_mask;
1.1.1.2 ! root 295: addr &= bogomem_mask;
1.1 root 296: return bogomemory[addr];
297: }
298:
1.1.1.2 ! root 299: void REGPARAM2 bogomem_lput(CPTR addr, ULONG l)
1.1 root 300: {
1.1.1.2 ! root 301: ULONG *m;
1.1 root 302: addr -= bogomem_start & bogomem_mask;
1.1.1.2 ! root 303: addr &= bogomem_mask;
! 304: m = (ULONG *)(bogomemory + addr);
! 305: do_put_mem_long(m, l);
1.1 root 306: }
307:
1.1.1.2 ! root 308: void REGPARAM2 bogomem_wput(CPTR addr, ULONG w)
1.1 root 309: {
1.1.1.2 ! root 310: UWORD *m;
1.1 root 311: addr -= bogomem_start & bogomem_mask;
1.1.1.2 ! root 312: addr &= bogomem_mask;
! 313: m = (UWORD *)(bogomemory + addr);
! 314: do_put_mem_word(m, w);
1.1 root 315: }
316:
1.1.1.2 ! root 317: void REGPARAM2 bogomem_bput(CPTR addr, ULONG b)
1.1 root 318: {
319: addr -= bogomem_start & bogomem_mask;
1.1.1.2 ! root 320: addr &= bogomem_mask;
1.1 root 321: bogomemory[addr] = b;
322: }
323:
1.1.1.2 ! root 324: int REGPARAM2 bogomem_check(CPTR addr, ULONG size)
1.1 root 325: {
1.1.1.2 ! root 326: addr -= bogomem_start & bogomem_mask;
! 327: addr &= bogomem_mask;
1.1 root 328: return (addr + size) < bogomem_size;
329: }
330:
1.1.1.2 ! root 331: UBYTE REGPARAM2 *bogomem_xlate(CPTR addr)
1.1 root 332: {
1.1.1.2 ! root 333: addr -= bogomem_start & bogomem_mask;
! 334: addr &= bogomem_mask;
1.1 root 335: return bogomemory + addr;
336: }
337:
338: /* Kick memory */
339:
340: static int zkickfile = 0;
341: UBYTE *kickmemory;
342:
343: static ULONG kickmem_alget(CPTR) REGPARAM;
1.1.1.2 ! root 344: static ULONG kickmem_awget(CPTR) REGPARAM;
1.1 root 345: static ULONG kickmem_lget(CPTR) REGPARAM;
1.1.1.2 ! root 346: static ULONG kickmem_wget(CPTR) REGPARAM;
! 347: static ULONG kickmem_bget(CPTR) REGPARAM;
1.1 root 348: static void kickmem_lput(CPTR, ULONG) REGPARAM;
1.1.1.2 ! root 349: static void kickmem_wput(CPTR, ULONG) REGPARAM;
! 350: static void kickmem_bput(CPTR, ULONG) REGPARAM;
1.1 root 351: static int kickmem_check(CPTR addr, ULONG size) REGPARAM;
352: static UBYTE *kickmem_xlate(CPTR addr) REGPARAM;
353:
1.1.1.2 ! root 354: ULONG REGPARAM2 kickmem_alget(CPTR addr)
1.1 root 355: {
1.1.1.2 ! root 356: ULONG *m;
1.1 root 357: addr -= kickmem_start & kickmem_mask;
1.1.1.2 ! root 358: addr &= kickmem_mask;
! 359: m = (ULONG *)(kickmemory + addr);
! 360: return do_get_mem_long(m);
1.1 root 361: }
362:
1.1.1.2 ! root 363: ULONG REGPARAM2 kickmem_awget(CPTR addr)
1.1 root 364: {
1.1.1.2 ! root 365: UWORD *m;
1.1 root 366: addr -= kickmem_start & kickmem_mask;
1.1.1.2 ! root 367: addr &= kickmem_mask;
! 368: m = (UWORD *)(kickmemory + addr);
! 369: return do_get_mem_word(m);
1.1 root 370: }
371:
1.1.1.2 ! root 372: ULONG REGPARAM2 kickmem_lget(CPTR addr)
1.1 root 373: {
1.1.1.2 ! root 374: ULONG *m;
1.1 root 375: addr -= kickmem_start & kickmem_mask;
1.1.1.2 ! root 376: addr &= kickmem_mask;
! 377: m = (ULONG *)(kickmemory + addr);
! 378: return do_get_mem_long(m);
1.1 root 379: }
380:
1.1.1.2 ! root 381: ULONG REGPARAM2 kickmem_wget(CPTR addr)
1.1 root 382: {
1.1.1.2 ! root 383: UWORD *m;
1.1 root 384: addr -= kickmem_start & kickmem_mask;
1.1.1.2 ! root 385: addr &= kickmem_mask;
! 386: m = (UWORD *)(kickmemory + addr);
! 387: return do_get_mem_word(m);
1.1 root 388: }
389:
1.1.1.2 ! root 390: ULONG REGPARAM2 kickmem_bget(CPTR addr)
1.1 root 391: {
392: addr -= kickmem_start & kickmem_mask;
1.1.1.2 ! root 393: addr &= kickmem_mask;
1.1 root 394: return kickmemory[addr];
395: }
396:
1.1.1.2 ! root 397: void REGPARAM2 kickmem_lput(CPTR addr, ULONG b)
1.1 root 398: {
399: if (illegal_mem) printf("Illegal kickmem lput at %08lx pc=%08lx\n",addr,m68k_getpc());
400: }
401:
1.1.1.2 ! root 402: void REGPARAM2 kickmem_wput(CPTR addr, ULONG b)
1.1 root 403: {
404: if (illegal_mem) printf("Illegal kickmem wput at %08lx pc=%08lx\n",addr,m68k_getpc());
405: }
406:
1.1.1.2 ! root 407: void REGPARAM2 kickmem_bput(CPTR addr, ULONG b)
1.1 root 408: {
409: if (illegal_mem) printf("Illegal kickmem lput at %08lx pc=%08lx\n",addr,m68k_getpc());
410: }
411:
1.1.1.2 ! root 412: int REGPARAM2 kickmem_check(CPTR addr, ULONG size)
1.1 root 413: {
1.1.1.2 ! root 414: addr -= kickmem_start & kickmem_mask;
! 415: addr &= kickmem_mask;
1.1 root 416: return (addr + size) < kickmem_size;
417: }
418:
1.1.1.2 ! root 419: UBYTE REGPARAM2 *kickmem_xlate(CPTR addr)
1.1 root 420: {
1.1.1.2 ! root 421: addr -= kickmem_start & kickmem_mask;
! 422: addr &= kickmem_mask;
1.1 root 423: return kickmemory + addr;
424: }
425:
426: static int load_kickstart(void)
427: {
428: int i;
429: ULONG cksum = 0, prevck = 0;
430: unsigned char buffer[8];
431:
432: FILE *f = zfile_open(romfile, "rb");
433:
434: if (f == NULL) {
435: fprintf(stderr, "No Kickstart ROM found.\n");
1.1.1.2 ! root 436: #if defined(AMIGA)
! 437: #define USE_UAE_ERSATZ "USE_UAE_ERSATZ"
! 438: fprintf(stderr, "Using current ROM. (create ENV:%s to "
! 439: "use uae's ROM replacement)\n",USE_UAE_ERSATZ);
! 440: if(!getenv(USE_UAE_ERSATZ)) {
! 441: memcpy(kickmemory,(char*)0x1000000-kickmem_size,kickmem_size);
! 442: goto chk_sum;
! 443: }
! 444: #endif
1.1 root 445: return 0;
446: }
447:
448: fread(buffer, 1, 8, f);
449: if (buffer[4] == 0 && buffer[5] == 8 && buffer[6] == 0 && buffer[7] == 0) {
450: fprintf(stderr, "You seem to have a ZKick file there... You probably lose.\n");
451: zkickfile = 1;
452: } else
453: fseek(f, 0, SEEK_SET);
454:
455: i = fread(kickmemory, 1, kickmem_size, f);
456: if (i == kickmem_size/2) {
1.1.1.2 ! root 457: /* fprintf(stderr, "Warning: Kickstart is only 256K.\n"); */
1.1 root 458: memcpy (kickmemory + kickmem_size/2, kickmemory, kickmem_size/2);
459: } else if (i != kickmem_size) {
460: fprintf(stderr, "Error while reading Kickstart.\n");
461: return 0;
462: }
463: zfile_close (f);
464:
1.1.1.2 ! root 465: #if defined(AMIGA)
! 466: chk_sum:
! 467: #endif
! 468:
1.1 root 469: for (i = 0; i < kickmem_size; i+=4) {
470: ULONG data = kickmemory[i]*65536*256 + kickmemory[i+1]*65536 + kickmemory[i+2]*256 + kickmemory[i+3];
471: cksum += data;
472: if (cksum < prevck)
473: cksum++;
474: prevck = cksum;
475: }
1.1.1.2 ! root 476: if (cksum != 0xFFFFFFFFul) {
1.1 root 477: fprintf(stderr, "Warning: Kickstart checksum incorrect. You probably have a corrupted ROM image.\n");
478: }
479: return 1;
480: }
481:
482: /* Address banks */
483:
484: addrbank dummy_bank = {
485: default_alget, default_awget,
486: dummy_lget, dummy_wget, dummy_bget,
487: dummy_lput, dummy_wput, dummy_bput,
488: default_xlate, dummy_check
489: };
490:
491: addrbank chipmem_bank = {
492: chipmem_alget, chipmem_awget,
493: chipmem_lget, chipmem_wget, chipmem_bget,
494: chipmem_lput, chipmem_wput, chipmem_bput,
495: chipmem_xlate, chipmem_check
496: };
497:
498: addrbank bogomem_bank = {
499: bogomem_alget, bogomem_awget,
500: bogomem_lget, bogomem_wget, bogomem_bget,
501: bogomem_lput, bogomem_wput, bogomem_bput,
502: bogomem_xlate, bogomem_check
503: };
504:
505: addrbank kickmem_bank = {
506: kickmem_alget, kickmem_awget,
507: kickmem_lget, kickmem_wget, kickmem_bget,
508: kickmem_lput, kickmem_wput, kickmem_bput,
509: kickmem_xlate, kickmem_check
510: };
511:
512: char *address_space, *good_address_map;
513: int good_address_fd;
1.1.1.2 ! root 514: #define MAKE_USER_PROGRAMS_BEHAVE 1
1.1 root 515: void memory_init(void)
516: {
517: char buffer[4096];
518: char *nam;
519: int i, fd;
520: buserr = 0;
521:
522: chipmem_mask = chipmem_size - 1;
523: kickmem_mask = kickmem_size - 1;
524: bogomem_mask = bogomem_size - 1;
525:
1.1.1.2 ! root 526: #ifdef USE_MAPPED_MEMORY
1.1 root 527: fd = open("/dev/zero", O_RDWR);
528: good_address_map = mmap(NULL, 1 << 24, PROT_READ, MAP_PRIVATE, fd, 0);
1.1.1.2 ! root 529: /* Don't believe USER_PROGRAMS_BEHAVE. Otherwise, we'd segfault as soon
! 530: * as a decrunch routine tries to do color register hacks. */
! 531: address_space = mmap(NULL, 1 << 24, PROT_READ | (USER_PROGRAMS_BEHAVE || MAKE_USER_PROGRAMS_BEHAVE? PROT_WRITE : 0), MAP_PRIVATE, fd, 0);
! 532: if ((int)address_space < 0 || (int)good_address_map < 0) {
! 533: fprintf(stderr, "Your system does not have enough virtual memory - increase swap.\n");
! 534: abort();
! 535: }
! 536: #ifdef MAKE_USER_PROGRAMS_BEHAVE
! 537: memset(address_space + 0xDFF180, 0xFF, 32*2);
! 538: #else
! 539: /* Likewise. This is mostly for mouse button checks. */
! 540: if (USER_PROGRAMS_BEHAVE)
! 541: memset(address_space + 0xA00000, 0xFF, 0xF00000 - 0xA00000);
! 542: #endif
1.1 root 543: chipmemory = mmap(address_space, 0x200000, PROT_READ|PROT_WRITE, MAP_PRIVATE | MAP_FIXED, fd, 0);
544: kickmemory = mmap(address_space + 0xF80000, 0x80000, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, fd, 0);
545:
546: close(fd);
547:
548: good_address_fd = open(nam = tmpnam(NULL), O_CREAT|O_RDWR, 0600);
549: memset(buffer,1,sizeof(buffer));
550: write(good_address_fd, buffer,sizeof(buffer));
551: unlink(nam);
552:
553: for (i = 0; i < chipmem_size; i += 4096)
554: mmap(good_address_map + i, 4096, PROT_READ, MAP_FIXED | MAP_PRIVATE,
555: good_address_fd, 0);
556: for (i = 0; i < kickmem_size; i += 4096)
557: mmap(good_address_map + i + 0x1000000 - kickmem_size, 4096, PROT_READ,
558: MAP_FIXED | MAP_PRIVATE, good_address_fd, 0);
559: #else
560: chipmemory = (UBYTE *)malloc(chipmem_size);
561: kickmemory = (UBYTE *)malloc(kickmem_size);
1.1.1.2 ! root 562: if(!chipmemory || !kickmemory) {
! 563: fprintf(stderr,"virtual memory exhausted !\n");
! 564: abort();
! 565: }
1.1 root 566: #endif
567:
568: for(i = 0; i < 65536; i++)
569: membanks[i] = dummy_bank;
570:
571: /* Map the chipmem into all of the lower 16MB */
572: map_banks(&chipmem_bank, 0x00, 256);
573: map_banks(&custom_bank, 0xC0, 0x20);
574: map_banks(&cia_bank, 0xA0, 32);
575: map_banks(&clock_bank, 0xDC, 1);
576:
577: if (bogomem_size > 0) {
578: bogomemory = (UBYTE *)malloc(bogomem_size);
1.1.1.2 ! root 579: if(!bogomemory) {
! 580: fprintf(stderr,"virtual memory exhausted !\n");
! 581: abort();
! 582: }
1.1 root 583: map_banks(&bogomem_bank, 0xC0, bogomem_size >> 16);
584: }
585:
586: map_banks(&rtarea_bank, 0xF0, 1);
587: if (!load_kickstart()) {
588: init_ersatz_rom(kickmemory);
589: ersatzkickfile = 1;
590: }
591: if (zkickfile)
592: map_banks(&kickmem_bank, 0x20, 8);
593:
594: map_banks(&kickmem_bank, 0xF8, 8);
595: if (!zkickfile)
596: map_banks(&expamem_bank, 0xE8, 1);
597: }
598:
599: void map_banks(addrbank *bank, int start, int size)
600: {
601: int bnr;
602: int hioffs = 0;
1.1.1.2 ! root 603: #if 1 || CPU_LEVEL < 2
1.1 root 604: for (hioffs = 0; hioffs < 256; hioffs++)
605: #endif
606: for (bnr = start; bnr < start+size; bnr++)
607: membanks[bnr + hioffs * 256] = *bank;
608: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.