|
|
1.1 ! root 1: #include "configuration.h" ! 2: #include "m68000.h" ! 3: #include "dimension.hpp" ! 4: #include "nd_nbic.hpp" ! 5: #include "nd_mem.hpp" ! 6: #include "nd_sdl.hpp" ! 7: ! 8: NextDimension::NextDimension(int slot) : ! 9: NextBusBoard(slot), ! 10: sdl(slot, (Uint32*)vram), ! 11: i860(this), ! 12: nbic(slot, ND_NBIC_ID), ! 13: mc(this), ! 14: dp(this), ! 15: dmcd(this), ! 16: dcsc0(this, 0), ! 17: dcsc1(this, 1), ! 18: rom_command(0), ! 19: rom_last_addr(0) ! 20: { ! 21: i860.uninit(); ! 22: nbic.init(); ! 23: mc.init(); ! 24: dp.init(); ! 25: mem_init(); ! 26: i860.init(); ! 27: sdl.init(); ! 28: } ! 29: ! 30: NextDimension::~NextDimension() { ! 31: i860.uninit(); ! 32: sdl.destroy(); ! 33: } ! 34: ! 35: void NextDimension::reset(void) { ! 36: i860.set_run_func(); ! 37: sdl.start_interrupts(); ! 38: } ! 39: ! 40: void NextDimension::pause(bool pause) { ! 41: i860.pause(pause); ! 42: sdl.pause(pause); ! 43: } ! 44: ! 45: /* NeXTdimension board memory access (m68k) */ ! 46: ! 47: Uint32 NextDimension::board_lget(Uint32 addr) { ! 48: addr |= ND_BOARD_BITS; ! 49: Uint32 result = nd68k_longget(addr); ! 50: // (SC) delay m68k read on csr0 while in ROM (CS8=1)to give ND some time to start up. ! 51: if(addr == 0xFF800000 && (result & 0x02)) ! 52: M68000_AddCycles(ConfigureParams.System.nCpuFreq * 100); ! 53: return result; ! 54: } ! 55: ! 56: Uint16 NextDimension::board_wget(Uint32 addr) { ! 57: addr |= ND_BOARD_BITS; ! 58: return nd68k_wordget(addr); ! 59: } ! 60: ! 61: Uint8 NextDimension::board_bget(Uint32 addr) { ! 62: addr |= ND_BOARD_BITS; ! 63: return nd68k_byteget(addr); ! 64: } ! 65: ! 66: void NextDimension::board_lput(Uint32 addr, Uint32 l) { ! 67: addr |= ND_BOARD_BITS; ! 68: nd68k_longput(addr, l); ! 69: } ! 70: ! 71: void NextDimension::board_wput(Uint32 addr, Uint16 w) { ! 72: addr |= ND_BOARD_BITS; ! 73: nd68k_wordput(addr, w); ! 74: } ! 75: ! 76: void NextDimension::board_bput(Uint32 addr, Uint8 b) { ! 77: addr |= ND_BOARD_BITS; ! 78: nd68k_byteput(addr, b); ! 79: } ! 80: ! 81: /* NeXTdimension slot memory access */ ! 82: Uint32 NextDimension::slot_lget(Uint32 addr) { ! 83: addr |= ND_SLOT_BITS; ! 84: ! 85: if (addr<ND_NBIC_SPACE) { ! 86: return nd68k_longget(addr); ! 87: } else { ! 88: return nbic.lget(addr); ! 89: } ! 90: } ! 91: ! 92: Uint16 NextDimension::slot_wget(Uint32 addr) { ! 93: addr |= ND_SLOT_BITS; ! 94: ! 95: if (addr<ND_NBIC_SPACE) { ! 96: return nd68k_wordget(addr); ! 97: } else { ! 98: return nbic.wget(addr); ! 99: } ! 100: } ! 101: ! 102: Uint8 NextDimension::slot_bget(Uint32 addr) { ! 103: addr |= ND_SLOT_BITS; ! 104: ! 105: if (addr<ND_NBIC_SPACE) { ! 106: return nd68k_byteget(addr); ! 107: } else { ! 108: return nbic.bget(addr); ! 109: } ! 110: } ! 111: ! 112: void NextDimension::slot_lput(Uint32 addr, Uint32 l) { ! 113: addr |= ND_SLOT_BITS; ! 114: ! 115: if (addr<ND_NBIC_SPACE) { ! 116: nd68k_longput(addr, l); ! 117: } else { ! 118: nbic.lput(addr, l); ! 119: } ! 120: } ! 121: ! 122: void NextDimension::slot_wput(Uint32 addr, Uint16 w) { ! 123: addr |= ND_SLOT_BITS; ! 124: ! 125: if (addr<ND_NBIC_SPACE) { ! 126: nd68k_wordput(addr, w); ! 127: } else { ! 128: nbic.wput(addr, w); ! 129: } ! 130: } ! 131: ! 132: void NextDimension::slot_bput(Uint32 addr, Uint8 b) { ! 133: addr |= ND_SLOT_BITS; ! 134: ! 135: if (addr<ND_NBIC_SPACE) { ! 136: nd68k_byteput(addr, b); ! 137: } else { ! 138: nbic.bput(addr, b); ! 139: } ! 140: } ! 141: ! 142: void NextDimension::send_msg(int msg) { ! 143: host_lock(&m_port_lock); ! 144: m_port |= msg; ! 145: host_unlock(&m_port_lock); ! 146: } ! 147: ! 148: /* NeXTdimension board memory access (i860) */ ! 149: ! 150: Uint8 NextDimension::i860_cs8get(NextDimension* nd, Uint32 addr) { ! 151: addr |= ND_BOARD_BITS; ! 152: return nd_cs8get(addr); ! 153: } ! 154: ! 155: void NextDimension::i860_rd8_be(NextDimension* nd, Uint32 addr, Uint32* val) { ! 156: addr |= ND_BOARD_BITS; ! 157: *((Uint8*)val) = nd_byteget(addr); ! 158: } ! 159: ! 160: void NextDimension::i860_rd16_be(NextDimension* nd, Uint32 addr, Uint32* val) { ! 161: addr |= ND_BOARD_BITS; ! 162: *((Uint16*)val) = nd_wordget(addr); ! 163: } ! 164: ! 165: void NextDimension::i860_rd32_be(NextDimension* nd, Uint32 addr, Uint32* val) { ! 166: addr |= ND_BOARD_BITS; ! 167: val[0] = nd_longget(addr); ! 168: } ! 169: ! 170: void NextDimension::i860_rd64_be(NextDimension* nd, Uint32 addr, Uint32* val) { ! 171: addr |= ND_BOARD_BITS; ! 172: val[0] = nd_longget(addr+4); ! 173: val[1] = nd_longget(addr+0); ! 174: } ! 175: ! 176: void NextDimension::i860_rd128_be(NextDimension* nd, Uint32 addr, Uint32* val) { ! 177: addr |= ND_BOARD_BITS; ! 178: val[0] = nd_longget(addr+4); ! 179: val[1] = nd_longget(addr+0); ! 180: val[2] = nd_longget(addr+12); ! 181: val[3] = nd_longget(addr+8); ! 182: } ! 183: ! 184: void NextDimension::i860_wr8_be(NextDimension* nd, Uint32 addr, const Uint32* val) { ! 185: addr |= ND_BOARD_BITS; ! 186: nd_byteput(addr, *((const Uint8*)val)); ! 187: } ! 188: ! 189: void NextDimension::i860_wr16_be(NextDimension* nd, Uint32 addr, const Uint32* val) { ! 190: addr |= ND_BOARD_BITS; ! 191: nd_wordput(addr, *((const Uint16*)val)); ! 192: } ! 193: ! 194: void NextDimension::i860_wr32_be(NextDimension* nd, Uint32 addr, const Uint32* val) { ! 195: addr |= ND_BOARD_BITS; ! 196: nd_longput(addr, val[0]); ! 197: } ! 198: ! 199: void NextDimension::i860_wr64_be(NextDimension* nd, Uint32 addr, const Uint32* val) { ! 200: addr |= ND_BOARD_BITS; ! 201: nd_longput(addr+4, val[0]); ! 202: nd_longput(addr+0, val[1]); ! 203: } ! 204: ! 205: void NextDimension::i860_wr128_be(NextDimension* nd, Uint32 addr, const Uint32* val) { ! 206: addr |= ND_BOARD_BITS; ! 207: nd_longput(addr+4, val[0]); ! 208: nd_longput(addr+0, val[1]); ! 209: nd_longput(addr+12, val[2]); ! 210: nd_longput(addr+8, val[3]); ! 211: } ! 212: ! 213: void NextDimension::i860_rd8_le(NextDimension* nd, Uint32 addr, Uint32* val) { ! 214: addr |= ND_BOARD_BITS; ! 215: *((Uint8*)val) = nd_byteget(addr^7); ! 216: } ! 217: ! 218: void NextDimension::i860_rd16_le(NextDimension* nd, Uint32 addr, Uint32* val) { ! 219: addr |= ND_BOARD_BITS; ! 220: *((Uint16*)val) = nd_wordget(addr^6); ! 221: } ! 222: ! 223: void NextDimension::i860_rd32_le(NextDimension* nd, Uint32 addr, Uint32* val) { ! 224: addr |= ND_BOARD_BITS; ! 225: val[0] = nd_longget(addr^4); ! 226: } ! 227: ! 228: void NextDimension::i860_rd64_le(NextDimension* nd, Uint32 addr, Uint32* val) { ! 229: addr |= ND_BOARD_BITS; ! 230: val[0] = nd_longget(addr+0); ! 231: val[1] = nd_longget(addr+4); ! 232: } ! 233: ! 234: void NextDimension::i860_rd128_le(NextDimension* nd, Uint32 addr, Uint32* val) { ! 235: addr |= ND_BOARD_BITS; ! 236: val[0] = nd_longget(addr+0); ! 237: val[1] = nd_longget(addr+4); ! 238: val[2] = nd_longget(addr+8); ! 239: val[3] = nd_longget(addr+12); ! 240: } ! 241: ! 242: void NextDimension::i860_wr8_le(NextDimension* nd, Uint32 addr, const Uint32* val) { ! 243: addr |= ND_BOARD_BITS; ! 244: nd_byteput(addr^7, *((const Uint8*)val)); ! 245: } ! 246: ! 247: void NextDimension::i860_wr16_le(NextDimension* nd, Uint32 addr, const Uint32* val) { ! 248: addr |= ND_BOARD_BITS; ! 249: nd_wordput(addr^6, *((const Uint16*)val)); ! 250: } ! 251: ! 252: void NextDimension::i860_wr32_le(NextDimension* nd, Uint32 addr, const Uint32* val) { ! 253: addr |= ND_BOARD_BITS; ! 254: nd_longput(addr^4, val[0]); ! 255: } ! 256: ! 257: void NextDimension::i860_wr64_le(NextDimension* nd, Uint32 addr, const Uint32* val) { ! 258: addr |= ND_BOARD_BITS; ! 259: nd_longput(addr+0, val[0]); ! 260: nd_longput(addr+4, val[1]); ! 261: } ! 262: ! 263: void NextDimension::i860_wr128_le(NextDimension* nd, Uint32 addr, const Uint32* val) { ! 264: addr |= ND_BOARD_BITS; ! 265: nd_longput(addr+0, val[0]); ! 266: nd_longput(addr+4, val[1]); ! 267: nd_longput(addr+8, val[2]); ! 268: nd_longput(addr+12, val[3]); ! 269: } ! 270: ! 271: /* Message disaptcher - executed on i860 thread, safe to call i860 methods */ ! 272: bool NextDimension::handle_msgs(void) { ! 273: host_lock(&m_port_lock); ! 274: int msg = m_port; ! 275: m_port = 0; ! 276: host_unlock(&m_port_lock); ! 277: ! 278: if(msg & MSG_DISPLAY_BLANK) ! 279: set_blank_state(ND_DISPLAY, host_blank_state(slot, ND_DISPLAY)); ! 280: if(msg & MSG_VIDEO_BLANK) ! 281: set_blank_state(ND_VIDEO, host_blank_state(slot, ND_VIDEO)); ! 282: ! 283: return i860.handle_msgs(msg); ! 284: } ! 285: ! 286: void nd_start_debugger(void) { ! 287: FOR_EACH_SLOT(slot) { ! 288: IF_NEXT_DIMENSION(slot, nd) { ! 289: nd->send_msg(MSG_DBG_BREAK); ! 290: } ! 291: } ! 292: } ! 293: ! 294: extern "C" { ! 295: void nd_display_blank(int slot) { ! 296: ((NextDimension*)nextbus[slot])->send_msg(MSG_DISPLAY_BLANK); ! 297: } ! 298: ! 299: void nd_video_blank(int slot) { ! 300: ((NextDimension*)nextbus[slot])->send_msg(MSG_VIDEO_BLANK); ! 301: } ! 302: ! 303: const char* nd_reports(int slot, double realTime, double hostTime) { ! 304: return ((NextDimension*)nextbus[slot])->i860.reports(realTime, hostTime); ! 305: } ! 306: ! 307: Uint32* nd_vram_for_slot(int slot) { ! 308: IF_NEXT_DIMENSION(slot, nd) ! 309: return (Uint32*)nd->vram; ! 310: else ! 311: return NULL; ! 312: } ! 313: } ! 314: ! 315: ! 316:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.