summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/video/huc6272.cpp
diff options
context:
space:
mode:
author Angelo Salese <angelosa@users.noreply.github.com>2023-04-20 16:24:11 +0200
committer GitHub <noreply@github.com>2023-04-20 16:24:11 +0200
commitd8f4411f3955d9c7f45e637ceffbb71462a8bcd2 (patch)
treee7112427668bc34d4dd43a09c675cfba8efb5033 /src/devices/video/huc6272.cpp
parenta4732500a5d72b86bcb89a97fb7c1e4c8052d6b4 (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.cpp53
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");