Skip to content

Commit

Permalink
to8, to9, to9p: Split out serial keyboards as separate devices
Browse files Browse the repository at this point in the history
  • Loading branch information
ajrhacker committed Oct 3, 2024
1 parent d7211e6 commit 366d6fe
Show file tree
Hide file tree
Showing 5 changed files with 1,155 additions and 940 deletions.
150 changes: 24 additions & 126 deletions src/mame/thomson/thomson.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -460,10 +460,6 @@ static INPUT_PORTS_START ( to7_keyboard )
KEY ( 6, "7 ' \302\264", 7 ) PORT_CHAR('7') PORT_CHAR('\'')
KEY ( 7, "6 &", 6 ) PORT_CHAR('6') PORT_CHAR('&')

/* unused */
PORT_START ( "keyboard.8" )
PORT_START ( "keyboard.9" )

INPUT_PORTS_END

static INPUT_PORTS_START ( to7 )
Expand Down Expand Up @@ -1062,7 +1058,7 @@ void to9_state::to9_map(address_map &map)
map(0xe7c8, 0xe7cb).rw("pia_0", FUNC(pia6821_device::read_alt), FUNC(pia6821_device::write_alt));
map(0xe7cc, 0xe7cf).rw("pia_1", FUNC(pia6821_device::read_alt), FUNC(pia6821_device::write_alt));
map(0xe7da, 0xe7dd).rw(FUNC(to9_state::to9_vreg_r), FUNC(to9_state::to9_vreg_w));
map(0xe7de, 0xe7df).rw(FUNC(to9_state::to9_kbd_r), FUNC(to9_state::to9_kbd_w));
map(0xe7de, 0xe7df).rw(m_to9_kbd, FUNC(to9_keyboard_device::kbd_acia_r), FUNC(to9_keyboard_device::kbd_acia_w));
map(0xe7e4, 0xe7e7).rw(FUNC(to9_state::to9_gatearray_r), FUNC(to9_state::to9_gatearray_w));
/* map(0xe7f0, 0xe7f7).rw(FUNC(to9_state::to9_ieee_r), FUNC(to9_state::to9_ieee_w )); */
map(0xe800, 0xffff).rom(); /* system bios */
Expand Down Expand Up @@ -1127,105 +1123,23 @@ ROM_END

/* ------------ inputs ------------ */

