summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/tlcs900
diff options
context:
space:
mode:
author 987123879113 <63495610+987123879113@users.noreply.github.com>2023-04-18 23:49:56 +0900
committer GitHub <noreply@github.com>2023-04-19 00:49:56 +1000
commitfd4f5150247460fbbeaa556515f2229052c23abe (patch)
treea588ce3ea0d505ca22f73b343c571e526a843d29 /src/devices/cpu/tlcs900
parent87dc49048b17dd187f06db744f21e5cfe8246706 (diff)
namco/namcos10.cpp: More dumps/redumps, new decryption devices, and more I/O emulation. (#11114)
* Implemented the basics of the MEM(P3) memory/I/O board. * Added controls for more games. * Marked Pacman BALL as a bad dump. * Marked all games as MACHINE_IMPERFECT_SOUND in anticipation of complaints. * cpu/tlcs900/tmp95c061.cpp: Added basic ADC support (based on TMP95C063). * namco/namcos10_exio.cpp: Added System 10 I/O expander board (EXIO) emulation. * namco/ns10crypt.cpp: Moved per-game decryption setup to client configuration. * Added decryption setups for GAHAHA Ippatsudou, Golgo 13: Juusei no Requiem, Sekai Kaseki Hakken, Pacman BALL, Medal no Tatsujin, Medal no Tatsujin 2 and Sugorotic JAPAN. [Samuel Neves, Peter Wilhelmsen] Systems promoted to working ---------------------------- GAHAHA Ippatsudou (World, GID2 Ver.A) [Samuel Neves, Peter Wilhelmsen, Windy Fairy] GAHAHA Ippatsudou 2 (Japan, GIS1 Ver.A) [Samuel Neves, Peter Wilhelmsen, Windy Fairy] Golgo 13: Juusei no Requiem (Japan, GLT1 VER.A) [Samuel Neves, Peter Wilhelmsen, Windy Fairy] Kotoba no Puzzle Mojipittan (Japan, KPM1 Ver.A) [Brizzo, Smitdogg, The Dumping Union, Windy Fairy] New systems marked not working -------------------------------- Sugorotic JAPAN (STJ1 Ver.C) [Brizzo, Smitdogg, The Dumping Union] Tsukkomi Yousei Gips Nice Tsukkomi (NTK1 Ver.A) [Guru]
Diffstat (limited to 'src/devices/cpu/tlcs900')
-rw-r--r--src/devices/cpu/tlcs900/tmp95c061.cpp41
-rw-r--r--src/devices/cpu/tlcs900/tmp95c061.h4
2 files changed, 35 insertions, 10 deletions
diff --git a/src/devices/cpu/tlcs900/tmp95c061.cpp b/src/devices/cpu/tlcs900/tmp95c061.cpp
index d297ba73fcf..3fd8be4fe32 100644
--- a/src/devices/cpu/tlcs900/tmp95c061.cpp
+++ b/src/devices/cpu/tlcs900/tmp95c061.cpp
@@ -30,6 +30,7 @@ tmp95c061_device::tmp95c061_device(const machine_config &mconfig, const char *ta
m_porta_write(*this),
m_portb_read(*this),
m_portb_write(*this),
+ m_an_read(*this),
m_port_latch{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
m_port_control{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
m_port_function{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
@@ -206,6 +207,7 @@ void tmp95c061_device::device_start()
m_porta_write.resolve_safe();
m_portb_read.resolve_safe(0);
m_portb_write.resolve_safe();
+ m_an_read.resolve_all_safe(0);
}
void tmp95c061_device::device_reset()
@@ -550,15 +552,29 @@ void tmp95c061_device::tlcs900_handle_ad()
if ( m_ad_cycles_left <= 0 )
{
/* Store A/D converted value */
- switch( m_ad_mode & 0x03 )
+ if ( ( m_ad_mode & 0x10 ) == 0 )
{
- case 0x00: /* AN0 */
- m_ad_result[0] = 0x3ff;
- break;
- case 0x01: /* AN1 */
- case 0x02: /* AN2 */
- case 0x03: /* AN3 */
- break;
+ /* conversion channel fixed */
+ m_ad_result[m_ad_mode & 0x03] = m_an_read[m_ad_mode & 0x03](0) & 0x3ff;
+ }
+ else
+ {
+ /* conversion channel sweep */
+ switch( m_ad_mode & 0x03 )
+ {
+ case 0x03: /* AN3 */
+ m_ad_result[3] = m_an_read[3](0) & 0x3ff;
+ [[fallthrough]];
+ case 0x02: /* AN2 */
+ m_ad_result[2] = m_an_read[2](0) & 0x3ff;
+ [[fallthrough]];
+ case 0x01: /* AN1 */
+ m_ad_result[1] = m_an_read[1](0) & 0x3ff;
+ [[fallthrough]];
+ case 0x00: /* AN0 */
+ m_ad_result[0] = m_an_read[0](0) & 0x3ff;
+ break;
+ }
}
/* Clear BUSY flag, set END flag */
@@ -1355,10 +1371,15 @@ void tmp95c061_device::ode_w(uint8_t data)
uint8_t tmp95c061_device::adreg_r(offs_t offset)
{
+ // ADMOD EOCF is cleared to 0 when reading any ADREG0..3
+ m_ad_mode &= ~0x80;
+
if (BIT(offset, 0))
return m_ad_result[offset >> 1] >> 2;
- else
- return m_ad_result[offset >> 1] << 6 | 0x3f;
+
+ // Reading data from the upper 8 bits clears INTE0AD IADC
+ m_int_reg[TMP95C061_INTE0AD] &= ~0x80;
+ return m_ad_result[offset >> 1] << 6 | 0x3f;
}
uint8_t tmp95c061_device::admod_r()
diff --git a/src/devices/cpu/tlcs900/tmp95c061.h b/src/devices/cpu/tlcs900/tmp95c061.h
index 10d8193f6e6..106ca5c57ce 100644
--- a/src/devices/cpu/tlcs900/tmp95c061.h
+++ b/src/devices/cpu/tlcs900/tmp95c061.h
@@ -33,6 +33,7 @@ public:
auto porta_write() { return m_porta_write.bind(); }
auto portb_read() { return m_portb_read.bind(); }
auto portb_write() { return m_portb_write.bind(); }
+ template <size_t Bit> auto an_read() { return m_an_read[Bit].bind(); }
protected:
virtual void device_config_complete() override;
@@ -183,6 +184,9 @@ private:
devcb_read8 m_portb_read;
devcb_write8 m_portb_write;
+ // analogue inputs, sampled at 10 bits
+ devcb_read16::array<4> m_an_read;
+
// I/O Port Control
uint8_t m_port_latch[0xc];
uint8_t m_port_control[0xc];