Machines promoted to working

----------------------------
Sony NEWS NWS-3260 [Patrick Mackinlay]
(nw)
* tidy up side effects
* some additional notes
This commit is contained in:
Patrick Mackinlay 2020-04-05 16:05:41 +07:00
parent f1462d0c22
commit 8565eef131
3 changed files with 54 additions and 19 deletions

View File

@ -168,10 +168,15 @@ u8 cxd1185_device::scsi_data_r()
if (!m_pio_data_mode) if (!m_pio_data_mode)
{ {
data = m_fifo.dequeue(); if (!machine().side_effects_disabled())
{
data = m_fifo.dequeue();
if (m_state != IDLE && !m_state_timer->enabled()) if (m_state != IDLE && !m_state_timer->enabled())
m_state_timer->adjust(attotime::zero); m_state_timer->adjust(attotime::zero);
}
else
data = m_fifo.peek();
} }
else else
data = scsi_bus->data_r(); data = scsi_bus->data_r();
@ -185,10 +190,13 @@ template <unsigned Register> u8 cxd1185_device::int_req_r()
{ {
u8 const data = m_int_req[Register]; u8 const data = m_int_req[Register];
LOGMASKED(LOG_REG, "int_req_r<%d> 0x%02x\n", Register, data); if (!machine().side_effects_disabled())
{
LOGMASKED(LOG_REG, "int_req_r<%d> 0x%02x\n", Register, data);
m_int_req[Register] = 0; m_int_req[Register] = 0;
int_check(); int_check();
}
return data; return data;
} }

View File

