summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--android-project/app/src/main/AndroidManifest.xml4
-rw-r--r--hash/pv2000.xml43
-rw-r--r--makefile4
-rw-r--r--scripts/target/mame/mess.lua1
-rw-r--r--src/devices/bus/coco/coco_t4426.cpp257
-rw-r--r--src/devices/cpu/i8089/i8089_channel.cpp6
-rw-r--r--src/devices/machine/6821pia.cpp55
-rw-r--r--src/devices/machine/mc14411.cpp4
-rw-r--r--src/emu/drivers/xtal.h1
-rw-r--r--src/mame/drivers/4enraya.cpp87
-rw-r--r--src/mame/drivers/altos8600.cpp46
-rw-r--r--src/mame/drivers/coco12.cpp2
-rw-r--r--src/mame/drivers/jvh.cpp21
-rw-r--r--src/mame/drivers/ms6102.cpp292
-rw-r--r--src/mame/drivers/proteus3.cpp88
-rw-r--r--src/mame/drivers/vector06.cpp33
-rw-r--r--src/mame/includes/vector06.h16
-rw-r--r--src/mame/machine/vector06.cpp30
-rw-r--r--src/mame/mame.lst6
-rw-r--r--src/mame/mess.flt1
20 files changed, 771 insertions, 226 deletions
diff --git a/android-project/app/src/main/AndroidManifest.xml b/android-project/app/src/main/AndroidManifest.xml
index bd1e1beab2e..397dce08615 100644
--- a/android-project/app/src/main/AndroidManifest.xml
+++ b/android-project/app/src/main/AndroidManifest.xml
@@ -4,8 +4,8 @@
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.mamedev.mame"
- android:versionCode="189"
- android:versionName="0.189"
+ android:versionCode="190"
+ android:versionName="0.190"
android:installLocation="auto">
<!-- Android 5.0 -->
diff --git a/hash/pv2000.xml b/hash/pv2000.xml
index 56db4048246..726a2342546 100644
--- a/hash/pv2000.xml
+++ b/hash/pv2000.xml
@@ -4,20 +4,20 @@
<!--
-Undumped carts:
-
- * Real Number Basic - Jissuu BASIC - 実数Basic
- * GPB-111 - Exciting Jockey - Daishougai Keiba - 大障害競馬 [Cart number 11]
+No known undumped carts
-->
<software name="excitem2">
<description>Excite Mahjong 2</description>
+ <info name="serial" value="GPB-110"/>
<year>1983</year>
<publisher>Casio</publisher>
<part name="cart" interface="pv2000_cart">
+ <feature name="pcb" value="P115-1A"/>
<dataarea name="rom" size="16384">
- <rom name="excitem2.bin" size="16384" crc="a2698c56" sha1="90113d7c065a6f12126c03da8ee59185bf60efc3" offset="0" />
+ <rom name="Rom1.bin" size="8192" crc="2671b9d8" sha1="9a5972c35e144904f5267e8ef94798ee38ac6fef" offset="0" /> <!-- 2764, desoldered and dumped -->
+ <rom name="Rom2.bin" size="8192" crc="bf6945fd" sha1="349a5a4153eda5239d6b9b7801ca6ed67f94db4c" offset="8192" /> <!-- 2764, desoldered and dumped -->
</dataarea>
</part>
</software>
@@ -79,11 +79,14 @@ Undumped carts:
<software name="rakugaki">
<description>Rakugaki Special</description>
+ <info name="serial" value="GPB-109"/>
<year>1983</year>
<publisher>Casio</publisher>
<part name="cart" interface="pv2000_cart">
+ <feature name="pcb" value="P115-1A"/>
<dataarea name="rom" size="16384">
- <rom name="rakugaki.bin" size="16384" crc="a34d1bd1" sha1="54a543d08e865c85c32358edce8a6fcfa3ad9fcc" offset="0" />
+ <rom name="Rom1.bin" size="8192" crc="08704dda" sha1="038decee4f74f01e37882175cf0aa8f101f2ff7d" offset="0" /> <!-- 2764, desoldered and dumped -->
+ <rom name="Rom2.bin" size="8192" crc="c1b3e57d" sha1="10df247dc6084ebd3c4e21a09ee5e7be0c5ff85e" offset="8192" /> <!-- 2764, desoldered and dumped -->
</dataarea>
</part>
</software>
@@ -120,4 +123,32 @@ Undumped carts:
</dataarea>
</part>
</software>
+
+ <software name="exjockey">
+ <description>Exciting Jockey</description>
+ <info name="serial" value="GPB-111"/>
+ <info name="alt_title" value="大障害競馬"/>
+ <year>1984</year>
+ <publisher>Casio</publisher>
+ <part name="cart" interface="pv2000_cart">
+ <feature name="pcb" value="P109-1A"/>
+ <dataarea name="rom" size="16384">
+ <rom name="Exciting Jockey.bin" size="16384" crc="450174c3" sha1="97a5200f801ffd800b2328f0e1a224d5ed6904e0" offset="0" /> <!-- 27128, desoldered and dumped -->
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="basic">
+ <description>Real Number Basic</description>
+ <info name="alt_title" value="実数Basic"/>
+ <year>198?</year>
+ <publisher>Casio</publisher>
+ <part name="cart" interface="pv2000_cart">
+ <feature name="pcb" value="P115-1A"/>
+ <dataarea name="rom" size="16384">
+ <rom name="Rom1.bin" size="8192" crc="43ac2c5b" sha1="a56989d02db54974a64136a6abe0cd1861b38245" offset="0" /> <!-- 2764, desoldered and dumped -->
+ <rom name="Rom2.bin" size="8192" crc="4725e98d" sha1="3e55de11c66ae91eb40c586c73c3035fd7bcffac" offset="8192" /> <!-- 2764, desoldered and dumped -->
+ </dataarea>
+ </part>
+ </software>
</softwarelist>
diff --git a/makefile b/makefile
index e55d1485f43..145b21c701e 100644
--- a/makefile
+++ b/makefile
@@ -1546,14 +1546,14 @@ endif
ifeq (posix,$(SHELLTYPE))
$(GENDIR)/version.cpp: $(GENDIR)/git_desc | $(GEN_FOLDERS)
- @echo '#define BARE_BUILD_VERSION "0.189"' > $@
+ @echo '#define BARE_BUILD_VERSION "0.190"' > $@
@echo 'extern const char bare_build_version[];' >> $@
@echo 'extern const char build_version[];' >> $@
@echo 'const char bare_build_version[] = BARE_BUILD_VERSION;' >> $@
@echo 'const char build_version[] = BARE_BUILD_VERSION " ($(NEW_GIT_VERSION))";' >> $@
else
$(GENDIR)/version.cpp: $(GENDIR)/git_desc
- @echo #define BARE_BUILD_VERSION "0.189" > $@
+ @echo #define BARE_BUILD_VERSION "0.190" > $@
@echo extern const char bare_build_version[]; >> $@
@echo extern const char build_version[]; >> $@
@echo const char bare_build_version[] = BARE_BUILD_VERSION; >> $@
diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua
index 2a28a87bc5f..a28ea4195de 100644
--- a/scripts/target/mame/mess.lua
+++ b/scripts/target/mame/mess.lua
@@ -1898,6 +1898,7 @@ files {
MAME_DIR .. "src/mame/machine/ms7004.h",
MAME_DIR .. "src/mame/drivers/mk85.cpp",
MAME_DIR .. "src/mame/drivers/mk90.cpp",
+ MAME_DIR .. "src/mame/drivers/ms6102.cpp",
}
createMESSProjects(_target, _subtarget, "elektor")
diff --git a/src/devices/bus/coco/coco_t4426.cpp b/src/devices/bus/coco/coco_t4426.cpp
index aed2e990c94..7887cdba6cc 100644
--- a/src/devices/bus/coco/coco_t4426.cpp
+++ b/src/devices/bus/coco/coco_t4426.cpp
@@ -18,7 +18,7 @@
* | +-----+ oo 9600 +--+ +--+ +--+ |
* | +-------------+ |MC| |
* | +-----+ +-----+ +-----+ | EF68B50P | |14| |
- * | | 2764| | 2764| | | | ACIA | |89| |
+ * | | 2764| | 2764| | 2732| | ACIA | |89| |
* | | | | | | | +-------------+ +--+ |
* | |CA | |CA | |PMOS | |
* | | 4426| | 4426| | 4426| +-------------------+ |
@@ -42,26 +42,22 @@
#include "emu.h"
#include "cococart.h"
#include "machine/6850acia.h"
+#include "bus/rs232/rs232.h"
+#include "machine/mc14411.h"
#include "machine/6821pia.h"
+//#define LOG_GENERAL (1U << 0)
+#define LOG_SETUP (1U << 1)
+#define LOG_PIA (1U << 2)
+#define LOG_ACIA (1U << 3)
-#define LOG_GENERAL 0x01
-#define LOG_SETUP 0x02
-#define LOG_PRINTF 0x04
-#define LOG_PIA 0x08
+//#define VERBOSE (LOG_ACIA|LOG_GENERAL) // (LOG_PIA | LOG_GENERAL | LOG_SETUP)
+//#define LOG_OUTPUT_STREAM std::cout
+#include "logmacro.h"
-#define VERBOSE 0 //(LOG_PIA | LOG_PRINTF | LOG_SETUP | LOG_GENERAL)
-
-#define LOGMASK(mask, ...) do { if (VERBOSE & mask) logerror(__VA_ARGS__); } while (0)
-#define LOGLEVEL(mask, level, ...) do { if ((VERBOSE & mask) >= level) logerror(__VA_ARGS__); } while (0)
-
-#define LOG(...) LOGMASK(LOG_GENERAL, __VA_ARGS__)
-#define LOGSETUP(...) LOGMASK(LOG_SETUP, __VA_ARGS__)
-#define LOGPIA(...) LOGMASK(LOG_PIA, __VA_ARGS__)
-
-#if VERBOSE & LOG_PRINTF
-#define logerror printf
-#endif
+#define LOGSETUP(...) LOGMASKED(LOG_SETUP, __VA_ARGS__)
+#define LOGPIA(...) LOGMASKED(LOG_PIA, __VA_ARGS__)
+#define LOGACIA(...) LOGMASKED(LOG_ACIA, __VA_ARGS__)
#ifdef _MSC_VER
#define FUNCNAME __func__
@@ -73,10 +69,15 @@
CONSTANTS
***************************************************************************/
-#define UART_TAG "acia"
-#define PIA_TAG "pia"
-#define CARTSLOT_TAG "t4426"
-#define CART_AUTOSTART_TAG "cart_autostart"
+#define UART_TAG "acia"
+#define SERIAL_TAG "ser2" // Labled "Ser.I/O2 RC 232C" on the back of the case
+#define BRG_TAG "brg"
+#define SERIAL_BRF "serial_brf"
+#define SERIAL_BAUD "serial_baud"
+#define PIA_TAG "pia"
+#define CARTSLOT_TAG "t4426"
+#define CARTBANK_TAG "t4426_banks"
+#define CART_AUTOSTART_TAG "cart_autostart"
//**************************************************************************
// TYPE DEFINITIONS
@@ -84,8 +85,6 @@
namespace
{
- // ======================> coco_t4426_device
-
class coco_t4426_device :
public device_t,
public device_cococart_interface
@@ -102,6 +101,17 @@ namespace
virtual uint8_t* get_cart_base() override;
DECLARE_WRITE8_MEMBER(pia_A_w);
+ // Clocks
+ void write_acia_clocks(int id, int state);
+ DECLARE_WRITE_LINE_MEMBER (write_f1_clock){ write_acia_clocks(mc14411_device::TIMER_F1, state); }
+ DECLARE_WRITE_LINE_MEMBER (write_f3_clock){ write_acia_clocks(mc14411_device::TIMER_F3, state); }
+ DECLARE_WRITE_LINE_MEMBER (write_f5_clock){ write_acia_clocks(mc14411_device::TIMER_F5, state); }
+ DECLARE_WRITE_LINE_MEMBER (write_f7_clock){ write_acia_clocks(mc14411_device::TIMER_F7, state); }
+ DECLARE_WRITE_LINE_MEMBER (write_f8_clock){ write_acia_clocks(mc14411_device::TIMER_F8, state); }
+ DECLARE_WRITE_LINE_MEMBER (write_f9_clock){ write_acia_clocks(mc14411_device::TIMER_F9, state); }
+ DECLARE_WRITE_LINE_MEMBER (write_f11_clock){ write_acia_clocks(mc14411_device::TIMER_F11, state); }
+ DECLARE_WRITE_LINE_MEMBER (write_f13_clock){ write_acia_clocks(mc14411_device::TIMER_F13, state); }
+ DECLARE_WRITE_LINE_MEMBER (write_f15_clock){ write_acia_clocks(mc14411_device::TIMER_F15, state); }
protected:
coco_t4426_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
@@ -121,6 +131,11 @@ namespace
// internal state
required_device<acia6850_device> m_uart;
required_device<pia6821_device> m_pia;
+ required_device<mc14411_device> m_brg;
+
+ required_ioport m_serial_baud;
+
+ void set_bank();
};
};
@@ -130,33 +145,50 @@ namespace
***************************************************************************/
MACHINE_CONFIG_MEMBER(coco_t4426_device::device_add_mconfig)
- MCFG_DEVICE_ADD(UART_TAG, ACIA6850, 0) // TODO: Figure out address mapping for ACIA
MCFG_DEVICE_ADD(PIA_TAG, PIA6821, 0)
MCFG_PIA_WRITEPA_HANDLER(WRITE8(coco_t4426_device, pia_A_w))
+
+ MCFG_DEVICE_ADD(UART_TAG, ACIA6850, 0)
+
+ MCFG_ACIA6850_TXD_HANDLER (DEVWRITELINE (SERIAL_TAG, rs232_port_device, write_txd))
+ MCFG_ACIA6850_RTS_HANDLER (DEVWRITELINE (SERIAL_TAG, rs232_port_device, write_rts))
+
+ MCFG_RS232_PORT_ADD (SERIAL_TAG, default_rs232_devices, nullptr)
+ MCFG_RS232_RXD_HANDLER (DEVWRITELINE (UART_TAG, acia6850_device, write_rxd))
+ MCFG_RS232_CTS_HANDLER (DEVWRITELINE (UART_TAG, acia6850_device, write_cts))
+
+ /* Bit Rate Generator */
+ MCFG_MC14411_ADD (BRG_TAG, XTAL_1_8432MHz)
+ MCFG_MC14411_F1_CB(WRITELINE (coco_t4426_device, write_f1_clock))
+ MCFG_MC14411_F3_CB(WRITELINE (coco_t4426_device, write_f3_clock))
+ MCFG_MC14411_F5_CB(WRITELINE (coco_t4426_device, write_f5_clock))
+ MCFG_MC14411_F7_CB(WRITELINE (coco_t4426_device, write_f7_clock))
+ MCFG_MC14411_F8_CB(WRITELINE (coco_t4426_device, write_f8_clock))
+ MCFG_MC14411_F9_CB(WRITELINE (coco_t4426_device, write_f9_clock))
+ MCFG_MC14411_F11_CB(WRITELINE (coco_t4426_device, write_f11_clock))
+ MCFG_MC14411_F13_CB(WRITELINE (coco_t4426_device, write_f13_clock))
+ MCFG_MC14411_F15_CB(WRITELINE (coco_t4426_device, write_f15_clock))
MACHINE_CONFIG_END
ROM_START( coco_t4426 )
- ROM_REGION(0x1a000, CARTSLOT_TAG, ROMREGION_ERASE00)
-
- // 8 banked ROM:s TODO: Add the banking and the other ROM:s
- ROM_LOAD("tercoED4426-0-8549-5.3.bin", 0x00000, 0x2000, CRC(45665428) SHA1(ff49a79275772c4c4ab1ae29db662c9b10a744a7))
- ROM_LOAD("tercoED4426-1-8549-5.3.bin", 0x03000, 0x2000, CRC(44baba33) SHA1(01cee1b208c158e598e7ecd2189b5e0ffa7f3ab9))
- ROM_LOAD("tercoPD4426-2-8632-6.4.bin", 0x06000, 0x2000, CRC(258e443a) SHA1(9d8901f3e70ae4f8526dde1b5208b22f066f801f))
- ROM_LOAD("tercoPD4426-3-8638-6.4.bin", 0x09000, 0x2000, CRC(640d1de4) SHA1(5ae7427cb5729fd3920361855d954ea1f97f6ae5))
- ROM_LOAD("tercoCA4426-4-8549-3.4.bin", 0x0c000, 0x2000, CRC(df18397b) SHA1(2f9de210c039619c649be223c37a4eff873fa600))
- ROM_LOAD("tercoCA4426-5-8549-3.4.bin", 0x0f000, 0x2000, CRC(3fcdf92e) SHA1(ec1589f8d62701ca3faf2a85a57ab2e1f61d2137))
- ROM_LOAD("tercoCA4426-6-8549-3.4.bin", 0x13000, 0x2000, CRC(27652ccf) SHA1(529a6f736666ae6660483e547d076725606b1c1d))
- ROM_LOAD("tercoCA4426-7-8549-3.4.bin", 0x16000, 0x2000, CRC(f6640569) SHA1(03f70dcc5f7ab60cd908427d45ebd85b6f464b93))
+ // Part of this region is filled by set_bank
+ ROM_REGION(0x4000, CARTSLOT_TAG, ROMREGION_ERASE00)
// Main cartridge ROM
ROM_LOAD("tercoPMOS4426-8549-4.31.bin", 0x2000, 0x1000, CRC(bc65c45c) SHA1(e50cfd1d61e29fe05eb795d8bf6303e7b91ed8e5))
- // Interleaved copies for the fixed ROM for banking to work (nw yet though)
- ROM_RELOAD(0x05000,0x1000)
- ROM_RELOAD(0x08000,0x1000)
- ROM_RELOAD(0x0b000,0x1000)
- ROM_RELOAD(0x0e000,0x1000)
- ROM_RELOAD(0x12000,0x1000)
- ROM_RELOAD(0x15000,0x1000)
- ROM_RELOAD(0x18000,0x1000)
+ ROM_RELOAD(0x03000,0x1000) // Mirrored
+
+ // this region is loaded from separate ROM images
+ ROM_REGION(0x1a000, CARTBANK_TAG, ROMREGION_ERASE00)
+
+ // 8 banked ROM:s
+ ROM_LOAD("tercoED4426-0-8549-5.3.bin", 0x0000, 0x2000, CRC(45665428) SHA1(ff49a79275772c4c4ab1ae29db662c9b10a744a7))
+ ROM_LOAD("tercoED4426-1-8549-5.3.bin", 0x2000, 0x2000, CRC(44baba33) SHA1(01cee1b208c158e598e7ecd2189b5e0ffa7f3ab9))
+ ROM_LOAD("tercoPD4426-2-8632-6.4.bin", 0x4000, 0x2000, CRC(258e443a) SHA1(9d8901f3e70ae4f8526dde1b5208b22f066f801f))
+ ROM_LOAD("tercoPD4426-3-8638-6.4.bin", 0x6000, 0x2000, CRC(640d1de4) SHA1(5ae7427cb5729fd3920361855d954ea1f97f6ae5))
+ ROM_LOAD("tercoCA4426-4-8549-3.4.bin", 0x8000, 0x2000, CRC(df18397b) SHA1(2f9de210c039619c649be223c37a4eff873fa600))
+ ROM_LOAD("tercoCA4426-5-8549-3.4.bin", 0xa000, 0x2000, CRC(3fcdf92e) SHA1(ec1589f8d62701ca3faf2a85a57ab2e1f61d2137))
+ ROM_LOAD("tercoCA4426-6-8549-3.4.bin", 0xc000, 0x2000, CRC(27652ccf) SHA1(529a6f736666ae6660483e547d076725606b1c1d))
+ ROM_LOAD("tercoCA4426-7-8549-3.4.bin", 0xe000, 0x2000, CRC(f6640569) SHA1(03f70dcc5f7ab60cd908427d45ebd85b6f464b93))
ROM_END
//-------------------------------------------------
@@ -168,6 +200,21 @@ static INPUT_PORTS_START( coco_cart_autostart )
PORT_CONFNAME( 0x01, 0x01, "Cart Auto-Start" )
PORT_CONFSETTING( 0x00, DEF_STR( Off ))
PORT_CONFSETTING( 0x01, DEF_STR( On ))
+
+ PORT_START(SERIAL_BAUD)
+ PORT_CONFNAME(0x0F , 0x00 , "Ser. I/O2 RC 232C - Baud Rate") // Typo on real hardware!
+ PORT_CONFSETTING(mc14411_device::TIMER_F1, "9600") // RSA=RSB=1: X1
+ PORT_CONFSETTING(mc14411_device::TIMER_F2, "7200")
+ PORT_CONFSETTING(mc14411_device::TIMER_F3, "4800")
+ PORT_CONFSETTING(mc14411_device::TIMER_F4, "3600")
+ PORT_CONFSETTING(mc14411_device::TIMER_F5, "2400")
+ PORT_CONFSETTING(mc14411_device::TIMER_F6, "1800")
+ PORT_CONFSETTING(mc14411_device::TIMER_F7, "1200")
+ PORT_CONFSETTING(mc14411_device::TIMER_F8, "600")
+ PORT_CONFSETTING(mc14411_device::TIMER_F9, "300")
+ PORT_CONFSETTING(mc14411_device::TIMER_F10, "200")
+ PORT_CONFSETTING(mc14411_device::TIMER_F11, "150")
+ PORT_CONFSETTING(mc14411_device::TIMER_F13, "110")
INPUT_PORTS_END
//**************************************************************************
@@ -192,6 +239,8 @@ coco_t4426_device::coco_t4426_device(const machine_config &mconfig, device_type
, m_autostart(*this, CART_AUTOSTART_TAG)
, m_uart(*this, UART_TAG)
, m_pia(*this, PIA_TAG)
+ , m_brg(*this, BRG_TAG)
+ , m_serial_baud(*this, SERIAL_BAUD)
{
}
@@ -240,38 +289,94 @@ void coco_t4426_device::device_reset()
LOG("%s()\n", FUNCNAME );
auto cart_line = line_value::Q;
set_line_value(line::CART, cart_line);
+ set_bank();
+
+ // Set up the BRG divider statically to X1
+ m_brg->rsa_w( ASSERT_LINE );
+ m_brg->rsb_w( ASSERT_LINE );
+
+ // Disable all configured timers, only enabling the used ones
+ m_brg->timer_disable_all();
+ m_brg->timer_enable((mc14411_device::timer_id) m_serial_baud->read(), true);
+}
+
+/*----------------------------------------------------
+ * Serial port clock sources driven by the selected
+ * output of the MC14411
+ ----------------------------------------------------*/
+void coco_t4426_device::write_acia_clocks(int id, int state)
+{
+ if (id == m_serial_baud->read())
+ {
+ m_uart->write_txc(state);
+ m_uart->write_rxc(state);
+ }
}
/*-------------------------------------------------
- scs_read
- The 4426 cartridge PIA is located at ff44-ff47
+ scs_read custom devices
+ PIA is located at ff40-ff47
+ ACIA is located at ff48-ff4F with A1 = 1
-------------------------------------------------*/
READ8_MEMBER(coco_t4426_device::scs_read)
{
uint8_t result = 0x00;
- LOG("%s", FUNCNAME);
+ LOG("%s Offs:%d\n", FUNCNAME, offset);
- if ((offset >= 0x04) && (offset <= 0x07))
- result = m_pia->read(space, offset - 0x04);
+ if ((offset >= 0x00) && (offset <= 0x07))
+ {
+ LOGPIA("- PIA\n");
+ result = m_pia->read(space, offset & 3);
+ LOGPIA("- Offs:%04x Data:%02x\n", offset - 0x04, result);
+ }
+ else if ((offset >= 0x08) && (offset <= 0x0f) && (offset & 2))
+ {
+ LOGACIA("- ACIA\n");
+ if (offset & 1)
+ result = m_uart->status_r(space, offset & 1);
+ else
+ result = m_uart->data_r(space, offset & 1);
+ LOGACIA("- Offs:%04x Data:%02x\n", offset - 0x04, result);
+ }
+ else
+ {
+ LOG(" Unknown Device! Offs:%04x\n", offset);
+ }
- LOG(" - Offs:%04x Data:%02x\n", offset, result);
return result;
}
/*-------------------------------------------------
- scs_write
- The 4426 cartridge PIA is located at ff44-ff47
+ scs_write - custom devices
+ PIA is located at ff40-ff47
+ ACIA is located at ff48-ff4F with A1 = 1
-------------------------------------------------*/
WRITE8_MEMBER(coco_t4426_device::scs_write)
{
- LOG("%s(%02x)\n", FUNCNAME, data);
+ LOG("%s Offs:%d Data:%02x\n", FUNCNAME, offset, data);
LOGSETUP(" * Offs:%02x <- %02x\n", offset, data);
- if ((offset >= 0x04) && (offset <= 0x07))
- m_pia->write(space, offset - 0x04, data);
+ if ((offset >= 0x00) && (offset <= 0x07))
+ {
+ LOG("- PIA\n");
+ m_pia->write(space, offset & 3, data);
+ }
+ else if ((offset >= 0x08) && (offset <= 0x0f) && (offset & 2))
+ {
+ LOGACIA("- ACIA");
+ if (offset & 1)
+ m_uart->control_w(space, offset & 1, data);
+ else
+ m_uart->data_w(space, offset & 1, data);
+ LOGACIA(" - Offs:%04x Data:%02x\n", offset & 1, data);
+ }
+ else
+ {
+ LOG(" Unknown device\n");
+ }
}
/*----------------------------------------------------
@@ -295,38 +400,34 @@ WRITE8_MEMBER( coco_t4426_device::pia_A_w )
{
LOGPIA("%s(%02x)\n", FUNCNAME, data);
m_select = data;
- cart_base_changed();
+ set_bank();
}
-/*-------------------------------------------------
- get_cart_base
--------------------------------------------------*/
-
-uint8_t* coco_t4426_device::get_cart_base()
+void coco_t4426_device::set_bank()
{
- LOG("%s - m_select %02x -> %02x\n", FUNCNAME, m_select, ~m_select & 0xff );
- uint8_t *base = memregion(CARTSLOT_TAG)->base();
+ uint8_t *cartbase = memregion(CARTSLOT_TAG)->base();
+ uint8_t *bankbase = memregion(CARTBANK_TAG)->base();
switch (m_select)
{
case 0:
- case ROM0: base = (uint8_t *) (base + 0x00000); break;
- case ROM1: base = (uint8_t *) (base + 0x03000); break;
- case ROM2: base = (uint8_t *) (base + 0x06000); break;
- case ROM3: base = (uint8_t *) (base + 0x09000); break;
- case ROM4: base = (uint8_t *) (base + 0x0c000); break;
- case ROM5: base = (uint8_t *) (base + 0x0f000); break;
- case ROM6: base = (uint8_t *) (base + 0x13000); break;
- case ROM7: base = (uint8_t *) (base + 0x16000); break;
+ case ROM0:memcpy(cartbase, bankbase + 0x0000, 0x2000); break;
+ case ROM1:memcpy(cartbase, bankbase + 0x2000, 0x2000); break;
+ case ROM2:memcpy(cartbase, bankbase + 0x4000, 0x2000); break;
+ case ROM3:memcpy(cartbase, bankbase + 0x6000, 0x2000); break;
+ case ROM4:memcpy(cartbase, bankbase + 0x8000, 0x2000); break;
+ case ROM5:memcpy(cartbase, bankbase + 0xa000, 0x2000); break;
+ case ROM6:memcpy(cartbase, bankbase + 0xc000, 0x2000); break;
+ case ROM7:memcpy(cartbase, bankbase + 0xe000, 0x2000); break;
}
+}
-#if 0 // Print the beginning of the selected ROM bank, seems to be correct but is not mapped in correctly via coco12.cpp m_sam->read yet
- printf("\n");
- for (int i = 0; i < 48; i++) printf("%02x ", *((uint8_t *)(base + i)));
- printf("\n");
- for (int i = 0; i < 48; i++) printf("'%c'", *((uint8_t *)(base + i)));
- printf("\n");
-#endif
+/*-------------------------------------------------
+ get_cart_base
+-------------------------------------------------*/
- return base;
+uint8_t* coco_t4426_device::get_cart_base()
+{
+ LOG("%s - m_select %02x -> %02x\n", FUNCNAME, m_select, ~m_select & 0xff );
+ return memregion(CARTSLOT_TAG)->base();
}
diff --git a/src/devices/cpu/i8089/i8089_channel.cpp b/src/devices/cpu/i8089/i8089_channel.cpp
index 5bdda27b54e..aaae170de3a 100644
--- a/src/devices/cpu/i8089/i8089_channel.cpp
+++ b/src/devices/cpu/i8089/i8089_channel.cpp
@@ -685,16 +685,16 @@ void i8089_channel_device::examine_ccw(uint8_t ccw)
m_r[PSW].w = (m_r[PSW].w & 0x5f) | (ccw & 0xa0);
// acknowledge interrupt
- if (BIT(ccw, 4))
+ if (BIT(ccw, 3))
{
m_write_sintr(0);
m_r[PSW].w &= ~(1 << 5);
}
// interrupt enable
- if (BIT(ccw, 5))
+ if (BIT(ccw, 4))
{
- if (BIT(ccw, 4))
+ if (BIT(ccw, 3))
m_r[PSW].w &= ~(1 << 4);
else
m_r[PSW].w |= 1 << 4;
diff --git a/src/devices/machine/6821pia.cpp b/src/devices/machine/6821pia.cpp
index 9d3167506d3..d2c9b183c9f 100644
--- a/src/devices/machine/6821pia.cpp
+++ b/src/devices/machine/6821pia.cpp
@@ -17,7 +17,8 @@
#define LOG_SETUP 0x02
#define LOG_CA1 0x08
-//#define VERBOSE (LOG_SETUP | LOG_GENERAL)
+//#define VERBOSE (LOG_SETUP )
+//#define LOG_OUTPUT_STREAM std::cout
#include "logmacro.h"
#define LOGSETUP(...) LOGMASKED(LOG_SETUP, __VA_ARGS__)
@@ -416,7 +417,7 @@ uint8_t pia6821_device::port_a_r()
}
}
- LOG("PIA port A read = %02X\n", ret);
+ LOG("%s PIA port A read = %02X\n", tag(), ret);
return ret;
}
@@ -430,7 +431,7 @@ uint8_t pia6821_device::ddr_a_r()
{
uint8_t ret = m_ddr_a;
- LOG("PIA DDR A read = %02X\n", ret);
+ LOG("%s PIA DDR A read = %02X\n", tag(), ret);
return ret;
}
@@ -458,7 +459,7 @@ uint8_t pia6821_device::port_b_r()
m_irq_b2 = false;
update_interrupts();
- LOG("PIA port B read = %02X\n", ret);
+ LOG("%s PIA port B read = %02X\n", tag(), ret);
return ret;
}
@@ -472,7 +473,7 @@ uint8_t pia6821_device::ddr_b_r()
{
uint8_t ret = m_ddr_b;
- LOG("PIA DDR B read = %02X\n", ret);
+ LOG("%s PIA DDR B read = %02X\n", tag(), ret);
return ret;
}
@@ -521,7 +522,7 @@ uint8_t pia6821_device::control_a_r()
ret |= PIA_IRQ2;
}
- LOG("PIA control A read = %02X\n", ret);
+ LOG("%s PIA control A read = %02X\n", tag(), ret);
return ret;
}
@@ -566,7 +567,7 @@ uint8_t pia6821_device::control_b_r()
ret |= PIA_IRQ2;
}
- LOG("PIA control B read = %02X\n", ret);
+ LOG("%s PIA control B read = %02X\n", tag(), ret);
return ret;
}
@@ -628,7 +629,7 @@ void pia6821_device::send_to_out_a_func(const char* message)
// input pins are pulled high
uint8_t data = get_out_a_value();
- LOG("PIA %s = %02X\n", message, data);
+ LOG("%s PIA %s = %02X\n", tag(), message, data);
if(!m_out_a_handler.isnull())
{
@@ -655,7 +656,7 @@ void pia6821_device::send_to_out_b_func(const char* message)
// input pins are high-impedance - we just send them as zeros for backwards compatibility
uint8_t data = get_out_b_value();
- LOG("PIA %s = %02X\n", message, data);
+ LOG("%s PIA %s = %02X\n", tag(), message, data);
if(!m_out_b_handler.isnull())
{
@@ -694,15 +695,15 @@ void pia6821_device::ddr_a_w(uint8_t data)
{
if(data == 0x00)
{
- LOGSETUP("PIA DDR A write = %02X (input mode)\n", data);
+ LOGSETUP("%s PIA DDR A write = %02X (input mode)\n", tag(), data);
}
else if(data == 0xff)
{
- LOGSETUP("PIA DDR A write = %02X (output mode)\n", data);
+ LOGSETUP("%s PIA DDR A write = %02X (output mode)\n", tag(), data);
}
else
{
- LOGSETUP("PIA DDR A write = %02X (mixed mode)\n", data);
+ LOGSETUP("%s PIA DDR A write = %02X (mixed mode)\n", tag(), data);
}
if(m_ddr_a != data)
@@ -749,15 +750,15 @@ void pia6821_device::ddr_b_w(uint8_t data)
{
if (data == 0x00)
{
- LOGSETUP("PIA DDR B write = %02X (input mode)\n", data);
+ LOGSETUP("%s PIA DDR B write = %02X (input mode)\n", tag(), data);
}
else if (data == 0xff)
{
- LOGSETUP("PIA DDR B write = %02X (output mode)\n", data);
+ LOGSETUP("%s PIA DDR B write = %02X (output mode)\n", tag(), data);
}
else
{
- LOGSETUP("PIA DDR B write = %02X (mixed mode)\n", data);
+ LOGSETUP("%s PIA DDR B write = %02X (mixed mode)\n", tag(), data);
}
if(m_ddr_b != data)
@@ -779,7 +780,7 @@ void pia6821_device::control_a_w(uint8_t data)
// bit 7 and 6 are read only
data &= 0x3f;
- LOGSETUP("PIA control A write = %02X\n", data);
+ LOGSETUP("%s PIA control A write = %02X\n", tag(), data);
// update the control register
m_ctl_a = data;
@@ -819,7 +820,7 @@ void pia6821_device::control_b_w(uint8_t data)
// bit 7 and 6 are read only
data &= 0x3f;
- LOGSETUP("PIA control B write = %02X\n", data);
+ LOGSETUP("%s PIA control B write = %02X\n", tag(), data);
// update the control register
m_ctl_b = data;
@@ -892,7 +893,7 @@ void pia6821_device::set_a_input(uint8_t data, uint8_t z_mask)
{
assert_always(m_in_a_handler.isnull(), "pia6821_porta_w() called when in_a_func implemented");
- LOG("Set PIA input port A = %02X\n", data);
+ LOG("%s Set PIA input port A = %02X\n", tag(), data);
m_in_a = data;
m_port_a_z_mask = z_mask;
@@ -928,12 +929,12 @@ uint8_t pia6821_device::a_output()
WRITE_LINE_MEMBER( pia6821_device::ca1_w )
{
- LOGCA1("Set PIA input CA1 = %d\n", state);
+ LOGCA1("%s Set PIA input CA1 = %d\n", tag(), state);
// the new state has caused a transition
if((m_in_ca1 != state) && ((state && c1_low_to_high(m_ctl_a)) || (!state && c1_high_to_low(m_ctl_a))))
{
- LOGCA1("CA1 triggering\n");
+ LOGCA1("%s CA1 triggering\n", tag());
// mark the IRQ
m_irq_a1 = true;
@@ -960,12 +961,12 @@ WRITE_LINE_MEMBER( pia6821_device::ca1_w )
WRITE_LINE_MEMBER( pia6821_device::ca2_w )
{
- LOG("Set PIA input CA2 = %d\n", state);
+ LOG("%s Set PIA input CA2 = %d\n", tag(), state);
// if input mode and the new state has caused a transition
if(c2_input(m_ctl_a) && (m_in_ca2 != state) && ((state && c2_low_to_high(m_ctl_a)) || (!state && c2_high_to_low(m_ctl_a))))
{
- LOG("CA2 triggering\n");
+ LOG("%s CA2 triggering\n", tag());
// mark the IRQ
m_irq_a2 = true;
@@ -1015,7 +1016,7 @@ void pia6821_device::portb_w(uint8_t data)
{
assert_always(m_in_b_handler.isnull(), "pia_set_input_b() called when in_b_func implemented");
- LOG("Set PIA input port B = %02X\n", data);
+ LOG("%s Set PIA input port B = %02X\n", tag(), data);
m_in_b = data;
m_in_b_pushed = true;
@@ -1040,12 +1041,12 @@ uint8_t pia6821_device::b_output()
WRITE_LINE_MEMBER( pia6821_device::cb1_w )
{
- LOG("Set PIA input CB1 = %d\n", state);
+ LOG("%s Set PIA input CB1 = %d\n", tag(), state);
// the new state has caused a transition
if((m_in_cb1 != state) && ((state && c1_low_to_high(m_ctl_b)) || (!state && c1_high_to_low(m_ctl_b))))
{
- LOG("CB1 triggering\n");
+ LOG("%s CB1 triggering\n", tag());
// mark the IRQ
m_irq_b1 = 1;
@@ -1071,14 +1072,14 @@ WRITE_LINE_MEMBER( pia6821_device::cb1_w )
WRITE_LINE_MEMBER( pia6821_device::cb2_w )
{
- LOG("Set PIA input CB2 = %d\n", state);
+ LOG("%s Set PIA input CB2 = %d\n", tag(), state);
// if input mode and the new state has caused a transition
if (c2_input(m_ctl_b) &&
(m_in_cb2 != state) &&
((state && c2_low_to_high(m_ctl_b)) || (!state && c2_high_to_low(m_ctl_b))))
{
- LOG("CB2 triggering\n");
+ LOG("%s CB2 triggering\n", tag());
// mark the IRQ
m_irq_b2 = 1;
diff --git a/src/devices/machine/mc14411.cpp b/src/devices/machine/mc14411.cpp
index c1c3a62fd78..6494a12630f 100644
--- a/src/devices/machine/mc14411.cpp
+++ b/src/devices/machine/mc14411.cpp
@@ -37,7 +37,7 @@
#define LOG_SETUP (1U << 1)
//#define VERBOSE (LOG_GENERAL|LOG_SETUP)
-//#define LOG_OUTPUT_FUNC printf
+//#define LOG_OUTPUT_STREAM std::cout
#include "logmacro.h"
@@ -56,7 +56,7 @@
***************************************************************************/
const int mc14411_device::s_counter_divider[16] = {
- ////////// X64 /////// X16 /////// X8 //////// X1 ////////
+ ////////// X64 /////// X16 /////// X8 //////// X1 ////////
3, // F1: 614.4 kHz 153.6 kHz 76800 Hz 9600 Hz
4, // F2: 460.8 kHz 115.2 kHz 57600 Hz 7200 Hz
6, // F3: 307.2 kHz 76800 Hz 36400 Hz 4800 Hz
diff --git a/src/emu/drivers/xtal.h b/src/emu/drivers/xtal.h
index 1c26b600c4c..949f9ecd00e 100644
--- a/src/emu/drivers/xtal.h
+++ b/src/emu/drivers/xtal.h
@@ -161,6 +161,7 @@ enum
XTAL_15_92MHz = 15920000, /* HP Integral PC */
XTAL_16MHz = 16000000, /* Extremely common, used on 100's of PCBs */
XTAL_16_384MHz = 16384000,
+ XTAL_16_4MHz = 16400000, /* MS 6102 */
XTAL_16_5888MHz = 16588800, /* SM 7238 */
XTAL_16_67MHz = 16670000,
XTAL_16_777216MHz = 16777216, /* Nintendo Game Boy Advance */
diff --git a/src/mame/drivers/4enraya.cpp b/src/mame/drivers/4enraya.cpp
index 5eaa4aba47f..b4606282d12 100644
--- a/src/mame/drivers/4enraya.cpp
+++ b/src/mame/drivers/4enraya.cpp
@@ -10,10 +10,11 @@
Supported games:
- 4 En Raya (set 1), 1990, IDSA.
- 4 En Raya (set 2), 1990, IDSA.
- unknown Pac-Man gambling game, 1990, Unknown.
- unknown 'Space Invaders' gambling game, 1990, Unknown (made in France)
+ 4 En Raya (set 1), 1990, IDSA.
+ 4 En Raya (set 2), 1990, IDSA.
+ unknown 'Pac-Man' gambling game, 1990, Unknown.
+ unknown 'Space Invaders' gambling game (set 1), 1990, Unknown (made in France).
+ unknown 'Space Invaders' gambling game (set 2), 199?, Unknown.
TODO:
- Video and IRQ timings;
@@ -542,6 +543,9 @@ ROM_START( 4enrayaa )
ROM_END
+/*
+ Unknown 'Pac-Man' gambling game.
+*/
ROM_START(unkpacg)
ROM_REGION(0x10000, "maincpu", 0)
ROM_LOAD("1.u14", 0x0000, 0x2000, CRC(848c4143) SHA1(3cff26181c58e5f52f1ac81df7d5d43e644585a2))
@@ -553,8 +557,11 @@ ROM_START(unkpacg)
ROM_LOAD( "5.u18", 0x0000, 0x2000, CRC(44f272d2) SHA1(b39cbc1f290d9fb2453396906e4da4a682c41ef4) )
ROM_END
-/* all roms are 0x8000 but only the last 0x2000 of each is used */
-ROM_START( unkfr )
+/*
+ Unknown 'Space Invaders' gambling game.
+ All roms are 0x8000 but only the last 0x2000 of each is used.
+*/
+ROM_START( unksig )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "i.bin", 0x0000, 0x2000, CRC(902efc27) SHA1(5992cdc647acd622c73adefac1aa66e77b5ccc4f) )
ROM_CONTINUE( 0x0000, 0x2000)
@@ -567,17 +574,56 @@ ROM_START( unkfr )
ROM_REGION( 0x6000, "gfx1", 0 )
ROM_LOAD( "r.bin", 0x0000, 0x2000, CRC(f8a358fe) SHA1(5c4051de156014a5c2400f4934e2136b38bfed8c) )
- ROM_CONTINUE(0x0000,0x2000)
- ROM_CONTINUE(0x0000,0x2000)
- ROM_CONTINUE(0x0000,0x2000) // only data here matters
+ ROM_CONTINUE( 0x0000, 0x2000)
+ ROM_CONTINUE( 0x0000, 0x2000)
+ ROM_CONTINUE( 0x0000, 0x2000) // only data here matters
ROM_LOAD( "b.bin", 0x2000, 0x2000, CRC(56ac5874) SHA1(7ae63f930b07cb1b4989c8328fcc3627d8ff68f8) )
- ROM_CONTINUE(0x2000,0x2000)
- ROM_CONTINUE(0x2000,0x2000)
- ROM_CONTINUE(0x2000,0x2000) // only data here matters
+ ROM_CONTINUE( 0x2000, 0x2000)
+ ROM_CONTINUE( 0x2000, 0x2000)
+ ROM_CONTINUE( 0x2000, 0x2000) // only data here matters
ROM_LOAD( "v.bin", 0x4000, 0x2000, CRC(4c5a7e43) SHA1(17e52ed73f9e8822b53bebc31c9320f5589ef70a) )
- ROM_CONTINUE(0x4000,0x2000)
- ROM_CONTINUE(0x4000,0x2000)
- ROM_CONTINUE(0x4000,0x2000) // only data here matters
+ ROM_CONTINUE( 0x4000, 0x2000)
+ ROM_CONTINUE( 0x4000, 0x2000)
+ ROM_CONTINUE( 0x4000, 0x2000) // only data here matters
+ROM_END
+
+/*
+ Unknown 'Space Invaders' gambling game
+ All roms are 0x10000 but with a lot of addressing issues
+
+ 1.bin BADADDR ---xxxxxxxxxxxxx
+ 2.bin BADADDR ---xxxxxxxxxxxxx
+ b.bin BADADDR x-xxxxxxxxxxxxxx
+ r.bin BADADDR x-xxxxxxxxxxxxxx
+ v.bin BADADDR x-xxxxxxxxxxxxxx
+
+ The game has both (space invaders & pac-man) graphics sets.
+ Maybe a leftover?...
+
+*/
+ROM_START( unksiga )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD( "1.bin", 0x0000, 0x2000, CRC(089a4a63) SHA1(d519f6289e72299e48ed1790fa4919cae14e2a0f) ) // 0x2000 of data repeated along the dump
+ ROM_IGNORE( 0xe000) /* Identical 0x2000 segments */
+ ROM_LOAD( "2.bin", 0x8000, 0x2000, CRC(970632fd) SHA1(2aa69fda1dce201856b237ecbedfdcde470a4bb3) ) // 0x2000 of data repeated along the dump
+ ROM_IGNORE( 0xe000) /* Identical 0x2000 segments */
+
+ ROM_REGION( 0xc000, "gfx1", 0 )
+/* tileset 0000-03ff = Space Invaders GFX.
+ tileset 0400-07ff = Pac-Man GFX.
+*/
+ ROM_LOAD( "b.bin", 0x0000, 0x4000, CRC(dd257fb6) SHA1(b543225615f3cbef34dbecde04c7e937eede0988) )
+ ROM_CONTINUE( 0x0000, 0x4000)
+ ROM_CONTINUE( 0x0000, 0x4000) // data
+ ROM_IGNORE( 0x4000) // dupe
+ ROM_LOAD( "r.bin", 0x4000, 0x4000, CRC(38e9feba) SHA1(76811f05dabbb608e3863eeea0c53725c7cff618) )
+ ROM_CONTINUE( 0x4000, 0x4000)
+ ROM_CONTINUE( 0x4000, 0x4000) // data
+ ROM_IGNORE( 0x4000) // dupe
+ ROM_LOAD( "v.bin", 0x8000, 0x4000, CRC(cc597c7b) SHA1(5830fa9e8f9823eb4a910d6f80c3de15f7269619) )
+ ROM_CONTINUE( 0x8000, 0x4000)
+ ROM_CONTINUE( 0x8000, 0x4000) // data
+ ROM_IGNORE( 0x4000) // dupe
ROM_END
@@ -598,8 +644,9 @@ DRIVER_INIT_MEMBER(_4enraya_state, unkpacg)
* Game Drivers *
***********************************/
-/* YEAR NAME PARENT MACHINE INPUT STATE INIT ROT COMPANY FULLNAME FLAGS */
-GAME( 1990, 4enraya, 0, 4enraya, 4enraya, _4enraya_state, 0, ROT0, "IDSA", "4 En Raya (set 1)", MACHINE_SUPPORTS_SAVE )
-GAME( 1990, 4enrayaa, 4enraya, 4enraya, 4enraya, _4enraya_state, 0, ROT0, "IDSA", "4 En Raya (set 2)", MACHINE_SUPPORTS_SAVE )
-GAME( 199?, unkpacg, 0, unkpacg, unkpacg, _4enraya_state, unkpacg, ROT0, "<unknown>", "unknown Pac-Man gambling game", MACHINE_SUPPORTS_SAVE )
-GAME( 199?, unkfr, 0, unkpacg, unkfr, _4enraya_state, unkpacg, ROT0, "<unknown>", "unknown 'Space Invaders' gambling game", MACHINE_SUPPORTS_SAVE )
+/* YEAR NAME PARENT MACHINE INPUT STATE INIT ROT COMPANY FULLNAME FLAGS */
+GAME( 1990, 4enraya, 0, 4enraya, 4enraya, _4enraya_state, 0, ROT0, "IDSA", "4 En Raya (set 1)", MACHINE_SUPPORTS_SAVE )
+GAME( 1990, 4enrayaa, 4enraya, 4enraya, 4enraya, _4enraya_state, 0, ROT0, "IDSA", "4 En Raya (set 2)", MACHINE_SUPPORTS_SAVE )
+GAME( 199?, unkpacg, 0, unkpacg, unkpacg, _4enraya_state, unkpacg, ROT0, "<unknown>", "unknown 'Pac-Man' gambling game", MACHINE_SUPPORTS_SAVE )
+GAME( 199?, unksig, 0, unkpacg, unkfr, _4enraya_state, unkpacg, ROT0, "<unknown>", "unknown 'Space Invaders' gambling game (set 1)", MACHINE_SUPPORTS_SAVE )
+GAME( 199?, unksiga, unksig, unkpacg, unkfr, _4enraya_state, unkpacg, ROT0, "<unknown>", "unknown 'Space Invaders' gambling game (set 2)", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/altos8600.cpp b/src/mame/drivers/altos8600.cpp
index beeb2c466f3..73a86c23d00 100644
--- a/src/mame/drivers/altos8600.cpp
+++ b/src/mame/drivers/altos8600.cpp
@@ -55,10 +55,12 @@ public:
DECLARE_WRITE8_MEMBER(cattn_w);
DECLARE_READ8_MEMBER(romport_r);
DECLARE_WRITE8_MEMBER(romport_w);
+ DECLARE_WRITE8_MEMBER(clrsys_w);
DECLARE_WRITE16_MEMBER(mode_w);
DECLARE_WRITE_LINE_MEMBER(cpuif_w);
DECLARE_WRITE_LINE_MEMBER(fddrq_w);
DECLARE_WRITE8_MEMBER(ics_attn_w);
+ IRQ_CALLBACK_MEMBER(inta);
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
@@ -155,7 +157,11 @@ READ16_MEMBER(altos8600_state::mmuflags_r)
WRITE16_MEMBER(altos8600_state::mmuflags_w)
{
data &= ~0x17;
- COMBINE_DATA(&m_mmuflags[offset & 0xff]);
+ if(mem_mask == 0xff)
+ data |= 0xff00;
+ else if(mem_mask == 0xff00)
+ return;
+ m_mmuflags[offset & 0xff] = data;
}
WRITE8_MEMBER(altos8600_state::cattn_w)
@@ -197,7 +203,11 @@ WRITE8_MEMBER(altos8600_state::romport_w)
m_fdc->set_floppy(nullptr);
if(m_nmistat && m_nmiinh && !BIT(data, 4))
+ {
+ m_mode &= ~1;
+ m_user = false;
m_maincpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE);
+ }
else if(BIT(data, 4) && m_nmistat)
m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
m_nmiinh = BIT(data, 4) ? true : false;
@@ -215,6 +225,11 @@ WRITE8_MEMBER(altos8600_state::romport_w)
}
}
+WRITE8_MEMBER(altos8600_state::clrsys_w)
+{
+ m_pic1->ir0_w(CLEAR_LINE);
+}
+
WRITE8_MEMBER(altos8600_state::ics_attn_w)
{
if(!offset)
@@ -233,7 +248,6 @@ WRITE16_MEMBER(altos8600_state::mode_w)
READ8_MEMBER(altos8600_state::get_slave_ack)
{
- m_user = false;
if(offset == 2)
return m_pic2->acknowledge();
else if(offset == 3)
@@ -245,9 +259,13 @@ void altos8600_state::seterr(offs_t offset, u16 mem_mask, u16 err_mask)
{
if(machine().side_effect_disabled())
return;
- logerror("Fault at %06x type %04x\n", offset << 1, err_mask);
+ logerror("Fault at %05x type %04x\n", offset << 1, err_mask);
if(!m_nmiinh)
+ {
+ m_mode &= ~1;
+ m_user = false;
m_maincpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE);
+ }
m_nmistat = true;
m_mmuerr &= ~err_mask;
m_mmueaddr[0] = (offset << 1) | (!(mem_mask & 0xff) ? 1 : 0);
@@ -332,9 +350,9 @@ WRITE16_MEMBER(altos8600_state::xtraram_w)
READ16_MEMBER(altos8600_state::cpuio_r)
{
- if(m_user)
+ if(m_user && !machine().side_effect_disabled())
{
- seterr(offset, mem_mask, 0x800);
+ m_pic1->ir0_w(ASSERT_LINE);
return 0;
}
return m_dmac->space(AS_IO).read_word_unaligned(offset << 1, mem_mask);
@@ -342,9 +360,9 @@ READ16_MEMBER(altos8600_state::cpuio_r)
WRITE16_MEMBER(altos8600_state::cpuio_w)
{
- if(m_user)
+ if(m_user && !machine().side_effect_disabled())
{
- seterr(offset, mem_mask, 0x800);
+ m_pic1->ir0_w(ASSERT_LINE);
return;
}
m_dmac->space(AS_IO).write_word_unaligned(offset << 1, data, mem_mask);
@@ -386,6 +404,13 @@ WRITE16_MEMBER(altos8600_state::nmi_w)
seterr(offset, mem_mask, 0x100);
}
+IRQ_CALLBACK_MEMBER(altos8600_state::inta)
+{
+ m_user = false;
+ m_mode &= ~1;
+ return m_pic1->acknowledge();
+}
+
static ADDRESS_MAP_START(cpu_mem, AS_PROGRAM, 16, altos8600_state)
AM_RANGE(0x00000, 0xfffff) AM_READWRITE(cpuram_r, cpuram_w)
ADDRESS_MAP_END
@@ -423,6 +448,7 @@ static ADDRESS_MAP_START(dmac_io, AS_IO, 16, altos8600_state)
AM_RANGE(0x0048, 0x004f) AM_DEVREADWRITE8("pit", pit8253_device, read, write, 0xff00)
AM_RANGE(0x0050, 0x0057) AM_READWRITE8(romport_r, romport_w, 0xffff)
AM_RANGE(0x0058, 0x005f) AM_DEVREADWRITE8("pic8259_1", pic8259_device, read, write, 0x00ff)
+ AM_RANGE(0x0058, 0x005f) AM_WRITE8(clrsys_w, 0xff00)
AM_RANGE(0x0060, 0x0067) AM_DEVREADWRITE8("pic8259_2", pic8259_device, read, write, 0x00ff)
AM_RANGE(0x0068, 0x006f) AM_DEVREADWRITE8("pic8259_3", pic8259_device, read, write, 0x00ff)
AM_RANGE(0x0070, 0x0077) AM_NOP
@@ -444,7 +470,7 @@ static MACHINE_CONFIG_START(altos8600)
MCFG_I8086_STACK_MAP(stack_mem)
MCFG_I8086_CODE_MAP(code_mem)
MCFG_I8086_EXTRA_MAP(extra_mem)
- MCFG_CPU_IRQ_ACKNOWLEDGE_DEVICE("pic8259_1", pic8259_device, inta_cb)
+ MCFG_CPU_IRQ_ACKNOWLEDGE_DRIVER(altos8600_state, inta)
MCFG_I8086_IF_HANDLER(WRITELINE(altos8600_state, cpuif_w))
MCFG_CPU_ADD("dmac", I8089, XTAL_5MHz)
@@ -494,12 +520,12 @@ static MACHINE_CONFIG_START(altos8600)
MCFG_DEVICE_ADD("pit", PIT8253, 0)
MCFG_PIT8253_CLK0(1228800)
- MCFG_PIT8253_OUT1_HANDLER(DEVWRITELINE("uart8274", i8274_new_device, rxca_w))
+ MCFG_PIT8253_OUT0_HANDLER(DEVWRITELINE("uart8274", i8274_new_device, rxca_w))
MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("uart8274", i8274_new_device, txca_w))
MCFG_PIT8253_CLK1(1228800)
MCFG_PIT8253_OUT1_HANDLER(DEVWRITELINE("uart8274", i8274_new_device, rxtxcb_w))
MCFG_PIT8253_CLK2(1228800)
- MCFG_PIT8253_OUT0_HANDLER(DEVWRITELINE("pic8259_1", pic8259_device, ir1_w))
+ MCFG_PIT8253_OUT2_HANDLER(DEVWRITELINE("pic8259_1", pic8259_device, ir1_w))
MCFG_FD1797_ADD("fd1797", 2000000)
MCFG_WD_FDC_INTRQ_CALLBACK(DEVWRITELINE("pic8259_2", pic8259_device, ir1_w))
diff --git a/src/mame/drivers/coco12.cpp b/src/mame/drivers/coco12.cpp
index 0150e7e2464..2bebaa86bb8 100644
--- a/src/mame/drivers/coco12.cpp
+++ b/src/mame/drivers/coco12.cpp
@@ -496,4 +496,4 @@ COMP( 1985?, coco2b, coco, 0, coco2b, coco, coco12_state, 0,
COMP( 1984, cp400, coco, 0, cp400, coco, coco12_state, 0, "Prologica", "CP400", 0 )
COMP( 1984, lzcolor64, coco, 0, coco, coco, coco12_state, 0, "Digiponto", "LZ Color64", 0 )
COMP( 1984, mx1600, coco, 0, coco, coco, coco12_state, 0, "Dynacom", "MX-1600", 0 )
-COMP( 1986, t4426, coco, 0, t4426, coco, coco12_state, 0, "Terco AB", "Terco 4426 CNC Programming station", MACHINE_NOT_WORKING )
+COMP( 1986, t4426, coco, 0, t4426, coco, coco12_state, 0, "Terco AB", "Terco 4426 CNC Programming station", MACHINE_IS_INCOMPLETE )
diff --git a/src/mame/drivers/jvh.cpp b/src/mame/drivers/jvh.cpp
index ec0a0920eb9..80ad903632e 100644
--- a/src/mame/drivers/jvh.cpp
+++ b/src/mame/drivers/jvh.cpp
@@ -9,6 +9,9 @@
#include "emu.h"
#include "cpu/tms9900/tms9980a.h"
#include "cpu/m6800/m6800.h"
+#include "machine/6522via.h"
+//#include "machine/74259.h"
+//#include "sound/ay8910.h"
class jvh_state : public driver_device
{
@@ -91,7 +94,7 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( jvh_sub_map, AS_PROGRAM, 8, jvh_state )
AM_RANGE(0x0000, 0x007f) AM_RAM
- //AM_RANGE(0x0080, 0x008f) via6522_r,w
+ AM_RANGE(0x0080, 0x008f) AM_DEVREADWRITE("via", via6522_device, read, write)
AM_RANGE(0xc000, 0xdfff) AM_MIRROR(0x2000) AM_ROM
ADDRESS_MAP_END
@@ -109,15 +112,23 @@ DRIVER_INIT_MEMBER(jvh_state,jvh)
static MACHINE_CONFIG_START( jvh )
// CPU TMS9980A; no line connections
MCFG_TMS99xx_ADD("maincpu", TMS9980A, 1000000, jvh_map, escape_io)
- MCFG_CPU_ADD("cpu2", M6800, 1000000)
+
+ MCFG_CPU_ADD("soundcpu", M6802, XTAL_4MHz)
MCFG_CPU_PROGRAM_MAP(jvh_sub_map)
+
+ MCFG_DEVICE_ADD("via", VIA6522, XTAL_4MHz / 4) // MC6802 E clock
+ MCFG_VIA6522_IRQ_HANDLER(INPUTLINE("soundcpu", M6802_IRQ_LINE))
MACHINE_CONFIG_END
static MACHINE_CONFIG_START( jvh2 )
// CPU TMS9980At; no line connections
MCFG_TMS99xx_ADD("maincpu", TMS9980A, 1000000, jvh_map, movmastr_io)
- MCFG_CPU_ADD("cpu2", M6800, 1000000)
+
+ MCFG_CPU_ADD("soundcpu", M6802, XTAL_4MHz)
MCFG_CPU_PROGRAM_MAP(jvh_sub_map)
+
+ MCFG_DEVICE_ADD("via", VIA6522, XTAL_4MHz / 4)
+ MCFG_VIA6522_IRQ_HANDLER(INPUTLINE("soundcpu", M6802_IRQ_LINE))
MACHINE_CONFIG_END
@@ -130,7 +141,7 @@ ROM_START(escape)
ROM_LOAD("cpu_ic1.bin", 0x0000, 0x2000, CRC(fadb8f9a) SHA1(b7e7ea8e33847c14a3414f5e367e304f12c0bc00))
ROM_LOAD("cpu_ic7.bin", 0x2000, 0x2000, CRC(2f9402b4) SHA1(3d3bae7e4e5ad40e3c8019d55392defdffd21cc4))
- ROM_REGION(0x10000, "cpu2", 0)
+ ROM_REGION(0x10000, "soundcpu", 0)
ROM_LOAD("snd.bin", 0xc000, 0x2000, CRC(2477bbe2) SHA1(f636952822153f43e9d09f8211edde1057249203))
ROM_END
@@ -142,7 +153,7 @@ ROM_START(movmastr)
ROM_LOAD("mm_ic1.764", 0x0000, 0x2000, CRC(fb59920d) SHA1(05536c4c036a8d73516766e14f4449665b2ec180))
ROM_LOAD("mm_ic7.764", 0x2000, 0x2000, CRC(9b47af41) SHA1(ae795c22aa437d6c71312d93de8a87f43ee500fb))
- ROM_REGION(0x10000, "cpu2", 0)
+ ROM_REGION(0x10000, "soundcpu", 0)
ROM_LOAD("snd.bin", 0xc000, 0x2000, NO_DUMP)
ROM_END
diff --git a/src/mame/drivers/ms6102.cpp b/src/mame/drivers/ms6102.cpp
new file mode 100644
index 00000000000..1dc9eae89e6
--- /dev/null
+++ b/src/mame/drivers/ms6102.cpp
@@ -0,0 +1,292 @@
+// license:BSD-3-Clause
+// copyright-holders:Sergey Svishchev
+/***************************************************************************
+
+ Elektronika MS6102.02 terminal
+
+ https://goo.gl/photos/xJManS26QTxG1T7M7
+ Schematics
+
+ http://sfrolov.livejournal.com/110770.html
+ Photos
+
+ To do:
+ - why DMA stops after 2nd char on each row?
+ - what does second 8275 do?
+ - what is the layout of chargen ROM?
+ - keyboard (MS7002)
+
+ Chips:
+ - DD5 - KR580WM80A (8080 clone) - CPU
+ - DD7 - KR580WT57 (8257 clone) - DMAC
+ - DD9 - KR1601RR1 (ER2401 clone) - NVRAM
+ - DD21 - KR581WA1A (TR6402 clone) - UART
+ - DD55, DD56 - KR580WG75 (8275 clone) - CRTC
+ - DD59 - KR556RT5 - alternate chargen ROM
+ - DD64 - K556RT4 - chargen layout table ROM
+ - DD70 - K555RE4 - default chargen ROM
+ - DD75 - KR580WI53 (8253 clone) - timer
+ - DD76 - KR580WW51A (8251 clone) - UART
+ - DD80 - K589IK14 (8214 clone) - interrupt control unit
+
+****************************************************************************/
+
+#include "emu.h"
+
+#include "bus/rs232/rs232.h"
+#include "cpu/i8085/i8085.h"
+#include "machine/ay31015.h"
+#include "machine/clock.h"
+#include "machine/i8214.h"
+#include "machine/i8251.h"
+#include "machine/i8257.h"
+#include "machine/keyboard.h"
+#include "machine/nvram.h"
+#include "machine/pit8253.h"
+#include "video/i8275.h"
+
+#include "screen.h"
+
+#define LOG_GENERAL (1U << 0)
+
+//#define VERBOSE (LOG_GENERAL)
+//#define LOG_OUTPUT_FUNC printf
+#include "logmacro.h"
+
+
+class ms6102_state : public driver_device
+{
+public:
+ ms6102_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_p_videoram(*this, "videoram")
+ , m_maincpu(*this, "maincpu")
+ , m_nvram(*this, "nvram")
+ , m_pic(*this, "i8214")
+ , m_dma8257(*this, "dma8257")
+ , m_i8251(*this, "i8251")
+ , m_rs232(*this, "rs232")
+ , m_screen(*this, "screen")
+ , m_palette(*this, "palette")
+ , m_p_chargen(*this, "chargen")
+ , m_p_charmap(*this, "charmap")
+ { }
+
+ virtual void machine_reset() override;
+ virtual void machine_start() override;
+ uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+
+ template <unsigned N> DECLARE_WRITE_LINE_MEMBER(irq) { m_pic->r_w(N, state?0:1); }
+
+ I8275_DRAW_CHARACTER_MEMBER(display_pixels);
+
+ DECLARE_WRITE_LINE_MEMBER(hrq_w);
+
+ DECLARE_WRITE8_MEMBER(pic_w);
+ IRQ_CALLBACK_MEMBER(ms6102_int_ack);
+
+ DECLARE_READ8_MEMBER(memory_read_byte);
+
+ DECLARE_READ8_MEMBER(misc_r);
+ DECLARE_READ8_MEMBER(kbd_get);
+ void kbd_put(u8 data);
+
+private:
+ bool m_kbd_ready;
+ uint8_t m_kbd_data;
+
+ required_shared_ptr<uint8_t> m_p_videoram;
+ required_device<i8080_cpu_device> m_maincpu;
+ required_device<nvram_device> m_nvram;
+ required_device<i8214_device> m_pic;
+ required_device<i8257_device> m_dma8257;
+ required_device<i8251_device> m_i8251;
+ required_device<rs232_port_device> m_rs232;
+ required_device<screen_device> m_screen;
+ required_device<palette_device> m_palette;
+ required_region_ptr<u8> m_p_chargen;
+ required_region_ptr<u8> m_p_charmap;
+};
+
+static ADDRESS_MAP_START(ms6102_mem, AS_PROGRAM, 8, ms6102_state)
+ ADDRESS_MAP_UNMAP_HIGH
+ AM_RANGE (0x0000, 0x2fff) AM_ROM
+ AM_RANGE (0x3800, 0x3bff) AM_RAM AM_SHARE("nvram")
+ AM_RANGE (0xc000, 0xffff) AM_RAM AM_SHARE("videoram")
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START(ms6102_io, AS_IO, 8, ms6102_state)
+ ADDRESS_MAP_UNMAP_HIGH
+ AM_RANGE (0x00, 0x00) AM_DEVREADWRITE("i8251", i8251_device, data_r, data_w)
+ AM_RANGE (0x01, 0x01) AM_DEVREADWRITE("i8251", i8251_device, status_r, control_w)
+ AM_RANGE (0x10, 0x18) AM_DEVREADWRITE("dma8257", i8257_device, read, write)
+ AM_RANGE (0x20, 0x23) AM_DEVREADWRITE("pit8253", pit8253_device, read, write)
+ AM_RANGE (0x30, 0x3f) AM_READ(kbd_get)
+ AM_RANGE (0x40, 0x41) AM_DEVREADWRITE("i8275", i8275_device, read, write)
+ AM_RANGE (0x50, 0x5f) AM_NOP // video disable?
+ AM_RANGE (0x60, 0x6f) AM_WRITE(pic_w)
+ AM_RANGE (0x70, 0x7f) AM_READ(misc_r)
+ADDRESS_MAP_END
+
+static const gfx_layout ms6102_charlayout =
+{
+ 7, 8,
+ RGN_FRAC(1,1),
+ 1,
+ { 0 },
+ { STEP8(1,1) },
+ { 2*8, 3*8, 4*8, 5*8, 6*8, 7*8, 0*8, 1*8, },
+ 8*8
+};
+
+static GFXDECODE_START(ms6102)
+ GFXDECODE_ENTRY("chargen", 0x0000, ms6102_charlayout, 0, 1)
+GFXDECODE_END
+
+
+WRITE_LINE_MEMBER(ms6102_state::hrq_w)
+{
+ /* HACK - this should be connected to the HOLD line of 8080 */
+ m_maincpu->set_input_line(INPUT_LINE_HALT, state);
+
+ /* HACK - this should be connected to the HLDA line of 8080 */
+ m_dma8257->hlda_w(state);
+}
+
+READ8_MEMBER(ms6102_state::memory_read_byte)
+{
+ return m_maincpu->space(AS_PROGRAM).read_byte(offset);
+}
+
+I8275_DRAW_CHARACTER_MEMBER(ms6102_state::display_pixels)
+{
+ int i;
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
+ u8 dd64 = m_p_charmap[((linecount >> 1) & 7) + ((charcode >> 2) & 0x18) + ((lineattr & 2) << 4)] ^ 0xff;
+ u8 gfx = m_p_chargen[(linecount & 3) + ((dd64 & 1) << 2) + ((charcode & 0x1f) << 3) + ((dd64 & 0xe) << 7)];
+
+ if (lten)
+ {
+ gfx = 0xff;
+ }
+ for (i = 0; i < 8; i++)
+ {
+ bitmap.pix32(y, x + i) = palette[(gfx >> (7 - i)) & 1 ? (hlgt ? 2 : 1) : 0];
+ }
+}
+
+
+READ8_MEMBER(ms6102_state::misc_r)
+{
+ return m_kbd_ready << 6;
+}
+
+READ8_MEMBER(ms6102_state::kbd_get)
+{
+ return m_kbd_data;
+}
+
+void ms6102_state::kbd_put(u8 data)
+{
+ m_kbd_ready = true;
+ m_kbd_data = data;
+ m_pic->r_w(1, 0);
+}
+
+
+WRITE8_MEMBER(ms6102_state::pic_w)
+{
+ m_pic->b_w(data & 7);
+ m_pic->sgs_w(BIT(data, 3));
+}
+
+IRQ_CALLBACK_MEMBER(ms6102_state::ms6102_int_ack)
+{
+ return 0xc7 | (m_pic->a_r() << 3);
+}
+
+
+void ms6102_state::machine_reset()
+{
+ m_kbd_ready = false;
+}
+
+void ms6102_state::machine_start()
+{
+ m_pic->etlg_w(1);
+}
+
+
+static MACHINE_CONFIG_START( ms6102 )
+ MCFG_CPU_ADD("maincpu", I8080, XTAL_18_432MHz / 9)
+ MCFG_CPU_PROGRAM_MAP(ms6102_mem)
+ MCFG_CPU_IO_MAP(ms6102_io)
+ MCFG_I8085A_INTE(DEVWRITELINE("i8214", i8214_device, inte_w))
+ MCFG_CPU_IRQ_ACKNOWLEDGE_DRIVER(ms6102_state, ms6102_int_ack)
+
+ MCFG_NVRAM_ADD_0FILL("nvram")
+
+ MCFG_DEVICE_ADD("i8214", I8214, XTAL_18_432MHz / 9)
+ MCFG_I8214_INT_CALLBACK(INPUTLINE("maincpu", I8085_INTR_LINE))
+
+ /* video hardware */
+ MCFG_SCREEN_ADD("screen", RASTER)
+ MCFG_SCREEN_UPDATE_DEVICE("i8275", i8275_device, screen_update)
+ MCFG_SCREEN_REFRESH_RATE(50)
+ MCFG_SCREEN_SIZE(784, 375)
+ MCFG_SCREEN_VISIBLE_AREA(100, 100+80*8-1, 7, 7+24*15-1)
+ MCFG_GFXDECODE_ADD("gfxdecode", "palette", ms6102)
+ MCFG_PALETTE_ADD_MONOCHROME_HIGHLIGHT("palette")
+
+ MCFG_DEVICE_ADD("dma8257", I8257, XTAL_18_432MHz / 9)
+ MCFG_I8257_OUT_HRQ_CB(WRITELINE(ms6102_state, hrq_w))
+ MCFG_I8257_IN_MEMR_CB(READ8(ms6102_state, memory_read_byte))
+ MCFG_I8257_OUT_IOW_2_CB(DEVWRITE8("i8275", i8275_device, dack_w))
+
+ MCFG_DEVICE_ADD("i8275", I8275, XTAL_16_4MHz / 8) // XXX
+ MCFG_I8275_CHARACTER_WIDTH(8)
+ MCFG_I8275_DRAW_CHARACTER_CALLBACK_OWNER(ms6102_state, display_pixels)
+ MCFG_I8275_DRQ_CALLBACK(DEVWRITELINE("dma8257", i8257_device, dreq2_w))
+ MCFG_I8275_IRQ_CALLBACK(WRITELINE(ms6102_state, irq<5>))
+
+ // keyboard
+ MCFG_DEVICE_ADD("589wa1", AY31015, 0)
+
+ MCFG_DEVICE_ADD("keyboard", GENERIC_KEYBOARD, 0)
+ MCFG_GENERIC_KEYBOARD_CB(PUT(ms6102_state, kbd_put))
+
+ // serial connection to host
+ MCFG_DEVICE_ADD("i8251", I8251, 0)
+ MCFG_I8251_TXD_HANDLER(DEVWRITELINE("rs232", rs232_port_device, write_txd))
+ MCFG_I8251_RXRDY_HANDLER(WRITELINE(ms6102_state, irq<3>))
+
+ MCFG_RS232_PORT_ADD("rs232", default_rs232_devices, "null_modem")
+ MCFG_RS232_RXD_HANDLER(DEVWRITELINE("i8251", i8251_device, write_rxd))
+
+ MCFG_DEVICE_ADD("pit8253", PIT8253, 0)
+ MCFG_PIT8253_CLK0(XTAL_16_4MHz / 9)
+ MCFG_PIT8253_OUT0_HANDLER(DEVWRITELINE("i8251", i8251_device, write_txc))
+ MCFG_PIT8253_CLK1(XTAL_16_4MHz / 9)
+ MCFG_PIT8253_OUT1_HANDLER(DEVWRITELINE("i8251", i8251_device, write_rxc))
+MACHINE_CONFIG_END
+
+ROM_START( ms6102 )
+ ROM_REGION(0x3000, "maincpu", ROMREGION_ERASE00)
+ ROM_LOAD("MC6102_02_KS573RF2_DD26", 0x0000, 0x0800, CRC(f96ba806) SHA1(60d155b781e97e86d31dc2194ad367030470eeb6))
+ ROM_LOAD("MC6102_02_KS573RF2_DD30", 0x0800, 0x0800, CRC(1d69ba62) SHA1(bf7d19400fe606239ce8a057850cf4c63ff4cdb2))
+ ROM_LOAD("MC6102_02_KS573RF2_0034", 0x1000, 0x0800, CRC(4bce121a) SHA1(e97c635c2fab70a71a31db3b53284209b5881f2c))
+ ROM_LOAD("MC6102_02_KS573RF2_0037", 0x1800, 0x0800, CRC(1b22543f) SHA1(fc6cc54baf3abadca30dfaf39a50cae7fbf601b2))
+ ROM_LOAD("MC6102_02_KS573RF2_0045", 0x2000, 0x0800, CRC(fd741cfe) SHA1(153abb57ca4833286811082ff50c7b36136274dc))
+ ROM_LOAD("MC6102_02_KS573RF2_DD49", 0x2800, 0x0800, CRC(748f6cee) SHA1(a35e6495ea108824f2f1f9907f5e651174e9cf15))
+
+ ROM_REGION(0x0800, "chargen", ROMREGION_ERASE00)
+ ROM_LOAD("MC6102_02_K555RE4_chargen", 0x0000, 0x0800, CRC(b0e3546b) SHA1(25aca264cc64f368ffcefdfd356120a314a44947))
+
+ ROM_REGION(0x0100, "charmap", ROMREGION_ERASE00)
+ ROM_LOAD("MC6102_02_K556RT4_D64", 0x0000, 0x0100, CRC(a59fdaa7) SHA1(0851a8b12e838e8f7e5ce840a0262facce303442))
+ROM_END
+
+/* Driver */
+
+/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS */
+COMP( 1984, ms6102, 0, 0, ms6102, 0, ms6102_state, 0, "Elektronika", "MS 6102.02", MACHINE_IS_SKELETON)
diff --git a/src/mame/drivers/proteus3.cpp b/src/mame/drivers/proteus3.cpp
index abf2bf52bdb..94ab7f7ca5d 100644
--- a/src/mame/drivers/proteus3.cpp
+++ b/src/mame/drivers/proteus3.cpp
@@ -50,6 +50,7 @@
#include "imagedev/cassette.h"
#include "machine/6821pia.h"
#include "machine/6850acia.h"
+#include "machine/mc14411.h"
#include "machine/clock.h"
#include "machine/keyboard.h"
#include "sound/wave.h"
@@ -69,9 +70,11 @@ public:
, m_p_videoram(*this, "vram")
, m_p_chargen(*this, "chargen")
, m_pia(*this, "pia")
+ , m_brg(*this, "brg")
, m_acia1(*this, "acia1")
, m_acia2(*this, "acia2")
, m_cass(*this, "cassette")
+ , m_serial(*this, "SERIAL")
{ }
DECLARE_WRITE_LINE_MEMBER(ca2_w);
@@ -79,11 +82,28 @@ public:
void kbd_put(u8 data);
DECLARE_WRITE_LINE_MEMBER(acia1_txdata_w);
DECLARE_WRITE_LINE_MEMBER(acia1_clock_w);
- DECLARE_WRITE_LINE_MEMBER(acia2_clock_w);
TIMER_DEVICE_CALLBACK_MEMBER(timer_c);
TIMER_DEVICE_CALLBACK_MEMBER(timer_p);
uint32_t screen_update_proteus3(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ // Clocks
+ void write_acia_clocks(int id, int state);
+ DECLARE_WRITE_LINE_MEMBER (write_f1_clock){ write_acia_clocks(mc14411_device::TIMER_F1, state); }
+ DECLARE_WRITE_LINE_MEMBER (write_f2_clock){ write_acia_clocks(mc14411_device::TIMER_F2, state); }
+ DECLARE_WRITE_LINE_MEMBER (write_f3_clock){ write_acia_clocks(mc14411_device::TIMER_F3, state); }
+ DECLARE_WRITE_LINE_MEMBER (write_f4_clock){ write_acia_clocks(mc14411_device::TIMER_F4, state); }
+ DECLARE_WRITE_LINE_MEMBER (write_f5_clock){ write_acia_clocks(mc14411_device::TIMER_F5, state); }
+ DECLARE_WRITE_LINE_MEMBER (write_f6_clock){ write_acia_clocks(mc14411_device::TIMER_F6, state); }
+ DECLARE_WRITE_LINE_MEMBER (write_f7_clock){ write_acia_clocks(mc14411_device::TIMER_F7, state); }
+ DECLARE_WRITE_LINE_MEMBER (write_f8_clock){ write_acia_clocks(mc14411_device::TIMER_F8, state); }
+ DECLARE_WRITE_LINE_MEMBER (write_f9_clock){ write_acia_clocks(mc14411_device::TIMER_F9, state); }
+ DECLARE_WRITE_LINE_MEMBER (write_f10_clock){ write_acia_clocks(mc14411_device::TIMER_F10, state); }
+ DECLARE_WRITE_LINE_MEMBER (write_f11_clock){ write_acia_clocks(mc14411_device::TIMER_F11, state); }
+ DECLARE_WRITE_LINE_MEMBER (write_f12_clock){ write_acia_clocks(mc14411_device::TIMER_F12, state); }
+ DECLARE_WRITE_LINE_MEMBER (write_f13_clock){ write_acia_clocks(mc14411_device::TIMER_F13, state); }
+ DECLARE_WRITE_LINE_MEMBER (write_f14_clock){ write_acia_clocks(mc14411_device::TIMER_F14, state); }
+ DECLARE_WRITE_LINE_MEMBER (write_f15_clock){ write_acia_clocks(mc14411_device::TIMER_F15, state); }
+
private:
uint8_t m_video_data;
uint8_t m_flashcnt;
@@ -97,9 +117,13 @@ private:
required_region_ptr<u8> m_p_videoram;
required_region_ptr<u8> m_p_chargen;
required_device<pia6821_device> m_pia;
+ required_device<mc14411_device> m_brg;
required_device<acia6850_device> m_acia1; // cassette uart
required_device<acia6850_device> m_acia2; // tty keyboard uart
required_device<cassette_image_device> m_cass;
+
+ // hardware configuration and things that need rewiring
+ required_ioport m_serial;
};
@@ -126,6 +150,24 @@ ADDRESS_MAP_END
******************************************************************************/
static INPUT_PORTS_START(proteus3)
+ PORT_START("SERIAL")
+ PORT_CONFNAME(0x0F , 0x00 , "Serial Baud Rate") // F1-F16 pins on MC14411 in X16
+ PORT_CONFSETTING(mc14411_device::TIMER_F1, "153600")
+ PORT_CONFSETTING(mc14411_device::TIMER_F2, "115200")
+ PORT_CONFSETTING(mc14411_device::TIMER_F3, "76800")
+ PORT_CONFSETTING(mc14411_device::TIMER_F4, "57600")
+ PORT_CONFSETTING(mc14411_device::TIMER_F5, "38400")
+ PORT_CONFSETTING(mc14411_device::TIMER_F6, "28800")
+ PORT_CONFSETTING(mc14411_device::TIMER_F7, "19200")
+ PORT_CONFSETTING(mc14411_device::TIMER_F8, "9600")
+ PORT_CONFSETTING(mc14411_device::TIMER_F9, "4800")
+ PORT_CONFSETTING(mc14411_device::TIMER_F10, "3200")
+ PORT_CONFSETTING(mc14411_device::TIMER_F11, "2400")
+ PORT_CONFSETTING(mc14411_device::TIMER_F12, "2153.3")
+ PORT_CONFSETTING(mc14411_device::TIMER_F13, "1758.8")
+ PORT_CONFSETTING(mc14411_device::TIMER_F14, "1200")
+ PORT_CONFSETTING(mc14411_device::TIMER_F15, "921.6")
+ PORT_CONFSETTING(mc14411_device::TIMER_F16, "1.8432")
INPUT_PORTS_END
void proteus3_state::kbd_put(u8 data)
@@ -137,10 +179,17 @@ void proteus3_state::kbd_put(u8 data)
m_pia->cb1_w(0);
}
-WRITE_LINE_MEMBER( proteus3_state::acia2_clock_w )
+void proteus3_state::write_acia_clocks(int id, int state)
{
- m_acia2->write_txc(state);
- m_acia2->write_rxc(state);
+ if (id == m_serial->read()) // Configurable serial port
+ {
+ m_acia2->write_txc(state);
+ m_acia2->write_rxc(state);
+ }
+ if (id == mc14411_device::TIMER_F8) // Fixed bitrate for the cassette interface
+ {
+ acia1_clock_w(state);
+ }
}
/******************************************************************************
@@ -310,6 +359,15 @@ void proteus3_state::machine_reset()
m_cass_state = 1;
m_cassold = 1;
m_acia1->write_rxd(1);
+
+ // Set up the BRG divider. RSA is a jumper setting and RSB is always set High
+ m_brg->rsa_w( CLEAR_LINE );
+ m_brg->rsb_w( ASSERT_LINE );
+
+ // Disable all configured timers, only enabling the used ones
+ m_brg->timer_disable_all();
+ m_brg->timer_enable((mc14411_device::timer_id) m_serial->read(), true); // Serial port
+ m_brg->timer_enable( mc14411_device::TIMER_F8, true); // Cassette interface
}
@@ -344,8 +402,6 @@ static MACHINE_CONFIG_START( proteus3 )
/* cassette */
MCFG_DEVICE_ADD ("acia1", ACIA6850, 0)
MCFG_ACIA6850_TXD_HANDLER(WRITELINE(proteus3_state, acia1_txdata_w))
- MCFG_DEVICE_ADD("acia1_clock", CLOCK, 9600) // this controls cassette baud rate
- MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(proteus3_state, acia1_clock_w))
MCFG_CASSETTE_ADD("cassette")
MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED)
MCFG_SPEAKER_STANDARD_MONO("mono")
@@ -361,8 +417,24 @@ static MACHINE_CONFIG_START( proteus3 )
MCFG_RS232_PORT_ADD("rs232", default_rs232_devices, "keyboard")
MCFG_RS232_RXD_HANDLER(DEVWRITELINE("acia2", acia6850_device, write_rxd))
MCFG_RS232_CTS_HANDLER(DEVWRITELINE("acia2", acia6850_device, write_cts))
- MCFG_DEVICE_ADD("acia2_clock", CLOCK, 153600/8)
- MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(proteus3_state, acia2_clock_w))
+
+ /* Bit Rate Generator */
+ MCFG_MC14411_ADD ("brg", XTAL_1_8432MHz) // crystal needs verification but is the likely one
+ MCFG_MC14411_F1_CB(WRITELINE (proteus3_state, write_f1_clock))
+ MCFG_MC14411_F2_CB(WRITELINE (proteus3_state, write_f2_clock))
+ MCFG_MC14411_F3_CB(WRITELINE (proteus3_state, write_f3_clock))
+ MCFG_MC14411_F4_CB(WRITELINE (proteus3_state, write_f4_clock))
+ MCFG_MC14411_F5_CB(WRITELINE (proteus3_state, write_f5_clock))
+ MCFG_MC14411_F6_CB(WRITELINE (proteus3_state, write_f6_clock))
+ MCFG_MC14411_F7_CB(WRITELINE (proteus3_state, write_f7_clock))
+ MCFG_MC14411_F8_CB(WRITELINE (proteus3_state, write_f8_clock))
+ MCFG_MC14411_F9_CB(WRITELINE (proteus3_state, write_f9_clock))
+ MCFG_MC14411_F10_CB(WRITELINE (proteus3_state, write_f10_clock))
+ MCFG_MC14411_F11_CB(WRITELINE (proteus3_state, write_f11_clock))
+ MCFG_MC14411_F12_CB(WRITELINE (proteus3_state, write_f12_clock))
+ MCFG_MC14411_F13_CB(WRITELINE (proteus3_state, write_f13_clock))
+ MCFG_MC14411_F14_CB(WRITELINE (proteus3_state, write_f14_clock))
+ MCFG_MC14411_F15_CB(WRITELINE (proteus3_state, write_f15_clock))
MACHINE_CONFIG_END
diff --git a/src/mame/drivers/vector06.cpp b/src/mame/drivers/vector06.cpp
index 7c4dab9ff6a..13eddbd87dc 100644
--- a/src/mame/drivers/vector06.cpp
+++ b/src/mame/drivers/vector06.cpp
@@ -25,32 +25,36 @@ TODO:
#include "emu.h"
#include "includes/vector06.h"
+
#include "formats/vector06_dsk.h"
+#include "machine/i8255.h"
+#include "machine/pit8253.h"
+#include "sound/wave.h"
#include "screen.h"
#include "softlist.h"
#include "speaker.h"
/* Address maps */
static ADDRESS_MAP_START(vector06_mem, AS_PROGRAM, 8, vector06_state)
- AM_RANGE( 0x0000, 0x7fff ) AM_READ_BANK("bank2")
- AM_RANGE( 0xa000, 0xdfff ) AM_READWRITE_BANK("bank3")
- AM_RANGE( 0x0000, 0xffff ) AM_READWRITE_BANK("bank1")
+ AM_RANGE(0x0000, 0x7fff) AM_READ_BANK("bank2")
+ AM_RANGE(0xa000, 0xdfff) AM_READWRITE_BANK("bank3")
+ AM_RANGE(0x0000, 0xffff) AM_READWRITE_BANK("bank1")
ADDRESS_MAP_END
static ADDRESS_MAP_START(vector06_io, AS_IO, 8, vector06_state)
ADDRESS_MAP_GLOBAL_MASK(0xff)
ADDRESS_MAP_UNMAP_HIGH
- AM_RANGE( 0x00, 0x03) AM_READWRITE(vector06_8255_1_r, vector06_8255_1_w )
- AM_RANGE( 0x04, 0x07) AM_READWRITE(vector06_8255_2_r, vector06_8255_2_w )
- AM_RANGE( 0x08, 0x0B) AM_READWRITE(pit8253_r, pit8253_w)
- AM_RANGE( 0x0C, 0x0C) AM_WRITE(vector06_color_set)
- AM_RANGE( 0x10, 0x10) AM_WRITE(vector06_ramdisk_w)
- AM_RANGE( 0x14, 0x15) AM_DEVREADWRITE("aysnd", ay8910_device, data_r, data_address_w)
- AM_RANGE( 0x18, 0x18) AM_DEVREADWRITE("wd1793", kr1818vg93_device, data_r, data_w)
- AM_RANGE( 0x19, 0x19) AM_DEVREADWRITE("wd1793", kr1818vg93_device, sector_r, sector_w)
- AM_RANGE( 0x1a, 0x1a) AM_DEVREADWRITE("wd1793", kr1818vg93_device, track_r, track_w)
- AM_RANGE( 0x1b, 0x1b) AM_DEVREADWRITE("wd1793", kr1818vg93_device, status_r, cmd_w)
- AM_RANGE( 0x1C, 0x1C) AM_WRITE(vector06_disc_w)
+ AM_RANGE(0x00, 0x03) AM_DEVREADWRITE_MOD("ppi8255", i8255_device, read, write, xor<3>)
+ AM_RANGE(0x04, 0x07) AM_DEVREADWRITE_MOD("ppi8255_2", i8255_device, read, write, xor<3>)
+ AM_RANGE(0x08, 0x0b) AM_DEVREADWRITE_MOD("pit8253", pit8253_device, read, write, xor<3>)
+ AM_RANGE(0x0c, 0x0c) AM_WRITE(vector06_color_set)
+ AM_RANGE(0x10, 0x10) AM_WRITE(vector06_ramdisk_w)
+ AM_RANGE(0x14, 0x15) AM_DEVREADWRITE("aysnd", ay8910_device, data_r, data_address_w)
+ AM_RANGE(0x18, 0x18) AM_DEVREADWRITE("wd1793", kr1818vg93_device, data_r, data_w)
+ AM_RANGE(0x19, 0x19) AM_DEVREADWRITE("wd1793", kr1818vg93_device, sector_r, sector_w)
+ AM_RANGE(0x1a, 0x1a) AM_DEVREADWRITE("wd1793", kr1818vg93_device, track_r, track_w)
+ AM_RANGE(0x1b, 0x1b) AM_DEVREADWRITE("wd1793", kr1818vg93_device, status_r, cmd_w)
+ AM_RANGE(0x1c, 0x1c) AM_WRITE(vector06_disc_w)
ADDRESS_MAP_END
/* Input ports */
@@ -156,7 +160,6 @@ SLOT_INTERFACE_END
static MACHINE_CONFIG_START( vector06 )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", I8080, 3000000) // actual speed is wrong due to unemulated latency
-// MCFG_CPU_ADD("maincpu", Z80, 3000000)
MCFG_CPU_PROGRAM_MAP(vector06_mem)
MCFG_CPU_IO_MAP(vector06_io)
MCFG_I8085A_STATUS(WRITE8(vector06_state, vector06_status_callback))
diff --git a/src/mame/includes/vector06.h b/src/mame/includes/vector06.h
index 19e17d6524c..ffd003f2261 100644
--- a/src/mame/includes/vector06.h
+++ b/src/mame/includes/vector06.h
@@ -13,19 +13,15 @@
#include "bus/generic/slot.h"
#include "cpu/i8085/i8085.h"
-#include "cpu/z80/z80.h"
#include "imagedev/cassette.h"
#include "imagedev/flopdrv.h"
-#include "machine/i8255.h"
-#include "machine/pit8253.h"
#include "machine/ram.h"
#include "machine/wd_fdc.h"
#include "sound/ay8910.h"
#include "sound/spkrdev.h"
-#include "sound/wave.h"
class vector06_state : public driver_device
@@ -40,9 +36,6 @@ public:
m_fdc(*this, "wd1793"),
m_floppy0(*this, "wd1793:0"),
m_floppy1(*this, "wd1793:1"),
- m_ppi(*this, "ppi8255"),
- m_ppi2(*this, "ppi8255_2"),
- m_pit8253(*this, "pit8253"),
m_ay(*this, "aysnd"),
m_ram(*this, RAM_TAG),
m_palette(*this, "palette"),
@@ -65,15 +58,9 @@ public:
DECLARE_WRITE8_MEMBER(vector06_romdisk_portb_w);
DECLARE_WRITE8_MEMBER(vector06_romdisk_porta_w);
DECLARE_WRITE8_MEMBER(vector06_romdisk_portc_w);
- DECLARE_READ8_MEMBER(vector06_8255_1_r);
- DECLARE_WRITE8_MEMBER(vector06_8255_1_w);
- DECLARE_READ8_MEMBER(vector06_8255_2_r);
- DECLARE_WRITE8_MEMBER(vector06_8255_2_w);
DECLARE_WRITE8_MEMBER(vector06_disc_w);
DECLARE_WRITE8_MEMBER(vector06_status_callback);
DECLARE_WRITE8_MEMBER(vector06_ramdisk_w);
- DECLARE_WRITE8_MEMBER(pit8253_w);
- DECLARE_READ8_MEMBER(pit8253_r);
DECLARE_WRITE_LINE_MEMBER(speaker_w);
void vector06_set_video_mode(int width);
virtual void machine_start() override;
@@ -93,9 +80,6 @@ private:
required_device<kr1818vg93_device> m_fdc;
required_device<floppy_connector> m_floppy0;
required_device<floppy_connector> m_floppy1;
- required_device<i8255_device> m_ppi;
- required_device<i8255_device> m_ppi2;
- required_device<pit8253_device> m_pit8253;
required_device<ay8910_device> m_ay;
required_device<ram_device> m_ram;
required_device<palette_device> m_palette;
diff --git a/src/mame/machine/vector06.cpp b/src/mame/machine/vector06.cpp
index 3b0d3b6be42..edb92de7b08 100644
--- a/src/mame/machine/vector06.cpp
+++ b/src/mame/machine/vector06.cpp
@@ -94,26 +94,6 @@ WRITE8_MEMBER( vector06_state::vector06_romdisk_portc_w )
m_romdisk_msb = data;
}
-READ8_MEMBER( vector06_state::vector06_8255_1_r )
-{
- return m_ppi->read(space, offset^3);
-}
-
-WRITE8_MEMBER( vector06_state::vector06_8255_1_w )
-{
- m_ppi->write(space, offset^3, data);
-}
-
-READ8_MEMBER( vector06_state::vector06_8255_2_r )
-{
- return m_ppi2->read(space, offset^3);
-}
-
-WRITE8_MEMBER( vector06_state::vector06_8255_2_w )
-{
- m_ppi2->write(space, offset^3, data);
-}
-
INTERRUPT_GEN_MEMBER(vector06_state::vector06_interrupt)
{
device.execute().set_input_line(0, HOLD_LINE);
@@ -206,16 +186,6 @@ WRITE_LINE_MEMBER(vector06_state::speaker_w)
m_speaker->level_w(state);
}
-WRITE8_MEMBER(vector06_state::pit8253_w)
-{
- m_pit8253->write(space, offset ^ 3, data);
-}
-
-READ8_MEMBER(vector06_state::pit8253_r)
-{
- return m_pit8253->read(space, offset ^ 3);
-}
-
void vector06_state::machine_start()
{
m_reset_check_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(vector06_state::reset_check_callback), this));
diff --git a/src/mame/mame.lst b/src/mame/mame.lst
index 3492b867c86..0a5adb838f0 100644
--- a/src/mame/mame.lst
+++ b/src/mame/mame.lst
@@ -96,7 +96,8 @@ sgi_ip6 // IP6: 4D/PI, R2000, 20MHz
4enraya // (c) 1990 IDSA
4enrayaa //
unkpacg // (c) 19?? ???
-unkfr // 1998?
+unksig // 1998?
+unksiga // 1998?
@source:4roses.cpp
4roses // (c) 1999 Unknown
@@ -27644,6 +27645,9 @@ mrjong // (c) 1983 Kiwako
@source:ms0515.cpp
ms0515 //
+@source:ms6102.cpp
+ms6102 //
+
@source:ms32.cpp
47pie2 // (c) 1994
47pie2o // (c) 1994
diff --git a/src/mame/mess.flt b/src/mame/mess.flt
index f56d08983f2..f245f27ecd2 100644
--- a/src/mame/mess.flt
+++ b/src/mame/mess.flt
@@ -393,6 +393,7 @@ mpf1.cpp
mps1230.cpp
mpz80.cpp
ms0515.cpp
+ms6102.cpp
ms9540.cpp
msbc1.cpp
mstation.cpp