static INPUT_PORTS_START ( to9_keyboard )
PORT_START ( "keyboard.0" )
KEY ( 0, "F2 F7", F2 ) PORT_CHAR(UCHAR_MAMEKEY(F2)) PORT_CHAR(UCHAR_MAMEKEY(F7))
KEY ( 1, "_ 6", 6 ) PORT_CHAR('_') PORT_CHAR('6')
KEY ( 2, "Y", Y ) PORT_CHAR('Y')
KEY ( 3, "H \302\250", H ) PORT_CHAR('H')
KEY ( 4, UTF8_UP, UP ) PORT_CHAR(UCHAR_MAMEKEY(UP))
KEY ( 5, UTF8_RIGHT, RIGHT ) PORT_CHAR(UCHAR_MAMEKEY(RIGHT))
KEY ( 6, "Home Clear", HOME ) PORT_CHAR(UCHAR_MAMEKEY(HOME)) PORT_CHAR(UCHAR_MAMEKEY(ESC))
KEY ( 7, "N", N ) PORT_CHAR('N')
PORT_START ( "keyboard.1" )
KEY ( 0, "F3 F8", F3 ) PORT_CHAR(UCHAR_MAMEKEY(F3)) PORT_CHAR(UCHAR_MAMEKEY(F8))
KEY ( 1, "( 5", 5 ) PORT_CHAR('(') PORT_CHAR('5')
KEY ( 2, "T", T ) PORT_CHAR('T')
KEY ( 3, "G", G ) PORT_CHAR('G')
KEY ( 4, "= +", EQUALS ) PORT_CHAR('=') PORT_CHAR('+')
KEY ( 5, UTF8_LEFT, LEFT ) PORT_CHAR(UCHAR_MAMEKEY(LEFT))
KEY ( 6, "Insert", INSERT ) PORT_CHAR(UCHAR_MAMEKEY(INSERT))
KEY ( 7, "B \302\264", B ) PORT_CHAR('B')
PORT_START ( "keyboard.2" )
KEY ( 0, "F4 F9", F4 ) PORT_CHAR(UCHAR_MAMEKEY(F4)) PORT_CHAR(UCHAR_MAMEKEY(F9))
KEY ( 1, "' 4", 4 ) PORT_CHAR('\'') PORT_CHAR('4')
KEY ( 2, "R", R ) PORT_CHAR('R')
KEY ( 3, "F", F ) PORT_CHAR('F')
KEY ( 4, "Accent", END ) PORT_CHAR(UCHAR_MAMEKEY(END))
KEY ( 5, "Keypad 1", 1_PAD ) PORT_CHAR(UCHAR_MAMEKEY(1_PAD))
KEY ( 6, "Delete Backspace", DEL ) PORT_CHAR(8) PORT_CHAR(UCHAR_MAMEKEY(BACKSPACE))
KEY ( 7, "V", V ) PORT_CHAR('V')
PORT_START ( "keyboard.3" )
KEY ( 0, "F5 F10", F5 ) PORT_CHAR(UCHAR_MAMEKEY(F5)) PORT_CHAR(UCHAR_MAMEKEY(F10))
KEY ( 1, "\" 3", 3 ) PORT_CHAR('"') PORT_CHAR('3')
KEY ( 2, "E", E ) PORT_CHAR('E')
KEY ( 3, "D", D ) PORT_CHAR('D')
KEY ( 4, "Keypad 7", 7_PAD ) PORT_CHAR(UCHAR_MAMEKEY(7_PAD))
KEY ( 5, "Keypad 4", 4_PAD ) PORT_CHAR(UCHAR_MAMEKEY(4_PAD))
KEY ( 6, "Keypad 0", 0_PAD ) PORT_CHAR(UCHAR_MAMEKEY(0_PAD))
KEY ( 7, "C \136", C ) PORT_CHAR('C')
PORT_START ( "keyboard.4" )
KEY ( 0, "F1 F6", F1 ) PORT_CHAR(UCHAR_MAMEKEY(F1)) PORT_CHAR(UCHAR_MAMEKEY(F6))
KEY ( 1, "\303\251 2", 2 ) PORT_CHAR( 0xe9 ) PORT_CHAR('2')
KEY ( 2, "Z", Z ) PORT_CHAR('Z')
KEY ( 3, "S", S ) PORT_CHAR('S')
KEY ( 4, "Keypad 8", 8_PAD ) PORT_CHAR(UCHAR_MAMEKEY(8_PAD))
KEY ( 5, "Keypad 2", 2_PAD ) PORT_CHAR(UCHAR_MAMEKEY(2_PAD))
KEY ( 6, "Keypad .", DEL_PAD ) PORT_CHAR(UCHAR_MAMEKEY(DEL_PAD))
KEY ( 7, "X", X ) PORT_CHAR('X')
PORT_START ( "keyboard.5" )
KEY ( 0, "# @", TILDE ) PORT_CHAR('#') PORT_CHAR('@')
KEY ( 1, "* 1", 1 ) PORT_CHAR('*') PORT_CHAR('1')
KEY ( 2, "A \140", A ) PORT_CHAR('A')
KEY ( 3, "Q", Q ) PORT_CHAR('Q')
KEY ( 4, "[ {", QUOTE ) PORT_CHAR('[') PORT_CHAR('{')
KEY ( 5, "Keypad 5", 5_PAD ) PORT_CHAR(UCHAR_MAMEKEY(5_PAD))
KEY ( 6, "Keypad 6", 6_PAD ) PORT_CHAR(UCHAR_MAMEKEY(6_PAD))
KEY ( 7, "W", W ) PORT_CHAR('W')
PORT_START ( "keyboard.6" )
KEY ( 0, "Stop", TAB ) PORT_CHAR(27)
KEY ( 1, "\303\250 7", 7 ) PORT_CHAR( 0xe8 ) PORT_CHAR('7')
KEY ( 2, "U", U ) PORT_CHAR('U')
KEY ( 3, "J", J ) PORT_CHAR('J')
KEY ( 4, "Space", SPACE ) PORT_CHAR(' ')
KEY ( 5, "Keypad 9", 9_PAD ) PORT_CHAR(UCHAR_MAMEKEY(9_PAD))
KEY ( 6, "Keypad Enter", ENTER_PAD ) PORT_CHAR(UCHAR_MAMEKEY(ENTER_PAD))
KEY ( 7, ", ?", COMMA ) PORT_CHAR(',') PORT_CHAR('?')
PORT_START ( "keyboard.7" )
KEY ( 0, "Control", LCONTROL ) PORT_CHAR(UCHAR_MAMEKEY(LCONTROL))
KEY ( 1, "! 8", 8 ) PORT_CHAR('!') PORT_CHAR('8')
KEY ( 2, "I", I ) PORT_CHAR('I')
KEY ( 3, "K", K ) PORT_CHAR('K')
KEY ( 4, "$ &", CLOSEBRACE ) PORT_CHAR('$') PORT_CHAR('&')
KEY ( 5, UTF8_DOWN, DOWN ) PORT_CHAR(UCHAR_MAMEKEY(DOWN))
KEY ( 6, "] }", BACKSLASH ) PORT_CHAR(']') PORT_CHAR('}')
KEY ( 7, "; .", STOP ) PORT_CHAR(';') PORT_CHAR('.')
PORT_START ( "keyboard.8" )
KEY ( 0, "Caps-Lock", CAPSLOCK ) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK))
KEY ( 1, "\303\247 9", 9 ) PORT_CHAR( 0xe7 ) PORT_CHAR('9')
KEY ( 2, "O", O ) PORT_CHAR('O')
KEY ( 3, "L", L ) PORT_CHAR('L')
KEY ( 4, "- \\", BACKSPACE ) PORT_CHAR('-') PORT_CHAR('\\')
KEY ( 5, "\303\271 %", COLON ) PORT_CHAR( 0xf9 ) PORT_CHAR('%')
KEY ( 6, "Enter", ENTER ) PORT_CHAR(13)
KEY ( 7, ": /", SLASH ) PORT_CHAR(':') PORT_CHAR('/')
PORT_START ( "keyboard.9" )
KEY ( 0, "Shift", LSHIFT ) PORT_CODE ( KEYCODE_RSHIFT ) PORT_CHAR(UCHAR_SHIFT_1)
KEY ( 1, "\303\240 0", 0 ) PORT_CHAR( 0xe0 ) PORT_CHAR('0')
KEY ( 2, "P", P ) PORT_CHAR('P')
KEY ( 3, "M", M ) PORT_CHAR('M')
KEY ( 4, ") \302\260", MINUS ) PORT_CHAR(')') PORT_CHAR( 0xb0 )
KEY ( 5, "\342\206\221 \302\250", OPENBRACE ) PORT_CHAR('^') PORT_CHAR( 0xa8 )
KEY ( 6, "Keypad 3", 3_PAD ) PORT_CHAR(UCHAR_MAMEKEY(3_PAD))
KEY ( 7, "> <", BACKSLASH2 ) PORT_CHAR('>') PORT_CHAR('<')
INPUT_PORTS_END

