diff options
author | 2023-04-20 16:24:11 +0200 | |
---|---|---|
committer | 2023-04-20 16:24:11 +0200 | |
commit | d8f4411f3955d9c7f45e637ceffbb71462a8bcd2 (patch) | |
tree | e7112427668bc34d4dd43a09c675cfba8efb5033 /src/devices/video/huc6272.cpp | |
parent | a4732500a5d72b86bcb89a97fb7c1e4c8052d6b4 (diff) |
v810/v810.cpp: separate irqs into individual lines as a PoC (#11088)
Allows pcfx to detect a CD as Audio (needs TOC/Mode Select (10) fixes for actual PC-FX detection, uses t10mmc.cpp under the hood).
- v810/v810.cpp: fix device_reset behaviour;
- v810/v810.cpp: fix MPYHW opcode, makes redalert/redalertj not to crash on attract/gameplay;
- nintendo/vboy.cpp: fix screen type to LCD until we have an actual LED class;
- nintendo/vboy.cpp: fix spaceinv gameplay shots display;
- nintendo/vboy.cpp: fix bg page offsets for hyperfgt;
- video/huc6272.cpp: hookup SCSI cmd readback;
Diffstat (limited to 'src/devices/video/huc6272.cpp')
-rw-r--r-- | src/devices/video/huc6272.cpp | 53 |
1 files changed, 33 insertions, 20 deletions
diff --git a/src/devices/video/huc6272.cpp b/src/devices/video/huc6272.cpp index 781bf0a2c91..bd046584f42 100644 --- a/src/devices/video/huc6272.cpp +++ b/src/devices/video/huc6272.cpp @@ -6,12 +6,12 @@ TODO: - Use NSCSI instead of legacy one; + \- SEL acknowledges with 0x84, bit 7 controller type is unknown at this time + (bit 2 should select the CD drive); - Convert base mapping to address_map; - Convert I/O to space address, and make it honor mem_mask; - subclass "SCSICD" into SCSI-2 "CD-ROM DRIVE:FX" - \- Crashes if CD-ROM is in, on unhandled command 0x28 "Read(10)". - Tries to LBA with 0xffff'ff7a and 0 after failing a custom mode sense, - prior TOC tests makes even less sense, CPU core bug? + \- Fails detection of PC-FX discs, detects as normal audio CDs; \- During POST it tries an unhandled 0x44 "Read Header"; \- Derivative design of PCE drive, which in turn is a derivative of PC-8801-30 (cd drive) and PC-8801-31 (interface); @@ -70,7 +70,7 @@ void huc6272_device::amap(address_map &map) void huc6272_device::io_map(address_map &map) { map(0x00, 0x00).rw(FUNC(huc6272_device::scsi_data_r), FUNC(huc6272_device::scsi_data_w)); - map(0x01, 0x01).w(FUNC(huc6272_device::scsi_initiate_cmd_w)); + map(0x01, 0x01).rw(FUNC(huc6272_device::scsi_cmd_status_r), FUNC(huc6272_device::scsi_initiate_cmd_w)); // map(0x02, 0x02) SCSI DMA mode map(0x03, 0x03).w(FUNC(huc6272_device::scsi_target_cmd_w)); map(0x05, 0x05).rw(FUNC(huc6272_device::scsi_bus_r), FUNC(huc6272_device::scsi_bus_w)); @@ -135,22 +135,23 @@ void huc6272_device::io_map(address_map &map) //------------------------------------------------- huc6272_device::huc6272_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, HUC6272, tag, owner, clock), - device_memory_interface(mconfig, *this), - m_huc6271(*this, finder_base::DUMMY_TAG), - m_cdda_l(*this, "cdda_l"), - m_cdda_r(*this, "cdda_r"), - m_program_space_config("microprg", ENDIANNESS_LITTLE, 16, 4, 0, address_map_constructor(FUNC(huc6272_device::microprg_map), this)), - m_data_space_config("kram", ENDIANNESS_LITTLE, 32, 21, 0, address_map_constructor(FUNC(huc6272_device::kram_map), this)), - m_io_space_config("io", ENDIANNESS_LITTLE, 32, 7, -2, address_map_constructor(FUNC(huc6272_device::io_map), this)), - m_microprg_ram(*this, "microprg_ram"), - m_kram_page0(*this, "kram_page0"), - m_kram_page1(*this, "kram_page1"), - m_scsibus(*this, "scsi"), - m_scsi_data_in(*this, "scsi_data_in"), - m_scsi_data_out(*this, "scsi_data_out"), - m_scsi_ctrl_in(*this, "scsi_ctrl_in"), - m_irq_changed_cb(*this) + : device_t(mconfig, HUC6272, tag, owner, clock) + , device_memory_interface(mconfig, *this) + , m_huc6271(*this, finder_base::DUMMY_TAG) + , m_cdda_l(*this, "cdda_l") + , m_cdda_r(*this, "cdda_r") + , m_program_space_config("microprg", ENDIANNESS_LITTLE, 16, 4, 0, address_map_constructor(FUNC(huc6272_device::microprg_map), this)) + , m_data_space_config("kram", ENDIANNESS_LITTLE, 32, 21, 0, address_map_constructor(FUNC(huc6272_device::kram_map), this)) + , m_io_space_config("io", ENDIANNESS_LITTLE, 32, 7, -2, address_map_constructor(FUNC(huc6272_device::io_map), this)) + , m_microprg_ram(*this, "microprg_ram") + , m_kram_page0(*this, "kram_page0") + , m_kram_page1(*this, "kram_page1") + , m_scsibus(*this, "scsi") + , m_scsi_data_in(*this, "scsi_data_in") + , m_scsi_data_out(*this, "scsi_data_out") + , m_scsi_ctrl_in(*this, "scsi_ctrl_in") + , m_scsi_cmd_in(*this, "scsi_cmd_in") + , m_irq_changed_cb(*this) { } @@ -334,6 +335,11 @@ void huc6272_device::scsi_data_w(offs_t offset, u32 data, u32 mem_mask) m_scsi_data_out->write(data & 0xff); } +u32 huc6272_device::scsi_cmd_status_r(offs_t offset) +{ + return m_scsi_cmd_in->read() & 0xff; +} + void huc6272_device::scsi_initiate_cmd_w(offs_t offset, u32 data, u32 mem_mask) { //m_scsibus->write_bsy(BIT(data, 0)); // bus? @@ -731,9 +737,16 @@ void huc6272_device::device_add_mconfig(machine_config &config) scsibus.io_handler().set("scsi_ctrl_in", FUNC(input_buffer_device::write_bit2)); scsibus.sel_handler().set("scsi_ctrl_in", FUNC(input_buffer_device::write_bit1)); + scsibus.rst_handler().append("scsi_cmd_in", FUNC(input_buffer_device::write_bit7)); + scsibus.ack_handler().set("scsi_cmd_in", FUNC(input_buffer_device::write_bit4)); + scsibus.sel_handler().append("scsi_cmd_in", FUNC(input_buffer_device::write_bit2)); + scsibus.atn_handler().set("scsi_cmd_in", FUNC(input_buffer_device::write_bit1)); + scsibus.bsy_handler().append("scsi_cmd_in", FUNC(input_buffer_device::write_bit0)); + output_latch_device &scsiout(OUTPUT_LATCH(config, "scsi_data_out")); scsibus.set_output_latch(scsiout); + INPUT_BUFFER(config, "scsi_cmd_in"); INPUT_BUFFER(config, "scsi_ctrl_in"); INPUT_BUFFER(config, "scsi_data_in"); |