|
|
1.1 ! root 1: /* ! 2: * UAE - The Un*x Amiga Emulator - CPU core ! 3: * ! 4: * Memory management ! 5: * ! 6: * (c) 1995 Bernd Schmidt ! 7: * ! 8: * Adaptation to Hatari by Thomas Huth ! 9: * Adaptation to previous by Gilles Fetis ! 10: * ! 11: * This file is distributed under the GNU Public License, version 2 or at ! 12: * your option any later version. Read the file gpl.txt for details. ! 13: */ ! 14: const char Memory_fileid[] = "Previous memory.c : " __DATE__ " " __TIME__; ! 15: ! 16: #include "config.h" ! 17: #include "sysdeps.h" ! 18: #include "hatari-glue.h" ! 19: #include "maccess.h" ! 20: #include "memory.h" ! 21: ! 22: #include "main.h" ! 23: #include "ioMem.h" ! 24: #include "reset.h" ! 25: #include "nextMemory.h" ! 26: #include "m68000.h" ! 27: ! 28: #include "newcpu.h" ! 29: ! 30: ! 31: /* Set illegal_mem to 1 for debug output: */ ! 32: #define illegal_mem 1 ! 33: ! 34: /* ! 35: approximative next memory map (source netbsd/next68k file cpu.h) ! 36: ! 37: EPROM 128k (>cube 040) ! 38: 0x00000000-0x0001FFFF ! 39: mirrored at ! 40: 0x01000000-0x0101FFFF ! 41: ! 42: RAM (16x4=64Mb max) ! 43: 0x04000000-0x07FFFFFF (0x047FFFFF for 8Mb) ! 44: ! 45: device ! 46: 0x02000000-0x0201BFFF ! 47: mirrored at ! 48: 0x02100000-0x0211BFFF ! 49: ! 50: SCREEN ! 51: 0x0B000000-0x0B03A7FF ! 52: ! 53: */ ! 54: #define NEXT_EPROM_START 0x00000000 ! 55: #define NEXT_EPROM2_START 0x01000000 ! 56: #define ROMmem_mask 0x0001FFFF ! 57: #define ROMmem_size 0x00020000 ! 58: #define NEXT_EPROM_SIZE 0x00020000 ! 59: ! 60: // ram is flat? ! 61: #define NEXT_RAM_START 0x04000000 ! 62: #define NEXT_RAM_SPACE 0x40000000 ! 63: // #define NEXT_RAM_SIZE 0x007FE000 ! 64: #define NEXT_RAM_SIZE 0x07FFE000 ! 65: ! 66: uae_u32 NEXTmem_size; // unused ! 67: #define NEXTmem_mask 0x00FFFFFF ! 68: // for a mono screen ! 69: #define NEXT_SCREEN 0x0B000000 ! 70: #define NEXT_SCREEN_SIZE 0x00040000 ! 71: #define NEXTvideo_size NEXT_SCREEN_SIZE ! 72: #define NEXTvideo_mask 0x0003FFFF ! 73: uae_u8 NEXTVideo[256*1024]; ! 74: ! 75: ! 76: ! 77: #define IOmem_mask 0x0001FFFF ! 78: #define IOmem_size 0x0001C000 ! 79: #define NEXT_IO_START 0x02000000 ! 80: #define NEXT_IO2_START 0x02100000 ! 81: #define NEXT_IO_SIZE 0x00020000 ! 82: ! 83: #define NEXT_BMAP_START 0x020C0000 ! 84: #define NEXT_BMAP_SIZE 0x10000 ! 85: #define NEXTbmap_size NEXT_BMAP_SIZE ! 86: #define NEXTbmap_mask 0x0000FFFF ! 87: uae_u8 NEXTbmap[NEXT_BMAP_SIZE]; ! 88: ! 89: #define NEXT_X06_START 0x06000000 ! 90: #define NEXT_X06_SIZE 0x10000 ! 91: #define NEXTx06_size NEXT_X06_SIZE ! 92: #define NEXTx06_mask 0x0000FFFF ! 93: uae_u8 NEXTx06[NEXT_X06_SIZE]; ! 94: ! 95: #ifdef SAVE_MEMORY_BANKS ! 96: addrbank *mem_banks[65536]; ! 97: #else ! 98: addrbank mem_banks[65536]; ! 99: #endif ! 100: ! 101: #ifdef NO_INLINE_MEMORY_ACCESS ! 102: __inline__ uae_u32 longget (uaecptr addr) ! 103: { ! 104: return call_mem_get_func (get_mem_bank (addr).lget, addr); ! 105: } ! 106: __inline__ uae_u32 wordget (uaecptr addr) ! 107: { ! 108: return call_mem_get_func (get_mem_bank (addr).wget, addr); ! 109: } ! 110: __inline__ uae_u32 byteget (uaecptr addr) ! 111: { ! 112: return call_mem_get_func (get_mem_bank (addr).bget, addr); ! 113: } ! 114: __inline__ void longput (uaecptr addr, uae_u32 l) ! 115: { ! 116: call_mem_put_func (get_mem_bank (addr).lput, addr, l); ! 117: } ! 118: __inline__ void wordput (uaecptr addr, uae_u32 w) ! 119: { ! 120: call_mem_put_func (get_mem_bank (addr).wput, addr, w); ! 121: } ! 122: __inline__ void byteput (uaecptr addr, uae_u32 b) ! 123: { ! 124: call_mem_put_func (get_mem_bank (addr).bput, addr, b); ! 125: } ! 126: #endif ! 127: ! 128: ! 129: /* Some prototypes: */ ! 130: extern void SDL_Quit(void); ! 131: static int NEXTmem_check (uaecptr addr, uae_u32 size) REGPARAM; ! 132: static uae_u8 *NEXTmem_xlate (uaecptr addr) REGPARAM; ! 133: ! 134: ! 135: /* A dummy bank that only contains zeros */ ! 136: ! 137: static uae_u32 dummy_lget(uaecptr addr) ! 138: { ! 139: if (illegal_mem) ! 140: write_log ("Illegal lget at %08lx PC=%08x\n", (long)addr,m68k_getpc()); ! 141: // DebugUI(); ! 142: ! 143: return 0xFFFFFFFF; ! 144: } ! 145: ! 146: static uae_u32 dummy_wget(uaecptr addr) ! 147: { ! 148: if (illegal_mem) ! 149: write_log ("Illegal wget at %08lx PC=%08x\n", (long)addr,m68k_getpc()); ! 150: // DebugUI(); ! 151: ! 152: return 0xFFFF; ! 153: } ! 154: ! 155: static uae_u32 dummy_bget(uaecptr addr) ! 156: { ! 157: if (illegal_mem) ! 158: write_log ("Illegal bget at %08lx PC=%08x\n", (long)addr,m68k_getpc()); ! 159: // DebugUI(); ! 160: ! 161: return 0xFF; ! 162: } ! 163: ! 164: static void dummy_lput(uaecptr addr, uae_u32 l) ! 165: { ! 166: if (illegal_mem) ! 167: write_log ("Illegal lput %08x at %08lx PC=%08x\n",l, (long)addr,m68k_getpc()); ! 168: // DebugUI(); ! 169: } ! 170: ! 171: static void dummy_wput(uaecptr addr, uae_u32 w) ! 172: { ! 173: if (illegal_mem) ! 174: write_log ("Illegal wput %04x at %08lx PC=%08x\n",w, (long)addr,m68k_getpc()); ! 175: // DebugUI(); ! 176: } ! 177: ! 178: static void dummy_bput(uaecptr addr, uae_u32 b) ! 179: { ! 180: if (illegal_mem) ! 181: write_log ("Illegal bput %02x at %08lx PC=%08x\n",b, (long)addr,m68k_getpc()); ! 182: // DebugUI(); ! 183: } ! 184: ! 185: static int dummy_check(uaecptr addr, uae_u32 size) ! 186: { ! 187: if (illegal_mem) ! 188: write_log ("Illegal check at %08lx PC=%08x\n", (long)addr,m68k_getpc()); ! 189: ! 190: return 0; ! 191: } ! 192: ! 193: static uae_u8 *dummy_xlate(uaecptr addr) ! 194: { ! 195: static uae_u8 dummy[16]; ! 196: write_log("Your Next program just did something terribly stupid:" ! 197: " dummy_xlate($%x) PC=%08x\n", addr,m68k_getpc()); ! 198: // Reset_Warm(); ! 199: DebugUI(); ! 200: return dummy; ! 201: // return NEXTmem_xlate(addr); /* So we don't crash. */ ! 202: } ! 203: ! 204: ! 205: /* **** This memory bank only generates bus errors **** */ ! 206: ! 207: static uae_u32 BusErrMem_lget(uaecptr addr) ! 208: { ! 209: if (illegal_mem) ! 210: write_log ("Bus error lget at %08lx pc=%08x\n", (long)addr,m68k_getpc()); ! 211: ! 212: M68000_BusError(addr, 1); ! 213: return 0; ! 214: } ! 215: ! 216: static uae_u32 BusErrMem_wget(uaecptr addr) ! 217: { ! 218: if (illegal_mem) ! 219: write_log ("Bus error wget at %08lx pc=%08x\n", (long)addr,m68k_getpc()); ! 220: ! 221: M68000_BusError(addr, 1); ! 222: return 0; ! 223: } ! 224: ! 225: static uae_u32 BusErrMem_bget(uaecptr addr) ! 226: { ! 227: if (illegal_mem) ! 228: write_log ("Bus error bget at %08lx pc=%08x\n", (long)addr,m68k_getpc()); ! 229: ! 230: M68000_BusError(addr, 1); ! 231: return 0; ! 232: } ! 233: ! 234: static void BusErrMem_lput(uaecptr addr, uae_u32 l) ! 235: { ! 236: if (illegal_mem) ! 237: write_log ("Bus error lput at %08lx pc=%08x\n", (long)addr,m68k_getpc()); ! 238: ! 239: M68000_BusError(addr, 0); ! 240: } ! 241: ! 242: static void BusErrMem_wput(uaecptr addr, uae_u32 w) ! 243: { ! 244: if (illegal_mem) ! 245: write_log ("Bus error wput at %08lx pc=%08x\n", (long)addr,m68k_getpc()); ! 246: ! 247: M68000_BusError(addr, 0); ! 248: } ! 249: ! 250: static void BusErrMem_bput(uaecptr addr, uae_u32 b) ! 251: { ! 252: if (illegal_mem) ! 253: write_log ("Bus error bput at %08lx pc=%08x\n", (long)addr,m68k_getpc()); ! 254: ! 255: M68000_BusError(addr, 0); ! 256: } ! 257: ! 258: static int BusErrMem_check(uaecptr addr, uae_u32 size) ! 259: { ! 260: if (illegal_mem) ! 261: write_log ("Bus error check at %08lx pc=%08x\n", (long)addr,m68k_getpc()); ! 262: ! 263: return 0; ! 264: } ! 265: ! 266: static uae_u8 *BusErrMem_xlate (uaecptr addr) ! 267: { ! 268: write_log("Your Next program just did something terribly stupid:" ! 269: " BusErrMem_xlate($%x)\n", addr); ! 270: ! 271: // M68000_BusError(addr);*/ ! 272: return NEXTmem_xlate(addr); /* So we don't crash. */ ! 273: } ! 274: ! 275: ! 276: /* **** NEXT RAM memory **** */ ! 277: ! 278: static uae_u32 NEXTmem_lget(uaecptr addr) ! 279: { ! 280: addr &= NEXTmem_mask; ! 281: return do_get_mem_long(NEXTRam + addr); ! 282: } ! 283: ! 284: static uae_u32 NEXTmem_wget(uaecptr addr) ! 285: { ! 286: addr &= NEXTmem_mask; ! 287: return do_get_mem_word(NEXTRam + addr); ! 288: } ! 289: ! 290: static uae_u32 NEXTmem_bget(uaecptr addr) ! 291: { ! 292: addr &= NEXTmem_mask; ! 293: return NEXTRam[addr]; ! 294: } ! 295: ! 296: static void NEXTmem_lput(uaecptr addr, uae_u32 l) ! 297: { ! 298: addr &= NEXTmem_mask; ! 299: do_put_mem_long(NEXTRam + addr, l); ! 300: } ! 301: ! 302: static void NEXTmem_wput(uaecptr addr, uae_u32 w) ! 303: { ! 304: addr &= NEXTmem_mask; ! 305: do_put_mem_word(NEXTRam + addr, w); ! 306: } ! 307: ! 308: static void NEXTmem_bput(uaecptr addr, uae_u32 b) ! 309: { ! 310: addr &= NEXTmem_mask; ! 311: NEXTRam[addr] = b; ! 312: } ! 313: ! 314: static int NEXTmem_check(uaecptr addr, uae_u32 size) ! 315: { ! 316: addr &= NEXTmem_mask; ! 317: return (addr + size) <= 0x003FFFFF; ! 318: } ! 319: ! 320: static uae_u8 *NEXTmem_xlate(uaecptr addr) ! 321: { ! 322: addr &= NEXTmem_mask; ! 323: return NEXTRam + addr; ! 324: } ! 325: ! 326: /* bank2 */ ! 327: ! 328: static uae_u32 NEXTmem2_lget(uaecptr addr) ! 329: { ! 330: addr &= NEXTmem_mask; ! 331: return do_get_mem_long(NEXTRam + 0x00400000 + addr); ! 332: } ! 333: ! 334: static uae_u32 NEXTmem2_wget(uaecptr addr) ! 335: { ! 336: addr &= NEXTmem_mask; ! 337: return do_get_mem_word(NEXTRam + 0x00400000 + addr); ! 338: } ! 339: ! 340: static uae_u32 NEXTmem2_bget(uaecptr addr) ! 341: { ! 342: addr &= NEXTmem_mask; ! 343: return NEXTRam[addr+0x00400000]; ! 344: } ! 345: ! 346: static void NEXTmem2_lput(uaecptr addr, uae_u32 l) ! 347: { ! 348: addr &= NEXTmem_mask; ! 349: do_put_mem_long(NEXTRam + addr + 0x00400000, l); ! 350: } ! 351: ! 352: static void NEXTmem2_wput(uaecptr addr, uae_u32 w) ! 353: { ! 354: addr &= NEXTmem_mask; ! 355: do_put_mem_word(NEXTRam + addr + 0x00400000, w); ! 356: } ! 357: ! 358: static void NEXTmem2_bput(uaecptr addr, uae_u32 b) ! 359: { ! 360: addr &= NEXTmem_mask; ! 361: NEXTRam[addr+0x00400000] = b; ! 362: } ! 363: ! 364: static int NEXTmem2_check(uaecptr addr, uae_u32 size) ! 365: { ! 366: addr &= NEXTmem_mask; ! 367: return (addr + size) <= 0x003FFFFF; ! 368: } ! 369: ! 370: static uae_u8 *NEXTmem2_xlate(uaecptr addr) ! 371: { ! 372: addr &= NEXTmem_mask; ! 373: return NEXTRam + addr + 0x00400000; ! 374: } ! 375: ! 376: ! 377: /* **** NEXT VRAM memory **** */ ! 378: ! 379: static uae_u32 NEXTvideo_lget(uaecptr addr) ! 380: { ! 381: addr &= NEXTvideo_mask; ! 382: return do_get_mem_long(NEXTVideo + addr); ! 383: } ! 384: ! 385: static uae_u32 NEXTvideo_wget(uaecptr addr) ! 386: { ! 387: addr &= NEXTvideo_mask; ! 388: return do_get_mem_word(NEXTVideo + addr); ! 389: } ! 390: ! 391: static uae_u32 NEXTvideo_bget(uaecptr addr) ! 392: { ! 393: addr &= NEXTvideo_mask; ! 394: return NEXTVideo[addr]; ! 395: } ! 396: ! 397: static void NEXTvideo_lput(uaecptr addr, uae_u32 l) ! 398: { ! 399: addr &= NEXTvideo_mask; ! 400: do_put_mem_long(NEXTVideo + addr, l); ! 401: } ! 402: ! 403: static void NEXTvideo_wput(uaecptr addr, uae_u32 w) ! 404: { ! 405: addr &= NEXTvideo_mask; ! 406: do_put_mem_word(NEXTVideo + addr, w); ! 407: } ! 408: ! 409: static void NEXTvideo_bput(uaecptr addr, uae_u32 b) ! 410: { ! 411: addr &= NEXTvideo_mask; ! 412: NEXTVideo[addr] = b; ! 413: } ! 414: ! 415: static int NEXTvideo_check(uaecptr addr, uae_u32 size) ! 416: { ! 417: addr &= NEXTvideo_mask; ! 418: return (addr + size) <= NEXTvideo_size; ! 419: } ! 420: ! 421: static uae_u8 *NEXTvideo_xlate(uaecptr addr) ! 422: { ! 423: addr &= NEXTvideo_mask; ! 424: return (uae_u8*)NEXTVideo + addr; ! 425: } ! 426: ! 427: /* **** NEXT BMAP memory **** */ ! 428: ! 429: static uae_u32 NEXTbmap_lget(uaecptr addr) ! 430: { ! 431: write_log ("bmap lget at %08lx PC=%08x\n", (long)addr,m68k_getpc()); ! 432: addr &= NEXTbmap_mask; ! 433: return do_get_mem_long(NEXTbmap + addr); ! 434: } ! 435: ! 436: static uae_u32 NEXTbmap_wget(uaecptr addr) ! 437: { ! 438: write_log ("bmap wget at %08lx PC=%08x\n", (long)addr,m68k_getpc()); ! 439: addr &= NEXTbmap_mask; ! 440: return do_get_mem_word(NEXTbmap + addr); ! 441: } ! 442: ! 443: static uae_u32 NEXTbmap_bget(uaecptr addr) ! 444: { ! 445: write_log ("bmap bget at %08lx PC=%08x\n", (long)addr,m68k_getpc()); ! 446: addr &= NEXTbmap_mask; ! 447: return NEXTbmap[addr]; ! 448: } ! 449: ! 450: static void NEXTbmap_lput(uaecptr addr, uae_u32 l) ! 451: { ! 452: write_log ("bmap lput at %08lx val=%x PC=%08x\n", (long)addr,l,m68k_getpc()); ! 453: addr &= NEXTbmap_mask; ! 454: do_put_mem_long(NEXTbmap + addr, l); ! 455: } ! 456: ! 457: static void NEXTbmap_wput(uaecptr addr, uae_u32 w) ! 458: { ! 459: write_log ("bmap wput at %08lx val=%x PC=%08x\n", (long)addr,w,m68k_getpc()); ! 460: addr &= NEXTbmap_mask; ! 461: do_put_mem_word(NEXTbmap + addr, w); ! 462: } ! 463: ! 464: static void NEXTbmap_bput(uaecptr addr, uae_u32 b) ! 465: { ! 466: write_log ("bmap bput at %08lx val=%x PC=%08x\n", (long)addr,b,m68k_getpc()); ! 467: addr &= NEXTbmap_mask; ! 468: NEXTbmap[addr] = b; ! 469: } ! 470: ! 471: static int NEXTbmap_check(uaecptr addr, uae_u32 size) ! 472: { ! 473: addr &= NEXTbmap_mask; ! 474: return (addr + size) <= NEXTbmap_size; ! 475: } ! 476: ! 477: static uae_u8 *NEXTbmap_xlate(uaecptr addr) ! 478: { ! 479: addr &= NEXTbmap_mask; ! 480: return (uae_u8*)NEXTbmap + addr; ! 481: } ! 482: ! 483: /* **** NEXT x06 memory **** */ ! 484: ! 485: static uae_u32 NEXTx06_lget(uaecptr addr) ! 486: { ! 487: write_log ("x06 lget at %08lx PC=%08x\n", (long)addr,m68k_getpc()); ! 488: addr &= NEXTx06_mask; ! 489: // return do_get_mem_long(NEXTx06 + addr); ! 490: return 0xFFFFFFFF; ! 491: } ! 492: ! 493: static uae_u32 NEXTx06_wget(uaecptr addr) ! 494: { ! 495: write_log ("x06 wget at %08lx PC=%08x\n", (long)addr,m68k_getpc()); ! 496: addr &= NEXTx06_mask; ! 497: // return do_get_mem_word(NEXTx06 + addr); ! 498: return 0xFFFF; ! 499: } ! 500: ! 501: static uae_u32 NEXTx06_bget(uaecptr addr) ! 502: { ! 503: write_log ("x06 bget at %08lx PC=%08x\n", (long)addr,m68k_getpc()); ! 504: addr &= NEXTx06_mask; ! 505: // return NEXTx06[addr]; ! 506: return 0xFF; ! 507: } ! 508: ! 509: static void NEXTx06_lput(uaecptr addr, uae_u32 l) ! 510: { ! 511: write_log ("x06 lput at %08lx val=%x PC=%08x\n", (long)addr,l,m68k_getpc()); ! 512: addr &= NEXTx06_mask; ! 513: do_put_mem_long(NEXTx06 + addr, l); ! 514: } ! 515: ! 516: static void NEXTx06_wput(uaecptr addr, uae_u32 w) ! 517: { ! 518: write_log ("x06 wput at %08lx val=%x PC=%08x\n", (long)addr,w,m68k_getpc()); ! 519: addr &= NEXTx06_mask; ! 520: do_put_mem_word(NEXTx06 + addr, w); ! 521: } ! 522: ! 523: static void NEXTx06_bput(uaecptr addr, uae_u32 b) ! 524: { ! 525: write_log ("x06 bput at %08lx val=%x PC=%08x\n", (long)addr,b,m68k_getpc()); ! 526: addr &= NEXTx06_mask; ! 527: NEXTx06[addr] = b; ! 528: } ! 529: ! 530: static int NEXTx06_check(uaecptr addr, uae_u32 size) ! 531: { ! 532: addr &= NEXTx06_mask; ! 533: return (addr + size) <= NEXTx06_size; ! 534: } ! 535: ! 536: static uae_u8 *NEXTx06_xlate(uaecptr addr) ! 537: { ! 538: addr &= NEXTx06_mask; ! 539: return (uae_u8*)NEXTx06 + addr; ! 540: } ! 541: ! 542: ! 543: /* ! 544: * **** Void memory **** ! 545: * lots of free space in next's full 32bits memory map ! 546: * Reading always returns the same value and writing does nothing at all. ! 547: */ ! 548: ! 549: static uae_u32 VoidMem_lget(uaecptr addr) ! 550: { ! 551: return 0; ! 552: } ! 553: ! 554: static uae_u32 VoidMem_wget(uaecptr addr) ! 555: { ! 556: return 0; ! 557: } ! 558: ! 559: static uae_u32 VoidMem_bget(uaecptr addr) ! 560: { ! 561: return 0; ! 562: } ! 563: ! 564: static void VoidMem_lput(uaecptr addr, uae_u32 l) ! 565: { ! 566: } ! 567: ! 568: static void VoidMem_wput(uaecptr addr, uae_u32 w) ! 569: { ! 570: } ! 571: ! 572: static void VoidMem_bput (uaecptr addr, uae_u32 b) ! 573: { ! 574: } ! 575: ! 576: static int VoidMem_check(uaecptr addr, uae_u32 size) ! 577: { ! 578: if (illegal_mem) ! 579: write_log ("Void memory check at %08lx\n", (long)addr); ! 580: ! 581: return 0; ! 582: } ! 583: ! 584: static uae_u8 *VoidMem_xlate (uaecptr addr) ! 585: { ! 586: write_log("Your Next program just did something terribly stupid:" ! 587: " VoidMem_xlate($%x)\n", addr); ! 588: ! 589: return NEXTmem_xlate(addr); /* So we don't crash. */ ! 590: } ! 591: ! 592: ! 593: ! 594: /* **** ROM memory **** */ ! 595: ! 596: uae_u8 *ROMmemory; ! 597: ! 598: static uae_u32 ROMmem_lget(uaecptr addr) ! 599: { ! 600: addr &= ROMmem_mask; ! 601: return do_get_mem_long(ROMmemory + addr); ! 602: } ! 603: ! 604: static uae_u32 ROMmem_wget(uaecptr addr) ! 605: { ! 606: addr &= ROMmem_mask; ! 607: return do_get_mem_word(ROMmemory + addr); ! 608: } ! 609: ! 610: static uae_u32 ROMmem_bget(uaecptr addr) ! 611: { ! 612: addr &= ROMmem_mask; ! 613: return ROMmemory[addr]; ! 614: } ! 615: ! 616: static void ROMmem_lput(uaecptr addr, uae_u32 b) ! 617: { ! 618: if (illegal_mem) ! 619: write_log ("Illegal ROMmem lput at %08lx\n", (long)addr); ! 620: ! 621: M68000_BusError(addr, 0); ! 622: } ! 623: ! 624: static void ROMmem_wput(uaecptr addr, uae_u32 b) ! 625: { ! 626: if (illegal_mem) ! 627: write_log ("Illegal ROMmem wput at %08lx\n", (long)addr); ! 628: ! 629: M68000_BusError(addr, 0); ! 630: } ! 631: ! 632: static void ROMmem_bput(uaecptr addr, uae_u32 b) ! 633: { ! 634: if (illegal_mem) ! 635: write_log ("Illegal ROMmem bput at %08lx\n", (long)addr); ! 636: ! 637: M68000_BusError(addr, 0); ! 638: } ! 639: ! 640: static int ROMmem_check(uaecptr addr, uae_u32 size) ! 641: { ! 642: addr &= ROMmem_mask; ! 643: return (addr + size) <= ROMmem_size; ! 644: } ! 645: ! 646: static uae_u8 *ROMmem_xlate(uaecptr addr) ! 647: { ! 648: addr &= ROMmem_mask; ! 649: return ROMmemory + addr; ! 650: } ! 651: ! 652: /* Hardware IO memory */ ! 653: /* see also ioMem.c */ ! 654: ! 655: uae_u8 *IOmemory; ! 656: ! 657: static int IOmem_check(uaecptr addr, uae_u32 size) ! 658: { ! 659: addr &= IOmem_mask; ! 660: return (addr + size) <= IOmem_size; ! 661: } ! 662: ! 663: static uae_u8 *IOmem_xlate(uaecptr addr) ! 664: { ! 665: addr &= IOmem_mask; ! 666: return IOmemory + addr; ! 667: } ! 668: ! 669: ! 670: /* **** Address banks **** */ ! 671: ! 672: static addrbank dummy_bank = ! 673: { ! 674: dummy_lget, dummy_wget, dummy_bget, ! 675: dummy_lput, dummy_wput, dummy_bput, ! 676: dummy_xlate, dummy_check ! 677: }; ! 678: ! 679: static addrbank BusErrMem_bank = ! 680: { ! 681: BusErrMem_lget, BusErrMem_wget, BusErrMem_bget, ! 682: BusErrMem_lput, BusErrMem_wput, BusErrMem_bput, ! 683: BusErrMem_xlate, BusErrMem_check ! 684: }; ! 685: ! 686: static addrbank NEXTmem_bank = ! 687: { ! 688: NEXTmem_lget, NEXTmem_wget, NEXTmem_bget, ! 689: NEXTmem_lput, NEXTmem_wput, NEXTmem_bput, ! 690: NEXTmem_xlate, NEXTmem_check ! 691: }; ! 692: ! 693: static addrbank NEXTmem_bank2 = ! 694: { ! 695: NEXTmem2_lget, NEXTmem2_wget, NEXTmem2_bget, ! 696: NEXTmem2_lput, NEXTmem2_wput, NEXTmem2_bput, ! 697: NEXTmem2_xlate, NEXTmem2_check ! 698: }; ! 699: ! 700: static addrbank VoidMem_bank = ! 701: { ! 702: VoidMem_lget, VoidMem_wget, VoidMem_bget, ! 703: VoidMem_lput, VoidMem_wput, VoidMem_bput, ! 704: VoidMem_xlate, VoidMem_check ! 705: }; ! 706: ! 707: static addrbank Video_bank = ! 708: { ! 709: NEXTvideo_lget, NEXTvideo_wget, NEXTvideo_bget, ! 710: NEXTvideo_lput, NEXTvideo_wput, NEXTvideo_bput, ! 711: NEXTvideo_xlate, NEXTvideo_check ! 712: }; ! 713: ! 714: static addrbank bmap_bank = ! 715: { ! 716: NEXTbmap_lget, NEXTbmap_wget, NEXTbmap_bget, ! 717: NEXTbmap_lput, NEXTbmap_wput, NEXTbmap_bput, ! 718: NEXTbmap_xlate, NEXTbmap_check ! 719: }; ! 720: ! 721: static addrbank x06_bank = ! 722: { ! 723: NEXTx06_lget, NEXTx06_wget, NEXTx06_bget, ! 724: NEXTx06_lput, NEXTx06_wput, NEXTx06_bput, ! 725: NEXTx06_xlate, NEXTx06_check ! 726: }; ! 727: ! 728: static addrbank ROMmem_bank = ! 729: { ! 730: ROMmem_lget, ROMmem_wget, ROMmem_bget, ! 731: ROMmem_lput, ROMmem_wput, ROMmem_bput, ! 732: ROMmem_xlate, ROMmem_check ! 733: }; ! 734: ! 735: static addrbank IOmem_bank = ! 736: { ! 737: IoMem_lget, IoMem_wget, IoMem_bget, ! 738: IoMem_lput, IoMem_wput, IoMem_bput, ! 739: IOmem_xlate, IOmem_check ! 740: }; ! 741: ! 742: ! 743: ! 744: ! 745: static void init_mem_banks (void) ! 746: { ! 747: int i; ! 748: for (i = 0; i < 65536; i++) ! 749: put_mem_bank (i<<16, &dummy_bank); ! 750: } ! 751: ! 752: ! 753: /* ! 754: * Initialize the memory banks ! 755: */ ! 756: void memory_init(uae_u32 nNewNEXTMemSize) ! 757: { ! 758: NEXTmem_size = (nNewNEXTMemSize + 65535) & 0xFFFF0000; ! 759: ! 760: write_log("memory_init: NEXTmem_size=$%x\n", ! 761: nNewNEXTMemSize); ! 762: ! 763: /* fill every 65536 bank with dummy */ ! 764: init_mem_banks(); ! 765: ! 766: // map_banks(&BusErrMem_bank,NEXT_RAM_START>>16,NEXT_RAM_SPACE>>16); ! 767: ! 768: map_banks(&NEXTmem_bank, NEXT_RAM_START>>16, NEXT_RAM_SIZE >> 16); ! 769: ! 770: // map_banks(&NEXTmem_bank2, NEXT_RAM_START2>>16, NEXT_RAM_SIZE2 >> 16); ! 771: ! 772: ! 773: map_banks(&Video_bank, NEXT_SCREEN>>16, NEXT_SCREEN_SIZE >> 16); ! 774: map_banks(&Video_bank, NEXT_SCREEN>>16, NEXT_SCREEN_SIZE >> 16); ! 775: map_banks(&Video_bank, NEXT_SCREEN>>16, NEXT_SCREEN_SIZE >> 16); ! 776: map_banks(&Video_bank, NEXT_SCREEN>>16, NEXT_SCREEN_SIZE >> 16); ! 777: ! 778: map_banks(&ROMmem_bank, NEXT_EPROM_START >> 16, NEXT_EPROM_SIZE>>16); ! 779: map_banks(&ROMmem_bank, NEXT_EPROM2_START >> 16, NEXT_EPROM_SIZE>>16); ! 780: ! 781: ! 782: map_banks(&IOmem_bank, NEXT_IO_START >> 16, NEXT_IO_SIZE>>16); ! 783: map_banks(&IOmem_bank, NEXT_IO2_START >> 16, NEXT_IO_SIZE>>16); ! 784: // map_banks(&VoidMem_bank, NEXT_IO_START >> 16, NEXT_IO_SIZE>>16); ! 785: // map_banks(&VoidMem_bank, NEXT_IO2_START >> 16, NEXT_IO_SIZE>>16); ! 786: ! 787: map_banks(&bmap_bank, NEXT_BMAP_START >> 16, NEXT_BMAP_SIZE>>16); ! 788: // map_banks(&x06_bank, NEXT_X06_START >> 16, NEXT_X06_SIZE>>16); ! 789: // map_banks(&x06_bank, 0x07000000 >> 16, NEXT_X06_SIZE>>16); ! 790: ! 791: ROMmemory=NEXTRom; ! 792: IOmemory=NEXTIo; ! 793: { ! 794: FILE* fin; ! 795: int ret; ! 796: fin=fopen("./Rev_2.5_v66.BIN","rb"); ! 797: // fin=fopen("./Rev_3.3_v74.BIN","rb"); ! 798: // fin=fopen("./Rev_1.2.BIN","rb"); ! 799: // fin=fopen("./Rev_1.0_v41.BIN","rb"); ! 800: ret=fread(ROMmemory,1,0x20000,fin); ! 801: ! 802: write_log("Read ROM %d\n",ret); ! 803: fclose(fin); ! 804: } ! 805: ! 806: { ! 807: int i; ! 808: for (i=0;i<sizeof(NEXTVideo);i++) NEXTVideo[i]=0xAA; ! 809: for (i=0;i<sizeof(NEXTRam);i++) NEXTRam[i]=0xAA; ! 810: } ! 811: ! 812: } ! 813: ! 814: ! 815: /* ! 816: * Uninitialize the memory banks. ! 817: */ ! 818: void memory_uninit (void) ! 819: { ! 820: } ! 821: ! 822: ! 823: void map_banks (addrbank *bank, int start, int size) ! 824: { ! 825: int bnr; ! 826: unsigned long int hioffs = 0, endhioffs = 0x100; ! 827: ! 828: for (bnr = start; bnr < start + size; bnr++) ! 829: put_mem_bank (bnr << 16, bank); ! 830: return; ! 831: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.