slc1: get rid of the fake double keyboard

This commit is contained in:
hap 2021-04-27 16:42:47 +02:00
parent 0d5a46097a
commit c351fc1da4
4 changed files with 77 additions and 156 deletions

View File

@ -5,52 +5,47 @@
2011-JUL-16 SLC1 skeleton driver [Robbbert]
2011-DEC-29 Working [Robbbert]
http://www.jens-mueller.org/jkcemu/slc1.html
reference: http://www.jens-mueller.org/jkcemu/slc1.html
This computer is both a Z80 trainer, and a chess computer.
The keyboard is different between the two, so
we redefine it for your convenience.
This computer is both a Z80 trainer, and a chess computer. The keyboard
is different between the two. So by default, the chess number buttons
are on the main keyboard, and the one for the trainer are on the numpad.
There is no chess board attached. You supply your own
and you sync the pieces and the computer instructions.
The chess engine was copied from Fidelity's Sensory
Chess Challenger 8.
There is no chess board attached. You supply your own and you sync the
pieces and the computer instructions. The chess engine was copied from
Fidelity's Sensory Chess Challenger 8.
When started, it is in Chess mode. Press 11111 to switch to
Trainer mode.
When started, it is in Chess mode. Press 11111 to switch to Trainer mode.
Hardware
Hardware:
4 Kbytes ROM in the address range 0000-0FFF
1 Kbyte RAM in the address range 5000-53ff (user area starts at 5100)
6-digit 7-segment display
Busy LED
Keyboard with 12 keys
Keys:
Trainer Keys:
0-7 : hexadecimal numbers
Shift then 0-7 : Hexadecimal 8-F (decimal points will appear)
ADR : enter an address to work with. After the 4 digits are entered,
the data at that address shows, and you can modify the data.
+ (inc) : Enter the data into memory, and increment the address by 1.
Pasting doesn't work, but if it did...
Pasting:
0-7 : as is
8-F : H, then 0-7
+ : ^
- : H^
ADR : -
8-F : X, then 0-7
+ : O
- : XO
ADR : Z
Test Paste:
[[[[[-510011^22^33^44^55^66^77^H8H8^H9H9^-5100
Now press up-arrow to confirm the data has been entered.
00000Z510011O22O33O44O55O66O77OX8X8OX9X9OZ5100
Now press O to confirm the data has been entered.
TODO:
- Make emulation more faithful, io_w doesn't make much sense from
a TTL wiring point of view.
- Likewise, having 2 auto-switching input mappings is convenient,
but not at all how the hardware works.
- Pasting doesn't work, probably too slow.
***************************************************************************/
@ -71,8 +66,7 @@ public:
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
, m_speaker(*this, "speaker")
, m_chess_keyboard(*this, "X%u", 0U)
, m_trainer_keyboard(*this, "Y%u", 0U)
, m_inputs(*this, "IN.%u", 0U)
, m_display(*this, "digit%u", 0U)
, m_busyled(*this, "busyled")
{ }
@ -91,23 +85,17 @@ private:
void io_map(address_map &map);
u8 m_digit = 0;
bool m_kbd_type = false;
required_device<cpu_device> m_maincpu;
required_device<speaker_sound_device> m_speaker;
required_ioport_array<3> m_chess_keyboard;
required_ioport_array<3> m_trainer_keyboard;
required_ioport_array<3> m_inputs;
output_finder<8> m_display;
output_finder<> m_busyled;
};
/***************************************************************************
Display
***************************************************************************/
void slc1_state::io_w(offs_t offset, u8 data)
@ -138,54 +126,35 @@ void slc1_state::io_w(offs_t offset, u8 data)
m_display[m_digit] = segdata;
m_busyled = busyled;
if (m_digit == 3)
m_kbd_type = segdata;
}
/***************************************************************************
Keyboard
***************************************************************************/
u8 slc1_state::io_r(offs_t offset)
{
u8 data = 0xff, upper = (offset >> 8) & 7;
u8 data = 0, upper = (offset >> 8) & 7;
if (m_kbd_type)
{ // Trainer
if (1)
{
if (upper == 3)
data &= m_trainer_keyboard[0]->read();
data = m_inputs[0]->read();
else
if (upper == 4)
data &= m_trainer_keyboard[1]->read();
data = m_inputs[1]->read();
else
if (upper == 5)
data &= m_trainer_keyboard[2]->read();
}
else
{ // Chess
if (upper == 3)
data &= m_chess_keyboard[0]->read();
else
if (upper == 4)
data &= m_chess_keyboard[1]->read();
else
if (upper == 5)
data &= m_chess_keyboard[2]->read();
data = m_inputs[2]->read();
}
return data;
return data << 4 ^ 0xff;
}
/***************************************************************************
Machine
***************************************************************************/
void slc1_state::machine_start()
@ -194,7 +163,6 @@ void slc1_state::machine_start()
m_busyled.resolve();
save_item(NAME(m_digit));
save_item(NAME(m_kbd_type));
}
void slc1_state::machine_reset()
@ -202,11 +170,8 @@ void slc1_state::machine_reset()
}
/***************************************************************************
Address Map
***************************************************************************/
void slc1_state::mem_map(address_map &map)
@ -223,62 +188,32 @@ void slc1_state::io_map(address_map &map)
/**************************************************************************
Keyboard Layout
***************************************************************************/
static INPUT_PORTS_START( slc1 )
// Chess Keyboard
PORT_START("X0")
PORT_BIT(0x0f, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("D4 T") PORT_CODE(KEYCODE_4)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("C3 L") PORT_CODE(KEYCODE_3)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("B2 S") PORT_CODE(KEYCODE_2)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("A1 B") PORT_CODE(KEYCODE_1) PORT_CHAR('[')
PORT_START("IN.0")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("D 4 / T / 3 B") PORT_CODE(KEYCODE_D) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_3_PAD) PORT_CHAR('3')
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("C 3 / L / 2 A") PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_2_PAD) PORT_CHAR('2')
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("B 2 / S / 1 9") PORT_CODE(KEYCODE_B) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_1_PAD) PORT_CHAR('1')
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("A 1 / B / 0 8") PORT_CODE(KEYCODE_A) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_0_PAD) PORT_CHAR('0')
PORT_START("X1")
PORT_BIT(0x0f, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("E5 D") PORT_CODE(KEYCODE_5)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F6 K") PORT_CODE(KEYCODE_6)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("G7") PORT_CODE(KEYCODE_7)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("H8") PORT_CODE(KEYCODE_8)
PORT_START("IN.1")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("E 5 / D / 4 C INS") PORT_CODE(KEYCODE_E) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_4_PAD) PORT_CHAR('4')
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F 6 / K / 5 D DEL") PORT_CODE(KEYCODE_F) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_5_PAD) PORT_CHAR('5')
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("G 7 / 6 E BL") PORT_CODE(KEYCODE_G) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_6_PAD) PORT_CHAR('6')
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("H 8 / 7 F GO") PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_7_PAD) PORT_CHAR('7')
PORT_START("X2")
PORT_BIT(0x0f, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("C") PORT_CODE(KEYCODE_C)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("A") PORT_CODE(KEYCODE_A)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("St") PORT_CODE(KEYCODE_S)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Z") PORT_CODE(KEYCODE_Z)
// Trainer Keyboard
PORT_START("Y0")
PORT_BIT(0x0f, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("3 B") PORT_CODE(KEYCODE_3) PORT_CHAR('3')
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("2 A") PORT_CODE(KEYCODE_2) PORT_CHAR('2')
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("1 9") PORT_CODE(KEYCODE_1) PORT_CHAR('1')
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("0 8") PORT_CODE(KEYCODE_0) PORT_CHAR('0')
PORT_START("Y1")
PORT_BIT(0x0f, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("4 C INS") PORT_CODE(KEYCODE_4) PORT_CHAR('4')
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("5 D DEL") PORT_CODE(KEYCODE_5) PORT_CHAR('5')
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("6 E BL") PORT_CODE(KEYCODE_6) PORT_CHAR('6')
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("7 F Go") PORT_CODE(KEYCODE_7) PORT_CHAR('7')
PORT_START("Y2")
PORT_BIT(0x0f, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Fu DP") PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR('H')
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("+-1 SS") PORT_CODE(KEYCODE_UP) PORT_CHAR('^')
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Seq BG") PORT_CODE(KEYCODE_Q) PORT_CHAR('Q')
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("ADR BP") PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-')
PORT_START("IN.2")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("C / Seq / BG") PORT_CODE(KEYCODE_X) PORT_CHAR('X')
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("A / +/- 1 / SS") PORT_CODE(KEYCODE_O) PORT_CHAR('O')
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("St / Fu / DP") PORT_CODE(KEYCODE_S) PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_DEL) PORT_CHAR('S')
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Z / ADR / BP") PORT_CODE(KEYCODE_Z) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHAR('Z')
INPUT_PORTS_END
/***************************************************************************
Machine driver
***************************************************************************/
void slc1_state::slc1(machine_config &config)
@ -298,9 +233,7 @@ void slc1_state::slc1(machine_config &config)
/***************************************************************************
Game driver
***************************************************************************/
ROM_START(slc1)

View File

@ -30,32 +30,32 @@ license:CC0
<view name="Internal Layout">
<!-- OUT led -->
<element name="0.a" ref="green_led">
<bounds x="0" y="5" width="5" height="5" />
<bounds x="-5" y="0" width="8" height="8" />
</element>
<!-- HALT led -->
<element name="halt" ref="red_led">
<bounds x="0" y="15" width="5" height="5" />
<bounds x="-5" y="10" width="8" height="8" />
</element>
<!-- Led address display -->
<element name="digit6" ref="digit">
<bounds x="10" y="0" width="18" height="24" />
<bounds x="10" y="0" width="18" height="26" />
</element>
<element name="digit5" ref="digit">
<bounds x="28" y="0" width="18" height="24" />
<bounds x="28" y="0" width="18" height="26" />
</element>
<element name="digit4" ref="digit">
<bounds x="46" y="0" width="18" height="24" />
<bounds x="46" y="0" width="18" height="26" />
</element>
<element name="digit3" ref="digit">
<bounds x="64" y="0" width="18" height="24" />
<bounds x="64" y="0" width="18" height="26" />
</element>
<element name="digit2" ref="digit">
<bounds x="82" y="0" width="18" height="24" />
<bounds x="82" y="0" width="18" height="26" />
</element>
<element name="digit1" ref="digit">
<bounds x="100" y="0" width="18" height="24" />
<bounds x="100" y="0" width="18" height="26" />
</element>
</view>
</mamelayout>

View File

@ -6,54 +6,43 @@ license:CC0
<!-- NOTE: no chesspieces simulation here -->
<element name="g_led" defstate="0">
<disk>
<color red="0.0" green="0.75" blue="0.0" />
<element name="digit" defstate="0">
<led7seg>
<color red="0.4" green="1.0" blue="0" />
</led7seg>
</element>
<element name="led" defstate="0">
<disk state="1">
<color red="1.0" green="0.0" blue="0.0" />
</disk>
<disk state="0">
<color red="0.15" green="0.0" blue="0.0" />
</disk>
</element>
<element name="g_digit" defstate="0">
<led7seg>
<color red="0.75" green="0.5" blue="0.0" />
</led7seg>
</element>
<element name="r_digit" defstate="0">
<led7seg>
<color red="0.75" green="0.0" blue="0.0" />
</led7seg>
</element>
<element name="background">
<rect>
<bounds left="0" top="0" right="1" bottom="1" />
<color red="0.0" green="0.0" blue="0.0" />
</rect>
</element>
<view name="Default Layout">
<!-- Black background -->
<element ref="background">
<bounds left="64" top="95" right="453" bottom="195" />
</element>
<element name="busy_led" ref="g_led">
<bounds left="76" right="96" top="130" bottom="150" />
<view name="Internal Layout">
<element name="busy_led" ref="led">
<bounds x="110" y="36" width="8" height="8" />
</element>
<element name="digit0" ref="r_digit">
<bounds left="107" top="105" right="155" bottom="185" />
<element name="digit0" ref="digit">
<bounds x="10" y="0" width="18" height="26" />
</element>
<element name="digit6" ref="r_digit">
<bounds left="155" top="105" right="203" bottom="185" />
<element name="digit6" ref="digit">
<bounds x="28" y="0" width="18" height="26" />
</element>
<element name="digit5" ref="r_digit">
<bounds left="203" top="105" right="251" bottom="185" />
<element name="digit5" ref="digit">
<bounds x="46" y="0" width="18" height="26" />
</element>
<element name="digit4" ref="r_digit">
<bounds left="251" top="105" right="299" bottom="185" />
<element name="digit4" ref="digit">
<bounds x="64" y="0" width="18" height="26" />
</element>
<element name="digit3" ref="g_digit">
<bounds left="347" top="105" right="395" bottom="185" />
<element name="digit3" ref="digit">
<bounds x="82" y="0" width="18" height="26" />
</element>
<element name="digit1" ref="g_digit">
<bounds left="395" top="105" right="443" bottom="185" />
<element name="digit1" ref="digit">
<bounds x="100" y="0" width="18" height="26" />
</element>
</view>
</mamelayout>

View File

@ -9,7 +9,7 @@ license:CC0
<!-- define elements -->
<element name="digit" defstate="0">
<led7seg><color red="1.0" green="0.1" blue="0.15" /></led7seg>
<led7seg><color red="0.4" green="1.0" blue="0" /></led7seg>
</element>
@ -20,6 +20,5 @@ license:CC0
<element name="digit1" ref="digit"><bounds x="10" y="0" width="10" height="15" /></element>
<element name="digit2" ref="digit"><bounds x="20" y="0" width="10" height="15" /></element>
<element name="digit3" ref="digit"><bounds x="30" y="0" width="10" height="15" /></element>
</view>
</mamelayout>