summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/ssfindo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/ssfindo.cpp')
-rw-r--r--src/mame/drivers/ssfindo.cpp521
1 files changed, 137 insertions, 384 deletions
diff --git a/src/mame/drivers/ssfindo.cpp b/src/mame/drivers/ssfindo.cpp
index 4bc633cb729..26a14c43de2 100644
--- a/src/mame/drivers/ssfindo.cpp
+++ b/src/mame/drivers/ssfindo.cpp
@@ -12,7 +12,7 @@
Tomasz Slanina analog[at]op.pl
TODO:
- - move PS7500 stuff to machine/ps7500.c
+ - Correct IOMD type (CL-PS7500 -> ARM7500FE?)
- 24c01 eeprom (IOLINES)
- timing
- unknown reads/writes
@@ -128,136 +128,48 @@ Notes:
#include "cpu/arm7/arm7.h"
#include "cpu/arm7/arm7core.h"
#include "machine/i2cmem.h"
+#include "machine/acorn_vidc.h"
+#include "machine/arm_iomd.h"
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
-enum
-{
- IOCR=0,
- KBDDAT,
- KBDCR,
- IOLINES,
- IRQSTA,
- IRQRQA,
- IRQMSKA,
- SUSMODE,
- IRQSTB,
- IRQRQB,
- IRQMSKB,
- STOPMODE,
- FIQST,
- FIQRQ,
- FIQMSK,
- CLKCTL,
- T0low,
- T0high,
- T0GO,
- T0LAT,
- T1low,
- T1high,
- T1GO,
- T1LAT,
- IRQSTC,
- IRQRQC,
- IRQMSKC,
- VIDMUX,
- IRQSTD,
- IRQRQD,
- IRQMSKD,
-
- ROMCR0=32,
- ROMCR1,
-
- REFCR=35,
-
- ID0=37,
- ID1,
- VERSION,
-
- MSEDAT=42,
- MSECR,
-
- IOTCR=49,
- ECTCR,
- ASTCR,
- DRAMCR,
- SELREF,
-
- ATODICR=56,
- ATODSR,
- ATODCC,
- ATODCNT1,
- ATODCNT2,
- ATODCNT3,
- ATODCNT4,
-
- SD0CURA=96,
- SD0ENDA,
- SD0CURB,
- SD0ENDB,
- SD0CR,
- SD0ST,
-
- CURSCUR=112,
- CURSINIT,
- VIDCURB,
-
- VIDCURA=116,
- VIDEND,
- VIDSTART,
- VIDINITA,
- VIDCR,
-
- VIDINITB=122,
-
- DMAST=124,
- DMARQ,
- DMASK,
- MAXIO=128
-};
-
-
class ssfindo_state : public driver_device
{
public:
ssfindo_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
- m_maincpu(*this, "maincpu"),
- m_palette(*this, "palette"),
- m_i2cmem(*this, "i2cmem"),
- m_vram(*this, "vram"),
- m_flashrom(*this, "flash"),
- m_io_ps7500(*this, "PS7500") { }
+ : driver_device(mconfig, type, tag)
+ , m_maincpu(*this, "maincpu")
+ , m_vidc(*this, "vidc")
+ , m_iomd(*this, "iomd")
+ , m_i2cmem(*this, "i2cmem")
+ , m_flashrom(*this, "flash")
+ { }
void ssfindo(machine_config &config);
void ppcar(machine_config &config);
- void tetfight(machine_config &config);
void init_ssfindo();
void init_ppcar();
- void init_tetfight();
-private:
+protected:
required_device<cpu_device> m_maincpu;
- required_device<palette_device> m_palette;
+ required_device<arm_vidc20_device> m_vidc;
+ required_device<arm7500fe_iomd_device> m_iomd;
optional_device<i2cmem_device> m_i2cmem;
-
- required_shared_ptr<uint32_t> m_vram;
-
required_region_ptr<uint16_t> m_flashrom;
+
+ void init_common();
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
- required_ioport m_io_ps7500;
+ typedef void (ssfindo_state::*speedup_func)();
+ speedup_func m_speedup;
- // driver init configuration
uint32_t m_flashType;
- int m_iocr_hack;
- // common
- uint32_t m_PS7500_IO[MAXIO];
- uint32_t m_PS7500_FIFO[256];
- emu_timer *m_PS7500timer0;
- emu_timer *m_PS7500timer1;
+ bool m_i2cmem_clock;
+private:
// ssfindo and ppcar
uint32_t m_flashAdr;
@@ -265,11 +177,6 @@ private:
uint32_t m_adrLatch;
uint32_t m_flashN;
- // common
- DECLARE_WRITE32_MEMBER(FIFO_w);
- DECLARE_READ32_MEMBER(PS7500_IO_r);
- DECLARE_WRITE32_MEMBER(PS7500_IO_w);
-
// ssfindo and ppcar
DECLARE_READ32_MEMBER(io_r);
DECLARE_WRITE32_MEMBER(io_w);
@@ -282,125 +189,94 @@ private:
// ppcar
DECLARE_READ32_MEMBER(randomized_r);
- // tetfight
- DECLARE_READ32_MEMBER(tetfight_unk_r);
- DECLARE_WRITE32_MEMBER(tetfight_unk_w);
-
- void init_common();
- virtual void machine_reset() override;
-
- uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
-
- INTERRUPT_GEN_MEMBER(interrupt);
- TIMER_CALLBACK_MEMBER(PS7500_Timer0_callback);
- TIMER_CALLBACK_MEMBER(PS7500_Timer1_callback);
-
- typedef void (ssfindo_state::*speedup_func)();
- speedup_func m_speedup;
-
- void PS7500_startTimer0();
- void PS7500_startTimer1();
- void PS7500_reset();
void ssfindo_speedups();
void ppcar_speedups();
void ppcar_map(address_map &map);
void ssfindo_map(address_map &map);
- void tetfight_map(address_map &map);
+
+ DECLARE_READ8_MEMBER(iolines_r);
+ DECLARE_WRITE8_MEMBER(iolines_w);
+ bool m_flash_bank_select;
};
-
-uint32_t ssfindo_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+class tetfight_state : public ssfindo_state
{
- int s,x,y;
+public:
+ tetfight_state(const machine_config &mconfig, device_type type, const char *tag)
+ : ssfindo_state(mconfig, type, tag)
+ {}
- if( m_PS7500_IO[VIDCR]&0x20) //video DMA enabled
- {
- s=( (m_PS7500_IO[VIDINITA]&0x1fffffff)-0x10000000)/4;
-
- if(s>=0 && s<(0x10000000/4))
- {
- for(y=0;y<256;y++)
- for(x=0;x<320;x+=4)
- {
- bitmap.pix16(y, x+0) = m_vram[s]&0xff;
- bitmap.pix16(y, x+1) = (m_vram[s]>>8)&0xff;
- bitmap.pix16(y, x+2) = (m_vram[s]>>16)&0xff;
- bitmap.pix16(y, x+3) = (m_vram[s]>>24)&0xff;
- s++;
- }
- }
- }
+ void init_tetfight();
+ void tetfight(machine_config &config);
- return 0;
-}
+protected:
-WRITE32_MEMBER(ssfindo_state::FIFO_w)
-{
- m_PS7500_FIFO[data>>28]=data;
+private:
+ bool m_i2cdata_hack;
- if(!(data>>28))
- {
- m_palette->set_pen_color(m_PS7500_FIFO[1]&0xff, data&0xff,(data>>8)&0xff,(data>>16)&0xff);
- m_PS7500_FIFO[1]++; //autoinc
- }
-}
-TIMER_CALLBACK_MEMBER(ssfindo_state::PS7500_Timer0_callback)
+ void tetfight_map(address_map &map);
+
+ DECLARE_READ_LINE_MEMBER(iocr_od0_r);
+ DECLARE_READ_LINE_MEMBER(iocr_od1_r);
+ DECLARE_WRITE_LINE_MEMBER(iocr_od0_w);
+ DECLARE_WRITE_LINE_MEMBER(iocr_od1_w);
+ DECLARE_READ32_MEMBER(tetfight_unk_r);
+ DECLARE_WRITE32_MEMBER(tetfight_unk_w);
+};
+
+//TODO: eeprom 24c01 & 24c02
+// TODO: untangle, kill hacks
+READ8_MEMBER(ssfindo_state::iolines_r)
{
- m_PS7500_IO[IRQSTA]|=0x20;
- if(m_PS7500_IO[IRQMSKA]&0x20)
- {
- m_maincpu->pulse_input_line(ARM7_IRQ_LINE, m_maincpu->minimum_quantum_time());
- }
+ if(m_flashType == 1)
+ return 0;
+ else
+ return machine().rand();
}
-void ssfindo_state::PS7500_startTimer0()
+WRITE8_MEMBER(ssfindo_state::iolines_w)
{
- int val=((m_PS7500_IO[T0low]&0xff)|((m_PS7500_IO[T0high]&0xff)<<8))>>1;
+ if(data&0xc0)
+ m_adrLatch=0;
- if(val==0)
- m_PS7500timer0->adjust(attotime::never);
- else
- m_PS7500timer0->adjust(attotime::from_usec(val ), 0, attotime::from_usec(val ));
+ if(m_maincpu->pc() == 0xbac0 && m_flashType == 1)
+ m_flashN=data&1;
+
+ m_flash_bank_select = BIT(data, 0);
}
-TIMER_CALLBACK_MEMBER(ssfindo_state::PS7500_Timer1_callback)
+// inverted compared to riscpc.cpp
+// TODO: simplify hookup over i2cmem having AND 1 on state for a writeline (?)
+READ_LINE_MEMBER(tetfight_state::iocr_od1_r)
{
- m_PS7500_IO[IRQSTA]|=0x40;
- if(m_PS7500_IO[IRQMSKA]&0x40)
- {
- m_maincpu->pulse_input_line(ARM7_IRQ_LINE, m_maincpu->minimum_quantum_time());
- }
+ // TODO: completely get rid of this speedup fn or move anywhere else
+ //if (m_speedup) (this->*m_speedup)();
+ return (m_i2cmem->read_sda() ? 1 : 0); //eeprom read
}
-void ssfindo_state::PS7500_startTimer1()
+READ_LINE_MEMBER(tetfight_state::iocr_od0_r)
{
- int val=((m_PS7500_IO[T1low]&0xff)|((m_PS7500_IO[T1high]&0xff)<<8))>>1;
- if(val==0)
- m_PS7500timer1->adjust(attotime::never);
- else
- m_PS7500timer1->adjust(attotime::from_usec(val ), 0, attotime::from_usec(val ));
+ return (m_i2cmem_clock == true ? 1 : 0); //eeprom read
}
-INTERRUPT_GEN_MEMBER(ssfindo_state::interrupt)
+WRITE_LINE_MEMBER(tetfight_state::iocr_od1_w)
{
- m_PS7500_IO[IRQSTA]|=0x08;
- if(m_PS7500_IO[IRQMSKA]&0x08)
- {
- device.execute().pulse_input_line(ARM7_IRQ_LINE, device.execute().minimum_quantum_time());
- }
+ // TODO: i2c cares about the order of this!?
+ // tetfight reaches PC=0x106c if initialization has success
+ // rpc700 doesn't like above and go into supervisor mode even with a valid NVRAM
+ // both wants clock first then data, not sure where the issue actually is
+ m_i2cdata_hack = state == true;
+ //m_i2cmem->write_sda(state == true ? 1 : 0);
}
-void ssfindo_state::PS7500_reset()
+WRITE_LINE_MEMBER(tetfight_state::iocr_od0_w)
{
- m_PS7500_IO[IOCR] = 0x3f;
- m_PS7500_IO[VIDCR] = 0;
-
- m_PS7500timer0->adjust( attotime::never);
- m_PS7500timer1->adjust( attotime::never);
+ m_i2cmem_clock = state;
+ m_i2cmem->write_scl(state == true ? 1 : 0);
+ m_i2cmem->write_sda(m_i2cdata_hack == true ? 1 : 0);
}
-
void ssfindo_state::ssfindo_speedups()
{
if (m_maincpu->pc()==0x2d6c8) // ssfindo
@@ -417,138 +293,15 @@ void ssfindo_state::ppcar_speedups()
m_maincpu->spin_until_time(attotime::from_usec(20));
}
-
-READ32_MEMBER(ssfindo_state::PS7500_IO_r)
-{
- switch(offset)
- {
- case MSECR:
- return machine().rand();
-
- case IOLINES: //TODO: eeprom 24c01
-#if 0
- osd_printf_debug("IOLINESR %i @%x\n", offset, m_maincpu->pc());
-#endif
-
- if(m_flashType == 1)
- return 0;
- else
- return machine().rand();
-
- case IRQSTA:
- return (m_PS7500_IO[offset] & (~2)) | 0x80;
-
- case IRQRQA:
- return (m_PS7500_IO[IRQSTA] & m_PS7500_IO[IRQMSKA]) | 0x80;
-
- case IOCR: //TODO: nINT1, OD[n] p.81
- if (m_speedup) (this->*m_speedup)();
-
- if( m_iocr_hack)
- {
- return (m_io_ps7500->read() & 0x80) | 0x34 | (m_i2cmem->read_sda() ? 0x03 : 0x00); //eeprom read
- }
-
- return (m_io_ps7500->read() & 0x80) | 0x37;
-
- case VIDCR:
- return (m_PS7500_IO[offset] | 0x50) & 0xfffffff0;
-
- case T1low:
- case T0low:
- case T1high:
- case T0high:
- case IRQMSKA:
- case VIDEND:
- case VIDSTART:
- case VIDINITA: //TODO: bits 29 ("equal") and 30 (last bit) p.105
-
- return m_PS7500_IO[offset];
-
-
- }
- return machine().rand();//m_PS7500_IO[offset];
-}
-
-WRITE32_MEMBER(ssfindo_state::PS7500_IO_w)
-{
- uint32_t temp=m_PS7500_IO[offset];
-
- COMBINE_DATA(&temp);
-
- switch(offset)
- {
- case IOLINES: //TODO: eeprom 24c01
- m_PS7500_IO[offset]=data;
- if(data&0xc0)
- m_adrLatch=0;
-
- if(m_maincpu->pc() == 0xbac0 && m_flashType == 1)
- {
- m_flashN=data&1;
- }
-
-#if 0
- logerror("IOLINESW %i = %x @%x\n",offset,data,m_maincpu->pc());
-#endif
- break;
-
- case IRQRQA:
- m_PS7500_IO[IRQSTA]&=~temp;
- break;
-
- case IRQMSKA:
- m_PS7500_IO[IRQMSKA]=(temp&(~2))|0x80;
- break;
-
- case T1GO:
- PS7500_startTimer1();
- break;
-
- case T0GO:
- PS7500_startTimer0();
- break;
-
- case VIDEND:
- case VIDSTART:
- COMBINE_DATA(&m_PS7500_IO[offset]);
- m_PS7500_IO[offset]&=0xfffffff0; // qword align
- break;
-
- case IOCR:
- //popmessage("IOLINESW %i = %x @%x\n",offset,data,m_maincpu->pc());
- COMBINE_DATA(&m_PS7500_IO[offset]);
- // TODO: correct hook-up
- m_i2cmem->write_scl((data & 0x01) ? 1 : 0);
- m_i2cmem->write_sda((data & 0x02) ? 1 : 0);
- break;
-
- case REFCR:
- case DRAMCR:
- case SD0CR:
- case ROMCR0:
- case VIDMUX:
- case CLKCTL:
- case T1low:
- case T0low:
- case T1high:
- case T0high:
- case VIDCR:
- case VIDINITA: //TODO: bit 30 (last bit) p.105
- COMBINE_DATA(&m_PS7500_IO[offset]);
- break;
- }
-}
-
READ32_MEMBER(ssfindo_state::io_r)
{
int adr=m_flashAdr*0x200+(m_flashOffset);
-
switch(m_flashType)
{
case 0:
- if(m_PS7500_IO[IOLINES]&1) //bit 0 of IOLINES = flash select ( 5/6 or 3/2 )
+ //bit 0 of IOLINES = flash select ( 5/6 or 3/2 )
+ if (m_flash_bank_select)
adr+=0x400000;
break;
@@ -609,7 +362,7 @@ READ32_MEMBER(ssfindo_state::randomized_r)
void ssfindo_state::ssfindo_map(address_map &map)
{
map(0x00000000, 0x000fffff).rom();
- map(0x03200000, 0x032001ff).rw(FUNC(ssfindo_state::PS7500_IO_r), FUNC(ssfindo_state::PS7500_IO_w));
+ map(0x03200000, 0x032001ff).m(m_iomd, FUNC(arm7500fe_iomd_device::map));
map(0x03012e60, 0x03012e67).noprw();
map(0x03012fe0, 0x03012fe3).w(FUNC(ssfindo_state::debug_w));
map(0x03012ff0, 0x03012ff3).noprw();
@@ -621,14 +374,14 @@ void ssfindo_state::ssfindo_map(address_map &map)
map(0x03243000, 0x03243003).portr("DSW").nopw();
map(0x0324f000, 0x0324f003).r(FUNC(ssfindo_state::SIMPLEIO_r));
map(0x03245000, 0x03245003).nopw(); /* sound ? */
- map(0x03400000, 0x03400003).w(FUNC(ssfindo_state::FIFO_w));
- map(0x10000000, 0x11ffffff).ram().share("vram");
+ map(0x03400000, 0x037fffff).w(m_vidc, FUNC(arm_vidc20_device::write));
+ map(0x10000000, 0x11ffffff).ram();
}
void ssfindo_state::ppcar_map(address_map &map)
{
map(0x00000000, 0x000fffff).rom();
- map(0x03200000, 0x032001ff).rw(FUNC(ssfindo_state::PS7500_IO_r), FUNC(ssfindo_state::PS7500_IO_w));
+ map(0x03200000, 0x032001ff).m(m_iomd, FUNC(arm7500fe_iomd_device::map));
map(0x03012b00, 0x03012bff).r(FUNC(ssfindo_state::randomized_r)).nopw();
map(0x03012e60, 0x03012e67).nopw();
map(0x03012ff8, 0x03012ffb).portr("IN0").nopw();
@@ -636,43 +389,52 @@ void ssfindo_state::ppcar_map(address_map &map)
map(0x03340000, 0x03340007).nopw();
map(0x03341000, 0x0334101f).nopw();
map(0x033c0000, 0x033c0003).r(FUNC(ssfindo_state::io_r)).w(FUNC(ssfindo_state::io_w));
- map(0x03400000, 0x03400003).w(FUNC(ssfindo_state::FIFO_w));
+ map(0x03400000, 0x037fffff).w(m_vidc, FUNC(arm_vidc20_device::write));
map(0x08000000, 0x08ffffff).ram();
- map(0x10000000, 0x10ffffff).ram().share("vram");
+ map(0x10000000, 0x10ffffff).ram();
}
-READ32_MEMBER(ssfindo_state::tetfight_unk_r)
+READ32_MEMBER(tetfight_state::tetfight_unk_r)
{
//sound status ?
return machine().rand();
}
-WRITE32_MEMBER(ssfindo_state::tetfight_unk_w)
+WRITE32_MEMBER(tetfight_state::tetfight_unk_w)
{
//sound latch ?
}
-void ssfindo_state::tetfight_map(address_map &map)
+void tetfight_state::tetfight_map(address_map &map)
{
map(0x00000000, 0x001fffff).rom();
- map(0x03200000, 0x032001ff).rw(FUNC(ssfindo_state::PS7500_IO_r), FUNC(ssfindo_state::PS7500_IO_w));
- map(0x03400000, 0x03400003).w(FUNC(ssfindo_state::FIFO_w));
+ map(0x03200000, 0x032001ff).m(m_iomd, FUNC(arm7500fe_iomd_device::map));
map(0x03240000, 0x03240003).portr("IN0");
map(0x03240004, 0x03240007).portr("IN1");
map(0x03240008, 0x0324000b).portr("DSW2");
- map(0x03240020, 0x03240023).rw(FUNC(ssfindo_state::tetfight_unk_r), FUNC(ssfindo_state::tetfight_unk_w));
- map(0x10000000, 0x14ffffff).ram().share("vram");
+ map(0x03240020, 0x03240023).rw(FUNC(tetfight_state::tetfight_unk_r), FUNC(tetfight_state::tetfight_unk_w));
+ map(0x03400000, 0x037fffff).w(m_vidc, FUNC(arm_vidc20_device::write));
+ map(0x10000000, 0x14ffffff).ram();
+}
+
+void ssfindo_state::machine_start()
+{
+ // TODO: convert to exact flash device
+ save_item(NAME(m_flashAdr));
+ save_item(NAME(m_flashOffset));
+ save_item(NAME(m_adrLatch));
+ save_item(NAME(m_flashN));
+ save_item(NAME(m_i2cmem_clock));
+ save_item(NAME(m_flash_bank_select));
}
void ssfindo_state::machine_reset()
{
- PS7500_reset();
+ // ...
}
static INPUT_PORTS_START( ssfindo )
- PORT_START("PS7500")
- PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_VBLANK("screen")
-
+ // TODO: incomplete structs
PORT_START("IN0")
PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_UNUSED ) // IPT_START2 ??
PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1)
@@ -698,31 +460,28 @@ static INPUT_PORTS_START( ssfindo )
PORT_DIPNAME( 0x02, 0x02, DEF_STR( Free_Play ) )
PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x80, 0x80, DEF_STR( Service_Mode ) )
- PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x04, 0x04, "DSW 2" )
PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x08, 0x08, "DSW 3" )
PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x10, 0x010, "DSW 4" )
+ PORT_DIPNAME( 0x10, 0x10, "DSW 4" )
PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x20, 0x20, "DSW 5" )
PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x40, 0x040, "DSW 6" )
+ PORT_DIPNAME( 0x40, 0x40, "DSW 6" )
PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Service_Mode ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
INPUT_PORTS_END
static INPUT_PORTS_START( ppcar )
- PORT_START("PS7500")
- PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_VBLANK("screen")
-
PORT_START("IN0")
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_COIN1 )
@@ -737,9 +496,6 @@ static INPUT_PORTS_START( ppcar )
INPUT_PORTS_END
static INPUT_PORTS_START( tetfight )
- PORT_START("PS7500")
- PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_VBLANK("screen")
-
PORT_START("IN0")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
@@ -798,42 +554,46 @@ INPUT_PORTS_END
void ssfindo_state::ssfindo(machine_config &config)
{
- /* basic machine hardware */
- ARM7(config, m_maincpu, 54000000); // guess...
+ ARM7(config, m_maincpu, 54000000);
m_maincpu->set_addrmap(AS_PROGRAM, &ssfindo_state::ssfindo_map);
- m_maincpu->set_vblank_int("screen", FUNC(ssfindo_state::interrupt));
I2C_24C01(config, m_i2cmem);
- screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
- screen.set_refresh_hz(60);
- screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
- screen.set_size(320, 256);
- screen.set_visarea(0, 319, 0, 239);
- screen.set_screen_update(FUNC(ssfindo_state::screen_update));
- screen.set_palette(m_palette);
-
- PALETTE(config, m_palette).set_entries(256);
+ SCREEN(config, "screen", SCREEN_TYPE_RASTER);
+
+ ARM_VIDC20(config, m_vidc, 24_MHz_XTAL);
+ m_vidc->set_screen("screen");
+ m_vidc->vblank().set(m_iomd, FUNC(arm_iomd_device::vblank_irq));
+ m_vidc->sound_drq().set(m_iomd, FUNC(arm_iomd_device::sound_drq));
+
+ ARM7500FE_IOMD(config, m_iomd, 54000000);
+ m_iomd->set_host_cpu_tag(m_maincpu);
+ m_iomd->set_vidc_tag(m_vidc);
+ m_iomd->iolines_read().set(FUNC(ssfindo_state::iolines_r));
+ m_iomd->iolines_write().set(FUNC(ssfindo_state::iolines_w));
}
void ssfindo_state::ppcar(machine_config &config)
{
ssfindo(config);
- /* basic machine hardware */
m_maincpu->set_addrmap(AS_PROGRAM, &ssfindo_state::ppcar_map);
config.device_remove("i2cmem");
}
-void ssfindo_state::tetfight(machine_config &config)
+void tetfight_state::tetfight(machine_config &config)
{
ppcar(config);
- /* basic machine hardware */
- m_maincpu->set_addrmap(AS_PROGRAM, &ssfindo_state::tetfight_map);
+ m_maincpu->set_addrmap(AS_PROGRAM, &tetfight_state::tetfight_map);
I2C_24C02(config, m_i2cmem);
+
+ m_iomd->iocr_read_od<0>().set(FUNC(tetfight_state::iocr_od0_r));
+ m_iomd->iocr_read_od<1>().set(FUNC(tetfight_state::iocr_od1_r));
+ m_iomd->iocr_write_od<0>().set(FUNC(tetfight_state::iocr_od0_w));
+ m_iomd->iocr_write_od<1>().set(FUNC(tetfight_state::iocr_od1_w));
}
ROM_START( ssfindo )
@@ -909,11 +669,11 @@ ROM_END
void ssfindo_state::init_common()
{
m_speedup = nullptr;
- m_PS7500timer0 = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(ssfindo_state::PS7500_Timer0_callback),this));
- m_PS7500timer1 = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(ssfindo_state::PS7500_Timer1_callback),this));
+ //m_PS7500timer0 = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(ssfindo_state::PS7500_Timer0_callback),this));
+ //m_PS7500timer1 = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(ssfindo_state::PS7500_Timer1_callback),this));
- save_item(NAME(m_PS7500_IO));
- save_item(NAME(m_PS7500_FIFO));
+ //save_item(NAME(m_PS7500_IO));
+ //save_item(NAME(m_PS7500_FIFO));
}
void ssfindo_state::init_ssfindo()
@@ -921,12 +681,6 @@ void ssfindo_state::init_ssfindo()
init_common();
m_flashType = 0;
m_speedup = &ssfindo_state::ssfindo_speedups;
- m_iocr_hack = 0;
-
- save_item(NAME(m_flashAdr));
- save_item(NAME(m_flashOffset));
- save_item(NAME(m_adrLatch));
- save_item(NAME(m_flashN));
}
void ssfindo_state::init_ppcar()
@@ -936,13 +690,12 @@ void ssfindo_state::init_ppcar()
m_speedup = &ssfindo_state::ppcar_speedups;
}
-void ssfindo_state::init_tetfight()
+void tetfight_state::init_tetfight()
{
init_common();
m_flashType = 0;
- m_iocr_hack = 1;
}
GAME( 1999, ssfindo, 0, ssfindo, ssfindo, ssfindo_state, init_ssfindo, ROT0, "Icarus", "See See Find Out", MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1999, ppcar, 0, ppcar, ppcar, ssfindo_state, init_ppcar, ROT0, "Icarus", "Pang Pang Car", MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE )
-GAME( 2001, tetfight,0, tetfight, tetfight, ssfindo_state, init_tetfight, ROT0, "Sego", "Tetris Fighters", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
+GAME( 2001, tetfight,0, tetfight, tetfight, tetfight_state, init_tetfight, ROT0, "Sego", "Tetris Fighters", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )