From cc6fb941460931f4a17bebb5779e2c11eb99fc7a Mon Sep 17 00:00:00 2001 From: Robbbert Date: Sun, 24 Sep 2017 21:46:42 +1000 Subject: [PATCH 01/18] (nw) Housekeeping. --- src/mame/mame.lst | 4 +++- src/mame/mess.flt | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 37ae895bf62..a1c81dd54df 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -1074,8 +1074,10 @@ tnextspcj // A8003 'NS' (c) 1989 - Japan asma2k // asmapro // -@source:alphatro.cpp +@source:alphatpx.cpp alphatp3 // 1982 Triumph-Adler + +@source:alphatro.cpp alphatro // @source:altair.cpp diff --git a/src/mame/mess.flt b/src/mame/mess.flt index 31e386ff40d..20ec8452e9b 100644 --- a/src/mame/mess.flt +++ b/src/mame/mess.flt @@ -357,6 +357,7 @@ mccpm.cpp megadriv.cpp mekd2.cpp mephisto.cpp +mephisto_montec.cpp mes.cpp mice.cpp micral.cpp From dc66d78e8c7987db18d39408c8715ca4cc5c3d43 Mon Sep 17 00:00:00 2001 From: smf- Date: Sun, 24 Sep 2017 13:45:58 +0100 Subject: [PATCH 02/18] fix for clang 5 unused lambda capture errors (nw) --- src/emu/http.cpp | 2 +- src/frontend/mame/info.cpp | 2 +- src/frontend/mame/luaengine.cpp | 10 +++++----- src/frontend/mame/ui/state.cpp | 2 +- src/lib/util/server_http_impl.hpp | 2 +- src/lib/util/server_ws_impl.hpp | 6 +++--- src/tools/imgtool/library.cpp | 2 +- 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/emu/http.cpp b/src/emu/http.cpp index d7f77474bd1..fc14b0e75ae 100644 --- a/src/emu/http.cpp +++ b/src/emu/http.cpp @@ -272,7 +272,7 @@ http_manager::http_manager(bool active, short port, const char *root) auto& endpoint = m_wsserver->m_endpoint["/"]; - m_server->on_get([this, root](auto response, auto request) { + m_server->on_get([root](auto response, auto request) { std::string doc_root = root; auto request_impl = std::make_shared(request); diff --git a/src/frontend/mame/info.cpp b/src/frontend/mame/info.cpp index 6d1712e6ca4..6dbfd5a1afb 100644 --- a/src/frontend/mame/info.cpp +++ b/src/frontend/mame/info.cpp @@ -224,7 +224,7 @@ void info_xml_creator::output(FILE *out, std::vector const &pattern driver_enumerator drivlist(m_lookup_options); std::vector matched(patterns.size(), false); size_t exact_matches = 0; - auto const included = [&patterns, &drivlist, &matched, &exact_matches] (char const *const name) -> bool + auto const included = [&patterns, &matched, &exact_matches] (char const *const name) -> bool { if (patterns.empty()) return true; diff --git a/src/frontend/mame/luaengine.cpp b/src/frontend/mame/luaengine.cpp index 82e3f3f50ad..610b1947210 100644 --- a/src/frontend/mame/luaengine.cpp +++ b/src/frontend/mame/luaengine.cpp @@ -923,7 +923,7 @@ void lua_engine::initialize() */ emu.new_usertype("thread", sol::call_constructor, sol::constructors>(), - "start", [this](context &ctx, const char *scr) { + "start", [](context &ctx, const char *scr) { std::string script(scr); if(ctx.busy) return false; @@ -962,13 +962,13 @@ void lua_engine::initialize() th.detach(); return true; }, - "continue", [this](context &ctx, const char *val) { + "continue", [](context &ctx, const char *val) { if(!ctx.yield) return; ctx.result = val; ctx.sync.notify_all(); }, - "result", sol::property([this](context &ctx) -> std::string { + "result", sol::property([](context &ctx) -> std::string { if(ctx.busy && !ctx.yield) return ""; return ctx.result; @@ -1008,7 +1008,7 @@ void lua_engine::initialize() } return sol::make_object(sol(), ret); }, - "read_block", [this](save_item &item, int offset, sol::buffer *buff) { + "read_block", [](save_item &item, int offset, sol::buffer *buff) { if(!item.base || ((offset + buff->get_len()) > (item.size * item.count))) buff->set_len(0); else @@ -1267,7 +1267,7 @@ void lua_engine::initialize() * debug:wplist(space)[] - table of watchpoints */ sol().registry().new_usertype("device_debug", "new", sol::no_constructor, - "step", [this](device_debug &dev, sol::object num) { + "step", [](device_debug &dev, sol::object num) { int steps = 1; if(num.is()) steps = num.as(); diff --git a/src/frontend/mame/ui/state.cpp b/src/frontend/mame/ui/state.cpp index 27bbe24ed00..28d47040d60 100644 --- a/src/frontend/mame/ui/state.cpp +++ b/src/frontend/mame/ui/state.cpp @@ -175,7 +175,7 @@ void menu_load_save_state_base::populate(float &customtop, float &custombottom) std::sort( m_entries_vec.begin(), m_entries_vec.end(), - [this](const file_entry *a, const file_entry *b) + [](const file_entry *a, const file_entry *b) { return a->last_modified() > b->last_modified(); }); diff --git a/src/lib/util/server_http_impl.hpp b/src/lib/util/server_http_impl.hpp index e8b76ad2f74..4f909c023ef 100644 --- a/src/lib/util/server_http_impl.hpp +++ b/src/lib/util/server_http_impl.hpp @@ -220,7 +220,7 @@ namespace webpp { ///Use this function if you need to recursively send parts of a longer message void send(const std::shared_ptr &response, const std::function& callback=nullptr) const { - asio::async_write(*response->socket(), response->m_streambuf, [this, response, callback](const std::error_code& ec, size_t /*bytes_transferred*/) { + asio::async_write(*response->socket(), response->m_streambuf, [response, callback](const std::error_code& ec, size_t /*bytes_transferred*/) { if(callback) callback(ec); }); diff --git a/src/lib/util/server_ws_impl.hpp b/src/lib/util/server_ws_impl.hpp index 35f0043ed10..cbb6f9b4908 100644 --- a/src/lib/util/server_ws_impl.hpp +++ b/src/lib/util/server_ws_impl.hpp @@ -282,7 +282,7 @@ namespace webpp { else header_stream->put(static_cast(length)); - connection->strand.post([this, connection, header_stream, message_stream, callback]() { + connection->strand.post([connection, header_stream, message_stream, callback]() { connection->send_queue.emplace_back(header_stream, message_stream, callback); if(connection->send_queue.size()==1) connection->send_from_queue(connection); @@ -493,7 +493,7 @@ namespace webpp { //Close connection if unmasked message from client (protocol error) if(first_bytes[1]<128) { const std::string reason("message from client not masked"); - send_close(connection, 1002, reason, [this, connection](const std::error_code& /*ec*/) {}); + send_close(connection, 1002, reason, [connection](const std::error_code& /*ec*/) {}); connection_close(connection, endpoint, 1002, reason); return; } @@ -586,7 +586,7 @@ namespace webpp { } auto reason=message->string(); - send_close(connection, status, reason, [this, connection](const std::error_code& /*ec*/) {}); + send_close(connection, status, reason, [connection](const std::error_code& /*ec*/) {}); connection_close(connection, endpoint, status, reason); return; } diff --git a/src/tools/imgtool/library.cpp b/src/tools/imgtool/library.cpp index c534833da2e..9b04eecb03a 100644 --- a/src/tools/imgtool/library.cpp +++ b/src/tools/imgtool/library.cpp @@ -182,7 +182,7 @@ library::modulelist::iterator library::find(const std::string &module_name) return std::find_if( m_modules.begin(), m_modules.end(), - [this, module_name](std::unique_ptr &module) { return !module_name.compare(module->name); }); + [module_name](std::unique_ptr &module) { return !module_name.compare(module->name); }); } From 32857b2f4996ffaef8b328e6df16cf068d516b83 Mon Sep 17 00:00:00 2001 From: smf- Date: Sun, 24 Sep 2017 17:34:52 +0100 Subject: [PATCH 03/18] Changed the clang workround for ../../../../../3rdparty/compat/winsdk-override\wrl/internal.h:23:13: error: function declared 'noreturn' should not return [-Werror,-Winvalid-noreturn] to work with clang 5.0 (nw) --- 3rdparty/compat/winsdk-override/wrl/internal.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/compat/winsdk-override/wrl/internal.h b/3rdparty/compat/winsdk-override/wrl/internal.h index e2dad542cc3..da989d189db 100644 --- a/3rdparty/compat/winsdk-override/wrl/internal.h +++ b/3rdparty/compat/winsdk-override/wrl/internal.h @@ -20,7 +20,7 @@ namespace Microsoft { inline void DECLSPEC_NORETURN RaiseException(HRESULT hr, DWORD flags = EXCEPTION_NONCONTINUABLE) throw() { ::RaiseException(static_cast(hr), flags, 0, NULL); - throw std::exception(); + std::abort(); } template From 995a86d58b177cfc11facf174cfd9cffac4a9645 Mon Sep 17 00:00:00 2001 From: Joakim Larsson Edstrom Date: Tue, 26 Sep 2017 01:03:00 +0200 Subject: [PATCH 04/18] t4426: promoted to MACHINE_IS_INCOMPLETE as most of the cart software works but the two last main menu choices causes the firmware to end with a BASIC error, needs investigation --- src/mame/drivers/coco12.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mame/drivers/coco12.cpp b/src/mame/drivers/coco12.cpp index b83f419dfad..49f06c73120 100644 --- a/src/mame/drivers/coco12.cpp +++ b/src/mame/drivers/coco12.cpp @@ -495,4 +495,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 ) From 08884304c8ded5ed9a07042c3e44c04d7fa617dc Mon Sep 17 00:00:00 2001 From: Joakim Larsson Edstrom Date: Tue, 26 Sep 2017 01:06:33 +0200 Subject: [PATCH 05/18] t4426 cart: added 14411 BRG, 6850 acia as a second rs232 port and fixed banking --- src/devices/bus/coco/coco_t4426.cpp | 262 ++++++++++++++++++++-------- 1 file changed, 185 insertions(+), 77 deletions(-) diff --git a/src/devices/bus/coco/coco_t4426.cpp b/src/devices/bus/coco/coco_t4426.cpp index aed2e990c94..2639270bccd 100644 --- a/src/devices/bus/coco/coco_t4426.cpp +++ b/src/devices/bus/coco/coco_t4426.cpp @@ -42,26 +42,20 @@ #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_GENERAL 0x01 -#define LOG_SETUP 0x02 -#define LOG_PRINTF 0x04 -#define LOG_PIA 0x08 +//#define VERBOSE (LOG_PIA | LOG_GENERAL | LOG_SETUP) +//#define LOG_OUTPUT_FUNC 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__) #ifdef _MSC_VER #define FUNCNAME __func__ @@ -73,10 +67,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 +83,6 @@ namespace { - // ======================> coco_t4426_device - class coco_t4426_device : public device_t, public device_cococart_interface @@ -102,6 +99,17 @@ namespace virtual uint8_t* get_cart_base() override; DECLARE_WRITE8_MEMBER(pia_A_w); + // Clocks TODO: Validate on PCB what lines are used + 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 +129,11 @@ namespace // internal state required_device m_uart; required_device m_pia; + required_device m_brg; + + required_ioport m_serial_baud; + + void set_bank(); }; }; @@ -130,33 +143,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) // TODO: Figure out address mapping for ACIA + + 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(0x8000, 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_LOAD("tercoPMOS4426-8549-4.31.bin", 0x6000, 0x1000, CRC(bc65c45c) SHA1(e50cfd1d61e29fe05eb795d8bf6303e7b91ed8e5)) + ROM_RELOAD(0x07000,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 +198,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 +237,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,11 +287,34 @@ 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 -------------------------------------------------*/ READ8_MEMBER(coco_t4426_device::scs_read) @@ -253,16 +323,33 @@ READ8_MEMBER(coco_t4426_device::scs_read) LOG("%s", FUNCNAME); - if ((offset >= 0x04) && (offset <= 0x07)) - result = m_pia->read(space, offset - 0x04); + if ((offset >= 0x00) && (offset <= 0x07)) + { + LOG(" PIA"); + result = m_pia->read(space, offset & 3); + LOG(" - Offs:%04x Data:%02x\n", offset - 0x04, result); + } + else if ((offset >= 0x08) && (offset <= 0x0f)) + { + LOG(" ACIA"); + if (offset & 1) + result = m_uart->status_r(space, offset & 1); + else + result = m_uart->data_r(space, offset & 1); + LOG(" - 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 -------------------------------------------------*/ WRITE8_MEMBER(coco_t4426_device::scs_write) @@ -270,8 +357,24 @@ WRITE8_MEMBER(coco_t4426_device::scs_write) LOG("%s(%02x)\n", FUNCNAME, 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 "); + m_pia->write(space, offset & 3, data); + } + else if ((offset >= 0x08) && (offset <= 0x0f)) + { + LOG(" ACIA"); + if (offset & 1) + m_uart->control_w(space, offset & 1, data); + else + m_uart->data_w(space, offset & 1, data); + LOG(" - Offs:%04x Data:%02x\n", offset & 1, data); + } + else + { + LOG(" Unknown device"); + } } /*---------------------------------------------------- @@ -295,7 +398,35 @@ WRITE8_MEMBER( coco_t4426_device::pia_A_w ) { LOGPIA("%s(%02x)\n", FUNCNAME, data); m_select = data; - cart_base_changed(); + set_bank(); + //cart_base_changed(); +} + +void coco_t4426_device::set_bank() +{ + uint8_t *cartbase = memregion(CARTSLOT_TAG)->base(); + uint8_t *bankbase = memregion(CARTBANK_TAG)->base(); + + switch (m_select) + { + case 0: + case ROM0:memcpy(cartbase + 0x4000, bankbase + 0x0000, 0x2000); break; + case ROM1:memcpy(cartbase + 0x4000, bankbase + 0x2000, 0x2000); break; + case ROM2:memcpy(cartbase + 0x4000, bankbase + 0x4000, 0x2000); break; + case ROM3:memcpy(cartbase + 0x4000, bankbase + 0x6000, 0x2000); break; + case ROM4:memcpy(cartbase + 0x4000, bankbase + 0x8000, 0x2000); break; + case ROM5:memcpy(cartbase + 0x4000, bankbase + 0xa000, 0x2000); break; + case ROM6:memcpy(cartbase + 0x4000, bankbase + 0xc000, 0x2000); break; + case ROM7:memcpy(cartbase + 0x4000, 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("%02x\n", m_select); + for (int i = 0; i < 48; i++) printf("%02x ", *((uint8_t *)(cartbase + 0x4000 + i))); + printf("\n"); + for (int i = 0; i < 48; i++) printf("'%c'", *((uint8_t *)(cartbase + 0x4000 + i))); + printf("\n"); +#endif } /*------------------------------------------------- @@ -305,28 +436,5 @@ WRITE8_MEMBER( coco_t4426_device::pia_A_w ) uint8_t* coco_t4426_device::get_cart_base() { LOG("%s - m_select %02x -> %02x\n", FUNCNAME, m_select, ~m_select & 0xff ); - uint8_t *base = memregion(CARTSLOT_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; - } - -#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 - - return base; + return memregion(CARTSLOT_TAG)->base() + 0x4000; } From 6ec6ee3cb71d47571a750ce58a29e2222fff37d8 Mon Sep 17 00:00:00 2001 From: Joakim Larsson Edstrom Date: Tue, 26 Sep 2017 01:07:10 +0200 Subject: [PATCH 06/18] 6821: improved logging --- src/devices/machine/6821pia.cpp | 55 +++++++++++++++++---------------- 1 file changed, 28 insertions(+), 27 deletions(-) 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; From b5a272d506aa6682bc2b9c98a48b178d016681e3 Mon Sep 17 00:00:00 2001 From: Joakim Larsson Edstrom Date: Tue, 26 Sep 2017 01:07:56 +0200 Subject: [PATCH 07/18] mc14411: minor edits --- src/devices/machine/mc14411.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 From f9705aa35d8055e78ceba54ba3d7c6fd412235b0 Mon Sep 17 00:00:00 2001 From: cracyc Date: Tue, 26 Sep 2017 08:46:12 -0500 Subject: [PATCH 08/18] i8089: fix sintr (nw) --- src/devices/cpu/i8089/i8089_channel.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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; From 409427c7cca5add9bbfc60d07e5b1505af40a49d Mon Sep 17 00:00:00 2001 From: AJR Date: Tue, 26 Sep 2017 14:14:37 -0400 Subject: [PATCH 09/18] vector06: I/O handler cleanup (nw) --- src/mame/drivers/vector06.cpp | 33 ++++++++++++++++++--------------- src/mame/includes/vector06.h | 16 ---------------- src/mame/machine/vector06.cpp | 30 ------------------------------ 3 files changed, 18 insertions(+), 61 deletions(-) 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 m_fdc; required_device m_floppy0; required_device m_floppy1; - required_device m_ppi; - required_device m_ppi2; - required_device m_pit8253; required_device m_ay; required_device m_ram; required_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)); From 0ae00ce338ce87d3c7ee2ad04250d133cb65e0c8 Mon Sep 17 00:00:00 2001 From: Joakim Larsson Edstrom Date: Tue, 26 Sep 2017 20:38:05 +0200 Subject: [PATCH 10/18] t4426: cleanup --- src/devices/bus/coco/coco_t4426.cpp | 77 +++++++++++++---------------- 1 file changed, 35 insertions(+), 42 deletions(-) diff --git a/src/devices/bus/coco/coco_t4426.cpp b/src/devices/bus/coco/coco_t4426.cpp index 2639270bccd..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| +-------------------+ | @@ -49,13 +49,15 @@ //#define LOG_GENERAL (1U << 0) #define LOG_SETUP (1U << 1) #define LOG_PIA (1U << 2) +#define LOG_ACIA (1U << 3) -//#define VERBOSE (LOG_PIA | LOG_GENERAL | LOG_SETUP) -//#define LOG_OUTPUT_FUNC std::cout +//#define VERBOSE (LOG_ACIA|LOG_GENERAL) // (LOG_PIA | LOG_GENERAL | LOG_SETUP) +//#define LOG_OUTPUT_STREAM std::cout #include "logmacro.h" #define LOGSETUP(...) LOGMASKED(LOG_SETUP, __VA_ARGS__) -#define LOGPIA(...) LOGMASKED(LOG_PIA, __VA_ARGS__) +#define LOGPIA(...) LOGMASKED(LOG_PIA, __VA_ARGS__) +#define LOGACIA(...) LOGMASKED(LOG_ACIA, __VA_ARGS__) #ifdef _MSC_VER #define FUNCNAME __func__ @@ -99,7 +101,7 @@ namespace virtual uint8_t* get_cart_base() override; DECLARE_WRITE8_MEMBER(pia_A_w); - // Clocks TODO: Validate on PCB what lines are used + // 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); } @@ -146,7 +148,7 @@ MACHINE_CONFIG_MEMBER(coco_t4426_device::device_add_mconfig) 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) // TODO: Figure out address mapping for ACIA + 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)) @@ -170,10 +172,10 @@ MACHINE_CONFIG_END ROM_START( coco_t4426 ) // Part of this region is filled by set_bank - ROM_REGION(0x8000, CARTSLOT_TAG, ROMREGION_ERASE00) + ROM_REGION(0x4000, CARTSLOT_TAG, ROMREGION_ERASE00) // Main cartridge ROM - ROM_LOAD("tercoPMOS4426-8549-4.31.bin", 0x6000, 0x1000, CRC(bc65c45c) SHA1(e50cfd1d61e29fe05eb795d8bf6303e7b91ed8e5)) - ROM_RELOAD(0x07000,0x1000) // Mirrored + ROM_LOAD("tercoPMOS4426-8549-4.31.bin", 0x2000, 0x1000, CRC(bc65c45c) SHA1(e50cfd1d61e29fe05eb795d8bf6303e7b91ed8e5)) + ROM_RELOAD(0x03000,0x1000) // Mirrored // this region is loaded from separate ROM images ROM_REGION(0x1a000, CARTBANK_TAG, ROMREGION_ERASE00) @@ -314,29 +316,29 @@ void coco_t4426_device::write_acia_clocks(int id, int state) /*------------------------------------------------- scs_read custom devices PIA is located at ff40-ff47 - ACIA is located at ff48-ff4F + 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 >= 0x00) && (offset <= 0x07)) { - LOG(" PIA"); + LOGPIA("- PIA\n"); result = m_pia->read(space, offset & 3); - LOG(" - Offs:%04x Data:%02x\n", offset - 0x04, result); + LOGPIA("- Offs:%04x Data:%02x\n", offset - 0x04, result); } - else if ((offset >= 0x08) && (offset <= 0x0f)) + else if ((offset >= 0x08) && (offset <= 0x0f) && (offset & 2)) { - LOG(" ACIA"); + LOGACIA("- ACIA\n"); if (offset & 1) result = m_uart->status_r(space, offset & 1); else result = m_uart->data_r(space, offset & 1); - LOG(" - Offs:%04x Data:%02x\n", offset - 0x04, result); + LOGACIA("- Offs:%04x Data:%02x\n", offset - 0x04, result); } else { @@ -349,32 +351,32 @@ READ8_MEMBER(coco_t4426_device::scs_read) /*------------------------------------------------- scs_write - custom devices PIA is located at ff40-ff47 - ACIA is located at ff48-ff4F + 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 >= 0x00) && (offset <= 0x07)) { - LOG(" PIA "); + LOG("- PIA\n"); m_pia->write(space, offset & 3, data); } - else if ((offset >= 0x08) && (offset <= 0x0f)) + else if ((offset >= 0x08) && (offset <= 0x0f) && (offset & 2)) { - LOG(" ACIA"); + LOGACIA("- ACIA"); if (offset & 1) m_uart->control_w(space, offset & 1, data); else m_uart->data_w(space, offset & 1, data); - LOG(" - Offs:%04x Data:%02x\n", offset & 1, data); + LOGACIA(" - Offs:%04x Data:%02x\n", offset & 1, data); } else { - LOG(" Unknown device"); - } + LOG(" Unknown device\n"); + } } /*---------------------------------------------------- @@ -399,7 +401,6 @@ WRITE8_MEMBER( coco_t4426_device::pia_A_w ) LOGPIA("%s(%02x)\n", FUNCNAME, data); m_select = data; set_bank(); - //cart_base_changed(); } void coco_t4426_device::set_bank() @@ -410,23 +411,15 @@ void coco_t4426_device::set_bank() switch (m_select) { case 0: - case ROM0:memcpy(cartbase + 0x4000, bankbase + 0x0000, 0x2000); break; - case ROM1:memcpy(cartbase + 0x4000, bankbase + 0x2000, 0x2000); break; - case ROM2:memcpy(cartbase + 0x4000, bankbase + 0x4000, 0x2000); break; - case ROM3:memcpy(cartbase + 0x4000, bankbase + 0x6000, 0x2000); break; - case ROM4:memcpy(cartbase + 0x4000, bankbase + 0x8000, 0x2000); break; - case ROM5:memcpy(cartbase + 0x4000, bankbase + 0xa000, 0x2000); break; - case ROM6:memcpy(cartbase + 0x4000, bankbase + 0xc000, 0x2000); break; - case ROM7:memcpy(cartbase + 0x4000, bankbase + 0xe000, 0x2000); 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("%02x\n", m_select); - for (int i = 0; i < 48; i++) printf("%02x ", *((uint8_t *)(cartbase + 0x4000 + i))); - printf("\n"); - for (int i = 0; i < 48; i++) printf("'%c'", *((uint8_t *)(cartbase + 0x4000 + i))); - printf("\n"); -#endif } /*------------------------------------------------- @@ -436,5 +429,5 @@ void coco_t4426_device::set_bank() 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() + 0x4000; + return memregion(CARTSLOT_TAG)->base(); } From 0fb9c539f9f3bd5f89472d39c7093befb494e2f4 Mon Sep 17 00:00:00 2001 From: AJR Date: Tue, 26 Sep 2017 14:47:01 -0400 Subject: [PATCH 11/18] escape: Correct CPU type; add VIA (nw) --- src/mame/drivers/jvh.cpp | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) 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 From fa45685b8aa99a02887a909bcf0f0be983e7b734 Mon Sep 17 00:00:00 2001 From: Sergey Svishchev Date: Sun, 17 Sep 2017 13:07:13 +0300 Subject: [PATCH 12/18] ms6102 (Elektronika MS6102.02, text terminal): new skeleton. --- scripts/target/mame/mess.lua | 1 + src/emu/drivers/xtal.h | 1 + src/mame/drivers/ms6102.cpp | 292 +++++++++++++++++++++++++++++++++++ src/mame/mame.lst | 3 + src/mame/mess.flt | 1 + 5 files changed, 298 insertions(+) create mode 100644 src/mame/drivers/ms6102.cpp diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua index e45438c5eef..5d7d2014152 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/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/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 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 m_p_videoram; + required_device m_maincpu; + required_device m_nvram; + required_device m_pic; + required_device m_dma8257; + required_device m_i8251; + required_device m_rs232; + required_device m_screen; + required_device m_palette; + required_region_ptr m_p_chargen; + required_region_ptr 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/mame.lst b/src/mame/mame.lst index c8d262f85b8..4da28cb4e83 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -27641,6 +27641,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 20ec8452e9b..d025967f763 100644 --- a/src/mame/mess.flt +++ b/src/mame/mess.flt @@ -392,6 +392,7 @@ mpf1.cpp mps1230.cpp mpz80.cpp ms0515.cpp +ms6102.cpp ms9540.cpp msbc1.cpp mstation.cpp From 33b731667404828afed9fff4c6bf83354037cfb7 Mon Sep 17 00:00:00 2001 From: cracyc Date: Tue, 26 Sep 2017 15:33:41 -0500 Subject: [PATCH 13/18] altos8600: fixes (nw) --- src/mame/drivers/altos8600.cpp | 42 +++++++++++++++++++++++++++------- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/src/mame/drivers/altos8600.cpp b/src/mame/drivers/altos8600.cpp index beeb2c466f3..d227e0b09a8 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) From e1f3f570e51bd8eae6a016e716ffb8e4a27ab8a1 Mon Sep 17 00:00:00 2001 From: Ivan Vangelista Date: Tue, 26 Sep 2017 23:14:24 +0200 Subject: [PATCH 14/18] new working software list additions ----------------------------------------------- pv2000: Exciting Jockey [SSJ, Team Europe, Dustin Hubbard] pv2000: Real Number Basic [SSJ, Team Europe, Dustin Hubbard] pv2000.xml: desoldered and redumped ROMs for rakugaki and excitem2 [SSJ, Team Europe, Dustin Hubbard] --- hash/pv2000.xml | 43 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 37 insertions(+), 6 deletions(-) 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 @@ Excite Mahjong 2 + 1983 Casio + - + + @@ -79,11 +79,14 @@ Undumped carts: Rakugaki Special + 1983 Casio + - + + @@ -120,4 +123,32 @@ Undumped carts: + + + Exciting Jockey + + + 1984 + Casio + + + + + + + + + + Real Number Basic + + 198? + Casio + + + + + + + + From 4e88e8649cefef25437cdd59b16d2c21fb22bef0 Mon Sep 17 00:00:00 2001 From: cracyc Date: Tue, 26 Sep 2017 16:45:36 -0500 Subject: [PATCH 15/18] altos8600: oops (nw) --- src/mame/drivers/altos8600.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mame/drivers/altos8600.cpp b/src/mame/drivers/altos8600.cpp index d227e0b09a8..73a86c23d00 100644 --- a/src/mame/drivers/altos8600.cpp +++ b/src/mame/drivers/altos8600.cpp @@ -520,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)) From f57574c2389077546b6ccc49f38e468fc6b9a7f6 Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Wed, 27 Sep 2017 11:30:10 +1000 Subject: [PATCH 16/18] version bump (nw) --- android-project/app/src/main/AndroidManifest.xml | 4 ++-- makefile | 4 ++-- 2 files changed, 4 insertions(+), 4 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 @@ --> 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; >> $@ From ec5c24f7f52e7175c2d68643f319de1f66a3300c Mon Sep 17 00:00:00 2001 From: RobertoFresca Date: Tue, 26 Sep 2017 23:59:48 -0300 Subject: [PATCH 17/18] New working clones ------------------ unknown 'Space Invaders' gambling game (set 2) [Roberto Fresca, Arzeno Fabrice] --- src/mame/drivers/4enraya.cpp | 87 +++++++++++++++++++++++++++--------- src/mame/mame.lst | 3 +- 2 files changed, 69 insertions(+), 21 deletions(-) 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 Pac-Man gambling game", MACHINE_SUPPORTS_SAVE ) -GAME( 199?, unkfr, 0, unkpacg, unkfr, _4enraya_state, unkpacg, ROT0, "", "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 'Pac-Man' gambling game", MACHINE_SUPPORTS_SAVE ) +GAME( 199?, unksig, 0, unkpacg, unkfr, _4enraya_state, unkpacg, ROT0, "", "unknown 'Space Invaders' gambling game (set 1)", MACHINE_SUPPORTS_SAVE ) +GAME( 199?, unksiga, unksig, unkpacg, unkfr, _4enraya_state, unkpacg, ROT0, "", "unknown 'Space Invaders' gambling game (set 2)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 4da28cb4e83..051f5c277cb 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 From 84f2284e375973d6b05eeb09999dfb3d9d97003e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20Larsson=20Edstr=C3=B6m?= Date: Wed, 27 Sep 2017 14:18:34 +0200 Subject: [PATCH 18/18] proteus3: added mc14411 bit rate generator device and replaced the timer based clocks for the ACIA:s (#2678) --- src/mame/drivers/proteus3.cpp | 88 +++++++++++++++++++++++++++++++---- 1 file changed, 80 insertions(+), 8 deletions(-) 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 m_p_videoram; required_region_ptr m_p_chargen; required_device m_pia; + required_device m_brg; required_device m_acia1; // cassette uart required_device m_acia2; // tty keyboard uart required_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