@ -7,6 +7,7 @@
* Sources: * Sources:
* *
* TODO * TODO
* - graphics
* - sound * - sound
*/ */
@ -224,7 +225,7 @@ void news_r3k_state::cpu_map(address_map &map)
// 1fcc0007 // sccvect? // 1fcc0007 // sccvect?
map(0x1fd00000, 0x1fd00007).m(m_hid, FUNC(news_hid_hle_device::map)); map(0x1fd00000, 0x1fd00007).m(m_hid, FUNC(news_hid_hle_device::map));
map(0x1fd40000, 0x1fd40003).noprw().umask32(0xffff); // FIXME: ignore buzzer for now map(0x1fd40000, 0x1fd40003).noprw(); // FIXME: ignore buzzer for now
map(0x1fe00000, 0x1fe0000f).m(m_dma, FUNC(dmac_0448_device::map)); map(0x1fe00000, 0x1fe0000f).m(m_dma, FUNC(dmac_0448_device::map));
map(0x1fe00100, 0x1fe0010f).m(m_scsi, FUNC(cxd1185_device::map)); map(0x1fe00100, 0x1fe0010f).m(m_scsi, FUNC(cxd1185_device::map));
@ -232,6 +233,7 @@ void news_r3k_state::cpu_map(address_map &map)
map(0x1fe00300, 0x1fe00300).lr8([]() { return 0xff; }, "sound_r"); // HACK: disable sound map(0x1fe00300, 0x1fe00300).lr8([]() { return 0xff; }, "sound_r"); // HACK: disable sound
//map(0x1fe00300, 0x1fe00307); // sound //map(0x1fe00300, 0x1fe00307); // sound
map(0x1fe40000, 0x1fe40003).portr("SW2"); map(0x1fe40000, 0x1fe40003).portr("SW2");
//map(0x1fe70000, 0x1fe9ffff).ram(); // ??
map(0x1fe80000, 0x1fe800ff).rom().region("idrom", 0).mirror(0x0003ff00); map(0x1fe80000, 0x1fe800ff).rom().region("idrom", 0).mirror(0x0003ff00);
map(0x1fec0000, 0x1fec0003).rw(m_scc, FUNC(z80scc_device::ab_dc_r), FUNC(z80scc_device::ab_dc_w)); map(0x1fec0000, 0x1fec0003).rw(m_scc, FUNC(z80scc_device::ab_dc_r), FUNC(z80scc_device::ab_dc_w));
@ -339,7 +341,8 @@ void news_r3k_state::int_check()
u32 news_r3k_state::bus_error() u32 news_r3k_state::bus_error()
{ {
irq_w<BERR>(ASSERT_LINE); if (!machine().side_effects_disabled())
irq_w<BERR>(ASSERT_LINE);
return 0; return 0;
} }
@ -361,6 +364,24 @@ void news_r3k_state::itimer(void *ptr, s32 param)
void news_r3k_state::debug_w(u8 data) void news_r3k_state::debug_w(u8 data)
{ {
/*
* The low four bits of this register control the diagnostic LEDs labelled 1-4
* with bit 0 correspondig to LED #1, and a 0 value enabling the LED. A non-
* exhaustive list of diagnostic codes produced by the PROM follows:
*
* 4321 Stage
* ...x EPROM checksum
* ..x. NVRAM test (byte)
* ..xx NVRAM test (word)
* .x.. NVRAM test (dword)
* .x.x read dip-switch SW2
* .xx. write test 0x1fe70000-1fe9ffff?
* .xxx address decode
* x... NVRAM test (dword)
* x..x RAM sizing
* x.x. inventory/boot
*
*/
LOG("debug_w 0x%02x (%s)\n", data, machine().describe_context()); LOG("debug_w 0x%02x (%s)\n", data, machine().describe_context());
for (unsigned i = 0; i < 4; i++) for (unsigned i = 0; i < 4; i++)
@ -382,15 +403,15 @@ void news_r3k_state::common(machine_config &config)
m_cpu->set_addrmap(AS_PROGRAM, &news_r3k_state::cpu_map); m_cpu->set_addrmap(AS_PROGRAM, &news_r3k_state::cpu_map);
m_cpu->set_fpu(mips1_device_base::MIPS_R3010Av4); m_cpu->set_fpu(mips1_device_base::MIPS_R3010Av4);
// 12 SIMM slots // 3 banks of 4x30-pin SIMMs with parity, first bank is soldered
// 30pin 4Mbyte SIMMs with parity?
RAM(config, m_ram); RAM(config, m_ram);
m_ram->set_default_size("16M"); m_ram->set_default_size("16M");
// TODO: confirm each bank supports 4x1M or 4x4M
m_ram->set_extra_options("4M,8M,12M,20M,24M,32M,36M,48M");
DMAC_0448(config, m_dma, 0); DMAC_0448(config, m_dma, 0);
m_dma->set_bus(m_cpu, 0); m_dma->set_bus(m_cpu, 0);
m_dma->out_int_cb().set(FUNC(news_r3k_state::irq_w<DMA>)); m_dma->out_int_cb().set(FUNC(news_r3k_state::irq_w<DMA>));
// TODO: channel 0 scsi
m_dma->dma_r_cb<1>().set(m_fdc, FUNC(upd72067_device::dma_r)); m_dma->dma_r_cb<1>().set(m_fdc, FUNC(upd72067_device::dma_r));
m_dma->dma_w_cb<1>().set(m_fdc, FUNC(upd72067_device::dma_w)); m_dma->dma_w_cb<1>().set(m_fdc, FUNC(upd72067_device::dma_w));
// TODO: channel 2 audio // TODO: channel 2 audio
@ -422,7 +443,6 @@ void news_r3k_state::common(machine_config &config)
m_net->dma_in().set([this](offs_t offset) { return m_net_ram[offset >> 1]; }); m_net->dma_in().set([this](offs_t offset) { return m_net_ram[offset >> 1]; });
m_net->dma_out().set([this](offs_t offset, u16 data, u16 mem_mask) { COMBINE_DATA(&m_net_ram[offset >> 1]); }); m_net->dma_out().set([this](offs_t offset, u16 data, u16 mem_mask) { COMBINE_DATA(&m_net_ram[offset >> 1]); });
// μPD72067, clock?
UPD72067(config, m_fdc, 16_MHz_XTAL); UPD72067(config, m_fdc, 16_MHz_XTAL);
m_fdc->intrq_wr_callback().set(m_dma, FUNC(dmac_0448_device::irq<1>)); m_fdc->intrq_wr_callback().set(m_dma, FUNC(dmac_0448_device::irq<1>));
m_fdc->drq_wr_callback().set(m_dma, FUNC(dmac_0448_device::drq<1>)); m_fdc->drq_wr_callback().set(m_dma, FUNC(dmac_0448_device::drq<1>));
@ -430,6 +450,7 @@ void news_r3k_state::common(machine_config &config)
// scsi bus and devices // scsi bus and devices
NSCSI_BUS(config, m_scsibus); NSCSI_BUS(config, m_scsibus);
// inquiry content for hard disk is "HITACHI DK312C CS01"
NSCSI_CONNECTOR(config, "scsi:0", news_scsi_devices, "harddisk"); NSCSI_CONNECTOR(config, "scsi:0", news_scsi_devices, "harddisk");
NSCSI_CONNECTOR(config, "scsi:1", news_scsi_devices, nullptr); NSCSI_CONNECTOR(config, "scsi:1", news_scsi_devices, nullptr);
NSCSI_CONNECTOR(config, "scsi:2", news_scsi_devices, nullptr); NSCSI_CONNECTOR(config, "scsi:2", news_scsi_devices, nullptr);
@ -459,9 +480,10 @@ void news_r3k_state::common(machine_config &config)
/* /*
* FIXME: the screen is supposed to be an 1120x780 monochrome (black/white) * FIXME: the screen is supposed to be an 1120x780 monochrome (black/white)
* LCD, with an HD64646FS LCD controller. The boot prom is happy if we just * LCD, with an HD64646FS LCD controller. The boot prom is happy if we just
* ignore the LCDC and pretend the screen is 1024 pixels wide. * ignore the LCDC and pretend the screen is 1024 pixels wide. NEWS-OS
* should detect LCD-MONO 1120x780 1 plane; X server changes mode but probe
* and mode change method isn't understood yet.
*/ */
// apparently 1024x768?
SCREEN(config, m_lcd, SCREEN_TYPE_LCD); SCREEN(config, m_lcd, SCREEN_TYPE_LCD);
m_lcd->set_raw(47185920, 1024, 0, 1024, 768, 0, 768); m_lcd->set_raw(47185920, 1024, 0, 1024, 768, 0, 768);
m_lcd->set_screen_update(FUNC(news_r3k_state::screen_update)); m_lcd->set_screen_update(FUNC(news_r3k_state::screen_update));
@ -498,4 +520,4 @@ ROM_START(nws3260)
ROM_END ROM_END
/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */ /* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
COMP(1991, nws3260, 0, 0, nws3260, nws3260, news_r3k_state, init_common, "Sony", "NWS-3260", MACHINE_IS_SKELETON) COMP(1991, nws3260, 0, 0, nws3260, nws3260, news_r3k_state, init_common, "Sony", "NWS-3260", MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_SOUND)

View File

@ -149,12 +149,17 @@ template <news_hid_hle_device::news_hid_device Device> u8 news_hid_hle_device::d
if (m_fifo[Device].empty()) if (m_fifo[Device].empty())
return 0; return 0;
u8 const data = m_fifo[Device].dequeue(); if (!machine().side_effects_disabled())
{
u8 const data = m_fifo[Device].dequeue();
if (m_fifo[Device].empty()) if (m_fifo[Device].empty())
out_irq<Device>(false); out_irq<Device>(false);
return data; return data;
}
else
return m_fifo[Device].peek();
} }
template <news_hid_hle_device::news_hid_device Device> void news_hid_hle_device::reset_w(u8 data) template <news_hid_hle_device::news_hid_device Device> void news_hid_hle_device::reset_w(u8 data)