This commit is contained in:
Peter Ferrie 2019-02-16 21:47:23 -08:00
commit 0cacc8bc1f
32 changed files with 2067 additions and 1682 deletions

View File

@ -1,38 +1,42 @@
#
# FIXME: This file produces errors and needs to be fixed.
#
[SDL2]
# MAME/MESS keymap for Brazilian QWERTY 107-keys keyboard (Linux)
#
# The 107-keys Brazilian keyboard has an extra key used to type "/".
# Since I don't own such a keyboard, I can't write a proper definition.
# However, it should be placed in the 4th row, after ITEM_ID_SLASH.
#
# SDL can tell the difference between the two COMPOSE keys but assigns them the same label
# thus both OPENBRACE and QUOTE appear like "´ ~" in the user interface.
# The following definitions are therefore correct.
# MAME/MESS keymap for Brazilian ABNT2 QWERTY 105-keys keyboard (Linux)
#
# Row 1
#
ITEM_ID_TILDE SDL_SCANCODE_QUOTE '
ITEM_ID_TILDE SDL_SCANCODE_APOSTROPHE ~
#
# Row 2
#
ITEM_ID_OPENBRACE SDL_SCANCODE_COMPOSE ´
ITEM_ID_CLOSEBRACE SDL_SCANCODE_LEFTBRACKET [
ITEM_ID_OPENBRACE SDL_SCANCODE_RIGHTBRACKET [
ITEM_ID_CLOSEBRACE SDL_SCANCODE_BACKSLASH ]
#
# Row 3
#
ITEM_ID_COLON SDL_SCANCODE_WORLD_71 Ç
ITEM_ID_QUOTE SDL_SCANCODE_COMPOSE ~
ITEM_ID_BACKSLASH SDL_SCANCODE_RIGHTBRACKET ]
ITEM_ID_COLON SDL_SCANCODE_SLASH :
ITEM_ID_QUOTE SDL_SCANCODE_GRAVE "
ITEM_ID_BACKSLASH SDL_SCANCODE_NONUSBACKSLASH \
#
# Row 4
#
ITEM_ID_BACKSLASH2 SDL_SCANCODE_LESS <
ITEM_ID_SLASH SDL_SCANCODE_SEMICOLON ;
ITEM_ID_STOP SDL_SCANCODE_PERIOD .
#
# Row 5
# keyPad row 1
#
ITEM_ID_RALT SDL_SCANCODE_MODE ALTGR
ITEM_ID_NUMLOCK SDL_SCANCODE_NUMLOCKCLEAR NUMLOCK
ITEM_ID_SLASH_PAD SDL_SCANCODE_KP_DIVIDE /
ITEM_ID_ASTERISK SDL_SCANCODE_KP_MULTIPLY *
ITEM_ID_MINUS_PAD SDL_SCANCODE_KP_MINUS -
#
# keyPad row 2
#
ITEM_ID_PLUS_PAD SDL_SCANCODE_KP_PLUS +
#
# keyPad row 3
#
ITEM_ID_STOP SDL_SCANCODE_KP_DECIMAL .
#
# keyPad row 4
#
# keyPad row 5
#
ITEM_ID_COMMA SDL_SCANCODE_KP_PERIOD ,

View File

@ -1835,7 +1835,9 @@ files {
createMESSProjects(_target, _subtarget, "chessking")
files {
MAME_DIR .. "src/mame/drivers/ckz80.cpp",
MAME_DIR .. "src/mame/drivers/ckingbase.cpp",
MAME_DIR .. "src/mame/includes/ckingbase.h",
MAME_DIR .. "src/mame/drivers/cking_master.cpp",
}
createMESSProjects(_target, _subtarget, "chromatics")
@ -1897,7 +1899,9 @@ files {
createMESSProjects(_target, _subtarget, "cxg")
files {
MAME_DIR .. "src/mame/drivers/cxgz80.cpp",
MAME_DIR .. "src/mame/drivers/cxgbase.cpp",
MAME_DIR .. "src/mame/includes/cxgbase.h",
MAME_DIR .. "src/mame/drivers/cxg_ch2001.cpp",
}
createMESSProjects(_target, _subtarget, "cybiko")
@ -2125,11 +2129,12 @@ files {
createMESSProjects(_target, _subtarget, "fidelity")
files {
MAME_DIR .. "src/mame/drivers/fidelz80.cpp",
MAME_DIR .. "src/mame/drivers/fidelbase.cpp",
MAME_DIR .. "src/mame/includes/fidelbase.h",
MAME_DIR .. "src/mame/drivers/fidel_sc6.cpp",
MAME_DIR .. "src/mame/drivers/fidel6502.cpp",
MAME_DIR .. "src/mame/includes/fidel_desdis_common.h",
MAME_DIR .. "src/mame/drivers/fidel68k.cpp",
MAME_DIR .. "src/mame/drivers/fidelmcs48.cpp",
}
createMESSProjects(_target, _subtarget, "force")

View File

@ -21,6 +21,7 @@
#include "natkeyboard.h"
#include "render.h"
#include <ctype.h>
#include <algorithm>
#include <fstream>
@ -3215,13 +3216,6 @@ void debugger_commands::execute_memdump(int ref, const std::vector<std::string>
execute_symlist - execute the symlist command
-------------------------------------------------*/
static int CLIB_DECL symbol_sort_compare(const void *item1, const void *item2)
{
const char *str1 = *(const char **)item1;
const char *str2 = *(const char **)item2;
return strcmp(str1, str2);
}
void debugger_commands::execute_symlist(int ref, const std::vector<std::string> &params)
{
device_t *cpu = nullptr;
@ -3257,7 +3251,9 @@ void debugger_commands::execute_symlist(int ref, const std::vector<std::string>
/* sort the symbols */
if (count > 1)
qsort((void *)namelist, count, sizeof(namelist[0]), symbol_sort_compare);
std::sort(&namelist[0], &namelist[count], [](const char *item1, const char *item2) {
return strcmp(item1, item2) < 0;
});
/* iterate over symbols and print out relevant ones */
for (symnum = 0; symnum < count; symnum++)

View File

@ -12,79 +12,68 @@
#include "debugger.h"
#include "dvbpoints.h"
#include <algorithm>
#include <iomanip>
// Sorting functors for the qsort function
static int cIndexAscending(const void* a, const void* b)
static bool cIndexAscending(const device_debug::breakpoint *a, const device_debug::breakpoint *b)
{
const device_debug::breakpoint* left = *(device_debug::breakpoint**)a;
const device_debug::breakpoint* right = *(device_debug::breakpoint**)b;
return left->index() - right->index();
return a->index() < b->index();
}
static int cIndexDescending(const void* a, const void* b)
static bool cIndexDescending(const device_debug::breakpoint *a, const device_debug::breakpoint *b)
{
return cIndexAscending(b, a);
}
static int cEnabledAscending(const void* a, const void* b)
static bool cEnabledAscending(const device_debug::breakpoint *a, const device_debug::breakpoint *b)
{
const device_debug::breakpoint* left = *(device_debug::breakpoint**)a;
const device_debug::breakpoint* right = *(device_debug::breakpoint**)b;
return (left->enabled() ? 1 : 0) - (right->enabled() ? 1 : 0);
return !a->enabled() && b->enabled();
}
static int cEnabledDescending(const void* a, const void* b)
static bool cEnabledDescending(const device_debug::breakpoint *a, const device_debug::breakpoint *b)
{
return cEnabledAscending(b, a);
}
static int cCpuAscending(const void* a, const void* b)
static bool cCpuAscending(const device_debug::breakpoint *a, const device_debug::breakpoint *b)
{
const device_debug::breakpoint* left = *(device_debug::breakpoint**)a;
const device_debug::breakpoint* right = *(device_debug::breakpoint**)b;
return strcmp(left->debugInterface()->device().tag(), right->debugInterface()->device().tag());
return strcmp(a->debugInterface()->device().tag(), b->debugInterface()->device().tag()) < 0;
}
static int cCpuDescending(const void* a, const void* b)
static bool cCpuDescending(const device_debug::breakpoint *a, const device_debug::breakpoint *b)
{
return cCpuAscending(b, a);
}
static int cAddressAscending(const void* a, const void* b)
static bool cAddressAscending(const device_debug::breakpoint *a, const device_debug::breakpoint *b)
{
const device_debug::breakpoint* left = *(device_debug::breakpoint**)a;
const device_debug::breakpoint* right = *(device_debug::breakpoint**)b;
return (left->address() > right->address()) ? 1 : (left->address() < right->address()) ? -1 : 0;
return a->address() < b->address();
}
static int cAddressDescending(const void* a, const void* b)
static bool cAddressDescending(const device_debug::breakpoint *a, const device_debug::breakpoint *b)
{
return cAddressAscending(b, a);
}
static int cConditionAscending(const void* a, const void* b)
static bool cConditionAscending(const device_debug::breakpoint *a, const device_debug::breakpoint *b)
{
const device_debug::breakpoint* left = *(device_debug::breakpoint**)a;
const device_debug::breakpoint* right = *(device_debug::breakpoint**)b;
return strcmp(left->condition(), right->condition());
return strcmp(a->condition(), b->condition()) < 0;
}
static int cConditionDescending(const void* a, const void* b)
static bool cConditionDescending(const device_debug::breakpoint *a, const device_debug::breakpoint *b)
{
return cConditionAscending(b, a);
}
static int cActionAscending(const void* a, const void* b)
static bool cActionAscending(const device_debug::breakpoint *a, const device_debug::breakpoint *b)
{
const device_debug::breakpoint* left = *(device_debug::breakpoint**)a;
const device_debug::breakpoint* right = *(device_debug::breakpoint**)b;
return strcmp(left->action(), right->action());
return strcmp(a->action(), b->action()) < 0;
}
static int cActionDescending(const void* a, const void* b)
static bool cActionDescending(const device_debug::breakpoint *a, const device_debug::breakpoint *b)
{
return cActionAscending(b, a);
}
@ -210,7 +199,7 @@ void debug_view_breakpoints::gather_breakpoints()
// And now for the sort
if (!m_buffer.empty())
qsort(&m_buffer[0], m_buffer.size(), sizeof(device_debug::breakpoint *), m_sortType);
std::stable_sort(m_buffer.begin(), m_buffer.end(), m_sortType);
}

View File

@ -48,7 +48,7 @@ private:
// internal state
int (*m_sortType)(void const *, void const *);
bool (*m_sortType)(const device_debug::breakpoint *, const device_debug::breakpoint *);
std::vector<device_debug::breakpoint *> m_buffer;
};

View File

@ -11,102 +11,87 @@
#include "emu.h"
#include "dvwpoints.h"
#include <algorithm>
#include <iomanip>
static int cIndexAscending(const void* a, const void* b)
static bool cIndexAscending(const device_debug::watchpoint *a, const device_debug::watchpoint *b)
{
const device_debug::watchpoint* left = *(device_debug::watchpoint**)a;
const device_debug::watchpoint* right = *(device_debug::watchpoint**)b;
return left->index() - right->index();
return a->index() < b->index();
}
static int cIndexDescending(const void* a, const void* b)
static bool cIndexDescending(const device_debug::watchpoint *a, const device_debug::watchpoint *b)
{
return cIndexAscending(b, a);
}
static int cEnabledAscending(const void* a, const void* b)
static bool cEnabledAscending(const device_debug::watchpoint *a, const device_debug::watchpoint *b)
{
const device_debug::watchpoint* left = *(device_debug::watchpoint**)a;
const device_debug::watchpoint* right = *(device_debug::watchpoint**)b;
return (left->enabled() ? 1 : 0) - (right->enabled() ? 1 : 0);
return !a->enabled() && b->enabled();
}
static int cEnabledDescending(const void* a, const void* b)
static bool cEnabledDescending(const device_debug::watchpoint *a, const device_debug::watchpoint *b)
{
return cEnabledAscending(b, a);
}
static int cCpuAscending(const void* a, const void* b)
static bool cCpuAscending(const device_debug::watchpoint *a, const device_debug::watchpoint *b)
{
const device_debug::watchpoint* left = *(device_debug::watchpoint**)a;
const device_debug::watchpoint* right = *(device_debug::watchpoint**)b;
return strcmp(left->debugInterface()->device().tag(), right->debugInterface()->device().tag());
return strcmp(a->debugInterface()->device().tag(), b->debugInterface()->device().tag()) < 0;
}
static int cCpuDescending(const void* a, const void* b)
static bool cCpuDescending(const device_debug::watchpoint *a, const device_debug::watchpoint *b)
{
return cCpuAscending(b, a);
}
static int cSpaceAscending(const void* a, const void* b)
static bool cSpaceAscending(const device_debug::watchpoint *a, const device_debug::watchpoint *b)
{
const device_debug::watchpoint* left = *(device_debug::watchpoint**)a;
const device_debug::watchpoint* right = *(device_debug::watchpoint**)b;
return strcmp(left->space().name(), right->space().name());
return strcmp(a->space().name(), b->space().name()) < 0;
}
static int cSpaceDescending(const void* a, const void* b)
static bool cSpaceDescending(const device_debug::watchpoint *a, const device_debug::watchpoint *b)
{
return cSpaceAscending(b, a);
}
static int cAddressAscending(const void* a, const void* b)
static bool cAddressAscending(const device_debug::watchpoint *a, const device_debug::watchpoint *b)
{
const device_debug::watchpoint* left = *(device_debug::watchpoint**)a;
const device_debug::watchpoint* right = *(device_debug::watchpoint**)b;
return (left->address() > right->address()) ? 1 : (left->address() < right->address()) ? -1 : 0;
return a->address() < b->address();
}
static int cAddressDescending(const void* a, const void* b)
static bool cAddressDescending(const device_debug::watchpoint *a, const device_debug::watchpoint *b)
{
return cAddressAscending(b, a);
}
static int cTypeAscending(const void* a, const void* b)
static bool cTypeAscending(const device_debug::watchpoint *a, const device_debug::watchpoint *b)
{
const device_debug::watchpoint* left = *(device_debug::watchpoint**)a;
const device_debug::watchpoint* right = *(device_debug::watchpoint**)b;
return int(left->type()) - int(right->type());
return int(a->type()) < int(b->type());
}
static int cTypeDescending(const void* a, const void* b)
static bool cTypeDescending(const device_debug::watchpoint *a, const device_debug::watchpoint *b)
{
return cTypeAscending(b, a);
}
static int cConditionAscending(const void* a, const void* b)
static bool cConditionAscending(const device_debug::watchpoint *a, const device_debug::watchpoint *b)
{
const device_debug::watchpoint* left = *(device_debug::watchpoint**)a;
const device_debug::watchpoint* right = *(device_debug::watchpoint**)b;
return strcmp(left->condition(), right->condition());
return strcmp(a->condition(), b->condition()) < 0;
}
static int cConditionDescending(const void* a, const void* b)
static bool cConditionDescending(const device_debug::watchpoint *a, const device_debug::watchpoint *b)
{
return cConditionAscending(b, a);
}
static int cActionAscending(const void* a, const void* b)
static bool cActionAscending(const device_debug::watchpoint *a, const device_debug::watchpoint *b)
{
const device_debug::watchpoint* left = *(device_debug::watchpoint**)a;
const device_debug::watchpoint* right = *(device_debug::watchpoint**)b;
return left->action().compare(right->action());
return a->action() < b->action();
}
static int cActionDescending(const void* a, const void* b)
static bool cActionDescending(const device_debug::watchpoint *a, const device_debug::watchpoint *b)
{
return cActionAscending(b, a);
}
@ -236,7 +221,7 @@ void debug_view_watchpoints::gather_watchpoints()
// And now for the sort
if (!m_buffer.empty())
qsort(&m_buffer[0], m_buffer.size(), sizeof(device_debug::watchpoint *), m_sortType);
std::stable_sort(m_buffer.begin(), m_buffer.end(), m_sortType);
}

View File

@ -43,7 +43,7 @@ private:
// internal state
int (*m_sortType)(void const *, void const *);
bool (*m_sortType)(const device_debug::watchpoint *, const device_debug::watchpoint *);
std::vector<device_debug::watchpoint *> m_buffer;
};

View File

@ -313,8 +313,8 @@ void apple2_state::machine_start()
m_inh_bank = 0;
// precalculate joystick time constants
m_x_calibration = attotime::from_usec(12).as_double();
m_y_calibration = attotime::from_usec(13).as_double();
m_x_calibration = attotime::from_nsec(10800).as_double();
m_y_calibration = attotime::from_nsec(10800).as_double();
// cache slot devices
for (int i = 0; i <= 7; i++)
@ -322,6 +322,12 @@ void apple2_state::machine_start()
m_slotdevice[i] = m_a2bus->get_a2bus_card(i);
}
for (int adr = 0; adr < 0x10000; adr += 2)
{
m_ram_ptr[adr] = 0;
m_ram_ptr[adr+1] = 0xff;
}
// setup save states
save_item(NAME(m_speaker_state));
save_item(NAME(m_cassette_state));
@ -630,33 +636,33 @@ READ8_MEMBER(apple2_state::flags_r)
switch (offset)
{
case 0: // cassette in
return m_cassette->input() > 0.0 ? 0x80 : 0;
return (m_cassette->input() > 0.0 ? 0x80 : 0) | (read_floatingbus() & 0x7f);
case 1: // button 0
return (m_joybuttons->read() & 0x10) ? 0x80 : 0;
return ((m_joybuttons->read() & 0x10) ? 0x80 : 0) | (read_floatingbus() & 0x7f);
case 2: // button 1
return (m_joybuttons->read() & 0x20) ? 0x80 : 0;
return ((m_joybuttons->read() & 0x20) ? 0x80 : 0) | (read_floatingbus() & 0x7f);
case 3: // button 2
// check if SHIFT key mod configured
if (m_sysconfig->read() & 0x04)
{
return ((m_joybuttons->read() & 0x40) || (m_kbspecial->read() & 0x06)) ? 0x80 : 0;
return (((m_joybuttons->read() & 0x40) || (m_kbspecial->read() & 0x06)) ? 0x80 : 0) | (read_floatingbus() & 0x3f);
}
return (m_joybuttons->read() & 0x40) ? 0x80 : 0;
return ((m_joybuttons->read() & 0x40) ? 0x80 : 0) | (read_floatingbus() & 0x7f);
case 4: // joy 1 X axis
return (machine().time().as_double() < m_joystick_x1_time) ? 0x80 : 0;
return ((machine().time().as_double() < m_joystick_x1_time) ? 0x80 : 0) | (read_floatingbus() & 0x7f);
case 5: // joy 1 Y axis
return (machine().time().as_double() < m_joystick_y1_time) ? 0x80 : 0;
return ((machine().time().as_double() < m_joystick_y1_time) ? 0x80 : 0) | (read_floatingbus() & 0x7f);
case 6: // joy 2 X axis
return (machine().time().as_double() < m_joystick_x2_time) ? 0x80 : 0;
return ((machine().time().as_double() < m_joystick_x2_time) ? 0x80 : 0) | (read_floatingbus() & 0x7f);
case 7: // joy 2 Y axis
return (machine().time().as_double() < m_joystick_y2_time) ? 0x80 : 0;
return ((machine().time().as_double() < m_joystick_y2_time) ? 0x80 : 0) | (read_floatingbus() & 0x7f);
}
// this is never reached

View File

@ -780,8 +780,8 @@ void apple2e_state::machine_start()
}
// precalculate joystick time constants
m_x_calibration = attotime::from_usec(12).as_double();
m_y_calibration = attotime::from_usec(13).as_double();
m_x_calibration = attotime::from_nsec(10800).as_double();
m_y_calibration = attotime::from_nsec(10800).as_double();
// cache slot devices
for (int i = 0; i <= 7; i++)
@ -818,6 +818,14 @@ void apple2e_state::machine_start()
m_video->m_char_ptr = memregion("gfx1")->base();
m_video->m_char_size = memregion("gfx1")->bytes();
for (int adr = 0; adr < 0x10000; adr += 2)
{
m_ram_ptr[adr] = 0;
m_ram_ptr[adr+1] = 0xff;
m_aux_ptr[adr] = 0;
m_aux_ptr[adr+1] = 0xff;
}
m_inh_slot = -1;
m_cnxx_slot = CNXX_UNCLAIMED;
m_mockingboard4c = false;
@ -1592,6 +1600,7 @@ void apple2e_state::do_io(address_space &space, int offset, bool is_iic)
READ8_MEMBER(apple2e_state::c000_r)
{
if(machine().side_effects_disabled()) return read_floatingbus();
u8 uFloatingBus7 = read_floatingbus() & 0x7f;
if ((offset & 0xf0) == 0x00) // keyboard latch, $C000 is really 00-0F
{
@ -1656,43 +1665,43 @@ READ8_MEMBER(apple2e_state::c000_r)
case 0x68:
if (m_cassette)
{
return m_cassette->input() > 0.0 ? 0x80 : 0;
return (m_cassette->input() > 0.0 ? 0x80 : 0) | uFloatingBus7;
}
return 0;
return uFloatingBus7;
case 0x61: // button 0 or Open Apple
case 0x69:
return ((m_joybuttons->read() & 0x10) || (m_kbspecial->read() & 0x10)) ? 0x80 : 0;
return (((m_joybuttons->read() & 0x10) || (m_kbspecial->read() & 0x10)) ? 0x80 : 0) | uFloatingBus7;
case 0x62: // button 1 or Solid Apple
case 0x6a:
return ((m_joybuttons->read() & 0x20) || (m_kbspecial->read() & 0x20)) ? 0x80 : 0;
return (((m_joybuttons->read() & 0x20) || (m_kbspecial->read() & 0x20)) ? 0x80 : 0) | uFloatingBus7;
case 0x63: // button 2 or SHIFT key
case 0x6b:
return ((m_joybuttons->read() & 0x40) || (m_kbspecial->read() & 0x06)) ? 0x80 : 0;
return (((m_joybuttons->read() & 0x40) || (m_kbspecial->read() & 0x06)) ? 0x80 : 0) | uFloatingBus7;
case 0x64: // joy 1 X axis
case 0x6c:
return (machine().time().as_double() < m_joystick_x1_time) ? 0x80 : 0;
return ((machine().time().as_double() < m_joystick_x1_time) ? 0x80 : 0) | uFloatingBus7;
case 0x65: // joy 1 Y axis
case 0x6d:
return (machine().time().as_double() < m_joystick_y1_time) ? 0x80 : 0;
return ((machine().time().as_double() < m_joystick_y1_time) ? 0x80 : 0) | uFloatingBus7;
case 0x66: // joy 2 X axis
case 0x6e:
return (machine().time().as_double() < m_joystick_x2_time) ? 0x80 : 0;
return ((machine().time().as_double() < m_joystick_x2_time) ? 0x80 : 0) | uFloatingBus7;
case 0x67: // joy 2 Y axis
case 0x6f:
return (machine().time().as_double() < m_joystick_y2_time) ? 0x80 : 0;
return ((machine().time().as_double() < m_joystick_y2_time) ? 0x80 : 0) | uFloatingBus7;
case 0x7e: // read IOUDIS
return m_ioudis ? 0x80 : 0x00;
return (m_ioudis ? 0x80 : 0x00) | uFloatingBus7;
case 0x7f: // read DHIRES
return m_video->m_dhires ? 0x00 : 0x80;
return (m_video->m_dhires ? 0x00 : 0x80) | uFloatingBus7;
default:
do_io(space, offset, false);
@ -1833,6 +1842,7 @@ WRITE8_MEMBER(apple2e_state::c000_w)
READ8_MEMBER(apple2e_state::c000_iic_r)
{
if(machine().side_effects_disabled()) return read_floatingbus();
u8 uFloatingBus7 = read_floatingbus() & 0x7f;
if ((offset & 0xf0) == 0x00) // keyboard latch, $C000 is really 00-0F
{
@ -1908,43 +1918,43 @@ READ8_MEMBER(apple2e_state::c000_iic_r)
return m_y0edge ? 0x80 : 0x00;
case 0x60: // 40/80 column switch (IIc only)
return (m_sysconfig->read() & 0x04) ? 0x80 : 0;
return ((m_sysconfig->read() & 0x04) ? 0x80 : 0) | uFloatingBus7;
case 0x61: // button 0 or Open Apple or mouse button 1
case 0x69:
return ((m_joybuttons->read() & 0x10) || (m_kbspecial->read() & 0x10)) ? 0x80 : 0;
return (((m_joybuttons->read() & 0x10) || (m_kbspecial->read() & 0x10)) ? 0x80 : 0) | uFloatingBus7;
case 0x62: // button 1 or Solid Apple
case 0x6a:
return ((m_joybuttons->read() & 0x20) || (m_kbspecial->read() & 0x20)) ? 0x80 : 0;
return (((m_joybuttons->read() & 0x20) || (m_kbspecial->read() & 0x20)) ? 0x80 : 0) | uFloatingBus7;
case 0x63: // mouse button 2 (no other function on IIc)
case 0x6b:
return m_mouseb->read() ? 0 : 0x80;
return (m_mouseb->read() ? 0 : 0x80) | uFloatingBus7;
case 0x64: // joy 1 X axis
case 0x6c:
return (machine().time().as_double() < m_joystick_x1_time) ? 0x80 : 0;
return ((machine().time().as_double() < m_joystick_x1_time) ? 0x80 : 0) | uFloatingBus7;
case 0x65: // joy 1 Y axis
case 0x6d:
return (machine().time().as_double() < m_joystick_y1_time) ? 0x80 : 0;
return ((machine().time().as_double() < m_joystick_y1_time) ? 0x80 : 0) | uFloatingBus7;
case 0x66: // mouse X1 (IIc only)
case 0x6e:
return m_x1 ? 0x80 : 0;
return (m_x1 ? 0x80 : 0) | uFloatingBus7;
case 0x67: // mouse Y1 (IIc only)
case 0x6f:
return m_y1 ? 0x80 : 0;
return (m_y1 ? 0x80 : 0) | uFloatingBus7;
case 0x7e: // read IOUDIS
m_vbl = false;
lower_irq(IRQ_VBL);
return m_ioudis ? 0x80 : 0x00;
return (m_ioudis ? 0x80 : 0x00) | uFloatingBus7;
case 0x7f: // read DHIRES
return m_video->m_dhires ? 0x00 : 0x80;
return (m_video->m_dhires ? 0x00 : 0x80) | uFloatingBus7;
default:
do_io(space, offset, true);

View File

@ -1212,8 +1212,8 @@ void apple2gs_state::machine_start()
m_speaker->set_levels(16, lvlTable);
// precalculate joystick time constants
m_x_calibration = attotime::from_usec(12).as_double();
m_y_calibration = attotime::from_usec(13).as_double();
m_x_calibration = attotime::from_nsec(10800).as_double();
m_y_calibration = attotime::from_nsec(10800).as_double();
// cache slot devices
for (int i = 0; i <= 7; i++)
@ -2029,6 +2029,7 @@ READ8_MEMBER(apple2gs_state::c000_r)
}
slow_cycle();
u8 uFloatingBus7 = read_floatingbus();
switch (offset)
{
@ -2272,28 +2273,28 @@ READ8_MEMBER(apple2gs_state::c000_r)
return (m_an3 ? INTFLAG_AN3 : 0x00) | m_intflag;
case 0x60: // button 3 on IIgs
return (m_joybuttons->read() & 0x80);
return (m_joybuttons->read() & 0x80) | uFloatingBus7;
case 0x61: // button 0 or Open Apple
return ((m_joybuttons->read() & 0x10) || (m_kbspecial->read() & 0x10)) ? 0x80 : 0;
return (((m_joybuttons->read() & 0x10) || (m_kbspecial->read() & 0x10)) ? 0x80 : 0) | uFloatingBus7;
case 0x62: // button 1 or Solid Apple
return ((m_joybuttons->read() & 0x20) || (m_kbspecial->read() & 0x20)) ? 0x80 : 0;
return (((m_joybuttons->read() & 0x20) || (m_kbspecial->read() & 0x20)) ? 0x80 : 0) | uFloatingBus7;
case 0x63: // button 2 or SHIFT key
return ((m_joybuttons->read() & 0x40) || (m_kbspecial->read() & 0x06)) ? 0x80 : 0;
return (((m_joybuttons->read() & 0x40) || (m_kbspecial->read() & 0x06)) ? 0x80 : 0) | uFloatingBus7;
case 0x64: // joy 1 X axis
return (machine().time().as_double() < m_joystick_x1_time) ? 0x80 : 0;
return ((machine().time().as_double() < m_joystick_x1_time) ? 0x80 : 0) | uFloatingBus7;
case 0x65: // joy 1 Y axis
return (machine().time().as_double() < m_joystick_y1_time) ? 0x80 : 0;
return ((machine().time().as_double() < m_joystick_y1_time) ? 0x80 : 0) | uFloatingBus7;
case 0x66: // joy 2 X axis
return (machine().time().as_double() < m_joystick_x2_time) ? 0x80 : 0;
return ((machine().time().as_double() < m_joystick_x2_time) ? 0x80 : 0) | uFloatingBus7;
case 0x67: // joy 2 Y axis
return (machine().time().as_double() < m_joystick_y2_time) ? 0x80 : 0;
return ((machine().time().as_double() < m_joystick_y2_time) ? 0x80 : 0) | uFloatingBus7;
case 0x68: // STATEREG, synthesizes all the IIe state regs
return (m_altzp ? 0x80 : 0x00) |

View File

@ -0,0 +1,226 @@
// license:BSD-3-Clause
// copyright-holders:hap
// thanks-to:Berger
/******************************************************************************
Master: (yes, it's plainly named "Master")
- Z80 CPU(NEC D780C-1) @ 4MHz(8MHz XTAL), IRQ from 555 timer
- 8KB ROM(NEC D2764C-3), 2KB RAM(NEC D4016C), ROM is scrambled for easy PCB placement
- simple I/O via 2*74373 and a 74145
- 8*8 chessboard buttons, 32+1 border leds, piezo
TODO:
- 1 WAIT CLK per M1, workaround with z80_set_cycle_tables is possible
(wait state is similar to MSX) but I can't be bothered, better solution
is to add M1 pin to the z80 core. Until then, it'll run ~20% too fast.
******************************************************************************/
#include "emu.h"
#include "includes/ckingbase.h"
#include "cpu/z80/z80.h"
#include "machine/bankdev.h"
#include "sound/dac.h"
#include "sound/volt_reg.h"
#include "speaker.h"
// internal artwork
#include "ck_master.lh" // clickable
namespace {
class master_state : public ckingbase_state
{
public:
master_state(const machine_config &mconfig, device_type type, const char *tag) :
ckingbase_state(mconfig, type, tag),
m_dac(*this, "dac"),
m_mainmap(*this, "mainmap")
{ }
void master(machine_config &config);
void init_master();
private:
// devices/pointers
required_device<dac_2bit_binary_weighted_ones_complement_device> m_dac;
required_device<address_map_bank_device> m_mainmap;
void main_map(address_map &map);
void main_trampoline(address_map &map);
u8 main_trampoline_r(offs_t offset);
void main_trampoline_w(offs_t offset, u8 data);
// I/O handlers
u8 input_r();
void control_w(u8 data);
};
/******************************************************************************
Devices, I/O
******************************************************************************/
// TTL/generic
void master_state::control_w(u8 data)
{
// d0-d3: 74145 A-D
// 74145 0-9: input mux, led select
u16 sel = 1 << (data & 0xf) & 0x3ff;
m_inp_mux = sel;
// d4,d5: led data
display_matrix(2, 9, data >> 4 & 3, sel & 0x1ff);
// d6,d7: speaker +/-
m_dac->write(data >> 6 & 3);
}
u8 master_state::input_r()
{
// d0-d7: multiplexed inputs (active low)
return ~read_inputs(10);
}
void master_state::init_master()
{
u8 *rom = memregion("maincpu")->base();
const u32 len = memregion("maincpu")->bytes();
// descramble data lines
for (int i = 0; i < len; i++)
rom[i] = bitswap<8>(rom[i], 4,5,0,7,6,1,3,2);
// descramble address lines
std::vector<u8> buf(len);
memcpy(&buf[0], rom, len);
for (int i = 0; i < len; i++)
rom[i] = buf[bitswap<16>(i, 15,14,13,12,11,3,7,9, 10,8,6,5,4,2,1,0)];
}
/******************************************************************************
Address Maps
******************************************************************************/
void master_state::main_map(address_map &map)
{
map(0x0000, 0x1fff).mirror(0x6000).rom().region("maincpu", 0); // _A15
map(0xa000, 0xa000).mirror(0x1fff).rw(FUNC(master_state::input_r), FUNC(master_state::control_w)); // A13
map(0xc000, 0xc7ff).mirror(0x3800).ram(); // A14
}
// PCB design is prone to bus conflicts, but should be fine if software obeys
void master_state::main_trampoline_w(offs_t offset, u8 data)
{
if (offset & 0x2000)
m_mainmap->write8((offset & 0x3fff) | 0x8000, data);
if (offset & 0x4000)
m_mainmap->write8((offset & 0x7fff) | 0x8000, data);
}
u8 master_state::main_trampoline_r(offs_t offset)
{
u8 data = 0xff;
if (~offset & 0x8000)
data &= m_mainmap->read8(offset);
if (offset & 0x2000)
data &= m_mainmap->read8((offset & 0x3fff) | 0x8000);
if (offset & 0x4000)
data &= m_mainmap->read8((offset & 0x7fff) | 0x8000);
return data;
}
void master_state::main_trampoline(address_map &map)
{
map(0x0000, 0xffff).rw(FUNC(master_state::main_trampoline_r), FUNC(master_state::main_trampoline_w));
}
/******************************************************************************
Input Ports
******************************************************************************/
static INPUT_PORTS_START( master )
PORT_INCLUDE( cking_cb_buttons )
PORT_START("IN.8")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_NAME("Change Position")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_NAME("Clear Board")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_NAME("New Game")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_NAME("Take Back")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_NAME("King")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_NAME("Queen")
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_NAME("Rook")
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_START("IN.9")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_NAME("Bishop")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9) PORT_NAME("Knight")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_0) PORT_NAME("Pawn")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("White")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("Black")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("Move")
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("Level")
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("Sound")
INPUT_PORTS_END
/******************************************************************************
Machine Drivers
******************************************************************************/
void master_state::master(machine_config &config)
{
/* basic machine hardware */
Z80(config, m_maincpu, 8_MHz_XTAL/2);
m_maincpu->set_addrmap(AS_PROGRAM, &master_state::main_trampoline);
ADDRESS_MAP_BANK(config, "mainmap").set_map(&master_state::main_map).set_options(ENDIANNESS_LITTLE, 8, 16);
const attotime irq_period = attotime::from_hz(429); // theoretical frequency from 555 timer (22nF, 150K, 1K5), measurement was 418Hz
TIMER(config, m_irq_on).configure_periodic(FUNC(master_state::irq_on<INPUT_LINE_IRQ0>), irq_period);
m_irq_on->set_start_delay(irq_period - attotime::from_nsec(22870)); // active for 22.87us
TIMER(config, "irq_off").configure_periodic(FUNC(master_state::irq_off<INPUT_LINE_IRQ0>), irq_period);
TIMER(config, "display_decay").configure_periodic(FUNC(ckingbase_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_ck_master);
/* sound hardware */
SPEAKER(config, "speaker").front_center();
DAC_2BIT_BINARY_WEIGHTED_ONES_COMPLEMENT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25);
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
}
/******************************************************************************
ROM Definitions
******************************************************************************/
ROM_START( ckmaster )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD("ckmaster.ic2", 0x0000, 0x2000, CRC(59cbec9e) SHA1(2e0629e65778da62bed857406b91a334698d2fe8) ) // D2764C, no label
ROM_END
} // anonymous namespace
/******************************************************************************
Drivers
******************************************************************************/
/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
CONS( 1984, ckmaster, 0, 0, master, master, master_state, init_master, "Chess King", "Master (Chess King)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )

View File

@ -0,0 +1,222 @@
// license:BSD-3-Clause
// copyright-holders:hap
/******************************************************************************
Chess King chess computer driver base class
NOTE: MAME doesn't include a generalized implementation for boardpieces yet,
greatly affecting user playability of emulated electronic board games.
As workaround for the chess games, use an external chess GUI on the side,
such as Arena(in editmode).
******************************************************************************/
#include "emu.h"
#include "includes/ckingbase.h"
// machine start/reset
void ckingbase_state::machine_start()
{
// resolve handlers
m_out_x.resolve();
m_out_a.resolve();
m_out_digit.resolve();
// zerofill
memset(m_display_state, 0, sizeof(m_display_state));
memset(m_display_decay, 0, sizeof(m_display_decay));
memset(m_display_segmask, 0, sizeof(m_display_segmask));
m_inp_mux = 0;
m_led_select = 0;
m_led_data = 0;
// register for savestates
save_item(NAME(m_display_maxy));
save_item(NAME(m_display_maxx));
save_item(NAME(m_display_wait));
save_item(NAME(m_display_state));
save_item(NAME(m_display_decay));
save_item(NAME(m_display_segmask));
save_item(NAME(m_inp_mux));
save_item(NAME(m_led_select));
save_item(NAME(m_led_data));
}
void ckingbase_state::machine_reset()
{
}
/***************************************************************************
Helper Functions
***************************************************************************/
// The device may strobe the outputs very fast, it is unnoticeable to the user.
// To prevent flickering here, we need to simulate a decay.
void ckingbase_state::display_update()
{
for (int y = 0; y < m_display_maxy; y++)
{
u32 active_state = 0;
for (int x = 0; x <= m_display_maxx; x++)
{
// turn on powered segments
if (m_display_state[y] >> x & 1)
m_display_decay[y][x] = m_display_wait;
// determine active state
u32 ds = (m_display_decay[y][x] != 0) ? 1 : 0;
active_state |= (ds << x);
// output to y.x, or y.a when always-on
if (x != m_display_maxx)
m_out_x[y][x] = ds;
else
m_out_a[y] = ds;
}
// output to digity
if (m_display_segmask[y] != 0)
m_out_digit[y] = active_state & m_display_segmask[y];
}
}
TIMER_DEVICE_CALLBACK_MEMBER(ckingbase_state::display_decay_tick)
{
// slowly turn off unpowered segments
for (int y = 0; y < m_display_maxy; y++)
for (int x = 0; x <= m_display_maxx; x++)
if (m_display_decay[y][x] != 0)
m_display_decay[y][x]--;
display_update();
}
void ckingbase_state::set_display_size(int maxx, int maxy)
{
m_display_maxx = maxx;
m_display_maxy = maxy;
}
void ckingbase_state::display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update)
{
set_display_size(maxx, maxy);
// update current state
u32 mask = (1 << maxx) - 1;
for (int y = 0; y < maxy; y++)
m_display_state[y] = (sety >> y & 1) ? ((setx & mask) | (1 << maxx)) : 0;
if (update)
display_update();
}
// generic input handlers
u16 ckingbase_state::read_inputs(int columns)
{
u16 ret = 0;
// read selected input rows
for (int i = 0; i < columns; i++)
if (m_inp_mux >> i & 1)
ret |= m_inp_matrix[i]->read();
return ret;
}
// chessboard generic inputs
INPUT_PORTS_START( cking_cb_buttons )
PORT_START("IN.0")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_START("IN.1")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_START("IN.2")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_START("IN.3")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_START("IN.4")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_START("IN.5")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_START("IN.6")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_START("IN.7")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
INPUT_PORTS_END

View File

@ -1,478 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:hap
// thanks-to:Berger
/******************************************************************************
Chess King generic Z80 based chess computer driver
NOTE: MAME doesn't include a generalized implementation for boardpieces yet,
greatly affecting user playability of emulated electronic board games.
As workaround for the chess games, use an external chess GUI on the side,
such as Arena(in editmode).
TODO:
- ckmaster 1 WAIT CLK per M1, workaround with z80_set_cycle_tables is possible
(wait state is similar to MSX) but I can't be bothered, better solution
is to add M1 pin to the z80 core. Until then, it'll run ~20% too fast.
******************************************************************************
Master:
- Z80 CPU(NEC D780C-1) @ 4MHz(8MHz XTAL), IRQ from 555 timer
- 8KB ROM(NEC D2764C-3), 2KB RAM(NEC D4016C), ROM is scrambled for easy PCB placement
- simple I/O via 2*74373 and a 74145
- 8*8 chessboard buttons, 32+1 border leds, piezo
******************************************************************************/
#include "emu.h"
#include "cpu/z80/z80.h"
#include "machine/timer.h"
#include "machine/bankdev.h"
#include "sound/dac.h"
#include "sound/volt_reg.h"
#include "speaker.h"
// internal artwork
#include "ck_master.lh" // clickable
class ckz80_state : public driver_device
{
public:
ckz80_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_irq_on(*this, "irq_on"),
m_dac(*this, "dac"),
m_master_map(*this, "master_map"),
m_inp_matrix(*this, "IN.%u", 0),
m_out_x(*this, "%u.%u", 0U, 0U),
m_out_a(*this, "%u.a", 0U),
m_out_digit(*this, "digit%u", 0U),
m_display_wait(33),
m_display_maxy(1),
m_display_maxx(0)
{ }
// devices/pointers
required_device<cpu_device> m_maincpu;
required_device<timer_device> m_irq_on;
required_device<dac_2bit_binary_weighted_ones_complement_device> m_dac;
optional_device<address_map_bank_device> m_master_map;
optional_ioport_array<10> m_inp_matrix; // max 10
output_finder<0x20, 0x20> m_out_x;
output_finder<0x20> m_out_a;
output_finder<0x20> m_out_digit;
template<int L> TIMER_DEVICE_CALLBACK_MEMBER(irq_on) { m_maincpu->set_input_line(L, ASSERT_LINE); }
template<int L> TIMER_DEVICE_CALLBACK_MEMBER(irq_off) { m_maincpu->set_input_line(L, CLEAR_LINE); }
// misc common
u16 m_inp_mux; // multiplexed keypad mask
u16 m_led_select;
u16 m_led_data;
u16 read_inputs(int columns);
// display common
int m_display_wait; // led/lamp off-delay in milliseconds (default 33ms)
int m_display_maxy; // display matrix number of rows
int m_display_maxx; // display matrix number of columns (max 31 for now)
u32 m_display_state[0x20]; // display matrix rows data (last bit is used for always-on)
u16 m_display_segmask[0x20]; // if not 0, display matrix row is a digit, mask indicates connected segments
u8 m_display_decay[0x20][0x20]; // (internal use)
TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick);
void display_update();
void set_display_size(int maxx, int maxy);
void display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update = true);
// Master
u8 master_input_r();
void master_control_w(u8 data);
void init_master();
u8 master_trampoline_r(offs_t offset);
void master_trampoline_w(offs_t offset, u8 data);
void master_map(address_map &map);
void master_trampoline(address_map &map);
void master(machine_config &config);
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
};
// machine start/reset
void ckz80_state::machine_start()
{
// resolve handlers
m_out_x.resolve();
m_out_a.resolve();
m_out_digit.resolve();
// zerofill
memset(m_display_state, 0, sizeof(m_display_state));
memset(m_display_decay, 0, sizeof(m_display_decay));
memset(m_display_segmask, 0, sizeof(m_display_segmask));
m_inp_mux = 0;
m_led_select = 0;
m_led_data = 0;
// register for savestates
save_item(NAME(m_display_maxy));
save_item(NAME(m_display_maxx));
save_item(NAME(m_display_wait));
save_item(NAME(m_display_state));
save_item(NAME(m_display_decay));
save_item(NAME(m_display_segmask));
save_item(NAME(m_inp_mux));
save_item(NAME(m_led_select));
save_item(NAME(m_led_data));
}
void ckz80_state::machine_reset()
{
}
/***************************************************************************
Helper Functions
***************************************************************************/
// The device may strobe the outputs very fast, it is unnoticeable to the user.
// To prevent flickering here, we need to simulate a decay.
void ckz80_state::display_update()
{
for (int y = 0; y < m_display_maxy; y++)
{
u32 active_state = 0;
for (int x = 0; x <= m_display_maxx; x++)
{
// turn on powered segments
if (m_display_state[y] >> x & 1)
m_display_decay[y][x] = m_display_wait;
// determine active state
u32 ds = (m_display_decay[y][x] != 0) ? 1 : 0;
active_state |= (ds << x);
// output to y.x, or y.a when always-on
if (x != m_display_maxx)
m_out_x[y][x] = ds;
else
m_out_a[y] = ds;
}
// output to digity
if (m_display_segmask[y] != 0)
m_out_digit[y] = active_state & m_display_segmask[y];
}
}
TIMER_DEVICE_CALLBACK_MEMBER(ckz80_state::display_decay_tick)
{
// slowly turn off unpowered segments
for (int y = 0; y < m_display_maxy; y++)
for (int x = 0; x <= m_display_maxx; x++)
if (m_display_decay[y][x] != 0)
m_display_decay[y][x]--;
display_update();
}
void ckz80_state::set_display_size(int maxx, int maxy)
{
m_display_maxx = maxx;
m_display_maxy = maxy;
}
void ckz80_state::display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update)
{
set_display_size(maxx, maxy);
// update current state
u32 mask = (1 << maxx) - 1;
for (int y = 0; y < maxy; y++)
m_display_state[y] = (sety >> y & 1) ? ((setx & mask) | (1 << maxx)) : 0;
if (update)
display_update();
}
// generic input handlers
u16 ckz80_state::read_inputs(int columns)
{
u16 ret = 0;
// read selected input rows
for (int i = 0; i < columns; i++)
if (m_inp_mux >> i & 1)
ret |= m_inp_matrix[i]->read();
return ret;
}
// Devices, I/O
/******************************************************************************
Master
******************************************************************************/
// TTL/generic
void ckz80_state::master_control_w(u8 data)
{
// d0-d3: 74145 A-D
// 74145 0-9: input mux, led select
u16 sel = 1 << (data & 0xf) & 0x3ff;
m_inp_mux = sel;
// d4,d5: led data
display_matrix(2, 9, data >> 4 & 3, sel & 0x1ff);
// d6,d7: speaker +/-
m_dac->write(data >> 6 & 3);
}
u8 ckz80_state::master_input_r()
{
// d0-d7: multiplexed inputs (active low)
return ~read_inputs(10);
}
void ckz80_state::init_master()
{
u8 *rom = memregion("maincpu")->base();
const u32 len = memregion("maincpu")->bytes();
// descramble data lines
for (int i = 0; i < len; i++)
rom[i] = bitswap<8>(rom[i], 4,5,0,7,6,1,3,2);
// descramble address lines
std::vector<u8> buf(len);
memcpy(&buf[0], rom, len);
for (int i = 0; i < len; i++)
rom[i] = buf[bitswap<16>(i, 15,14,13,12,11,3,7,9, 10,8,6,5,4,2,1,0)];
}
/******************************************************************************
Address Maps
******************************************************************************/
// Master
void ckz80_state::master_map(address_map &map)
{
map(0x0000, 0x1fff).mirror(0x6000).rom().region("maincpu", 0); // _A15
map(0xa000, 0xa000).mirror(0x1fff).rw(FUNC(ckz80_state::master_input_r), FUNC(ckz80_state::master_control_w)); // A13
map(0xc000, 0xc7ff).mirror(0x3800).ram(); // A14
}
// PCB design is prone to bus conflicts, but should be fine if software obeys
void ckz80_state::master_trampoline_w(offs_t offset, u8 data)
{
if (offset & 0x2000)
m_master_map->write8((offset & 0x3fff) | 0x8000, data);
if (offset & 0x4000)
m_master_map->write8((offset & 0x7fff) | 0x8000, data);
}
u8 ckz80_state::master_trampoline_r(offs_t offset)
{
u8 data = 0xff;
if (~offset & 0x8000)
data &= m_master_map->read8(offset);
if (offset & 0x2000)
data &= m_master_map->read8((offset & 0x3fff) | 0x8000);
if (offset & 0x4000)
data &= m_master_map->read8((offset & 0x7fff) | 0x8000);
return data;
}
void ckz80_state::master_trampoline(address_map &map)
{
map(0x0000, 0xffff).rw(FUNC(ckz80_state::master_trampoline_r), FUNC(ckz80_state::master_trampoline_w));
}
/******************************************************************************
Input Ports
******************************************************************************/
static INPUT_PORTS_START( cb_buttons )
PORT_START("IN.0")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_START("IN.1")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_START("IN.2")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_START("IN.3")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_START("IN.4")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_START("IN.5")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_START("IN.6")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_START("IN.7")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
INPUT_PORTS_END
static INPUT_PORTS_START( master )
PORT_INCLUDE( cb_buttons )
PORT_START("IN.8")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_NAME("Change Position")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_NAME("Clear Board")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_NAME("New Game")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_NAME("Take Back")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_NAME("King")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_NAME("Queen")
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_NAME("Rook")
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_START("IN.9")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_NAME("Bishop")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9) PORT_NAME("Knight")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_0) PORT_NAME("Pawn")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("White")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("Black")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("Move")
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("Level")
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("Sound")
INPUT_PORTS_END
/******************************************************************************
Machine Drivers
******************************************************************************/
void ckz80_state::master(machine_config &config)
{
/* basic machine hardware */
Z80(config, m_maincpu, 8_MHz_XTAL/2);
m_maincpu->set_addrmap(AS_PROGRAM, &ckz80_state::master_trampoline);
ADDRESS_MAP_BANK(config, "master_map").set_map(&ckz80_state::master_map).set_options(ENDIANNESS_LITTLE, 8, 16);
const attotime irq_period = attotime::from_hz(429); // theoretical frequency from 555 timer (22nF, 150K, 1K5), measurement was 418Hz
TIMER(config, m_irq_on).configure_periodic(FUNC(ckz80_state::irq_on<INPUT_LINE_IRQ0>), irq_period);
m_irq_on->set_start_delay(irq_period - attotime::from_nsec(22870)); // active for 22.87us
TIMER(config, "irq_off").configure_periodic(FUNC(ckz80_state::irq_off<INPUT_LINE_IRQ0>), irq_period);
TIMER(config, "display_decay").configure_periodic(FUNC(ckz80_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_ck_master);
/* sound hardware */
SPEAKER(config, "speaker").front_center();
DAC_2BIT_BINARY_WEIGHTED_ONES_COMPLEMENT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25);
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
}
/******************************************************************************
ROM Definitions
******************************************************************************/
ROM_START( ckmaster )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD("ckmaster.ic2", 0x0000, 0x2000, CRC(59cbec9e) SHA1(2e0629e65778da62bed857406b91a334698d2fe8) ) // D2764C, no label
ROM_END
/******************************************************************************
Drivers
******************************************************************************/
/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
CONS( 1984, ckmaster, 0, 0, master, master, ckz80_state, init_master, "Chess King", "Master (Chess King)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )

View File

@ -0,0 +1,178 @@
// license:BSD-3-Clause
// copyright-holders:hap
// thanks-to:Berger
/******************************************************************************
Chess 2001:
- Zilog Z8400APS @ 4 MHz (8MHz XTAL)
- 2KB RAM HM6116, 16KB ROM D27128D
- TTL, piezo, 8*8+9 LEDs, magnetic sensors
******************************************************************************/
#include "emu.h"
#include "includes/cxgbase.h"
#include "cpu/z80/z80.h"
#include "sound/volt_reg.h"
#include "speaker.h"
// internal artwork
#include "cxg_ch2001.lh" // clickable
namespace {
class ch2001_state : public cxgbase_state
{
public:
ch2001_state(const machine_config &mconfig, device_type type, const char *tag) :
cxgbase_state(mconfig, type, tag),
m_speaker_off(*this, "speaker_off")
{ }
void ch2001(machine_config &config);
private:
// devices/pointers
required_device<timer_device> m_speaker_off;
void main_map(address_map &map);
TIMER_DEVICE_CALLBACK_MEMBER(speaker_off) { m_dac->write(0); }
// I/O handlers
DECLARE_WRITE8_MEMBER(speaker_w);
DECLARE_WRITE8_MEMBER(leds_w);
DECLARE_READ8_MEMBER(input_r);
};
/******************************************************************************
Devices, I/O
******************************************************************************/
// TTL
WRITE8_MEMBER(ch2001_state::speaker_w)
{
// 74ls109 clock pulse to speaker
m_dac->write(1);
m_speaker_off->adjust(attotime::from_usec(200)); // not accurate
}
WRITE8_MEMBER(ch2001_state::leds_w)
{
// d0-d7: 74ls273 (WR to CLK)
// 74ls273 Q1-Q4: 74ls145 A-D
// 74ls145 0-9: input mux/led select
m_inp_mux = 1 << (data & 0xf) & 0x3ff;
// 74ls273 Q5-Q8: MC14028 A-D
// MC14028 Q0-Q7: led data, Q8,Q9: N/C
u8 led_data = 1 << (data >> 4 & 0xf) & 0xff;
display_matrix(8, 10, led_data, m_inp_mux);
}
READ8_MEMBER(ch2001_state::input_r)
{
// d0-d7: multiplexed inputs
return ~read_inputs(10);
}
/******************************************************************************
Address Maps
******************************************************************************/
void ch2001_state::main_map(address_map &map)
{
map(0x0000, 0x3fff).rom();
map(0x4000, 0x47ff).mirror(0x3800).ram();
map(0x8000, 0x8000).mirror(0x3fff).rw(FUNC(ch2001_state::input_r), FUNC(ch2001_state::leds_w));
map(0xc000, 0xc000).mirror(0x3fff).w(FUNC(ch2001_state::speaker_w));
}
/******************************************************************************
Input Ports
******************************************************************************/
static INPUT_PORTS_START( ch2001 )
PORT_INCLUDE( cxg_cb_magnets )
PORT_START("IN.8")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("Black")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_NAME("King")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_NAME("Queen")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_NAME("Rook")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("Bishop")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("Knight")
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("Pawn")
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_NAME("White")
PORT_START("IN.9")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_NAME("Set up")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("New Game")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_U) PORT_NAME("Take Back")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Y) PORT_NAME("Forward")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_NAME("Hint")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_I) PORT_NAME("Move")
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_NAME("Level")
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_NAME("Sound")
INPUT_PORTS_END
/******************************************************************************
Machine Drivers
******************************************************************************/
void ch2001_state::ch2001(machine_config &config)
{
/* basic machine hardware */
Z80(config, m_maincpu, 8_MHz_XTAL/2);
m_maincpu->set_addrmap(AS_PROGRAM, &ch2001_state::main_map);
const attotime irq_period = attotime::from_hz(484); // theoretical frequency from 555 timer (22nF, 100K+33K, 1K2), measurement was 568Hz
TIMER(config, m_irq_on).configure_periodic(FUNC(ch2001_state::irq_on<INPUT_LINE_IRQ0>), irq_period);
m_irq_on->set_start_delay(irq_period - attotime::from_nsec(18300)); // active for 18.3us
TIMER(config, "irq_off").configure_periodic(FUNC(ch2001_state::irq_off<INPUT_LINE_IRQ0>), irq_period);
TIMER(config, m_speaker_off).configure_generic(FUNC(ch2001_state::speaker_off));
TIMER(config, "display_decay").configure_periodic(FUNC(cxgbase_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_cxg_ch2001);
/* sound hardware */
SPEAKER(config, "speaker").front_center();
DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25);
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
}
/******************************************************************************
ROM Definitions
******************************************************************************/
ROM_START( ch2001 )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD("ch2001.bin", 0x0000, 0x4000, CRC(b3485c73) SHA1(f405c6f67fe70edf45dcc383a4049ee6bad387a9) ) // D27128D, no label
ROM_END
} // anonymous namespace
/******************************************************************************
Drivers
******************************************************************************/
/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
CONS( 1984, ch2001, 0, 0, ch2001, ch2001, ch2001_state, empty_init, "CXG", "Chess 2001", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )

View File

@ -0,0 +1,223 @@
// license:BSD-3-Clause
// copyright-holders:hap
/******************************************************************************
CXG* chess computer driver base class
*later known as CXG Newcrest Technology Ltd.
NOTE: MAME doesn't include a generalized implementation for boardpieces yet,
greatly affecting user playability of emulated electronic board games.
As workaround for the chess games, use an external chess GUI on the side,
such as Arena(in editmode).
******************************************************************************/
#include "emu.h"
#include "includes/cxgbase.h"
// machine start/reset
void cxgbase_state::machine_start()
{
// resolve handlers
m_out_x.resolve();
m_out_a.resolve();
m_out_digit.resolve();
// zerofill
memset(m_display_state, 0, sizeof(m_display_state));
memset(m_display_decay, 0, sizeof(m_display_decay));
memset(m_display_segmask, 0, sizeof(m_display_segmask));
m_inp_mux = 0;
m_led_select = 0;
m_led_data = 0;
// register for savestates
save_item(NAME(m_display_maxy));
save_item(NAME(m_display_maxx));
save_item(NAME(m_display_wait));
save_item(NAME(m_display_state));
save_item(NAME(m_display_decay));
save_item(NAME(m_display_segmask));
save_item(NAME(m_inp_mux));
save_item(NAME(m_led_select));
save_item(NAME(m_led_data));
}
void cxgbase_state::machine_reset()
{
}
/***************************************************************************
Helper Functions
***************************************************************************/
// The device may strobe the outputs very fast, it is unnoticeable to the user.
// To prevent flickering here, we need to simulate a decay.
void cxgbase_state::display_update()
{
for (int y = 0; y < m_display_maxy; y++)
{
u32 active_state = 0;
for (int x = 0; x <= m_display_maxx; x++)
{
// turn on powered segments
if (m_display_state[y] >> x & 1)
m_display_decay[y][x] = m_display_wait;
// determine active state
u32 ds = (m_display_decay[y][x] != 0) ? 1 : 0;
active_state |= (ds << x);
// output to y.x, or y.a when always-on
if (x != m_display_maxx)
m_out_x[y][x] = ds;
else
m_out_a[y] = ds;
}
// output to digity
if (m_display_segmask[y] != 0)
m_out_digit[y] = active_state & m_display_segmask[y];
}
}
TIMER_DEVICE_CALLBACK_MEMBER(cxgbase_state::display_decay_tick)
{
// slowly turn off unpowered segments
for (int y = 0; y < m_display_maxy; y++)
for (int x = 0; x <= m_display_maxx; x++)
if (m_display_decay[y][x] != 0)
m_display_decay[y][x]--;
display_update();
}
void cxgbase_state::set_display_size(int maxx, int maxy)
{
m_display_maxx = maxx;
m_display_maxy = maxy;
}
void cxgbase_state::display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update)
{
set_display_size(maxx, maxy);
// update current state
u32 mask = (1 << maxx) - 1;
for (int y = 0; y < maxy; y++)
m_display_state[y] = (sety >> y & 1) ? ((setx & mask) | (1 << maxx)) : 0;
if (update)
display_update();
}
// generic input handlers
u16 cxgbase_state::read_inputs(int columns)
{
u16 ret = 0;
// read selected input rows
for (int i = 0; i < columns; i++)
if (m_inp_mux >> i & 1)
ret |= m_inp_matrix[i]->read();
return ret;
}
// chessboard generic inputs
INPUT_PORTS_START( cxg_cb_magnets )
PORT_START("IN.0")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_START("IN.1")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_START("IN.2")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_START("IN.3")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_START("IN.4")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_START("IN.5")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_START("IN.6")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_START("IN.7")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
INPUT_PORTS_END

View File

@ -1,442 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:hap
// thanks-to:Berger
/******************************************************************************
CXG* generic Z80 based chess computer driver
*later known as CXG Newcrest Technology Ltd.
NOTE: MAME doesn't include a generalized implementation for boardpieces yet,
greatly affecting user playability of emulated electronic board games.
As workaround for the chess games, use an external chess GUI on the side,
such as Arena(in editmode).
TODO:
- nothing
******************************************************************************
Chess 2001:
- Zilog Z8400APS @ 4 MHz (8MHz XTAL)
- 2KB RAM HM6116, 16KB ROM D27128D
- TTL, piezo, 8*8+9 LEDs, magnetic sensors
******************************************************************************/
#include "emu.h"
#include "cpu/z80/z80.h"
#include "machine/timer.h"
#include "sound/dac.h"
#include "sound/volt_reg.h"
#include "speaker.h"
// internal artwork
#include "cxg_ch2001.lh" // clickable
class cxgz80_state : public driver_device
{
public:
cxgz80_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_irq_on(*this, "irq_on"),
m_dac(*this, "dac"),
m_speaker_off_timer(*this, "speaker_off"),
m_inp_matrix(*this, "IN.%u", 0),
m_out_x(*this, "%u.%u", 0U, 0U),
m_out_a(*this, "%u.a", 0U),
m_out_digit(*this, "digit%u", 0U),
m_display_wait(33),
m_display_maxy(1),
m_display_maxx(0)
{ }
// devices/pointers
required_device<cpu_device> m_maincpu;
required_device<timer_device> m_irq_on;
required_device<dac_bit_interface> m_dac;
required_device<timer_device> m_speaker_off_timer;
optional_ioport_array<10> m_inp_matrix; // max 10
output_finder<0x20, 0x20> m_out_x;
output_finder<0x20> m_out_a;
output_finder<0x20> m_out_digit;
template<int L> TIMER_DEVICE_CALLBACK_MEMBER(irq_on) { m_maincpu->set_input_line(L, ASSERT_LINE); }
template<int L> TIMER_DEVICE_CALLBACK_MEMBER(irq_off) { m_maincpu->set_input_line(L, CLEAR_LINE); }
// misc common
u16 m_inp_mux; // multiplexed keypad mask
u16 m_led_select;
u16 m_led_data;
u16 read_inputs(int columns);
// display common
int m_display_wait; // led/lamp off-delay in milliseconds (default 33ms)
int m_display_maxy; // display matrix number of rows
int m_display_maxx; // display matrix number of columns (max 31 for now)
u32 m_display_state[0x20]; // display matrix rows data (last bit is used for always-on)
u16 m_display_segmask[0x20]; // if not 0, display matrix row is a digit, mask indicates connected segments
u8 m_display_decay[0x20][0x20]; // (internal use)
TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick);
void display_update();
void set_display_size(int maxx, int maxy);
void display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update = true);
// Chess 2001
TIMER_DEVICE_CALLBACK_MEMBER(speaker_off_callback);
DECLARE_WRITE8_MEMBER(ch2001_speaker_on_w);
DECLARE_WRITE8_MEMBER(ch2001_leds_w);
DECLARE_READ8_MEMBER(ch2001_input_r);
void ch2001_map(address_map &map);
void ch2001(machine_config &config);
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
};
// machine start/reset
void cxgz80_state::machine_start()
{
// resolve handlers
m_out_x.resolve();
m_out_a.resolve();
m_out_digit.resolve();
// zerofill
memset(m_display_state, 0, sizeof(m_display_state));
memset(m_display_decay, 0, sizeof(m_display_decay));
memset(m_display_segmask, 0, sizeof(m_display_segmask));
m_inp_mux = 0;
m_led_select = 0;
m_led_data = 0;
// register for savestates
save_item(NAME(m_display_maxy));
save_item(NAME(m_display_maxx));
save_item(NAME(m_display_wait));
save_item(NAME(m_display_state));
save_item(NAME(m_display_decay));
save_item(NAME(m_display_segmask));
save_item(NAME(m_inp_mux));
save_item(NAME(m_led_select));
save_item(NAME(m_led_data));
}
void cxgz80_state::machine_reset()
{
}
/***************************************************************************
Helper Functions
***************************************************************************/
// The device may strobe the outputs very fast, it is unnoticeable to the user.
// To prevent flickering here, we need to simulate a decay.
void cxgz80_state::display_update()
{
for (int y = 0; y < m_display_maxy; y++)
{
u32 active_state = 0;
for (int x = 0; x <= m_display_maxx; x++)
{
// turn on powered segments
if (m_display_state[y] >> x & 1)
m_display_decay[y][x] = m_display_wait;
// determine active state
u32 ds = (m_display_decay[y][x] != 0) ? 1 : 0;
active_state |= (ds << x);
// output to y.x, or y.a when always-on
if (x != m_display_maxx)
m_out_x[y][x] = ds;
else
m_out_a[y] = ds;
}
// output to digity
if (m_display_segmask[y] != 0)
m_out_digit[y] = active_state & m_display_segmask[y];
}
}
TIMER_DEVICE_CALLBACK_MEMBER(cxgz80_state::display_decay_tick)
{
// slowly turn off unpowered segments
for (int y = 0; y < m_display_maxy; y++)
for (int x = 0; x <= m_display_maxx; x++)
if (m_display_decay[y][x] != 0)
m_display_decay[y][x]--;
display_update();
}
void cxgz80_state::set_display_size(int maxx, int maxy)
{
m_display_maxx = maxx;
m_display_maxy = maxy;
}
void cxgz80_state::display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update)
{
set_display_size(maxx, maxy);
// update current state
u32 mask = (1 << maxx) - 1;
for (int y = 0; y < maxy; y++)
m_display_state[y] = (sety >> y & 1) ? ((setx & mask) | (1 << maxx)) : 0;
if (update)
display_update();
}
// generic input handlers
u16 cxgz80_state::read_inputs(int columns)
{
u16 ret = 0;
// read selected input rows
for (int i = 0; i < columns; i++)
if (m_inp_mux >> i & 1)
ret |= m_inp_matrix[i]->read();
return ret;
}
// Devices, I/O
/******************************************************************************
Chess 2001
******************************************************************************/
// TTL
TIMER_DEVICE_CALLBACK_MEMBER(cxgz80_state::speaker_off_callback)
{
m_dac->write(0);
}
WRITE8_MEMBER(cxgz80_state::ch2001_speaker_on_w)
{
// 74ls109 clock pulse to speaker
m_dac->write(1);
m_speaker_off_timer->adjust(attotime::from_usec(200)); // not accurate
}
WRITE8_MEMBER(cxgz80_state::ch2001_leds_w)
{
// d0-d7: 74ls273 (WR to CLK)
// 74ls273 Q1-Q4: 74ls145 A-D
// 74ls145 0-9: input mux/led select
m_inp_mux = 1 << (data & 0xf) & 0x3ff;
// 74ls273 Q5-Q8: MC14028 A-D
// MC14028 Q0-Q7: led data, Q8,Q9: N/C
u8 led_data = 1 << (data >> 4 & 0xf) & 0xff;
display_matrix(8, 10, led_data, m_inp_mux);
}
READ8_MEMBER(cxgz80_state::ch2001_input_r)
{
// d0-d7: multiplexed inputs
return ~read_inputs(10);
}
/******************************************************************************
Address Maps
******************************************************************************/
// Chess 2001
void cxgz80_state::ch2001_map(address_map &map)
{
map(0x0000, 0x3fff).rom();
map(0x4000, 0x47ff).mirror(0x3800).ram();
map(0x8000, 0x8000).mirror(0x3fff).rw(FUNC(cxgz80_state::ch2001_input_r), FUNC(cxgz80_state::ch2001_leds_w));
map(0xc000, 0xc000).mirror(0x3fff).w(FUNC(cxgz80_state::ch2001_speaker_on_w));
}
/******************************************************************************
Input Ports
******************************************************************************/
static INPUT_PORTS_START( cb_magnets )
PORT_START("IN.0")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_START("IN.1")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_START("IN.2")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_START("IN.3")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_START("IN.4")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_START("IN.5")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_START("IN.6")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_START("IN.7")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
INPUT_PORTS_END
static INPUT_PORTS_START( ch2001 )
PORT_INCLUDE( cb_magnets )
PORT_START("IN.8")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("Black")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_NAME("King")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_NAME("Queen")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_NAME("Rook")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("Bishop")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("Knight")
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("Pawn")
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_NAME("White")
PORT_START("IN.9")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_NAME("Set up")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("New Game")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_U) PORT_NAME("Take Back")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Y) PORT_NAME("Forward")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_NAME("Hint")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_I) PORT_NAME("Move")
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_NAME("Level")
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_NAME("Sound")
INPUT_PORTS_END
/******************************************************************************
Machine Drivers
******************************************************************************/
void cxgz80_state::ch2001(machine_config &config)
{
/* basic machine hardware */
Z80(config, m_maincpu, 8_MHz_XTAL/2);
m_maincpu->set_addrmap(AS_PROGRAM, &cxgz80_state::ch2001_map);
const attotime irq_period = attotime::from_hz(484); // theoretical frequency from 555 timer (22nF, 100K+33K, 1K2), measurement was 568Hz
TIMER(config, m_irq_on).configure_periodic(FUNC(cxgz80_state::irq_on<INPUT_LINE_IRQ0>), irq_period);
m_irq_on->set_start_delay(irq_period - attotime::from_nsec(18300)); // active for 18.3us
TIMER(config, "irq_off").configure_periodic(FUNC(cxgz80_state::irq_off<INPUT_LINE_IRQ0>), irq_period);
TIMER(config, m_speaker_off_timer).configure_generic(FUNC(cxgz80_state::speaker_off_callback));
TIMER(config, "display_decay").configure_periodic(FUNC(cxgz80_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_cxg_ch2001);
/* sound hardware */
SPEAKER(config, "speaker").front_center();
DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25);
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
}
/******************************************************************************
ROM Definitions
******************************************************************************/
ROM_START( ch2001 )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD("ch2001.bin", 0x0000, 0x4000, CRC(b3485c73) SHA1(f405c6f67fe70edf45dcc383a4049ee6bad387a9) ) // D27128D, no label
ROM_END
/******************************************************************************
Drivers
******************************************************************************/
/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
CONS( 1984, ch2001, 0, 0, ch2001, ch2001, cxgz80_state, empty_init, "CXG", "Chess 2001", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )

View File

@ -441,6 +441,7 @@ I/O is via TTL, very similar to Designer Display
#include "emu.h"
#include "includes/fidelbase.h"
#include "includes/fidel_desdis_common.h"
#include "cpu/m6502/m6502.h"
#include "cpu/m6502/r65c02.h"
@ -476,7 +477,6 @@ public:
fidel6502_state(const machine_config &mconfig, device_type type, const char *tag) :
fidelbase_state(mconfig, type, tag),
m_ppi8255(*this, "ppi8255"),
m_rombank(*this, "rombank"),
m_mainmap(*this, "mainmap"),
m_div_config(*this, "div_config")
{ }
@ -515,10 +515,6 @@ public:
void fdes2000(machine_config &config);
DECLARE_INPUT_CHANGED_MEMBER(fexcelv_bankswitch);
void fdes2000d(machine_config &config);
void fdes2100d(machine_config &config);
void init_fdesdis();
void fphantom(machine_config &config);
void init_fphantom();
@ -529,7 +525,6 @@ public:
private:
// devices/pointers
optional_device<i8255_device> m_ppi8255;
optional_memory_bank m_rombank;
optional_device<address_map_bank_device> m_mainmap;
optional_ioport m_div_config;
@ -603,11 +598,6 @@ private:
void fexcelb_map(address_map &map);
void fexcelp_map(address_map &map);
// Designer Display
DECLARE_WRITE8_MEMBER(fdesdis_control_w);
DECLARE_WRITE8_MEMBER(fdesdis_lcd_w);
DECLARE_READ8_MEMBER(fdesdis_input_r);
void fdesdis_map(address_map &map);
// Phantom
DECLARE_MACHINE_RESET(fphantom);
@ -616,6 +606,7 @@ private:
// Chesster
DECLARE_WRITE8_MEMBER(chesster_control_w);
DECLARE_WRITE8_MEMBER(kishon_control_w);
DECLARE_READ8_MEMBER(chesster_input_r);
void chesster_map(address_map &map);
void kishon_map(address_map &map);
@ -644,6 +635,23 @@ void fidel6502_state::machine_reset()
class desdis_state : public desdis_common_state
{
public:
desdis_state(const machine_config &mconfig, device_type type, const char *tag) :
desdis_common_state(mconfig, type, tag)
{ }
void fdes2000d(machine_config &config);
void fdes2100d(machine_config &config);
void init_fdes2100d();
private:
void fdes2100d_map(address_map &map);
};
/***************************************************************************
Helper Functions
@ -1170,7 +1178,7 @@ READ8_MEMBER(fidel6502_state::fexcel_ttl_r)
// TTL/generic
WRITE8_MEMBER(fidel6502_state::fdesdis_control_w)
WRITE8_MEMBER(desdis_common_state::control_w)
{
u8 q3_old = m_led_select & 8;
@ -1190,7 +1198,8 @@ WRITE8_MEMBER(fidel6502_state::fdesdis_control_w)
display_matrix(9, 2, m_inp_mux, ~m_led_select & 3, false);
// 74259 Q2: book rom A14
m_rombank->set_entry(~m_led_select >> 2 & 1);
if (m_rombank != nullptr)
m_rombank->set_entry(~m_led_select >> 2 & 1);
// 74259 Q3: lcd common, update on rising edge
if (~q3_old & m_led_select & 8)
@ -1204,7 +1213,7 @@ WRITE8_MEMBER(fidel6502_state::fdesdis_control_w)
display_update();
}
WRITE8_MEMBER(fidel6502_state::fdesdis_lcd_w)
WRITE8_MEMBER(desdis_common_state::lcd_w)
{
// a0-a2,d0-d3: 4*74259 to lcd digit segments
u32 mask = bitswap<8>(1 << offset,3,7,6,0,1,2,4,5);
@ -1215,13 +1224,13 @@ WRITE8_MEMBER(fidel6502_state::fdesdis_lcd_w)
}
}
READ8_MEMBER(fidel6502_state::fdesdis_input_r)
READ8_MEMBER(desdis_common_state::input_r)
{
// a0-a2,d7: multiplexed inputs (active low)
return (read_inputs(9) >> offset & 1) ? 0 : 0x80;
}
void fidel6502_state::init_fdesdis()
void desdis_state::init_fdes2100d()
{
m_rombank->configure_entries(0, 2, memregion("rombank")->base(), 0x4000);
}
@ -1282,6 +1291,12 @@ WRITE8_MEMBER(fidel6502_state::kishon_control_w)
m_rombank->set_entry(bank);
}
READ8_MEMBER(fidel6502_state::chesster_input_r)
{
// a0-a2,d7: multiplexed inputs (active low)
return (read_inputs(9) >> offset & 1) ? 0 : 0x80;
}
void fidel6502_state::init_chesster()
{
m_rombank->configure_entries(0, memregion("rombank")->bytes() / 0x4000, memregion("rombank")->base(), 0x4000);
@ -1445,12 +1460,12 @@ void fidel6502_state::fexcelb_map(address_map &map)
// Designer Display, Phantom, Chesster
void fidel6502_state::fdesdis_map(address_map &map)
void desdis_state::fdes2100d_map(address_map &map)
{
map(0x0000, 0x1fff).ram();
map(0x2000, 0x2007).mirror(0x1ff8).rw(FUNC(fidel6502_state::fdesdis_input_r), FUNC(fidel6502_state::fdesdis_control_w));
map(0x2000, 0x2007).mirror(0x1ff8).rw(FUNC(desdis_state::input_r), FUNC(desdis_state::control_w));
map(0x4000, 0x7fff).bankr("rombank");
map(0x6000, 0x6007).mirror(0x1ff8).w(FUNC(fidel6502_state::fdesdis_lcd_w));
map(0x6000, 0x6007).mirror(0x1ff8).w(FUNC(desdis_state::lcd_w));
map(0x8000, 0xffff).rom();
}
@ -1464,7 +1479,7 @@ void fidel6502_state::fphantom_map(address_map &map)
void fidel6502_state::chesster_map(address_map &map)
{
map(0x0000, 0x1fff).ram();
map(0x2000, 0x2007).mirror(0x1ff8).rw(FUNC(fidel6502_state::fdesdis_input_r), FUNC(fidel6502_state::chesster_control_w));
map(0x2000, 0x2007).mirror(0x1ff8).rw(FUNC(fidel6502_state::chesster_input_r), FUNC(fidel6502_state::chesster_control_w));
map(0x4000, 0x7fff).bankr("rombank");
map(0x6000, 0x6000).mirror(0x1fff).w("dac8", FUNC(dac_byte_interface::data_w));
map(0x8000, 0xffff).rom();
@ -1473,7 +1488,7 @@ void fidel6502_state::chesster_map(address_map &map)
void fidel6502_state::kishon_map(address_map &map)
{
chesster_map(map);
map(0x2000, 0x2007).mirror(0x1ff8).rw(FUNC(fidel6502_state::fdesdis_input_r), FUNC(fidel6502_state::kishon_control_w));
map(0x2000, 0x2007).mirror(0x1ff8).rw(FUNC(fidel6502_state::chesster_input_r), FUNC(fidel6502_state::kishon_control_w));
}
@ -1796,7 +1811,7 @@ static INPUT_PORTS_START( fdes )
INPUT_PORTS_END
static INPUT_PORTS_START( fdesdis )
INPUT_PORTS_START( desdis )
PORT_INCLUDE( fidel_cb_buttons )
PORT_START("IN.8")
@ -1811,13 +1826,17 @@ static INPUT_PORTS_START( fdesdis )
INPUT_PORTS_END
static INPUT_PORTS_START( chesster )
PORT_INCLUDE( fdesdis )
PORT_INCLUDE( fidel_cb_buttons )
PORT_MODIFY("IN.8")
PORT_START("IN.8")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("Clear")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_NAME("Move / No")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_NAME("Hint / Yes")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_NAME("Take Back / Repeat")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_NAME("Level / New")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_NAME("Option / Replay")
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("Verify / Problem")
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_NAME("Shift")
INPUT_PORTS_END
@ -2208,16 +2227,16 @@ void fidel6502_state::fexceld(machine_config &config)
config.set_default_layout(layout_fidel_exd);
}
void fidel6502_state::fdes2100d(machine_config &config)
void desdis_state::fdes2100d(machine_config &config)
{
/* basic machine hardware */
M65C02(config, m_maincpu, 6_MHz_XTAL); // W65C02P-6
m_maincpu->set_addrmap(AS_PROGRAM, &fidel6502_state::fdesdis_map);
m_maincpu->set_addrmap(AS_PROGRAM, &desdis_state::fdes2100d_map);
const attotime irq_period = attotime::from_hz(630); // from 556 timer (22nF, 102K, 1K)
TIMER(config, m_irq_on).configure_periodic(FUNC(fidel6502_state::irq_on<M6502_IRQ_LINE>), irq_period);
TIMER(config, m_irq_on).configure_periodic(FUNC(desdis_state::irq_on<M6502_IRQ_LINE>), irq_period);
m_irq_on->set_start_delay(irq_period - attotime::from_nsec(15250)); // active for 15.25us
TIMER(config, "irq_off").configure_periodic(FUNC(fidel6502_state::irq_off<M6502_IRQ_LINE>), irq_period);
TIMER(config, "irq_off").configure_periodic(FUNC(desdis_state::irq_off<M6502_IRQ_LINE>), irq_period);
TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_fidel_desdis);
@ -2230,13 +2249,13 @@ void fidel6502_state::fdes2100d(machine_config &config)
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
}
void fidel6502_state::fdes2000d(machine_config &config)
void desdis_state::fdes2000d(machine_config &config)
{
fdes2100d(config);
/* basic machine hardware */
R65C02(config.replace(), m_maincpu, 3_MHz_XTAL); // R65C02P3
m_maincpu->set_addrmap(AS_PROGRAM, &fidel6502_state::fdesdis_map);
m_maincpu->set_addrmap(AS_PROGRAM, &desdis_state::fdes2100d_map);
}
void fidel6502_state::fphantom(machine_config &config)
@ -2901,8 +2920,8 @@ CONS( 1986, granits, fexcelp, 0, granits, fexcel, fidel6502_state, empt
CONS( 1988, fdes2000, fexcelp, 0, fdes2000, fdes, fidel6502_state, empty_init, "Fidelity Electronics", "Designer 2000", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) // Excellence series hardware
CONS( 1988, fdes2100, fexcelp, 0, fdes2100, fdes, fidel6502_state, empty_init, "Fidelity Electronics", "Designer 2100", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) // "
CONS( 1988, fdes2100d, 0, 0, fdes2100d, fdesdis, fidel6502_state, init_fdesdis, "Fidelity Electronics", "Designer 2100 Display (rev. B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1988, fdes2000d, fdes2100d,0, fdes2000d, fdesdis, fidel6502_state, init_fdesdis, "Fidelity Electronics", "Designer 2000 Display", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1988, fdes2100d, 0, 0, fdes2100d, desdis, desdis_state, init_fdes2100d, "Fidelity Electronics", "Designer 2100 Display (rev. B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1988, fdes2000d, fdes2100d,0, fdes2000d, desdis, desdis_state, init_fdes2100d, "Fidelity Electronics", "Designer 2000 Display", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1988, fphantom, 0, 0, fphantom, fphantom, fidel6502_state, init_fphantom, "Fidelity Electronics", "Phantom (Fidelity)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_MECHANICAL | MACHINE_NOT_WORKING )

View File

@ -181,6 +181,7 @@ B0000x-xxxxxx: see V7, -800000
#include "emu.h"
#include "includes/fidelbase.h"
#include "includes/fidel_desdis_common.h"
#include "cpu/m68000/m68000.h"
#include "machine/ram.h"
@ -195,22 +196,14 @@ B0000x-xxxxxx: see V7, -800000
#include "fidel_eag_68k.lh" // clickable
class fidel68k_state : public fidelbase_state
class eag_state : public fidelbase_state
{
public:
fidel68k_state(const machine_config &mconfig, device_type type, const char *tag) :
eag_state(const machine_config &mconfig, device_type type, const char *tag) :
fidelbase_state(mconfig, type, tag),
m_ram(*this, "ram")
{ }
void fex68k(machine_config &config);
void fex68km2(machine_config &config);
void fex68km3(machine_config &config);
void fdes2265(machine_config &config);
void fdes2325(machine_config &config);
void init_fdes2265();
void eag_base(machine_config &config);
void eag(machine_config &config);
void eagv5(machine_config &config);
@ -218,35 +211,72 @@ public:
void eagv9(machine_config &config);
void eagv10(machine_config &config);
void eagv11(machine_config &config);
void init_eag();
private:
// devices/pointers
optional_device<ram_device> m_ram;
// Excel 68000
DECLARE_WRITE8_MEMBER(fex68k_mux_w);
void fex68k_map(address_map &map);
void fex68km2_map(address_map &map);
void fex68km3_map(address_map &map);
// Designer Master
DECLARE_WRITE8_MEMBER(fdes68k_control_w);
DECLARE_READ8_MEMBER(fdes68k_input_r);
DECLARE_WRITE8_MEMBER(fdes68k_lcd_w);
void fdes2265_map(address_map &map);
void fdes2325_map(address_map &map);
// EAG(6114/6117)
void eag_prepare_display();
DECLARE_READ8_MEMBER(eag_input1_r);
DECLARE_WRITE8_MEMBER(eag_leds_w);
DECLARE_WRITE8_MEMBER(eag_7seg_w);
DECLARE_WRITE8_MEMBER(eag_mux_w);
DECLARE_READ8_MEMBER(eag_input2_r);
void eag_map(address_map &map);
void eagv7_map(address_map &map);
void eagv11_map(address_map &map);
void eagv5_slave_map(address_map &map);
// I/O handlers
void prepare_display();
DECLARE_READ8_MEMBER(input1_r);
DECLARE_READ8_MEMBER(input2_r);
DECLARE_WRITE8_MEMBER(leds_w);
DECLARE_WRITE8_MEMBER(digit_w);
DECLARE_WRITE8_MEMBER(mux_w);
};
class desmas_state : public desdis_common_state
{
public:
desmas_state(const machine_config &mconfig, device_type type, const char *tag) :
desdis_common_state(mconfig, type, tag)
{ }
void fdes2265(machine_config &config);
void fdes2325(machine_config &config);
void init_fdes2265();
private:
void fdes2265_map(address_map &map);
void fdes2325_map(address_map &map);
// I/O handlers
virtual DECLARE_WRITE8_MEMBER(control_w) override;
virtual DECLARE_WRITE8_MEMBER(lcd_w) override;
};
class excel68k_state : public fidelbase_state
{
public:
excel68k_state(const machine_config &mconfig, device_type type, const char *tag) :
fidelbase_state(mconfig, type, tag)
{ }
void fex68k(machine_config &config);
void fex68km2(machine_config &config);
void fex68km3(machine_config &config);
private:
void fex68k_map(address_map &map);
void fex68km2_map(address_map &map);
void fex68km3_map(address_map &map);
// I/O handlers
void prepare_display();
DECLARE_READ8_MEMBER(input_r);
DECLARE_WRITE8_MEMBER(leds_w);
DECLARE_WRITE8_MEMBER(digit_w);
DECLARE_WRITE8_MEMBER(mux_w);
};
@ -257,14 +287,47 @@ private:
Excel 68000
******************************************************************************/
WRITE8_MEMBER(fidel68k_state::fex68k_mux_w)
void excel68k_state::prepare_display()
{
// 4*7seg leds, 8*8 chessboard leds
u8 seg_data = bitswap<8>(m_7seg_data,0,1,3,2,7,5,6,4);
set_display_segmask(0x55, 0x7f);
display_matrix(16, 8, m_led_data << 8 | seg_data, m_inp_mux);
}
READ8_MEMBER(excel68k_state::input_r)
{
// a1-a3,d7: multiplexed inputs (active low)
return (read_inputs(9) >> offset & 1) ? 0 : 0x80;
}
WRITE8_MEMBER(excel68k_state::leds_w)
{
// a1-a3,d0: led data
m_led_data = (m_led_data & ~(1 << offset)) | ((data & 1) << offset);
prepare_display();
}
WRITE8_MEMBER(excel68k_state::digit_w)
{
// a1-a3,d0(d8): digit segment data
m_7seg_data = (m_7seg_data & ~(1 << offset)) | ((data & 1) << offset);
prepare_display();
}
WRITE8_MEMBER(excel68k_state::mux_w)
{
// a1-a3,d0: 74259
u8 mask = 1 << offset;
m_led_select = (m_led_select & ~mask) | ((data & 1) ? mask : 0);
// 74259 Q0-Q3: 74145 A-D (Q4-Q7 N/C)
eag_mux_w(space, offset, m_led_select & 0xf);
// 74145 0-8: input mux, digit/led select
// 74145 9: speaker out
u16 sel = 1 << (m_led_select & 0xf);
m_dac->write(BIT(sel, 9));
m_inp_mux = sel & 0x1ff;
prepare_display();
}
@ -273,55 +336,19 @@ WRITE8_MEMBER(fidel68k_state::fex68k_mux_w)
Designer Master
******************************************************************************/
WRITE8_MEMBER(fidel68k_state::fdes68k_control_w)
WRITE8_MEMBER(desmas_state::control_w)
{
u8 q3_old = m_led_select & 8;
// a1-a3,d0: 74259
u8 mask = 1 << offset;
m_led_select = (m_led_select & ~mask) | ((data & 1) ? mask : 0);
// 74259 Q4-Q7: 7442 a0-a3
// 7442 0-8: led data, input mux
u16 sel = 1 << (m_led_select >> 4 & 0xf) & 0x3ff;
m_inp_mux = sel & 0x1ff;
// 7442 9: speaker out
m_dac->write(BIT(sel, 9));
// 74259 Q0,Q1: led select (active low)
display_matrix(9, 2, m_inp_mux, ~m_led_select & 3, false);
// 74259 Q3: lcd common, update on rising edge
if (~q3_old & m_led_select & 8)
{
for (int i = 0; i < 4; i++)
m_display_state[i+2] = m_7seg_data >> (8*i) & 0xff;
}
m_display_maxy += 4;
set_display_segmask(0x3c, 0x7f);
display_update();
// same as desdis, d0 instead of d7
desdis_common_state::control_w(space, offset, data << 7);
}
READ8_MEMBER(fidel68k_state::fdes68k_input_r)
WRITE8_MEMBER(desmas_state::lcd_w)
{
// a1-a3,d7(d15): multiplexed inputs (active low)
return (read_inputs(9) >> offset & 1) ? 0 : 0x80;
// same as desdis, inverted data
desdis_common_state::lcd_w(space, offset, ~data);
}
WRITE8_MEMBER(fidel68k_state::fdes68k_lcd_w)
{
// a1-a3,d0-d3: 4*74259 to lcd digit segments
u32 mask = bitswap<8>(1 << offset,3,7,6,0,1,2,4,5);
for (int i = 0; i < 4; i++)
{
m_7seg_data = (m_7seg_data & ~mask) | ((data >> i & 1) ? mask : 0);
mask <<= 8;
}
}
void fidel68k_state::init_fdes2265()
void desmas_state::init_fdes2265()
{
u16 *rom = (u16*)memregion("maincpu")->base();
const u32 len = memregion("maincpu")->bytes() / 2;
@ -345,42 +372,41 @@ void fidel68k_state::init_fdes2265()
// TTL/generic
void fidel68k_state::eag_prepare_display()
void eag_state::prepare_display()
{
// Excel 68000: 4*7seg leds, 8*8 chessboard leds
// EAG: 8*7seg leds(2 panels), (8+1)*8 chessboard leds
// 8*7seg leds(2 panels), (8+1)*8 chessboard leds
u8 seg_data = bitswap<8>(m_7seg_data,0,1,3,2,7,5,6,4);
set_display_segmask(0x1ff, 0x7f);
set_display_segmask(0x1ef, 0x7f);
display_matrix(16, 9, m_led_data << 8 | seg_data, m_inp_mux);
}
READ8_MEMBER(fidel68k_state::eag_input1_r)
READ8_MEMBER(eag_state::input1_r)
{
// a1-a3,d7: multiplexed inputs (active low)
return (read_inputs(9) >> offset & 1) ? 0 : 0x80;
}
READ8_MEMBER(fidel68k_state::eag_input2_r)
READ8_MEMBER(eag_state::input2_r)
{
// d7: multiplexed inputs highest bit
return (read_inputs(9) & 0x100) ? 0x80 : 0;
}
WRITE8_MEMBER(fidel68k_state::eag_leds_w)
WRITE8_MEMBER(eag_state::leds_w)
{
// a1-a3,d0: led data
m_led_data = (m_led_data & ~(1 << offset)) | ((data & 1) << offset);
eag_prepare_display();
prepare_display();
}
WRITE8_MEMBER(fidel68k_state::eag_7seg_w)
WRITE8_MEMBER(eag_state::digit_w)
{
// a1-a3,d0(d8): digit segment data
m_7seg_data = (m_7seg_data & ~(1 << offset)) | ((data & 1) << offset);
eag_prepare_display();
prepare_display();
}
WRITE8_MEMBER(fidel68k_state::eag_mux_w)
WRITE8_MEMBER(eag_state::mux_w)
{
// d0-d3: 74145 A-D
// 74145 0-8: input mux, digit/led select
@ -388,7 +414,7 @@ WRITE8_MEMBER(fidel68k_state::eag_mux_w)
u16 sel = 1 << (data & 0xf);
m_dac->write(BIT(sel, 9));
m_inp_mux = sel & 0x1ff;
eag_prepare_display();
prepare_display();
}
@ -399,23 +425,23 @@ WRITE8_MEMBER(fidel68k_state::eag_mux_w)
// Excel 68000
void fidel68k_state::fex68k_map(address_map &map)
void excel68k_state::fex68k_map(address_map &map)
{
map(0x000000, 0x00ffff).rom();
map(0x000000, 0x00000f).mirror(0x00fff0).w(FUNC(fidel68k_state::eag_leds_w)).umask16(0x00ff);
map(0x000000, 0x00000f).mirror(0x00fff0).w(FUNC(fidel68k_state::eag_7seg_w)).umask16(0xff00);
map(0x000000, 0x00000f).mirror(0x00fff0).w(FUNC(excel68k_state::leds_w)).umask16(0x00ff);
map(0x000000, 0x00000f).mirror(0x00fff0).w(FUNC(excel68k_state::digit_w)).umask16(0xff00);
map(0x044000, 0x047fff).ram();
map(0x100000, 0x10000f).mirror(0x03fff0).r(FUNC(fidel68k_state::eag_input1_r)).umask16(0x00ff);
map(0x140000, 0x14000f).mirror(0x03fff0).w(FUNC(fidel68k_state::fex68k_mux_w)).umask16(0x00ff);
map(0x100000, 0x10000f).mirror(0x03fff0).r(FUNC(excel68k_state::input_r)).umask16(0x00ff);
map(0x140000, 0x14000f).mirror(0x03fff0).w(FUNC(excel68k_state::mux_w)).umask16(0x00ff);
}
void fidel68k_state::fex68km2_map(address_map &map)
void excel68k_state::fex68km2_map(address_map &map)
{
fex68k_map(map);
map(0x200000, 0x21ffff).ram();
}
void fidel68k_state::fex68km3_map(address_map &map)
void excel68k_state::fex68km3_map(address_map &map)
{
fex68k_map(map);
map(0x200000, 0x20ffff).ram();
@ -424,24 +450,24 @@ void fidel68k_state::fex68km3_map(address_map &map)
// Designer Master
void fidel68k_state::fdes2265_map(address_map &map)
void desmas_state::fdes2265_map(address_map &map)
{
map.unmap_value_high();
map(0x000000, 0x00ffff).rom();
map(0x000000, 0x00000f).w(FUNC(fidel68k_state::fdes68k_lcd_w)).umask16(0x00ff);
map(0x000000, 0x00000f).w(FUNC(desmas_state::lcd_w)).umask16(0x00ff);
map(0x044000, 0x047fff).ram();
map(0x100000, 0x10ffff).ram();
map(0x140000, 0x14000f).r(FUNC(fidel68k_state::fdes68k_input_r)).umask16(0xff00);
map(0x140000, 0x14000f).w(FUNC(fidel68k_state::fdes68k_control_w)).umask16(0x00ff);
map(0x140000, 0x14000f).r(FUNC(desmas_state::input_r)).umask16(0xff00);
map(0x140000, 0x14000f).w(FUNC(desmas_state::control_w)).umask16(0x00ff);
}
void fidel68k_state::fdes2325_map(address_map &map)
void desmas_state::fdes2325_map(address_map &map)
{
map.unmap_value_high();
map(0x000000, 0x00ffff).rom();
map(0x100000, 0x10000f).w(FUNC(fidel68k_state::fdes68k_lcd_w)).umask32(0x00ff00ff);
map(0x140000, 0x14000f).w(FUNC(fidel68k_state::fdes68k_control_w)).umask32(0x00ff00ff);
map(0x180000, 0x18000f).r(FUNC(fidel68k_state::fdes68k_input_r)).umask32(0xff00ff00);
map(0x100000, 0x10000f).w(FUNC(desmas_state::lcd_w)).umask32(0x00ff00ff);
map(0x140000, 0x14000f).w(FUNC(desmas_state::control_w)).umask32(0x00ff00ff);
map(0x180000, 0x18000f).r(FUNC(desmas_state::input_r)).umask32(0xff00ff00);
map(0x300000, 0x37ffff).ram();
map(0x500000, 0x507fff).ram();
}
@ -449,55 +475,55 @@ void fidel68k_state::fdes2325_map(address_map &map)
// EAG
void fidel68k_state::init_eag()
void eag_state::init_eag()
{
// eag_map: DRAM slots at $200000-$2fffff - V1/V2/V5: 128K, V3: 512K, V4: 1M
m_maincpu->space(AS_PROGRAM).install_ram(0x200000, 0x200000 + m_ram->size() - 1, m_ram->pointer());
}
void fidel68k_state::eag_map(address_map &map)
void eag_state::eag_map(address_map &map)
{
map(0x000000, 0x01ffff).rom();
map(0x104000, 0x107fff).ram();
map(0x300000, 0x30000f).mirror(0x000010).w(FUNC(fidel68k_state::eag_7seg_w)).umask16(0xff00).nopr();
map(0x300000, 0x30000f).mirror(0x000010).rw(FUNC(fidel68k_state::eag_input1_r), FUNC(fidel68k_state::eag_leds_w)).umask16(0x00ff);
map(0x400000, 0x407fff).r(FUNC(fidel68k_state::cartridge_r)).umask16(0xff00);
map(0x400001, 0x400001).w(FUNC(fidel68k_state::eag_mux_w));
map(0x300000, 0x30000f).mirror(0x000010).w(FUNC(eag_state::digit_w)).umask16(0xff00).nopr();
map(0x300000, 0x30000f).mirror(0x000010).rw(FUNC(eag_state::input1_r), FUNC(eag_state::leds_w)).umask16(0x00ff);
map(0x400000, 0x407fff).r(FUNC(eag_state::cartridge_r)).umask16(0xff00);
map(0x400001, 0x400001).w(FUNC(eag_state::mux_w));
map(0x400002, 0x400007).nopw(); // ?
map(0x604000, 0x607fff).ram().share("nvram");
map(0x700003, 0x700003).r(FUNC(fidel68k_state::eag_input2_r));
map(0x700003, 0x700003).r(FUNC(eag_state::input2_r));
}
void fidel68k_state::eagv7_map(address_map &map)
void eag_state::eagv7_map(address_map &map)
{
map(0x000000, 0x01ffff).rom();
map(0x104000, 0x107fff).ram();
map(0x200000, 0x2fffff).ram();
map(0x300000, 0x30000f).mirror(0x000010).w(FUNC(fidel68k_state::eag_7seg_w)).umask32(0xff00ff00).nopr();
map(0x300000, 0x30000f).mirror(0x000010).rw(FUNC(fidel68k_state::eag_input1_r), FUNC(fidel68k_state::eag_leds_w)).umask32(0x00ff00ff);
map(0x400000, 0x407fff).r(FUNC(fidel68k_state::cartridge_r)).umask32(0xff00ff00);
map(0x400001, 0x400001).w(FUNC(fidel68k_state::eag_mux_w));
map(0x300000, 0x30000f).mirror(0x000010).w(FUNC(eag_state::digit_w)).umask32(0xff00ff00).nopr();
map(0x300000, 0x30000f).mirror(0x000010).rw(FUNC(eag_state::input1_r), FUNC(eag_state::leds_w)).umask32(0x00ff00ff);
map(0x400000, 0x407fff).r(FUNC(eag_state::cartridge_r)).umask32(0xff00ff00);
map(0x400001, 0x400001).w(FUNC(eag_state::mux_w));
map(0x400004, 0x400007).nopw(); // ?
map(0x604000, 0x607fff).ram().share("nvram");
map(0x700003, 0x700003).r(FUNC(fidel68k_state::eag_input2_r));
map(0x700003, 0x700003).r(FUNC(eag_state::input2_r));
map(0x800000, 0x807fff).ram();
}
void fidel68k_state::eagv11_map(address_map &map)
void eag_state::eagv11_map(address_map &map)
{
map(0x00000000, 0x0001ffff).rom();
map(0x00200000, 0x003fffff).ram();
map(0x00b00000, 0x00b0000f).mirror(0x00000010).w(FUNC(fidel68k_state::eag_7seg_w)).umask32(0xff00ff00).nopr();
map(0x00b00000, 0x00b0000f).mirror(0x00000010).rw(FUNC(fidel68k_state::eag_input1_r), FUNC(fidel68k_state::eag_leds_w)).umask32(0x00ff00ff);
map(0x00c00000, 0x00c07fff).r(FUNC(fidel68k_state::cartridge_r)).umask32(0xff00ff00);
map(0x00c00001, 0x00c00001).w(FUNC(fidel68k_state::eag_mux_w));
map(0x00b00000, 0x00b0000f).mirror(0x00000010).w(FUNC(eag_state::digit_w)).umask32(0xff00ff00).nopr();
map(0x00b00000, 0x00b0000f).mirror(0x00000010).rw(FUNC(eag_state::input1_r), FUNC(eag_state::leds_w)).umask32(0x00ff00ff);
map(0x00c00000, 0x00c07fff).r(FUNC(eag_state::cartridge_r)).umask32(0xff00ff00);
map(0x00c00001, 0x00c00001).w(FUNC(eag_state::mux_w));
map(0x00c00004, 0x00c00007).nopw(); // ?
map(0x00e04000, 0x00e07fff).ram().share("nvram");
map(0x00f00003, 0x00f00003).r(FUNC(fidel68k_state::eag_input2_r));
map(0x00f00003, 0x00f00003).r(FUNC(eag_state::input2_r));
map(0x01000000, 0x0101ffff).ram();
}
void fidel68k_state::eagv5_slave_map(address_map &map)
void eag_state::eagv5_slave_map(address_map &map)
{
map(0x000000, 0x00ffff).rom();
map(0x044000, 0x047fff).ram();
@ -509,7 +535,7 @@ void fidel68k_state::eagv5_slave_map(address_map &map)
Input Ports
******************************************************************************/
static INPUT_PORTS_START( fex68k )
static INPUT_PORTS_START( excel68k )
PORT_INCLUDE( fidel_cb_buttons )
PORT_START("IN.8")
@ -524,21 +550,6 @@ static INPUT_PORTS_START( fex68k )
INPUT_PORTS_END
static INPUT_PORTS_START( fdes68k )
PORT_INCLUDE( fidel_cb_buttons )
PORT_START("IN.8")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("Clear")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_NAME("Move / Alternate")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_NAME("Hint / Info")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_NAME("Take Back / Replay")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_NAME("Level / New")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_NAME("Option / Time")
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("Verify / Problem")
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_NAME("Shift")
INPUT_PORTS_END
static INPUT_PORTS_START( eag )
PORT_INCLUDE( fidel_cb_magnets )
@ -568,16 +579,16 @@ INPUT_PORTS_END
Machine Drivers
******************************************************************************/
void fidel68k_state::fex68k(machine_config &config)
void excel68k_state::fex68k(machine_config &config)
{
/* basic machine hardware */
M68000(config, m_maincpu, 12_MHz_XTAL); // HD68HC000P12
m_maincpu->set_addrmap(AS_PROGRAM, &fidel68k_state::fex68k_map);
m_maincpu->set_addrmap(AS_PROGRAM, &excel68k_state::fex68k_map);
const attotime irq_period = attotime::from_hz(618); // theoretical frequency from 556 timer (22nF, 91K + 20K POT @ 14.8K, 0.1K), measurement was 580Hz
TIMER(config, m_irq_on).configure_periodic(FUNC(fidel68k_state::irq_on<M68K_IRQ_2>), irq_period);
TIMER(config, m_irq_on).configure_periodic(FUNC(excel68k_state::irq_on<M68K_IRQ_2>), irq_period);
m_irq_on->set_start_delay(irq_period - attotime::from_nsec(1528)); // active for 1.525us
TIMER(config, "irq_off").configure_periodic(FUNC(fidel68k_state::irq_off<M68K_IRQ_2>), irq_period);
TIMER(config, "irq_off").configure_periodic(FUNC(excel68k_state::irq_off<M68K_IRQ_2>), irq_period);
TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_fidel_ex_68k);
@ -590,33 +601,33 @@ void fidel68k_state::fex68k(machine_config &config)
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
}
void fidel68k_state::fex68km2(machine_config &config)
void excel68k_state::fex68km2(machine_config &config)
{
fex68k(config);
/* basic machine hardware */
m_maincpu->set_addrmap(AS_PROGRAM, &fidel68k_state::fex68km2_map);
m_maincpu->set_addrmap(AS_PROGRAM, &excel68k_state::fex68km2_map);
}
void fidel68k_state::fex68km3(machine_config &config)
void excel68k_state::fex68km3(machine_config &config)
{
fex68k(config);
/* basic machine hardware */
m_maincpu->set_clock(16_MHz_XTAL); // factory overclock
m_maincpu->set_addrmap(AS_PROGRAM, &fidel68k_state::fex68km3_map);
m_maincpu->set_addrmap(AS_PROGRAM, &excel68k_state::fex68km3_map);
}
void fidel68k_state::fdes2265(machine_config &config)
void desmas_state::fdes2265(machine_config &config)
{
/* basic machine hardware */
M68000(config, m_maincpu, 16_MHz_XTAL); // MC68HC000P12F
m_maincpu->set_addrmap(AS_PROGRAM, &fidel68k_state::fdes2265_map);
m_maincpu->set_addrmap(AS_PROGRAM, &desmas_state::fdes2265_map);
const attotime irq_period = attotime::from_hz(597); // from 555 timer, measured
TIMER(config, m_irq_on).configure_periodic(FUNC(fidel68k_state::irq_on<M68K_IRQ_4>), irq_period);
TIMER(config, m_irq_on).configure_periodic(FUNC(desmas_state::irq_on<M68K_IRQ_4>), irq_period);
m_irq_on->set_start_delay(irq_period - attotime::from_nsec(6000)); // active for 6us
TIMER(config, "irq_off").configure_periodic(FUNC(fidel68k_state::irq_off<M68K_IRQ_4>), irq_period);
TIMER(config, "irq_off").configure_periodic(FUNC(desmas_state::irq_off<M68K_IRQ_4>), irq_period);
TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_fidel_desdis_68kr);
@ -629,27 +640,27 @@ void fidel68k_state::fdes2265(machine_config &config)
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
}
void fidel68k_state::fdes2325(machine_config &config)
void desmas_state::fdes2325(machine_config &config)
{
fdes2265(config);
/* basic machine hardware */
M68EC020(config.replace(), m_maincpu, 20_MHz_XTAL); // MC68EC020RP25
m_maincpu->set_addrmap(AS_PROGRAM, &fidel68k_state::fdes2325_map);
m_maincpu->set_addrmap(AS_PROGRAM, &desmas_state::fdes2325_map);
config.set_default_layout(layout_fidel_desdis_68kg);
}
void fidel68k_state::eag_base(machine_config &config)
void eag_state::eag_base(machine_config &config)
{
/* basic machine hardware */
M68000(config, m_maincpu, 16_MHz_XTAL);
m_maincpu->set_addrmap(AS_PROGRAM, &fidel68k_state::eag_map);
m_maincpu->set_addrmap(AS_PROGRAM, &eag_state::eag_map);
const attotime irq_period = attotime::from_hz(4.9152_MHz_XTAL/0x2000); // 600Hz
TIMER(config, m_irq_on).configure_periodic(FUNC(fidel68k_state::irq_on<M68K_IRQ_2>), irq_period);
TIMER(config, m_irq_on).configure_periodic(FUNC(eag_state::irq_on<M68K_IRQ_2>), irq_period);
m_irq_on->set_start_delay(irq_period - attotime::from_nsec(8250)); // active for 8.25us
TIMER(config, "irq_off").configure_periodic(FUNC(fidel68k_state::irq_off<M68K_IRQ_2>), irq_period);
TIMER(config, "irq_off").configure_periodic(FUNC(eag_state::irq_off<M68K_IRQ_2>), irq_period);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
@ -670,13 +681,13 @@ void fidel68k_state::eag_base(machine_config &config)
SOFTWARE_LIST(config, "cart_list").set_original("fidel_scc");
}
void fidel68k_state::eag(machine_config &config)
void eag_state::eag(machine_config &config)
{
eag_base(config);
RAM(config, m_ram).set_default_size("1M").set_extra_options("128K, 512K, 1M");
}
void fidel68k_state::eagv5(machine_config &config)
void eag_state::eagv5(machine_config &config)
{
eag(config);
@ -684,44 +695,44 @@ void fidel68k_state::eagv5(machine_config &config)
m_ram->set_default_size("128K");
m68000_device &subcpu(M68000(config, "subcpu", 16_MHz_XTAL));
subcpu.set_addrmap(AS_PROGRAM, &fidel68k_state::eagv5_slave_map);
subcpu.set_addrmap(AS_PROGRAM, &eag_state::eagv5_slave_map);
}
void fidel68k_state::eagv7(machine_config &config)
void eag_state::eagv7(machine_config &config)
{
eag_base(config);
/* basic machine hardware */
M68020(config.replace(), m_maincpu, 20_MHz_XTAL);
m_maincpu->set_addrmap(AS_PROGRAM, &fidel68k_state::eagv7_map);
m_maincpu->set_addrmap(AS_PROGRAM, &eag_state::eagv7_map);
}
void fidel68k_state::eagv9(machine_config &config)
void eag_state::eagv9(machine_config &config)
{
eagv7(config);
/* basic machine hardware */
M68030(config.replace(), m_maincpu, 32_MHz_XTAL);
m_maincpu->set_addrmap(AS_PROGRAM, &fidel68k_state::eagv7_map);
m_maincpu->set_addrmap(AS_PROGRAM, &eag_state::eagv7_map);
}
void fidel68k_state::eagv10(machine_config &config)
void eag_state::eagv10(machine_config &config)
{
eagv7(config);
/* basic machine hardware */
M68040(config.replace(), m_maincpu, 25_MHz_XTAL);
m_maincpu->set_addrmap(AS_PROGRAM, &fidel68k_state::eagv11_map);
m_maincpu->set_addrmap(AS_PROGRAM, &eag_state::eagv11_map);
}
void fidel68k_state::eagv11(machine_config &config)
void eag_state::eagv11(machine_config &config)
{
eagv7(config);
/* basic machine hardware */
M68EC040(config.replace(), m_maincpu, 36_MHz_XTAL*2*2); // wrong! should be M68EC060 @ 72MHz
m_maincpu->set_addrmap(AS_PROGRAM, &fidel68k_state::eagv11_map);
m_maincpu->set_periodic_int(FUNC(fidel68k_state::irq2_line_hold), attotime::from_hz(600));
m_maincpu->set_addrmap(AS_PROGRAM, &eag_state::eagv11_map);
m_maincpu->set_periodic_int(FUNC(eag_state::irq2_line_hold), attotime::from_hz(600));
config.device_remove("irq_on"); // 8.25us is too long
config.device_remove("irq_off");
@ -842,20 +853,20 @@ ROM_END
******************************************************************************/
// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY FULLNAME, FLAGS
CONS( 1987, fex68k, 0, 0, fex68k, fex68k, fidel68k_state, empty_init, "Fidelity Electronics", "Excel 68000 (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1987, fex68ka, fex68k, 0, fex68k, fex68k, fidel68k_state, empty_init, "Fidelity Electronics", "Excel 68000 (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1987, fex68kb, fex68k, 0, fex68k, fex68k, fidel68k_state, empty_init, "Fidelity Electronics", "Excel 68000 (set 3)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1988, fex68km2, fex68k, 0, fex68km2, fex68k, fidel68k_state, empty_init, "Fidelity Electronics", "Excel 68000 Mach II (rev. C+)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1988, fex68km3, fex68k, 0, fex68km3, fex68k, fidel68k_state, empty_init, "Fidelity Electronics", "Excel 68000 Mach III Master", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1987, fex68k, 0, 0, fex68k, excel68k, excel68k_state, empty_init, "Fidelity Electronics", "Excel 68000 (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1987, fex68ka, fex68k, 0, fex68k, excel68k, excel68k_state, empty_init, "Fidelity Electronics", "Excel 68000 (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1987, fex68kb, fex68k, 0, fex68k, excel68k, excel68k_state, empty_init, "Fidelity Electronics", "Excel 68000 (set 3)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1988, fex68km2, fex68k, 0, fex68km2, excel68k, excel68k_state, empty_init, "Fidelity Electronics", "Excel 68000 Mach II (rev. C+)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1988, fex68km3, fex68k, 0, fex68km3, excel68k, excel68k_state, empty_init, "Fidelity Electronics", "Excel 68000 Mach III Master", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1989, fdes2265, 0, 0, fdes2265, fdes68k, fidel68k_state, init_fdes2265, "Fidelity Electronics", "Designer Mach III Master 2265", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1991, fdes2325, fdes2265, 0, fdes2325, fdes68k, fidel68k_state, empty_init, "Fidelity Electronics", "Designer Mach IV Master 2325", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1989, fdes2265, 0, 0, fdes2265, desdis, desmas_state, init_fdes2265, "Fidelity Electronics", "Designer Mach III Master 2265", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1991, fdes2325, fdes2265, 0, fdes2325, desdis, desmas_state, empty_init, "Fidelity Electronics", "Designer Mach IV Master 2325", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1989, feagv2, 0, 0, eag, eag, fidel68k_state, init_eag, "Fidelity Electronics", "Elite Avant Garde (model 6114-2/3/4, set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1989, feagv2a, feagv2, 0, eag, eag, fidel68k_state, init_eag, "Fidelity Electronics", "Elite Avant Garde (model 6114-2/3/4, set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1989, feagv5, feagv2, 0, eagv5, eag, fidel68k_state, empty_init, "Fidelity Electronics", "Elite Avant Garde (model 6114-5)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_NOT_WORKING )
CONS( 1990, feagv7, feagv2, 0, eagv7, eag, fidel68k_state, empty_init, "Fidelity Electronics", "Elite Avant Garde (model 6117-7, set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1990, feagv7a, feagv2, 0, eagv7, eag, fidel68k_state, empty_init, "Fidelity Electronics", "Elite Avant Garde (model 6117-7, set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1990, feagv9, feagv2, 0, eagv9, eag, fidel68k_state, empty_init, "Fidelity Electronics", "Elite Avant Garde (model 6117-9)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1990, feagv10, feagv2, 0, eagv10, eag, fidel68k_state, empty_init, "Fidelity Electronics", "Elite Avant Garde (model 6117-10)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_IMPERFECT_TIMING )
CONS( 2002, feagv11, feagv2, 0, eagv11, eag, fidel68k_state, empty_init, "hack (Wilfried Bucke)", "Elite Avant Garde (model 6117-11)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_IMPERFECT_TIMING )
CONS( 1989, feagv2, 0, 0, eag, eag, eag_state, init_eag, "Fidelity Electronics", "Elite Avant Garde (model 6114-2/3/4, set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1989, feagv2a, feagv2, 0, eag, eag, eag_state, init_eag, "Fidelity Electronics", "Elite Avant Garde (model 6114-2/3/4, set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1989, feagv5, feagv2, 0, eagv5, eag, eag_state, empty_init, "Fidelity Electronics", "Elite Avant Garde (model 6114-5)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_NOT_WORKING )
CONS( 1990, feagv7, feagv2, 0, eagv7, eag, eag_state, empty_init, "Fidelity Electronics", "Elite Avant Garde (model 6117-7, set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1990, feagv7a, feagv2, 0, eagv7, eag, eag_state, empty_init, "Fidelity Electronics", "Elite Avant Garde (model 6117-7, set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1990, feagv9, feagv2, 0, eagv9, eag, eag_state, empty_init, "Fidelity Electronics", "Elite Avant Garde (model 6117-9)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1990, feagv10, feagv2, 0, eagv10, eag, eag_state, empty_init, "Fidelity Electronics", "Elite Avant Garde (model 6117-10)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_IMPERFECT_TIMING )
CONS( 2002, feagv11, feagv2, 0, eagv11, eag, eag_state, empty_init, "hack (Wilfried Bucke)", "Elite Avant Garde (model 6117-11)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_IMPERFECT_TIMING )

View File

@ -3,18 +3,6 @@
// thanks-to:yoyo_chessboard
/******************************************************************************
Fidelity Electronics generic MCS-48 based chess computer driver
NOTE: MAME doesn't include a generalized implementation for boardpieces yet,
greatly affecting user playability of emulated electronic board games.
As workaround for the chess games, use an external chess GUI on the side,
such as Arena(in editmode).
TODO:
- nothing
******************************************************************************
Sensory Chess Challenger 6 (model SC6):
- PCB label 510-1045B01
- INS8040N-11 MCU, 11MHz XTAL
@ -41,10 +29,10 @@ SC6 program is contained in BO6 and CG6.
#include "fidel_sc6.lh" // clickable
class fidelmcs48_state : public fidelbase_state
class sc6_state : public fidelbase_state
{
public:
fidelmcs48_state(const machine_config &mconfig, device_type type, const char *tag) :
sc6_state(const machine_config &mconfig, device_type type, const char *tag) :
fidelbase_state(mconfig, type, tag),
m_maincpu(*this, "maincpu")
{ }
@ -52,30 +40,31 @@ public:
void sc6(machine_config &config);
private:
// devices/pointers
required_device<mcs48_cpu_device> m_maincpu;
// SC6
void sc6_prepare_display();
DECLARE_WRITE8_MEMBER(sc6_mux_w);
DECLARE_WRITE8_MEMBER(sc6_select_w);
DECLARE_READ8_MEMBER(sc6_input_r);
DECLARE_READ_LINE_MEMBER(sc6_input6_r);
DECLARE_READ_LINE_MEMBER(sc6_input7_r);
void sc6_map(address_map &map);
DECLARE_DEVICE_IMAGE_LOAD_MEMBER(sc6_cartridge);
void main_map(address_map &map);
DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cartridge);
// I/O handlers
void prepare_display();
DECLARE_WRITE8_MEMBER(mux_w);
DECLARE_WRITE8_MEMBER(select_w);
DECLARE_READ8_MEMBER(input_r);
DECLARE_READ_LINE_MEMBER(input6_r);
DECLARE_READ_LINE_MEMBER(input7_r);
};
// Devices, I/O
/******************************************************************************
SC6
Devices, I/O
******************************************************************************/
// cartridge
DEVICE_IMAGE_LOAD_MEMBER(fidelmcs48_state, sc6_cartridge)
DEVICE_IMAGE_LOAD_MEMBER(sc6_state, cartridge)
{
u32 size = m_cart->common_get_size("rom");
@ -95,14 +84,14 @@ DEVICE_IMAGE_LOAD_MEMBER(fidelmcs48_state, sc6_cartridge)
// MCU ports/generic
void fidelmcs48_state::sc6_prepare_display()
void sc6_state::prepare_display()
{
// 2 7seg leds
set_display_segmask(3, 0x7f);
display_matrix(7, 2, m_7seg_data, m_led_select);
}
WRITE8_MEMBER(fidelmcs48_state::sc6_mux_w)
WRITE8_MEMBER(sc6_state::mux_w)
{
// P24-P27: 7442 A-D
u16 sel = 1 << (data >> 4 & 0xf) & 0x3ff;
@ -110,32 +99,32 @@ WRITE8_MEMBER(fidelmcs48_state::sc6_mux_w)
// 7442 0-8: input mux, 7seg data
m_inp_mux = sel & 0x1ff;
m_7seg_data = sel & 0x7f;
sc6_prepare_display();
prepare_display();
// 7442 9: speaker out
m_dac->write(BIT(sel, 9));
}
WRITE8_MEMBER(fidelmcs48_state::sc6_select_w)
WRITE8_MEMBER(sc6_state::select_w)
{
// P16,P17: digit select
m_led_select = ~data >> 6 & 3;
sc6_prepare_display();
prepare_display();
}
READ8_MEMBER(fidelmcs48_state::sc6_input_r)
READ8_MEMBER(sc6_state::input_r)
{
// P10-P15: multiplexed inputs low
return (~read_inputs(9) & 0x3f) | 0xc0;
}
READ_LINE_MEMBER(fidelmcs48_state::sc6_input6_r)
READ_LINE_MEMBER(sc6_state::input6_r)
{
// T0: multiplexed inputs bit 6
return ~read_inputs(9) >> 6 & 1;
}
READ_LINE_MEMBER(fidelmcs48_state::sc6_input7_r)
READ_LINE_MEMBER(sc6_state::input7_r)
{
// T1: multiplexed inputs bit 7
return ~read_inputs(9) >> 7 & 1;
@ -147,9 +136,7 @@ READ_LINE_MEMBER(fidelmcs48_state::sc6_input7_r)
Address Maps
******************************************************************************/
// SC6
void fidelmcs48_state::sc6_map(address_map &map)
void sc6_state::main_map(address_map &map)
{
map(0x0000, 0x0fff).r("cartslot", FUNC(generic_slot_device::read_rom));
}
@ -180,16 +167,16 @@ INPUT_PORTS_END
Machine Drivers
******************************************************************************/
void fidelmcs48_state::sc6(machine_config &config)
void sc6_state::sc6(machine_config &config)
{
/* basic machine hardware */
I8040(config, m_maincpu, 11_MHz_XTAL);
m_maincpu->set_addrmap(AS_PROGRAM, &fidelmcs48_state::sc6_map);
m_maincpu->p2_out_cb().set(FUNC(fidelmcs48_state::sc6_mux_w));
m_maincpu->p1_in_cb().set(FUNC(fidelmcs48_state::sc6_input_r));
m_maincpu->p1_out_cb().set(FUNC(fidelmcs48_state::sc6_select_w));
m_maincpu->t0_in_cb().set(FUNC(fidelmcs48_state::sc6_input6_r));
m_maincpu->t1_in_cb().set(FUNC(fidelmcs48_state::sc6_input7_r));
m_maincpu->set_addrmap(AS_PROGRAM, &sc6_state::main_map);
m_maincpu->p2_out_cb().set(FUNC(sc6_state::mux_w));
m_maincpu->p1_in_cb().set(FUNC(sc6_state::input_r));
m_maincpu->p1_out_cb().set(FUNC(sc6_state::select_w));
m_maincpu->t0_in_cb().set(FUNC(sc6_state::input6_r));
m_maincpu->t1_in_cb().set(FUNC(sc6_state::input7_r));
TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_fidel_sc6);
@ -203,7 +190,7 @@ void fidelmcs48_state::sc6(machine_config &config)
/* cartridge */
generic_cartslot_device &cartslot(GENERIC_CARTSLOT(config, "cartslot", generic_plain_slot, "fidel_sc6", "bin"));
cartslot.set_device_load(device_image_load_delegate(&fidelmcs48_state::device_image_load_sc6_cartridge, this));
cartslot.set_device_load(device_image_load_delegate(&sc6_state::device_image_load_cartridge, this));
cartslot.set_must_be_loaded(true);
SOFTWARE_LIST(config, "cart_list").set_original("fidel_sc6");
@ -226,5 +213,5 @@ ROM_END
Drivers
******************************************************************************/
// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
CONS( 1982, fscc6, 0, 0, sc6, sc6, fidelmcs48_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger 6", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
CONS( 1982, fscc6, 0, 0, sc6, sc6, sc6_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger 6", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )

View File

@ -513,62 +513,6 @@ expect that the software reads these once on startup only.
#include "fidel_bv3.lh" // clickable
#include "fidel_vsc.lh" // clickable
class fidelz80_state : public fidelbase_state
{
public:
fidelz80_state(const machine_config &mconfig, device_type type, const char *tag) :
fidelbase_state(mconfig, type, tag),
m_z80pio(*this, "z80pio"),
m_ppi8255(*this, "ppi8255")
{ }
void bcc(machine_config &config);
void bkc(machine_config &config);
void scc(machine_config &config);
void vsc(machine_config &config);
void dsc(machine_config &config);
private:
// devices/pointers
optional_device<z80pio_device> m_z80pio;
optional_device<i8255_device> m_ppi8255;
// BCC, BKC
DECLARE_READ8_MEMBER(bcc_input_r);
DECLARE_WRITE8_MEMBER(bcc_control_w);
void bcc_io(address_map &map);
void bcc_map(address_map &map);
// SCC
DECLARE_READ8_MEMBER(scc_input_r);
DECLARE_WRITE8_MEMBER(scc_control_w);
void scc_io(address_map &map);
void scc_map(address_map &map);
// VSC
void vsc_prepare_display();
DECLARE_READ8_MEMBER(vsc_speech_r);
DECLARE_READ8_MEMBER(vsc_io_trampoline_r);
DECLARE_WRITE8_MEMBER(vsc_io_trampoline_w);
DECLARE_WRITE8_MEMBER(vsc_ppi_porta_w);
DECLARE_WRITE8_MEMBER(vsc_ppi_portb_w);
DECLARE_WRITE8_MEMBER(vsc_ppi_portc_w);
DECLARE_READ8_MEMBER(vsc_pio_porta_r);
DECLARE_READ8_MEMBER(vsc_pio_portb_r);
DECLARE_WRITE8_MEMBER(vsc_pio_portb_w);
void vsc_io(address_map &map);
void vsc_map(address_map &map);
// DSC
void dsc_prepare_display();
DECLARE_WRITE8_MEMBER(dsc_control_w);
DECLARE_WRITE8_MEMBER(dsc_select_w);
DECLARE_READ8_MEMBER(dsc_input_r);
void dsc_map(address_map &map);
};
// machine start/reset
void fidelbase_state::machine_start()
@ -613,6 +557,98 @@ void fidelbase_state::machine_reset()
class scc_state : public fidelbase_state
{
public:
scc_state(const machine_config &mconfig, device_type type, const char *tag) :
fidelbase_state(mconfig, type, tag)
{ }
void scc(machine_config &config);
private:
void main_map(address_map &map);
void main_io(address_map &map);
// I/O handlers
DECLARE_READ8_MEMBER(input_r);
DECLARE_WRITE8_MEMBER(control_w);
};
class dsc_state : public fidelbase_state
{
public:
dsc_state(const machine_config &mconfig, device_type type, const char *tag) :
fidelbase_state(mconfig, type, tag)
{ }
void dsc(machine_config &config);
private:
void main_map(address_map &map);
// I/O handlers
void prepare_display();
DECLARE_WRITE8_MEMBER(control_w);
DECLARE_WRITE8_MEMBER(select_w);
DECLARE_READ8_MEMBER(input_r);
};
class bcc_state : public fidelbase_state
{
public:
bcc_state(const machine_config &mconfig, device_type type, const char *tag) :
fidelbase_state(mconfig, type, tag)
{ }
void bcc(machine_config &config);
void bkc(machine_config &config);
private:
void main_map(address_map &map);
void main_io(address_map &map);
// I/O handlers
DECLARE_READ8_MEMBER(input_r);
DECLARE_WRITE8_MEMBER(control_w);
};
class vsc_state : public fidelbase_state
{
public:
vsc_state(const machine_config &mconfig, device_type type, const char *tag) :
fidelbase_state(mconfig, type, tag),
m_z80pio(*this, "z80pio"),
m_ppi8255(*this, "ppi8255")
{ }
void vsc(machine_config &config);
private:
// devices/pointers
required_device<z80pio_device> m_z80pio;
required_device<i8255_device> m_ppi8255;
void main_map(address_map &map);
void main_io(address_map &map);
DECLARE_READ8_MEMBER(main_io_trampoline_r);
DECLARE_WRITE8_MEMBER(main_io_trampoline_w);
// I/O handlers
void prepare_display();
DECLARE_READ8_MEMBER(speech_r);
DECLARE_WRITE8_MEMBER(ppi_porta_w);
DECLARE_WRITE8_MEMBER(ppi_portb_w);
DECLARE_WRITE8_MEMBER(ppi_portc_w);
DECLARE_READ8_MEMBER(pio_porta_r);
DECLARE_READ8_MEMBER(pio_portb_r);
DECLARE_WRITE8_MEMBER(pio_portb_w);
};
class ccx_state : public fidelbase_state
{
public:
@ -635,13 +671,15 @@ private:
TIMER_DEVICE_CALLBACK_MEMBER(beeper_off) { m_beeper->set_state(0); }
void ccx_prepare_display();
DECLARE_WRITE8_MEMBER(ccx_ppi_porta_w);
DECLARE_WRITE8_MEMBER(ccx_ppi_portb_w);
DECLARE_READ8_MEMBER(ccx_ppi_portc_r);
DECLARE_WRITE8_MEMBER(ccx_ppi_portc_w);
void ccx_io(address_map &map);
void ccx_map(address_map &map);
void main_map(address_map &map);
void main_io(address_map &map);
// I/O handlers
void prepare_display();
DECLARE_WRITE8_MEMBER(ppi_porta_w);
DECLARE_WRITE8_MEMBER(ppi_portb_w);
DECLARE_READ8_MEMBER(ppi_portc_r);
DECLARE_WRITE8_MEMBER(ppi_portc_w);
};
@ -666,13 +704,14 @@ private:
required_device<i8041_device> m_mcu;
required_device<i8243_device> m_i8243;
void vbrc_prepare_display();
DECLARE_WRITE8_MEMBER(vbrc_speech_w);
DECLARE_WRITE8_MEMBER(vbrc_mcu_p1_w);
DECLARE_READ8_MEMBER(vbrc_mcu_p2_r);
template<int P> void vbrc_ioexp_port_w(uint8_t data);
void vbrc_main_io(address_map &map);
void vbrc_main_map(address_map &map);
void main_map(address_map &map);
void main_io(address_map &map);
void prepare_display();
DECLARE_WRITE8_MEMBER(speech_w);
DECLARE_WRITE8_MEMBER(mcu_p1_w);
DECLARE_READ8_MEMBER(mcu_p2_r);
template<int P> void ioexp_port_w(uint8_t data);
};
@ -695,15 +734,17 @@ private:
// devices/pointers
required_device<i8255_device> m_ppi8255;
void vcc_prepare_display();
DECLARE_READ8_MEMBER(vcc_speech_r);
DECLARE_WRITE8_MEMBER(vcc_ppi_porta_w);
DECLARE_READ8_MEMBER(vcc_ppi_portb_r);
DECLARE_WRITE8_MEMBER(vcc_ppi_portb_w);
DECLARE_READ8_MEMBER(vcc_ppi_portc_r);
DECLARE_WRITE8_MEMBER(vcc_ppi_portc_w);
void vcc_io(address_map &map);
void vcc_map(address_map &map);
void main_map(address_map &map);
void main_io(address_map &map);
// I/O handlers
void prepare_display();
DECLARE_READ8_MEMBER(speech_r);
DECLARE_WRITE8_MEMBER(ppi_porta_w);
DECLARE_READ8_MEMBER(ppi_portb_r);
DECLARE_WRITE8_MEMBER(ppi_portb_w);
DECLARE_READ8_MEMBER(ppi_portc_r);
DECLARE_WRITE8_MEMBER(ppi_portc_w);
};
void vcc_state::machine_start()
@ -851,7 +892,7 @@ READ8_MEMBER(fidelbase_state::cartridge_r)
// misc handlers
void vcc_state::vcc_prepare_display()
void vcc_state::prepare_display()
{
// 4 7seg leds (note: sel d0 for extra leds)
u8 outdata = (m_7seg_data & 0x7f) | (m_led_select << 7 & 0x80);
@ -859,7 +900,7 @@ void vcc_state::vcc_prepare_display()
display_matrix(8, 4, outdata, m_led_select >> 2 & 0xf);
}
READ8_MEMBER(vcc_state::vcc_speech_r)
READ8_MEMBER(vcc_state::speech_r)
{
return m_speech_rom[m_speech_bank << 12 | offset];
}
@ -867,11 +908,11 @@ READ8_MEMBER(vcc_state::vcc_speech_r)
// I8255 PPI
WRITE8_MEMBER(vcc_state::vcc_ppi_porta_w)
WRITE8_MEMBER(vcc_state::ppi_porta_w)
{
// d0-d6: digit segment data, bits are xABCDEFG
m_7seg_data = bitswap<8>(data,7,0,1,2,3,4,5,6);
vcc_prepare_display();
prepare_display();
// d0-d5: TSI C0-C5
// d7: TSI START line
@ -887,28 +928,28 @@ WRITE8_MEMBER(vcc_state::vcc_ppi_porta_w)
}
}
READ8_MEMBER(vcc_state::vcc_ppi_portb_r)
READ8_MEMBER(vcc_state::ppi_portb_r)
{
// d7: TSI BUSY line
return (m_speech->busy_r()) ? 0x80 : 0x00;
}
WRITE8_MEMBER(vcc_state::vcc_ppi_portb_w)
WRITE8_MEMBER(vcc_state::ppi_portb_w)
{
// d0,d2-d5: digit/led select
// _d6: enable language switches
m_led_select = data;
vcc_prepare_display();
prepare_display();
}
READ8_MEMBER(vcc_state::vcc_ppi_portc_r)
READ8_MEMBER(vcc_state::ppi_portc_r)
{
// d0-d3: multiplexed inputs (active low), also language switches
u8 lan = (~m_led_select & 0x40) ? m_inp_matrix[4]->read() : 0;
return ~(lan | read_inputs(4)) & 0xf;
}
WRITE8_MEMBER(vcc_state::vcc_ppi_portc_w)
WRITE8_MEMBER(vcc_state::ppi_portc_w)
{
// d4-d7: input mux (inverted)
m_inp_mux = ~data >> 4 & 0xf;
@ -917,7 +958,7 @@ WRITE8_MEMBER(vcc_state::vcc_ppi_portc_w)
// CCX-specific (no speech chip, 1-bit beeper instead)
void ccx_state::ccx_prepare_display()
void ccx_state::prepare_display()
{
// 4 7seg leds (note: sel d0 for extra leds)
u8 outdata = (m_7seg_data & 0x7f) | (m_led_select << 7 & 0x80);
@ -928,7 +969,7 @@ void ccx_state::ccx_prepare_display()
// I8255 PPI
WRITE8_MEMBER(ccx_state::ccx_ppi_porta_w)
WRITE8_MEMBER(ccx_state::ppi_porta_w)
{
// d7: enable beeper on falling edge (555 monostable)
if (m_beeper && ~data & m_7seg_data & 0x80)
@ -939,23 +980,23 @@ WRITE8_MEMBER(ccx_state::ccx_ppi_porta_w)
// d0-d6: digit segment data
m_7seg_data = bitswap<8>(data,7,0,1,2,3,4,5,6);
ccx_prepare_display();
prepare_display();
}
WRITE8_MEMBER(ccx_state::ccx_ppi_portb_w)
WRITE8_MEMBER(ccx_state::ppi_portb_w)
{
// d0,d2-d5: digit/led select
m_led_select = data;
ccx_prepare_display();
prepare_display();
}
READ8_MEMBER(ccx_state::ccx_ppi_portc_r)
READ8_MEMBER(ccx_state::ppi_portc_r)
{
// d0-d3: multiplexed inputs (active low)
return ~read_inputs(4) & 0xf;
}
WRITE8_MEMBER(ccx_state::ccx_ppi_portc_w)
WRITE8_MEMBER(ccx_state::ppi_portc_w)
{
// d4-d7: input mux (inverted)
m_inp_mux = ~data >> 4 & 0xf;
@ -969,7 +1010,7 @@ WRITE8_MEMBER(ccx_state::ccx_ppi_portc_w)
// TTL
WRITE8_MEMBER(fidelz80_state::bcc_control_w)
WRITE8_MEMBER(bcc_state::control_w)
{
// a0-a2,d7: digit segment data via NE591
u8 mask = 1 << (offset & 7);
@ -986,7 +1027,7 @@ WRITE8_MEMBER(fidelz80_state::bcc_control_w)
m_inp_mux = data & 0xf;
}
READ8_MEMBER(fidelz80_state::bcc_input_r)
READ8_MEMBER(bcc_state::input_r)
{
// d0-d3: multiplexed inputs
return read_inputs(4);
@ -1000,7 +1041,7 @@ READ8_MEMBER(fidelz80_state::bcc_input_r)
// TTL
WRITE8_MEMBER(fidelz80_state::scc_control_w)
WRITE8_MEMBER(scc_state::control_w)
{
// a0-a2,d7: led data
u8 mask = 1 << (offset & 7);
@ -1013,7 +1054,7 @@ WRITE8_MEMBER(fidelz80_state::scc_control_w)
display_matrix(8, 9, m_led_data, (m_inp_mux & 0xff) | (data << 4 & 0x100));
}
READ8_MEMBER(fidelz80_state::scc_input_r)
READ8_MEMBER(scc_state::input_r)
{
// d0-d7: multiplexed inputs (active low)
return ~read_inputs(9);
@ -1027,14 +1068,14 @@ READ8_MEMBER(fidelz80_state::scc_input_r)
// misc handlers
void fidelz80_state::vsc_prepare_display()
void vsc_state::prepare_display()
{
// 4 7seg leds+H, 8*8 chessboard leds
set_display_segmask(0xf, 0x7f);
display_matrix(16, 8, m_led_data << 8 | m_7seg_data, m_led_select);
}
READ8_MEMBER(fidelz80_state::vsc_speech_r)
READ8_MEMBER(vsc_state::speech_r)
{
return m_speech_rom[m_speech_bank << 12 | offset];
}
@ -1042,42 +1083,42 @@ READ8_MEMBER(fidelz80_state::vsc_speech_r)
// I8255 PPI
WRITE8_MEMBER(fidelz80_state::vsc_ppi_porta_w)
WRITE8_MEMBER(vsc_state::ppi_porta_w)
{
// d0-d5: TSI C0-C5
m_speech->data_w(space, 0, data & 0x3f);
// d0-d7: data for the 4 7seg leds, bits are HGCBAFED (H is extra led)
m_7seg_data = bitswap<8>(data,7,6,2,1,0,5,4,3);
vsc_prepare_display();
prepare_display();
}
WRITE8_MEMBER(fidelz80_state::vsc_ppi_portb_w)
WRITE8_MEMBER(vsc_state::ppi_portb_w)
{
// d0-d7: led row data
m_led_data = data;
vsc_prepare_display();
prepare_display();
}
WRITE8_MEMBER(fidelz80_state::vsc_ppi_portc_w)
WRITE8_MEMBER(vsc_state::ppi_portc_w)
{
// d0-d3: select digits
// d0-d7: select leds, input mux low bits
m_inp_mux = (m_inp_mux & ~0xff) | data;
m_led_select = data;
vsc_prepare_display();
prepare_display();
}
// Z80 PIO
READ8_MEMBER(fidelz80_state::vsc_pio_porta_r)
READ8_MEMBER(vsc_state::pio_porta_r)
{
// d0-d7: multiplexed inputs
return read_inputs(11);
}
READ8_MEMBER(fidelz80_state::vsc_pio_portb_r)
READ8_MEMBER(vsc_state::pio_portb_r)
{
u8 data = 0;
@ -1087,7 +1128,7 @@ READ8_MEMBER(fidelz80_state::vsc_pio_portb_r)
return data;
}
WRITE8_MEMBER(fidelz80_state::vsc_pio_portb_w)
WRITE8_MEMBER(vsc_state::pio_portb_w)
{
// d0,d1: input mux highest bits
// d5: enable language switch
@ -1112,7 +1153,7 @@ WRITE8_MEMBER(fidelz80_state::vsc_pio_portb_w)
// misc handlers
void card_state::vbrc_prepare_display()
void card_state::prepare_display()
{
// 14seg led segments, d15(12) is extra led
u16 outdata = bitswap<16>(m_7seg_data,12,13,1,6,5,2,0,7,15,11,10,14,4,3,9,8);
@ -1120,7 +1161,7 @@ void card_state::vbrc_prepare_display()
display_matrix(16, 8, outdata, m_led_select);
}
WRITE8_MEMBER(card_state::vbrc_speech_w)
WRITE8_MEMBER(card_state::speech_w)
{
if (m_speech == nullptr)
return;
@ -1134,11 +1175,11 @@ WRITE8_MEMBER(card_state::vbrc_speech_w)
// I8243 I/O expander
template<int P>
void card_state::vbrc_ioexp_port_w(uint8_t data)
void card_state::ioexp_port_w(uint8_t data)
{
// P4x-P7x: digit segment data
m_7seg_data = (m_7seg_data & ~(0xf << (4*P))) | ((data & 0xf) << (4*P));
vbrc_prepare_display();
prepare_display();
// P71 is tone (not on speech model)
if (P == 3 && m_dac != nullptr)
@ -1148,14 +1189,14 @@ void card_state::vbrc_ioexp_port_w(uint8_t data)
// I8041 MCU
WRITE8_MEMBER(card_state::vbrc_mcu_p1_w)
WRITE8_MEMBER(card_state::mcu_p1_w)
{
// P10-P17: select digits, input mux
m_inp_mux = m_led_select = data;
vbrc_prepare_display();
prepare_display();
}
READ8_MEMBER(card_state::vbrc_mcu_p2_r)
READ8_MEMBER(card_state::mcu_p2_r)
{
// P20-P23: I8243 P2
// P24-P27: multiplexed inputs (active low)
@ -1170,32 +1211,32 @@ READ8_MEMBER(card_state::vbrc_mcu_p2_r)
// TTL
void fidelz80_state::dsc_prepare_display()
void dsc_state::prepare_display()
{
// 4 7seg leds
set_display_segmask(0xf, 0x7f);
display_matrix(8, 4, m_7seg_data, m_led_select);
}
WRITE8_MEMBER(fidelz80_state::dsc_control_w)
WRITE8_MEMBER(dsc_state::control_w)
{
// d0-d7: input mux, 7seg data
m_inp_mux = ~data;
m_7seg_data = data;
dsc_prepare_display();
prepare_display();
}
WRITE8_MEMBER(fidelz80_state::dsc_select_w)
WRITE8_MEMBER(dsc_state::select_w)
{
// d4: speaker out
m_dac->write(BIT(~data, 4));
// d0-d3: digit select
m_led_select = data & 0xf;
dsc_prepare_display();
prepare_display();
}
READ8_MEMBER(fidelz80_state::dsc_input_r)
READ8_MEMBER(dsc_state::input_r)
{
// d0-d7: multiplexed inputs (active low)
return ~read_inputs(8);
@ -1209,7 +1250,7 @@ READ8_MEMBER(fidelz80_state::dsc_input_r)
// CCX, VCC/UVC
void ccx_state::ccx_map(address_map &map)
void ccx_state::main_map(address_map &map)
{
map.unmap_value_high();
map.global_mask(0x3fff);
@ -1218,20 +1259,20 @@ void ccx_state::ccx_map(address_map &map)
map(0x3000, 0x30ff).mirror(0x0f00).ram();
}
void ccx_state::ccx_io(address_map &map)
void ccx_state::main_io(address_map &map)
{
map.global_mask(0x03);
map(0x00, 0x03).rw(m_ppi8255, FUNC(i8255_device::read), FUNC(i8255_device::write));
}
void vcc_state::vcc_map(address_map &map)
void vcc_state::main_map(address_map &map)
{
map.unmap_value_high();
map(0x0000, 0x2fff).rom();
map(0x4000, 0x43ff).mirror(0x1c00).ram();
}
void vcc_state::vcc_io(address_map &map)
void vcc_state::main_io(address_map &map)
{
map.global_mask(0x03);
map(0x00, 0x03).rw(m_ppi8255, FUNC(i8255_device::read), FUNC(i8255_device::write));
@ -1240,7 +1281,7 @@ void vcc_state::vcc_io(address_map &map)
// BCC, BKC
void fidelz80_state::bcc_map(address_map &map)
void bcc_state::main_map(address_map &map)
{
map.unmap_value_high();
map.global_mask(0x3fff);
@ -1248,31 +1289,31 @@ void fidelz80_state::bcc_map(address_map &map)
map(0x3000, 0x30ff).mirror(0x0f00).ram();
}
void fidelz80_state::bcc_io(address_map &map)
void bcc_state::main_io(address_map &map)
{
map.global_mask(0x07);
map(0x00, 0x07).rw(FUNC(fidelz80_state::bcc_input_r), FUNC(fidelz80_state::bcc_control_w));
map(0x00, 0x07).rw(FUNC(bcc_state::input_r), FUNC(bcc_state::control_w));
}
// SCC
void fidelz80_state::scc_map(address_map &map)
void scc_state::main_map(address_map &map)
{
map(0x0000, 0x0fff).rom();
map(0x5000, 0x50ff).ram();
}
void fidelz80_state::scc_io(address_map &map)
void scc_state::main_io(address_map &map)
{
map.global_mask(0x07);
map(0x00, 0x07).rw(FUNC(fidelz80_state::scc_input_r), FUNC(fidelz80_state::scc_control_w));
map(0x00, 0x07).rw(FUNC(scc_state::input_r), FUNC(scc_state::control_w));
}
// VSC
void fidelz80_state::vsc_map(address_map &map)
void vsc_state::main_map(address_map &map)
{
map.unmap_value_high();
map(0x0000, 0x3fff).rom();
@ -1281,7 +1322,7 @@ void fidelz80_state::vsc_map(address_map &map)
}
// VSC io: A2 is 8255 _CE, A3 is Z80 PIO _CE - in theory, both chips can be accessed simultaneously
READ8_MEMBER(fidelz80_state::vsc_io_trampoline_r)
READ8_MEMBER(vsc_state::main_io_trampoline_r)
{
u8 data = 0xff; // open bus
if (~offset & 4)
@ -1292,7 +1333,7 @@ READ8_MEMBER(fidelz80_state::vsc_io_trampoline_r)
return data;
}
WRITE8_MEMBER(fidelz80_state::vsc_io_trampoline_w)
WRITE8_MEMBER(vsc_state::main_io_trampoline_w)
{
if (~offset & 4)
m_ppi8255->write(offset & 3, data);
@ -1300,24 +1341,24 @@ WRITE8_MEMBER(fidelz80_state::vsc_io_trampoline_w)
m_z80pio->write(space, offset & 3, data);
}
void fidelz80_state::vsc_io(address_map &map)
void vsc_state::main_io(address_map &map)
{
map.global_mask(0x0f);
map(0x00, 0x0f).rw(FUNC(fidelz80_state::vsc_io_trampoline_r), FUNC(fidelz80_state::vsc_io_trampoline_w));
map(0x00, 0x0f).rw(FUNC(vsc_state::main_io_trampoline_r), FUNC(vsc_state::main_io_trampoline_w));
}
// VBRC/UBC, BV3
void card_state::vbrc_main_map(address_map &map)
void card_state::main_map(address_map &map)
{
map.unmap_value_high();
map(0x0000, 0x5fff).rom();
map(0x6000, 0x63ff).mirror(0x1c00).ram();
map(0xe000, 0xe000).mirror(0x1fff).w(FUNC(card_state::vbrc_speech_w));
map(0xe000, 0xe000).mirror(0x1fff).w(FUNC(card_state::speech_w));
}
void card_state::vbrc_main_io(address_map &map)
void card_state::main_io(address_map &map)
{
map.global_mask(0x01);
map(0x00, 0x01).rw(m_mcu, FUNC(i8041_device::upi41_master_r), FUNC(i8041_device::upi41_master_w));
@ -1326,13 +1367,13 @@ void card_state::vbrc_main_io(address_map &map)
// DSC
void fidelz80_state::dsc_map(address_map &map)
void dsc_state::main_map(address_map &map)
{
map.unmap_value_high();
map(0x0000, 0x1fff).rom();
map(0x4000, 0x4000).mirror(0x1fff).w(FUNC(fidelz80_state::dsc_control_w));
map(0x6000, 0x6000).mirror(0x1fff).w(FUNC(fidelz80_state::dsc_select_w));
map(0x8000, 0x8000).mirror(0x1fff).r(FUNC(fidelz80_state::dsc_input_r));
map(0x4000, 0x4000).mirror(0x1fff).w(FUNC(dsc_state::control_w));
map(0x6000, 0x6000).mirror(0x1fff).w(FUNC(dsc_state::select_w));
map(0x8000, 0x8000).mirror(0x1fff).r(FUNC(dsc_state::input_r));
map(0xa000, 0xa3ff).mirror(0x1c00).ram();
}
@ -1868,18 +1909,18 @@ INPUT_PORTS_END
Machine Drivers
******************************************************************************/
void fidelz80_state::bkc(machine_config &config)
void bcc_state::bkc(machine_config &config)
{
/* basic machine hardware */
Z80(config, m_maincpu, 3.579545_MHz_XTAL);
m_maincpu->set_addrmap(AS_PROGRAM, &fidelz80_state::bcc_map);
m_maincpu->set_addrmap(AS_IO, &fidelz80_state::bcc_io);
m_maincpu->set_addrmap(AS_PROGRAM, &bcc_state::main_map);
m_maincpu->set_addrmap(AS_IO, &bcc_state::main_io);
TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_fidel_bkc);
}
void fidelz80_state::bcc(machine_config &config)
void bcc_state::bcc(machine_config &config)
{
bkc(config);
config.set_default_layout(layout_fidel_bcc);
@ -1892,12 +1933,12 @@ void fidelz80_state::bcc(machine_config &config)
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
}
void fidelz80_state::scc(machine_config &config)
void scc_state::scc(machine_config &config)
{
/* basic machine hardware */
Z80(config, m_maincpu, 3.9_MHz_XTAL);
m_maincpu->set_addrmap(AS_PROGRAM, &fidelz80_state::scc_map);
m_maincpu->set_addrmap(AS_IO, &fidelz80_state::scc_io);
m_maincpu->set_addrmap(AS_PROGRAM, &scc_state::main_map);
m_maincpu->set_addrmap(AS_IO, &scc_state::main_io);
TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_fidel_sc8);
@ -1914,17 +1955,17 @@ void ccx_state::ccx(machine_config &config)
{
/* basic machine hardware */
Z80(config, m_maincpu, 4_MHz_XTAL);
m_maincpu->set_addrmap(AS_PROGRAM, &ccx_state::ccx_map);
m_maincpu->set_addrmap(AS_IO, &ccx_state::ccx_io);
m_maincpu->set_addrmap(AS_PROGRAM, &ccx_state::main_map);
m_maincpu->set_addrmap(AS_IO, &ccx_state::main_io);
I8255(config, m_ppi8255);
m_ppi8255->out_pa_callback().set(FUNC(ccx_state::ccx_ppi_porta_w));
m_ppi8255->out_pa_callback().set(FUNC(ccx_state::ppi_porta_w));
m_ppi8255->tri_pa_callback().set_constant(0);
m_ppi8255->in_pb_callback().set_ioport("LEVEL");
m_ppi8255->out_pb_callback().set(FUNC(ccx_state::ccx_ppi_portb_w));
m_ppi8255->in_pc_callback().set(FUNC(ccx_state::ccx_ppi_portc_r));
m_ppi8255->out_pb_callback().set(FUNC(ccx_state::ppi_portb_w));
m_ppi8255->in_pc_callback().set(FUNC(ccx_state::ppi_portc_r));
m_ppi8255->tri_pb_callback().set_constant(0);
m_ppi8255->out_pc_callback().set(FUNC(ccx_state::ccx_ppi_portc_w));
m_ppi8255->out_pc_callback().set(FUNC(ccx_state::ppi_portc_w));
TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_fidel_cc10);
@ -1940,17 +1981,17 @@ void vcc_state::vcc(machine_config &config)
{
/* basic machine hardware */
Z80(config, m_maincpu, 4_MHz_XTAL);
m_maincpu->set_addrmap(AS_PROGRAM, &vcc_state::vcc_map);
m_maincpu->set_addrmap(AS_IO, &vcc_state::vcc_io);
m_maincpu->set_addrmap(AS_PROGRAM, &vcc_state::main_map);
m_maincpu->set_addrmap(AS_IO, &vcc_state::main_io);
I8255(config, m_ppi8255);
m_ppi8255->out_pa_callback().set(FUNC(vcc_state::vcc_ppi_porta_w));
m_ppi8255->out_pa_callback().set(FUNC(vcc_state::ppi_porta_w));
m_ppi8255->tri_pa_callback().set_constant(0);
m_ppi8255->in_pb_callback().set(FUNC(vcc_state::vcc_ppi_portb_r));
m_ppi8255->out_pb_callback().set(FUNC(vcc_state::vcc_ppi_portb_w));
m_ppi8255->in_pb_callback().set(FUNC(vcc_state::ppi_portb_r));
m_ppi8255->out_pb_callback().set(FUNC(vcc_state::ppi_portb_w));
m_ppi8255->tri_pb_callback().set_constant(0);
m_ppi8255->in_pc_callback().set(FUNC(vcc_state::vcc_ppi_portc_r));
m_ppi8255->out_pc_callback().set(FUNC(vcc_state::vcc_ppi_portc_w));
m_ppi8255->in_pc_callback().set(FUNC(vcc_state::ppi_portc_r));
m_ppi8255->out_pc_callback().set(FUNC(vcc_state::ppi_portc_w));
TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_fidel_vcc);
@ -1958,31 +1999,31 @@ void vcc_state::vcc(machine_config &config)
/* sound hardware */
SPEAKER(config, "speaker").front_center();
S14001A(config, m_speech, 25000); // R/C circuit, around 25khz
m_speech->ext_read().set(FUNC(vcc_state::vcc_speech_r));
m_speech->ext_read().set(FUNC(vcc_state::speech_r));
m_speech->add_route(ALL_OUTPUTS, "speaker", 0.75);
}
void fidelz80_state::vsc(machine_config &config)
void vsc_state::vsc(machine_config &config)
{
/* basic machine hardware */
Z80(config, m_maincpu, 3.9_MHz_XTAL); // 3.9MHz resonator
m_maincpu->set_addrmap(AS_PROGRAM, &fidelz80_state::vsc_map);
m_maincpu->set_addrmap(AS_IO, &fidelz80_state::vsc_io);
m_maincpu->set_addrmap(AS_PROGRAM, &vsc_state::main_map);
m_maincpu->set_addrmap(AS_IO, &vsc_state::main_io);
const attotime irq_period = attotime::from_hz(587); // 555 timer, measured
TIMER(config, m_irq_on).configure_periodic(FUNC(fidelz80_state::irq_on<INPUT_LINE_NMI>), irq_period);
TIMER(config, m_irq_on).configure_periodic(FUNC(vsc_state::irq_on<INPUT_LINE_NMI>), irq_period);
m_irq_on->set_start_delay(irq_period - attotime::from_usec(845)); // active for 0.845ms (approx half)
TIMER(config, "irq_off").configure_periodic(FUNC(fidelz80_state::irq_off<INPUT_LINE_NMI>), irq_period);
TIMER(config, "irq_off").configure_periodic(FUNC(vsc_state::irq_off<INPUT_LINE_NMI>), irq_period);
I8255(config, m_ppi8255);
m_ppi8255->out_pa_callback().set(FUNC(fidelz80_state::vsc_ppi_porta_w));
m_ppi8255->out_pb_callback().set(FUNC(fidelz80_state::vsc_ppi_portb_w));
m_ppi8255->out_pc_callback().set(FUNC(fidelz80_state::vsc_ppi_portc_w));
m_ppi8255->out_pa_callback().set(FUNC(vsc_state::ppi_porta_w));
m_ppi8255->out_pb_callback().set(FUNC(vsc_state::ppi_portb_w));
m_ppi8255->out_pc_callback().set(FUNC(vsc_state::ppi_portc_w));
Z80PIO(config, m_z80pio, 3.9_MHz_XTAL);
m_z80pio->in_pa_callback().set(FUNC(fidelz80_state::vsc_pio_porta_r));
m_z80pio->in_pb_callback().set(FUNC(fidelz80_state::vsc_pio_portb_r));
m_z80pio->out_pb_callback().set(FUNC(fidelz80_state::vsc_pio_portb_w));
m_z80pio->in_pa_callback().set(FUNC(vsc_state::pio_porta_r));
m_z80pio->in_pb_callback().set(FUNC(vsc_state::pio_portb_r));
m_z80pio->out_pb_callback().set(FUNC(vsc_state::pio_portb_w));
TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_fidel_vsc);
@ -1990,7 +2031,7 @@ void fidelz80_state::vsc(machine_config &config)
/* sound hardware */
SPEAKER(config, "speaker").front_center();
S14001A(config, m_speech, 25000); // R/C circuit, around 25khz
m_speech->ext_read().set(FUNC(fidelz80_state::vsc_speech_r));
m_speech->ext_read().set(FUNC(vsc_state::speech_r));
m_speech->add_route(ALL_OUTPUTS, "speaker", 0.75);
}
@ -1998,13 +2039,13 @@ void card_state::brc_base(machine_config &config)
{
/* basic machine hardware */
Z80(config, m_maincpu, 5_MHz_XTAL/2);
m_maincpu->set_addrmap(AS_PROGRAM, &card_state::vbrc_main_map);
m_maincpu->set_addrmap(AS_IO, &card_state::vbrc_main_io);
m_maincpu->set_addrmap(AS_PROGRAM, &card_state::main_map);
m_maincpu->set_addrmap(AS_IO, &card_state::main_io);
config.m_perfect_cpu_quantum = subtag("maincpu");
I8041(config, m_mcu, 5_MHz_XTAL);
m_mcu->p1_out_cb().set(FUNC(card_state::vbrc_mcu_p1_w));
m_mcu->p2_in_cb().set(FUNC(card_state::vbrc_mcu_p2_r));
m_mcu->p1_out_cb().set(FUNC(card_state::mcu_p1_w));
m_mcu->p2_in_cb().set(FUNC(card_state::mcu_p2_r));
m_mcu->p2_out_cb().set(m_i8243, FUNC(i8243_device::p2_w));
m_mcu->prog_out_cb().set(m_i8243, FUNC(i8243_device::prog_w));
m_mcu->t0_in_cb().set_ioport("BARCODE"); // card scanner
@ -2014,10 +2055,10 @@ void card_state::brc_base(machine_config &config)
m_mcu->t1_in_cb().set("t1_clock", FUNC(clock_device::signal_r)).invert();
I8243(config, m_i8243);
m_i8243->p4_out_cb().set(FUNC(card_state::vbrc_ioexp_port_w<0>));
m_i8243->p5_out_cb().set(FUNC(card_state::vbrc_ioexp_port_w<1>));
m_i8243->p6_out_cb().set(FUNC(card_state::vbrc_ioexp_port_w<2>));
m_i8243->p7_out_cb().set(FUNC(card_state::vbrc_ioexp_port_w<3>));
m_i8243->p4_out_cb().set(FUNC(card_state::ioexp_port_w<0>));
m_i8243->p5_out_cb().set(FUNC(card_state::ioexp_port_w<1>));
m_i8243->p6_out_cb().set(FUNC(card_state::ioexp_port_w<2>));
m_i8243->p7_out_cb().set(FUNC(card_state::ioexp_port_w<3>));
TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_fidel_vbrc);
@ -2052,16 +2093,16 @@ void card_state::bv3(machine_config &config)
config.set_default_layout(layout_fidel_bv3);
}
void fidelz80_state::dsc(machine_config &config)
void dsc_state::dsc(machine_config &config)
{
/* basic machine hardware */
Z80(config, m_maincpu, 3.9_MHz_XTAL); // 3.9MHz resonator
m_maincpu->set_addrmap(AS_PROGRAM, &fidelz80_state::dsc_map);
m_maincpu->set_addrmap(AS_PROGRAM, &dsc_state::main_map);
const attotime irq_period = attotime::from_hz(523); // from 555 timer (22nF, 120K, 2.7K)
TIMER(config, m_irq_on).configure_periodic(FUNC(fidelz80_state::irq_on<INPUT_LINE_IRQ0>), irq_period);
TIMER(config, m_irq_on).configure_periodic(FUNC(dsc_state::irq_on<INPUT_LINE_IRQ0>), irq_period);
m_irq_on->set_start_delay(irq_period - attotime::from_usec(41)); // active for 41us
TIMER(config, "irq_off").configure_periodic(FUNC(fidelz80_state::irq_off<INPUT_LINE_IRQ0>), irq_period);
TIMER(config, "irq_off").configure_periodic(FUNC(dsc_state::irq_off<INPUT_LINE_IRQ0>), irq_period);
TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_fidel_dsc);
@ -2277,10 +2318,10 @@ ROM_END
// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY FULLNAME, FLAGS
CONS( 1978, cc10, 0, 0, ccx, ccx, ccx_state, empty_init, "Fidelity Electronics", "Chess Challenger 10 (model CCX, rev. B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
CONS( 1979, cc7, 0, 0, bcc, bcc, fidelz80_state, empty_init, "Fidelity Electronics", "Chess Challenger 7 (model BCC, rev. B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
CONS( 1979, backgamc, 0, 0, bkc, bkc, fidelz80_state, empty_init, "Fidelity Electronics", "Backgammon Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_NO_SOUND_HW )
CONS( 1979, cc7, 0, 0, bcc, bcc, bcc_state, empty_init, "Fidelity Electronics", "Chess Challenger 7 (model BCC, rev. B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
CONS( 1979, backgamc, 0, 0, bkc, bkc, bcc_state, empty_init, "Fidelity Electronics", "Backgammon Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_NO_SOUND_HW )
CONS( 1980, fscc8, 0, 0, scc, scc, fidelz80_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger 8", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1980, fscc8, 0, 0, scc, scc, scc_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger 8", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1979, vcc, 0, 0, vcc, vcc, vcc_state, empty_init, "Fidelity Electronics", "Voice Chess Challenger (English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
CONS( 1979, vccsp, vcc, 0, vcc, vccsp, vcc_state, empty_init, "Fidelity Electronics", "Voice Chess Challenger (Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
@ -2292,13 +2333,13 @@ CONS( 1980, uvcsp, vcc, 0, vcc, vccsp, vcc_state, empty_init, "Fidelit
CONS( 1980, uvcg, vcc, 0, vcc, vccg, vcc_state, empty_init, "Fidelity Electronics", "Advanced Voice Chess Challenger (German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
CONS( 1980, uvcfr, vcc, 0, vcc, vccfr, vcc_state, empty_init, "Fidelity Electronics", "Advanced Voice Chess Challenger (French)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
CONS( 1980, vsc, 0, 0, vsc, vsc, fidelz80_state, empty_init, "Fidelity Electronics", "Voice Sensory Chess Challenger (English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1980, vscsp, vsc, 0, vsc, vscsp, fidelz80_state, empty_init, "Fidelity Electronics", "Voice Sensory Chess Challenger (Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1980, vscg, vsc, 0, vsc, vscg, fidelz80_state, empty_init, "Fidelity Electronics", "Voice Sensory Chess Challenger (German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1980, vscfr, vsc, 0, vsc, vscfr, fidelz80_state, empty_init, "Fidelity Electronics", "Voice Sensory Chess Challenger (French)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1980, vsc, 0, 0, vsc, vsc, vsc_state, empty_init, "Fidelity Electronics", "Voice Sensory Chess Challenger (English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1980, vscsp, vsc, 0, vsc, vscsp, vsc_state, empty_init, "Fidelity Electronics", "Voice Sensory Chess Challenger (Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1980, vscg, vsc, 0, vsc, vscg, vsc_state, empty_init, "Fidelity Electronics", "Voice Sensory Chess Challenger (German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1980, vscfr, vsc, 0, vsc, vscfr, vsc_state, empty_init, "Fidelity Electronics", "Voice Sensory Chess Challenger (French)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1980, vbrc, 0, 0, vbrc, vbrc, card_state, empty_init, "Fidelity Electronics", "Voice Bridge Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_NOT_WORKING )
CONS( 1980, bridgeca, vbrc, 0, ubc, vbrc, card_state, empty_init, "Fidelity Electronics", "Advanced Bridge Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_NOT_WORKING )
CONS( 1982, bridgec3, 0, 0, bv3, bv3, card_state, empty_init, "Fidelity Electronics", "Bridge Challenger III", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_NOT_WORKING )
CONS( 1981, damesc, 0, 0, dsc, dsc, fidelz80_state, empty_init, "Fidelity Electronics", "Dame Sensory Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1981, damesc, 0, 0, dsc, dsc, dsc_state, empty_init, "Fidelity Electronics", "Dame Sensory Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )

View File

@ -327,19 +327,21 @@ Crazy Taxi 840-0002C ? 13 (64Mb) ?
Ferrari F355 Challenge (twin/deluxe, preview) no cart 22848P* 21 (64Mb) present 315-6206 317-0267-COM * other ROM board we've seen had 2x flashroms PCB instead of IC22 EEPROM, contents is the same.
/Ferrari F355 Challenge 2 - International
\Course Edition (twin/deluxe, prototype) no cart 23399 21 (64Mb) present 315-6206 317-0287-COM content is the same as regular 171-7919A cart
Mushiking (MUSHIUSA '04 1ST, Prototype) no sticker none 11*(64Mb) present 315-6206 not present * only first 7 flash roms contain game data, PCB have label 840-0150B-FLS.
Inu No Osanpo / Dog Walking (Rev A) 840-0073C 22294A 16 (64Mb) present 315-6206 317-0316-JPN requires 837-13844 JVS IO with DIPSW 1 ON
Samba de Amigo (prototype) no cart * 21*(64Mb) present 315-6206 317-0270-COM * only first 14 flash roms contain game data, instead of EPROM have tiny PCB with 2 flashroms on it
Shootout Pool Prize Ver.B -P 840-0136C ** 21*(64Mb) present 317-6206 not present * only first 4 flash roms contain game data, ** instead of EPROM have tiny PCB with 2 flashroms on it
/Mushiking The King Of Beetle
\(MUSHIUSA '04 1ST, Prototype) not present none 11*(64Mb) present 315-6206 not present * only first 7 flash roms contain game data, PCB have label 840-0150B-FLS.
Samba de Amigo (prototype) no cart ** 21*(64Mb) present 315-6206 317-0270-COM * only first 14 flash roms contain game data, ** instead of EPROM have tiny PCB with 2 flashroms on it
/Shootout Pool Prize (Export) / Shootout
\Pool The Medal (Japan) Version B (prototype) 840-0136C ** 21*(64Mb) present 317-6206 not present * only first 4 flash roms contain game data, ** instead of EPROM have tiny PCB with 2 flashroms on it
Soul Surfer (Rev A) 840-0095C 23838C 21 (64Mb) present 315-6206 not present
Star Horse (live and backup) 840-0055B 23626 17 (64Mb) present 315-6206 not present requires 837-13785 ARCNET&IO BD
Horse Data 840-0034B - 2 (64Mb) present 315-6206 not present not contain game data, used in stack with 840-0121(sound&backup) ROM board as game backup data storage, have JP3 and JP4 in position 2-3
Star Horse Progress (backup data) 840-0034B - 2 (64Mb) present 315-6206 not present not contain game data, used in stack with 840-0121(sound&backup) ROM board as game backup data storage, have JP3 and JP4 in position 2-3
The House of the Dead 2 (prototype) no cart A1E2 21 (64Mb) present 315-6206 present no label on IC42
The King of Route 66 (prototype) no cart 23819* 21 (64Mb) present 315-6206 not present * flash-PCB with printed label "EPR-23819 IC22 0109 CHK" handwritten "1/11"
The King of Route 66 (Rev A) 840-0087C 23819A 20 (64Mb) present 315-6206 not present content is the same as regular 171-8132A cart
The King of Route 66 (prototype) no cart 23819* 21 (64Mb) present 315-6206 not present * flash-PCB with printed label "EPR-23819 IC22 0109 CHK" handwritten "1/11" - it is assumed that only 20 flash roms are used
The King of Route 66 (Rev A) 840-0087C 23819A 20 (64Mb) present 315-6206 not present content is the same as regular 171-8132B cart
The Maze of the Kings (prototype) no cart * 21 (64Mb) present 315-6206 FRI * flash-PCB, not dumped but known to exist
Tokyo Bus Guide (Rev A) 840-0045C 23468A 18 (64Mb) present 315-6206 317-0290-COM requires 837-13844 JVS IO
Virtua Athletics (prototype) no cart none 21*(64Mb) present 315-6206 present * only first 14 flash roms contain game data, have Japan text label "Overseas sales (NA & EU)"
Virtua Athletics / Virtua Athlete (prototype) no cart none 21*(64Mb) present 315-6206 present * only first 14 flash roms contain game data, have Japan text label "Overseas sales (NA & EU)"
Virtua NBA (prototype) no cart * 21 (64Mb) present 315-6206 317-0271-COM * instead of EPROM have tiny PCB with 2 flashroms on it
Virtua NBA (prototype, 15.11) no cart * 21 (64Mb) present 315-6206 317-0271-COM * instead of EPROM have tiny PCB with 2 flashroms on it
Virtua Tennis / Power Smash (prototype) no cart * 21 (64Mb) present 315-6206 317-0263-COM * flash-PCB, title screen have label "SOFT R&D Dept.#3", not dumped but known to exist
@ -379,7 +381,9 @@ Games known to use this PCB include....
Sticker EPROM mask ROMs X76F100 XC9536 315-5881
Game on cart IC22# # of SOP44 IC37# IC41# IC42# Notes
------------------------------------------------------------------------------------------------------------------------------
18 Wheeler (deluxe) (Rev A) 840-0023C 22185A 20 (64Mb) present 315-6213 317-0273-COM
18 Wheeler (deluxe) ? 22185 20 (64Mb) ? ? ?
18 Wheeler (deluxe, Rev A) 840-0023C 22185A 20 (64Mb) present 315-6213 317-0273-COM
18 Wheeler (deluxe, Rev T) ? 22185T 20 (64Mb) ? ? ?
18 Wheeler (standard) 840-0036C 23298 20 (64Mb) present 315-6213 317-0273-COM
18 Wheeler (upright) 840-0037C 23299 20 (64Mb) present 315-6213 317-0273-COM
Airline Pilots (World, Rev B) ? 21787B 11 (64Mb) present 315-6213 317-0251-COM 2 known BIOS 21801 (USA), 21802 (EXP)
@ -391,16 +395,17 @@ Dead Or Alive 2 (Rev A) 841-0003C 22121A 21 (64Mb)
Dead Or Alive 2 841-0003C-01 22207 21 (64Mb) present 315-6213 317-5048-COM have unlocked Tag and Survival game modes, possible USA or international release
Dead Or Alive 2 Millennium 841-0003C DOA2 Ver.M 21 (64Mb) present 315-6213 317-5048-COM joystick + 3 buttons
Death Crimson OX 841-0016C 23524 10 (64Mb) present 315-6213 317-5066-COM
Death Crimson OX 841-0016C 23524A 10 (64Mb) present 315-6213 317-5066-COM cart case had no revision label
Death Crimson OX (Rev A) 841-0016C 23524A 10 (64Mb) present 315-6213 317-5066-COM cart case had no revision label
Dengen Tenshi Taisen Janshi Shangri-La 841-0004C 22060 12 (64Mb) ? 315-6213 317-5050-JPN
Derby Owners Club (Japan) (Rev B) 840-0016C 22099B 14 (64Mb) ? 315-6213 317-0262-JPN touch panel + 2 buttons + card reader
Derby Owners Club (Japan, Rev B) 840-0016C 22099B 14 (64Mb) ? 315-6213 317-0262-JPN touch panel + 2 buttons + card reader
Derby Owners Club 2000 (Japan) * 22222 16 (64Mb) present 315-6213 not present * no cart, master unit stickers: 833-13937-01, DOC 4050-01, DOC S. not dumped.
Derby Owners Club 2000 Ver.2 (Japan) (Rev A) 840-0052C 22284A 16 (64Mb) present 315-6213 not present
Dynamite Baseball '99 (Japan) (Rev B) 840-0019C 22141B 19 (64Mb) ? 315-6213 317-0269-JPN requires special panel (joystick + 2 buttons + bat controller for each player)
Derby Owners Club 2000 Ver.2 (Japan, Rev A) 840-0052C 22284A 16 (64Mb) present 315-6213 not present
Dynamite Baseball '99 (Japan, Rev B) 840-0019C 22141B 19 (64Mb) ? 315-6213 317-0269-JPN requires special panel (joystick + 2 buttons + bat controller for each player)
Dynamite Baseball NAOMI (Japan) 840-0001C 21575 21 (64Mb) ? 315-6213 317-0246-JPN requires special panel (joystick + 2 buttons + bat controller for each player)
Ferrari F355 Challenge (deluxe, no link) 834-13842 21902 21 (64Mb) present 315-6213 317-0254-COM BIOS 21862 (JPN), 21863 (USA), 21864 (EXP)
Ferrari F355 Challenge (twin/deluxe) 834-13950 22848 21 (64Mb) present 315-6213 317-0267-COM BIOS 22849 (JPN), 22850 (USA), 22851 (EXP)
Ferrari F355 Challenge 2 (twin/deluxe) 840-0042C 23399 21 (64Mb) present 315-6213 317-0287-COM BIOS 22849 (JPN), 22850 (USA), 22851 (EXP)
/Ferrari F355 Challenge 2 - International
\Course Edition (twin/deluxe) 840-0042C 23399 21 (64Mb) present 315-6213 317-0287-COM BIOS 22849 (JPN), 22850 (USA), 22851 (EXP)
Giant Gram: All Japan Pro Wrestling 2 840-0007C 21820 9 (64Mb) ? 315-6213 317-0253-JPN joystick + 3 buttons
Guilty Gear X 841-0013C 23356 14 (64Mb) present 315-6213 317-5063-COM
Gun Spike 841-0012C 23210 12 (64Mb) present 315-6213 317-5060-COM \same ROM board
@ -409,13 +414,15 @@ Heavy Metal Geomatrix (Rev B) HMG016007 23716A 11 (64Mb)
Idol Janshi Suchie-Pai 3 841-0002C 21979 14 (64Mb) ? 315-6213 317-5047-JPN requires mahjong panel
Jambo! Safari (Rev A) 840-0013C 22826A 8 (64Mb) ? 315-6213 317-0264-COM
Mars TV 840-0025C 22993 15 (64Mb) present 315-6213 317-0274-JPN
Marvel Vs. Capcom 2 (USA) (Rev A) 841-0007C-01 23062A 14 (64Mb) present 315-6213 317-5053-COM
Marvel Vs. Capcom 2 (USA, Rev A) 841-0007C-01 23062A 14 (64Mb) present 315-6213 317-5053-COM
OutTrigger 840-0017C 22163 19 (64Mb) ? 315-6213 317-0266-COM requires regular 837-13551 and 837-13938 rotary JVS boards, and special panel
Power Stone 841-0001C 21597 8 (64Mb) present 315-6213 317-5046-COM joystick + 3 buttons
Power Stone 2 841-0008C 23127 9 (64Mb) present 315-6213 317-5054-COM joystick + 3 buttons
Puyo Puyo Da! 841-0006C 22206 20 (64Mb) ? 315-6213 317-5052-COM
Ring Out 4x4 840-0004C 21779 10 (64Mb) present 315-6213 317-0250-COM requires 2 JVS boards
Samba de Amigo (Rev B) (Rev A) 840-0020C 22966B 16 (64Mb) present 315-6213 317-0270-COM will boot but requires special controller to play it
Ring Out 4x4 ? 21779 10 (64Mb) ? ? ?
Ring Out 4x4 (Rev A) 840-0004C 21779A 10 (64Mb) present 315-6213 317-0250-COM requires 2 JVS boards
Samba de Amigo (Rev A) 840-0020C 22966A 16 (64Mb) present 315-6213 317-0270-COM will boot but requires special controller to play it
Samba de Amigo (Rev B) 840-0020C 22966B 16 (64Mb) present 315-6213 317-0270-COM will boot but requires special controller to play it
Sega Marine Fishing 840-0027C 22221 10 (64Mb) ? 315-6213 not present ROM 3&4 not present. Requires 837-13844 JVS IO with all DIPSW Off and fishing controller
Sega Strike Fighter (Rev A) 840-0035C 23323A 20 (64Mb) present 315-6213 317-0281-COM have "Rev. A" label on case
Sega Strike Fighter (Rev A, no training mode) 840-0035C 23786A 20 (64Mb) present 315-6213 317-0281-COM have no training mode, "Rev. A" label on PCB, cart case have no revision label
@ -425,17 +432,20 @@ Spawn In the Demon's Hand (Rev B) 841-0005C 22977B 10 (64Mb)
World Series 99 840-0012C 22059 21 (64Mb) ? 315-6213 317-0259-COM \same ROM board
Super Major League 99 840-0012C-01 22059 21 (64Mb) ? 315-6213 317-0259-COM /
The House of the Dead 2 834-13636 21385 20 (64Mb) not present not present \ ROM board type is 837-13390
The House of the Dead 2 (USA) 834-13636-01 21585 20 (64Mb) not present not present / uses Lattice ispLSI 2032 80LJ instead of Xilinx
The House of the Dead 2 (Export) ? 21805 20 (64Mb) ? not present | uses Lattice ispLSI 2032 80LJ instead of Xilinx
The House of the Dead 2 (USA) 834-13636-01 21585 20 (64Mb) not present not present /
The Typing of the Dead 840-0026C 23021 20 (64Mb) present 315-6213 not present
The Typing of the Dead (Rev A) 840-0026C 23021A 20 (64Mb) present 315-6213 not present
Touch de UNO! / Unou Nouryoku Check Machine 840-0008C 22073 4 (64Mb) present 315-6213 317-0255-JPN requires 837-13844 JVS IO with DIPSW 5 On, ELO AccuTouch-compatible touch screen controller and special printer.
Touch de Uno! / Unou Nouryoku Check Machine 840-0008C 22073 4 (64Mb) present 315-6213 317-0255-JPN requires 837-13844 JVS IO with DIPSW 5 On, ELO AccuTouch-compatible touch screen controller and special printer.
Toy Fighter 840-0011C 22035 10 (64Mb) present 315-6212 317-0257-COM joystick + 3 buttons
Virtua NBA 840-0021C 22949 21 (64Mb) present 315-6213 317-0271-COM
Virtua NBA (USA) 840-0021C-01 23073 21 (64Mb) present 315-6213 not present PCB s/n is 840-0021B-01
Virtua Striker 2 Ver. 2000 840-0010C 21929 14 (64Mb) ? ? ?
Virtua Striker 2 Ver. 2000 (Rev C) 840-0010C 21929C 14 (64Mb)* present 315-6213 317-0258-COM joystick + 3 buttons *(+1x 32Mb)
Virtua Tennis / Power Smash 840-0015C 22927 11 (64Mb) present 315-6213 317-0263-COM
Virtual On Oratorio Tangram M.S.B.S. ver5.66 840-0028C 23198 13 (64Mb) ? 315-6213 317-0279-COM
Zombie Revenge 840-0003C 21707 19 (64Mb) ? 315-6213 317-0249-COM joystick + 3 buttons
Zombie Revenge (Export) ? 21834 19 (64Mb) ? ? ?
Zombie Revenge (Rev A) 840-0003C 21707A 19 (64Mb) present 315-6213 317-0249-COM joystick + 3 buttons
@ -477,7 +487,7 @@ Notes:
JP6 - JUMPER Unknown function (1-2)
SW1 - PUSHBUTTON
SW2 - 8X2 DIPswitch
SCSI-CTRL - SCSI-II controller MB86604A
SCSI-CTRL - SCSI-II controller MB86604A (ic45)
CNDB25 - DB-25 SCSI-II connector
IC17S-IC38S - Intel DA28F640J5 FlashROM (SOP56), 64Mb.
IC16 - EPROM (DIP42), not populated.
@ -529,7 +539,7 @@ Notes:
On the end of the number, -JPN means it requires Japanese BIOS, -COM will run with any BIOS
IC11 - EPROM (DIP42), either 27C160 or 27C322
JP1 - JUMPER Sets the size of the EPROM. 1-2 = 32M, 2-3 = 16M
IC13S - EEPROM (SOIC8) 25LC040 serial EEPROM
IC13S - EEPROM (SOIC8) 25LC040 serial EEPROM (on PCB etched as AT25010)
IC14 - 256 x 9 AsyncFIFO, 5.0V (SOP28)
IC15 - SRAM (SOJ28) 32kx8, IDT71256
IC17S-IC38S - MaskROM (SOP44), either 32Mb or 64Mb. Not all positions are populated
@ -540,25 +550,27 @@ from NAOMI side it read as X76F100-type, probably simulated by ACTEL FPGA.
Actual data is shuffled, address bits 3 to 6 have reversed order, i.e. 8 7 3 4 5 6 2 1 0.
Games known to use this PCB include....
Sticker EPROM mask ROMs 25LC040 A54SX32
Game on cart IC11# # of SOP44 IC13S# IC1# Notes
-----------------------------------------------------------------------------------------------------------------------------------------------
Club Kart: European Session (2003, Rev A) 840-0139C 24173A 18 (64Mb) present 317-0382-COM
Club Kart Prize (Rev A) 840-0129C 24082A 16 (64Mb) present 317-0368-COM requires Naomi-based hopper controller (Naomi bd + 840-0130 cart + 837-14381 "G2 EXPANSION BD")
Club Kart Prize Version B 840-0137C 24149 16 (64Mb) present 317-0368-COM requires Naomi-based or 837-14438 hopper controller (selected by P1 BUTTON1 bit)
Giant Gram 2000 840-0039C 23377 20 (64Mb) present 317-0296-COM
Kick '4' Cash 840-0140C 24212 16 (64Mb) present 317-0397-COM requires 837-14438 "SH I/O BD" hopper controller
Marvel Vs. Capcom 2 New Age of Heroes (Export) (Rev A) 841-0007C-02 23085A 14 (64Mb)* present 317-5058-COM *(+2x 32Mb) have factory wire-mod connecting IC13S serial EEPROM CLK pin to IC11 ROM /OE pin
Marvel Vs. Capcom 2 New Age of Heroes (Korea) (Rev A) 841-0007C-03 23085A 14 (64Mb)* present 317-5058-COM *(+2x 32Mb) have factory wire-mod connecting IC13S serial EEPROM CLK pin to IC11 ROM /OE pin
MushiKing The King of Beetles 2K3 2ND 840-0150C 24217 6 (64Mb) present 317-0394-COM requires 610-0669 barcode reader, 838-14245-92 "MAPLE/232C CONVERT BD" (MIE-based), 838-14243 "RFID CHIP R/W BD" and RFID chip
Quiz Ah Megamisama 840-0030C 23227 16 (64Mb) present 317-0280-JPN
Shootout Pool 840-0098C 23844 4 (64Mb) present 317-0336-COM requires regular 837-13551 and 837-13938 rotary JVS boards
Shootout Pool Prize / Shootout Pool The Medal (Rev A) 840-0128C 24065A 4 (64Mb) present 317-0367-COM requires Naomi-based hopper controller
Shootout Pool Prize Ver. B / Shootout Pool The Medal Ver. B 840-0136C 24148 4 (64Mb) present 317-0367-COM requires Naomi-based or 837-14438 hopper controller (selected by P1 BUTTON1 bit)
SWP Hopper Board 840-0130C 24083 20 (64Mb) present 317-0339-COM reused VF4 Evo ROM board with all maskroms still in place; there is an additional 837-14381 IO board
Touch de UNO! 2 840-0022C 23071 6 (64Mb) present 317-0276-JPN requires 837-13844 JVS IO with DIPSW 5 On, ELO AccuTouch-compatible touch screen controller and special printer.
Virtua Fighter 4 Evolution 840-0106B 23934 20 (64Mb) present 317-0339-COM
Virtua Tennis 2 / Power Smash 2 (Rev A) 840-0084C 22327A 18 (64Mb) present 317-0320-COM
Sticker EPROM mask ROMs 25LC040 A54SX32
Game on cart IC11# # of SOP44 IC13S# IC1# Notes
------------------------------------------------------------------------------------------------------------------------------------------
Club Kart: European Session (2003, Rev A) 840-0139C 24173A 18 (64Mb) present 317-0382-COM
Club Kart Prize (Export, Japan, Rev A) 840-0129C 24082A 16 (64Mb) present 317-0368-COM requires Naomi-based hopper controller (Naomi bd + 840-0130 cart + 837-14381 "G2 EXPANSION BD")
Club Kart Prize Version B (Export, Japan) 840-0137C 24149 16 (64Mb) present 317-0368-COM requires Naomi-based or 837-14438 hopper controller (selected by P1 BUTTON1 bit)
Giant Gram 2000 840-0039C 23377 20 (64Mb) present 317-0296-COM
Kick '4' Cash 840-0140C 24212 16 (64Mb) present 317-0397-COM requires 837-14438 "SH I/O BD" hopper controller
Marvel Vs. Capcom 2 New Age of Heroes (Export, Rev A) 841-0007C-02 23085A 14 (64Mb)* present 317-5058-COM *(+2x 32Mb) have factory wire-mod connecting IC13S serial EEPROM CLK pin to IC11 ROM /OE pin
Marvel Vs. Capcom 2 New Age of Heroes (Korea, Rev A) 841-0007C-03 23085A 14 (64Mb)* present 317-5058-COM *(+2x 32Mb) have factory wire-mod connecting IC13S serial EEPROM CLK pin to IC11 ROM /OE pin
MushiKing The King of Beetles 2K3 2ND 840-0150C 24217 6 (64Mb) present 317-0394-COM requires 610-0669 barcode reader, 838-14245-92 "MAPLE/232C CONVERT BD" (MIE-based), 838-14243 "RFID CHIP R/W BD" and RFID chip
Quiz Ah Megamisama 840-0030C 23227 16 (64Mb) present 317-0280-JPN
Shootout Pool 840-0098C 23844 4 (64Mb) present 317-0336-COM requires regular 837-13551 and 837-13938 rotary JVS boards
/Shootout Pool Prize (Export) /
\Shootout Pool The Medal (Japan, Rev A) 840-0128C 24065A 4 (64Mb) present 317-0367-COM requires Naomi-based hopper controller
/Shootout Pool Prize (Export) /
\Shootout Pool The Medal (Japan) Version B 840-0136C 24148 4 (64Mb) present 317-0367-COM requires Naomi-based or 837-14438 hopper controller (selected by P1 BUTTON1 bit)
SWP Hopper Board 840-0130C 24083 20 (64Mb) present 317-0339-COM reused VF4 Evo ROM board with all maskROMs still in place; there is an additional 837-14381 IO board
Touch de Uno! 2 840-0022C 23071 6 (64Mb) present 317-0276-JPN requires 837-13844 JVS IO with DIPSW 5 On, ELO AccuTouch-compatible touch screen controller and special printer.
Virtua Fighter 4 Evolution (World) 840-0106B 23934 20 (64Mb) present 317-0339-COM
Virtua Tennis 2 / Power Smash 2 (Rev A) 840-0084C 22327A 18 (64Mb) present 317-0320-COM
PFSB 128M Mask ROM board
@ -602,10 +614,11 @@ Capcom Vs. SNK Millennium Fight 2000 841-0011C 23511 7 (128Mb) 3
Capcom Vs. SNK Millennium Fight 2000 (Rev A) 841-0011C 23511A 7 (128Mb) 315-6219 315-6213 317-5059-COM ? Date on screen: 000804
Capcom Vs. SNK Millennium Fight 2000 (Rev C) 841-0011C 23511C 7 (128Mb) 315-6319 315-6213 317-5059-COM ? Date on screen: 000904
Club Kart: European Session 840-0062C 23704 11 (128Mb) 315-6319A 315-6213 317-0313-COM present
Club Kart: European Session (Rev C) 840-0062C * 11 (128Mb) 315-6319A 315-6213 317-0313-COM present * EPR have handwritten Japanese label possibly readable as 'teteto 74 lcl'
Club Kart: European Session (Rev A) 840-0062C * 11 (128Mb) 315-6319A 315-6213 317-0313-COM present * EPR have handwritten Japanese label possibly readable as 'teteto 74 lcl'
Club Kart: European Session (Rev C) ? 23704C 11 (128Mb) ? ? ? ?
Club Kart: European Session (Rev D) 840-0062C 23704D 11 (128Mb) 315-6319A 315-6213 317-0313-COM present
Crackin' DJ 840-0043C 23450 10 (128Mb) 315-6319 315-6213 317-0288-COM ? requires regular 837-13551 and 837-13938 rotary JVS boards, and turntable simulation
Derby Owners Club II Ver.2.1 (Japan) (Rev B) 840-0083C 22306B 11 (128Mb) 315-6319A 315-6213 317-0327-JPN present
Derby Owners Club II Ver.2.1 (Japan, Rev B) 840-0083C 22306B 11 (128Mb) 315-6319A 315-6213 317-0327-JPN present
Derby Owners Club World Edition (Rev B) 840-0088C 22336B 7 (128Mb) 315-6319A 315-6213 not present present
Derby Owners Club World Edition (Rev C) 840-0088C 22336C 7 (128Mb) 315-6319A 315-6213 not present not present
Derby Owners Club World Edition EX (Rev D) 840-0088C 22336D 7 (128Mb) 315-6319A 315-6213 not present not present 2 MaskROM are different from Rev C
@ -614,19 +627,19 @@ Mobile Suit Gundam: Federation Vs. Zeon 841-0017C 23638 10 (128Mb) 3
Moero! Justice Gakuen / Project Justice (Rev A) 841-0015C 23548A 11 (128Mb) 315-6319A 315-6213 317-5065-COM present
MushiKing The King Of Beetles 2004 Second (Jpn) 840-0152C 24241 5 (128Mb) 315-6319A 315-6213 not present not present requires 610-0669 barcode reader
MushiKing The King Of Beetles 2005 First (Jpn) 840-0158C 24286 7 (128Mb) 315-6319A 315-6213 not present not present requires 610-0669 barcode reader
Oinori-daimyoujin Matsuri 840-0126B 24053 5 (128Mb) 315-6319A 315-6213 not present not present requires 837-14274 "G2 EXPANSION BD" (similar to hopper 837-14381 but with ARC NET chip)
Oinori-daimyoujin Matsuri 840-0126B 24053 5 (128Mb) 315-6319A 315-6213 not present not present no cart, requires 837-14274 "G2 EXPANSION BD" (similar to hopper 837-14381 but with ARC NET chip)
Samba de Amigo Ver. 2000 840-0047C 23600 11 (128Mb) 315-6319A 315-6213 317-0295-COM ?
Star Horse (main screens) 840-0054C 23625 4 (128Mb) 315-6319 315-6213 not present present requires 837-13785 ARCNET&IO BD
Star Horse (satellite) 840-0056C 23627 6 (128Mb)* 315-6319 315-6213 not present present * +1 (64Mb), requires 837-13785 ARCNET&IO BD
Star Horse 2001 (satellite) (Rev B) 840-0078B 23739B 7 (128Mb) 315-6319 315-6213 not present present requires 837-13785 ARCNET&IO BD
Star Horse 2001 (satellite, Rev B) 840-0078B 23739B 7 (128Mb) 315-6319A 315-6213 not present present requires 837-13785 ARCNET&IO BD
Star Horse Progress (main screen, Rev B) 840-0120B 24087B 6 (128Mb) 315-6319A 315-6213 not present not present requires 837-13785 ARCNET&IO BD
Star Horse Progress (sound & backup, Rev A) 840-0121B 24097A 6 (128Mb) 315-6319A 315-6213 not present not present requires 837-13785 ARCNET&IO BD
Star Horse Progress (live, Rev A) 840-0122B 24107A 11 (128Mb) 315-6319A 315-6213 not present not present requires 837-13785 ARCNET&IO BD
Star Horse Progress (satellite, Rev A) 840-0123B 24122A 7 (128Mb) 315-6319A 315-6213 not present not present requires 837-13785 ARCNET&IO BD
The King of Route 66 (Rev A) 840-0087C 23819A 10 (128Mb) 315-6319A 315-6213 not present present
Virtua Fighter 4 840-0080C 23785 11 (128Mb) ? ? 317-0324-COM ?
Virtua Striker 3 840-0061C 23663 11 (128Mb) 315-6319A 315-6213 317-0310-COM ?
Virtua Striker 3 (Rev B) 840-0061C 23663B 11 (128Mb) 315-6319A 315-6213 317-0310-COM present
Virtua Fighter 4 (World) 840-0080C 23785 11 (128Mb) ? ? 317-0324-COM ?
Virtua Striker 3 (World) 840-0061C 23663 11 (128Mb) 315-6319A 315-6213 317-0310-COM present
Virtua Striker 3 (World, Rev B) 840-0061C 23663B 11 (128Mb) 315-6319A 315-6213 317-0310-COM present
Wave Runner GP 840-0064C 24059 6 (128Mb) 315-6319A 315-6213 not present present
Wild Riders 840-0046C 23622 10 (128Mb) 315-6319A 315-6213 317-0301-COM ?
WWF Royal Rumble 840-0040C 22261 8 (128Mb) 315-6319 315-6213 317-0285-COM ?
@ -667,20 +680,23 @@ Notes:
CN4 - 6 legs connector for ISP programming
Games known to use this PCB include....
Sticker EPROM FLASHROMs XC3S50 PIC16C621A XCF01S
Game on cart IC7# # of SOP56 IC2# IC3# IC4# Notes
Sticker EPROM FLASHROMs XC3S50 PIC16C621A XCF01S
Game on cart IC7# # of SOP56 IC2# IC3# IC4# Notes
-------------------------------------------------------------------------------------------------------------------------------------------
Akatsuki Blitzkampf Ausf. Achse 841-0058C not present 4 (512Mb) present 317-5130-JPN present IC2# is labeled "VER.2" - IC4# is marked "5A" - IC#10 & IC#11 are empty
Dynamite Deka EX / Asian Dynamite 840-0175C not present 4 (512Mb) present 317-0495-COM present IC2# is labeled "VER.2"
Dynamite Deka EX / Asian Dynamite (older) 840-0175C not present 4 (512Mb) present 317-0495-COM present 2x PCBs dumped, 840-0175B and 840-0168B, contents is the same.
Asian Dynamite / Dynamite Deka EX 840-0175C not present 4 (512Mb) present 317-0495-COM present IC2# is labeled "VER.2"
Asian Dynamite / Dynamite Deka EX (older) 840-0175C not present 4 (512Mb) present 317-0495-COM present 2x PCBs dumped, 840-0175B and 840-0168B, contents is the same.
Illvelo (Illmatic Envelope) 841-0059C not present 4 (512Mb) present 317-5131-JPN present IC2# is labeled "VER.2" - IC#11 is empty
Mamoru-kun wa Norowarete Shimatta 841-0060C not present 4 (512Mb) present 317-5132-JPN present IC2# is labeled "VER.2"
Manic Panic Ghost! (USA) 840-0170C-01 not present 5 (512Mb) present 317-0461-COM present requires 837-14672 sensor board (SH4 based) - PCB s/n is 840-0170B-01
Melty Blood Actress Again 841-0061C not present 6 (512Mb) present 317-5133-JPN present IC2# is labeled "REV.A" - IC4# is marked "5A"
Melty Blood Actress Again (Japan) 841-0061C not present 6 (512Mb) present 317-5133-JPN present IC2# is labeled "REV.A" - IC4# is marked "5A"
Melty Blood Actress Again Version A (Rev A) 841-0061C 24455 6 (512Mb) present 317-5133-JPN present IC2# is labeled "REV.A" - IC4# is marked "5A"
Mushiking - The King Of Beetles II ENG (Ver. 1.001) 840-0164C not present 2 (512Mb) present 317-0437-COM present requires 610-0669 barcode reader, 838-14245-92 "MAPLE/232C CONVERT BD" (MIE-based), 838-14243 "RFID CHIP R/W BD" and RFID chip
Mushiking - The King Of Beetles II ENG (Ver. 2.001) 840-0164C 24357 2 (512Mb) present 317-0437-COM present IC4# is marked "18"
Mushiking - The King Of Beetles IV ENG 840-0180C not present 2 (512Mb) present 317-0437-COM present IC2# is labeled "VER.1", IC4# is marked "8A", requires 610-0669 barcode reader, 838-14245-92 "MAPLE/232C CONVERT BD" (MIE-based), 838-14243 "RFID CHIP R/W BD" and RFID chip
/Mushiking The King Of Beetles
\Mushiking II / III / III+ (Ver. 1.001) (World) 840-0164C not present 2 (512Mb) present 317-0437-COM present requires 610-0669 barcode reader, 838-14245-92 "MAPLE/232C CONVERT BD" (MIE-based), 838-14243 "RFID CHIP R/W BD" and RFID chip
/Mushiking The King Of Beetles
\Mushiking II / III / III+ (Ver. 2.001) (World) 840-0164C 24357 2 (512Mb) present 317-0437-COM present IC4# is marked "18"
/Mushiking The King Of Beetles
\Mushiking IV / V / VI (World) 840-0180C not present 2 (512Mb) present 317-0437-COM present IC2# is labeled "VER.1", IC4# is marked "8A", requires 610-0669 barcode reader, 838-14245-92 "MAPLE/232C CONVERT BD" (MIE-based), 838-14243 "RFID CHIP R/W BD" and RFID chip
Pokasuka Ghost! 840-0170C not present 5 (512Mb) present 317-0461-COM present requires 837-14672 sensor board (SH4 based)
Radirgy Noa 841-0062C not present 4 (512Mb) present 317-5138-JPN present IC2# is labeled "VER.2" - IC4# is marked "8A"
Rhythm Tengoku 841-0177C not present 4 (512Mb) present 317-0503-JPN present IC2# is labeled "VER.2" - IC4# is marked "8A"
@ -730,22 +746,23 @@ Notes:
CN1/2/3 - connectors joining to main board
Games known to use this PCB include....
Cart Sticker FL0-FL3 FLASHROMs X76F100 EPM7064 EPM7064 315-5881 Known Game
Game Type on cart FLASHROM # of SOP48 IC @ 1F IC @ 1H IC @ 2K IC @ 1M code (1) Notes
-------------------------------------------------------------------------------------------------------------------------------------------------------------
Cart Sticker FL0-FL3 FLASHROMs X76F100 EPM7064 EPM7064 315-5881 Known Game
Game Type on cart FLASHROM # of SOP48 IC @ 1F IC @ 1H IC @ 2K IC @ 1M code (1) Notes
--------------------------------------------------------------------------------------------------------------------------------------------------------------
/Gun Survivor 2 Biohazard
\Code: Veronica (Japan, Ver.E) F1X 25709801 1 (64Mb) 14 (128Mb) not present NAODEC2A NAODEC1B 317-5075-COM BHF1 uses Namco FCA JVS I/O (not dumped), will crash if COMM.BOARD not present
\Code: Veronica (Japan, BHF1 Ver.E) F1X 25709801 1 (64Mb) 14 (128Mb) not present NAODEC2A NAODEC1B 317-5075-COM BHF1 uses Namco FCA JVS I/O (not dumped), will crash if COMM.BOARD not present
/Gun Survivor 2 Biohazard
\Code: Veronica (World, Ver.E) F1X 25709801 1 (64Mb) 14 (128Mb) not present NAODEC2A NAODEC1B 317-5075-COM BHF2
/Shin Nihon Prowrestling Toukon /FL0 & FL1 have pin55 raised from PCB.
\Retsuden 4 Arcade Edition (Japan, Ver.A) F2X 25349801 2 (64Mb) 15 (128Mb) not present NAODEC2A NAODEC1B 317-5040-COM TRF1 \They are connected together and go to pin89 on 2K.
World Kicks PCB (Japan, WKC1 Ver.A) F2 25509801 2 (64Mb) 9 (128Mb) not present NAODEC2A NAODEC1B 317-5040-COM WKC1 uses Namco V226 JVS I/O (not dumped)
World Kicks PCB (World, WKC2 Ver.A) F2 25509801 2 (64Mb) 9 (128Mb) not present NAODEC2A NAODEC1B 317-5040-COM WKC2
World Kicks (Japan, WK1 Ver.A) F2 25209801 2 (64Mb) 9 (128Mb) not present NAODEC2A NAODEC1A 317-5040-COM WK1
World Kicks (World, WK2 Ver.A) F2 25209801 2 (64Mb) 9 (128Mb) not present NAODEC2A NAODEC1A 317-5040-COM WK2
World Kicks (US, WK3 Ver.A) F2 25209801 2 (64Mb) 9 (128Mb) not present NAODEC2A NAODEC1A 317-5040-COM WK3
\Code: Veronica (World, BHF2 Ver.E) F1X 25709801 1 (64Mb) 14 (128Mb) not present NAODEC2A NAODEC1B 317-5075-COM BHF2
/Shin Nihon Prowrestling Toukon Retsuden 4 /FL0 & FL1 have pin55 raised from PCB.
\Arcade Edition (Japan, TRF1 Ver.A) F2X 25349801 2 (64Mb) 15 (128Mb) not present NAODEC2A NAODEC1B 317-5040-COM TRF1 \They are connected together and go to pin89 on 2K.
World Kicks PCB (Japan, WKC1 Ver.A) F2 25509801 2 (64Mb) 9 (128Mb) not present NAODEC2A NAODEC1B 317-5040-COM WKC1 uses Namco V226 JVS I/O (not dumped)
World Kicks PCB (World, WKC2 Ver.A) F2 25509801 2 (64Mb) 9 (128Mb) not present NAODEC2A NAODEC1B 317-5040-COM WKC2 uses Namco V226 JVS I/O (not dumped)
World Kicks (Japan, WK1 Ver.A) F2 25209801 2 (64Mb) 9 (128Mb) not present NAODEC2A NAODEC1A 317-5040-COM WK1
World Kicks (World, WK2 Ver.A) F2 25209801 2 (64Mb) 9 (128Mb) not present NAODEC2A NAODEC1A 317-5040-COM WK2
World Kicks (US, WK3 Ver.A) F2 25209801 2 (64Mb) 9 (128Mb) not present NAODEC2A NAODEC1A 317-5040-COM WK3
(1) note: the number in the game code has the following meaning: 1 = Japan, 2 = Asia, 3 = US, 4 = World.
(1) note: the number in the game code has the following meaning: 1 = Japan, 2 = World, 3 = US, 4 = Asia.
real meaning of 2 and 4 is not clear, it can be like "some other part of World", also possible Europe
MASK C (C) Namco 2000
@ -786,17 +803,18 @@ Notes:
CN1/2/3 - connectors joining to main board
Games known to use this PCB include....
Cart Sticker FL0-FL3 FLASHROMs X76F100 CY37128 315-5881 Known Game
Game Type on cart FLASHROM # of SOP48 IC @ 1F IC @ 2J IC @ 1M code (1) Notes
Cart Sticker FL0-FL3 FLASHROMs X76F100 CY37128 315-5881 Known Game
Game Type on cart FLASHROM # of SOP48 IC @ 1F IC @ 2J IC @ 1M code (1) Notes
----------------------------------------------------------------------------------------------------------------------------------------
Mazan: Flash of the Blade (World, Ver.A) F1X 25869812 1 (64Mb) 8 (128Mb) present NAODEC3 317-0266-COM MAZ2 uses 2x Namco FCB JVS I/O (not dumped)
Mazan: Flash of the Blade (US, Ver.A) F1X 25869812 1 (64Mb) 8 (128Mb) present NAODEC3 317-0266-COM MAZ3
Ninja Assault (Japan, Ver.A) F3 25469801 3 (64Mb) 9 (128Mb) present NAODEC3 317-5068-COM NJA1 uses Namco JYU JVS I/O
Ninja Assault (World, Ver.A) F3 25469801 3 (64Mb) 9 (128Mb) present NAODEC3 317-5068-COM NJA2
Ninja Assault (US, Ver.A) F3 25469801 3 (64Mb) 9 (128Mb) present NAODEC3 317-5068-COM NJA3
Ninja Assault (Asia, Ver.A) F3 25469801 3 (64Mb) 9 (128Mb) present NAODEC3 317-5068-COM NJA4
Mazan: Flash of the Blade (World, MAZ2 Ver.A) F1X 25869812 1 (64Mb) 8 (128Mb) present NAODEC3 317-0266-COM MAZ2 uses 2x Namco FCB JVS I/O (not dumped)
Mazan: Flash of the Blade (US, MAZ3 Ver.A) F1X 25869812 1 (64Mb) 8 (128Mb) present NAODEC3 317-0266-COM MAZ3
Ninja Assault (Japan, NJA1 Ver.A) F3 25469801 3 (64Mb) 9 (128Mb) present NAODEC3 317-5068-COM NJA1 uses Namco JYU JVS I/O
Ninja Assault (World, NJA2 Ver.A) F3 25469801 3 (64Mb) 9 (128Mb) present NAODEC3 317-5068-COM NJA2
Ninja Assault (US, NJA3 Ver.A) F3 25469801 3 (64Mb) 9 (128Mb) present NAODEC3 317-5068-COM NJA3
Ninja Assault (Asia, NJA4 Ver.A) F3 25469801 3 (64Mb) 9 (128Mb) present NAODEC3 317-5068-COM NJA4
(1) note: the number in the game code has the following meaning: 1 = Japan, 2 = Asia, 3 = US, 4 = World.
(1) note: the number in the game code has the following meaning: 1 = Japan, 2 = World, 3 = US, 4 = Asia.
real meaning of 2 and 4 is not clear, it can be like "some other part of World", also possible Europe
Note! Generally, games that require a special I/O board or controller will not boot at all with a
standard NAOMI I/O board. Usually they display a message saying the I/O board is not acceptable
@ -5487,7 +5505,7 @@ ROM_START( 18wheelro )
ROM_PARAMETER( ":rom_board:segam2crypt:key", "2807cf54" )
ROM_END
/* 18 Wheeler (deluxe) (Rev A) */
/* 18 Wheeler (deluxe, Rev A) */
ROM_START( 18wheelr )
NAOMI_BIOS
NAOMI_DEFAULT_EEPROM
@ -5531,7 +5549,7 @@ ROM_START( 18wheelr )
ROM_PARAMETER( ":rom_board:segam2crypt:key", "2807cf54" )
ROM_END
/* 18 Wheeler (deluxe) (Rev T) */
/* 18 Wheeler (deluxe, Rev T) */
ROM_START( 18wheelrt )
NAOMI_BIOS
NAOMI_DEFAULT_EEPROM
@ -6085,6 +6103,9 @@ ROM_START( qmegamis )
ROM_COPY( "rom_board", 0x1000000, 0x400000, 0xc00000 )
/* ROM_REGION(0x200, "some_eeprom", 0)
ROM_LOAD( "25lc040.ic13s", 0x000, 0x200, NO_DUMP ) */
// 840-0030 2000 317-0280-JPN Naomi
ROM_PARAMETER( ":rom_board:key", "cd9b4896" )
ROM_END
@ -6246,6 +6267,9 @@ ROM_START( shootopl )
ROM_COPY( "rom_board", 0x1000000, 0x400000, 0xc00000 )
/* ROM_REGION(0x200, "some_eeprom", 0)
ROM_LOAD( "25lc040.ic13s", 0x000, 0x200, NO_DUMP ) */
// 840-0098 2002 317-0336-COM Naomi
ROM_PARAMETER( ":rom_board:key", "a0f37ca7" )
ROM_END
@ -6285,6 +6309,9 @@ ROM_START( shootplm )
ROM_COPY( "rom_board", 0x1000000, 0x400000, 0xc00000 )
/* ROM_REGION(0x200, "some_eeprom", 0)
ROM_LOAD( "25lc040.ic13s", 0x000, 0x200, NO_DUMP ) */
// 840-0136 2002 317-0367-COM Naomi
ROM_PARAMETER( ":rom_board:key", "9dbde9cd" )
ROM_END
@ -7507,6 +7534,9 @@ ROM_START( vtenis2c )
ROM_COPY( "rom_board", 0x1000000, 0x400000, 0xc00000 )
/* ROM_REGION(0x200, "some_eeprom", 0)
ROM_LOAD( "25lc040.ic13s", 0x000, 0x200, NO_DUMP ) */
// 840-0084 2001 317-0320-COM Naomi
ROM_PARAMETER( ":rom_board:key", "2d2d4743" )
ROM_END
@ -9589,6 +9619,9 @@ ROM_START( vf4evoct )
ROM_COPY( "rom_board", 0x1000000, 0x400000, 0xc00000 )
/* ROM_REGION(0x200, "some_eeprom", 0)
ROM_LOAD( "25lc040.ic13s", 0x000, 0x200, NO_DUMP ) */
// 840-0106 2002 317-0339-COM Naomi 2
ROM_PARAMETER( ":rom_board:key", "1e5bb0cd" )
ROM_END
@ -9793,6 +9826,9 @@ ROM_START( clubk2k3 )
ROM_COPY( "rom_board", 0x1000000, 0x400000, 0xc00000 )
/* ROM_REGION(0x200, "some_eeprom", 0)
ROM_LOAD( "25lc040.ic13s", 0x000, 0x200, NO_DUMP ) */
// 840-0139 2003 317-0382-COM Naomi 2
ROM_PARAMETER( ":rom_board:key", "d8b0fa4c" )
ROM_END
@ -9803,7 +9839,7 @@ ROM_START( clubk2kp )
NAOMI_DEFAULT_EEPROM
ROM_REGION( 0xa000000, "rom_board", ROMREGION_ERASEFF)
ROM_LOAD( "ic22.bin", 0x0000000, 0x400000, CRC(1e601d98) SHA1(70d244c1b7cde236d833585b8d2064ba6d727825) ) // flash ROM module
ROM_LOAD( "ic22.bin", 0x0000000, 0x400000, CRC(334fc561) SHA1(e8c8707b0d13216ec7071da05823e330deb810d4) ) // flash ROM module
// game data ROMs not dumped, not the same as regular revision. technically, all below should be marked as NO_DUMP.
ROM_LOAD32_WORD( "opr-24151.ic17s", 0x1000000, 0x800000, CRC(91594439) SHA1(a195bfe0c70a0c7048b547af0a92c98d126230c6) )
ROM_LOAD32_WORD( "opr-24152.ic18", 0x1000002, 0x800000, CRC(fd131f88) SHA1(bc27b3ab5b41a3fe33b541b7cca28d6baed157b3) )
@ -10721,7 +10757,7 @@ ROM_START( ggisuka )
ROM_REGION( 0x9000000, "rom_board", ROMREGION_ERASE)
ROM_LOAD( "ax1201p01.ic18", 0x0000000, 0x0800000, CRC(0a78d52c) SHA1(e9006dc43cd11d5ba49a092a1dff31dc10700c28) )
ROM_LOAD( "ax1201m01.ic10", 0x0800000, 0x1000000, CRC(df96ce30) SHA1(25a9f743b1c2b11896d0c7a2dc1c198fc977aaca) ) // 2x mirrored 8MB data, TODO: check is IC10 Mask ROM not 16MB but 8MB
ROM_LOAD( "ax1201m01.ic10", 0x0800000, 0x1000000, CRC(df96ce30) SHA1(25a9f743b1c2b11896d0c7a2dc1c198fc977aaca) ) // 2x mirrored 8MB data, TODO: check if IC10 mask ROM not 16MB but 8MB
ROM_LOAD( "ax1202m01.ic11", 0x1000000, 0x1000000, CRC(dfc6fd67) SHA1(f9d35b18a03d22f70feda42d314b0f9dd54eea55) )
ROM_LOAD( "ax1203m01.ic12", 0x2000000, 0x1000000, CRC(bf623df9) SHA1(8b9a8e8100ff6d2ce9a982ab8eb1d542f1c7af03) )
ROM_LOAD( "ax1204m01.ic13", 0x3000000, 0x1000000, CRC(c80c3930) SHA1(5c39fde36e2ebbfe72967d7d0202eb454a8d3bbe) )
@ -11086,8 +11122,8 @@ ROM_END
/* 0021-01 */ GAME( 2000, virnba, naomi, naomim2, naomi, naomi_state, init_naomi, ROT0, "Sega", "Virtua NBA (USA)", GAME_FLAGS )
/* 0022 */ GAME( 2000, tduno2, naomi, naomim1, naomi, naomi_state, init_naomi, ROT0, "Sega", "Touch de Uno! 2 (Japan)", GAME_FLAGS )
/* 0023 */ GAME( 2000, 18wheelro, 18wheelr, naomim2, 18wheelr,naomi_state, init_naomi, ROT0, "Sega", "18 Wheeler (deluxe)", GAME_FLAGS )
/* 0023 */ GAME( 2000, 18wheelr, naomi, naomim2, 18wheelr,naomi_state, init_naomi, ROT0, "Sega", "18 Wheeler (deluxe) (Rev A)", GAME_FLAGS )
/* 0023 */ GAME( 2000, 18wheelrt, 18wheelr, naomim2, 18wheelr,naomi_state, init_naomi, ROT0, "Sega", "18 Wheeler (deluxe) (Rev T)", GAME_FLAGS )
/* 0023 */ GAME( 2000, 18wheelr, naomi, naomim2, 18wheelr,naomi_state, init_naomi, ROT0, "Sega", "18 Wheeler (deluxe, Rev A)", GAME_FLAGS )
/* 0023 */ GAME( 2000, 18wheelrt, 18wheelr, naomim2, 18wheelr,naomi_state, init_naomi, ROT0, "Sega", "18 Wheeler (deluxe, Rev T)", GAME_FLAGS )
/* 0025 */ GAME( 1999, marstv, naomi, naomim2, marstv, naomi_state, init_naomi, ROT0, "Sega", "Mars TV (Japan)", GAME_FLAGS )
/* 0026 */ GAME( 2000, totdo, totd, naomim2_kb, naomi_kb, naomi_state, init_naomi, ROT0, "Sega", "The Typing of the Dead", GAME_FLAGS )
/* 0026 */ GAME( 2000, totd, naomi, naomim2_kb, naomi_kb, naomi_state, init_naomi, ROT0, "Sega", "The Typing of the Dead (Rev A)", GAME_FLAGS )
@ -11117,7 +11153,7 @@ ROM_END
/* 0064 */ GAME( 2001, wrungpo, wrungp, naomim2, naomi, naomi_state, init_naomi, ROT0, "CRI / Sega", "Wave Runner GP (USA, Rev A)", GAME_FLAGS )
/* 0064 */ GAME( 2001, wrungp, naomi, naomim2, naomi, naomi_state, init_naomi, ROT0, "CRI / Sega", "Wave Runner GP", GAME_FLAGS )
/* 0068 */ GAME( 2001, crakndj2, naomi, naomim2, crackndj,naomi_state, init_naomi, ROT0, "Sega", "Crackin' DJ Part 2 (Japan)", GAME_FLAGS )
/* 0073 */ GAME( 2001, inunoos, naomi, naomim2, naomi, naomi_state, init_naomi, ROT0, "Sega / Cave", "Inu No Osanpo / Dog Walking (Japan, Export, Rev A)", GAME_FLAGS )
/* 0073 */ GAME( 2001, inunoos, naomi, naomim2, naomi, naomi_state, init_naomi, ROT0, "Wow Entertainment / Sega", "Inu No Osanpo / Dog Walking (Japan, Export, Rev A)", GAME_FLAGS )
/* 0078 */ GAME( 2002, shors2k1, naomi, naomim2, naomi, naomi_state, init_naomi, ROT270,"Sega", "Star Horse 2001 (satellite, Rev B)", GAME_FLAGS )
/* 0083 */ GAME( 2001, derbyoc2, naomi, naomim2, naomi, naomi_state, init_naomi, ROT0, "Sega", "Derby Owners Club II Ver.2.1 (Japan, Rev B)", GAME_FLAGS )
/* 0084 */ GAME( 2001, vtenis2c, naomi, naomim1, naomi, naomi_state, init_naomi, ROT0, "Sega", "Virtua Tennis 2 / Power Smash 2 (Rev A)", GAME_FLAGS )
@ -11130,7 +11166,7 @@ ROM_END
/* 0122 */ GAME( 2003, shorsepl, shorsep, naomim2, naomi, naomi_state, init_naomi, ROT0, "Sega", "Star Horse Progress (live, Rev A)", GAME_FLAGS )
/* 0123 */ GAME( 2003, shorsep, naomi, naomim2, naomi, naomi_state, init_naomi, ROT270,"Sega", "Star Horse Progress (satellite, Rev A)", GAME_FLAGS )
/* 0126 */ GAME( 2003, oinori, naomi, naomim2, naomi, naomi_state, init_naomi, ROT0, "Sega", "Oinori-daimyoujin Matsuri", GAME_FLAGS )
/* 0128 */ GAME( 2003, shootpl, naomi, naomim1, naomi, naomi_state, init_naomi, ROT0, "Sega", "Shootout Pool Prize (Export) / Shootout Pool The Medal (Japan) (Rev A)", GAME_FLAGS )
/* 0128 */ GAME( 2003, shootpl, naomi, naomim1, naomi, naomi_state, init_naomi, ROT0, "Sega", "Shootout Pool Prize (Export) / Shootout Pool The Medal (Japan, Rev A)", GAME_FLAGS )
/* 0130 */ GAME( 2002, hopper, naomi, naomi, naomi, naomi_state, init_naomi, ROT0, "Sega", "SWP Hopper Board", GAME_FLAGS )
// 0132 Mushiking 2K3 2ND (Japan)
/* 0136 */ GAME( 2004, shootplm, naomi, naomim1, naomi, naomi_state, init_naomi, ROT0, "Sega", "Shootout Pool Prize (Export) / Shootout Pool The Medal (Japan) Version B", GAME_FLAGS ) // Build: 23 Jan 2004
@ -11145,41 +11181,41 @@ ROM_END
/* 0166 */ GAME( 2006, zunou, naomi, naomim4, naomi, naomi_state, init_naomi, ROT0, "Sega", "Touch De Zunou (Japan, Rev A)", GAME_FLAGS )
/* 0170-01 */ GAME( 2007, manicpnc, naomi, naomim4, naomi, naomi_state, init_naomi, ROT0, "Sega", "Manic Panic Ghosts! (USA, Export)", GAME_FLAGS )
/* 0170 */ GAME( 2007, pokasuka, manicpnc, naomim4, naomi, naomi_state, init_naomi, ROT0, "Sega", "Pokasuka Ghost! (Japan)", GAME_FLAGS )
// 0171 Mushiking 2K6 2ND (Japan)
// 0171 Mushiking 2K6 2ND (Japan) note: starting from ver 2K6 was moved to SystemSP platform and later to PC-based hardware
/* 0175 */ GAME( 2007, asndynmt, naomi, naomim4, naomi, naomi_state, init_naomi, ROT0, "Sega", "Asian Dynamite / Dynamite Deka EX", GAME_FLAGS )
/* 0175 */ GAME( 2007, asndynmto, asndynmt, naomim4, naomi, naomi_state, init_naomi, ROT0, "Sega", "Asian Dynamite / Dynamite Deka EX (older)", GAME_FLAGS ) // no revision stickers, presumably older revision but might be release for Asian market
/* 0177 */ GAME( 2007, rhytngk, naomi, naomim4, naomi, naomi_state, init_naomi, ROT0, "Sega / Nintendo - J.P ROOM", "Rhythm Tengoku (Japan)", GAME_FLAGS )
/* 0180 */ GAME( 2007, mushik4e, naomi, naomim4, naomi, naomi_state, init_naomi, ROT0, "Sega", "Mushiking The King Of Beetles - Mushiking IV / V / VI (World)", GAME_FLAGS ) // not for Japan or Korea, version can be changed in secret menu, ~equivalent of Japanese 2K6 versions.
/* 0186 */ GAME( 2009, shorsepr, naomi, naomim4, naomi, naomi_state, init_naomi, ROT270,"Sega", "Star Horse Progress Returns (satellite)", GAME_FLAGS )
// 0xxx Mushiking 2K3 1ST (Japan)
// 0xxx Mushiking 2K4 1ST (Japan)
// 0xxx Mushiking 2K5 2ND (Japan) note: starting from ver 2K6 2ND was moved to SystemSP platform and later to PC-based hardware
// 00xx Mayjinsen (Formation Battle in May) - prototype, never released
// 01xx Mushiking 2K3 1ST (Japan)
// 01xx Mushiking 2K4 1ST (Japan)
// 01xx Mushiking 2K5 2ND (Japan)
// 0xxx Star Horse 2001 (main screens, server)
// 0xxx Star Horse 2002 (whole set)
// 0xxx Star Horse Progress Returns (main screens, server)
// 00xx Mayjinsen (Formation Battle in May) - prototype, never released
/* Cartridge prototypes of games released on GD-ROM */
/* none */ GAME( 2003, puyofevp, puyofev, naomim1, naomi, naomi_state, init_naomi, ROT0, "Sega", "Puyo Puyo Fever (prototype ver 0.01)", GAME_FLAGS )
/* none */ GAME( 2001, vathletep, vathlete, naomim2, naomi, naomi_state, init_naomi, ROT0, "Sega", "Virtua Athletics / Virtua Athlete (prototype)", GAME_FLAGS )
/* 840-xxxxx (Sega Naomi 2 cart games) */
/* 0046 */ GAME( 2001, wldrider, naomi2, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Wild Riders", GAME_FLAGS )
/* 0061 */ GAME( 2001, vstrik3co,vstrik3c,naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Virtua Striker 3 (World)", GAME_FLAGS ) // not for Japan
/* 0061 */ GAME( 2001, vstrik3c, naomi2, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Virtua Striker 3 (World, Rev B)", GAME_FLAGS ) // not for Japan
/* 0062 */ GAME( 2001, clubkrto, clubkrt, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart: European Session", GAME_FLAGS )
/* 0062 */ GAME( 2001, clubkrta, clubkrt, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart: European Session (Rev A)", GAME_FLAGS )
/* 0062 */ GAME( 2001, clubkrtc, clubkrt, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart: European Session (Rev C)", GAME_FLAGS )
/* 0062 */ GAME( 2001, clubkrt, naomi2, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart: European Session (Rev D)", GAME_FLAGS )
/* 0080 */ GAME( 2002, vf4cart, naomi2, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Virtua Fighter 4 (World)", GAME_FLAGS ) // not for Japan
/* none */ GAME( 2002, kingrt66p,kingrt66,naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "The King of Route 66 (prototype)", GAME_FLAGS )
/* 0087 */ GAME( 2002, kingrt66, naomi2, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "The King of Route 66 (Rev A)", GAME_FLAGS )
/* 0095 */ GAME( 2002, soulsurf, naomi2, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Soul Surfer (Rev A)", GAME_FLAGS )
/* 0106 */ GAME( 2002, vf4evoct, naomi2, naomi2m1, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Virtua Fighter 4 Evolution (World)", GAME_FLAGS ) // not for Japan
/* 0129 */ GAME( 2003, clubkprz, naomi2, naomi2m1, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart Prize (Export, Japan)", GAME_FLAGS )
/* 0137 */ GAME( 2004, clubkpzb, naomi2, naomi2m1, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart Prize Version B (Export, Japan)", GAME_FLAGS )
/* 0139 */ GAME( 2003, clubk2k3, naomi2, naomi2m1, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart: European Session (2003, Rev A)", GAME_FLAGS )
/* none */ GAME( 2003, clubk2kp, clubk2k3,naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart: European Session (2003, prototype)", GAME_FLAGS )
/* 0046 */ GAME( 2001, wldrider, naomi2, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Wow Entertainment / Sega", "Wild Riders", GAME_FLAGS )
/* 0061 */ GAME( 2001, vstrik3co,vstrik3c,naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Amusement Vision / Sega", "Virtua Striker 3 (World)", GAME_FLAGS ) // not for Japan
/* 0061 */ GAME( 2001, vstrik3c, naomi2, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Amusement Vision / Sega", "Virtua Striker 3 (World, Rev B)", GAME_FLAGS ) // not for Japan
/* 0062 */ GAME( 2001, clubkrto, clubkrt, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart: European Session", GAME_FLAGS )
/* 0062 */ GAME( 2001, clubkrta, clubkrt, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart: European Session (Rev A)", GAME_FLAGS )
/* 0062 */ GAME( 2001, clubkrtc, clubkrt, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart: European Session (Rev C)", GAME_FLAGS )
/* 0062 */ GAME( 2001, clubkrt, naomi2, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart: European Session (Rev D)", GAME_FLAGS )
/* 0080 */ GAME( 2002, vf4cart, naomi2, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Virtua Fighter 4 (World)", GAME_FLAGS ) // not for Japan
/* none */ GAME( 2002, kingrt66p,kingrt66,naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "The King of Route 66 (prototype)", GAME_FLAGS )
/* 0087 */ GAME( 2002, kingrt66, naomi2, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "The King of Route 66 (Rev A)", GAME_FLAGS )
/* 0095 */ GAME( 2002, soulsurf, naomi2, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Soul Surfer (Rev A)", GAME_FLAGS )
/* 0106 */ GAME( 2002, vf4evoct, naomi2, naomi2m1, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Virtua Fighter 4 Evolution (World)", GAME_FLAGS ) // not for Japan
/* 0129 */ GAME( 2003, clubkprz, naomi2, naomi2m1, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart Prize (Export, Japan, Rev A)", GAME_FLAGS )
/* 0137 */ GAME( 2004, clubkpzb, naomi2, naomi2m1, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart Prize Version B (Export, Japan)", GAME_FLAGS )
/* 0139 */ GAME( 2003, clubk2k3, naomi2, naomi2m1, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart: European Session (2003, Rev A)", GAME_FLAGS )
/* none */ GAME( 2003, clubk2kp, clubk2k3,naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart: European Session (2003, prototype)", GAME_FLAGS )
/* 841-xxxxx ("Licensed by Sega" Naomi cart games)*/
/* 0001 */ GAME( 1999, pstone, naomi, naomim2, naomi, naomi_state, init_naomi, ROT0, "Capcom", "Power Stone", GAME_FLAGS )
@ -11209,9 +11245,9 @@ ROM_END
/* 0058 */ GAME( 2008, ausfache, naomi, naomim4, naomi, naomi_state, init_naomi, ROT0, "Subtle Style", "Akatsuki Blitzkampf Ausf. Achse (Japan)", GAME_FLAGS )
/* 0059 */ GAME( 2008, illvelo, naomi, naomim4, naomi, naomi_state, init_naomi, ROT270,"Milestone", "Illvelo (Illmatic Envelope) (Japan)", GAME_FLAGS )
/* 0060 */ GAME( 2008, mamonoro, naomi, naomim4, naomi, naomi_state, init_naomi, ROT270,"G.Rev", "Mamoru-kun wa Norowarete Shimatta! (Japan)", GAME_FLAGS )
/* 0061 */ GAME( 2008, mbaao, mbaa, naomim4, naomi, naomi_state, init_naomi, ROT0, "Type-Moon/Ecole", "Melty Blood Actress Again (Japan)", GAME_FLAGS )
/* 0061 */ GAME( 2008, mbaa, naomi, naomim4, naomi, naomi_state, init_naomi, ROT0, "Type-Moon/Ecole", "Melty Blood Actress Again Version A (Japan, Rev A)", GAME_FLAGS )
/* 0062 */ GAME( 2009, radirgyn, naomi, naomim4, naomi, naomi_state, init_naomi, ROT0, "Milestone/Lucky", "Radirgy Noa (Japan)", GAME_FLAGS )
/* 0061 */ GAME( 2008, mbaao, mbaa, naomim4, naomi, naomi_state, init_naomi, ROT0, "Type-Moon / Ecole", "Melty Blood Actress Again (Japan)", GAME_FLAGS )
/* 0061 */ GAME( 2008, mbaa, naomi, naomim4, naomi, naomi_state, init_naomi, ROT0, "Type-Moon / Ecole", "Melty Blood Actress Again Version A (Japan, Rev A)", GAME_FLAGS )
/* 0062 */ GAME( 2009, radirgyn, naomi, naomim4, naomi, naomi_state, init_naomi, ROT0, "Milestone / Lucky", "Radirgy Noa (Japan)", GAME_FLAGS )
/* HMG016007 */ GAME( 2001, hmgeo, naomi, naomim2, naomi, naomi_state, init_naomi, ROT0, "Capcom", "Heavy Metal Geomatrix (Rev B)", GAME_FLAGS )
/* Cart games on Namco custom ROM board
@ -11251,13 +11287,13 @@ ROM_END
// 0009 Dynamic Golf / Virtua Golf (GDS-0009)
/* 0009A */ GAME( 2001, dygolf, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Sega", "Virtua Golf / Dynamic Golf (Rev A) (GDS-0009A)", GAME_FLAGS )
/* 0010 */ GAME( 2001, wsbbgd, naomigd, naomigd, dybbnao, naomi_state, init_naomigd, ROT0, "Sega", "World Series Baseball / Super Major League (GDS-0010)", GAME_FLAGS )
/* 0011 */ GAME( 1999, vtennisg, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Sega", "Virtua Tennis / Power Smash (GDS-0011)", GAME_FLAGS )
/* 0011 */ GAME( 2001, vtennisg, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Sega", "Virtua Tennis / Power Smash (GDS-0011)", GAME_FLAGS )
/* 0012 */ GAME( 2001, vf4o, vf4, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Virtua Fighter 4 (GDS-0012)", GAME_FLAGS )
// 0012A Virtua Fighter 4 (Rev A) (GDS-0012A)
/* 0012B */ GAME( 2001, vf4b, vf4, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Virtua Fighter 4 (Rev B) (GDS-0012B)", GAME_FLAGS )
/* 0012C */ GAME( 2001, vf4, naomi2, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Virtua Fighter 4 Version C (GDS-0012C)", GAME_FLAGS )
/* 0012B */ GAME( 2001, vf4b, vf4, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Virtua Fighter 4 (Rev B) (GDS-0012B)", GAME_FLAGS )
/* 0012C */ GAME( 2001, vf4, naomi2, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Virtua Fighter 4 Version C (GDS-0012C)", GAME_FLAGS )
/* 0013 */ GAME( 2001, shaktmsp, naomigd, naomigd, shaktamb, naomi_state, init_naomigd, ROT0, "Sega", "Shakatto Tambourine Motto Norinori Shinkyoku Tsuika (2K1 SPR) (GDS-0013)", GAME_FLAGS )
/* 0014 */ GAME( 2001, beachspi, naomi2, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Beach Spikers (GDS-0014)", GAME_FLAGS )
/* 0014 */ GAME( 2001, beachspi, naomi2, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "CRI / Sega", "Beach Spikers (GDS-0014)", GAME_FLAGS )
// 0015 Virtua Tennis 2 / Power Smash 2 (GDS-0015)
/* 0015A */ GAME( 2001, vtennis2, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Sega", "Virtua Tennis 2 / Power Smash 2 (Rev A) (GDS-0015A)", GAME_FLAGS )
/* 0016 */ GAME( 2001, shaktamb, naomigd, naomigd, shaktamb, naomi_state, init_naomigd, ROT0, "Sega", "Shakatto Tambourine Cho Powerup Chu (2K1 AUT) (GDS-0016)", GAME_FLAGS )
@ -11266,8 +11302,8 @@ ROM_END
/* 0018A */ GAME( 2001, lupinsho, naomigd, naomigd, hotd2, naomi_state, init_naomigd, ROT0, "Sega / Eighting", "Lupin The Third - The Shooting (Rev A) (GDS-0018A)", GAME_FLAGS )
/* 0019 */ GAME( 2001, vathlete, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Sega", "Virtua Athletics / Virtua Athlete (GDS-0019)", GAME_FLAGS )
/* 0020 */ GAME( 2002, initdo, initd, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage (Japan) (GDS-0020)", GAME_FLAGS )
// 0020A Initial D Arcade Stage (Rev A) (GDS-0020A)
/* 0020B */ GAME( 2002, initd, naomi2, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage (Rev B) (Japan) (GDS-0020B)", GAME_FLAGS )
// 0020A Initial D Arcade Stage (Japan, Rev A) (GDS-0020A)
/* 0020B */ GAME( 2002, initd, naomi2, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage (Japan, Rev B) (GDS-0020B)", GAME_FLAGS )
// 0021 Lupin The Third - The Typing (GDS-0021)
/* 0021A */ GAME( 2002, luptype, naomigd, naomigd_kb, naomi_kb, naomi_state, init_naomigd, ROT0, "Sega", "Lupin The Third - The Typing (Rev A) (GDS-0021A)", GAME_FLAGS )
/* 0022 */ GAME( 2002, mok, naomigd, naomigd, hotd2, naomi_state, init_naomigd, ROT0, "Sega", "The Maze of the Kings (GDS-0022)", GAME_FLAGS )
@ -11282,10 +11318,10 @@ ROM_END
/* 0024B */ GAME( 2002, vf4evob, vf4evo, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Virtua Fighter 4 Evolution (Version B) (Japan) (GDS-0024B)", GAME_FLAGS )
/* 0024C */ GAME( 2002, vf4evo, naomi2, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Virtua Fighter 4 Evolution (Version B) (Japan) (GDS-0024C)", GAME_FLAGS )
/* 0025 */ GAME( 2002, initdexpo,initdexp,naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage (Export) (GDS-0025)", GAME_FLAGS )
/* 0025A */ GAME( 2002, initdexp, naomi2, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage (Export) (Rev A) (GDS-0025A)", GAME_FLAGS )
/* 0025A */ GAME( 2002, initdexp, naomi2, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage (Export, Rev A) (GDS-0025A)", GAME_FLAGS )
/* 0026 */ GAME( 2002, initdv2jo,initdv2j,naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 2 (Japan) (GDS-0026)", GAME_FLAGS )
/* 0026A */ GAME( 2002, initdv2ja,initdv2j,naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 2 (Japan) (Rev A) (GDS-0026A)", GAME_FLAGS )
/* 0026B */ GAME( 2003, initdv2j, naomi2, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 2 (Japan) (Rev B) (GDS-0026B)", GAME_FLAGS )
/* 0026A */ GAME( 2002, initdv2ja,initdv2j,naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 2 (Japan, Rev A) (GDS-0026A)", GAME_FLAGS )
/* 0026B */ GAME( 2003, initdv2j, naomi2, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 2 (Japan, Rev B) (GDS-0026B)", GAME_FLAGS )
/* 0027 */ GAME( 2003, initdv2e, initdv2j,naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 2 (Export) (GDS-0027)", GAME_FLAGS )
// 0028 Shakka to Tambourine 4EVER (GD SOFT TMB 4EVER)
/* 0029 */ GAME( 2003, clubkcyco,clubkcyc,naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart for Cycraft (GDS-0029)", GAME_FLAGS )
@ -11294,25 +11330,25 @@ ROM_END
/* 0030B */ GAME( 2003, dragntr, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Sega", "Dragon Treasure (Rev B) (GDS-0030B)", GAME_FLAGS )
/* 0031 */ GAME( 2003, puyofevj, puyofev, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Sega", "Puyo Puyo Fever (Japan) (GDS-0031)", GAME_FLAGS )
// 0032 Initial D Arcade Stage Ver. 3 (Japan) (GDS-0032)
// 0032A Initial D Arcade Stage Ver. 3 (Japan) (Rev A) (GDS-0032A)
/* 0032B */ GAME( 2004, initdv3jb,initdv3j,naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 3 (Japan) (Rev B) (GDS-0032B)", GAME_FLAGS )
/* 0032C */ GAME( 2004, initdv3j, naomi2, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 3 (Japan) (Rev C) (GDS-0032C)", GAME_FLAGS )
// 0032A Initial D Arcade Stage Ver. 3 (Japan, Rev A) (GDS-0032A)
/* 0032B */ GAME( 2004, initdv3jb,initdv3j,naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 3 (Japan, Rev B) (GDS-0032B)", GAME_FLAGS )
/* 0032C */ GAME( 2004, initdv3j, naomi2, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 3 (Japan, Rev C) (GDS-0032C)", GAME_FLAGS )
/* 0033 */ GAME( 2004, initdv3e, naomi2, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 3 (Export) (GDS-0033)", GAME_FLAGS )
/* 0034 */ GAME( 2003, puyofev, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Sega", "Puyo Pop Fever (World) (GDS-0034)", GAME_FLAGS )
// 0035 GD SOFT KIT DKG
// 0036 Virtua Fighter 4 Final Tuned (GDS-0036)
/* 0036A */ GAME( 2004, vf4tuneda,vf4tuned,naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Virtua Fighter 4 Final Tuned (GDS-0036A)", GAME_FLAGS )
// 0036B Virtua Fighter 4 Final Tuned (GDS-0036B)
// 0036C Virtua Fighter 4 Final Tuned (GDS-0036C)
/* 0036A */ GAME( 2004, vf4tuneda,vf4tuned,naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Virtua Fighter 4 Final Tuned (Rev A) (GDS-0036A)", GAME_FLAGS )
// 0036B Virtua Fighter 4 Final Tuned (Rev B) (GDS-0036B)
// 0036C Virtua Fighter 4 Final Tuned (Rev C) (GDS-0036C)
/* 0036D */ GAME( 2004, vf4tunedd,vf4tuned,naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Virtua Fighter 4 Final Tuned (Ver. A) (GDS-0036D)", GAME_FLAGS )
// 0036E Virtua Fighter 4 Final Tuned (GDS-0036E)
// 0036E Virtua Fighter 4 Final Tuned (Rev E) (GDS-0036E)
/* 0036F */ GAME( 2004, vf4tuned, naomi2, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Virtua Fighter 4 Final Tuned (Ver. B) (GDS-0036F)", GAME_FLAGS )
// 0037 Dragon Treasure 2 (GDS-0037)
/* 0037A */ GAME( 2004, dragntr2, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Sega", "Dragon Treasure 2 (Rev A) (GDS-0037A)", GAME_FLAGS )
// 0038 Initial D Arcade Stage Ver. 3 Cycraft Edition (Japan) (NAOMI2 GDROM TOS SP)
// 0039 Initial D Arcade Stage Ver. 3 Cycraft Edition (Export) (GDS-0039)
/* 0039A */ GAME( 2004, inidv3ca, inidv3cy,naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 3 Cycraft Edition (Export) (Rev A) (GDS-0039A)", GAME_FLAGS )
/* 0039B */ GAME( 2006, inidv3cy, naomi2, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 3 Cycraft Edition (Export) (Rev B) (GDS-0039B)", GAME_FLAGS )
/* 0039A */ GAME( 2004, inidv3ca, inidv3cy,naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 3 Cycraft Edition (Export, Rev A) (GDS-0039A)", GAME_FLAGS )
/* 0039B */ GAME( 2006, inidv3cy, naomi2, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 3 Cycraft Edition (Export, Rev B) (GDS-0039B)", GAME_FLAGS )
// 0040 NAOMI2 GDROM MTG
// 0041 Dragon Treasure 3 (GDS-0041)
/* 0041A */ GAME( 2005, dragntr3, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Sega", "Dragon Treasure 3 (Rev A) (GDS-0041A)", GAME_FLAGS )
@ -11329,12 +11365,12 @@ ROM_END
/* 0005 */ GAME( 2001, starseek, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "G.Rev", "Doki Doki Idol Star Seeker (GDL-0005)", MACHINE_IMPERFECT_GRAPHICS|MACHINE_IMPERFECT_SOUND )
/* 0006 */ GAME( 2001, gundmxgd, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Capcom", "Mobile Suit Gundam: Federation Vs. Zeon DX (USA, Japan) (GDL-0006)", GAME_FLAGS )
// 0007 Capcom Vs. SNK 2 (Japan) (GDL-0007)
/* 0007A */ GAME( 2001, cvs2mf, cvs2, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Capcom / SNK", "Capcom Vs. SNK 2 Millionaire Fighting 2001 (Japan) (Rev A) (GDL-0007A)", GAME_FLAGS )
/* 0007A */ GAME( 2001, cvs2mf, cvs2, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Capcom / SNK", "Capcom Vs. SNK 2 Millionaire Fighting 2001 (Japan, Rev A) (GDL-0007A)", GAME_FLAGS )
/* 0008 */ GAME( 2001, cvs2, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Capcom / SNK", "Capcom Vs. SNK 2 Mark Of The Millennium 2001 (USA) (GDL-0008)", GAME_FLAGS )
// 0009 Capcom Vs. SNK 2 (Export)
/* 0010 */ GAME( 2001, ikaruga, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT270, "Treasure", "Ikaruga (GDL-0010)", GAME_FLAGS )
/* 0011 */ GAME( 2002, ggxx, naomigd, naomigd, naomi, naomi_state, init_ggxx, ROT0,"Arc System Works","Guilty Gear XX (GDL-0011)", GAME_FLAGS )
/* 0012 */ GAME( 2002, cleoftp, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Altron", "Cleopatra Fortune Plus (GDL-0012)", MACHINE_IMPERFECT_GRAPHICS|MACHINE_IMPERFECT_SOUND )
/* 0012 */ GAME( 2002, cleoftp, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Altron / Taito", "Cleopatra Fortune Plus (GDL-0012)", MACHINE_IMPERFECT_GRAPHICS|MACHINE_IMPERFECT_SOUND )
/* 0013 */ GAME( 2002, moeru, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Altron", "Moeru Casinyo (Japan) (GDL-0013)", GAME_FLAGS )
// 0014 Musapey's Choco Marker (GDL-0014)
/* 0014A */ GAME( 2002, chocomk, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Ecole Software", "Musapey's Choco Marker (Rev A) (GDL-0014A)", GAME_FLAGS )

View File

@ -14,11 +14,11 @@
- HDL is also connected to WP/TS input where TS is used to detect motor status
- 3 second motor off delay timer
- video (video RAM is at memory top - 0x1400, i.e. 0x1ec00)
- keyboard ROM
- hires graphics board
- keyboard ROM, same as earlier tandy 1000
- WD1010
- hard disk
- mouse
- clock/mouse 8042 mcu ROM, probably same as tandy 1000 isa clock/mouse adapter
- sab3019 rtc
*/
@ -219,6 +219,77 @@ READ8_MEMBER( tandy2k_state::kbint_clr_r )
return 0xff;
}
READ8_MEMBER( tandy2k_state::clkmouse_r )
{
uint8_t ret = 0;
switch (offset)
{
case 0:
if (!m_clkmouse_cnt)
return 0;
ret = m_clkmouse_cmd[--m_clkmouse_cnt];
m_pic1->ir2_w(0);
if (m_clkmouse_cnt > 0)
m_mcu_delay->adjust(attotime::from_msec(1));
break;
case 2:
ret = m_buttons->read();
if (m_clkmouse_cnt)
ret |= 1;
break;
}
return ret;
}
WRITE8_MEMBER( tandy2k_state::clkmouse_w )
{
switch (offset)
{
case 0:
m_pic1->ir2_w(0);
if (m_clkmouse_cnt < 8)
m_clkmouse_cmd[m_clkmouse_cnt++] = data;
break;
case 1:
break;
case 2:
if (m_clkmouse_cnt < 8)
m_clkmouse_cmd[m_clkmouse_cnt++] = data;
switch (m_clkmouse_cmd[0])
{
case 0x01: //set time
break;
case 0x02: //read time
break;
case 0x08:
if(m_clkmouse_cmd[1] > 0)
m_clkmouse_irq |= MO_IRQ;
else
m_clkmouse_irq &= ~MO_IRQ;
if(m_clkmouse_cmd[2] > 0)
m_clkmouse_irq |= BT_IRQ;
else
m_clkmouse_irq &= ~BT_IRQ;
break;
case 0x20:
if(m_clkmouse_cmd[1] > 0)
m_mouse_timer->adjust(attotime::from_hz(40), 0, attotime::from_hz(40));
else
m_mouse_timer->adjust(attotime::never);
break;
}
m_clkmouse_cnt = 0;
break;
case 3:
m_pic1->ir2_w(0);
m_clkmouse_cnt = 0;
m_clkmouse_irq = 0;
m_mouse_x = m_x_axis->read();
m_mouse_y = m_y_axis->read();
break;
}
}
READ8_MEMBER( tandy2k_state::fldtc_r )
{
if (LOG) logerror("FLDTC\n");
@ -315,6 +386,7 @@ void tandy2k_state::tandy2k_io(address_map &map)
map(0x00180, 0x00180).r(FUNC(tandy2k_state::hires_status_r)).umask16(0x00ff);
map(0x00180, 0x0018f).mirror(0x10).w(m_colpal, FUNC(palette_device::write8)).umask16(0x00ff).share("colpal");
map(0x001a0, 0x001a0).w(FUNC(tandy2k_state::hires_plane_w)).umask16(0x00ff);
map(0x002fc, 0x002ff).rw(FUNC(tandy2k_state::clkmouse_r), FUNC(tandy2k_state::clkmouse_w));
}
void tandy2k_state::tandy2k_hd_io(address_map &map)
@ -368,8 +440,47 @@ static INPUT_PORTS_START( tandy2k )
PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Home") PORT_CODE(KEYCODE_HOME) /* HOME 58 D8 */
PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F11") PORT_CODE(KEYCODE_F11) /* F11 59 D9 */
PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F12") PORT_CODE(KEYCODE_F12) /* F12 5a Da */
PORT_START("MOUSEBTN")
PORT_BIT( 0xff8f, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_CODE(MOUSECODE_BUTTON1) PORT_CHANGED_MEMBER(DEVICE_SELF, tandy2k_state, input_changed, nullptr)
PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_CODE(MOUSECODE_BUTTON2) PORT_CHANGED_MEMBER(DEVICE_SELF, tandy2k_state, input_changed, nullptr)
PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_UNUSED ) /* this would be button three but AFAIK no tandy mouse ever had one */
PORT_START("MOUSEX")
PORT_BIT( 0xffff, 0x00, IPT_MOUSE_X ) PORT_SENSITIVITY(50) PORT_KEYDELTA(0) PORT_CHANGED_MEMBER(DEVICE_SELF, tandy2k_state, input_changed, nullptr)
PORT_START("MOUSEY")
PORT_BIT( 0xffff, 0x00, IPT_MOUSE_Y ) PORT_SENSITIVITY(50) PORT_KEYDELTA(0) PORT_CHANGED_MEMBER(DEVICE_SELF, tandy2k_state, input_changed, nullptr)
INPUT_PORTS_END
INPUT_CHANGED_MEMBER(tandy2k_state::input_changed)
{
if (m_clkmouse_cnt || !m_clkmouse_irq)
return;
if ((m_clkmouse_irq & BT_IRQ) && (field.name()[5] == 'B'))
{
m_clkmouse_cnt = 1;
m_clkmouse_cmd[0] = 'B';
}
else if ((m_clkmouse_irq & MO_IRQ))
{
uint16_t x = m_x_axis->read();
uint16_t y = m_y_axis->read();
uint16_t dx = x - m_mouse_x;
uint16_t dy = y - m_mouse_y;
m_mouse_x = x;
m_mouse_y = y;
m_clkmouse_cnt = 5;
m_clkmouse_cmd[4] = 'M';
m_clkmouse_cmd[3] = dx & 0xff;
m_clkmouse_cmd[2] = dx >> 8;
m_clkmouse_cmd[1] = dy & 0xff;
m_clkmouse_cmd[0] = dy >> 8;
}
m_pic1->ir2_w(1);
}
// Video
uint32_t tandy2k_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
@ -788,7 +899,8 @@ void tandy2k_state::machine_start()
program.install_ram(0x00000, ram_size - 1, ram);
m_char_ram.allocate(0x1000);
m_hires_en = 0;
m_mouse_timer = timer_alloc(MOUS_TIMER);
m_mcu_delay = timer_alloc(MCU_DELAY);
// register for state saving
save_item(NAME(m_dma_mux));
@ -804,6 +916,19 @@ void tandy2k_state::machine_start()
save_item(NAME(m_clkcnt));
save_item(NAME(m_outspkr));
save_item(NAME(m_spkrdata));
save_item(NAME(m_clkmouse_cmd));
save_item(NAME(m_clkmouse_cnt));
save_item(NAME(m_clkmouse_irq));
save_item(NAME(m_mouse_x));
save_item(NAME(m_mouse_y));
save_item(NAME(m_hires_en));
}
void tandy2k_state::machine_reset()
{
m_hires_en = 0;
m_clkmouse_cnt = 0;
m_clkmouse_irq = 0;
}
void tandy2k_state::device_reset_after_children()
@ -811,6 +936,33 @@ void tandy2k_state::device_reset_after_children()
m_pc_keyboard->enable(0);
}
void tandy2k_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{
switch (id)
{
case MOUS_TIMER:
{
uint16_t x = m_x_axis->read();
uint16_t y = m_y_axis->read();
uint16_t dx = x - m_mouse_x;
uint16_t dy = y - m_mouse_y;
m_mouse_x = x;
m_mouse_y = y;
m_clkmouse_cnt = 5;
m_clkmouse_cmd[4] = 'A';
m_clkmouse_cmd[3] = dx & 0xff;
m_clkmouse_cmd[2] = dx >> 8;
m_clkmouse_cmd[1] = dy & 0xff;
m_clkmouse_cmd[0] = dy >> 8;
m_pic1->ir2_w(1);
break;
}
case MCU_DELAY:
m_pic1->ir2_w(1);
break;
}
}
rgb_t tandy2k_state::IRGB(uint32_t raw)
{
uint8_t i = (raw >> 3) & 1;

View File

@ -0,0 +1,72 @@
// license:BSD-3-Clause
// copyright-holders:hap
/******************************************************************************
*
* Chess King chess computer driver base class
*
******************************************************************************/
#pragma once
#ifndef MAME_INCLUDES_CKINGBASE_H
#define MAME_INCLUDES_CKINGBASE_H
#include "machine/timer.h"
class ckingbase_state : public driver_device
{
public:
ckingbase_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_irq_on(*this, "irq_on"),
m_inp_matrix(*this, "IN.%u", 0),
m_out_x(*this, "%u.%u", 0U, 0U),
m_out_a(*this, "%u.a", 0U),
m_out_digit(*this, "digit%u", 0U),
m_display_wait(33),
m_display_maxy(1),
m_display_maxx(0)
{ }
// devices/pointers
required_device<cpu_device> m_maincpu;
optional_device<timer_device> m_irq_on;
optional_ioport_array<10> m_inp_matrix; // max 10
output_finder<0x20, 0x20> m_out_x;
output_finder<0x20> m_out_a;
output_finder<0x20> m_out_digit;
template<int L> TIMER_DEVICE_CALLBACK_MEMBER(irq_on) { m_maincpu->set_input_line(L, ASSERT_LINE); }
template<int L> TIMER_DEVICE_CALLBACK_MEMBER(irq_off) { m_maincpu->set_input_line(L, CLEAR_LINE); }
// misc common
u16 m_inp_mux; // multiplexed keypad mask
u16 m_led_select;
u16 m_led_data;
u16 read_inputs(int columns);
// display common
int m_display_wait; // led/lamp off-delay in milliseconds (default 33ms)
int m_display_maxy; // display matrix number of rows
int m_display_maxx; // display matrix number of columns (max 31 for now)
u32 m_display_state[0x20]; // display matrix rows data (last bit is used for always-on)
u16 m_display_segmask[0x20]; // if not 0, display matrix row is a digit, mask indicates connected segments
u8 m_display_decay[0x20][0x20]; // (internal use)
TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick);
void display_update();
void set_display_size(int maxx, int maxy);
void display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update = true);
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
};
INPUT_PORTS_EXTERN( cking_cb_buttons );
#endif // MAME_INCLUDES_CKINGBASE_H

View File

@ -0,0 +1,75 @@
// license:BSD-3-Clause
// copyright-holders:hap
/******************************************************************************
*
* CXG chess computer driver base class
*
******************************************************************************/
#pragma once
#ifndef MAME_INCLUDES_CXGBASE_H
#define MAME_INCLUDES_CXGBASE_H
#include "machine/timer.h"
#include "sound/dac.h"
class cxgbase_state : public driver_device
{
public:
cxgbase_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_irq_on(*this, "irq_on"),
m_dac(*this, "dac"),
m_inp_matrix(*this, "IN.%u", 0),
m_out_x(*this, "%u.%u", 0U, 0U),
m_out_a(*this, "%u.a", 0U),
m_out_digit(*this, "digit%u", 0U),
m_display_wait(33),
m_display_maxy(1),
m_display_maxx(0)
{ }
// devices/pointers
required_device<cpu_device> m_maincpu;
optional_device<timer_device> m_irq_on;
optional_device<dac_bit_interface> m_dac;
optional_ioport_array<10> m_inp_matrix; // max 10
output_finder<0x20, 0x20> m_out_x;
output_finder<0x20> m_out_a;
output_finder<0x20> m_out_digit;
template<int L> TIMER_DEVICE_CALLBACK_MEMBER(irq_on) { m_maincpu->set_input_line(L, ASSERT_LINE); }
template<int L> TIMER_DEVICE_CALLBACK_MEMBER(irq_off) { m_maincpu->set_input_line(L, CLEAR_LINE); }
// misc common
u16 m_inp_mux; // multiplexed keypad mask
u16 m_led_select;
u16 m_led_data;
u16 read_inputs(int columns);
// display common
int m_display_wait; // led/lamp off-delay in milliseconds (default 33ms)
int m_display_maxy; // display matrix number of rows
int m_display_maxx; // display matrix number of columns (max 31 for now)
u32 m_display_state[0x20]; // display matrix rows data (last bit is used for always-on)
u16 m_display_segmask[0x20]; // if not 0, display matrix row is a digit, mask indicates connected segments
u8 m_display_decay[0x20][0x20]; // (internal use)
TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick);
void display_update();
void set_display_size(int maxx, int maxy);
void display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update = true);
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
};
INPUT_PORTS_EXTERN( cxg_cb_magnets );
#endif // MAME_INCLUDES_CXGBASE_H

View File

@ -0,0 +1,33 @@
// license:BSD-3-Clause
// copyright-holders:hap
/******************************************************************************
*
* Fidelity Electronics Designer Display common class
*
******************************************************************************/
#pragma once
#ifndef MAME_INCLUDES_DESDIS_COMMON_H
#define MAME_INCLUDES_DESDIS_COMMON_H
#include "includes/fidelbase.h"
class desdis_common_state : public fidelbase_state
{
public:
desdis_common_state(const machine_config &mconfig, device_type type, const char *tag) :
fidelbase_state(mconfig, type, tag)
{ }
protected:
// I/O handlers
virtual DECLARE_WRITE8_MEMBER(control_w);
virtual DECLARE_WRITE8_MEMBER(lcd_w);
virtual DECLARE_READ8_MEMBER(input_r);
};
INPUT_PORTS_EXTERN( desdis );
#endif // MAME_INCLUDES_DESDIS_COMMON_H

View File

@ -26,6 +26,7 @@ public:
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_irq_on(*this, "irq_on"),
m_rombank(*this, "rombank"),
m_inp_matrix(*this, "IN.%u", 0),
m_out_x(*this, "%u.%u", 0U, 0U),
m_out_a(*this, "%u.a", 0U),
@ -42,6 +43,7 @@ public:
// devices/pointers
required_device<cpu_device> m_maincpu;
optional_device<timer_device> m_irq_on;
optional_memory_bank m_rombank;
optional_ioport_array<11> m_inp_matrix; // max 11
output_finder<0x20, 0x20> m_out_x;
output_finder<0x20> m_out_a;

View File

@ -100,7 +100,10 @@ public:
m_centronics_fault(0),
m_centronics_select(0),
m_centronics_perror(0),
m_centronics_busy(0)
m_centronics_busy(0),
m_buttons(*this, "MOUSEBTN"),
m_x_axis(*this, "MOUSEX"),
m_y_axis(*this, "MOUSEY")
{
for (auto & elem : m_busdmarq)
{
@ -110,6 +113,7 @@ public:
void tandy2k_hd(machine_config &config);
void tandy2k(machine_config &config);
DECLARE_INPUT_CHANGED_MEMBER(input_changed);
private:
required_device<i80186_cpu_device> m_maincpu;
@ -138,7 +142,9 @@ private:
required_device<pc_keyboard_device> m_pc_keyboard; // temporary until the tandy keyboard has a rom dump
virtual void machine_start() override;
virtual void machine_reset() override;
virtual void device_reset_after_children() override;
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
@ -176,6 +182,8 @@ private:
DECLARE_WRITE8_MEMBER( drb_attr_w );
DECLARE_WRITE_LINE_MEMBER( kbdclk_w );
DECLARE_WRITE_LINE_MEMBER( kbddat_w );
DECLARE_READ8_MEMBER( clkmouse_r );
DECLARE_WRITE8_MEMBER( clkmouse_w );
DECLARE_READ8_MEMBER( irq_callback );
DECLARE_WRITE_LINE_MEMBER( fdc_drq_w );
DECLARE_WRITE_LINE_MEMBER( fdc_hdl_w );
@ -240,11 +248,32 @@ private:
int m_centronics_perror;
int m_centronics_busy;
enum
{
MO_IRQ = 1,
BT_IRQ = 2
};
enum
{
MOUS_TIMER,
MCU_DELAY
};
uint8_t m_clkmouse_cmd[8];
int m_clkmouse_cnt;
uint8_t m_clkmouse_irq;
uint16_t m_mouse_x, m_mouse_y;
emu_timer *m_mouse_timer;
emu_timer *m_mcu_delay;
void tandy2k_hd_io(address_map &map);
void tandy2k_io(address_map &map);
void tandy2k_mem(address_map &map);
void vpac_mem(address_map &map);
void vrambank_mem(address_map &map);
required_ioport m_buttons, m_x_axis, m_y_axis;
};
#endif // MAME_INCLUDES_TANDY2K_H

View File

@ -200,7 +200,7 @@ static INPUT_PORTS_START(tv950kb)
PORT_START("FUNCT")
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Funct") PORT_CHAR(UCHAR_MAMEKEY(LALT)) PORT_CODE(KEYCODE_LALT)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Alpha Lock") PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) PORT_CODE(KEYCODE_CAPSLOCK)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Alpha Lock") PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) PORT_CODE(KEYCODE_CAPSLOCK) PORT_TOGGLE
PORT_BIT(0x9f, IP_ACTIVE_LOW, IPT_UNUSED)
INPUT_PORTS_END

View File

@ -73,7 +73,7 @@ static INPUT_PORTS_START(vt100_kbd)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("]") PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') PORT_CHAR('}')
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("~") PORT_CODE(KEYCODE_TILDE) PORT_CHAR('`') PORT_CHAR('~')
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("=") PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('=') PORT_CHAR('+')
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Line feed") PORT_CODE(KEYCODE_RALT) PORT_CHAR(UCHAR_MAMEKEY(RALT))
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Line feed") PORT_CODE(KEYCODE_RALT) PORT_CHAR(0x0a)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Return") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNUSED)
@ -152,7 +152,7 @@ static INPUT_PORTS_START(vt100_kbd)
PORT_START("LINEE")
PORT_BIT(0x7F, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Caps lock") PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK))
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Caps lock") PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) PORT_TOGGLE
PORT_START("LINEF")
PORT_BIT(0x7F, IP_ACTIVE_LOW, IPT_UNUSED)
@ -472,11 +472,11 @@ static INPUT_PORTS_START(ms7002)
PORT_START("LINED")
PORT_BIT(0x7F, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("\xd0\x92\xd0\xa0") PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) // ВР = верхний регистр
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("\xd0\xa1\xd0\x94\xd0\x92") PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) // СДВ = сдвинуть
PORT_START("LINEE")
PORT_BIT(0x7F, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) // maybe
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("\xd0\x92\xd0\xa0") PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) PORT_TOGGLE // ВР = верхний регистр
PORT_START("LINEF")
PORT_BIT(0x7F, IP_ACTIVE_LOW, IPT_UNUSED)

View File

@ -9897,7 +9897,7 @@ citycon // (c) 1985 Jaleco
citycona // (c) 1985 Jaleco
cruisin // (c) 1985 Jaleco/Kitkorp
@source:ckz80.cpp
@source:cking_master.cpp
ckmaster //
@source:clayshoo.cpp
@ -10915,7 +10915,7 @@ wallst // (c) 1982 Century
@source:cwheel.cpp
cwheel // (c) 19?? Gamebar
@source:cxgz80.cpp
@source:cxg_ch2001.cpp
ch2001 //
@source:cxhumax.cpp
@ -12849,6 +12849,9 @@ feversoc // (c) 2004
fgoal // TF (c) 1979 Taito Corporation
fgoala // MF (c) 1979 Taito Corporation
@source:fidel_sc6.cpp
fscc6 //
@source:fidel6502.cpp
chesster //
chesstera //
@ -12921,10 +12924,7 @@ fex68kb //
fex68km2 //
fex68km3 //
@source:fidelmcs48.cpp
fscc6 //
@source:fidelz80.cpp
@source:fidelbase.cpp
backgamc //
bridgec3 //
bridgeca //

View File

@ -138,7 +138,8 @@ chessmst.cpp
chesstrv.cpp
cit101.cpp
cit220.cpp
ckz80.cpp
cking_master.cpp
ckingbase.cpp
clcd.cpp
clickstart.cpp
cm1800.cpp
@ -163,7 +164,8 @@ crimson.cpp
crvision.cpp
ct486.cpp
cvicny.cpp
cxgz80.cpp
cxg_ch2001.cpp
cxgbase.cpp
cxhumax.cpp
cybiko.cpp
cz101.cpp
@ -239,10 +241,10 @@ fb01.cpp
fc100.cpp
fccpu20.cpp
fccpu30.cpp
fidel_sc6.cpp
fidel6502.cpp
fidel68k.cpp
fidelmcs48.cpp
fidelz80.cpp
fidelbase.cpp
fk1.cpp
fm7.cpp
fmtowns.cpp

View File

@ -375,6 +375,7 @@ static void osd_sdl_info(void)
void sdl_osd_interface::video_register()
{
video_options_add("soft", nullptr);
video_options_add("accel", nullptr);
#if USE_OPENGL
video_options_add("opengl", nullptr);
#endif