pasopia7 : added cassette and beeper sound, and added missing keys. Patched around the sound freeze issue. Most games work fairly well.

This commit is contained in:
Robbbert 2019-10-14 02:39:07 +11:00
parent 60186cb009
commit 40ad7a2f40
2 changed files with 186 additions and 189 deletions

View File

@ -4,25 +4,29 @@
Toshiba Pasopia 7 (c) 1983 Toshiba Toshiba Pasopia 7 (c) 1983 Toshiba
preliminary driver by Angelo Salese Preliminary driver by Angelo Salese.
2019-10-14 added cassette & beeper [Robbbert]
Most games seem to work well enough from cassette, but without sound (see below).
Beeper is only used for the keyclick, and it works.
TODO: TODO:
- floppy support (but floppy images are unobtainable at current time) - floppy support (but floppy images are unobtainable at current time).
- cassette device; - SOUND command uses the SN76489 chip, however no sound is produced, and the next SOUND command
- beeper freezes the machine. A hack has been added to stop the freeze.
- LCD version has gfx bugs, it must use a different ROM charset for instance (apparently a 8 x 4 - LCD version has gfx bugs, it must use a different ROM charset for instance (apparently a 8 x 4
one, 40/80 x 8 tilemap); one, 40/80 x 8 tilemap).
- Allow BIN files to be loaded (via a rampac presumably).
- Allow CAS files to be loaded.
Reading fdc has been commented out, until the code can be modified to Reading fdc has been commented out, until the code can be modified to
work with new upd765 (was causing a hang at boot). work with new upd765 (was causing a hang at boot).
Schematics: https://archive.org/details/Io19839/page/n331 Schematics: https://archive.org/details/Io19839/page/n331 (fdc system not included)
***************************************************************************************************/ ***************************************************************************************************/
#include "emu.h" #include "emu.h"
#include "includes/pasopia.h"
#include "cpu/z80/z80.h" #include "cpu/z80/z80.h"
#include "imagedev/floppy.h" #include "imagedev/floppy.h"
#include "machine/i8255.h" #include "machine/i8255.h"
@ -31,7 +35,8 @@
#include "machine/z80pio.h" #include "machine/z80pio.h"
#include "sound/sn76496.h" #include "sound/sn76496.h"
#include "video/mc6845.h" #include "video/mc6845.h"
#include "imagedev/cassette.h"
#include "sound/spkrdev.h"
#include "emupal.h" #include "emupal.h"
#include "screen.h" #include "screen.h"
#include "speaker.h" #include "speaker.h"
@ -44,18 +49,20 @@ public:
: driver_device(mconfig, type, tag) : driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu") , m_maincpu(*this, "maincpu")
, m_screen(*this, "screen") , m_screen(*this, "screen")
, m_ppi0(*this, "ppi8255_0") , m_ppi0(*this, "ppi0")
, m_ppi1(*this, "ppi8255_1") , m_ppi1(*this, "ppi1")
, m_ppi2(*this, "ppi8255_2") , m_ppi2(*this, "ppi2")
, m_ctc(*this, "z80ctc") , m_ctc(*this, "ctc")
, m_pio(*this, "z80pio") , m_pio(*this, "pio")
, m_crtc(*this, "crtc") , m_crtc(*this, "crtc")
, m_fdc(*this, "fdc") , m_fdc(*this, "fdc")
, m_floppy(*this, "fdc:0:525hd") , m_floppy(*this, "fdc:0:525hd")
, m_sn1(*this, "sn1") , m_sn1(*this, "sn1")
, m_sn2(*this, "sn2") , m_sn2(*this, "sn2")
, m_palette(*this, "palette") , m_palette(*this, "palette")
, m_keyboard(*this, "KEY.%u", 0) , m_keyboard(*this, "KEY.%d", 0)
, m_cass(*this, "cassette")
, m_speaker(*this, "speaker")
{ } { }
void p7_base(machine_config &config); void p7_base(machine_config &config);
@ -90,6 +97,7 @@ private:
DECLARE_WRITE8_MEMBER(nmi_reg_w); DECLARE_WRITE8_MEMBER(nmi_reg_w);
DECLARE_READ8_MEMBER(nmi_porta_r); DECLARE_READ8_MEMBER(nmi_porta_r);
DECLARE_READ8_MEMBER(nmi_portb_r); DECLARE_READ8_MEMBER(nmi_portb_r);
DECLARE_WRITE_LINE_MEMBER(speaker_w);
TIMER_CALLBACK_MEMBER(pio_timer); TIMER_CALLBACK_MEMBER(pio_timer);
DECLARE_VIDEO_START(pasopia7); DECLARE_VIDEO_START(pasopia7);
void p7_lcd_palette(palette_device &palette) const; void p7_lcd_palette(palette_device &palette) const;
@ -123,6 +131,8 @@ private:
int m_addr_latch; int m_addr_latch;
void pasopia_nmi_trap(); void pasopia_nmi_trap();
uint8_t m_mux_data; uint8_t m_mux_data;
u8 m_porta_2;
bool m_spr_sw;
emu_timer *m_pio_timer; emu_timer *m_pio_timer;
virtual void machine_reset() override; virtual void machine_reset() override;
void fdc_irq(bool state); void fdc_irq(bool state);
@ -144,9 +154,11 @@ private:
required_device<sn76489a_device> m_sn2; required_device<sn76489a_device> m_sn2;
required_device<palette_device> m_palette; required_device<palette_device> m_palette;
required_ioport_array<12> m_keyboard; required_ioport_array<12> m_keyboard;
required_device<cassette_image_device> m_cass;
required_device<speaker_sound_device> m_speaker;
}; };
#define VDP_CLOCK XTAL(3'579'545)/4 #define VDP_CLOCK 14.318181_MHz_XTAL / 16
#define LCD_CLOCK VDP_CLOCK/10 #define LCD_CLOCK VDP_CLOCK/10
// needed to scan the keyboard, as the pio emulation doesn't do it. // needed to scan the keyboard, as the pio emulation doesn't do it.
@ -515,7 +527,7 @@ READ8_MEMBER( pasopia7_state::pac2_r )
} }
else else
{ {
printf("%02x\n",m_pac2_bank_select); //printf("RAMPAC bank_select = %02x\n",m_pac2_bank_select);
} }
} }
@ -599,26 +611,31 @@ WRITE8_MEMBER( pasopia7_state::pasopia7_fdc_w )
READ8_MEMBER( pasopia7_state::pasopia7_io_r ) READ8_MEMBER( pasopia7_state::pasopia7_io_r )
{ {
uint16_t io_port;
if(m_mio_sel) if(m_mio_sel)
{ {
address_space &ram_space = m_maincpu->space(AS_PROGRAM); address_space &ram_space = m_maincpu->space(AS_PROGRAM);
m_mio_sel = 0; m_mio_sel = 0;
//printf("%08x\n",offset); // this hack to prevent SOUND freezing the machine.
//return 0x0d; // hack: this is used for reading the keyboard data, we can fake it a little ... (modify fda4) if ((offset >= 0x7700) && (offset < 0x7740))
return 0xff;
// hack: this is used for reading the keyboard data, we can fake it a little ... (modify fda4)
return ram_space.read_byte(offset); return ram_space.read_byte(offset);
} }
io_port = offset & 0xff; //trim down to 8-bit bus u8 io_port = offset & 0xff; //trim down to 8-bit bus
if(io_port >= 0x08 && io_port <= 0x0b) if(io_port >= 0x08 && io_port <= 0x0b)
return m_ppi0->read(io_port & 3); return m_ppi0->read(io_port & 3);
else else
if(io_port >= 0x0c && io_port <= 0x0f) if(io_port >= 0x0c && io_port <= 0x0f)
return m_ppi1->read(io_port & 3); return m_ppi1->read(io_port & 3);
// else if(io_port == 0x10 || io_port == 0x11) { M6845 read } else
if(io_port == 0x10)
return m_crtc->status_r();
else
if(io_port == 0x11)
return m_crtc->register_r();
else else
if(io_port >= 0x18 && io_port <= 0x1b) if(io_port >= 0x18 && io_port <= 0x1b)
return pac2_r(space, io_port & 3); return pac2_r(space, io_port & 3);
@ -650,8 +667,6 @@ READ8_MEMBER( pasopia7_state::pasopia7_io_r )
WRITE8_MEMBER( pasopia7_state::pasopia7_io_w ) WRITE8_MEMBER( pasopia7_state::pasopia7_io_w )
{ {
uint16_t io_port;
if(m_mio_sel) if(m_mio_sel)
{ {
address_space &ram_space = m_maincpu->space(AS_PROGRAM); address_space &ram_space = m_maincpu->space(AS_PROGRAM);
@ -660,7 +675,7 @@ WRITE8_MEMBER( pasopia7_state::pasopia7_io_w )
return; return;
} }
io_port = offset & 0xff; //trim down to 8-bit bus u8 io_port = offset & 0xff; //trim down to 8-bit bus
if(io_port >= 0x08 && io_port <= 0x0b) if(io_port >= 0x08 && io_port <= 0x0b)
m_ppi0->write(io_port & 3, data); m_ppi0->write(io_port & 3, data);
@ -719,9 +734,110 @@ void pasopia7_state::pasopia7_io(address_map &map)
map(0x0000, 0xffff).rw(FUNC(pasopia7_state::pasopia7_io_r), FUNC(pasopia7_state::pasopia7_io_w)); map(0x0000, 0xffff).rw(FUNC(pasopia7_state::pasopia7_io_r), FUNC(pasopia7_state::pasopia7_io_w));
} }
/* TODO: where are SPACE and RETURN keys? */
static INPUT_PORTS_START( pasopia7 ) static INPUT_PORTS_START( pasopia7 )
PASOPIA_KEYBOARD PORT_START("KEY.0")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("GRAPH") PORT_CODE(KEYCODE_LALT)
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("SHIFT") PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1)
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("CAPS LOCK") PORT_CODE(KEYCODE_CAPSLOCK)
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("CTRL") PORT_CODE(KEYCODE_LCONTROL) PORT_CODE(KEYCODE_RCONTROL) PORT_CHAR(UCHAR_SHIFT_2)
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("KANA LOCK")
PORT_BIT( 0xc8, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_START("KEY.1")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_0_PAD)
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_1_PAD)
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_2_PAD)
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_3_PAD)
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_4_PAD)
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_5_PAD)
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_6_PAD)
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_7_PAD)
PORT_START("KEY.2")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_8_PAD)
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_9_PAD)
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("-") PORT_CODE(KEYCODE_MINUS_PAD)
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("+") PORT_CODE(KEYCODE_PLUS_PAD)
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("*") PORT_CODE(KEYCODE_ASTERISK)
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("/") PORT_CODE(KEYCODE_SLASH_PAD)
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(".") PORT_CODE(KEYCODE_DEL_PAD)
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13)
PORT_START("KEY.3")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_RIGHT) PORT_NAME("RIGHT")
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Label") PORT_CODE(KEYCODE_END)
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("INS/DEL") PORT_CHAR(8)
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("TAB/ESC") PORT_CODE(KEYCODE_TAB) PORT_CHAR(9)
PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_START("KEY.4")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_HOME) PORT_NAME("HOME/CLS")
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_PGUP) PORT_NAME("Kanji") // guess? key has a Japanese label
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_PGDN) PORT_NAME("Copy")
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_DEL) PORT_NAME("Stop")
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LEFT) PORT_NAME("LEFT")
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_UP) PORT_NAME("UP/DOWN")
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_SPACE) PORT_NAME("SPACE") PORT_CHAR(' ')
PORT_START("KEY.5")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F1) PORT_NAME("F1")
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F2) PORT_NAME("F2")
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F3) PORT_NAME("F3")
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F4) PORT_NAME("F4")
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F5) PORT_NAME("F5")
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F6) PORT_NAME("F6")
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F7) PORT_NAME("F7")
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F8) PORT_NAME("F8")
PORT_START("KEY.6")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_1) PORT_NAME("1") PORT_CHAR('1') PORT_CHAR('!')
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_0) PORT_NAME("0") PORT_CHAR('0') PORT_CHAR('0')
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_4) PORT_NAME("4") PORT_CHAR('4') PORT_CHAR('$')
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_R) PORT_NAME("R") PORT_CHAR('R') PORT_CHAR('r')
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Y) PORT_NAME("Y") PORT_CHAR('Y') PORT_CHAR('y')
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("_") PORT_CHAR('_')
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSLASH) PORT_NAME("^")
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Yen")
PORT_START("KEY.7")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_2) PORT_NAME("2") PORT_CHAR('2') PORT_CHAR('"')
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_3) PORT_NAME("3") PORT_CHAR('3') PORT_CHAR('#')
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_8) PORT_NAME("8") PORT_CHAR('8') PORT_CHAR('(')
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_T) PORT_NAME("T") PORT_CHAR('T') PORT_CHAR('t')
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_U) PORT_NAME("U") PORT_CHAR('U') PORT_CHAR('u')
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_7) PORT_NAME("7") PORT_CHAR('7') PORT_CHAR('\'')
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_TILDE) PORT_NAME("@") PORT_CHAR('@')
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("[ {") PORT_CHAR('[') PORT_CHAR('{')
PORT_START("KEY.8")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS) PORT_NAME("-") PORT_CHAR('-') PORT_CHAR('=')
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_5) PORT_NAME("5") PORT_CHAR('5') PORT_CHAR('%')
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_6) PORT_NAME("6") PORT_CHAR('6') PORT_CHAR('&')
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F) PORT_NAME("F") PORT_CHAR('F') PORT_CHAR('f')
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_H) PORT_NAME("H") PORT_CHAR('H') PORT_CHAR('h')
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_9) PORT_NAME("9") PORT_CHAR('9') PORT_CHAR(')')
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_QUOTE) PORT_NAME(": *") PORT_CHAR(':') PORT_CHAR('*')
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_NAME("] }") PORT_CHAR(']') PORT_CHAR('}')
PORT_START("KEY.9")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q) PORT_NAME("Q") PORT_CHAR('Q') PORT_CHAR('q')
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_W) PORT_NAME("W") PORT_CHAR('W') PORT_CHAR('w')
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_E) PORT_NAME("E") PORT_CHAR('E') PORT_CHAR('e')
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_G) PORT_NAME("G") PORT_CHAR('G') PORT_CHAR('g')
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_J) PORT_NAME("J") PORT_CHAR('J') PORT_CHAR('j')
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_I) PORT_NAME("I") PORT_CHAR('I') PORT_CHAR('i')
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_O) PORT_NAME("O") PORT_CHAR('O') PORT_CHAR('o')
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_P) PORT_NAME("P") PORT_CHAR('P') PORT_CHAR('p')
PORT_START("KEY.10")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_A) PORT_NAME("A") PORT_CHAR('A') PORT_CHAR('a')
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_S) PORT_NAME("S") PORT_CHAR('S') PORT_CHAR('s')
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_D) PORT_NAME("D") PORT_CHAR('D') PORT_CHAR('d')
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_V) PORT_NAME("V") PORT_CHAR('V') PORT_CHAR('v')
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_N) PORT_NAME("N") PORT_CHAR('N') PORT_CHAR('n')
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_K) PORT_NAME("K") PORT_CHAR('K') PORT_CHAR('k')
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_L) PORT_NAME("L") PORT_CHAR('L') PORT_CHAR('l')
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_COLON) PORT_NAME("; +") PORT_CHAR(';') PORT_CHAR('+')
PORT_START("KEY.11")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z) PORT_NAME("Z") PORT_CHAR('Z') PORT_CHAR('z')
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_X) PORT_NAME("X") PORT_CHAR('X') PORT_CHAR('x')
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_C) PORT_NAME("C") PORT_CHAR('C') PORT_CHAR('c')
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_B) PORT_NAME("B") PORT_CHAR('B') PORT_CHAR('b')
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_M) PORT_NAME("M") PORT_CHAR('M') PORT_CHAR('m')
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA) PORT_NAME(", <") PORT_CHAR(',') PORT_CHAR('<')
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP) PORT_NAME(". >") PORT_CHAR('.') PORT_CHAR('>')
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH) PORT_NAME("/ ?") PORT_CHAR('/') PORT_CHAR('?')
INPUT_PORTS_END INPUT_PORTS_END
static const gfx_layout p7_chars_8x8 = static const gfx_layout p7_chars_8x8 =
@ -753,20 +869,14 @@ GFXDECODE_END
READ8_MEMBER( pasopia7_state::keyb_r ) READ8_MEMBER( pasopia7_state::keyb_r )
{ {
uint8_t i,j,res = 0; u8 data = 0xff;
for (j=0; j<3; j++) for (u8 j=0; j<3; j++)
{
if (BIT(m_mux_data, 4+j)) if (BIT(m_mux_data, 4+j))
{ for (u8 i=0; i<4; i++)
for (i=0; i<4; i++)
{
if (BIT(m_mux_data, i)) if (BIT(m_mux_data, i))
res |= m_keyboard[j*4+i]->read(); data &= m_keyboard[j*4+i]->read();
}
}
}
return res ^ 0xff; return data;
} }
WRITE8_MEMBER( pasopia7_state::mux_w ) WRITE8_MEMBER( pasopia7_state::mux_w )
@ -776,8 +886,8 @@ WRITE8_MEMBER( pasopia7_state::mux_w )
static const z80_daisy_config p7_daisy[] = static const z80_daisy_config p7_daisy[] =
{ {
{ "z80ctc" }, { "ctc" },
{ "z80pio" }, { "pio" },
// { "fdc" }, /* TODO */ // { "fdc" }, /* TODO */
{ nullptr } { nullptr }
}; };
@ -840,7 +950,7 @@ WRITE8_MEMBER( pasopia7_state::video_misc_w )
WRITE8_MEMBER( pasopia7_state::nmi_mask_w ) WRITE8_MEMBER( pasopia7_state::nmi_mask_w )
{ {
/* /*
--x- ---- (related to the data rec) --x- ---- tape motor
---x ---- data rec out ---x ---- data rec out
---- --x- sound off ---- --x- sound off
---- ---x reset NMI & trap ---- ---x reset NMI & trap
@ -853,7 +963,11 @@ WRITE8_MEMBER( pasopia7_state::nmi_mask_w )
m_nmi_trap &= ~2; m_nmi_trap &= ~2;
//m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE); //guess //m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE); //guess
} }
m_cass->output(BIT(data, 4) ? -1.0 : +1.0);
u8 changed = data ^ m_porta_2;
m_porta_2 = data;
if (BIT(changed, 5))
m_cass->change_state(BIT(data, 5) ? CASSETTE_MOTOR_DISABLED : CASSETTE_MOTOR_ENABLED, CASSETTE_MASK_MOTOR);
} }
/* TODO: investigate on these. */ /* TODO: investigate on these. */
@ -885,7 +999,18 @@ READ8_MEMBER( pasopia7_state::nmi_porta_r )
READ8_MEMBER( pasopia7_state::nmi_portb_r ) READ8_MEMBER( pasopia7_state::nmi_portb_r )
{ {
return 0xf9 | m_nmi_trap | m_nmi_reset; u8 data = (m_cass->input() > +0.04) ? 0x20 : 0;
return 0xd9 | data | m_nmi_trap | m_nmi_reset;
}
WRITE_LINE_MEMBER( pasopia7_state::speaker_w )
{
if (state)
{
m_spr_sw ^= 1;
if (BIT(m_mux_data, 7))
m_speaker->level_w(m_spr_sw);
}
} }
void pasopia7_state::machine_reset() void pasopia7_state::machine_reset()
@ -898,6 +1023,8 @@ void pasopia7_state::machine_reset()
// membank("bank4")->set_base(bios + 0x10000); // membank("bank4")->set_base(bios + 0x10000);
m_nmi_reset |= 4; m_nmi_reset |= 4;
m_porta_2 = 0xFF;
m_cass->change_state(CASSETTE_MOTOR_DISABLED, CASSETTE_MASK_MOTOR);
} }
// TODO: palette values are mostly likely to be wrong in there // TODO: palette values are mostly likely to be wrong in there
@ -922,26 +1049,29 @@ static void pasopia7_floppies(device_slot_interface &device)
void pasopia7_state::p7_base(machine_config &config) void pasopia7_state::p7_base(machine_config &config)
{ {
/* basic machine hardware */ /* basic machine hardware */
Z80(config, m_maincpu, XTAL(4'000'000)); Z80(config, m_maincpu, 15.9744_MHz_XTAL / 4);
m_maincpu->set_addrmap(AS_PROGRAM, &pasopia7_state::pasopia7_mem); m_maincpu->set_addrmap(AS_PROGRAM, &pasopia7_state::pasopia7_mem);
m_maincpu->set_addrmap(AS_IO, &pasopia7_state::pasopia7_io); m_maincpu->set_addrmap(AS_IO, &pasopia7_state::pasopia7_io);
m_maincpu->set_daisy_config(p7_daisy); m_maincpu->set_daisy_config(p7_daisy);
/* Audio */ /* Audio */
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.50);
SN76489A(config, m_sn1, 1996800).add_route(ALL_OUTPUTS, "mono", 0.50); // unknown clock / divider SN76489A(config, m_sn1, 15.9744_MHz_XTAL / 8).add_route(ALL_OUTPUTS, "mono", 0.50);
SN76489A(config, m_sn2, 1996800).add_route(ALL_OUTPUTS, "mono", 0.50); // unknown clock / divider SN76489A(config, m_sn2, 15.9744_MHz_XTAL / 8).add_route(ALL_OUTPUTS, "mono", 0.50);
/* Devices */ /* Devices */
Z80CTC(config, m_ctc, XTAL(4'000'000)); Z80CTC(config, m_ctc, 15.9744_MHz_XTAL / 4);
m_ctc->intr_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0); m_ctc->intr_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
m_ctc->set_clk<0>(15.9744_MHz_XTAL / 4);
m_ctc->set_clk<2>(15.9744_MHz_XTAL / 4);
m_ctc->zc_callback<0>().set(m_ctc, FUNC(z80ctc_device::trg1)); m_ctc->zc_callback<0>().set(m_ctc, FUNC(z80ctc_device::trg1));
m_ctc->zc_callback<1>().set(m_ctc, FUNC(z80ctc_device::trg2)); // beep interface m_ctc->zc_callback<1>().set(FUNC(pasopia7_state::speaker_w));
m_ctc->zc_callback<2>().set(m_ctc, FUNC(z80ctc_device::trg3)); m_ctc->zc_callback<2>().set(m_ctc, FUNC(z80ctc_device::trg3));
Z80PIO(config, m_pio, XTAL(4'000'000)); Z80PIO(config, m_pio, 15.9744_MHz_XTAL / 4);
m_pio->out_int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0); m_pio->out_int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
m_pio->out_pa_callback().set(FUNC(pasopia7_state::mux_w)); m_pio->out_pa_callback().set(FUNC(pasopia7_state::mux_w));
m_pio->in_pb_callback().set(FUNC(pasopia7_state::keyb_r)); m_pio->in_pb_callback().set(FUNC(pasopia7_state::keyb_r));
@ -966,6 +1096,10 @@ void pasopia7_state::p7_base(machine_config &config)
UPD765A(config, m_fdc, 8'000'000, true, true); UPD765A(config, m_fdc, 8'000'000, true, true);
FLOPPY_CONNECTOR(config, "fdc:0", pasopia7_floppies, "525hd", floppy_image_device::default_floppy_formats); FLOPPY_CONNECTOR(config, "fdc:0", pasopia7_floppies, "525hd", floppy_image_device::default_floppy_formats);
FLOPPY_CONNECTOR(config, "fdc:1", pasopia7_floppies, "525hd", floppy_image_device::default_floppy_formats); FLOPPY_CONNECTOR(config, "fdc:1", pasopia7_floppies, "525hd", floppy_image_device::default_floppy_formats);
CASSETTE(config, m_cass);
m_cass->set_default_state(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED);
m_cass->add_route(ALL_OUTPUTS, "mono", 0.05);
} }
void pasopia7_state::p7_raster(machine_config &config) void pasopia7_state::p7_raster(machine_config &config)
@ -984,7 +1118,7 @@ void pasopia7_state::p7_raster(machine_config &config)
PALETTE(config, m_palette, palette_device::BRG_3BIT); PALETTE(config, m_palette, palette_device::BRG_3BIT);
GFXDECODE(config, "gfxdecode", m_palette, gfx_pasopia7); GFXDECODE(config, "gfxdecode", m_palette, gfx_pasopia7);
MC6845(config, m_crtc, VDP_CLOCK); /* unknown variant, unknown clock, hand tuned to get ~60 fps */ HD6845S(config, m_crtc, VDP_CLOCK); // HD46505S
m_crtc->set_screen(m_screen); m_crtc->set_screen(m_screen);
m_crtc->set_show_border_area(false); m_crtc->set_show_border_area(false);
m_crtc->set_char_width(8); m_crtc->set_char_width(8);
@ -1007,7 +1141,7 @@ void pasopia7_state::p7_lcd(machine_config &config)
PALETTE(config, m_palette, FUNC(pasopia7_state::p7_lcd_palette), 8); PALETTE(config, m_palette, FUNC(pasopia7_state::p7_lcd_palette), 8);
GFXDECODE(config, "gfxdecode", m_palette, gfx_pasopia7); GFXDECODE(config, "gfxdecode", m_palette, gfx_pasopia7);
MC6845(config, m_crtc, LCD_CLOCK); /* unknown variant, unknown clock, hand tuned to get ~60 fps */ HD6845S(config, m_crtc, LCD_CLOCK); /* unknown variant, unknown clock, hand tuned to get ~60 fps */
m_crtc->set_screen(m_screen); m_crtc->set_screen(m_screen);
m_crtc->set_show_border_area(false); m_crtc->set_show_border_area(false);
m_crtc->set_char_width(8); m_crtc->set_char_width(8);

