summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--.gitattributes4
-rw-r--r--src/emu/bus/bus.mak1
-rw-r--r--src/emu/bus/rs232/xvd701.c148
-rw-r--r--src/emu/bus/rs232/xvd701.h42
-rw-r--r--src/emu/machine/fdc37c665gt.c59
-rw-r--r--src/emu/machine/fdc37c665gt.h35
-rw-r--r--src/emu/machine/machine.mak8
-rw-r--r--src/mame/drivers/twinkle.c256
-rw-r--r--src/mame/mame.mak1
9 files changed, 508 insertions, 46 deletions
diff --git a/.gitattributes b/.gitattributes
index 3e520f99c6e..c4b4a3910b2 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1488,6 +1488,8 @@ src/emu/bus/rs232/ser_mouse.c svneol=native#text/plain
src/emu/bus/rs232/ser_mouse.h svneol=native#text/plain
src/emu/bus/rs232/terminal.c svneol=native#text/plain
src/emu/bus/rs232/terminal.h svneol=native#text/plain
+src/emu/bus/rs232/xvd701.c svneol=native#text/plain
+src/emu/bus/rs232/xvd701.h svneol=native#text/plain
src/emu/bus/s100/dj2db.c svneol=native#text/plain
src/emu/bus/s100/dj2db.h svneol=native#text/plain
src/emu/bus/s100/djdma.c svneol=native#text/plain
@@ -2794,6 +2796,8 @@ src/emu/machine/er2055.c svneol=native#text/plain
src/emu/machine/er2055.h svneol=native#text/plain
src/emu/machine/f3853.c svneol=native#text/plain
src/emu/machine/f3853.h svneol=native#text/plain
+src/emu/machine/fdc37c665gt.c svneol=native#text/plain
+src/emu/machine/fdc37c665gt.h svneol=native#text/plain
src/emu/machine/fdc_pll.c svneol=native#text/plain
src/emu/machine/fdc_pll.h svneol=native#text/plain
src/emu/machine/gayle.c svneol=native#text/plain
diff --git a/src/emu/bus/bus.mak b/src/emu/bus/bus.mak
index 60765ec9059..bd71134db31 100644
--- a/src/emu/bus/bus.mak
+++ b/src/emu/bus/bus.mak
@@ -945,6 +945,7 @@ BUSOBJS += $(BUSOBJ)/rs232/printer.o
BUSOBJS += $(BUSOBJ)/rs232/rs232.o
BUSOBJS += $(BUSOBJ)/rs232/ser_mouse.o
BUSOBJS += $(BUSOBJ)/rs232/terminal.o
+BUSOBJS += $(BUSOBJ)/rs232/xvd701.o
endif
#-------------------------------------------------
diff --git a/src/emu/bus/rs232/xvd701.c b/src/emu/bus/rs232/xvd701.c
new file mode 100644
index 00000000000..4484bb2ba36
--- /dev/null
+++ b/src/emu/bus/rs232/xvd701.c
@@ -0,0 +1,148 @@
+#include "xvd701.h"
+
+jvc_xvd701_device::jvc_xvd701_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : device_t(mconfig, JVC_XVD701, "JVC XV-D701", tag, owner, clock, "xvd701", __FILE__),
+ device_serial_interface(mconfig, *this),
+ device_rs232_port_interface(mconfig, *this)
+{
+}
+
+static MACHINE_CONFIG_FRAGMENT(xvd701)
+MACHINE_CONFIG_END
+
+machine_config_constructor jvc_xvd701_device::device_mconfig_additions() const
+{
+ return MACHINE_CONFIG_NAME(xvd701);
+}
+
+static INPUT_PORTS_START(xvd701)
+INPUT_PORTS_END
+
+ioport_constructor jvc_xvd701_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME(xvd701);
+}
+
+void jvc_xvd701_device::device_start()
+{
+ int startbits = 1;
+ int databits = 8;
+ parity_t parity = PARITY_ODD;
+ stop_bits_t stopbits = STOP_BITS_1;
+
+ set_data_frame(startbits, databits, parity, stopbits);
+
+ int txbaud = 9600;
+ set_tra_rate(txbaud);
+
+ int rxbaud = 9600;
+ set_rcv_rate(rxbaud);
+
+ output_rxd(1);
+
+ // TODO: make this configurable
+ output_dcd(0);
+ output_dsr(0);
+ output_ri(0);
+ output_cts(0);
+
+ m_timer_response = timer_alloc(TIMER_RESPONSE);
+}
+
+void jvc_xvd701_device::device_reset()
+{
+ memset(m_command, 0, sizeof(m_command));
+
+ m_response_index = sizeof(m_response);
+}
+
+void jvc_xvd701_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
+{
+ switch (id)
+ {
+ case TIMER_RESPONSE:
+ send_response();
+ break;
+
+ default:
+ device_serial_interface::device_timer(timer, id, param, ptr);
+ }
+}
+
+void jvc_xvd701_device::tra_callback()
+{
+ output_rxd(transmit_register_get_data_bit());
+}
+
+void jvc_xvd701_device::tra_complete()
+{
+ m_timer_response->adjust(attotime::from_msec(100));
+}
+
+unsigned char jvc_xvd701_device::sum(unsigned char *buffer, int length)
+{
+ int sum = 0;
+
+ for (int i = 0; i < length; i++)
+ sum += buffer[i];
+
+ return sum & 0x7f;
+}
+
+void jvc_xvd701_device::send_response()
+{
+ if (m_response_index < sizeof(m_response) && is_transmit_register_empty())
+ {
+// printf("sending %02x\n", m_response[m_response_index]);
+ transmit_register_setup(m_response[m_response_index++]);
+ }
+}
+
+void jvc_xvd701_device::rcv_complete()
+{
+ receive_register_extract();
+
+ for (int i = 0; i < sizeof(m_command) - 1; i++)
+ m_command[i] = m_command[i + 1];
+
+ m_command[sizeof(m_command) - 1] = get_received_char();
+
+ if (m_command[0] == 0xff &&
+ m_command[1] == 0xff &&
+ m_command[2] == 0x21 &&
+ sum(m_command, sizeof(m_command)) == 0)
+ {
+ // printf("xvd701");
+
+ //for (int i = 0; i < sizeof(m_command); i++)
+ // printf(" %02x", m_command[i]);
+
+ //printf("\n");
+
+ // FF FF 21 3E 40 70 00 00 00 00 73 DEVICE ON
+ // FF FF 21 3E 40 60 00 00 00 00 03 DEVICE OFF
+ // FF FF 21 0C 44 60 00 00 00 00 31 STOP
+ // FF FF 21 0C 43 75 00 00 00 00 1D PLAY
+ // FF FF 21 0C 43 6D 00 00 00 00 25 PAUSE
+ // FF FF 21 0C 50 20 00 00 00 00 63 SEEK TO SPECIFIC CHAPTER
+ // FF FF 21 0C 50 73 00 00 00 00 12 FF (SEEK TO NEXT CHAPTER)
+ // FF FF 21 0C 50 61 00 00 00 00 24 PREV (SEEK TO PREVIOUS CHAPTER)
+
+ m_response[0] = 0xff;
+ m_response[1] = 0xfe;
+ m_response[2] = 0x7f;
+ m_response[3] = 0x7e;
+ m_response[4] = 0x7d;
+ m_response[5] = 0x7c;
+ m_response[6] = 0x7b;
+ m_response[7] = 0x7a;
+ m_response[8] = 0x79;
+ m_response[9] = 0x78;
+ m_response[10] = 0x77;
+ m_response_index = 0;
+
+ m_timer_response->adjust(attotime::from_msec(100));
+ }
+}
+
+const device_type JVC_XVD701 = &device_creator<jvc_xvd701_device>;
diff --git a/src/emu/bus/rs232/xvd701.h b/src/emu/bus/rs232/xvd701.h
new file mode 100644
index 00000000000..6c03b0c4710
--- /dev/null
+++ b/src/emu/bus/rs232/xvd701.h
@@ -0,0 +1,42 @@
+#ifndef JVC_XV701_H_
+#define JVC_XV701_H_
+
+#include "rs232.h"
+
+class jvc_xvd701_device : public device_t,
+ public device_serial_interface,
+ public device_rs232_port_interface
+{
+public:
+ jvc_xvd701_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+ virtual machine_config_constructor device_mconfig_additions() const;
+
+ virtual WRITE_LINE_MEMBER( input_txd ) { device_serial_interface::rx_w(state); }
+
+ DECLARE_WRITE_LINE_MEMBER(update_serial);
+
+protected:
+ virtual ioport_constructor device_input_ports() const;
+ virtual void device_start();
+ virtual void device_reset();
+ virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
+
+ virtual void tra_callback();
+ virtual void tra_complete();
+ virtual void rcv_complete();
+
+private:
+ static const int TIMER_RESPONSE = 1;
+
+ void send_response();
+ unsigned char sum(unsigned char *buffer, int length);
+
+ unsigned char m_command[11];
+ unsigned char m_response[11];
+ int m_response_index;
+ emu_timer *m_timer_response;
+};
+
+extern const device_type JVC_XVD701;
+
+#endif
diff --git a/src/emu/machine/fdc37c665gt.c b/src/emu/machine/fdc37c665gt.c
new file mode 100644
index 00000000000..3c69626ca48
--- /dev/null
+++ b/src/emu/machine/fdc37c665gt.c
@@ -0,0 +1,59 @@
+#include "fdc37c665gt.h"
+
+fdc37c665gt_device::fdc37c665gt_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
+ device_t(mconfig, FDC37C665GT, "FDC37C665GT", tag, owner, clock, "fdc37c665gt", __FILE__),
+ m_uart1(*this, "uart1"),
+ m_uart2(*this, "uart2")
+{
+}
+
+READ8_MEMBER(fdc37c665gt_device::read)
+{
+ UINT8 data = 0;
+
+ if ((offset & 0x3f8) == 0x3f8)
+ {
+ data = m_uart1->ins8250_r(space, offset & 7, mem_mask);
+ }
+ else if ((offset & 0x3f8) == 0x2f8)
+ {
+ data = m_uart2->ins8250_r(space, offset & 7, mem_mask);
+ }
+ else
+ {
+ printf("fdc37c665gt_device::read %04x %02x\n", offset, data);
+ }
+ return data;
+}
+
+WRITE8_MEMBER(fdc37c665gt_device::write)
+{
+ if ((offset & 0x3f8) == 0x3f8)
+ {
+ m_uart1->ins8250_w(space, offset & 7, data, mem_mask);
+ }
+ else if ((offset & 0x3f8) == 0x2f8)
+ {
+ m_uart2->ins8250_w(space, offset & 7, data, mem_mask);
+ }
+ else
+ {
+ printf("fdc37c665gt_device::write %04x %02x\n", offset, data);
+ }
+}
+
+void fdc37c665gt_device::device_start()
+{
+}
+
+static MACHINE_CONFIG_FRAGMENT(fdc37c665gt)
+ MCFG_DEVICE_ADD("uart1", NS16550, XTAL_24MHz/13)
+ MCFG_DEVICE_ADD("uart2", NS16550, XTAL_24MHz/13)
+MACHINE_CONFIG_END
+
+machine_config_constructor fdc37c665gt_device::device_mconfig_additions() const
+{
+ return MACHINE_CONFIG_NAME(fdc37c665gt);
+}
+
+const device_type FDC37C665GT = &device_creator<fdc37c665gt_device>;
diff --git a/src/emu/machine/fdc37c665gt.h b/src/emu/machine/fdc37c665gt.h
new file mode 100644
index 00000000000..4002c7ff684
--- /dev/null
+++ b/src/emu/machine/fdc37c665gt.h
@@ -0,0 +1,35 @@
+/*
+* fdc37c665gt.h
+*
+*/
+
+#ifndef _FDC37C665GT_H_
+#define _FDC37C665GT_H_
+
+#pragma once
+
+#include "ins8250.h"
+
+class fdc37c665gt_device : public device_t
+{
+public:
+ // construction/destruction
+ fdc37c665gt_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ DECLARE_READ8_MEMBER(read);
+ DECLARE_WRITE8_MEMBER(write);
+
+protected:
+ // device-level overrides
+ virtual void device_start();
+ virtual machine_config_constructor device_mconfig_additions() const;
+
+private:
+ required_device<ns16550_device> m_uart1;
+ required_device<ns16550_device> m_uart2;
+};
+
+// device type definition
+extern const device_type FDC37C665GT;
+
+#endif
diff --git a/src/emu/machine/machine.mak b/src/emu/machine/machine.mak
index 764d5e01d55..dc8bca8373a 100644
--- a/src/emu/machine/machine.mak
+++ b/src/emu/machine/machine.mak
@@ -1898,3 +1898,11 @@ ifneq ($(filter DIABLO_HD,$(MACHINES)),)
MACHINEOBJS += $(MACHINEOBJ)/diablo_hd.o
endif
+#-------------------------------------------------
+#
+#@src/emu/machine/fdc37c665gt.h,MACHINES += FDC37C665GT
+#-------------------------------------------------
+
+ifneq ($(filter FDC37C665GT,$(MACHINES)),)
+MACHINEOBJS += $(MACHINEOBJ)/fdc37c665gt.o
+endif
diff --git a/src/mame/drivers/twinkle.c b/src/mame/drivers/twinkle.c
index c352545d4b3..8db012f092f 100644
--- a/src/mame/drivers/twinkle.c
+++ b/src/mame/drivers/twinkle.c
@@ -6,13 +6,12 @@ driver by smf and R. Belmont
TODO:
-sound (IDE DMA, finish comms)
-dvd
-hard drive
+dvd check for bmiidx, bmiidxa, bmiidxc & bmiidxca
+finish sound board emulation and remove response hle
+emulate dvd player and video mixing
16seg led font
-
Konami Twinkle Hardware Overview
Konami 1999-2002
@@ -232,11 +231,13 @@ Notes:
#include "video/psx.h"
#include "bus/scsi/scsi.h"
#include "bus/scsi/scsicd.h"
+#include "bus/rs232/xvd701.h"
#include "machine/am53cf96.h"
-#include "machine/rtc65271.h"
+#include "machine/ataintf.h"
+#include "machine/fdc37c665gt.h"
#include "machine/i2cmem.h"
+#include "machine/rtc65271.h"
#include "machine/x76f041.h"
-#include "machine/ataintf.h"
#include "sound/spu.h"
#include "sound/cdda.h"
#include "sound/rf5c400.h"
@@ -247,16 +248,25 @@ public:
twinkle_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_am53cf96(*this, "am53cf96"),
+ m_ata(*this, "ata"),
+ m_rfsnd(*this, "rfsnd"),
+ m_spu_ata_dma(0),
m_maincpu(*this, "maincpu"),
m_audiocpu(*this, "audiocpu")
{
+ m_spu_hle[0x200] = 0;
+ m_spu_hle[0x202] = 0;
}
required_device<am53cf96_device> m_am53cf96;
+ required_device<ata_interface_device> m_ata;
+ required_memory_region m_rfsnd;
UINT16 m_spu_ctrl; // SPU board control register
UINT8 m_spu_shared[0x400]; // SPU/PSX shared dual-ported RAM
- UINT32 m_unknown;
+ UINT8 m_spu_hle[0x400];
+ UINT32 m_spu_ata_dma;
+ int m_spu_ata_dmarq;
int m_io_offset;
int m_output_last[ 0x100 ];
@@ -269,11 +279,14 @@ public:
DECLARE_WRITE8_MEMBER(shared_psx_w);
DECLARE_READ8_MEMBER(shared_psx_r);
DECLARE_WRITE16_MEMBER(twinkle_spu_ctrl_w);
+ DECLARE_WRITE16_MEMBER(spu_ata_dma_low_w);
+ DECLARE_WRITE16_MEMBER(spu_ata_dma_high_w);
DECLARE_READ16_MEMBER(twinkle_waveram_r);
DECLARE_WRITE16_MEMBER(twinkle_waveram_w);
DECLARE_READ16_MEMBER(shared_68k_r);
DECLARE_WRITE16_MEMBER(shared_68k_w);
- DECLARE_WRITE_LINE_MEMBER(ide_interrupt);
+ DECLARE_WRITE_LINE_MEMBER(spu_ata_irq);
+ DECLARE_WRITE_LINE_MEMBER(spu_ata_dmarq);
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
@@ -495,9 +508,11 @@ WRITE8_MEMBER(twinkle_state::twinkle_io_w)
break;
case 0x8f:
- output_set_value( "neonlamp", ~data & 1 );
+ output_set_value( "neonlamp", ( ~data >> 0 ) & 1 );
+ output_set_value( "unknown1", ( ~data >> 1 ) & 1 );
+ output_set_value( "unknown2", ( ~data >> 2 ) & 1 );
- if( ( data & 0xfe ) != 0xfe )
+ if( ( data & 0xf8 ) != 0xf8 )
{
printf("%02x = %02x\n", m_io_offset, data );
}
@@ -656,17 +671,105 @@ WRITE16_MEMBER(twinkle_state::serial_w)
WRITE8_MEMBER(twinkle_state::shared_psx_w)
{
+ //printf("shared_psx_w: %04x, %04x, %04x\n", offset, data, mem_mask);
+
m_spu_shared[offset] = data;
-// printf("shared_psx_w: %x to %x, mask %x (PC=%x)\n", data, offset, mem_mask, space.device().safe_pc());
+
+ // HLE sound board
+ m_spu_hle[offset] = data;
+
+ if (offset == 0x03fe && data == 0xff)
+ {
+ //printf("spu command %02x %02x\n", m_spu_hle[1], m_spu_hle[3]);
+
+ for (int i = 0x200; i < 0x300; i++) m_spu_hle[i] = 0xea;
+
+ switch (m_spu_hle[1])
+ {
+ case 0x91: // hdd sum 1
+ m_spu_hle[0x200] = 0; // ?
+ m_spu_hle[0x202] = 0; // ?
+ break;
+
+ case 0x9a: // hdd sum 2
+ m_spu_hle[0x200] = 0; // ?
+ m_spu_hle[0x202] = 0; // ?
+ m_spu_hle[0x203] = 1; // Must be 1 to pass test
+ break;
+
+ case 0xa1: // version
+ m_spu_hle[0x200] = 0; // ?
+ m_spu_hle[0x202] = 0; // ?
+
+ if (strcmp(machine().system().name, "bmiidx") == 0 ||
+ strcmp(machine().system().name, "bmiidxa") == 0 ||
+ strcmp(machine().system().name, "bmiidxc") == 0 ||
+ strcmp(machine().system().name, "bmiidxca") == 0)
+ {
+ strcpy((char *)&m_spu_hle[0x204], "GQ863JA_A");
+ }
+ else if (strcmp(machine().system().name, "bmiidxs") == 0)
+ {
+ strcpy((char *)&m_spu_hle[0x204], "GC983JA_A");
+ }
+ else if (strcmp(machine().system().name, "bmiidxc2") == 0)
+ {
+ strcpy((char *)&m_spu_hle[0x204], "GC983JA_R");
+ }
+ else if (strcmp(machine().system().name, "bmiidx2") == 0)
+ {
+ strcpy((char *)&m_spu_hle[0x204], "GC985JA_A");
+ }
+ else if (strcmp(machine().system().name, "bmiidx3") == 0 ||
+ strcmp(machine().system().name, "bmiidx3a") == 0)
+ {
+ strcpy((char *)&m_spu_hle[0x204], "GC992JA_A");
+ }
+ else if (strcmp(machine().system().name, "bmiidx4") == 0)
+ {
+ strcpy((char *)&m_spu_hle[0x204], "GCA03JA_A");
+ }
+ else if (strcmp(machine().system().name, "bmiidx5") == 0)
+ {
+ strcpy((char *)&m_spu_hle[0x204], "GCA17JA_A");
+ }
+ else if (strcmp(machine().system().name, "bmiidx6") == 0 ||
+ strcmp(machine().system().name, "bmiidx6a") == 0)
+ {
+ strcpy((char *)&m_spu_hle[0x204], "GCB4UJA_A");
+ }
+ else if (strcmp(machine().system().name, "bmiidx7") == 0)
+ {
+ strcpy((char *)&m_spu_hle[0x204], "GCB44JA_A");
+ }
+ else if (strcmp(machine().system().name, "bmiidx8") == 0)
+ {
+ strcpy((char *)&m_spu_hle[0x204], "GCC44JA_A");
+ }
+ break;
+
+ case 0x30: // play sound [3]=sound code
+ case 0x51: // sound off
+ case 0x25: // spu rom error ([3]==0x0f)
+ case 0x26: // spu rom error ([3]==0x0f)
+ case 0x08: // spu rom error
+ case 0x40: // spu rom error ([3]==0x01 coin sound?)
+ case 0x2f: // spu rom error
+ case 0x52: // spu rom error
+ case 0x04: // spu rom error ([3]==?)
+ m_spu_hle[0x200] = 0;
+ m_spu_hle[0x202] = 0;
+ break;
+ }
+ }
}
READ8_MEMBER(twinkle_state::shared_psx_r)
{
- UINT32 result = m_spu_shared[offset];
+ //UINT32 result = m_spu_shared[offset];
+ UINT32 result = m_spu_hle[offset];
-// printf("shared_psx_r: @ %x, mask %x (PC=%x)\n", offset, mem_mask, result, space.device().safe_pc());
-
- result = 0; // HACK to prevent the games from freezing while we sort out the rest of the 68k's boot sequence
+ //printf("shared_psx_r: %04x, %04x, %04x\n", offset, result, mem_mask);
return result;
}
@@ -675,7 +778,7 @@ static ADDRESS_MAP_START( main_map, AS_PROGRAM, 32, twinkle_state )
AM_RANGE(0x1f000000, 0x1f0007ff) AM_READWRITE8(shared_psx_r, shared_psx_w, 0x00ff00ff)
AM_RANGE(0x1f200000, 0x1f20001f) AM_DEVREADWRITE8("am53cf96", am53cf96_device, read, write, 0x00ff00ff)
AM_RANGE(0x1f20a01c, 0x1f20a01f) AM_WRITENOP /* scsi? */
- AM_RANGE(0x1f210400, 0x1f2107ff) AM_READNOP
+ AM_RANGE(0x1f210000, 0x1f2107ff) AM_DEVREADWRITE8("fdc37c665gt", fdc37c665gt_device, read, write, 0x00ff00ff)
AM_RANGE(0x1f218000, 0x1f218003) AM_WRITE8(watchdog_reset_w, 0x000000ff) /* LTC1232 */
AM_RANGE(0x1f220000, 0x1f220003) AM_WRITE8(twinkle_io_w, 0x00ff00ff)
AM_RANGE(0x1f220004, 0x1f220007) AM_READ8(twinkle_io_r, 0x00ff00ff)
@@ -692,7 +795,7 @@ ADDRESS_MAP_END
/* SPU board */
-WRITE_LINE_MEMBER(twinkle_state::ide_interrupt)
+WRITE_LINE_MEMBER(twinkle_state::spu_ata_irq)
{
if ((state) && (m_spu_ctrl & 0x0400))
{
@@ -715,48 +818,91 @@ WRITE16_MEMBER(twinkle_state::twinkle_spu_ctrl_w)
{
if ((!(data & 0x0080)) && (m_spu_ctrl & 0x0080))
{
- space.device().execute().set_input_line(M68K_IRQ_1, CLEAR_LINE);
+ m_audiocpu->set_input_line(M68K_IRQ_1, CLEAR_LINE);
}
else if ((!(data & 0x0100)) && (m_spu_ctrl & 0x0100))
{
- space.device().execute().set_input_line(M68K_IRQ_2, CLEAR_LINE);
+ m_audiocpu->set_input_line(M68K_IRQ_2, CLEAR_LINE);
}
else if ((!(data & 0x0200)) && (m_spu_ctrl & 0x0200))
{
- space.device().execute().set_input_line(M68K_IRQ_4, CLEAR_LINE);
+ m_audiocpu->set_input_line(M68K_IRQ_4, CLEAR_LINE);
}
else if ((!(data & 0x0400)) && (m_spu_ctrl & 0x0400))
{
- space.device().execute().set_input_line(M68K_IRQ_6, CLEAR_LINE);
+ m_audiocpu->set_input_line(M68K_IRQ_6, CLEAR_LINE);
}
m_spu_ctrl = data;
}
+WRITE16_MEMBER(twinkle_state::spu_ata_dma_low_w)
+{
+ m_spu_ata_dma = (m_spu_ata_dma & ~0xffff) | data;
+
+ //printf("dma_low %08x\n", m_spu_ata_dma * 2);
+}
+
+WRITE16_MEMBER(twinkle_state::spu_ata_dma_high_w)
+{
+ m_spu_ata_dma = (m_spu_ata_dma & 0xffff) | (data << 16);
+
+ //printf("dma_high %08x\n", m_spu_ata_dma * 2);
+}
+
+WRITE_LINE_MEMBER(twinkle_state::spu_ata_dmarq)
+{
+ if (m_spu_ata_dmarq != state)
+ {
+ m_spu_ata_dmarq = state;
+
+ if (m_spu_ata_dmarq)
+ {
+ UINT16 *waveram = (UINT16 *)m_rfsnd->base();
+
+ m_ata->write_dmack(ASSERT_LINE);
+
+ while (m_spu_ata_dmarq)
+ {
+ UINT16 data = m_ata->read_dma();
+ //printf("spu_ata_dmarq %08x %04x\n", m_spu_ata_dma * 2, data);
+ //waveram[m_spu_ata_dma++] = (data >> 8) | (data << 8);
+ // bp 4a0e ;bmiidx4 checksum
+ // bp 4d62 ;bmiidx4 dma
+ waveram[m_spu_ata_dma++] = data;
+ }
+
+ m_ata->write_dmack(CLEAR_LINE);
+ }
+ }
+}
+
READ16_MEMBER(twinkle_state::twinkle_waveram_r)
{
- UINT16 *waveram = (UINT16 *)memregion("rfsnd")->base();
+ UINT16 *waveram = (UINT16 *)m_rfsnd->base();
return waveram[offset];
}
WRITE16_MEMBER(twinkle_state::twinkle_waveram_w)
{
- UINT16 *waveram = (UINT16 *)memregion("rfsnd")->base();
+ UINT16 *waveram = (UINT16 *)m_rfsnd->base();
COMBINE_DATA(&waveram[offset]);
}
READ16_MEMBER(twinkle_state::shared_68k_r)
{
-// printf("shared_68k_r: @ %x, mask %x\n", offset, mem_mask);
+ UINT16 result = m_spu_shared[offset];
- return m_spu_shared[offset];
+ //printf("shared_68k_r: %04x, %04x, %04x\n", offset, result, mem_mask);
+
+ return result;
}
WRITE16_MEMBER(twinkle_state::shared_68k_w)
{
-// printf("shared_68k_w: %x to %x, mask %x\n", data, offset, mem_mask);
+ //printf("shared_68k_w: %04x, %04x, %04x\n", offset, data, mem_mask);
m_spu_shared[offset] = data & 0xff;
}
@@ -766,10 +912,10 @@ static ADDRESS_MAP_START( sound_map, AS_PROGRAM, 16, twinkle_state )
AM_RANGE(0x100000, 0x13ffff) AM_RAM
// 220000 = LEDs?
AM_RANGE(0x230000, 0x230003) AM_WRITE(twinkle_spu_ctrl_w)
- // 240000 = top 16 bits of DMA address?
- // 250000 = write to initiate DMA?
+ AM_RANGE(0x240000, 0x240003) AM_WRITE(spu_ata_dma_low_w)
+ AM_RANGE(0x250000, 0x250003) AM_WRITE(spu_ata_dma_high_w)
// 260000 = ???
- AM_RANGE(0x280000, 0x280fff) AM_READWRITE(shared_68k_r, shared_68k_w )
+ AM_RANGE(0x280000, 0x280fff) AM_READWRITE(shared_68k_r, shared_68k_w)
AM_RANGE(0x300000, 0x30000f) AM_DEVREADWRITE("ata", ata_interface_device, read_cs0, write_cs0)
// 34000E = ???
AM_RANGE(0x400000, 0x400fff) AM_DEVREADWRITE("rfsnd", rf5c400_device, rf5c400_r, rf5c400_w)
@@ -886,10 +1032,28 @@ static MACHINE_CONFIG_START( twinkle, twinkle_state )
MCFG_AM53CF96_IRQ_HANDLER(DEVWRITELINE("maincpu:irq", psxirq_device, intin10))
MCFG_ATA_INTERFACE_ADD("ata", ata_devices, "hdd", NULL, true)
- MCFG_ATA_INTERFACE_IRQ_HANDLER(WRITELINE(twinkle_state, ide_interrupt))
+ MCFG_ATA_INTERFACE_IRQ_HANDLER(WRITELINE(twinkle_state, spu_ata_irq))
+ MCFG_ATA_INTERFACE_DMARQ_HANDLER(WRITELINE(twinkle_state, spu_ata_dmarq))
MCFG_DEVICE_ADD("rtc", RTC65271, 0)
+ MCFG_DEVICE_ADD("fdc37c665gt", FDC37C665GT, XTAL_24MHz)
+
+ MCFG_DEVICE_ADD("rs232", RS232_PORT, 0)
+ MCFG_SLOT_OPTION_ADD("xvd701", JVC_XVD701)
+// MCFG_SLOT_OPTION_ADD("xvs1100", JVC_XVS1100) // 8th mix only
+ MCFG_SLOT_DEFAULT_OPTION("xvd701")
+ MCFG_RS232_RXD_HANDLER(DEVWRITELINE("fdc37c665gt:uart2", ins8250_uart_device, rx_w))
+ MCFG_RS232_DCD_HANDLER(DEVWRITELINE("fdc37c665gt:uart2", ins8250_uart_device, dcd_w))
+ MCFG_RS232_DSR_HANDLER(DEVWRITELINE("fdc37c665gt:uart2", ins8250_uart_device, dsr_w))
+ MCFG_RS232_RI_HANDLER(DEVWRITELINE("fdc37c665gt:uart2", ins8250_uart_device, ri_w))
+ MCFG_RS232_CTS_HANDLER(DEVWRITELINE("fdc37c665gt:uart2", ins8250_uart_device, cts_w))
+
+ MCFG_DEVICE_MODIFY("fdc37c665gt:uart2")
+ MCFG_INS8250_OUT_TX_CB(DEVWRITELINE("^rs232", rs232_port_device, write_txd))
+ MCFG_INS8250_OUT_DTR_CB(DEVWRITELINE("^rs232", rs232_port_device, write_dtr))
+ MCFG_INS8250_OUT_RTS_CB(DEVWRITELINE("^rs232", rs232_port_device, write_rts))
+
/* video hardware */
MCFG_PSXGPU_ADD( "maincpu", "gpu", CXD8561Q, 0x200000, XTAL_53_693175MHz )
@@ -973,7 +1137,7 @@ static INPUT_PORTS_START( twinklex )
PORT_BIT( 0x00000004, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("security", x76f041_device, write_cs)
PORT_MODIFY("INSEC")
- PORT_BIT( 0x00001000, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_READ_LINE_DEVICE_MEMBER("security", x76f041_device, read_sda)
+ PORT_BIT( 0x00001000, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_READ_LINE_DEVICE_MEMBER("security", x76f041_device, read_sda)
INPUT_PORTS_END
static INPUT_PORTS_START( twinklei )
@@ -1189,7 +1353,7 @@ ROM_START( bmiidxc )
DISK_IMAGE_READONLY( "896jaa04", 0, NO_DUMP )
DISK_REGION( "ata:0:hdd:image" )
- DISK_IMAGE_READONLY( "896hdda01", 0, NO_DUMP )
+ DISK_IMAGE_READONLY( "863hdda01", 0, SHA1(0b8dbf1c9caf4abf965dbc6e1a8e6329d48b1c90) )
ROM_END
ROM_START( bmiidxca )
@@ -1205,7 +1369,7 @@ ROM_START( bmiidxca )
DISK_IMAGE_READONLY( "896jaa04", 0, NO_DUMP )
DISK_REGION( "ata:0:hdd:image" )
- DISK_IMAGE_READONLY( "896hdda01", 0, NO_DUMP )
+ DISK_IMAGE_READONLY( "863hdda01", 0, SHA1(0b8dbf1c9caf4abf965dbc6e1a8e6329d48b1c90) )
ROM_END
ROM_START( bmiidxs )
@@ -1244,16 +1408,16 @@ GAME( 1999, gq863, 0, twinkle, twinkle, driver_device, 0, ROT0
GAME( 1999, bmiidx, gq863, twinklex, twinklex, driver_device, 0, ROT0, "Konami", "beatmania IIDX (863 JAB)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS | GAME_NOT_WORKING )
GAME( 1999, bmiidxa, bmiidx, twinklex, twinklex, driver_device, 0, ROT0, "Konami", "beatmania IIDX (863 JAA)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS | GAME_NOT_WORKING )
-GAME( 1999, bmiidxc, gq863, twinklex, twinklex, driver_device, 0, ROT0, "Konami", "beatmania IIDX with DDR 2nd Club Version (896 JAB)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS | GAME_NOT_WORKING )
-GAME( 1999, bmiidxca, bmiidxc, twinklex, twinklex, driver_device, 0, ROT0, "Konami", "beatmania IIDX with DDR 2nd Club Version (896 JAA)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS | GAME_NOT_WORKING )
-GAME( 1999, bmiidxs, gq863, twinklex, twinklex, driver_device, 0, ROT0, "Konami", "beatmania IIDX Substream (983 JAA)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS | GAME_NOT_WORKING )
-GAME( 1999, bmiidxc2, gq863, twinklex, twinklex, driver_device, 0, ROT0, "Konami", "Beatmania IIDX Substream with DDR 2nd Club Version 2 (984 A01 BM)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS | GAME_NOT_WORKING )
-GAME( 1999, bmiidx2, gq863, twinklei, twinklei, driver_device, 0, ROT0, "Konami", "beatmania IIDX 2nd style (GC985 JAA)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS | GAME_NOT_WORKING )
-GAME( 2000, bmiidx3, gq863, twinklei, twinklei, driver_device, 0, ROT0, "Konami", "beatmania IIDX 3rd style (GC992 JAC)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS | GAME_NOT_WORKING )
-GAME( 2000, bmiidx3a, bmiidx3, twinklei, twinklei, driver_device, 0, ROT0, "Konami", "beatmania IIDX 3rd style (GC992 JAA)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS | GAME_NOT_WORKING )
-GAME( 2000, bmiidx4, gq863, twinklei, twinklei, driver_device, 0, ROT0, "Konami", "beatmania IIDX 4th style (GCA03 JAA)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS | GAME_NOT_WORKING )
-GAME( 2001, bmiidx5, gq863, twinklei, twinklei, driver_device, 0, ROT0, "Konami", "beatmania IIDX 5th style (GCA17 JAA)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS | GAME_NOT_WORKING )
-GAME( 2001, bmiidx6, gq863, twinklei, twinklei, driver_device, 0, ROT0, "Konami", "beatmania IIDX 6th style (GCB4U JAB)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS | GAME_NOT_WORKING )
-GAME( 2001, bmiidx6a, bmiidx6, twinklei, twinklei, driver_device, 0, ROT0, "Konami", "beatmania IIDX 6th style (GCB4U JAA)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS | GAME_NOT_WORKING )
-GAME( 2002, bmiidx7, gq863, twinklei, twinklei, driver_device, 0, ROT0, "Konami", "beatmania IIDX 7th style (GCB44 JAA)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS | GAME_NOT_WORKING )
-GAME( 2002, bmiidx8, gq863, twinklei, twinklei, driver_device, 0, ROT0, "Konami", "beatmania IIDX 8th style (GCC44 JAA)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS | GAME_NOT_WORKING )
+GAME( 1999, bmiidxc, gq863, twinklex, twinklex, driver_device, 0, ROT0, "Konami", "beatmania IIDX with DDR 2nd Club Version (896 JAB)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS | GAME_NOT_WORKING )
+GAME( 1999, bmiidxca, bmiidxc, twinklex, twinklex, driver_device, 0, ROT0, "Konami", "beatmania IIDX with DDR 2nd Club Version (896 JAA)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS | GAME_NOT_WORKING )
+GAME( 1999, bmiidxs, gq863, twinklex, twinklex, driver_device, 0, ROT0, "Konami", "beatmania IIDX Substream (983 JAA)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS | GAME_NOT_WORKING )
+GAME( 1999, bmiidxc2, gq863, twinklex, twinklex, driver_device, 0, ROT0, "Konami", "Beatmania IIDX Substream with DDR 2nd Club Version 2 (984 A01 BM)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS | GAME_NOT_WORKING )
+GAME( 1999, bmiidx2, gq863, twinklei, twinklei, driver_device, 0, ROT0, "Konami", "beatmania IIDX 2nd style (GC985 JAA)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS | GAME_NOT_WORKING )
+GAME( 2000, bmiidx3, gq863, twinklei, twinklei, driver_device, 0, ROT0, "Konami", "beatmania IIDX 3rd style (GC992 JAC)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS | GAME_NOT_WORKING )
+GAME( 2000, bmiidx3a, bmiidx3, twinklei, twinklei, driver_device, 0, ROT0, "Konami", "beatmania IIDX 3rd style (GC992 JAA)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS | GAME_NOT_WORKING )
+GAME( 2000, bmiidx4, gq863, twinklei, twinklei, driver_device, 0, ROT0, "Konami", "beatmania IIDX 4th style (GCA03 JAA)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS | GAME_NOT_WORKING )
+GAME( 2001, bmiidx5, gq863, twinklei, twinklei, driver_device, 0, ROT0, "Konami", "beatmania IIDX 5th style (GCA17 JAA)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS | GAME_NOT_WORKING )
+GAME( 2001, bmiidx6, gq863, twinklei, twinklei, driver_device, 0, ROT0, "Konami", "beatmania IIDX 6th style (GCB4U JAB)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS | GAME_NOT_WORKING )
+GAME( 2001, bmiidx6a, bmiidx6, twinklei, twinklei, driver_device, 0, ROT0, "Konami", "beatmania IIDX 6th style (GCB4U JAA)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS | GAME_NOT_WORKING )
+GAME( 2002, bmiidx7, gq863, twinklei, twinklei, driver_device, 0, ROT0, "Konami", "beatmania IIDX 7th style (GCB44 JAA)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS | GAME_NOT_WORKING )
+GAME( 2002, bmiidx8, gq863, twinklei, twinklei, driver_device, 0, ROT0, "Konami", "beatmania IIDX 8th style (GCC44 JAA)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS | GAME_NOT_WORKING )
diff --git a/src/mame/mame.mak b/src/mame/mame.mak
index 6eb7abe5f91..9682fa710cf 100644
--- a/src/mame/mame.mak
+++ b/src/mame/mame.mak
@@ -556,6 +556,7 @@ MACHINES += Z80STI
MACHINES += Z8536
MACHINES += SECFLASH
MACHINES += PCCARD
+MACHINES += FDC37C665GT
#MACHINES += SMC92X4
#MACHINES += TI99_HD
#MACHINES += STRATA