summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/konami/konamigq.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/konami/konamigq.cpp')
-rw-r--r--src/mame/konami/konamigq.cpp146
1 files changed, 91 insertions, 55 deletions
diff --git a/src/mame/konami/konamigq.cpp b/src/mame/konami/konamigq.cpp
index 6f58e57178d..b7540e8c3a9 100644
--- a/src/mame/konami/konamigq.cpp
+++ b/src/mame/konami/konamigq.cpp
@@ -69,21 +69,23 @@
*/
#include "emu.h"
-#include "bus/scsi/scsi.h"
-#include "bus/scsi/scsihd.h"
+
+#include "bus/nscsi/hd.h"
#include "cpu/m68000/m68000.h"
#include "cpu/psx/psx.h"
#include "cpu/tms57002/tms57002.h"
-#include "machine/am53cf96.h"
#include "machine/eepromser.h"
#include "machine/mb89371.h"
+#include "machine/ncr53c90.h"
#include "machine/ram.h"
#include "sound/k054539.h"
#include "sound/k056800.h"
#include "video/psx.h"
+
#include "screen.h"
#include "speaker.h"
+#include "endianness.h"
#include "multibyte.h"
@@ -97,7 +99,7 @@ public:
m_maincpu(*this, "maincpu"),
m_soundcpu(*this, "soundcpu"),
m_dasp(*this, "dasp"),
- m_am53cf96(*this, "am53cf96"),
+ m_ncr53cf96(*this, "scsi:7:ncr53cf96"),
m_k056800(*this, "k056800"),
m_pcmram(*this, "pcmram")
{
@@ -106,19 +108,27 @@ public:
void konamigq(machine_config &config);
protected:
- virtual void machine_start() override;
+ virtual void machine_start() override ATTR_COLD;
+ virtual void machine_reset() override ATTR_COLD;
private:
+ emu_timer *m_dma_timer;
+
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_soundcpu;
required_device<tms57002_device> m_dasp;
- required_device<am53cf96_device> m_am53cf96;
+ required_device<ncr53cf96_device> m_ncr53cf96;
required_device<k056800_device> m_k056800;
required_shared_ptr<uint8_t> m_pcmram;
- uint8_t m_sector_buffer[ 512 ]{};
- uint8_t m_sound_ctrl = 0;
- uint8_t m_sound_intck = 0;
+ uint8_t m_sound_ctrl;
+ uint8_t m_sound_intck;
+
+ uint32_t *m_dma_data_ptr;
+ uint32_t m_dma_offset;
+ int32_t m_dma_size;
+ bool m_dma_is_write;
+ bool m_dma_requested;
void eeprom_w(uint16_t data);
void pcmram_w(offs_t offset, uint8_t data);
@@ -128,12 +138,16 @@ private:
INTERRUPT_GEN_MEMBER(tms_sync);
void k054539_irq_gen(int state);
+ TIMER_CALLBACK_MEMBER(scsi_dma_transfer);
+
void scsi_dma_read( uint32_t *p_n_psxram, uint32_t n_address, int32_t n_size );
void scsi_dma_write( uint32_t *p_n_psxram, uint32_t n_address, int32_t n_size );
- void konamigq_dasp_map(address_map &map);
- void konamigq_k054539_map(address_map &map);
- void konamigq_map(address_map &map);
- void konamigq_sound_map(address_map &map);
+ void scsi_drq(int state);
+
+ void konamigq_dasp_map(address_map &map) ATTR_COLD;
+ void konamigq_k054539_map(address_map &map) ATTR_COLD;
+ void konamigq_map(address_map &map) ATTR_COLD;
+ void konamigq_sound_map(address_map &map) ATTR_COLD;
};
/* EEPROM */
@@ -173,7 +187,7 @@ uint8_t konamigq_state::pcmram_r(offs_t offset)
void konamigq_state::konamigq_map(address_map &map)
{
- map(0x1f000000, 0x1f00001f).rw(m_am53cf96, FUNC(am53cf96_device::read), FUNC(am53cf96_device::write)).umask32(0x00ff00ff);
+ map(0x1f000000, 0x1f00001f).m(m_ncr53cf96, FUNC(ncr53cf96_device::map)).umask16(0x00ff);
map(0x1f100000, 0x1f10001f).rw(m_k056800, FUNC(k056800_device::host_r), FUNC(k056800_device::host_w)).umask32(0x00ff00ff);
map(0x1f180000, 0x1f180001).w(FUNC(konamigq_state::eeprom_w));
map(0x1f198000, 0x1f198003).nopw(); /* cabinet lamps? */
@@ -269,43 +283,63 @@ void konamigq_state::k054539_irq_gen(int state)
void konamigq_state::scsi_dma_read( uint32_t *p_n_psxram, uint32_t n_address, int32_t n_size )
{
- uint8_t *sector_buffer = m_sector_buffer;
- int i;
- int n_this;
+ m_dma_data_ptr = p_n_psxram;
+ m_dma_offset = n_address;
+ m_dma_size = n_size * 4;
+ m_dma_is_write = false;
+ m_dma_timer->adjust(attotime::zero);
+}
+
+void konamigq_state::scsi_dma_write( uint32_t *p_n_psxram, uint32_t n_address, int32_t n_size )
+{
+ m_dma_data_ptr = p_n_psxram;
+ m_dma_offset = n_address;
+ m_dma_size = n_size * 4;
+ m_dma_is_write = true;
+ m_dma_timer->adjust(attotime::zero);
+}
- while( n_size > 0 )
+TIMER_CALLBACK_MEMBER(konamigq_state::scsi_dma_transfer)
+{
+ // TODO: Figure out proper DMA timings
+ while (m_dma_requested && m_dma_data_ptr != nullptr && m_dma_size > 0)
{
- if( n_size > sizeof( m_sector_buffer ) / 4 )
- {
- n_this = sizeof( m_sector_buffer ) / 4;
- }
+ if (m_dma_is_write)
+ m_ncr53cf96->dma_w(util::little_endian_cast<const uint8_t>(m_dma_data_ptr)[m_dma_offset]);
else
- {
- n_this = n_size;
- }
- m_am53cf96->dma_read_data( n_this * 4, sector_buffer );
- n_size -= n_this;
-
- i = 0;
- while( n_this > 0 )
- {
- p_n_psxram[ n_address / 4 ] = get_u32le( &sector_buffer[ i ] );
- n_address += 4;
- i += 4;
- n_this--;
- }
+ util::little_endian_cast<uint8_t>(m_dma_data_ptr)[m_dma_offset] = m_ncr53cf96->dma_r();
+
+ m_dma_offset++;
+ m_dma_size--;
}
}
-void konamigq_state::scsi_dma_write( uint32_t *p_n_psxram, uint32_t n_address, int32_t n_size )
+void konamigq_state::scsi_drq(int state)
{
+ if (!m_dma_requested && state)
+ m_dma_timer->adjust(attotime::zero);
+
+ m_dma_requested = state;
}
void konamigq_state::machine_start()
{
- save_item(NAME(m_sector_buffer));
save_item(NAME(m_sound_ctrl));
save_item(NAME(m_sound_intck));
+
+ m_dma_timer = timer_alloc(FUNC(konamigq_state::scsi_dma_transfer), this);
+}
+
+void konamigq_state::machine_reset()
+{
+ m_sound_ctrl = 0;
+ m_sound_intck = 0;
+
+ m_dma_timer->adjust(attotime::never);
+ m_dma_data_ptr = nullptr;
+ m_dma_offset = 0;
+ m_dma_size = 0;
+ m_dma_requested = m_dma_is_write = false;
}
void konamigq_state::konamigq(machine_config &config)
@@ -328,12 +362,15 @@ void konamigq_state::konamigq(machine_config &config)
EEPROM_93C46_16BIT(config, "eeprom").default_data(konamigq_def_eeprom, 128);
- scsi_port_device &scsi(SCSI_PORT(config, "scsi", 0));
- scsi.set_slot_device(1, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_0));
-
- AM53CF96(config, m_am53cf96, 0);
- m_am53cf96->set_scsi_port("scsi");
- m_am53cf96->irq_handler().set("maincpu:irq", FUNC(psxirq_device::intin10));
+ NSCSI_BUS(config, "scsi");
+ NSCSI_CONNECTOR(config, "scsi:0").option_set("harddisk", NSCSI_HARDDISK);
+ NSCSI_CONNECTOR(config, "scsi:7").option_set("ncr53cf96", NCR53CF96).clock(32_MHz_XTAL/2).machine_config(
+ [this] (device_t *device)
+ {
+ ncr53cf96_device &adapter = downcast<ncr53cf96_device &>(*device);
+ adapter.irq_handler_cb().set(":maincpu:irq", FUNC(psxirq_device::intin10));
+ adapter.drq_handler_cb().set(*this, FUNC(konamigq_state::scsi_drq));
+ });
/* video hardware */
CXD8538Q(config, "gpu", XTAL(53'693'175), 0x200000, subdevice<psxcpu_device>("maincpu")).set_screen("screen");
@@ -341,8 +378,7 @@ void konamigq_state::konamigq(machine_config &config)
SCREEN(config, "screen", SCREEN_TYPE_RASTER);
/* sound hardware */
- SPEAKER(config, "lspeaker").front_left();
- SPEAKER(config, "rspeaker").front_right();
+ SPEAKER(config, "speaker", 2).front();
K056800(config, m_k056800, XTAL(18'432'000));
m_k056800->int_callback().set_inputline(m_soundcpu, M68K_IRQ_1);
@@ -350,13 +386,13 @@ void konamigq_state::konamigq(machine_config &config)
k054539_device &k054539_1(K054539(config, "k054539_1", XTAL(18'432'000)));
k054539_1.set_addrmap(0, &konamigq_state::konamigq_k054539_map);
k054539_1.timer_handler().set(FUNC(konamigq_state::k054539_irq_gen));
- k054539_1.add_route(0, "lspeaker", 1.0);
- k054539_1.add_route(1, "rspeaker", 1.0);
+ k054539_1.add_route(0, "speaker", 1.0, 0);
+ k054539_1.add_route(1, "speaker", 1.0, 1);
k054539_device &k054539_2(K054539(config, "k054539_2", XTAL(18'432'000)));
k054539_2.set_addrmap(0, &konamigq_state::konamigq_k054539_map);
- k054539_2.add_route(0, "lspeaker", 1.0);
- k054539_2.add_route(1, "rspeaker", 1.0);
+ k054539_2.add_route(0, "speaker", 1.0, 0);
+ k054539_2.add_route(1, "speaker", 1.0, 1);
}
static INPUT_PORTS_START( konamigq )
@@ -435,12 +471,12 @@ static INPUT_PORTS_START( konamigq )
PORT_DIPSETTING( 0x00, "Independent" )
PORT_BIT( 0x00000040, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x00000080, IP_ACTIVE_LOW, IPT_UNKNOWN )
- PORT_BIT( 0x00010000, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, do_read)
+ PORT_BIT( 0x00010000, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("eeprom", FUNC(eeprom_serial_93cxx_device::do_read))
PORT_START( "EEPROMOUT" )
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, di_write)
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, cs_write)
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, clk_write)
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("eeprom", FUNC(eeprom_serial_93cxx_device::di_write))
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("eeprom", FUNC(eeprom_serial_93cxx_device::cs_write))
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("eeprom", FUNC(eeprom_serial_93cxx_device::clk_write))
INPUT_PORTS_END
ROM_START( cryptklr )
@@ -453,7 +489,7 @@ ROM_START( cryptklr )
ROM_REGION32_LE( 0x080000, "maincpu:rom", 0 ) /* bios */
ROM_LOAD( "420b03.27p", 0x0000000, 0x080000, CRC(aab391b1) SHA1(bf9dc7c0c8168c22a4be266fe6a66d3738df916b) )
- DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":harddisk" )
+ DISK_REGION( "scsi:0:harddisk" )
DISK_IMAGE( "420uaa04", 0, SHA1(67cb1418fc0de2a89fc61847dc9efb9f1bebb347) )
ROM_END