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