|
|
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 Andreas Grabher ! 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 "bmap.h" ! 25: #include "tmc.h" ! 26: #include "nbic.h" ! 27: #include "reset.h" ! 28: #include "nextMemory.h" ! 29: #include "m68000.h" ! 30: #include "configuration.h" ! 31: #include "NextBus.hpp" ! 32: ! 33: #include "newcpu.h" ! 34: ! 35: ! 36: /* Set illegal_mem to 1 for debug output: */ ! 37: #define illegal_mem 1 ! 38: ! 39: #define illegal_trace(s) {static int count=0; if (count++<50) { s; }} ! 40: ! 41: /* ! 42: * NeXT memory map (example for 68030 NeXT Computer) ! 43: * ! 44: * Local bus: ! 45: * 0x00000000 - 0x0001FFFF: ROM ! 46: * 0x01000000 - 0x0101FFFF: ROM mirror ! 47: * ! 48: * 0x02000000 - 0x020FFFFF: Device space ! 49: * ! 50: * 0x04000000 - 0x04FFFFFF: RAM bank 0 ! 51: * 0x05000000 - 0x05FFFFFF: RAM bank 1 ! 52: * 0x06000000 - 0x06FFFFFF: RAM bank 2 ! 53: * 0x07000000 - 0x07FFFFFF: RAM bank 3 ! 54: * ! 55: * 0x0B000000 - 0x0B03FFFF: VRAM ! 56: * ! 57: * 0x0C000000 - 0x0C03FFFF: VRAM mirror for MWF0 ! 58: * 0x0D000000 - 0x0D03FFFF: VRAM mirror for MWF1 ! 59: * 0x0E000000 - 0x0E03FFFF: VRAM mirror for MWF2 ! 60: * 0x0F000000 - 0x0F03FFFF: VRAM mirror for MWF3 ! 61: * ! 62: * 0x10000000 - 0x13FFFFFF: RAM mirror for MWF0 ! 63: * 0x14000000 - 0x17FFFFFF: RAM mirror for MWF1 ! 64: * 0x18000000 - 0x1BFFFFFF: RAM mirror for MWF2 ! 65: * 0x1C000000 - 0x1FFFFFFF: RAM mirror for MWF3 ! 66: * ! 67: * NeXTbus: (Note: Boards can be configured to occupy 2 slots) ! 68: * 0x00000000 - 0x1FFFFFFF: NeXTbus board space for slot 0 ! 69: * 0x20000000 - 0x3FFFFFFF: NeXTbus board space for slot 2 ! 70: * 0x40000000 - 0x5FFFFFFF: NeXTbus board space for slot 4 ! 71: * 0x60000000 - 0x7FFFFFFF: NeXTbus board space for slot 6 ! 72: * ! 73: * 0xF0000000 - 0xF0FFFFFF: NeXTbus slot space for slot 0 ! 74: * 0xF2000000 - 0xF2FFFFFF: NeXTbus slot space for slot 2 ! 75: * 0xF4000000 - 0xF4FFFFFF: NeXTbus slot space for slot 4 ! 76: * 0xF6000000 - 0xF6FFFFFF: NeXTbus slot space for slot 6 ! 77: */ ! 78: ! 79: ! 80: /* ROM */ ! 81: #define NEXT_EPROM_START 0x00000000 ! 82: #define NEXT_EPROM_DIAG_START 0x01000000 ! 83: #define NEXT_EPROM_BMAP_START 0x01000000 ! 84: #define NEXT_EPROM_SIZE 0x00020000 ! 85: #define NEXT_EPROM_MASK 0x0001FFFF ! 86: ! 87: /* Main memory */ ! 88: #define NEXT_RAM_START 0x04000000 ! 89: ! 90: #define N_BANKS 4 ! 91: #define NEXT_RAM_BANK_MAX 0x01000000 ! 92: #define NEXT_RAM_BANK_MAX_C 0x00800000 ! 93: #define NEXT_RAM_BANK_MAX_T 0x02000000 ! 94: ! 95: #define NEXT_RAM_BANK_SEL 0x03000000 ! 96: #define NEXT_RAM_BANK_SEL_C 0x01800000 ! 97: #define NEXT_RAM_BANK_SEL_T 0x06000000 ! 98: ! 99: uae_u32 NEXT_ram_bank_size; ! 100: uae_u32 NEXT_ram_bank_mask; ! 101: uae_u32 NEXT_ram_bank0_mask; ! 102: uae_u32 NEXT_ram_bank1_mask; ! 103: uae_u32 NEXT_ram_bank2_mask; ! 104: uae_u32 NEXT_ram_bank3_mask; ! 105: ! 106: /* Main memory with memory write functions */ ! 107: #define NEXT_RAM_MWF0_START 0x10000000 ! 108: #define NEXT_RAM_MWF1_START 0x14000000 ! 109: #define NEXT_RAM_MWF2_START 0x18000000 ! 110: #define NEXT_RAM_MWF3_START 0x1C000000 ! 111: ! 112: /* VRAM monochrome */ ! 113: #define NEXT_VRAM_START 0x0B000000 ! 114: #define NEXT_VRAM_SIZE 0x00040000 ! 115: #define NEXT_VRAM_MASK 0x0003FFFF ! 116: ! 117: /* VRAM monochrome with memory write functions */ ! 118: #define NEXT_VRAM_MWF0_START 0x0C000000 ! 119: #define NEXT_VRAM_MWF1_START 0x0D000000 ! 120: #define NEXT_VRAM_MWF2_START 0x0E000000 ! 121: #define NEXT_VRAM_MWF3_START 0x0F000000 ! 122: ! 123: /* VRAM color */ ! 124: #define NEXT_VRAM_COLOR_START 0x2C000000 ! 125: #define NEXT_VRAM_COLOR_SIZE 0x00200000 ! 126: #define NEXT_VRAM_COLOR_MASK 0x001FFFFF ! 127: ! 128: /* VRAM turbo monochrome and color */ ! 129: #define NEXT_VRAM_TURBO_START 0x0C000000 ! 130: ! 131: /* IO memory */ ! 132: #define NEXT_IO_START 0x02000000 ! 133: #define NEXT_IO_BMAP_START 0x02100000 ! 134: #define NEXT_IO_TMC_START 0x02200000 ! 135: #define NEXT_IO_SIZE 0x00020000 ! 136: #define NEXT_IO_MASK 0x0001FFFF ! 137: ! 138: #define NEXT_BMAP_START 0x020C0000 ! 139: #define NEXT_BMAP_SIZE 0x00000040 ! 140: #define NEXT_BMAP_MASK 0x0000003F ! 141: ! 142: #define NEXT_BMAP_MAP_SIZE 0x00010000 ! 143: ! 144: #define NEXT_NBIC_START 0x02020000 ! 145: #define NEXT_NBIC_SIZE 0x00000008 ! 146: #define NEXT_NBIC_MASK 0x00000007 ! 147: ! 148: #define NEXT_NBIC_MAP_SIZE 0x00010000 ! 149: ! 150: /* Cache memory for nitro systems */ ! 151: #define NEXT_CACHE_TAG_START 0x03E00000 ! 152: #define NEXT_CACHE_TAG_SIZE 0x00100000 ! 153: #define NEXT_CACHE_TAG_MASK 0x000FFFFF ! 154: ! 155: #define NEXT_CACHE_START 0x03F00000 ! 156: #define NEXT_CACHE_SIZE 0x00100000 ! 157: #define NEXT_CACHE_MASK 0x000FFFFF ! 158: ! 159: /* NeXTbus slot memory space */ ! 160: #define NEXTBUS_SLOT_START(x) (0xF0000000|((x)<<24)) ! 161: #define NEXTBUS_SLOT_SIZE 0x01000000 ! 162: #define NEXTBUS_SLOT_MASK 0x00FFFFFF ! 163: ! 164: /* NeXTbus board memory space */ ! 165: #define NEXTBUS_BOARD_START(x) ((x)<<28) ! 166: #define NEXTBUS_BOARD_SIZE 0x10000000 ! 167: #define NEXTBUS_BOARD_MASK 0x0FFFFFFF ! 168: ! 169: ! 170: uae_u8 NEXTVideo[256*1024]; ! 171: ! 172: uae_u8 NEXTColorVideo[2*1024*1024]; ! 173: ! 174: ! 175: #ifdef SAVE_MEMORY_BANKS ! 176: addrbank *mem_banks[65536]; ! 177: #else ! 178: addrbank mem_banks[65536]; ! 179: #endif ! 180: ! 181: #ifdef NO_INLINE_MEMORY_ACCESS ! 182: __inline__ uae_u32 longget (uaecptr addr) ! 183: { ! 184: return call_mem_get_func (get_mem_bank (addr).lget, addr); ! 185: } ! 186: __inline__ uae_u32 wordget (uaecptr addr) ! 187: { ! 188: return call_mem_get_func (get_mem_bank (addr).wget, addr); ! 189: } ! 190: __inline__ uae_u32 byteget (uaecptr addr) ! 191: { ! 192: return call_mem_get_func (get_mem_bank (addr).bget, addr); ! 193: } ! 194: __inline__ void longput (uaecptr addr, uae_u32 l) ! 195: { ! 196: call_mem_put_func (get_mem_bank (addr).lput, addr, l); ! 197: } ! 198: __inline__ void wordput (uaecptr addr, uae_u32 w) ! 199: { ! 200: call_mem_put_func (get_mem_bank (addr).wput, addr, w); ! 201: } ! 202: __inline__ void byteput (uaecptr addr, uae_u32 b) ! 203: { ! 204: call_mem_put_func (get_mem_bank (addr).bput, addr, b); ! 205: } ! 206: #endif ! 207: ! 208: ! 209: /* Some prototypes: */ ! 210: void SDL_Quit(void); ! 211: ! 212: uae_u8 ce_cachable[65536]; ! 213: ! 214: ! 215: /* **** A dummy bank that only contains zeros **** */ ! 216: ! 217: static uae_u32 dummy_lget(uaecptr addr) ! 218: { ! 219: illegal_trace(write_log ("Illegal lget at %08lx PC=%08x\n", (long)addr,m68k_getpc())); ! 220: return 0; ! 221: } ! 222: ! 223: static uae_u32 dummy_wget(uaecptr addr) ! 224: { ! 225: illegal_trace(write_log ("Illegal wget at %08lx PC=%08x\n", (long)addr,m68k_getpc())); ! 226: return 0; ! 227: } ! 228: ! 229: static uae_u32 dummy_bget(uaecptr addr) ! 230: { ! 231: illegal_trace(write_log ("Illegal bget at %08lx PC=%08x\n", (long)addr,m68k_getpc())); ! 232: return 0; ! 233: } ! 234: ! 235: static void dummy_lput(uaecptr addr, uae_u32 l) ! 236: { ! 237: illegal_trace(write_log ("Illegal lput at %08lx PC=%08x\n", (long)addr,m68k_getpc())); ! 238: } ! 239: ! 240: static void dummy_wput(uaecptr addr, uae_u32 w) ! 241: { ! 242: illegal_trace(write_log ("Illegal wput at %08lx PC=%08x\n", (long)addr,m68k_getpc())); ! 243: } ! 244: ! 245: static void dummy_bput(uaecptr addr, uae_u32 b) ! 246: { ! 247: illegal_trace(write_log ("Illegal bput at %08lx PC=%08x\n", (long)addr,m68k_getpc())); ! 248: } ! 249: ! 250: ! 251: /* **** This memory bank only generates bus errors **** */ ! 252: ! 253: static uae_u32 BusErrMem_lget(uaecptr addr) ! 254: { ! 255: if (illegal_mem) ! 256: write_log ("Bus error lget at %08lx\n", (long)addr); ! 257: ! 258: M68000_BusError(addr, 1); ! 259: return 0; ! 260: } ! 261: ! 262: static uae_u32 BusErrMem_wget(uaecptr addr) ! 263: { ! 264: if (illegal_mem) ! 265: write_log ("Bus error wget at %08lx\n", (long)addr); ! 266: ! 267: M68000_BusError(addr, 1); ! 268: return 0; ! 269: } ! 270: ! 271: static uae_u32 BusErrMem_bget(uaecptr addr) ! 272: { ! 273: if (illegal_mem) ! 274: write_log ("Bus error bget at %08lx\n", (long)addr); ! 275: ! 276: M68000_BusError(addr, 1); ! 277: return 0; ! 278: } ! 279: ! 280: static void BusErrMem_lput(uaecptr addr, uae_u32 l) ! 281: { ! 282: if (illegal_mem) ! 283: write_log ("Bus error lput at %08lx\n", (long)addr); ! 284: ! 285: M68000_BusError(addr, 0); ! 286: } ! 287: ! 288: static void BusErrMem_wput(uaecptr addr, uae_u32 w) ! 289: { ! 290: if (illegal_mem) ! 291: write_log ("Bus error wput at %08lx\n", (long)addr); ! 292: ! 293: M68000_BusError(addr, 0); ! 294: } ! 295: ! 296: static void BusErrMem_bput(uaecptr addr, uae_u32 b) ! 297: { ! 298: if (illegal_mem) ! 299: write_log ("Bus error bput at %08lx\n", (long)addr); ! 300: ! 301: M68000_BusError(addr, 0); ! 302: } ! 303: ! 304: ! 305: /* **** ROM memory **** */ ! 306: ! 307: extern int SCR_ROM_overlay; ! 308: ! 309: uae_u8 *ROMmemory; ! 310: ! 311: static uae_u32 mem_rom_lget(uaecptr addr) ! 312: { ! 313: // if ((addr<0x2000) && (SCR_ROM_overlay)) {do_get_mem_long(NEXTRam + 0x03FFE000 +addr);} ! 314: addr &= NEXT_EPROM_MASK; ! 315: return do_get_mem_long(ROMmemory + addr); ! 316: } ! 317: ! 318: static uae_u32 mem_rom_wget(uaecptr addr) ! 319: { ! 320: // if ((addr<0x2000) && (SCR_ROM_overlay)) {do_get_mem_word(NEXTRam + 0x03FFE000 +addr);} ! 321: addr &= NEXT_EPROM_MASK; ! 322: return do_get_mem_word(ROMmemory + addr); ! 323: ! 324: } ! 325: ! 326: static uae_u32 mem_rom_bget(uaecptr addr) ! 327: { ! 328: // if ((addr<0x2000) && (SCR_ROM_overlay)) {return NEXTRam[0x03FFE000 +addr];} ! 329: addr &= NEXT_EPROM_MASK; ! 330: return ROMmemory[addr]; ! 331: } ! 332: ! 333: static void mem_rom_lput(uaecptr addr, uae_u32 b) ! 334: { ! 335: illegal_trace(write_log ("Illegal ROMmem lput at %08lx\n", (long)addr)); ! 336: M68000_BusError(addr, 0); ! 337: } ! 338: ! 339: static void mem_rom_wput(uaecptr addr, uae_u32 b) ! 340: { ! 341: illegal_trace(write_log ("Illegal ROMmem wput at %08lx\n", (long)addr)); ! 342: M68000_BusError(addr, 0); ! 343: } ! 344: ! 345: static void mem_rom_bput(uaecptr addr, uae_u32 b) ! 346: { ! 347: illegal_trace(write_log ("Illegal ROMmem bput at %08lx\n", (long)addr)); ! 348: M68000_BusError(addr, 0); ! 349: } ! 350: ! 351: ! 352: /* **** NEXT RAM memory **** */ ! 353: ! 354: static uae_u32 mem_ram_bank0_lget(uaecptr addr) ! 355: { ! 356: addr &= NEXT_ram_bank0_mask; ! 357: return do_get_mem_long(NEXTRam + addr); ! 358: } ! 359: ! 360: static uae_u32 mem_ram_bank0_wget(uaecptr addr) ! 361: { ! 362: addr &= NEXT_ram_bank0_mask; ! 363: return do_get_mem_word(NEXTRam + addr); ! 364: } ! 365: ! 366: static uae_u32 mem_ram_bank0_bget(uaecptr addr) ! 367: { ! 368: addr &= NEXT_ram_bank0_mask; ! 369: return NEXTRam[addr]; ! 370: } ! 371: ! 372: static void mem_ram_bank0_lput(uaecptr addr, uae_u32 l) ! 373: { ! 374: addr &= NEXT_ram_bank0_mask; ! 375: do_put_mem_long(NEXTRam + addr, l); ! 376: } ! 377: ! 378: static void mem_ram_bank0_wput(uaecptr addr, uae_u32 w) ! 379: { ! 380: addr &= NEXT_ram_bank0_mask; ! 381: do_put_mem_word(NEXTRam + addr, w); ! 382: } ! 383: ! 384: static void mem_ram_bank0_bput(uaecptr addr, uae_u32 b) ! 385: { ! 386: addr &= NEXT_ram_bank0_mask; ! 387: NEXTRam[addr] = b; ! 388: } ! 389: ! 390: ! 391: static uae_u32 mem_ram_bank1_lget(uaecptr addr) ! 392: { ! 393: addr &= NEXT_ram_bank1_mask; ! 394: return do_get_mem_long(NEXTRam + addr); ! 395: } ! 396: ! 397: static uae_u32 mem_ram_bank1_wget(uaecptr addr) ! 398: { ! 399: addr &= NEXT_ram_bank1_mask; ! 400: return do_get_mem_word(NEXTRam + addr); ! 401: } ! 402: ! 403: static uae_u32 mem_ram_bank1_bget(uaecptr addr) ! 404: { ! 405: addr &= NEXT_ram_bank1_mask; ! 406: return NEXTRam[addr]; ! 407: } ! 408: ! 409: static void mem_ram_bank1_lput(uaecptr addr, uae_u32 l) ! 410: { ! 411: addr &= NEXT_ram_bank1_mask; ! 412: do_put_mem_long(NEXTRam + addr, l); ! 413: } ! 414: ! 415: static void mem_ram_bank1_wput(uaecptr addr, uae_u32 w) ! 416: { ! 417: addr &= NEXT_ram_bank1_mask; ! 418: do_put_mem_word(NEXTRam + addr, w); ! 419: } ! 420: ! 421: static void mem_ram_bank1_bput(uaecptr addr, uae_u32 b) ! 422: { ! 423: addr &= NEXT_ram_bank1_mask; ! 424: NEXTRam[addr] = b; ! 425: } ! 426: ! 427: ! 428: static uae_u32 mem_ram_bank2_lget(uaecptr addr) ! 429: { ! 430: addr &= NEXT_ram_bank2_mask; ! 431: return do_get_mem_long(NEXTRam + addr); ! 432: } ! 433: ! 434: static uae_u32 mem_ram_bank2_wget(uaecptr addr) ! 435: { ! 436: addr &= NEXT_ram_bank2_mask; ! 437: return do_get_mem_word(NEXTRam + addr); ! 438: } ! 439: ! 440: static uae_u32 mem_ram_bank2_bget(uaecptr addr) ! 441: { ! 442: addr &= NEXT_ram_bank2_mask; ! 443: return NEXTRam[addr]; ! 444: } ! 445: ! 446: static void mem_ram_bank2_lput(uaecptr addr, uae_u32 l) ! 447: { ! 448: addr &= NEXT_ram_bank2_mask; ! 449: do_put_mem_long(NEXTRam + addr, l); ! 450: } ! 451: ! 452: static void mem_ram_bank2_wput(uaecptr addr, uae_u32 w) ! 453: { ! 454: addr &= NEXT_ram_bank2_mask; ! 455: do_put_mem_word(NEXTRam + addr, w); ! 456: } ! 457: ! 458: static void mem_ram_bank2_bput(uaecptr addr, uae_u32 b) ! 459: { ! 460: addr &= NEXT_ram_bank2_mask; ! 461: NEXTRam[addr] = b; ! 462: } ! 463: ! 464: ! 465: static uae_u32 mem_ram_bank3_lget(uaecptr addr) ! 466: { ! 467: addr &= NEXT_ram_bank3_mask; ! 468: return do_get_mem_long(NEXTRam + addr); ! 469: } ! 470: ! 471: static uae_u32 mem_ram_bank3_wget(uaecptr addr) ! 472: { ! 473: addr &= NEXT_ram_bank3_mask; ! 474: return do_get_mem_word(NEXTRam + addr); ! 475: } ! 476: ! 477: static uae_u32 mem_ram_bank3_bget(uaecptr addr) ! 478: { ! 479: addr &= NEXT_ram_bank3_mask; ! 480: return NEXTRam[addr]; ! 481: } ! 482: ! 483: static void mem_ram_bank3_lput(uaecptr addr, uae_u32 l) ! 484: { ! 485: addr &= NEXT_ram_bank3_mask; ! 486: do_put_mem_long(NEXTRam + addr, l); ! 487: } ! 488: ! 489: static void mem_ram_bank3_wput(uaecptr addr, uae_u32 w) ! 490: { ! 491: addr &= NEXT_ram_bank3_mask; ! 492: do_put_mem_word(NEXTRam + addr, w); ! 493: } ! 494: ! 495: static void mem_ram_bank3_bput(uaecptr addr, uae_u32 b) ! 496: { ! 497: addr &= NEXT_ram_bank3_mask; ! 498: NEXTRam[addr] = b; ! 499: } ! 500: ! 501: /* **** NEXT RAM empty areas **** */ ! 502: ! 503: static uae_u32 mem_ram_empty_lget(uaecptr addr) ! 504: { ! 505: if (illegal_mem) ! 506: write_log ("Empty mem area lget at %08lx\n", (long)addr); ! 507: ! 508: return addr; ! 509: } ! 510: ! 511: static uae_u32 mem_ram_empty_wget(uaecptr addr) ! 512: { ! 513: if (illegal_mem) ! 514: write_log ("Empty mem area wget at %08lx\n", (long)addr); ! 515: ! 516: return addr; ! 517: } ! 518: ! 519: static uae_u32 mem_ram_empty_bget(uaecptr addr) ! 520: { ! 521: if (illegal_mem) ! 522: write_log ("Empty mem area bget at %08lx\n", (long)addr); ! 523: ! 524: return addr; ! 525: } ! 526: ! 527: static void mem_ram_empty_lput(uaecptr addr, uae_u32 l) ! 528: { ! 529: if (illegal_mem) ! 530: write_log ("Empty mem area lput at %08lx\n", (long)addr); ! 531: } ! 532: ! 533: static void mem_ram_empty_wput(uaecptr addr, uae_u32 w) ! 534: { ! 535: if (illegal_mem) ! 536: write_log ("Empty mem area wput at %08lx\n", (long)addr); ! 537: } ! 538: ! 539: static void mem_ram_empty_bput(uaecptr addr, uae_u32 b) ! 540: { ! 541: if (illegal_mem) ! 542: write_log ("Empty mem area bput at %08lx\n", (long)addr); ! 543: } ! 544: ! 545: ! 546: /* **** NEXT VRAM memory for monochrome systems **** */ ! 547: ! 548: static uae_u32 mem_video_lget(uaecptr addr) ! 549: { ! 550: addr &= NEXT_VRAM_MASK; ! 551: return do_get_mem_long(NEXTVideo + addr); ! 552: } ! 553: ! 554: static uae_u32 mem_video_wget(uaecptr addr) ! 555: { ! 556: addr &= NEXT_VRAM_MASK; ! 557: return do_get_mem_word(NEXTVideo + addr); ! 558: } ! 559: ! 560: static uae_u32 mem_video_bget(uaecptr addr) ! 561: { ! 562: addr &= NEXT_VRAM_MASK; ! 563: return NEXTVideo[addr]; ! 564: } ! 565: ! 566: static void mem_video_lput(uaecptr addr, uae_u32 l) ! 567: { ! 568: addr &= NEXT_VRAM_MASK; ! 569: do_put_mem_long(NEXTVideo + addr, l); ! 570: } ! 571: ! 572: static void mem_video_wput(uaecptr addr, uae_u32 w) ! 573: { ! 574: addr &= NEXT_VRAM_MASK; ! 575: do_put_mem_word(NEXTVideo + addr, w); ! 576: } ! 577: ! 578: static void mem_video_bput(uaecptr addr, uae_u32 b) ! 579: { ! 580: addr &= NEXT_VRAM_MASK; ! 581: NEXTVideo[addr] = b; ! 582: } ! 583: ! 584: ! 585: /* **** NEXT memory banks with write functions **** */ ! 586: ! 587: static uae_u8 mwf0[4][4] = { /* AB */ ! 588: { 0, 0, 0, 0 }, ! 589: { 0, 0, 1, 1 }, ! 590: { 0, 1, 1, 2 }, ! 591: { 0, 1, 2, 3 } ! 592: }; ! 593: ! 594: static uae_u8 mwf1[4][4] = { /* ceil(A+B) */ ! 595: { 0, 1, 2, 3 }, ! 596: { 1, 2, 3, 3 }, ! 597: { 2, 3, 3, 3 }, ! 598: { 3, 3, 3, 3 } ! 599: }; ! 600: ! 601: static uae_u8 mwf2[4][4] = { /* (1-A)B */ ! 602: { 0, 0, 0, 0 }, ! 603: { 1, 1, 0, 0 }, ! 604: { 2, 1, 1, 0 }, ! 605: { 3, 2, 1, 0 } ! 606: }; ! 607: ! 608: static uae_u8 mwf3[4][4] = { /* A+B-AB */ ! 609: { 0, 1, 2, 3 }, ! 610: { 1, 2, 2, 3 }, ! 611: { 2, 2, 3, 3 }, ! 612: { 3, 3, 3, 3 } ! 613: }; ! 614: ! 615: static uae_u32 memory_write_func(uae_u32 old, uae_u32 new, int function, int size) ! 616: { ! 617: int a,b,i; ! 618: uae_u32 v=0; ! 619: #if 0 ! 620: write_log("[MWF] Function%i: size=%i, old=%08X, new=%08X\n",function,size,old,new); ! 621: #endif ! 622: ! 623: switch (function) { ! 624: case 0: ! 625: for (i=0; i<(size*4); i++) { ! 626: a=old>>(i*2)&3; ! 627: b=new>>(i*2)&3; ! 628: v|=mwf0[a][b]<<(i*2); ! 629: } ! 630: return v; ! 631: case 1: ! 632: for (i=0; i<(size*4); i++) { ! 633: a=old>>(i*2)&3; ! 634: b=new>>(i*2)&3; ! 635: v|=mwf1[a][b]<<(i*2); ! 636: } ! 637: return v; ! 638: case 2: ! 639: for (i=0; i<(size*4); i++) { ! 640: a=old>>(i*2)&3; ! 641: b=new>>(i*2)&3; ! 642: v|=mwf2[a][b]<<(i*2); ! 643: } ! 644: return v; ! 645: case 3: ! 646: for (i=0; i<(size*4); i++) { ! 647: a=old>>(i*2)&3; ! 648: b=new>>(i*2)&3; ! 649: v|=mwf3[a][b]<<(i*2); ! 650: } ! 651: return v; ! 652: ! 653: default: ! 654: write_log("Unknown memory write function!\n"); ! 655: abort(); ! 656: } ! 657: } ! 658: ! 659: static uae_u32 mem_ram_mwf_lget(uaecptr addr) ! 660: { ! 661: int function = (addr>>26)&0x3; ! 662: addr = NEXT_RAM_START|(addr&0x03FFFFFF); ! 663: ! 664: return function==0?0xFFFFFFFF:0; ! 665: } ! 666: ! 667: static uae_u32 mem_ram_mwf_wget(uaecptr addr) ! 668: { ! 669: int function = (addr>>26)&0x3; ! 670: addr = NEXT_RAM_START|(addr&0x03FFFFFF); ! 671: ! 672: return function==0?0xFFFF:0; ! 673: } ! 674: ! 675: static uae_u32 mem_ram_mwf_bget(uaecptr addr) ! 676: { ! 677: int function = (addr>>26)&0x3; ! 678: addr = NEXT_RAM_START|(addr&0x03FFFFFF); ! 679: ! 680: return function==0?0xFF:0; ! 681: } ! 682: ! 683: static void mem_ram_mwf_lput(uaecptr addr, uae_u32 l) ! 684: { ! 685: int function = (addr>>26)&0x3; ! 686: addr = NEXT_RAM_START|(addr&0x03FFFFFF); ! 687: ! 688: uae_u32 old = longget(addr); ! 689: uae_u32 val = memory_write_func(old, l, function, 4); ! 690: ! 691: longput(addr, val); ! 692: } ! 693: ! 694: static void mem_ram_mwf_wput(uaecptr addr, uae_u32 w) ! 695: { ! 696: int function = (addr>>26)&0x3; ! 697: addr = NEXT_RAM_START|(addr&0x03FFFFFF); ! 698: ! 699: uae_u32 old = wordget(addr); ! 700: uae_u32 val = memory_write_func(old, w, function, 2); ! 701: ! 702: wordput(addr, val); ! 703: } ! 704: ! 705: static void mem_ram_mwf_bput(uaecptr addr, uae_u32 b) ! 706: { ! 707: int function = (addr>>26)&0x3; ! 708: addr = NEXT_RAM_START|(addr&0x03FFFFFF); ! 709: ! 710: uae_u32 old = byteget(addr); ! 711: uae_u32 val = memory_write_func(old, b, function, 1); ! 712: ! 713: byteput(addr, val); ! 714: } ! 715: ! 716: ! 717: static uae_u32 mem_video_mwf_lget(uaecptr addr) ! 718: { ! 719: int function = (addr>>24)&0x3; ! 720: addr = NEXT_VRAM_START|(addr&NEXT_VRAM_MASK); ! 721: ! 722: return function==0?0xFFFFFFFF:0; ! 723: } ! 724: ! 725: static uae_u32 mem_video_mwf_wget(uaecptr addr) ! 726: { ! 727: int function = (addr>>24)&0x3; ! 728: addr = NEXT_VRAM_START|(addr&NEXT_VRAM_MASK); ! 729: ! 730: return function==0?0xFFFF:0; ! 731: } ! 732: ! 733: static uae_u32 mem_video_mwf_bget(uaecptr addr) ! 734: { ! 735: int function = (addr>>24)&0x3; ! 736: addr = NEXT_VRAM_START|(addr&NEXT_VRAM_MASK); ! 737: ! 738: return function==0?0xFF:0; ! 739: } ! 740: ! 741: static void mem_video_mwf_lput(uaecptr addr, uae_u32 l) ! 742: { ! 743: int function = (addr>>24)&0x3; ! 744: addr = NEXT_VRAM_START|(addr&NEXT_VRAM_MASK); ! 745: ! 746: uae_u32 old = longget(addr); ! 747: uae_u32 val = memory_write_func(old, l, function, 4); ! 748: ! 749: longput(addr, val); ! 750: } ! 751: ! 752: static void mem_video_mwf_wput(uaecptr addr, uae_u32 w) ! 753: { ! 754: int function = (addr>>24)&0x3; ! 755: addr = NEXT_VRAM_START|(addr&NEXT_VRAM_MASK); ! 756: ! 757: uae_u32 old = wordget(addr); ! 758: uae_u32 val = memory_write_func(old, w, function, 2); ! 759: ! 760: wordput(addr, val); ! 761: } ! 762: ! 763: static void mem_video_mwf_bput(uaecptr addr, uae_u32 b) ! 764: { ! 765: int function = (addr>>24)&0x3; ! 766: addr = NEXT_VRAM_START|(addr&NEXT_VRAM_MASK); ! 767: ! 768: uae_u32 old = byteget(addr); ! 769: uae_u32 val = memory_write_func(old, b, function, 1); ! 770: ! 771: byteput(addr, val); ! 772: } ! 773: ! 774: ! 775: /* **** NEXT VRAM memory for color systems **** */ ! 776: ! 777: static uae_u32 mem_color_video_lget(uaecptr addr) ! 778: { ! 779: addr &= NEXT_VRAM_COLOR_MASK; ! 780: return do_get_mem_long(NEXTColorVideo + addr); ! 781: } ! 782: ! 783: static uae_u32 mem_color_video_wget(uaecptr addr) ! 784: { ! 785: addr &= NEXT_VRAM_COLOR_MASK; ! 786: return do_get_mem_word(NEXTColorVideo + addr); ! 787: } ! 788: ! 789: static uae_u32 mem_color_video_bget(uaecptr addr) ! 790: { ! 791: addr &= NEXT_VRAM_COLOR_MASK; ! 792: return NEXTColorVideo[addr]; ! 793: } ! 794: ! 795: static void mem_color_video_lput(uaecptr addr, uae_u32 l) ! 796: { ! 797: addr &= NEXT_VRAM_COLOR_MASK; ! 798: do_put_mem_long(NEXTColorVideo + addr, l); ! 799: } ! 800: ! 801: static void mem_color_video_wput(uaecptr addr, uae_u32 w) ! 802: { ! 803: addr &= NEXT_VRAM_COLOR_MASK; ! 804: do_put_mem_word(NEXTColorVideo + addr, w); ! 805: } ! 806: ! 807: static void mem_color_video_bput(uaecptr addr, uae_u32 b) ! 808: { ! 809: addr &= NEXT_VRAM_COLOR_MASK; ! 810: NEXTColorVideo[addr] = b; ! 811: } ! 812: ! 813: ! 814: /* Hardware IO memory */ ! 815: /* --> see ioMem.c */ ! 816: uae_u8 *IOmemory; ! 817: ! 818: ! 819: /* **** NEXT BMAP memory **** */ ! 820: ! 821: static uae_u32 mem_bmap_lget(uaecptr addr) ! 822: { ! 823: if ((addr&NEXT_BMAP_MASK)>NEXT_BMAP_SIZE) { ! 824: write_log ("bmap bus error at %08lx PC=%08x\n", (long)addr,m68k_getpc()); ! 825: M68000_BusError(addr, 0); ! 826: return 0; ! 827: } ! 828: //write_log ("bmap lget at %08lx PC=%08x\n", (long)addr,m68k_getpc()); ! 829: addr &= NEXT_BMAP_MASK; ! 830: return bmap_lget(addr); ! 831: } ! 832: ! 833: static uae_u32 mem_bmap_wget(uaecptr addr) ! 834: { ! 835: if ((addr&NEXT_BMAP_MASK)>NEXT_BMAP_SIZE) { ! 836: write_log ("bmap bus error at %08lx PC=%08x\n", (long)addr,m68k_getpc()); ! 837: M68000_BusError(addr, 0); ! 838: return 0; ! 839: } ! 840: //write_log ("bmap wget at %08lx PC=%08x\n", (long)addr,m68k_getpc()); ! 841: addr &= NEXT_BMAP_MASK; ! 842: return bmap_wget(addr); ! 843: } ! 844: ! 845: static uae_u32 mem_bmap_bget(uaecptr addr) ! 846: { ! 847: if ((addr&NEXT_BMAP_MASK)>NEXT_BMAP_SIZE) { ! 848: write_log ("bmap bus error at %08lx PC=%08x\n", (long)addr,m68k_getpc()); ! 849: M68000_BusError(addr, 0); ! 850: return 0; ! 851: } ! 852: //write_log ("bmap bget at %08lx PC=%08x\n", (long)addr,m68k_getpc()); ! 853: addr &= NEXT_BMAP_MASK; ! 854: return bmap_bget(addr); ! 855: } ! 856: ! 857: static void mem_bmap_lput(uaecptr addr, uae_u32 l) ! 858: { ! 859: if ((addr&NEXT_BMAP_MASK)>NEXT_BMAP_SIZE) { ! 860: write_log ("bmap bus error at %08lx PC=%08x\n", (long)addr,m68k_getpc()); ! 861: M68000_BusError(addr, 0); ! 862: } ! 863: //write_log ("bmap lput at %08lx val=%x PC=%08x\n", (long)addr,l,m68k_getpc()); ! 864: addr &= NEXT_BMAP_MASK; ! 865: bmap_lput(addr, l); ! 866: } ! 867: ! 868: static void mem_bmap_wput(uaecptr addr, uae_u32 w) ! 869: { ! 870: if ((addr&NEXT_BMAP_MASK)>NEXT_BMAP_SIZE) { ! 871: write_log ("bmap bus error at %08lx PC=%08x\n", (long)addr,m68k_getpc()); ! 872: M68000_BusError(addr, 0); ! 873: } ! 874: //write_log ("bmap wput at %08lx val=%x PC=%08x\n", (long)addr,w,m68k_getpc()); ! 875: addr &= NEXT_BMAP_MASK; ! 876: bmap_wput(addr, w); ! 877: } ! 878: ! 879: static void mem_bmap_bput(uaecptr addr, uae_u32 b) ! 880: { ! 881: if ((addr&NEXT_BMAP_MASK)>NEXT_BMAP_SIZE) { ! 882: write_log ("bmap bus error at %08lx PC=%08x\n", (long)addr,m68k_getpc()); ! 883: M68000_BusError(addr, 0); ! 884: } ! 885: //write_log ("bmap bput at %08lx val=%x PC=%08x\n", (long)addr,b,m68k_getpc()); ! 886: addr &= NEXT_BMAP_MASK; ! 887: bmap_bput(addr, b); ! 888: } ! 889: ! 890: ! 891: ! 892: /* **** Address banks **** */ ! 893: ! 894: static addrbank dummy_bank = ! 895: { ! 896: dummy_lget, dummy_wget, dummy_bget, ! 897: dummy_lput, dummy_wput, dummy_bput, ! 898: dummy_lget, dummy_wget, ABFLAG_NONE ! 899: }; ! 900: ! 901: static addrbank BusErrMem_bank = ! 902: { ! 903: BusErrMem_lget, BusErrMem_wget, BusErrMem_bget, ! 904: BusErrMem_lput, BusErrMem_wput, BusErrMem_bput, ! 905: BusErrMem_lget, BusErrMem_wget, ABFLAG_NONE ! 906: }; ! 907: ! 908: static addrbank ROM_bank = ! 909: { ! 910: mem_rom_lget, mem_rom_wget, mem_rom_bget, ! 911: mem_rom_lput, mem_rom_wput, mem_rom_bput, ! 912: mem_rom_lget, mem_rom_wget, ABFLAG_ROM ! 913: }; ! 914: ! 915: static addrbank RAM_bank0 = ! 916: { ! 917: mem_ram_bank0_lget, mem_ram_bank0_wget, mem_ram_bank0_bget, ! 918: mem_ram_bank0_lput, mem_ram_bank0_wput, mem_ram_bank0_bput, ! 919: mem_ram_bank0_lget, mem_ram_bank0_wget, ABFLAG_RAM ! 920: ! 921: }; ! 922: ! 923: static addrbank RAM_bank1 = ! 924: { ! 925: mem_ram_bank1_lget, mem_ram_bank1_wget, mem_ram_bank1_bget, ! 926: mem_ram_bank1_lput, mem_ram_bank1_wput, mem_ram_bank1_bput, ! 927: mem_ram_bank1_lget, mem_ram_bank1_wget, ABFLAG_RAM ! 928: ! 929: }; ! 930: ! 931: static addrbank RAM_bank2 = ! 932: { ! 933: mem_ram_bank2_lget, mem_ram_bank2_wget, mem_ram_bank2_bget, ! 934: mem_ram_bank2_lput, mem_ram_bank2_wput, mem_ram_bank2_bput, ! 935: mem_ram_bank2_lget, mem_ram_bank2_wget, ABFLAG_RAM ! 936: ! 937: }; ! 938: ! 939: static addrbank RAM_bank3 = ! 940: { ! 941: mem_ram_bank3_lget, mem_ram_bank3_wget, mem_ram_bank3_bget, ! 942: mem_ram_bank3_lput, mem_ram_bank3_wput, mem_ram_bank3_bput, ! 943: mem_ram_bank3_lget, mem_ram_bank3_wget, ABFLAG_RAM ! 944: ! 945: }; ! 946: ! 947: static addrbank RAM_empty_bank = ! 948: { ! 949: mem_ram_empty_lget, mem_ram_empty_wget, mem_ram_empty_bget, ! 950: mem_ram_empty_lput, mem_ram_empty_wput, mem_ram_empty_bput, ! 951: mem_ram_empty_lget, mem_ram_empty_wget, ABFLAG_RAM ! 952: }; ! 953: ! 954: static addrbank RAM_mwf_bank = ! 955: { ! 956: mem_ram_mwf_lget, mem_ram_mwf_wget, mem_ram_mwf_bget, ! 957: mem_ram_mwf_lput, mem_ram_mwf_wput, mem_ram_mwf_bput, ! 958: mem_ram_mwf_lget, mem_ram_mwf_wget, ABFLAG_RAM ! 959: }; ! 960: ! 961: static addrbank VRAM_bank = ! 962: { ! 963: mem_video_lget, mem_video_wget, mem_video_bget, ! 964: mem_video_lput, mem_video_wput, mem_video_bput, ! 965: mem_video_lget, mem_video_wget, ABFLAG_RAM ! 966: }; ! 967: ! 968: static addrbank VRAM_mwf_bank = ! 969: { ! 970: mem_video_mwf_lget, mem_video_mwf_wget, mem_video_mwf_bget, ! 971: mem_video_mwf_lput, mem_video_mwf_wput, mem_video_mwf_bput, ! 972: mem_video_mwf_lget, mem_video_mwf_wget, ABFLAG_RAM ! 973: }; ! 974: ! 975: static addrbank VRAM_color_bank = ! 976: { ! 977: mem_color_video_lget, mem_color_video_wget, mem_color_video_bget, ! 978: mem_color_video_lput, mem_color_video_wput, mem_color_video_bput, ! 979: mem_color_video_lget, mem_color_video_wget, ABFLAG_RAM ! 980: }; ! 981: ! 982: static addrbank IO_bank = ! 983: { ! 984: IoMem_lget, IoMem_wget, IoMem_bget, ! 985: IoMem_lput, IoMem_wput, IoMem_bput, ! 986: IoMem_lget, IoMem_wget, ABFLAG_IO ! 987: }; ! 988: ! 989: static addrbank BMAP_bank = ! 990: { ! 991: mem_bmap_lget, mem_bmap_wget, mem_bmap_bget, ! 992: mem_bmap_lput, mem_bmap_wput, mem_bmap_bput, ! 993: mem_bmap_lget, mem_bmap_wget, ABFLAG_IO ! 994: }; ! 995: ! 996: static addrbank TMC_bank = ! 997: { ! 998: tmc_lget, tmc_wget, tmc_bget, ! 999: tmc_lput, tmc_wput, tmc_bput, ! 1000: tmc_lget, tmc_wget, ABFLAG_IO ! 1001: }; ! 1002: ! 1003: static addrbank NBIC_bank = ! 1004: { ! 1005: nbic_reg_lget, nbic_reg_wget, nbic_reg_bget, ! 1006: nbic_reg_lput, nbic_reg_wput, nbic_reg_bput, ! 1007: nbic_reg_lget, nbic_reg_wget, ABFLAG_IO ! 1008: }; ! 1009: ! 1010: static addrbank NEXTBUS_slot_bank = ! 1011: { ! 1012: nextbus_slot_lget, nextbus_slot_wget, nextbus_slot_bget, ! 1013: nextbus_slot_lput, nextbus_slot_wput, nextbus_slot_bput, ! 1014: nextbus_slot_lget, nextbus_slot_wget, ABFLAG_IO ! 1015: }; ! 1016: ! 1017: static addrbank NEXTBUS_board_bank = ! 1018: { ! 1019: nextbus_board_lget, nextbus_board_wget, nextbus_board_bget, ! 1020: nextbus_board_lput, nextbus_board_wput, nextbus_board_bput, ! 1021: nextbus_board_lget, nextbus_board_wget, ABFLAG_IO ! 1022: }; ! 1023: ! 1024: ! 1025: ! 1026: static void init_mem_banks (void) ! 1027: { ! 1028: int i; ! 1029: for (i = 0; i < 65536; i++) ! 1030: put_mem_bank (i<<16, &BusErrMem_bank); ! 1031: } ! 1032: ! 1033: ! 1034: /* ! 1035: * Initialize the memory banks ! 1036: */ ! 1037: const char* memory_init(int *nNewNEXTMemSize) ! 1038: { ! 1039: int i; ! 1040: uae_u32 bankstart[4]; ! 1041: ! 1042: /* Set machine dependent variables */ ! 1043: if (ConfigureParams.System.bTurbo) { ! 1044: NEXT_ram_bank_size = NEXT_RAM_BANK_MAX_T; ! 1045: NEXT_ram_bank_mask = NEXT_RAM_BANK_SEL_T; ! 1046: } else if (ConfigureParams.System.bColor) { ! 1047: NEXT_ram_bank_size = NEXT_RAM_BANK_MAX_C; ! 1048: NEXT_ram_bank_mask = NEXT_RAM_BANK_SEL_C; ! 1049: } else { ! 1050: NEXT_ram_bank_size = NEXT_RAM_BANK_MAX; ! 1051: NEXT_ram_bank_mask = NEXT_RAM_BANK_SEL; ! 1052: } ! 1053: ! 1054: write_log("Memory init: Memory size: %iMB\n", Configuration_CheckMemory(nNewNEXTMemSize)); ! 1055: ! 1056: /* Convert values from MB to byte */ ! 1057: for (i=0; i<N_BANKS; i++) { ! 1058: bankstart[i] = NEXT_RAM_START + (NEXT_ram_bank_size * i); ! 1059: } ! 1060: ! 1061: /* Fill every 65536 bank with dummy */ ! 1062: init_mem_banks(); ! 1063: ! 1064: /* Map ROM */ ! 1065: map_banks(&ROM_bank, NEXT_EPROM_START >> 16, NEXT_EPROM_SIZE>>16); ! 1066: write_log("Mapping ROM at $%08x: %ikB\n", NEXT_EPROM_START, NEXT_EPROM_SIZE/1024); ! 1067: if (ConfigureParams.System.nMachineType != NEXT_CUBE030) { ! 1068: map_banks(&ROM_bank, NEXT_EPROM_BMAP_START >> 16, NEXT_EPROM_SIZE>>16); ! 1069: write_log("Mapping ROM trough BMAP at $%08x: %ikB\n", NEXT_EPROM_BMAP_START, NEXT_EPROM_SIZE/1024); ! 1070: } ! 1071: ! 1072: /* Map main memory */ ! 1073: if (nNewNEXTMemSize[0]) { ! 1074: NEXT_ram_bank0_mask = NEXT_ram_bank_mask|((nNewNEXTMemSize[0]<<20)-1); ! 1075: map_banks(&RAM_bank0, bankstart[0]>>16, NEXT_ram_bank_size >> 16); ! 1076: write_log("Mapping main memory bank0 at $%08x: %iMB\n", bankstart[0], nNewNEXTMemSize[0]); ! 1077: } else { ! 1078: NEXT_ram_bank0_mask = 0; ! 1079: map_banks(&RAM_empty_bank, bankstart[0]>>16, NEXT_ram_bank_size >> 16); ! 1080: write_log("Mapping main memory bank0 at $%08x: empty\n", bankstart[0]); ! 1081: } ! 1082: ! 1083: if (nNewNEXTMemSize[1]) { ! 1084: NEXT_ram_bank1_mask = NEXT_ram_bank_mask|((nNewNEXTMemSize[1]<<20)-1); ! 1085: map_banks(&RAM_bank1, bankstart[1]>>16, NEXT_ram_bank_size >> 16); ! 1086: write_log("Mapping main memory bank1 at $%08x: %iMB\n", bankstart[1], nNewNEXTMemSize[1]); ! 1087: } else { ! 1088: NEXT_ram_bank1_mask = 0; ! 1089: map_banks(&RAM_empty_bank, bankstart[1]>>16, NEXT_ram_bank_size >> 16); ! 1090: write_log("Mapping main memory bank1 at $%08x: empty\n", bankstart[1]); ! 1091: } ! 1092: ! 1093: if (nNewNEXTMemSize[2]) { ! 1094: NEXT_ram_bank2_mask = NEXT_ram_bank_mask|((nNewNEXTMemSize[2]<<20)-1); ! 1095: map_banks(&RAM_bank2, bankstart[2]>>16, NEXT_ram_bank_size >> 16); ! 1096: write_log("Mapping main memory bank2 at $%08x: %iMB\n", bankstart[2], nNewNEXTMemSize[2]); ! 1097: } else { ! 1098: NEXT_ram_bank2_mask = 0; ! 1099: map_banks(&RAM_empty_bank, bankstart[2]>>16, NEXT_ram_bank_size >> 16); ! 1100: write_log("Mapping main memory bank2 at $%08x: empty\n", bankstart[2]); ! 1101: } ! 1102: ! 1103: if (nNewNEXTMemSize[3]) { ! 1104: NEXT_ram_bank3_mask = NEXT_ram_bank_mask|((nNewNEXTMemSize[3]<<20)-1); ! 1105: map_banks(&RAM_bank3, bankstart[3]>>16, NEXT_ram_bank_size >> 16); ! 1106: write_log("Mapping main memory bank3 at $%08x: %iMB\n", bankstart[3], nNewNEXTMemSize[3]); ! 1107: } else { ! 1108: NEXT_ram_bank3_mask = 0; ! 1109: map_banks(&RAM_empty_bank, bankstart[3]>>16, NEXT_ram_bank_size >> 16); ! 1110: write_log("Mapping main memory bank3 at $%08x: empty\n", bankstart[3]); ! 1111: } ! 1112: ! 1113: /* Map mirrors of main memory for memory write functions */ ! 1114: if (!ConfigureParams.System.bColor && !ConfigureParams.System.bTurbo) { ! 1115: map_banks(&RAM_mwf_bank, NEXT_RAM_MWF0_START>>16, (NEXT_RAM_BANK_MAX*N_BANKS) >> 16); ! 1116: map_banks(&RAM_mwf_bank, NEXT_RAM_MWF1_START>>16, (NEXT_RAM_BANK_MAX*N_BANKS) >> 16); ! 1117: map_banks(&RAM_mwf_bank, NEXT_RAM_MWF2_START>>16, (NEXT_RAM_BANK_MAX*N_BANKS) >> 16); ! 1118: map_banks(&RAM_mwf_bank, NEXT_RAM_MWF3_START>>16, (NEXT_RAM_BANK_MAX*N_BANKS) >> 16); ! 1119: write_log("Mapping mirrors of main memory for memory write functions:\n"); ! 1120: for (i = 0; i<4; i++) ! 1121: write_log("Function%i at $%08X\n",i,0x10000000+0x04000000*i); ! 1122: } ! 1123: ! 1124: /* Map video memory */ ! 1125: if (ConfigureParams.System.bTurbo && ConfigureParams.System.bColor) { ! 1126: map_banks(&VRAM_color_bank, NEXT_VRAM_TURBO_START>>16, NEXT_VRAM_COLOR_SIZE >> 16); ! 1127: write_log("Mapping video memory at $%08x: %ikB\n", NEXT_VRAM_TURBO_START, NEXT_VRAM_COLOR_SIZE/1024); ! 1128: } else if (ConfigureParams.System.bTurbo) { ! 1129: map_banks(&VRAM_bank, NEXT_VRAM_TURBO_START>>16, NEXT_VRAM_SIZE >> 16); ! 1130: write_log("Mapping video memory at $%08x: %ikB\n", NEXT_VRAM_TURBO_START, NEXT_VRAM_SIZE/1024); ! 1131: } else if (ConfigureParams.System.bColor) { ! 1132: map_banks(&VRAM_color_bank, NEXT_VRAM_COLOR_START>>16, NEXT_VRAM_COLOR_SIZE >> 16); ! 1133: write_log("Mapping video memory at $%08x: %ikB\n", NEXT_VRAM_COLOR_START, NEXT_VRAM_COLOR_SIZE/1024); ! 1134: } else { ! 1135: map_banks(&VRAM_bank, NEXT_VRAM_START>>16, NEXT_VRAM_SIZE >> 16); ! 1136: write_log("Mapping video memory at $%08x: %ikB\n", NEXT_VRAM_START, NEXT_VRAM_SIZE/1024); ! 1137: ! 1138: map_banks(&VRAM_mwf_bank, NEXT_VRAM_MWF0_START>>16, NEXT_VRAM_SIZE >> 16); ! 1139: map_banks(&VRAM_mwf_bank, NEXT_VRAM_MWF1_START>>16, NEXT_VRAM_SIZE >> 16); ! 1140: map_banks(&VRAM_mwf_bank, NEXT_VRAM_MWF2_START>>16, NEXT_VRAM_SIZE >> 16); ! 1141: map_banks(&VRAM_mwf_bank, NEXT_VRAM_MWF3_START>>16, NEXT_VRAM_SIZE >> 16); ! 1142: write_log("Mapping mirrors of video memory for memory write functions:\n"); ! 1143: for (i = 0; i<4; i++) ! 1144: write_log("Function%i at $%08X\n",i,0x0C000000+0x01000000*i); ! 1145: } ! 1146: ! 1147: /* Map device space */ ! 1148: map_banks(&IO_bank, NEXT_IO_START >> 16, NEXT_IO_SIZE>>16); ! 1149: write_log("Mapping device space at $%08X\n", NEXT_IO_START); ! 1150: ! 1151: if (ConfigureParams.System.nMachineType != NEXT_CUBE030) { ! 1152: map_banks(&IO_bank, NEXT_IO_BMAP_START >> 16, NEXT_IO_SIZE>>16); ! 1153: if (!ConfigureParams.System.bTurbo) { ! 1154: map_banks(&BMAP_bank, NEXT_BMAP_START >> 16, NEXT_BMAP_MAP_SIZE>>16); ! 1155: map_banks(&BMAP_bank, (0x80000000|NEXT_BMAP_START) >> 16, NEXT_BMAP_MAP_SIZE>>16); ! 1156: write_log("Mapping BMAP device space at $%08X\n", NEXT_IO_BMAP_START); ! 1157: } else { ! 1158: write_log("Mapping device space at $%08X\n", NEXT_IO_BMAP_START); ! 1159: } ! 1160: } ! 1161: bmap_init(); ! 1162: ! 1163: if (ConfigureParams.System.bTurbo) { ! 1164: map_banks(&TMC_bank, NEXT_IO_TMC_START >> 16, NEXT_IO_SIZE>>16); ! 1165: write_log("Mapping TMC device space at $%08X\n", NEXT_IO_TMC_START); ! 1166: ! 1167: if (ConfigureParams.System.nCpuFreq==40) { ! 1168: map_banks(&dummy_bank, NEXT_CACHE_START>>16, NEXT_CACHE_SIZE>>16); ! 1169: write_log("Mapping cache memory at $%08x: %ikB\n", NEXT_CACHE_START, NEXT_CACHE_SIZE/1024); ! 1170: map_banks(&dummy_bank, NEXT_CACHE_TAG_START>>16, NEXT_CACHE_TAG_SIZE>>16); ! 1171: write_log("Mapping cache tag memory at $%08x: %ikB\n", NEXT_CACHE_TAG_START, NEXT_CACHE_TAG_SIZE/1024); ! 1172: } ! 1173: } ! 1174: ! 1175: /* Map NBIC and board spaces via NextBus */ ! 1176: if (ConfigureParams.System.nMachineType!=NEXT_STATION && ConfigureParams.System.bNBIC) { ! 1177: if (!ConfigureParams.System.bTurbo) { ! 1178: map_banks(&NBIC_bank, NEXT_NBIC_START>>16, NEXT_NBIC_MAP_SIZE>>16); ! 1179: write_log("Mapping NextBus interface chip at $%08x\n", NEXT_NBIC_START); ! 1180: } ! 1181: for (i = 2; i < 8; i++) { ! 1182: if (i==8 && ConfigureParams.System.nMachineType!=NEXT_CUBE030 && !ConfigureParams.System.bTurbo) { ! 1183: /* FIXME: conflict with BMAP. Implement: only SCR2 ROM_OVERLAY enables NBIC */ ! 1184: continue; ! 1185: } ! 1186: map_banks(&NEXTBUS_board_bank, NEXTBUS_BOARD_START(i)>>16, NEXTBUS_BOARD_SIZE>>16); ! 1187: write_log("Mapping NextBus board memory for slot %i at $%08x\n", i, NEXTBUS_BOARD_START(i)); ! 1188: } ! 1189: for (i = 0; i < 16; i++) { ! 1190: map_banks(&NEXTBUS_slot_bank, NEXTBUS_SLOT_START(i)>>16, NEXTBUS_SLOT_SIZE>>16); ! 1191: } ! 1192: write_log("Mapping NextBus slot memory at $%08x\n", NEXTBUS_SLOT_START(i)); ! 1193: } ! 1194: nextbus_init(); ! 1195: ! 1196: ROMmemory=NEXTRom; ! 1197: IOmemory=NEXTIo; ! 1198: ! 1199: { ! 1200: FILE* fin; ! 1201: int ret; ! 1202: /* Loading ROM depending on emulated system */ ! 1203: if(ConfigureParams.System.nMachineType == NEXT_CUBE030) ! 1204: fin=fopen(ConfigureParams.Rom.szRom030FileName,"rb"); ! 1205: else if(ConfigureParams.System.bTurbo == true) ! 1206: fin=fopen(ConfigureParams.Rom.szRomTurboFileName,"rb"); ! 1207: else ! 1208: fin=fopen(ConfigureParams.Rom.szRom040FileName, "rb"); ! 1209: ! 1210: if (fin==NULL) { ! 1211: return "Cannot open ROM file"; ! 1212: } ! 1213: ! 1214: ret=fread(ROMmemory,1,0x20000,fin); ! 1215: ! 1216: write_log("Read ROM %d\n",ret); ! 1217: fclose(fin); ! 1218: } ! 1219: ! 1220: { ! 1221: int i; ! 1222: for (i=0;i<sizeof(NEXTVideo);i++) NEXTVideo[i]=0; ! 1223: for (i=0;i<sizeof(NEXTRam);i++) NEXTRam[i]=0; ! 1224: for (i=0;i<sizeof(NEXTIo);i++) NEXTIo[i]=0; ! 1225: } ! 1226: ! 1227: IoMem_Init(); ! 1228: ! 1229: return NULL; ! 1230: } ! 1231: ! 1232: ! 1233: /* ! 1234: * Uninitialize the memory banks. ! 1235: */ ! 1236: void memory_uninit (void) ! 1237: { ! 1238: } ! 1239: ! 1240: ! 1241: void map_banks (addrbank *bank, int start, int size) ! 1242: { ! 1243: int bnr; ! 1244: ! 1245: for (bnr = start; bnr < start + size; bnr++) ! 1246: put_mem_bank (bnr << 16, bank); ! 1247: return; ! 1248: } ! 1249: ! 1250: void memory_hardreset (void) ! 1251: { ! 1252: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.