|
|
1.1 root 1: /*
1.1.1.4 root 2: * UAE - The Un*x Amiga Emulator - CPU core
1.1 root 3: *
4: * Memory management
5: *
6: * (c) 1995 Bernd Schmidt
1.1.1.2 root 7: *
8: * Adaptation to Hatari by Thomas Huth
1.1.1.4 root 9: *
1.1.1.16 root 10: * This file is distributed under the GNU General Public License, version 2
11: * or at your option any later version. Read the file gpl.txt for details.
1.1 root 12: */
1.1.1.13 root 13: const char Memory_fileid[] = "Hatari memory.c : " __DATE__ " " __TIME__;
1.1 root 14:
1.1.1.17! root 15: #include <SDL.h>
1.1.1.10 root 16: #include "config.h"
1.1 root 17: #include "sysdeps.h"
18: #include "hatari-glue.h"
19: #include "maccess.h"
20: #include "memory.h"
1.1.1.14 root 21:
22: #include "main.h"
23: #include "tos.h"
24: #include "ide.h"
25: #include "ioMem.h"
26: #include "reset.h"
27: #include "stMemory.h"
28: #include "m68000.h"
29:
1.1.1.5 root 30: #include "newcpu.h"
1.1 root 31:
32:
1.1.1.10 root 33: /* Set illegal_mem to 1 for debug output: */
34: #define illegal_mem 1
35:
1.1.1.17! root 36: static int illegal_count = 50;
1.1.1.10 root 37:
1.1.1.6 root 38: static uae_u32 STmem_size, TTmem_size = 0;
39: static uae_u32 TTmem_mask;
1.1 root 40:
1.1.1.5 root 41: #define STmem_start 0x00000000
42: #define ROMmem_start 0x00E00000
1.1.1.10 root 43: #define IdeMem_start 0x00F00000
1.1.1.5 root 44: #define IOmem_start 0x00FF0000
45: #define TTmem_start 0x01000000
1.1 root 46:
1.1.1.10 root 47: #define IdeMem_size 65536
1.1.1.5 root 48: #define IOmem_size 65536
49: #define ROMmem_size (0x00FF0000 - 0x00E00000) /* So we cover both possible ROM regions + cartridge */
1.1 root 50:
1.1.1.5 root 51: #define STmem_mask 0x00ffffff
52: #define ROMmem_mask 0x00ffffff
1.1.1.10 root 53: #define IdeMem_mask (IdeMem_size - 1)
1.1.1.5 root 54: #define IOmem_mask (IOmem_size - 1)
1.1 root 55:
56:
57: #ifdef SAVE_MEMORY_BANKS
58: addrbank *mem_banks[65536];
59: #else
60: addrbank mem_banks[65536];
61: #endif
62:
63: #ifdef NO_INLINE_MEMORY_ACCESS
64: __inline__ uae_u32 longget (uaecptr addr)
65: {
66: return call_mem_get_func (get_mem_bank (addr).lget, addr);
67: }
68: __inline__ uae_u32 wordget (uaecptr addr)
69: {
70: return call_mem_get_func (get_mem_bank (addr).wget, addr);
71: }
72: __inline__ uae_u32 byteget (uaecptr addr)
73: {
74: return call_mem_get_func (get_mem_bank (addr).bget, addr);
75: }
76: __inline__ void longput (uaecptr addr, uae_u32 l)
77: {
78: call_mem_put_func (get_mem_bank (addr).lput, addr, l);
79: }
80: __inline__ void wordput (uaecptr addr, uae_u32 w)
81: {
82: call_mem_put_func (get_mem_bank (addr).wput, addr, w);
83: }
84: __inline__ void byteput (uaecptr addr, uae_u32 b)
85: {
86: call_mem_put_func (get_mem_bank (addr).bput, addr, b);
87: }
88: #endif
89:
90:
1.1.1.5 root 91: /* Some prototypes: */
92: static int STmem_check (uaecptr addr, uae_u32 size) REGPARAM;
93: static uae_u8 *STmem_xlate (uaecptr addr) REGPARAM;
94:
95:
1.1.1.17! root 96: static void print_illegal_counted(const char *txt, uaecptr addr)
! 97: {
! 98: if (!illegal_mem || illegal_count <= 0)
! 99: return;
! 100:
! 101: write_log("%s at %08lx\n", txt, (long)addr);
! 102: if (--illegal_count == 0)
! 103: write_log("Suppressing further messages about illegal memory accesses.\n");
! 104: }
! 105:
! 106:
1.1 root 107: /* A dummy bank that only contains zeros */
108:
1.1.1.6 root 109: static uae_u32 dummy_lget(uaecptr addr)
1.1 root 110: {
111: if (illegal_mem)
1.1.1.3 root 112: write_log ("Illegal lget at %08lx\n", (long)addr);
1.1 root 113:
114: return 0;
115: }
116:
1.1.1.6 root 117: static uae_u32 dummy_wget(uaecptr addr)
1.1 root 118: {
119: if (illegal_mem)
1.1.1.3 root 120: write_log ("Illegal wget at %08lx\n", (long)addr);
1.1 root 121:
122: return 0;
123: }
124:
1.1.1.6 root 125: static uae_u32 dummy_bget(uaecptr addr)
1.1 root 126: {
127: if (illegal_mem)
1.1.1.3 root 128: write_log ("Illegal bget at %08lx\n", (long)addr);
1.1 root 129:
130: return 0;
131: }
132:
1.1.1.6 root 133: static void dummy_lput(uaecptr addr, uae_u32 l)
1.1 root 134: {
135: if (illegal_mem)
1.1.1.3 root 136: write_log ("Illegal lput at %08lx\n", (long)addr);
1.1 root 137: }
1.1.1.5 root 138:
1.1.1.6 root 139: static void dummy_wput(uaecptr addr, uae_u32 w)
1.1 root 140: {
141: if (illegal_mem)
1.1.1.3 root 142: write_log ("Illegal wput at %08lx\n", (long)addr);
1.1 root 143: }
1.1.1.5 root 144:
1.1.1.6 root 145: static void dummy_bput(uaecptr addr, uae_u32 b)
1.1 root 146: {
147: if (illegal_mem)
1.1.1.3 root 148: write_log ("Illegal bput at %08lx\n", (long)addr);
1.1 root 149: }
150:
1.1.1.6 root 151: static int dummy_check(uaecptr addr, uae_u32 size)
1.1 root 152: {
153: if (illegal_mem)
1.1.1.3 root 154: write_log ("Illegal check at %08lx\n", (long)addr);
1.1 root 155:
156: return 0;
157: }
158:
1.1.1.6 root 159: static uae_u8 *dummy_xlate(uaecptr addr)
1.1.1.5 root 160: {
161: write_log("Your Atari program just did something terribly stupid:"
162: " dummy_xlate($%x)\n", addr);
163: /*Reset_Warm();*/
164: return STmem_xlate(addr); /* So we don't crash. */
165: }
1.1 root 166:
167:
1.1.1.5 root 168: /* **** This memory bank only generates bus errors **** */
1.1 root 169:
1.1.1.6 root 170: static uae_u32 BusErrMem_lget(uaecptr addr)
1.1.1.5 root 171: {
1.1.1.17! root 172: print_illegal_counted("Bus error lget", addr);
1.1.1.5 root 173:
1.1.1.15 root 174: M68000_BusError(addr, BUS_ERROR_READ);
1.1.1.5 root 175: return 0;
176: }
177:
1.1.1.6 root 178: static uae_u32 BusErrMem_wget(uaecptr addr)
1.1.1.5 root 179: {
1.1.1.17! root 180: print_illegal_counted("Bus error wget", addr);
1.1.1.5 root 181:
1.1.1.15 root 182: M68000_BusError(addr, BUS_ERROR_READ);
1.1.1.5 root 183: return 0;
184: }
185:
1.1.1.6 root 186: static uae_u32 BusErrMem_bget(uaecptr addr)
1.1.1.5 root 187: {
1.1.1.17! root 188: print_illegal_counted("Bus error bget", addr);
1.1.1.5 root 189:
1.1.1.15 root 190: M68000_BusError(addr, BUS_ERROR_READ);
1.1.1.5 root 191: return 0;
192: }
193:
1.1.1.6 root 194: static void BusErrMem_lput(uaecptr addr, uae_u32 l)
1.1.1.5 root 195: {
1.1.1.17! root 196: print_illegal_counted("Bus error lput", addr);
1.1.1.5 root 197:
1.1.1.15 root 198: M68000_BusError(addr, BUS_ERROR_WRITE);
1.1.1.5 root 199: }
200:
1.1.1.6 root 201: static void BusErrMem_wput(uaecptr addr, uae_u32 w)
1.1.1.5 root 202: {
1.1.1.17! root 203: print_illegal_counted("Bus error wput", addr);
1.1.1.5 root 204:
1.1.1.15 root 205: M68000_BusError(addr, BUS_ERROR_WRITE);
1.1.1.5 root 206: }
207:
1.1.1.6 root 208: static void BusErrMem_bput(uaecptr addr, uae_u32 b)
1.1.1.5 root 209: {
1.1.1.17! root 210: print_illegal_counted("Bus error bput", addr);
1.1.1.5 root 211:
1.1.1.15 root 212: M68000_BusError(addr, BUS_ERROR_WRITE);
1.1.1.5 root 213: }
214:
1.1.1.6 root 215: static int BusErrMem_check(uaecptr addr, uae_u32 size)
1.1.1.5 root 216: {
217: if (illegal_mem)
218: write_log ("Bus error check at %08lx\n", (long)addr);
219:
220: return 0;
221: }
222:
1.1.1.6 root 223: static uae_u8 *BusErrMem_xlate (uaecptr addr)
1.1.1.5 root 224: {
225: write_log("Your Atari program just did something terribly stupid:"
226: " BusErrMem_xlate($%x)\n", addr);
227:
228: /*M68000_BusError(addr);*/
229: return STmem_xlate(addr); /* So we don't crash. */
230: }
231:
232:
233: /* **** ST RAM memory **** */
234:
1.1.1.9 root 235: /*static uae_u8 *STmemory;*/
236: #define STmemory STRam
1.1 root 237:
1.1.1.6 root 238: static uae_u32 STmem_lget(uaecptr addr)
1.1 root 239: {
240: addr -= STmem_start & STmem_mask;
241: addr &= STmem_mask;
1.1.1.7 root 242: return do_get_mem_long(STmemory + addr);
1.1 root 243: }
244:
1.1.1.6 root 245: static uae_u32 STmem_wget(uaecptr addr)
1.1 root 246: {
247: addr -= STmem_start & STmem_mask;
248: addr &= STmem_mask;
1.1.1.7 root 249: return do_get_mem_word(STmemory + addr);
1.1 root 250: }
251:
1.1.1.6 root 252: static uae_u32 STmem_bget(uaecptr addr)
1.1 root 253: {
254: addr -= STmem_start & STmem_mask;
255: addr &= STmem_mask;
256: return STmemory[addr];
257: }
258:
1.1.1.6 root 259: static void STmem_lput(uaecptr addr, uae_u32 l)
1.1 root 260: {
261: addr -= STmem_start & STmem_mask;
262: addr &= STmem_mask;
1.1.1.7 root 263: do_put_mem_long(STmemory + addr, l);
1.1 root 264: }
265:
1.1.1.6 root 266: static void STmem_wput(uaecptr addr, uae_u32 w)
1.1 root 267: {
268: addr -= STmem_start & STmem_mask;
269: addr &= STmem_mask;
1.1.1.7 root 270: do_put_mem_word(STmemory + addr, w);
1.1 root 271: }
272:
1.1.1.6 root 273: static void STmem_bput(uaecptr addr, uae_u32 b)
1.1 root 274: {
275: addr -= STmem_start & STmem_mask;
276: addr &= STmem_mask;
277: STmemory[addr] = b;
278: }
279:
1.1.1.6 root 280: static int STmem_check(uaecptr addr, uae_u32 size)
1.1 root 281: {
282: addr -= STmem_start & STmem_mask;
283: addr &= STmem_mask;
1.1.1.5 root 284: return (addr + size) <= STmem_size;
1.1 root 285: }
286:
1.1.1.6 root 287: static uae_u8 *STmem_xlate(uaecptr addr)
1.1 root 288: {
289: addr -= STmem_start & STmem_mask;
290: addr &= STmem_mask;
291: return STmemory + addr;
292: }
293:
294:
1.1.1.5 root 295: /*
296: * **** ST RAM system memory ****
297: * We need a separate mem bank for this region since the first 0x800 bytes on
298: * the ST can only be accessed in supervisor mode. Note that the very first
299: * 8 bytes of the ST memory are also a mirror of the TOS ROM, so they are write
300: * protected!
301: */
1.1.1.6 root 302: static uae_u32 SysMem_lget(uaecptr addr)
1.1.1.5 root 303: {
304: if(addr < 0x800 && !regs.s)
305: {
1.1.1.15 root 306: M68000_BusError(addr, BUS_ERROR_READ);
1.1.1.5 root 307: return 0;
308: }
309:
310: addr -= STmem_start & STmem_mask;
311: addr &= STmem_mask;
1.1.1.7 root 312:
313: return do_get_mem_long(STmemory + addr);
1.1.1.5 root 314: }
315:
1.1.1.6 root 316: static uae_u32 SysMem_wget(uaecptr addr)
1.1.1.5 root 317: {
318: if(addr < 0x800 && !regs.s)
319: {
1.1.1.15 root 320: M68000_BusError(addr, BUS_ERROR_READ);
1.1.1.5 root 321: return 0;
322: }
323:
324: addr -= STmem_start & STmem_mask;
325: addr &= STmem_mask;
1.1.1.7 root 326:
327: return do_get_mem_word(STmemory + addr);
1.1.1.5 root 328: }
329:
1.1.1.6 root 330: static uae_u32 SysMem_bget(uaecptr addr)
1.1.1.5 root 331: {
332: if(addr < 0x800 && !regs.s)
333: {
1.1.1.15 root 334: M68000_BusError(addr, BUS_ERROR_READ);
1.1.1.5 root 335: return 0;
336: }
337:
338: addr -= STmem_start & STmem_mask;
339: addr &= STmem_mask;
340: return STmemory[addr];
341: }
342:
1.1.1.6 root 343: static void SysMem_lput(uaecptr addr, uae_u32 l)
1.1.1.5 root 344: {
345: if(addr < 0x8 || (addr < 0x800 && !regs.s))
346: {
1.1.1.15 root 347: M68000_BusError(addr, BUS_ERROR_WRITE);
1.1.1.5 root 348: return;
349: }
350:
351: addr -= STmem_start & STmem_mask;
352: addr &= STmem_mask;
1.1.1.7 root 353:
354: do_put_mem_long(STmemory + addr, l);
1.1.1.5 root 355: }
356:
1.1.1.6 root 357: static void SysMem_wput(uaecptr addr, uae_u32 w)
1.1.1.5 root 358: {
359: if(addr < 0x8 || (addr < 0x800 && !regs.s))
360: {
1.1.1.15 root 361: M68000_BusError(addr, BUS_ERROR_WRITE);
1.1.1.5 root 362: return;
363: }
364:
365: addr -= STmem_start & STmem_mask;
366: addr &= STmem_mask;
1.1.1.7 root 367:
368: do_put_mem_word(STmemory + addr, w);
1.1.1.5 root 369: }
370:
1.1.1.6 root 371: static void SysMem_bput(uaecptr addr, uae_u32 b)
1.1.1.5 root 372: {
373: if(addr < 0x8 || (addr < 0x800 && !regs.s))
374: {
1.1.1.15 root 375: M68000_BusError(addr, BUS_ERROR_WRITE);
1.1.1.5 root 376: return;
377: }
378:
379: addr -= STmem_start & STmem_mask;
380: addr &= STmem_mask;
381: STmemory[addr] = b;
382: }
383:
384:
385: /*
386: * **** Void memory ****
387: * Between the ST-RAM end and the 4 MB barrier, there is a void memory space:
388: * Reading always returns the same value and writing does nothing at all.
1.1.1.17! root 389: * [NP] : this is not correct, reading does not always return 0, when there's
! 390: * no memory, it will return the latest data that was read on the bus.
! 391: * In many cases, this will return the word that was just read in the 68000's
! 392: * prefetch register to decode the next opcode (tested on a real STF)
1.1.1.5 root 393: */
394:
1.1.1.6 root 395: static uae_u32 VoidMem_lget(uaecptr addr)
1.1.1.5 root 396: {
397: return 0;
398: }
399:
1.1.1.6 root 400: static uae_u32 VoidMem_wget(uaecptr addr)
1.1.1.5 root 401: {
402: return 0;
403: }
404:
1.1.1.6 root 405: static uae_u32 VoidMem_bget(uaecptr addr)
1.1.1.5 root 406: {
407: return 0;
408: }
409:
1.1.1.6 root 410: static void VoidMem_lput(uaecptr addr, uae_u32 l)
1.1.1.5 root 411: {
412: }
413:
1.1.1.6 root 414: static void VoidMem_wput(uaecptr addr, uae_u32 w)
1.1.1.5 root 415: {
416: }
417:
1.1.1.6 root 418: static void VoidMem_bput (uaecptr addr, uae_u32 b)
1.1.1.5 root 419: {
420: }
421:
1.1.1.6 root 422: static int VoidMem_check(uaecptr addr, uae_u32 size)
1.1.1.5 root 423: {
424: if (illegal_mem)
425: write_log ("Void memory check at %08lx\n", (long)addr);
426:
427: return 0;
428: }
429:
1.1.1.6 root 430: static uae_u8 *VoidMem_xlate (uaecptr addr)
1.1.1.5 root 431: {
432: write_log("Your Atari program just did something terribly stupid:"
433: " VoidMem_xlate($%x)\n", addr);
434:
435: return STmem_xlate(addr); /* So we don't crash. */
436: }
437:
438:
439: /* **** TT fast memory (not yet supported) **** */
1.1 root 440:
441: static uae_u8 *TTmemory;
442:
1.1.1.6 root 443: static uae_u32 TTmem_lget(uaecptr addr)
1.1 root 444: {
445: addr -= TTmem_start & TTmem_mask;
446: addr &= TTmem_mask;
1.1.1.7 root 447: return do_get_mem_long(TTmemory + addr);
1.1 root 448: }
449:
1.1.1.6 root 450: static uae_u32 TTmem_wget(uaecptr addr)
1.1 root 451: {
452: addr -= TTmem_start & TTmem_mask;
453: addr &= TTmem_mask;
1.1.1.7 root 454: return do_get_mem_word(TTmemory + addr);
1.1 root 455: }
456:
1.1.1.6 root 457: static uae_u32 TTmem_bget(uaecptr addr)
1.1 root 458: {
459: addr -= TTmem_start & TTmem_mask;
460: addr &= TTmem_mask;
461: return TTmemory[addr];
462: }
463:
1.1.1.6 root 464: static void TTmem_lput(uaecptr addr, uae_u32 l)
1.1 root 465: {
466: addr -= TTmem_start & TTmem_mask;
467: addr &= TTmem_mask;
1.1.1.7 root 468: do_put_mem_long(TTmemory + addr, l);
1.1 root 469: }
470:
1.1.1.6 root 471: static void TTmem_wput(uaecptr addr, uae_u32 w)
1.1 root 472: {
473: addr -= TTmem_start & TTmem_mask;
474: addr &= TTmem_mask;
1.1.1.7 root 475: do_put_mem_word(TTmemory + addr, w);
1.1 root 476: }
477:
1.1.1.6 root 478: static void TTmem_bput(uaecptr addr, uae_u32 b)
1.1 root 479: {
480: addr -= TTmem_start & TTmem_mask;
481: addr &= TTmem_mask;
482: TTmemory[addr] = b;
483: }
484:
1.1.1.6 root 485: static int TTmem_check(uaecptr addr, uae_u32 size)
1.1 root 486: {
487: addr -= TTmem_start & TTmem_mask;
488: addr &= TTmem_mask;
1.1.1.5 root 489: return (addr + size) <= TTmem_size;
1.1 root 490: }
491:
1.1.1.6 root 492: static uae_u8 *TTmem_xlate(uaecptr addr)
1.1 root 493: {
494: addr -= TTmem_start & TTmem_mask;
495: addr &= TTmem_mask;
496: return TTmemory + addr;
497: }
498:
1.1.1.5 root 499:
500: /* **** ROM memory **** */
1.1 root 501:
1.1.1.10 root 502: uae_u8 *ROMmemory;
1.1 root 503:
1.1.1.6 root 504: static uae_u32 ROMmem_lget(uaecptr addr)
1.1 root 505: {
506: addr -= ROMmem_start & ROMmem_mask;
507: addr &= ROMmem_mask;
1.1.1.7 root 508: return do_get_mem_long(ROMmemory + addr);
1.1 root 509: }
510:
1.1.1.6 root 511: static uae_u32 ROMmem_wget(uaecptr addr)
1.1 root 512: {
513: addr -= ROMmem_start & ROMmem_mask;
514: addr &= ROMmem_mask;
1.1.1.7 root 515: return do_get_mem_word(ROMmemory + addr);
1.1 root 516: }
517:
1.1.1.6 root 518: static uae_u32 ROMmem_bget(uaecptr addr)
1.1 root 519: {
520: addr -= ROMmem_start & ROMmem_mask;
521: addr &= ROMmem_mask;
522: return ROMmemory[addr];
523: }
524:
1.1.1.6 root 525: static void ROMmem_lput(uaecptr addr, uae_u32 b)
1.1 root 526: {
1.1.1.17! root 527: print_illegal_counted("Illegal ROMmem lput", (long)addr);
1.1.1.5 root 528:
1.1.1.15 root 529: M68000_BusError(addr, BUS_ERROR_WRITE);
1.1 root 530: }
531:
1.1.1.6 root 532: static void ROMmem_wput(uaecptr addr, uae_u32 b)
1.1 root 533: {
1.1.1.17! root 534: print_illegal_counted("Illegal ROMmem wput", (long)addr);
1.1.1.5 root 535:
1.1.1.15 root 536: M68000_BusError(addr, BUS_ERROR_WRITE);
1.1 root 537: }
538:
1.1.1.6 root 539: static void ROMmem_bput(uaecptr addr, uae_u32 b)
1.1 root 540: {
1.1.1.17! root 541: print_illegal_counted("Illegal ROMmem bput", (long)addr);
1.1.1.5 root 542:
1.1.1.15 root 543: M68000_BusError(addr, BUS_ERROR_WRITE);
1.1 root 544: }
545:
1.1.1.6 root 546: static int ROMmem_check(uaecptr addr, uae_u32 size)
1.1 root 547: {
548: addr -= ROMmem_start & ROMmem_mask;
549: addr &= ROMmem_mask;
550: return (addr + size) <= ROMmem_size;
551: }
552:
1.1.1.6 root 553: static uae_u8 *ROMmem_xlate(uaecptr addr)
1.1 root 554: {
555: addr -= ROMmem_start & ROMmem_mask;
556: addr &= ROMmem_mask;
557: return ROMmemory + addr;
558: }
559:
560:
1.1.1.10 root 561: /* IDE controller IO memory */
562: /* see also ide.c */
563:
564: static uae_u8 *IdeMemory;
565:
566: static int IdeMem_check(uaecptr addr, uae_u32 size)
567: {
568: addr -= IdeMem_start;
569: addr &= IdeMem_mask;
570: return (addr + size) <= IdeMem_size;
571: }
572:
573: static uae_u8 *IdeMem_xlate(uaecptr addr)
574: {
575: addr -= IdeMem_start;
576: addr &= IdeMem_mask;
577: return IdeMemory + addr;
578: }
579:
580:
1.1 root 581: /* Hardware IO memory */
1.1.1.10 root 582: /* see also ioMem.c */
1.1 root 583:
1.1.1.10 root 584: uae_u8 *IOmemory;
1.1 root 585:
1.1.1.6 root 586: static int IOmem_check(uaecptr addr, uae_u32 size)
1.1 root 587: {
1.1.1.5 root 588: addr -= IOmem_start;
1.1 root 589: addr &= IOmem_mask;
590: return (addr + size) <= IOmem_size;
591: }
592:
1.1.1.6 root 593: static uae_u8 *IOmem_xlate(uaecptr addr)
1.1 root 594: {
1.1.1.5 root 595: addr -= IOmem_start;
1.1 root 596: addr &= IOmem_mask;
597: return IOmemory + addr;
598: }
599:
600:
601:
1.1.1.5 root 602: /* **** Address banks **** */
1.1 root 603:
1.1.1.6 root 604: static addrbank dummy_bank =
605: {
1.1 root 606: dummy_lget, dummy_wget, dummy_bget,
607: dummy_lput, dummy_wput, dummy_bput,
1.1.1.5 root 608: dummy_xlate, dummy_check
609: };
610:
1.1.1.6 root 611: static addrbank BusErrMem_bank =
612: {
1.1.1.5 root 613: BusErrMem_lget, BusErrMem_wget, BusErrMem_bget,
614: BusErrMem_lput, BusErrMem_wput, BusErrMem_bput,
615: BusErrMem_xlate, BusErrMem_check
1.1 root 616: };
617:
1.1.1.6 root 618: static addrbank STmem_bank =
619: {
1.1 root 620: STmem_lget, STmem_wget, STmem_bget,
621: STmem_lput, STmem_wput, STmem_bput,
622: STmem_xlate, STmem_check
623: };
624:
1.1.1.6 root 625: static addrbank SysMem_bank =
626: {
1.1.1.5 root 627: SysMem_lget, SysMem_wget, SysMem_bget,
628: SysMem_lput, SysMem_wput, SysMem_bput,
629: STmem_xlate, STmem_check
630: };
631:
1.1.1.6 root 632: static addrbank VoidMem_bank =
633: {
1.1.1.5 root 634: VoidMem_lget, VoidMem_wget, VoidMem_bget,
635: VoidMem_lput, VoidMem_wput, VoidMem_bput,
636: VoidMem_xlate, VoidMem_check
637: };
638:
1.1.1.6 root 639: static addrbank TTmem_bank =
640: {
1.1 root 641: TTmem_lget, TTmem_wget, TTmem_bget,
642: TTmem_lput, TTmem_wput, TTmem_bput,
643: TTmem_xlate, TTmem_check
644: };
645:
1.1.1.6 root 646: static addrbank ROMmem_bank =
647: {
1.1 root 648: ROMmem_lget, ROMmem_wget, ROMmem_bget,
649: ROMmem_lput, ROMmem_wput, ROMmem_bput,
650: ROMmem_xlate, ROMmem_check
651: };
652:
1.1.1.10 root 653: static addrbank IdeMem_bank =
654: {
655: Ide_Mem_lget, Ide_Mem_wget, Ide_Mem_bget,
656: Ide_Mem_lput, Ide_Mem_wput, Ide_Mem_bput,
657: IdeMem_xlate, IdeMem_check
658: };
659:
1.1.1.6 root 660: static addrbank IOmem_bank =
661: {
1.1.1.7 root 662: IoMem_lget, IoMem_wget, IoMem_bget,
663: IoMem_lput, IoMem_wput, IoMem_bput,
1.1 root 664: IOmem_xlate, IOmem_check
665: };
666:
667:
1.1.1.5 root 668:
1.1 root 669: static void init_mem_banks (void)
670: {
671: int i;
672: for (i = 0; i < 65536; i++)
673: put_mem_bank (i<<16, &dummy_bank);
674: }
675:
676:
677: /*
1.1.1.5 root 678: * Initialize the memory banks
679: */
1.1.1.8 root 680: void memory_init(uae_u32 nNewSTMemSize, uae_u32 nNewTTMemSize, uae_u32 nNewRomMemStart)
1.1.1.5 root 681: {
1.1.1.8 root 682: STmem_size = (nNewSTMemSize + 65535) & 0xFFFF0000;
683: TTmem_size = (nNewTTMemSize + 65535) & 0xFFFF0000;
1.1.1.5 root 684:
685: /*write_log("memory_init: STmem_size=$%x, TTmem_size=$%x, ROM-Start=$%x,\n",
1.1.1.8 root 686: STmem_size, TTmem_size, nNewRomMemStart);*/
1.1.1.5 root 687:
1.1.1.10 root 688: #if ENABLE_SMALL_MEM
1.1.1.9 root 689:
1.1.1.10 root 690: /* Allocate memory for ROM areas and IO memory space (0xE00000 - 0xFFFFFF) */
691: ROMmemory = malloc(2*1024*1024);
692: if (!ROMmemory) {
693: fprintf(stderr, "Out of memory (ROM/IO mem)!\n");
1.1.1.11 root 694: SDL_Quit();
1.1.1.10 root 695: exit(1);
696: }
697: IdeMemory = ROMmemory + 0x100000;
698: IOmemory = ROMmemory + 0x1f0000;
699:
700: /* Allocate memory for normal ST RAM */
701: STmemory = malloc(STmem_size);
702: while (!STmemory && STmem_size > 512*1024) {
1.1.1.5 root 703: STmem_size >>= 1;
704: STmemory = (uae_u8 *)malloc (STmem_size);
1.1 root 705: if (STmemory)
1.1.1.10 root 706: write_log ("Reducing STmem size to %dkb\n", STmem_size >> 10);
1.1 root 707: }
1.1.1.10 root 708: if (!STmemory) {
1.1 root 709: write_log ("virtual memory exhausted (STmemory)!\n");
1.1.1.11 root 710: SDL_Quit();
1.1.1.10 root 711: exit(1);
1.1 root 712: }
1.1.1.10 root 713:
714: #else
715:
716: /* STmemory points to the 16 MiB STRam array, we just have to set up
717: * the remaining pointers here: */
718: ROMmemory = STRam + ROMmem_start;
719: IdeMemory = STRam + IdeMem_start;
720: IOmemory = STRam + IOmem_start;
721:
722: #endif
1.1 root 723:
1.1.1.5 root 724: init_mem_banks();
1.1 root 725:
1.1.1.8 root 726: /* Map the ST system RAM: */
1.1.1.5 root 727: map_banks(&SysMem_bank, 0x00, 1);
1.1.1.8 root 728: /* Between STRamEnd and 4MB barrier, there is void space: */
729: map_banks(&VoidMem_bank, 0x08, 0x38);
730: /* Space between 4MB barrier and TOS ROM causes a bus error: */
731: map_banks(&BusErrMem_bank, 0x400000 >> 16, 0xA0);
732: /* Now map main ST RAM, overwriting the void and bus error regions if necessary: */
1.1.1.5 root 733: map_banks(&STmem_bank, 0x01, (STmem_size >> 16) - 1);
734:
735: /* TT memory isn't really supported yet */
736: if (TTmem_size > 0)
737: TTmemory = (uae_u8 *)malloc (TTmem_size);
1.1 root 738: if (TTmemory != 0)
1.1.1.5 root 739: map_banks (&TTmem_bank, TTmem_start >> 16, TTmem_size >> 16);
740: else
741: TTmem_size = 0;
742: TTmem_mask = TTmem_size - 1;
743:
744: /* ROM memory: */
745: /* Depending on which ROM version we are using, the other ROM region is illegal! */
1.1.1.8 root 746: if(nNewRomMemStart == 0xFC0000)
1.1.1.5 root 747: {
748: map_banks(&ROMmem_bank, 0xFC0000 >> 16, 0x3);
749: map_banks(&BusErrMem_bank, 0xE00000 >> 16, 0x10);
750: }
1.1.1.8 root 751: else if(nNewRomMemStart == 0xE00000)
1.1.1.5 root 752: {
753: map_banks(&ROMmem_bank, 0xE00000 >> 16, 0x10);
754: map_banks(&BusErrMem_bank, 0xFC0000 >> 16, 0x3);
755: }
1.1 root 756: else
1.1.1.5 root 757: {
758: write_log("Illegal ROM memory start!\n");
759: }
1.1 root 760:
1.1.1.5 root 761: /* Cartridge memory: */
762: map_banks(&ROMmem_bank, 0xFA0000 >> 16, 0x2);
1.1 root 763:
1.1.1.5 root 764: /* IO memory: */
765: map_banks(&IOmem_bank, IOmem_start>>16, 0x1);
1.1 root 766:
1.1.1.10 root 767: /* IDE controller memory region: */
768: map_banks(&IdeMem_bank, IdeMem_start >> 16, 0x1); /* IDE controller on the Falcon */
769:
1.1.1.5 root 770: /* Illegal memory regions cause a bus error on the ST: */
1.1.1.10 root 771: map_banks(&BusErrMem_bank, 0xF10000 >> 16, 0x9);
1.1.1.17! root 772:
! 773: illegal_count = 50;
1.1 root 774: }
775:
1.1.1.5 root 776:
777: /*
778: * Uninitialize the memory banks.
779: */
780: void memory_uninit (void)
781: {
782: /* Here, we free allocated memory from memory_init */
1.1.1.10 root 783: if (TTmem_size > 0) {
784: free(TTmemory);
785: TTmemory = NULL;
786: }
787:
788: #if ENABLE_SMALL_MEM
789:
790: if (STmemory) {
791: free(STmemory);
792: STmemory = NULL;
793: }
794:
795: if (ROMmemory) {
796: free(ROMmemory);
797: ROMmemory = NULL;
1.1.1.5 root 798: }
1.1.1.10 root 799:
800: #endif /* ENABLE_SMALL_MEM */
1.1.1.5 root 801: }
802:
803:
1.1 root 804: void map_banks (addrbank *bank, int start, int size)
805: {
806: int bnr;
807: unsigned long int hioffs = 0, endhioffs = 0x100;
808:
809: if (start >= 0x100) {
810: for (bnr = start; bnr < start + size; bnr++)
811: put_mem_bank (bnr << 16, bank);
812: return;
813: }
814: /* Some ROMs apparently require a 24 bit address space... */
1.1.1.10 root 815: if (currprefs.address_space_24)
1.1 root 816: endhioffs = 0x10000;
817: for (hioffs = 0; hioffs < endhioffs; hioffs += 0x100)
818: for (bnr = start; bnr < start+size; bnr++)
819: put_mem_bank ((bnr + hioffs) << 16, bank);
820: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.