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