static INPUT_PORTS_START ( to9 )
PORT_INCLUDE ( thom_lightpen )
PORT_INCLUDE ( thom_game_port )
PORT_INCLUDE ( to9_keyboard )
PORT_INCLUDE ( to7_config )
PORT_INCLUDE ( to7_vconfig )

PORT_START ( "config" )
PORT_BIT ( 0x01, 0x00, IPT_UNUSED )

PORT_MODIFY ( "mouse_x" )
PORT_BIT ( 0xffff, 0x00, IPT_UNUSED )

PORT_MODIFY ( "mouse_y" )
PORT_BIT ( 0xffff, 0x00, IPT_UNUSED )

PORT_MODIFY ( "mouse_button" )
PORT_BIT ( 0x01, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT ( 0x02, IP_ACTIVE_LOW, IPT_UNUSED )
INPUT_PORTS_END

/* ------------ driver ------------ */
Expand All @@ -1238,6 +1152,9 @@ void to9_state::to9(machine_config &config)

m_maincpu->set_addrmap(AS_PROGRAM, &to9_state::to9_map);

TO9_KEYBOARD(config, m_to9_kbd);
m_to9_kbd->irq_cb().set(m_mainirq, FUNC(input_merger_device::in_w<4>));

m_pia_sys->readpa_handler().set(FUNC(to9_state::to9_sys_porta_in));
m_pia_sys->readpb_handler().set_constant(0);
m_pia_sys->writepa_handler().set(FUNC(to9_state::to9_sys_porta_out));
Expand Down Expand Up @@ -1412,25 +1329,10 @@ ROM_END

/* ------------ inputs ------------ */

static INPUT_PORTS_START ( to8_config )
PORT_START ( "config" )

PORT_CONFNAME ( 0x01, 0x00, "Game Port" )
PORT_CONFSETTING ( 0x00, DEF_STR( Joystick ) )
PORT_CONFSETTING ( 0x01, "Mouse" )

PORT_CONFNAME ( 0x02, 0x00, "Keyboard" )
PORT_CONFSETTING ( 0x00, "Enabled" )
PORT_CONFSETTING ( 0x02, "Disabled" )

INPUT_PORTS_END


static INPUT_PORTS_START ( to8 )
PORT_INCLUDE ( thom_lightpen )
PORT_INCLUDE ( thom_game_port )
PORT_INCLUDE ( to9_keyboard )
PORT_INCLUDE ( to8_config )
PORT_INCLUDE ( to7_config )
PORT_INCLUDE ( to7_vconfig )
INPUT_PORTS_END

Expand All @@ -1449,7 +1351,8 @@ void to9_state::to8(machine_config &config)

m_maincpu->set_addrmap(AS_PROGRAM, &to9_state::to8_map);

//MC6804(config, "kbdmcu", 11_MHz_XTAL);
TO8_KEYBOARD(config, m_to8_kbd);
m_to8_kbd->data_cb().set(m_mc6846, FUNC(mc6846_device::set_input_cp1));

m_pia_sys->readpa_handler().set(FUNC(to9_state::to8_sys_porta_in));
m_pia_sys->readpb_handler().set_constant(0);
Expand Down Expand Up @@ -1537,7 +1440,7 @@ void to9_state::to9p_map(address_map &map)
map(0xe7c8, 0xe7cb).rw("pia_0", FUNC(pia6821_device::read_alt), FUNC(pia6821_device::write_alt));
map(0xe7cc, 0xe7cf).rw("pia_1", FUNC(pia6821_device::read_alt), FUNC(pia6821_device::write_alt));
map(0xe7da, 0xe7dd).rw(FUNC(to9_state::to8_vreg_r), FUNC(to9_state::to8_vreg_w));
map(0xe7de, 0xe7df).rw(FUNC(to9_state::to9_kbd_r), FUNC(to9_state::to9_kbd_w));
map(0xe7de, 0xe7df).rw(m_to9_kbd, FUNC(to9_keyboard_device::kbd_acia_r), FUNC(to9_keyboard_device::kbd_acia_w));
map(0xe7e4, 0xe7e7).rw(FUNC(to9_state::to8_gatearray_r), FUNC(to9_state::to8_gatearray_w));
/* map(0xe7f0, 0xe7f7).rw(FUNC(to9_state::to9_ieee_r), FUNC(to9_state::to9_ieee_w )); */

Expand Down Expand Up @@ -1588,7 +1491,6 @@ ROM_END
static INPUT_PORTS_START ( to9p )
PORT_INCLUDE ( thom_lightpen )
PORT_INCLUDE ( thom_game_port )
PORT_INCLUDE ( to9_keyboard )
PORT_INCLUDE ( to7_config )
PORT_INCLUDE ( to7_vconfig )
INPUT_PORTS_END
Expand All @@ -1603,6 +1505,9 @@ void to9_state::to9p(machine_config &config)

m_maincpu->set_addrmap(AS_PROGRAM, &to9_state::to9p_map);

TO9P_KEYBOARD(config, m_to9_kbd);
m_to9_kbd->irq_cb().set(m_mainirq, FUNC(input_merger_device::in_w<4>));

m_pia_sys->readpa_handler().set(FUNC(to9_state::to9_sys_porta_in));
m_pia_sys->readpb_handler().set_constant(0);
m_pia_sys->writepa_handler().set(FUNC(to9_state::to9_sys_porta_out));
Expand Down Expand Up @@ -1861,9 +1766,6 @@ static INPUT_PORTS_START ( mo6_keyboard )
KEY ( 4, "\303\271 %", COLON ) PORT_CHAR( 0xf9 ) PORT_CHAR('%')
PORT_BIT ( 0xe0, IP_ACTIVE_LOW, IPT_UNUSED )

/* unused */
PORT_START ( "keyboard.9" )

INPUT_PORTS_END

/* QWERTY version */
Expand Down Expand Up @@ -2169,10 +2071,6 @@ static INPUT_PORTS_START ( mo5nr_keyboard )
KEY ( 6, "Stop", TAB ) PORT_CHAR(27)
PORT_BIT ( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )

/* unused */
PORT_START ( "keyboard.8" )
PORT_START ( "keyboard.9" )

INPUT_PORTS_END

static INPUT_PORTS_START ( mo5nr )
Expand Down
46 changes: 7 additions & 39 deletions src/mame/thomson/thomson.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@

#pragma once

#include "to_kbd.h"

#include "cpu/m6809/m6809.h"
#include "imagedev/cassette.h"
#include "machine/6821pia.h"
Expand Down Expand Up @@ -231,7 +233,7 @@ class thomson_state : public driver_device
required_ioport m_io_lightpen_button;
required_ioport m_io_config;
required_ioport m_io_vconfig;
required_ioport_array<10> m_io_keyboard;
optional_ioport_array<9> m_io_keyboard;
required_memory_bank m_vrambank;
optional_memory_bank m_cartbank;
optional_memory_bank m_rambank;
Expand Down Expand Up @@ -384,6 +386,8 @@ class to9_state : public thomson_state
public:
to9_state(const machine_config &mconfig, device_type type, const char *tag) :
thomson_state(mconfig, type, tag),
m_to8_kbd(*this, "to8_kbd"),
m_to9_kbd(*this, "to9_kbd"),
m_centronics(*this, "centronics"),
m_cent_data_out(*this, "cent_data_out"),
m_syslobank(*this, TO8_SYS_LO),
Expand All @@ -400,6 +404,8 @@ class to9_state : public thomson_state
void to9p(machine_config &config);

protected:
optional_device<to8_keyboard_device> m_to8_kbd;
optional_device<to9_keyboard_device> m_to9_kbd;
optional_device<centronics_device> m_centronics;
optional_device<output_latch_device> m_cent_data_out;

Expand All @@ -411,14 +417,6 @@ class to9_state : public thomson_state

int m_centronics_busy = 0;

uint8_t m_to8_kbd_ack = 0; /* 1 = cpu inits / accepts transfers */
uint16_t m_to8_kbd_data = 0; /* data to transmit */
uint16_t m_to8_kbd_step = 0; /* transmission automaton state */
uint8_t m_to8_kbd_last_key = 0; /* last key (for repetition) */
uint32_t m_to8_kbd_key_count = 0; /* keypress time (for repetition) */
uint8_t m_to8_kbd_caps = 0; /* caps lock */
emu_timer* m_to8_kbd_timer = nullptr; /* bit-send */
emu_timer* m_to8_kbd_signal = nullptr; /* signal from CPU */
uint8_t m_to8_data_vpage = 0;
uint8_t m_to8_cart_vpage = 0;
uint8_t m_to8_reg_ram = 0;
Expand All @@ -430,7 +428,6 @@ class to9_state : public thomson_state
uint8_t m_to8_soft_bank = 0;
uint8_t m_to8_bios_bank = 0;

TIMER_CALLBACK_MEMBER( to8_kbd_timer_cb );
void to8_update_ram_bank_postload();
void to8_update_cart_bank_postload();
void to8_cartridge_w(offs_t offset, uint8_t data);
Expand All @@ -456,12 +453,6 @@ class to9_state : public thomson_state
void to8_data_hi_w(offs_t offset, uint8_t data);
void to8_vcart_w(offs_t offset, uint8_t data);

int to8_kbd_ktest();
int to8_kbd_get_key();
void to8_kbd_timer_func();
void to8_kbd_set_ack( int data );
void to8_kbd_reset();
void to8_kbd_init();
void to8_update_ram_bank();
void to8_update_cart_bank();

Expand All @@ -475,9 +466,6 @@ class to9_state : public thomson_state
void to9_cartridge_w(offs_t offset, uint8_t data);
uint8_t to9_cartridge_r(offs_t offset);
void to9_update_ram_bank_postload();
uint8_t to9_kbd_r(offs_t offset);
void to9_kbd_w(offs_t offset, uint8_t data);
TIMER_CALLBACK_MEMBER( to9_kbd_timer_cb );
uint8_t to9_sys_porta_in();
void to9_sys_porta_out(uint8_t data);
void to9_sys_portb_out(uint8_t data);
Expand All @@ -496,31 +484,11 @@ class to9_state : public thomson_state
uint8_t m_to9_palette_data[32]{};
uint8_t m_to9_palette_idx = 0;
uint8_t m_to9_soft_bank = 0;
uint8_t m_to9_kbd_parity = 0; /* 0=even, 1=odd, 2=no parity */
uint8_t m_to9_kbd_intr = 0; /* interrupt mode */
uint8_t m_to9_kbd_in = 0; /* data from keyboard */
uint8_t m_to9_kbd_status = 0; /* status */
uint8_t m_to9_kbd_overrun = 0; /* character lost */
uint8_t m_to9_kbd_periph = 0; /* peripheral mode */
uint8_t m_to9_kbd_byte_count = 0; /* byte-count in peripheral mode */
uint16_t m_to9_mouse_x = 0;
uint16_t m_to9_mouse_y = 0;
uint8_t m_to9_kbd_last_key = 0; /* for key repetition */
uint16_t m_to9_kbd_key_count = 0;
uint8_t m_to9_kbd_caps = 0; /* caps-lock */
uint8_t m_to9_kbd_pad = 0; /* keypad outputs special codes */
emu_timer* m_to9_kbd_timer = nullptr;

void to9_set_video_mode( uint8_t data, int style );
void to9_palette_init();
void to9_update_cart_bank();
void to9_update_ram_bank();
int to9_kbd_ktest();
void to9_kbd_update_irq();
void to9_kbd_send( uint8_t data, int parity );
int to9_kbd_get_key();
void to9_kbd_reset();
void to9_kbd_init();
};

class mo6_state : public to9_state
Expand Down
Loading

0 comments on commit 366d6fe

Please sign in to comment.