|
|
1.1 ! root 1: #include "main.h" ! 2: #include "configuration.h" ! 3: #include "m68000.h" ! 4: #include "sysdeps.h" ! 5: #include "dimension.hpp" ! 6: #include "nd_mem.hpp" ! 7: ! 8: #define write_log printf ! 9: ! 10: /* --------- NEXTDIMENSION MEMORY ---------- */ ! 11: ! 12: /* NeXTdimension board memory */ ! 13: #define ND_RAM_START 0xF8000000 ! 14: #define ND_RAM_SIZE 0x04000000 ! 15: #define ND_RAM_MASK 0x03FFFFFF ! 16: ! 17: #define ND_VRAM_START 0xFE000000 ! 18: #define ND_VRAM_SIZE 0x00400000 ! 19: #define ND_VRAM_MASK 0x003FFFFF ! 20: ! 21: #define ND_EEPROM_START 0xFFF00000 ! 22: #define ND_EEPROM_SIZE 0x00020000 ! 23: #define ND_EEPROM_MASK 0x0001FFFF ! 24: ! 25: /* RAM banks */ ! 26: #define ND_RAM_BANKSIZE 0x01000000 ! 27: #define ND_RAM_BANKMASK 0x03000000 ! 28: ! 29: /* NeXTdimension dither memory */ ! 30: #define ND_DMEM_START 0xFF000000 ! 31: #define ND_DMEM_SIZE 0x00000200 ! 32: #define ND_DMEM_MASK 0x000001FF ! 33: ! 34: /* NeXTdimension board devices */ ! 35: #define ND_IO_START 0xFF800000 ! 36: #define ND_IO_SIZE 0x00004000 ! 37: #define ND_IO_MASK 0x00003FFF ! 38: ! 39: /* NeXTdimension board RAMDAC */ ! 40: #define ND_RAMDAC_START 0xFF200000 ! 41: #define ND_RAMDAC_SIZE 0x00001000 ! 42: #define ND_RAMDAC_MASK 0x00000FFF ! 43: ! 44: /* NeXTdimension board data path */ ! 45: #define ND_DP_START 0xF0000000 ! 46: #define ND_DP_SIZE 0x00001000 ! 47: #define ND_DP_MASK 0x00000FFF ! 48: ! 49: /* NeXTdimension unknown registers */ ! 50: #define ND_CSR_START 0xFF400000 ! 51: #define ND_CSR_SIZE 0x00000200 ! 52: #define ND_CSR_MASK 0x000001FF ! 53: ! 54: /* Function to fix address for ROM access */ ! 55: static uaecptr nd_rom_addr_fix(uaecptr addr) ! 56: { ! 57: #if ND_STEP ! 58: addr >>= 2; ! 59: #else ! 60: addr &= ~3; ! 61: addr |= (addr>>17)&3; ! 62: #endif ! 63: addr &= ND_EEPROM_MASK; ! 64: return addr; ! 65: } ! 66: ! 67: /* Memory banks */ ! 68: ! 69: /* NeXTdimension RAM */ ! 70: ! 71: class ND_RAM : public ND_Addrbank { ! 72: int bank; ! 73: public: ! 74: ND_RAM(NextDimension* nd, int bank) : ND_Addrbank(nd), bank(bank) {} ! 75: ! 76: Uint32 lget(Uint32 addr) { ! 77: addr &= nd->bankmask[bank]; ! 78: return do_get_mem_long(nd->ram + addr); ! 79: } ! 80: ! 81: Uint32 wget(Uint32 addr) { ! 82: addr &= nd->bankmask[bank]; ! 83: return do_get_mem_word(nd->ram + addr); ! 84: } ! 85: ! 86: Uint32 bget(Uint32 addr) { ! 87: addr &= nd->bankmask[bank]; ! 88: return nd->ram[addr]; ! 89: } ! 90: ! 91: void lput(Uint32 addr, Uint32 l) { ! 92: addr &= nd->bankmask[bank]; ! 93: do_put_mem_long(nd->ram + addr, l); ! 94: } ! 95: ! 96: void wput(Uint32 addr, Uint32 w) { ! 97: addr &= nd->bankmask[bank]; ! 98: do_put_mem_word(nd->ram + addr, w); ! 99: } ! 100: ! 101: void bput(Uint32 addr, Uint32 b) { ! 102: addr &= nd->bankmask[bank]; ! 103: nd->ram[addr] = b; ! 104: } ! 105: }; ! 106: ! 107: class ND_Empty : public ND_Addrbank { ! 108: public: ! 109: ND_Empty(NextDimension* nd) : ND_Addrbank(nd) {} ! 110: ! 111: Uint32 lget(Uint32 addr) { ! 112: write_log("[ND] Slot %i: empty memory bank lget at %08X\n", nd->slot,addr); ! 113: return 0; ! 114: } ! 115: ! 116: Uint32 wget(Uint32 addr) { ! 117: write_log("[ND] Slot %i: empty memory bank wget at %08X\n", nd->slot,addr); ! 118: return 0; ! 119: } ! 120: ! 121: Uint32 bget(Uint32 addr) { ! 122: write_log("[ND] Slot %i: empty memory bank bget at %08X\n", nd->slot,addr); ! 123: return 0; ! 124: } ! 125: ! 126: void lput(Uint32 addr, Uint32 l) { ! 127: write_log("[ND] Slot %i: empty memory bank lput at %08X\n", nd->slot,addr); ! 128: } ! 129: ! 130: void wput(Uint32 addr, Uint32 w) { ! 131: write_log("[ND] Slot %i: empty memory bank wput at %08X\n", nd->slot,addr); ! 132: } ! 133: ! 134: void bput(Uint32 addr, Uint32 b) { ! 135: write_log("[ND] Slot %i: empty memory bank bput at %08X\n",nd->slot,addr); ! 136: } ! 137: }; ! 138: ! 139: /* NeXTdimension VRAM */ ! 140: ! 141: class ND_VRAM : public ND_Addrbank { ! 142: public: ! 143: ND_VRAM(NextDimension* nd) : ND_Addrbank(nd) {} ! 144: ! 145: Uint32 lget(Uint32 addr) { ! 146: addr &= ND_VRAM_MASK; ! 147: return do_get_mem_long(nd->vram + addr); ! 148: } ! 149: ! 150: Uint32 wget(Uint32 addr) { ! 151: addr &= ND_VRAM_MASK; ! 152: return do_get_mem_word(nd->vram + addr); ! 153: } ! 154: ! 155: Uint32 bget(Uint32 addr) { ! 156: addr &= ND_VRAM_MASK; ! 157: return nd->vram[addr]; ! 158: } ! 159: ! 160: void lput(Uint32 addr, Uint32 l) { ! 161: addr &= ND_VRAM_MASK; ! 162: do_put_mem_long(nd->vram + addr, l); ! 163: } ! 164: ! 165: void wput(Uint32 addr, Uint32 w) { ! 166: addr &= ND_VRAM_MASK; ! 167: do_put_mem_word(nd->vram + addr, w); ! 168: } ! 169: ! 170: void bput(Uint32 addr, Uint32 b) { ! 171: addr &= ND_VRAM_MASK; ! 172: nd->vram[addr] = b; ! 173: } ! 174: }; ! 175: ! 176: /* NeXTdimension ROM */ ! 177: ! 178: class ND_ROM : public ND_Addrbank { ! 179: public: ! 180: ND_ROM(NextDimension* nd) : ND_Addrbank(nd) {} ! 181: ! 182: Uint32 lget(Uint32 addr) { ! 183: addr = nd_rom_addr_fix(addr); ! 184: return (nd->rom_read(addr) << 24); /* byte lane at msb */ ! 185: } ! 186: ! 187: Uint32 wget(Uint32 addr) { ! 188: addr = nd_rom_addr_fix(addr); ! 189: return (nd->rom_read(addr) << 8); /* byte lane at msb */ ! 190: } ! 191: ! 192: Uint32 bget(Uint32 addr) { ! 193: addr = nd_rom_addr_fix(addr); ! 194: return nd->rom_read(addr); ! 195: } ! 196: ! 197: Uint32 cs8get(Uint32 addr) { ! 198: addr &= ND_EEPROM_MASK; ! 199: return nd->rom[addr]; ! 200: } ! 201: ! 202: void lput(Uint32 addr, Uint32 l) { ! 203: addr = nd_rom_addr_fix(addr); ! 204: nd->rom_write(addr, l >> 24); ! 205: } ! 206: ! 207: void wput(Uint32 addr, Uint32 w) { ! 208: addr = nd_rom_addr_fix(addr); ! 209: nd->rom_write(addr, w >> 8); ! 210: } ! 211: ! 212: void bput(Uint32 addr, Uint32 b) { ! 213: addr = nd_rom_addr_fix(addr); ! 214: nd->rom_write(addr, b); ! 215: } ! 216: }; ! 217: ! 218: /* Unknown register access functions (memory controller step 1) */ ! 219: #if ND_STEP ! 220: ! 221: class ND_CSR : public ND_Addrbank { ! 222: public: ! 223: ND_CSR(NextDimension* nd) : ND_Addrbank(nd) {} ! 224: ! 225: Uint32 lget(Uint32 addr) { ! 226: write_log("[ND] Slot %i: Board CSR lget at %08X\n", nd->slot,addr); ! 227: return 0; ! 228: } ! 229: ! 230: Uint32 wget(Uint32 addr) { ! 231: write_log("[ND] Slot %i: Board CSR wget at %08X\n",nd->slot,addr); ! 232: return 0; ! 233: } ! 234: ! 235: Uint32 bget(Uint32 addr) { ! 236: write_log("[ND] Slot %i: Board CSR bget at %08X\n",nd->slot,addr); ! 237: return 0; ! 238: } ! 239: ! 240: void lput(Uint32 addr, Uint32 l) { ! 241: write_log("[ND] Slot %i: Board CSR lput at %08X: %08X\n",nd->slot,addr,l); ! 242: } ! 243: ! 244: void wput(Uint32 addr, Uint32 w) { ! 245: write_log("[ND] Slot %i: Board CSR wput at %08X: %04X\n",nd->slot,addr,w); ! 246: } ! 247: ! 248: void bput(Uint32 addr, Uint32 b) { ! 249: write_log("[ND] Slot %i: Board CSR bput at %08X: %02X\n",nd->slot,addr,b); ! 250: } ! 251: }; ! 252: #endif ! 253: ! 254: /* NeXTdimension dither memory & datapath */ ! 255: ! 256: class ND_DMEM : public ND_Addrbank { ! 257: public: ! 258: ND_DMEM(NextDimension* nd) : ND_Addrbank(nd) {} ! 259: ! 260: Uint32 lget(Uint32 addr) { ! 261: addr &= ND_DP_MASK; ! 262: return addr < ND_DMEM_SIZE ? do_get_mem_long(nd->dmem + addr) : nd->dp.lget(addr); ! 263: } ! 264: ! 265: Uint32 wget(Uint32 addr) { ! 266: addr &= ND_DP_MASK; ! 267: return addr < ND_DMEM_SIZE ? do_get_mem_word(nd->dmem + addr) : nd->dp.lget(addr); ! 268: } ! 269: ! 270: Uint32 bget(Uint32 addr) { ! 271: addr &= ND_DP_MASK; ! 272: return addr < ND_DMEM_SIZE ? do_get_mem_byte(nd->dmem + addr) : nd->dp.lget(addr); ! 273: } ! 274: ! 275: void lput(Uint32 addr, Uint32 l) { ! 276: addr &= ND_DP_MASK; ! 277: if(addr < ND_DMEM_SIZE) ! 278: do_put_mem_long(nd->dmem + addr, l); ! 279: else ! 280: nd->dp.lput(addr, l); ! 281: } ! 282: ! 283: void wput(Uint32 addr, Uint32 w) { ! 284: addr &= ND_DP_MASK; ! 285: if(addr < ND_DMEM_SIZE) ! 286: do_put_mem_word(nd->dmem + addr, w); ! 287: else ! 288: nd->dp.lput(addr, w); ! 289: } ! 290: ! 291: void bput(Uint32 addr, Uint32 b) { ! 292: addr &= ND_DP_MASK; ! 293: if(addr < ND_DMEM_SIZE) ! 294: do_put_mem_byte(nd->dmem + addr, b); ! 295: else ! 296: nd->dp.lput(addr, b); ! 297: } ! 298: }; ! 299: ! 300: /* Illegal access functions */ ! 301: ! 302: ND_Addrbank::ND_Addrbank(NextDimension* nd) : nd(nd) {} ! 303: ! 304: Uint32 ND_Addrbank::lget(Uint32 addr) { ! 305: write_log("[ND] Slot %i: Illegal lget at %08X\n",nd->slot,addr); ! 306: return 0; ! 307: } ! 308: ! 309: Uint32 ND_Addrbank::wget(Uint32 addr) { ! 310: write_log("[ND] Slot %i: Illegal wget at %08X\n",nd->slot,addr); ! 311: return 0; ! 312: } ! 313: ! 314: Uint32 ND_Addrbank::bget(Uint32 addr) { ! 315: write_log("[ND] Slot %i: Illegal bget at %08X\n",nd->slot,addr); ! 316: return 0; ! 317: } ! 318: ! 319: Uint32 ND_Addrbank::cs8get(Uint32 addr) { ! 320: write_log("[ND] Slot %i: Illegal cs8get at %08X\n",nd->slot,addr); ! 321: return 0; ! 322: } ! 323: ! 324: void ND_Addrbank::lput(Uint32 addr, Uint32 l) { ! 325: write_log("[ND] Slot %i: Illegal lput at %08X\n",nd->slot,addr); ! 326: } ! 327: ! 328: void ND_Addrbank::wput(Uint32 addr, Uint32 w) { ! 329: write_log("[ND] Slot %i: Illegal wput at %08X\n",nd->slot,addr); ! 330: } ! 331: ! 332: void ND_Addrbank::bput(Uint32 addr, Uint32 b) { ! 333: write_log("[ND] Slot %i: Illegal bput at %08X\n",nd->slot,addr); ! 334: } ! 335: ! 336: /* NeXTdimension device space */ ! 337: ! 338: class ND_IO : public ND_Addrbank { ! 339: public: ! 340: ND_IO(NextDimension* nd) : ND_Addrbank(nd) {} ! 341: ! 342: Uint32 lget(Uint32 addr) { ! 343: return nd->mc.read(addr); ! 344: } ! 345: ! 346: Uint32 wget(Uint32 addr) {return 0;} ! 347: ! 348: Uint32 bget(Uint32 addr) {return 0;} ! 349: ! 350: void lput(Uint32 addr, Uint32 l) { ! 351: nd->mc.write(addr, l); ! 352: } ! 353: ! 354: void wput(Uint32 addr, Uint32 w) {} ! 355: void bput(Uint32 addr, Uint32 b) {} ! 356: }; ! 357: ! 358: /* NeXTdimension RAMDAC */ ! 359: ! 360: class ND_RAMDAC : public ND_Addrbank { ! 361: public: ! 362: ND_RAMDAC(NextDimension* nd) : ND_Addrbank(nd) {} ! 363: ! 364: Uint32 lget(Uint32 addr) { ! 365: return bt463_bget(&nd->ramdac, addr) << 24; ! 366: } ! 367: ! 368: Uint32 wget(Uint32 addr) { ! 369: return bt463_bget(&nd->ramdac, addr) << 8; ! 370: } ! 371: ! 372: Uint32 bget(Uint32 addr) { ! 373: return bt463_bget(&nd->ramdac, addr); ! 374: } ! 375: ! 376: void lput(Uint32 addr, Uint32 l) { ! 377: bt463_bput(&nd->ramdac, addr, l >> 24); ! 378: } ! 379: ! 380: void wput(Uint32 addr, Uint32 w) { ! 381: bt463_bput(&nd->ramdac, addr, w >> 8); ! 382: } ! 383: ! 384: void bput(Uint32 addr, Uint32 b) { ! 385: bt463_bput(&nd->ramdac, addr, b); ! 386: } ! 387: }; ! 388: ! 389: void NextDimension::map_banks (ND_Addrbank *bank, int start, int size) { ! 390: for (int bnr = start; bnr < start + size; bnr++) ! 391: nd_put_mem_bank (bnr << 16, bank); ! 392: return; ! 393: } ! 394: ! 395: void NextDimension::init_mem_banks(void) { ! 396: ND_Addrbank* nd_illegal_bank = new ND_Addrbank(this); ! 397: for (int i = 0; i < 65536; i++) ! 398: nd_put_mem_bank(i<<16, nd_illegal_bank); ! 399: } ! 400: ! 401: void NextDimension::mem_init(void) { ! 402: write_log("[ND] Slot %i: Memory init: Memory size: %iMB\n", slot, ! 403: Configuration_CheckDimensionMemory(ConfigureParams.Dimension.board[ND_NUM(slot)].nMemoryBankSize)); ! 404: ! 405: /* Initialize banks with error memory */ ! 406: init_mem_banks(); ! 407: ! 408: /* Clear first 4k of memory for m68k ROM polling code */ ! 409: memset(ram, 0, 4096 * sizeof(Uint8)); ! 410: ! 411: /* Map main memory */ ! 412: ! 413: for(int bank = 0; bank < 4; bank++) { ! 414: if (ConfigureParams.Dimension.board[ND_NUM(slot)].nMemoryBankSize[bank]) { ! 415: bankmask[bank] = ND_RAM_BANKMASK|((ConfigureParams.Dimension.board[ND_NUM(slot)].nMemoryBankSize[bank]<<20)-1); ! 416: map_banks(new ND_RAM(this, bank), (ND_RAM_START+(bank*ND_RAM_BANKSIZE))>>16, ND_RAM_BANKSIZE >> 16); ! 417: write_log("[ND] Slot %i: Mapping main memory bank%d at $%08x: %iMB\n", slot, bank, ! 418: (ND_RAM_START+(bank*ND_RAM_BANKSIZE)), ConfigureParams.Dimension.board[ND_NUM(slot)].nMemoryBankSize[0]); ! 419: } else { ! 420: bankmask[bank] = 0; ! 421: map_banks(new ND_Empty(this), (ND_RAM_START+(bank*ND_RAM_BANKSIZE))>>16, ND_RAM_BANKSIZE >> 16); ! 422: write_log("[ND] Slot %i: Mapping main memory bank%d at $%08x: empty\n", slot, bank, ! 423: (ND_RAM_START+(bank*ND_RAM_BANKSIZE))); ! 424: } ! 425: } ! 426: ! 427: write_log("[ND] Slot %i: Mapping video memory at $%08x: %iMB\n", slot, ! 428: ND_VRAM_START, ND_VRAM_SIZE/(1024*1024)); ! 429: map_banks(new ND_VRAM(this), ND_VRAM_START>>16, (4*ND_VRAM_SIZE)>>16); ! 430: ! 431: write_log("[ND] Slot %i: Mapping ROM at $%08x: %ikB\n", slot, ! 432: ND_EEPROM_START, ND_EEPROM_SIZE/1024); ! 433: map_banks(new ND_ROM(this), ND_EEPROM_START>>16, (ND_EEPROM_SIZE*8)>>16); ! 434: rom_load(); ! 435: ! 436: write_log("[ND] Slot %i: Mapping dither memory and data path at $%08x: %ibyte\n", slot, ! 437: ND_DMEM_START, ND_DMEM_SIZE); ! 438: map_banks(new ND_DMEM(this), ND_DMEM_START>>16, 1); ! 439: ! 440: write_log("[ND] Slot %i: Mapping IO memory at $%08x\n", slot, ND_IO_START); ! 441: map_banks(new ND_IO(this), ND_IO_START>>16, 1); ! 442: ! 443: write_log("[ND] Slot %i: Mapping RAMDAC registers at $%08x\n", slot, ND_RAMDAC_START); ! 444: map_banks(new ND_RAMDAC(this), ND_RAMDAC_START>>16, 1); ! 445: #if ND_STEP ! 446: write_log("[ND] Slot %i: Mapping board CSR at $%08x\n", slot, ND_CSR_START); ! 447: map_banks(new ND_CSR(this), ND_CSR_START>>16, 1); ! 448: #endif ! 449: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.