View File

@ -1,137 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Angelo Salese
#define PASOPIA_KEYBOARD \
PORT_START("KEY.0") \
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("CTRL") PORT_CODE(KEYCODE_LCONTROL) PORT_CODE(KEYCODE_RCONTROL) PORT_CHAR(UCHAR_SHIFT_2) \
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("SHIFT") PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1) \
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("CAPS LOCK") PORT_CODE(KEYCODE_CAPSLOCK) \
PORT_DIPNAME( 0x08, 0x00, DEF_STR( Unknown ) ) \
PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) \
PORT_DIPSETTING( 0x08, DEF_STR( On ) ) \
PORT_DIPNAME( 0x10, 0x00, DEF_STR( Unknown ) ) \
PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) \
PORT_DIPSETTING( 0x10, DEF_STR( On ) ) \
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("KANA LOCK") \
PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unknown ) ) \
PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) \
PORT_DIPSETTING( 0x40, DEF_STR( On ) ) \
PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unknown ) ) \
PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) \
PORT_DIPSETTING( 0x80, DEF_STR( On ) ) \
PORT_START("KEY.1") \
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_0_PAD) \
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_1_PAD) \
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_2_PAD) \
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_3_PAD) \
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_4_PAD) \
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_5_PAD) \
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_6_PAD) \
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_7_PAD) \
PORT_START("KEY.2") \
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_8_PAD) \
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_9_PAD) \
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS_PAD) \
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_DOWN) PORT_NAME("Down") \
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_UP) PORT_NAME("Up") \
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_HOME) PORT_NAME("Home") \
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_DEL_PAD) \
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) \
PORT_START("KEY.3") \
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_RIGHT) PORT_NAME("RIGHT") \
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Status?") \
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("BACKSPACE") PORT_CHAR(8) \
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_TAB) PORT_CHAR(9) \
PORT_DIPNAME( 0x10, 0x00, DEF_STR( Unknown ) ) \
PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) \
PORT_DIPSETTING( 0x10, DEF_STR( On ) ) \
PORT_DIPNAME( 0x20, 0x00, DEF_STR( Unknown ) ) \
PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) \
PORT_DIPSETTING( 0x20, DEF_STR( On ) ) \
PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unknown ) ) \
PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) \
PORT_DIPSETTING( 0x40, DEF_STR( On ) ) \
PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unknown ) ) \
PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) \
PORT_DIPSETTING( 0x80, DEF_STR( On ) ) \
PORT_START("KEY.4") \
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_END) PORT_NAME("StatusLine") \
PORT_DIPNAME( 0x02, 0x00, "4" ) \
PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) \
PORT_DIPSETTING( 0x02, DEF_STR( On ) ) \
PORT_DIPNAME( 0x04, 0x00, DEF_STR( Unknown ) ) \
PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) \
PORT_DIPSETTING( 0x04, DEF_STR( On ) ) \
PORT_DIPNAME( 0x08, 0x00, DEF_STR( Unknown ) ) \
PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) \
PORT_DIPSETTING( 0x08, DEF_STR( On ) ) \
PORT_DIPNAME( 0x10, 0x00, DEF_STR( Unknown ) ) \
PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) \
PORT_DIPSETTING( 0x10, DEF_STR( On ) ) \
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_LEFT) PORT_NAME("LEFT") \
PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unknown ) ) \
PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) \
PORT_DIPSETTING( 0x40, DEF_STR( On ) ) \
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SPACE) PORT_NAME("SPACE") PORT_CHAR(' ') \
PORT_START("KEY.5") \
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F1) PORT_NAME("F1") \
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F2) PORT_NAME("F2") \
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F3) PORT_NAME("F3") \
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F4) PORT_NAME("F4") \
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F5) PORT_NAME("F5") \
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F6) PORT_NAME("F6") \
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F7) PORT_NAME("F7") \
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F8) PORT_NAME("F8") \
PORT_START("KEY.6") \
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_1) PORT_NAME("1") PORT_CHAR('1') PORT_CHAR('!') \
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_0) PORT_NAME("0") PORT_CHAR('0') PORT_CHAR('0') \
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_4) PORT_NAME("4") PORT_CHAR('4') PORT_CHAR('$') \
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_R) PORT_NAME("R") PORT_CHAR('R') PORT_CHAR('r') \
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Y) PORT_NAME("Y") PORT_CHAR('Y') PORT_CHAR('y') \
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("_") PORT_CHAR('_') \
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSLASH) PORT_NAME("^") \
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Yen") \
PORT_START("KEY.7") \
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_2) PORT_NAME("2") PORT_CHAR('2') PORT_CHAR('"') \
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_3) PORT_NAME("3") PORT_CHAR('3') PORT_CHAR('#') \
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_8) PORT_NAME("8") PORT_CHAR('8') PORT_CHAR('(') \
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_T) PORT_NAME("T") PORT_CHAR('T') PORT_CHAR('t') \
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_U) PORT_NAME("U") PORT_CHAR('U') PORT_CHAR('u') \
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_7) PORT_NAME("7") PORT_CHAR('7') PORT_CHAR('\'') \
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_TILDE) PORT_NAME("@") PORT_CHAR('@') \
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("[ {") PORT_CHAR('[') PORT_CHAR('{') \
PORT_START("KEY.8") \
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS) PORT_NAME("-") PORT_CHAR('-') PORT_CHAR('=') \
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_5) PORT_NAME("5") PORT_CHAR('5') PORT_CHAR('%') \
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_6) PORT_NAME("6") PORT_CHAR('6') PORT_CHAR('&') \
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F) PORT_NAME("F") PORT_CHAR('F') PORT_CHAR('f') \
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_H) PORT_NAME("H") PORT_CHAR('H') PORT_CHAR('h') \
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_9) PORT_NAME("9") PORT_CHAR('9') PORT_CHAR(')') \
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_QUOTE) PORT_NAME(": *") PORT_CHAR(':') PORT_CHAR('*') \
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_NAME("] }") PORT_CHAR(']') PORT_CHAR('}') \
PORT_START("KEY.9") \
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q) PORT_NAME("Q") PORT_CHAR('Q') PORT_CHAR('q') \
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_W) PORT_NAME("W") PORT_CHAR('W') PORT_CHAR('w') \
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_E) PORT_NAME("E") PORT_CHAR('E') PORT_CHAR('e') \
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_G) PORT_NAME("G") PORT_CHAR('G') PORT_CHAR('g') \
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_J) PORT_NAME("J") PORT_CHAR('J') PORT_CHAR('j') \
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_I) PORT_NAME("I") PORT_CHAR('I') PORT_CHAR('i') \
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_O) PORT_NAME("O") PORT_CHAR('O') PORT_CHAR('o') \
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_P) PORT_NAME("P") PORT_CHAR('P') PORT_CHAR('p') \
PORT_START("KEY.10") \
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_A) PORT_NAME("A") PORT_CHAR('A') PORT_CHAR('a') \
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_S) PORT_NAME("S") PORT_CHAR('S') PORT_CHAR('s') \
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_D) PORT_NAME("D") PORT_CHAR('D') PORT_CHAR('d') \
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_V) PORT_NAME("V") PORT_CHAR('V') PORT_CHAR('v') \
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_N) PORT_NAME("N") PORT_CHAR('N') PORT_CHAR('n') \
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_K) PORT_NAME("K") PORT_CHAR('K') PORT_CHAR('k') \
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_L) PORT_NAME("L") PORT_CHAR('L') PORT_CHAR('l') \
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COLON) PORT_NAME("; +") PORT_CHAR(';') PORT_CHAR('+') \
PORT_START("KEY.11") \
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z) PORT_NAME("Z") PORT_CHAR('Z') PORT_CHAR('z') \
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_X) PORT_NAME("X") PORT_CHAR('X') PORT_CHAR('x') \
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_C) PORT_NAME("C") PORT_CHAR('C') PORT_CHAR('c') \
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_B) PORT_NAME("B") PORT_CHAR('B') PORT_CHAR('b') \
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_M) PORT_NAME("M") PORT_CHAR('M') PORT_CHAR('m') \
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA) PORT_NAME(", <") PORT_CHAR(',') PORT_CHAR('<') \
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP) PORT_NAME(". >") PORT_CHAR('.') PORT_CHAR('>') \
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH) PORT_NAME("/ ?") PORT_CHAR('/') PORT_CHAR('?')