diff --git a/.gitattributes b/.gitattributes index cd50230aa1f..ed708bdba50 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1177,6 +1177,8 @@ src/emu/machine/rtc65271.c svneol=native#text/plain src/emu/machine/rtc65271.h svneol=native#text/plain src/emu/machine/rtc9701.c svneol=native#text/plain src/emu/machine/rtc9701.h svneol=native#text/plain +src/emu/machine/s3520cf.c svneol=native#text/plain +src/emu/machine/s3520cf.h svneol=native#text/plain src/emu/machine/s3c2400.c svneol=native#text/plain src/emu/machine/s3c2400.h svneol=native#text/plain src/emu/machine/s3c2410.c svneol=native#text/plain diff --git a/src/emu/emu.mak b/src/emu/emu.mak index 2a23a729625..7fb080c4590 100644 --- a/src/emu/emu.mak +++ b/src/emu/emu.mak @@ -242,6 +242,7 @@ EMUMACHINEOBJS = \ $(EMUMACHINE)/s3c2400.o \ $(EMUMACHINE)/s3c2410.o \ $(EMUMACHINE)/s3c2440.o \ + $(EMUMACHINE)/s3520cf.o \ $(EMUMACHINE)/scsi.o \ $(EMUMACHINE)/scsicd.o \ $(EMUMACHINE)/scsidev.o \ diff --git a/src/emu/machine/s3520cf.c b/src/emu/machine/s3520cf.c new file mode 100644 index 00000000000..9aeb8eca1f6 --- /dev/null +++ b/src/emu/machine/s3520cf.c @@ -0,0 +1,191 @@ +/*************************************************************************** + +Seiko/Epson S-3520CF + +preliminary device by Angelo Salese + +TODO: +- kludge on address? + +***************************************************************************/ + +#include "emu.h" +#include "machine/s3520cf.h" + + + +//************************************************************************** +// GLOBAL VARIABLES +//************************************************************************** + +// device type definition +const device_type S3520CF = &device_creator; + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// s3520cf_device - constructor +//------------------------------------------------- + +s3520cf_device::s3520cf_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, S3520CF, "s3520cf", tag, owner, clock) +{ + +} + + +//------------------------------------------------- +// device_validity_check - perform validity checks +// on this device +//------------------------------------------------- + +void s3520cf_device::device_validity_check(validity_checker &valid) const +{ +} + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void s3520cf_device::device_start() +{ + +} + + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void s3520cf_device::device_reset() +{ +} + +//------------------------------------------------- +// rtc_read - used to route RTC reading registers +//------------------------------------------------- + +inline UINT8 s3520cf_device::rtc_read(UINT8 offset) +{ + UINT8 res; + + res = 0; + + switch(offset) + { +// case 0: // 1 sec +// case 1: // 10 sec +// case 2: // 1 min +// case 3: // 10 min +// case 6: // week +// case 7: // 1 day + case 4: // 1 hour + res = 1; + break; + case 5: // 10 hour + res = 2; + break; + } + + + + return res; +} + +inline void s3520cf_device::rtc_write(UINT8 offset,UINT8 data) +{ + +} + + +//************************************************************************** +// READ/WRITE HANDLERS +//************************************************************************** + +READ_LINE_MEMBER( s3520cf_device::read_bit ) +{ + return m_read_latch; +} + +WRITE_LINE_MEMBER( s3520cf_device::set_dir_line ) +{ + //printf("%d DIR LINE\n",state); + + m_dir = state; +} + +WRITE_LINE_MEMBER( s3520cf_device::set_cs_line ) +{ + m_reset_line = state; + + //printf("%d CS LINE\n",state); + + if(m_reset_line != CLEAR_LINE) + { + //printf("Reset asserted\n"); + m_current_cmd = 0; + m_cmd_stream_pos = 0; + m_rtc_state = RTC_SET_ADDRESS; + //m_latch = 0; + } +} + +WRITE_LINE_MEMBER( s3520cf_device::write_bit ) +{ + m_latch = state; +// printf("%d LATCH LINE\n",state); +} + +WRITE_LINE_MEMBER( s3520cf_device::set_clock_line ) +{ + if(state == 1 && m_reset_line == CLEAR_LINE) + { + //printf("%d %d\n",m_latch, m_dir); + + switch(m_rtc_state) + { + case RTC_SET_ADDRESS: + m_current_cmd = (m_current_cmd >> 1) | ((m_latch<<3)&8); + m_cmd_stream_pos++; + + if(m_cmd_stream_pos == 4) + { + m_rtc_addr = (m_current_cmd + 1) & 0xf; /* TODO: +1??? */ + m_rtc_state = RTC_SET_DATA; + m_cmd_stream_pos = 0; + m_current_cmd = 0; + } + break; + case RTC_SET_DATA: + if(m_dir == 1) // READ + { + //if(m_cmd_stream_pos == 0) + { + //printf("%02x %d\n",m_rtc_addr,m_cmd_stream_pos); + } + m_read_latch = (rtc_read(m_rtc_addr) >> (m_cmd_stream_pos)) & 1; + } + + m_current_cmd = (m_current_cmd >> 1) | ((m_latch<<3)&8); + m_cmd_stream_pos++; + if(m_cmd_stream_pos == 4) + { + if(m_dir == 0) // WRITE + { + printf("%02x %02x\n",m_rtc_addr,m_current_cmd); + rtc_write(m_rtc_addr,m_current_cmd); + } + + m_rtc_addr = m_current_cmd; + m_rtc_state = RTC_SET_ADDRESS; + m_cmd_stream_pos = 0; + m_current_cmd = 0; + } + break; + } + } +} diff --git a/src/emu/machine/s3520cf.h b/src/emu/machine/s3520cf.h new file mode 100644 index 00000000000..6f3e5c4ca4a --- /dev/null +++ b/src/emu/machine/s3520cf.h @@ -0,0 +1,80 @@ +/*************************************************************************** + +Template for skeleton device + +***************************************************************************/ + +#pragma once + +#ifndef __S3520CFDEV_H__ +#define __S3520CFDEV_H__ + + + +//************************************************************************** +// INTERFACE CONFIGURATION MACROS +//************************************************************************** + +#define MCFG_S3520CF_ADD(_tag) \ + MCFG_DEVICE_ADD(_tag, S3520CF, XTAL_32_768kHz) \ + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +typedef enum +{ + RTC_SET_ADDRESS = 0, + RTC_SET_DATA +} s3520cf_state_t; + + +// ======================> s3520cf_device + +class s3520cf_device : public device_t +{ +public: + // construction/destruction + s3520cf_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // I/O operations + READ_LINE_MEMBER( read_bit ); + WRITE_LINE_MEMBER( set_dir_line ); + WRITE_LINE_MEMBER( set_cs_line ); + WRITE_LINE_MEMBER( set_clock_line ); + WRITE_LINE_MEMBER( write_bit ); + +protected: + // device-level overrides + virtual void device_validity_check(validity_checker &valid) const; + virtual void device_start(); + virtual void device_reset(); + inline UINT8 rtc_read(UINT8 offset); + inline void rtc_write(UINT8 offset,UINT8 data); + + int m_dir; + int m_latch; + int m_reset_line; + int m_read_latch; + UINT8 m_current_cmd; + UINT8 m_cmd_stream_pos; + UINT8 m_rtc_addr; + + s3520cf_state_t m_rtc_state; + +}; + + +// device type definition +extern const device_type S3520CF; + + + +//************************************************************************** +// GLOBAL VARIABLES +//************************************************************************** + + + +#endif diff --git a/src/emu/video/m50458.c b/src/emu/video/m50458.c index fc653cb01af..78eede0e54e 100644 --- a/src/emu/video/m50458.c +++ b/src/emu/video/m50458.c @@ -2,6 +2,8 @@ Mitsubishi M50458 OSD chip +preliminary device by Angelo Salese + ***************************************************************************/ #include "emu.h" @@ -19,6 +21,7 @@ const device_type M50458 = &device_creator; static ADDRESS_MAP_START( m50458_vram, AS_0, 16, m50458_device ) AM_RANGE(0x0000, 0x023f) AM_RAM // vram AM_RANGE(0x0240, 0x0241) AM_WRITE(vreg_120_w) + AM_RANGE(0x024c, 0x024d) AM_WRITE(vreg_126_w) AM_RANGE(0x024e, 0x024f) AM_WRITE(vreg_127_w) ADDRESS_MAP_END @@ -30,8 +33,15 @@ ROM_END WRITE16_MEMBER( m50458_device::vreg_120_w) { + // ... } +WRITE16_MEMBER( m50458_device::vreg_126_w) +{ + // ... +} + + WRITE16_MEMBER( m50458_device::vreg_127_w) { if(data & 0x20) // RAMERS, display RAM is erased diff --git a/src/emu/video/m50458.h b/src/emu/video/m50458.h index d991a323ef0..17672938e3b 100644 --- a/src/emu/video/m50458.h +++ b/src/emu/video/m50458.h @@ -29,11 +29,6 @@ typedef enum OSD_SET_DATA } m50458_state_t; -typedef struct -{ - UINT8 r,g,b; -} m50458_bg_t; - // ======================> m50458_device class m50458_device : public device_t, @@ -48,6 +43,7 @@ public: WRITE_LINE_MEMBER( set_cs_line ); WRITE_LINE_MEMBER( set_clock_line ); DECLARE_WRITE16_MEMBER(vreg_120_w); + DECLARE_WRITE16_MEMBER(vreg_126_w); DECLARE_WRITE16_MEMBER(vreg_127_w); UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); @@ -66,9 +62,9 @@ protected: UINT16 m_current_cmd; int m_cmd_stream_pos; UINT16 m_osd_addr; + UINT8 m_bg_pen; m50458_state_t m_osd_state; - m50458_bg_t m_m50458_bg; private: inline UINT16 read_word(offs_t address); diff --git a/src/mame/drivers/nss.c b/src/mame/drivers/nss.c index a24f73e20b8..bcb745dd425 100644 --- a/src/mame/drivers/nss.c +++ b/src/mame/drivers/nss.c @@ -296,6 +296,7 @@ Contra III CONTRA_III_1 TC574000 CONTRA_III_0 TC574000 GAME1_NSSU #include "emu.h" #include "cpu/z80/z80.h" #include "machine/eeprom.h" +#include "machine/s3520cf.h" #include "video/m50458.h" #include "includes/snes.h" #include "rendlay.h" @@ -306,10 +307,12 @@ class nss_state : public snes_state public: nss_state(const machine_config &mconfig, device_type type, const char *tag) : snes_state(mconfig, type, tag), - m_m50458(*this,"m50458") + m_m50458(*this,"m50458"), + m_s3520cf(*this, "s3520cf") { } required_device m_m50458; + required_device m_s3520cf; UINT8 m_wram_wp_flag; UINT8 *m_wram; UINT8 m_nmi_enable; @@ -540,7 +543,7 @@ WRITE8_MEMBER(nss_state::rtc_osd_w) ---- --x- RTC Direction (0=Low=Write, 1=High=Read) ---- ---x RTC /CS (0=Low/Select, 1=High/No) */ - /* TODO */ +// printf("%02x\n",data & 0xf); ioport("RTC_OSD")->write(data, 0xff); } @@ -550,6 +553,7 @@ static ADDRESS_MAP_START( bios_io_map, AS_IO, 8, nss_state ) AM_RANGE(0x00, 0x00) AM_READ(port_00_r) AM_WRITE(port_00_w) AM_RANGE(0x01, 0x01) AM_READ_PORT("FP") AM_RANGE(0x02, 0x02) AM_READ_PORT("SYSTEM") AM_WRITE(rtc_osd_w) + AM_RANGE(0x03, 0x03) AM_READ_PORT("RTC") AM_RANGE(0x72, 0x72) AM_WRITE(rtc_osd_w) AM_RANGE(0x80, 0x80) AM_WRITE(port_00_w) @@ -608,9 +612,17 @@ static INPUT_PORTS_START( snes ) PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("eeprom", eeprom_device, set_cs_line) PORT_START("RTC_OSD") - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("m50458", m50458_device, set_clock_line) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("m50458", m50458_device, set_clock_line) PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("m50458", m50458_device, write_bit) PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("m50458", m50458_device, set_cs_line) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("s3520cf", s3520cf_device, set_clock_line) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("s3520cf", s3520cf_device, write_bit) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("s3520cf", s3520cf_device, set_dir_line) + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("s3520cf", s3520cf_device, set_cs_line) + + PORT_START("RTC") + PORT_BIT( 0xfe, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_READ_LINE_DEVICE_MEMBER("s3520cf", s3520cf_device, read_bit) PORT_START("SERIAL1_DATA1_L") PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P1 Button A") PORT_PLAYER(1) @@ -771,6 +783,9 @@ static MACHINE_CONFIG_DERIVED( nss, snes ) MCFG_CPU_IO_MAP(bios_io_map) MCFG_CPU_VBLANK_INT("screen", nss_vblank_irq) + MCFG_M50458_ADD("m50458",4000000) /* TODO: clock */ + MCFG_S3520CF_ADD("s3520cf") /* RTC */ + /* TODO: the screen should actually superimpose, but for the time being let's just separate outputs for now */ MCFG_DEFAULT_LAYOUT(layout_dualhsxs) @@ -783,8 +798,6 @@ static MACHINE_CONFIG_DERIVED( nss, snes ) MCFG_EEPROM_ADD("eeprom", nss_eeprom_intf) - MCFG_M50458_ADD("m50458",4000000) /* TODO: clock */ - MCFG_MACHINE_START( nss ) MACHINE_CONFIG_END diff --git a/src/mame/etc/template_device.c b/src/mame/etc/template_device.c index b8489ed998a..15e35712566 100644 --- a/src/mame/etc/template_device.c +++ b/src/mame/etc/template_device.c @@ -14,7 +14,7 @@ Template for skeleton device //************************************************************************** // device type definition -const device_type xxx = &device_creator; +const device_type XXX = &device_creator; //************************************************************************** @@ -26,7 +26,7 @@ const device_type xxx = &device_creator; //------------------------------------------------- xxx_device::xxx_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) - : device_t(mconfig, xxx, "xxx", tag, owner, clock) + : device_t(mconfig, XXX, "xxx", tag, owner, clock) { }