diff options
-rw-r--r-- | android-project/app/src/main/AndroidManifest.xml | 4 | ||||
-rw-r--r-- | hash/pv2000.xml | 43 | ||||
-rw-r--r-- | makefile | 4 | ||||
-rw-r--r-- | scripts/target/mame/mess.lua | 1 | ||||
-rw-r--r-- | src/devices/bus/coco/coco_t4426.cpp | 257 | ||||
-rw-r--r-- | src/devices/cpu/i8089/i8089_channel.cpp | 6 | ||||
-rw-r--r-- | src/devices/machine/6821pia.cpp | 55 | ||||
-rw-r--r-- | src/devices/machine/mc14411.cpp | 4 | ||||
-rw-r--r-- | src/emu/drivers/xtal.h | 1 | ||||
-rw-r--r-- | src/mame/drivers/4enraya.cpp | 87 | ||||
-rw-r--r-- | src/mame/drivers/altos8600.cpp | 46 | ||||
-rw-r--r-- | src/mame/drivers/coco12.cpp | 2 | ||||
-rw-r--r-- | src/mame/drivers/jvh.cpp | 21 | ||||
-rw-r--r-- | src/mame/drivers/ms6102.cpp | 292 | ||||
-rw-r--r-- | src/mame/drivers/proteus3.cpp | 88 | ||||
-rw-r--r-- | src/mame/drivers/vector06.cpp | 33 | ||||
-rw-r--r-- | src/mame/includes/vector06.h | 16 | ||||
-rw-r--r-- | src/mame/machine/vector06.cpp | 30 | ||||
-rw-r--r-- | src/mame/mame.lst | 6 | ||||
-rw-r--r-- | src/mame/mess.flt | 1 |
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> @@ -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 |