// license:BSD-3-Clause
// copyright-holders:Angelo Salese, Sandro Ronco
/***************************************************************************
Sharp PC-E220
preliminary driver by Angelo Salese
improvements by Sandro Ronco
Notes:
- NVRAM works only if the machine is turned off (with OFF key) before closing MESS
TODO:
- ON key doesn't work.
- Fix the PC-G850V keyboard, that sometimes is too slow.
- LCD contrast.
- Add an artwork for the LCD symbols.
- Add other models that have a similar hardware.
More info:
http://wwwhomes.uni-bielefeld.de/achim/pc-e220.html
http://www.akiyan.com/pc-g850_technical_data (in Japanese)
PC-G815 added 2016-05-14, not working at all. Needs new IO map.
Looks like base.rom runs first, then rom00 is at 0x8000 and rom01 is at 0xc000.
****************************************************************************/
#include "emu.h"
#include "cpu/z80/z80.h"
#include "machine/nvram.h"
#include "machine/pce220_ser.h"
#include "machine/ram.h"
#include "machine/timer.h"
#include "sound/beep.h"
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
// Interrupt flags
#define IRQ_FLAG_KEY 0x01
#define IRQ_FLAG_ON 0x02
#define IRQ_FLAG_TIMER 0x04
class pce220_state : public driver_device
{
public:
pce220_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
, m_ram(*this, RAM_TAG)
, m_beep(*this, "beeper")
, m_serial(*this, PCE220SERIAL_TAG)
{ }
void pce220(machine_config &config);
DECLARE_INPUT_CHANGED_MEMBER(kb_irq);
DECLARE_INPUT_CHANGED_MEMBER(on_irq);
protected:
required_device<cpu_device> m_maincpu;
required_device<ram_device> m_ram;
required_device<beep_device> m_beep;
required_device<pce220_serial_device> m_serial;
// HD61202 LCD controller
uint8_t m_lcd_index_row;
uint8_t m_lcd_index_col;
uint8_t m_lcd_start_line;
uint8_t m_lcd_on;
//basic machine
uint8_t m_bank_num;
uint8_t m_irq_mask;
uint8_t m_irq_flag;
uint8_t m_timer_status;
uint16_t m_kb_matrix;
uint8_t *m_vram;
uint8_t m_port15;
uint8_t m_port18;
virtual void machine_start() override;
virtual void machine_reset() override;
TIMER_DEVICE_CALLBACK_MEMBER(pce220_timer_callback);
void pce220_palette(palette_device &palette) const;
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
DECLARE_READ8_MEMBER( lcd_status_r );
DECLARE_WRITE8_MEMBER( lcd_control_w );
DECLARE_READ8_MEMBER( lcd_data_r );
DECLARE_WRITE8_MEMBER( lcd_data_w );
DECLARE_READ8_MEMBER( rom_bank_r );
DECLARE_WRITE8_MEMBER( rom_bank_w );
DECLARE_WRITE8_MEMBER( ram_bank_w );
DECLARE_READ8_MEMBER( timer_r );
DECLARE_WRITE8_MEMBER( timer_w );
DECLARE_WRITE8_MEMBER( boot_bank_w );
DECLARE_READ8_MEMBER( port15_r );
DECLARE_WRITE8_MEMBER( port15_w );
DECLARE_READ8_MEMBER( port18_r );
DECLARE_WRITE8_MEMBER( port18_w );
DECLARE_READ8_MEMBER( port1f_r );
DECLARE_WRITE8_MEMBER( kb_matrix_w );
DECLARE_READ8_MEMBER( kb_r );
DECLARE_READ8_MEMBER( irq_status_r );
DECLARE_WRITE8_MEMBER( irq_ack_w );
DECLARE_WRITE8_MEMBER( irq_mask_w );
void pce220_io(address_map &map);
void pce220_mem(address_map &map);
};
class pcg850v_state : public pce220_state
{
public:
pcg850v_state(const machine_config &mconfig, device_type type, const char *tag)
: pce220_state(mconfig, type, tag)
{ }
void pcg850v(machine_config &config);
void pcg815(machine_config &config);
private:
uint8_t m_g850v_bank_num;
uint8_t m_lcd_effects;
uint8_t m_lcd_contrast;
uint8_t m_lcd_read_mode;
virtual void machine_start() override;
virtual void machine_reset() override;
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
DECLARE_READ8_MEMBER( g850v_bank_r );
DECLARE_WRITE8_MEMBER( g850v_bank_w );
DECLARE_READ8_MEMBER( g850v_lcd_status_r );
DECLARE_WRITE8_MEMBER( g850v_lcd_control_w );
DECLARE_READ8_MEMBER( g850v_lcd_data_r );
DECLARE_WRITE8_MEMBER( g850v_lcd_data_w );
void pcg850v_io(address_map &map);
};
uint32_t pce220_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
uint8_t lcd_symbols[4];
if (m_lcd_on)
{
for (int y = 0; y < 4; y++)
{
int row_pos = 0;
for (int x = 0; x < 12; x++)
{
for (int xi = 0; xi < 5; xi++)
{
for (int yi = 0; yi < 8; yi++)
{
//first 12 columns
int panel1_addr = ((m_lcd_start_line>>3) + y)*0x40 + row_pos;
bitmap.pix16(y*8 + yi, x*6 + xi) = (m_vram[panel1_addr & 0x1ff] >> yi) & 1;
//last 12 columns
int panel2_addr = ((m_lcd_start_line>>3) + y + 4)*0x40 + (59-row_pos);
bitmap.pix16(y*8 + yi, (x+12)*6 + xi) = (m_vram[panel2_addr & 0x1ff] >> yi) & 1;
}
row_pos++;
}
}
}
lcd_symbols[0] = m_vram[((m_lcd_start_line>>3)*0x40 + 0x03c) & 0x1ff];
lcd_symbols[1] = m_vram[((m_lcd_start_line>>3)*0x40 + 0x0fc) & 0x1ff];
lcd_symbols[2] = m_vram[((m_lcd_start_line>>3)*0x40 + 0x13c) & 0x1ff];
lcd_symbols[3] = m_vram[((m_lcd_start_line>>3)*0x40 + 0x1fc) & 0x1ff];
}
else
{
bitmap.fill(0, cliprect);
memset(lcd_symbols, 0, sizeof(lcd_symbols));
}
output().set_value("BUSY" , (lcd_symbols[0] & 0x01) ? 1 : 0);
output().set_value("CAPS" , (lcd_symbols[0] & 0x02) ? 1 : 0);
output().set_value("KANA" , (lcd_symbols[0] & 0x04) ? 1 : 0);
output().set_value("SYO" , (lcd_symbols[0] & 0x08) ? 1 : 0);
output().set_value("2ndF" , (lcd_symbols[0] & 0x10) ? 1 : 0);
output().set_value("TEXT" , (lcd_symbols[1] & 0x08) ? 1 : 0);
output().set_value("CASL" , (lcd_symbols[1] & 0x10) ? 1 : 0);
output().set_value("PRO" , (lcd_symbols[1] & 0x20) ? 1 : 0);
output().set_value("RUN" , (lcd_symbols[1] & 0x40) ? 1 : 0);
output().set_value("BATT" , (lcd_symbols[2] & 0x01) ? 1 : 0);
output().set_value("E" , (lcd_symbols[2] & 0x02) ? 1 : 0);
output().set_value("M" , (lcd_symbols[2] & 0x04) ? 1 : 0);
output().set_value("CONST", (lcd_symbols[2] & 0x08) ? 1 : 0);
output().set_value("RAD" , (lcd_symbols[2] & 0x10) ? 1 : 0);
output().set_value("G" , (lcd_symbols[2] & 0x20) ? 1 : 0);
output().set_value("DE" , (lcd_symbols[2] & 0x40) ? 1 : 0);
output().set_value("STAT" , (lcd_symbols[3] & 0x20) ? 1 : 0);
output().set_value("PRINT", (lcd_symbols[3] & 0x40) ? 1 : 0);
return 0;
}
uint32_t pcg850v_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
uint8_t lcd_symbols[6];
int color0 = 0;
int color1 = 1;
if (m_lcd_on)
{
switch (m_lcd_effects)
{
case 0x01: //mirror effect
//TODO
break;
case 0x05: //black mask effect
color0 = color1 = 1;
break;
case 0x07: //reverse effect
color0 = 1;
color1 = 0;
break;
case 0x08: //contrast effect
//TODO: use the max contrast value
break;
case 0x0e: //white mask effect
color0 = color1 = 0;
break;
}
for (int y = 0; y < 6; y++)
{
int row_pos = 0;
for (int x = 0; x < 24; x++)
{
for (int xi = 0; xi < 6; xi++)
{
for (int yi = 0; yi < 8; yi++)
{
int addr = ((m_lcd_start_line>>3) + y)*0x100 + row_pos;
bitmap.pix16(y*8 + yi, x*6 + xi) = ((m_vram[addr & 0x7ff] >> yi) & 1 ) ? color1 : color0;
}
row_pos++;
}
}
}
lcd_symbols[0] = m_vram[((m_lcd_start_line>>3)*0x100 + 0x090) & 0x7ff];
lcd_symbols[1] = m_vram[((m_lcd_start_line>>3)*0x100 + 0x190) & 0x7ff];
lcd_symbols[2] = m_vram[((m_lcd_start_line>>3)*0x100 + 0x290) & 0x7ff];
lcd_symbols[3] = m_vram[((m_lcd_start_line>>3)*0x100 + 0x390) & 0x7ff];
lcd_symbols[4] = m_vram[((m_lcd_start_line>>3)*0x100 + 0x490) & 0x7ff];
lcd_symbols[5] = m_vram[((m_lcd_start_line>>3)*0x100 + 0x590) & 0x7ff];
}
else
{
bitmap.fill(0, cliprect);
memset(lcd_symbols, 0, sizeof(lcd_symbols));
}
output().set_value("RUN" , (lcd_symbols[0] & 0x02) ? 1 : 0);
output().set_value("PRO" , (lcd_symbols[0] & 0x08) ? 1 : 0);
output().set_value("TEXT" , (lcd_symbols[0] & 0x40) ? 1 : 0);
output().set_value("CASL" , (lcd_symbols[1] & 0x08) ? 1 : 0);
output().set_value("STAT" , (lcd_symbols[2] & 0x01) ? 1 : 0);
output().set_value("2ndF" , (lcd_symbols[2] & 0x20) ? 1 : 0);
output().set_value("M" , (lcd_symbols[2] & 0x80) ? 1 : 0);
output().set_value("CAPS" , (lcd_symbols[3] & 0x04) ? 1 : 0);
output().set_value("KANA" , (lcd_symbols[3] & 0x80) ? 1 : 0);
output().set_value("SYO" , (lcd_symbols[4] & 0x02) ? 1 : 0);
output().set_value("DE" , (lcd_symbols[4] & 0x10) ? 1 : 0);
output().set_value("G" , (lcd_symbols[4] & 0x40) ? 1 : 0);
output().set_value("RAD" , (lcd_symbols[5] & 0x01) ? 1 : 0);
output().set_value("CONST", (lcd_symbols[5] & 0x04) ? 1 : 0);
output().set_value("PRINT", (lcd_symbols[5] & 0x10) ? 1 : 0);
output().set_value("BUSY" , (lcd_symbols[5] & 0x40) ? 1 : 0);
output().set_value("BATT" , (lcd_symbols[5] & 0x80) ? 1 : 0);
return 0;
}
READ8_MEMBER( pce220_state::lcd_status_r )
{
/*
x--- ---- Busy (not emulated)
--x- ---- LCD on/off
---x ---- Reset
*/
uint8_t data = 0;
data &= (m_lcd_on<<5);
return data;
}
WRITE8_MEMBER( pce220_state::lcd_control_w )
{
if((data & 0xfe) == 0x3e) //Display on/off
m_lcd_on = data & 0x01;
if((data & 0xb8) == 0xb8) //Set page
m_lcd_index_row = data & 0x07;
if((data & 0xc0) == 0x40) //Set address
m_lcd_index_col = data & 0x3f;
if((data & 0xc0) == 0xc0) //Set display start line
m_lcd_start_line = data & 0x3f;
}
READ8_MEMBER( pce220_state::lcd_data_r )
{
return m_vram[(m_lcd_index_row*0x40 + m_lcd_index_col - 1) & 0x1ff];
}
WRITE8_MEMBER( pce220_state::lcd_data_w )
{
m_vram[(m_lcd_index_row*0x40 + m_lcd_index_col) & 0x1ff] = data;
m_lcd_index_col++;
}
READ8_MEMBER( pce220_state::rom_bank_r )
{
return m_bank_num;
}
WRITE8_MEMBER( pce220_state::rom_bank_w )
{
uint8_t bank4 = data & 0x07; // bits 0,1,2
uint8_t bank3 = (data & 0x70) >> 4; // bits 4,5,6
m_bank_num = data;
membank("bank3")->set_entry(bank3);
membank("bank4")->set_entry(bank4);
}
WRITE8_MEMBER( pce220_state::ram_bank_w )
{
uint8_t bank = BIT(data,2);
membank("bank1")->set_entry(bank);
membank("bank2")->set_entry(bank);
}
READ8_MEMBER( pce220_state::timer_r )
{
return m_timer_status;
}
WRITE8_MEMBER( pce220_state::timer_w )
{
m_timer_status = data & 1;
}
WRITE8_MEMBER( pce220_state::boot_bank_w )
{
// set to 1 after boot for restore the ram in the first bank
if (data & 0x01)
{
address_space &space_prg = m_maincpu->space(AS_PROGRAM);
space_prg.install_write_bank(0x0000, 0x3fff, "bank1");
membank("bank1")->set_entry(0);
}
}
READ8_MEMBER( pce220_state::port15_r )
{
/*
x--- ---- XIN input enabled
---- ---0
*/
return m_port15;
}
WRITE8_MEMBER( pce220_state::port15_w )
{
m_serial->enable_interface(BIT(data, 7));
m_port15 = data;
}
READ8_MEMBER( pce220_state::port18_r )
{
/*
x--- ---- XOUT/TXD
---- --x- DOUT
---- ---x BUSY/CTS
*/
return m_port18;
}
WRITE8_MEMBER( pce220_state::port18_w )
{
m_beep->set_state(BIT(data, 7));
m_serial->out_busy(BIT(data, 0));
m_serial->out_dout(BIT(data, 1));
m_serial->out_xout(BIT(data, 7));
m_port18 = data;
}
READ8_MEMBER( pce220_state::port1f_r )
{
/*
x--- ---- ON - resp. break key status (?)
---- -x-- XIN/RXD
---- --x- ACK/RTS
---- ---x DIN
*/
uint8_t data = 0;
data |= m_serial->in_din()<<0;
data |= m_serial->in_ack()<<1;
data |= m_serial->in_xin()<<2;
data |= ioport("ON")->read()<<7;
return data;
}
WRITE8_MEMBER( pce220_state::kb_matrix_w )
{
switch(offset)
{
case 0:
m_kb_matrix = (m_kb_matrix & 0x300) | data;
break;
case 1:
m_kb_matrix = (m_kb_matrix & 0xff) | ((data&0x03)<<8);
break;
}
}
READ8_MEMBER( pce220_state::kb_r )
{
uint8_t data = 0x00;
if (m_kb_matrix & 0x01)
data |= ioport("LINE0")->read();
if (m_kb_matrix & 0x02)
data |= ioport("LINE1")->read();
if (m_kb_matrix & 0x04)
data |= ioport("LINE2")->read();
if (m_kb_matrix & 0x08)
data |= ioport("LINE3")->read();
if (m_kb_matrix & 0x10)
data |= ioport("LINE4")->read();
if (m_kb_matrix & 0x20)
data |= ioport("LINE5")->read();
if (m_kb_matrix & 0x40)
data |= ioport("LINE6")->read();
if (m_kb_matrix & 0x80)
data |= ioport("LINE7")->read();
if (m_kb_matrix & 0x100)
data |= ioport("LINE8")->read();
if (m_kb_matrix & 0x200)
data |= ioport("LINE9")->read();
return data;
}
READ8_MEMBER( pce220_state::irq_status_r )
{
/*
---- -x-- timer
---- --x- ON-Key
---- ---x keyboard
*/
return m_irq_flag;
}
WRITE8_MEMBER( pce220_state::irq_ack_w )
{
m_irq_flag &= ~data;
}
WRITE8_MEMBER( pce220_state::irq_mask_w )
{
m_irq_mask = data;
}
READ8_MEMBER( pcg850v_state::g850v_bank_r )
{
return m_g850v_bank_num;
}
WRITE8_MEMBER( pcg850v_state::g850v_bank_w )
{
address_space &space_prg = m_maincpu->space(AS_PROGRAM);
if (data < 0x16)
{
space_prg.install_read_bank(0xc000, 0xffff, "bank4");
membank("bank4")->set_entry(data);
}
else
{
space_prg.unmap_read(0xc000, 0xffff);
}
m_g850v_bank_num = data;
}
READ8_MEMBER( pcg850v_state::g850v_lcd_status_r )
{
/*
x--- ---- Busy (not emulated)
--x- ---- LCD on/off
*/
uint8_t data = 0;
data &= (m_lcd_on<<5);
return data;
}
WRITE8_MEMBER( pcg850v_state::g850v_lcd_control_w )
{
if ((data & 0xf0) == 0x00) // LCD column LSB
{
m_lcd_index_col = (m_lcd_index_col & 0xf0) | (data & 0x0f);
}
else if ((data & 0xf0) == 0x10) // LCD column MSB
{
m_lcd_index_col = (m_lcd_index_col & 0x0f) | ((data<<4) & 0xf0);
}
else if ((data & 0xf0) == 0x20) // LCD on/off
{
m_lcd_on = BIT(data, 0);
}
else if ((data & 0xc0) == 0x40) // display start line
{
m_lcd_start_line = data & 0x3f;
}
else if ((data & 0xe0) == 0x80) // contrast level
{
m_lcd_contrast = data;
}
else if ((data & 0xf0) == 0xa0) // display effects
{
m_lcd_effects = data & 0x0f;
}
else if ((data & 0xf0) == 0xb0) // set row
{
m_lcd_index_row = data & 0x07;
}
else if ((data & 0xf0) == 0xe0) // display controls
{
if (BIT(data, 1))
m_lcd_contrast = 0;
m_lcd_read_mode = BIT(data, 2);
}
else
{
logerror( "PC-G850V: Unknown LCD command 0x%02x\n", data );
}
}
READ8_MEMBER( pcg850v_state::g850v_lcd_data_r )
{
uint8_t data = m_vram[(m_lcd_index_row*0x100 + m_lcd_index_col - 1) & 0x7ff];
if (m_lcd_read_mode == 1)
m_lcd_index_col++;
return data;
}
WRITE8_MEMBER( pcg850v_state::g850v_lcd_data_w )
{
m_vram[(m_lcd_index_row*0x100 + m_lcd_index_col) & 0x7ff] = data;
m_lcd_index_col++;
}
void pce220_state::pce220_mem(address_map &map)
{
map(0x0000, 0x3fff).bankrw("bank1");
map(0x4000, 0x7fff).bankrw("bank2");
map(0x8000, 0xbfff).bankr("bank3");
map(0xc000, 0xffff).bankr("bank4");
}
void pce220_state::pce220_io(address_map &map)
{
map.unmap_value_high();
map.global_mask(0xff);
map(0x10, 0x10).r(FUNC(pce220_state::kb_r));
map(0x11, 0x12).w(FUNC(pce220_state::kb_matrix_w));
map(0x13, 0x13).portr("SHIFT");
map(0x14, 0x14).rw(FUNC(pce220_state::timer_r), FUNC(pce220_state::timer_w));
map(0x15, 0x15).rw(FUNC(pce220_state::port15_r), FUNC(pce220_state::port15_w));
map(0x16, 0x16).rw(FUNC(pce220_state::irq_status_r), FUNC(pce220_state::irq_ack_w));
map(0x17, 0x17).w(FUNC(pce220_state::irq_mask_w));
map(0x18, 0x18).rw(FUNC(pce220_state::port18_r), FUNC(pce220_state::port18_w));
map(0x19, 0x19).rw(FUNC(pce220_state::rom_bank_r), FUNC(pce220_state::rom_bank_w));
map(0x1a, 0x1a).w(FUNC(pce220_state::boot_bank_w));
map(0x1b, 0x1b).w(FUNC(pce220_state::ram_bank_w));
map(0x1c, 0x1c).nopw(); //peripheral reset
map(0x1d, 0x1d).portr("BATTERY");
map(0x1e, 0x1e).nopw(); //???
map(0x1f, 0x1f).r(FUNC(pce220_state::port1f_r));
map(0x58, 0x58).w(FUNC(pce220_state::lcd_control_w));
map(0x59, 0x59).r(FUNC(pce220_state::lcd_status_r));
map(0x5a, 0x5a).w(FUNC(pce220_state::lcd_data_w));
map(0x5b, 0x5b).r(FUNC(pce220_state::lcd_data_r));
}
void pcg850v_state::pcg850v_io(address_map &map)
{
map.unmap_value_high();
map.global_mask(0xff);
map(0x10, 0x10).r(FUNC(pcg850v_state::kb_r));
map(0x11, 0x12).w(FUNC(pcg850v_state::kb_matrix_w));
map(0x13, 0x13).portr("SHIFT");
map(0x14, 0x14).rw(FUNC(pcg850v_state::timer_r), FUNC(pcg850v_state::timer_w));
map(0x15, 0x15).rw(FUNC(pcg850v_state::port15_r), FUNC(pcg850v_state::port15_w));
map(0x16, 0x16).rw(FUNC(pcg850v_state::irq_status_r), FUNC(pcg850v_state::irq_ack_w));
map(0x17, 0x17).w(FUNC(pcg850v_state::irq_mask_w));
map(0x18, 0x18).rw(FUNC(pcg850v_state::port18_r), FUNC(pcg850v_state::port18_w));
map(0x19, 0x19).rw(FUNC(pcg850v_state::rom_bank_r), FUNC(pcg850v_state::rom_bank_w));
map(0x1a, 0x1a).w(FUNC(pcg850v_state::boot_bank_w));
map(0x1b, 0x1b).w(FUNC(pcg850v_state::ram_bank_w));
map(0x1c, 0x1c).nopw(); //peripheral reset
map(0x1d, 0x1d).portr("BATTERY");
map(0x1e, 0x1e).nopw(); //???
map(0x1f, 0x1f).r(FUNC(pcg850v_state::port1f_r));
map(0x40, 0x40).rw(FUNC(pcg850v_state::g850v_lcd_status_r), FUNC(pcg850v_state::g850v_lcd_control_w));
map(0x41, 0x41).rw(FUNC(pcg850v_state::g850v_lcd_data_r), FUNC(pcg850v_state::g850v_lcd_data_w));
map(0x69, 0x69).rw(FUNC(pcg850v_state::g850v_bank_r), FUNC(pcg850v_state::g850v_bank_w));
}
INPUT_CHANGED_MEMBER(pce220_state::kb_irq)
{
if (m_irq_mask & IRQ_FLAG_KEY)
{
m_maincpu->set_input_line(0, newval ? ASSERT_LINE : CLEAR_LINE );
m_irq_flag = (m_irq_flag & 0xfe) | (newval & 0x01);
}
}
INPUT_CHANGED_MEMBER(pce220_state::on_irq)
{
if (m_irq_mask & IRQ_FLAG_ON)
{
m_maincpu->set_input_line(0, newval ? ASSERT_LINE : CLEAR_LINE );
m_irq_flag = (m_irq_flag & 0xfd) | ((newval & 0x01)<<1);
}
}
/* Input ports */
static INPUT_PORTS_START( pce220 )
PORT_START("BATTERY")
PORT_CONFNAME( 0x01, 0x00, "Battery Status" )
PORT_CONFSETTING( 0x00, DEF_STR( Normal ) )
PORT_CONFSETTING( 0x01, "Low Battery" )
PORT_START("LINE0")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F10) PORT_NAME("OFF") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 )
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q) PORT_NAME("Q") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('Q') PORT_CHAR('!')
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_W) PORT_NAME("W") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('W') PORT_CHAR('"')
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_E) PORT_NAME("E") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('E') PORT_CHAR('#')
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_R) PORT_NAME("R") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('R') PORT_CHAR('$')
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_T) PORT_NAME("T") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('T') PORT_CHAR('%')
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Y) PORT_NAME("Y") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('Y') PORT_CHAR('&')
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_U) PORT_NAME("U") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('U') PORT_CHAR('\'')
PORT_START("LINE1")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_A) PORT_NAME("A") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('A') PORT_CHAR('[')
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_S) PORT_NAME("S") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('S') PORT_CHAR(']')
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_D) PORT_NAME("D") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('D') PORT_CHAR('{')
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F) PORT_NAME("F") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('F') PORT_CHAR('}')
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_G) PORT_NAME("G") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('G') PORT_CHAR('\\')
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_H) PORT_NAME("H") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('H') PORT_CHAR('|')
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_J) PORT_NAME("J") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('J') PORT_CHAR('`')
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_K) PORT_NAME("K") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('K') PORT_CHAR('_')
PORT_START("LINE2")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z) PORT_NAME("Z") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('Z')
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_X) PORT_NAME("X") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('X')
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_C) PORT_NAME("C") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('C')
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_V) PORT_NAME("V") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('V')
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_B) PORT_NAME("B") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('B')
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_N) PORT_NAME("N") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('N')
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_M) PORT_NAME("M") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('M')
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA) PORT_NAME(",") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR(',') PORT_CHAR('?')
PORT_START("LINE3")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F1) PORT_NAME("CAL") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 )
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F2) PORT_NAME("BAS") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 )
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_CAPSLOCK) PORT_NAME("CAPS") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 )
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_HOME) PORT_NAME("ANS") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 )
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_TAB) PORT_NAME("TAB") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 )
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SPACE) PORT_NAME("SPACE") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR(' ')
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_DOWN) PORT_NAME("DOWN") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR(UCHAR_MAMEKEY(DOWN))
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_UP) PORT_NAME("UP") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR(UCHAR_MAMEKEY(UP))
PORT_START("LINE4")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_LEFT) PORT_NAME("LEFT") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR(UCHAR_MAMEKEY(LEFT))
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_RIGHT) PORT_NAME("RIGHT") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR(UCHAR_MAMEKEY(RIGHT))
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F4) PORT_NAME("CONS") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 )
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_0) PORT_NAME("0") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('0')
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP) PORT_NAME(".") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('.')
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSLASH) PORT_NAME("+/-") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 )
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('+')
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_ENTER) PORT_NAME("RET") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR(13)
PORT_START("LINE5")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_L) PORT_NAME("L") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('L') PORT_CHAR('=')
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COLON) PORT_NAME(";") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR(';') PORT_CHAR(':')
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_DEL) PORT_NAME("DEL") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR(UCHAR_MAMEKEY(DEL))
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_1) PORT_NAME("1") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('1')
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_2) PORT_NAME("2") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('2')
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_3) PORT_NAME("3") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('3')
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS) PORT_NAME("-") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('-')
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F5) PORT_NAME("M+") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 )
PORT_START("LINE6")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_I) PORT_NAME("I") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('I') PORT_CHAR('<')
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_O) PORT_NAME("O") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('O') PORT_CHAR('>')
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_INSERT) PORT_NAME("INS") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR(UCHAR_MAMEKEY(INSERT))
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_4) PORT_NAME("4") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('4')
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_5) PORT_NAME("5") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('5')
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_6) PORT_NAME("6") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('6')
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME("*") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('*')
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F6) PORT_NAME("RM") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 )
PORT_START("LINE7")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_P) PORT_NAME("P") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('P') PORT_CHAR('@')
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("BS") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR(UCHAR_MAMEKEY(BACKSPACE))
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F7) PORT_NAME("n!") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 )
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_7) PORT_NAME("7") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('7')
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_8) PORT_NAME("8") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('8')
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_9) PORT_NAME("9") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('9')
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH) PORT_NAME("/") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('/')
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_NAME(")") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR(')')
PORT_START("LINE8")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("hyp") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 )
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("DEG") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 )
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("y^x") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('^')
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("sqrt") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 )
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("x^2") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 )
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("(") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('(')
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("1/x") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 )
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("MDF") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 )
PORT_START("LINE9")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_LCONTROL) PORT_NAME("2nd") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 )
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("sin") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 )
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("cos") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 )
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("ln") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 )
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F8) PORT_NAME("log") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 )
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F9) PORT_NAME("tan") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 )
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F11) PORT_NAME("FSE") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 )
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_ESC) PORT_NAME("CCE") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 )
PORT_START("SHIFT")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_LSHIFT) PORT_NAME("Shift") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR(UCHAR_SHIFT_1)
PORT_START("ON")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_PGUP) PORT_NAME("ON") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, on_irq, 0 )
INPUT_PORTS_END
static INPUT_PORTS_START( pcg850v )
PORT_START("BATTERY")
PORT_CONFNAME( 0x01, 0x00, "Battery Status" )
PORT_CONFSETTING( 0x00, DEF_STR( Normal ) )
PORT_CONFSETTING( 0x01, "Low Battery" )
PORT_START("LINE0")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F10) PORT_NAME("OFF") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 )
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q) PORT_NAME("Q") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('Q') PORT_CHAR('!')
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_W) PORT_NAME("W") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('W') PORT_CHAR('"')
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_E) PORT_NAME("E") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('E') PORT_CHAR('#')
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_R) PORT_NAME("R") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('R') PORT_CHAR('$')
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_T) PORT_NAME("T") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('T') PORT_CHAR('%')
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Y) PORT_NAME("Y") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('Y') PORT_CHAR('&')
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_U) PORT_NAME("U") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('U') PORT_CHAR('\'')
PORT_START("LINE1")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_A) PORT_NAME("A") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('A') PORT_CHAR('[')
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_S) PORT_NAME("S") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('S') PORT_CHAR(']')
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_D) PORT_NAME("D") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('D') PORT_CHAR('{')
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F) PORT_NAME("F") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('F') PORT_CHAR('}')
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_G) PORT_NAME("G") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('G')
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_H) PORT_NAME("H") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('H') PORT_CHAR('|')
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_J) PORT_NAME("J") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('J') PORT_CHAR('`')
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_K) PORT_NAME("K") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('K') PORT_CHAR('_')
PORT_START("LINE2")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z) PORT_NAME("Z") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('Z')
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_X) PORT_NAME("X") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('X')
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_C) PORT_NAME("C") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('C')
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_V) PORT_NAME("V") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('V')
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_B) PORT_NAME("B") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('B')
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_N) PORT_NAME("N") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('N')
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_M) PORT_NAME("M") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('M')
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA) PORT_NAME(",") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR(',') PORT_CHAR('?')
PORT_START("LINE3")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F1) PORT_NAME("BAS") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 )
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F2) PORT_NAME("TEXT") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 )
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_CAPSLOCK) PORT_NAME("CAPS") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 )
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_HOME) PORT_NAME("KANA") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 )
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_TAB) PORT_NAME("TAB") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 )
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SPACE) PORT_NAME("SPACE") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR(' ')
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_DOWN) PORT_NAME("DOWN") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR(UCHAR_MAMEKEY(DOWN))
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_UP) PORT_NAME("UP") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR(UCHAR_MAMEKEY(UP))
PORT_START("LINE4")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_LEFT) PORT_NAME("LEFT") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR(UCHAR_MAMEKEY(LEFT))
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_RIGHT) PORT_NAME("RIGHT") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR(UCHAR_MAMEKEY(RIGHT))
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F4) PORT_NAME("CONS") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 )
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_0) PORT_NAME("0") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('0')
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP) PORT_NAME(".") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('.')
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("=") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('=')
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('+')
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_ENTER) PORT_NAME("RET") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR(13)
PORT_START("LINE5")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_L) PORT_NAME("L") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('L') PORT_CHAR('=')
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COLON) PORT_NAME(";") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR(';') PORT_CHAR(':')
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_DEL) PORT_NAME("DEL") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR(UCHAR_MAMEKEY(DEL))
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_1) PORT_NAME("1") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('1')
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_2) PORT_NAME("2") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('2')
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_3) PORT_NAME("3") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('3')
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS) PORT_NAME("-") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('-')
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F5) PORT_NAME("M+") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 )
PORT_START("LINE6")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_I) PORT_NAME("I") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('I') PORT_CHAR('<')
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_O) PORT_NAME("O") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('O') PORT_CHAR('>')
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_INSERT) PORT_NAME("INS") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR(UCHAR_MAMEKEY(INSERT))
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_4) PORT_NAME("4") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('4')
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_5) PORT_NAME("5") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('5')
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_6) PORT_NAME("6") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('6')
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME("*") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('*')
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F6) PORT_NAME("RM") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 )
PORT_START("LINE7")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_P) PORT_NAME("P") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('P') PORT_CHAR('@')
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("BS") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR(UCHAR_MAMEKEY(BACKSPACE))
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F7) PORT_NAME("pi") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 )
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_7) PORT_NAME("7") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('7')
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_8) PORT_NAME("8") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('8')
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_9) PORT_NAME("9") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('9')
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH) PORT_NAME("/") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('/')
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_NAME(")") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR(')')
PORT_START("LINE8")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("nPr") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 )
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("DEG") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 )
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("SQR") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 )
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("SQU") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 )
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("x^y") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('^')
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("(") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR('(')
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("1/x") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 )
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("MDF") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 )
PORT_START("LINE9")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_LCONTROL) PORT_NAME("2nd") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 )
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("sin") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 )
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("cos") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 )
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("ln") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 )
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F8) PORT_NAME("log") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 )
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F9) PORT_NAME("tan") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 )
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F11) PORT_NAME("FSE") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 )
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_ESC) PORT_NAME("CCE") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 )
PORT_START("SHIFT")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_LSHIFT) PORT_NAME("Shift") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, kb_irq, 0 ) PORT_CHAR(UCHAR_SHIFT_1)
PORT_START("ON")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_PGUP) PORT_NAME("ON") PORT_CHANGED_MEMBER(DEVICE_SELF, pce220_state, on_irq, 0 )
INPUT_PORTS_END
void pce220_state::machine_start()
{
uint8_t *rom = memregion("user1")->base();
uint8_t *ram = m_ram->pointer();
membank("bank1")->configure_entries(0, 2, ram + 0x0000, 0x8000);
membank("bank2")->configure_entries(0, 2, ram + 0x4000, 0x8000);
membank("bank3")->configure_entries(0, 8, rom, 0x4000);
membank("bank4")->configure_entries(0, 8, rom, 0x4000);
m_vram = (uint8_t*)memregion("lcd_vram")->base();
subdevice<nvram_device>("nvram")->set_base(ram, m_ram->size());
}
void pcg850v_state::machine_start()
{
uint8_t *rom = memregion("user1")->base();
uint8_t *ram = m_ram->pointer();
membank("bank1")->configure_entries(0, 2, ram + 0x0000, 0x8000);
membank("bank2")->configure_entries(0, 2, ram + 0x4000, 0x8000);
membank("bank3")->configure_entries(0, 22, rom, 0x4000);
membank("bank4")->configure_entries(0, 22, rom, 0x4000);
m_vram = (uint8_t*)memregion("lcd_vram")->base();
subdevice<nvram_device>("nvram")->set_base(ram, m_ram->size());
}
void pce220_state::machine_reset()
{
address_space &space = m_maincpu->space(AS_PROGRAM);
space.unmap_write(0x0000, 0x3fff);
// install the boot code into the first bank
membank("bank1")->set_base(memregion("user1")->base() + 0x0000);
m_lcd_index_row = 0;
m_lcd_index_col = 0;
m_lcd_start_line = 0;
m_lcd_on = 0;
m_bank_num = 0;
m_irq_mask = 0;
m_irq_flag = 0;
m_timer_status = 0;
m_kb_matrix = 0;
}
void pcg850v_state::machine_reset()
{
pce220_state::machine_reset();
m_g850v_bank_num = 0;
m_lcd_effects = 0;
m_lcd_contrast = 0;
m_lcd_read_mode = 0;
}
TIMER_DEVICE_CALLBACK_MEMBER(pce220_state::pce220_timer_callback)
{
m_timer_status = !m_timer_status;
if (m_irq_mask & IRQ_FLAG_TIMER)
{
m_maincpu->set_input_line(0, HOLD_LINE );
m_irq_flag = (m_irq_flag & 0xfb) | (m_timer_status<<2);
}
}
void pce220_state::pce220_palette(palette_device &palette) const
{
palette.set_pen_color(0, rgb_t(138, 146, 148));
palette.set_pen_color(1, rgb_t(92, 83, 88));
}
void pce220_state::pce220(machine_config &config)
{
/* basic machine hardware */
Z80(config, m_maincpu, 3072000); // CMOS-SC7852
m_maincpu->set_addrmap(AS_PROGRAM, &pce220_state::pce220_mem);
m_maincpu->set_addrmap(AS_IO, &pce220_state::pce220_io);
/* video hardware */
// 4 lines x 24 characters, resp. 144 x 32 pixel
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
screen.set_refresh_hz(50);
screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
screen.set_screen_update(FUNC(pce220_state::screen_update));
screen.set_size(24*6, 4*8);
screen.set_visarea(0, 24*6-1, 0, 4*8-1);
screen.set_palette("palette");
PALETTE(config, "palette", FUNC(pce220_state::pce220_palette), 2);
/* sound hardware */
SPEAKER(config, "mono").front_center();
BEEP(config, m_beep, 3250).add_route(ALL_OUTPUTS, "mono", 0.50);
TIMER(config, "pce220_timer").configure_periodic(FUNC(pce220_state::pce220_timer_callback), attotime::from_msec(468));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* internal ram */
RAM(config, RAM_TAG).set_default_size("64K"); // 32K internal + 32K external card
PCE220SERIAL(config, m_serial, 0);
}
void pcg850v_state::pcg815(machine_config &config)
{
/* basic machine hardware */
Z80(config, m_maincpu, XTAL(4'000'000)); // 3.54MHz
m_maincpu->set_addrmap(AS_PROGRAM, &pcg850v_state::pce220_mem);
m_maincpu->set_addrmap(AS_IO, &pcg850v_state::pcg850v_io);
/* video hardware */
// 4 lines x 24 characters, resp. 144 x 32 pixel
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
screen.set_refresh_hz(50);
screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
screen.set_screen_update(FUNC(pcg850v_state::screen_update));
screen.set_size(144, 32);
screen.set_visarea(0, 144-1, 0, 32-1);
screen.set_palette("palette");
PALETTE(config, "palette", FUNC(pcg850v_state::pce220_palette), 2);
/* sound hardware */
SPEAKER(config, "mono").front_center();
BEEP(config, m_beep, 3250).add_route(ALL_OUTPUTS, "mono", 0.50);
TIMER(config, "pce220_timer").configure_periodic(FUNC(pcg850v_state::pce220_timer_callback), attotime::from_msec(468));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* internal ram */
RAM(config, RAM_TAG).set_default_size("64K"); // 32K internal + 32K external card
PCE220SERIAL(config, m_serial, 0);
}
void pcg850v_state::pcg850v(machine_config &config)
{
/* basic machine hardware */
Z80(config, m_maincpu, XTAL(8'000'000)); // CMOS-SC7852
m_maincpu->set_addrmap(AS_PROGRAM, &pcg850v_state::pce220_mem);
m_maincpu->set_addrmap(AS_IO, &pcg850v_state::pcg850v_io);
/* video hardware */
// 6 lines x 24 characters, resp. 144 x 48 pixel
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
screen.set_refresh_hz(50);
screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
screen.set_screen_update(FUNC(pcg850v_state::screen_update));
screen.set_size(144, 48);
screen.set_visarea(0, 144-1, 0, 48-1);
screen.set_palette("palette");
PALETTE(config, "palette", FUNC(pcg850v_state::pce220_palette), 2);
/* sound hardware */
SPEAKER(config, "mono").front_center();
BEEP(config, m_beep, 3250).add_route(ALL_OUTPUTS, "mono", 0.50);
TIMER(config, "pce220_timer").configure_periodic(FUNC(pcg850v_state::pce220_timer_callback), attotime::from_msec(468));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* internal ram */
RAM(config, RAM_TAG).set_default_size("64K"); // 32K internal + 32K external card
PCE220SERIAL(config, m_serial, 0);
}
/* ROM definition */
ROM_START( pce220 )
ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF )
ROM_REGION( 0x20000, "user1", ROMREGION_ERASEFF )
ROM_SYSTEM_BIOS( 0, "v1", "v 0.1")
ROM_SYSTEM_BIOS( 1, "v2", "v 0.2")
ROM_LOAD( "bank0.bin", 0x0000, 0x4000, CRC(1fa94d11) SHA1(24c54347dbb1423388360a359aa09db47d2057b7))
ROM_LOAD( "bank1.bin", 0x4000, 0x4000, CRC(0f9864b0) SHA1(6b7301c96f1a865e1931d82872a1ed5d1f80644e))
ROM_LOAD( "bank2.bin", 0x8000, 0x4000, CRC(1625e958) SHA1(090440600d461aa7efe4adbf6e975aa802aabeec))
ROM_LOAD( "bank3.bin", 0xc000, 0x4000, CRC(ed9a57f8) SHA1(58087dc64103786a40325c0a1e04bd88bfd6da57))
ROM_LOAD( "bank4.bin", 0x10000, 0x4000, CRC(e37665ae) SHA1(85f5c84f69f79e7ac83b30397b2a1d9629f9eafa))
ROMX_LOAD( "bank5.bin", 0x14000, 0x4000, CRC(6b116e7a) SHA1(b29f5a070e846541bddc88b5ee9862cc36b88eee), ROM_BIOS(1))
ROMX_LOAD( "bank5_0.1.bin", 0x14000, 0x4000, CRC(13c26eb4) SHA1(b9cd0efd6b195653b9610e20ad8aab541824a689), ROM_BIOS(0))
ROMX_LOAD( "bank6.bin", 0x18000, 0x4000, CRC(4fbfbd18) SHA1(e5aab1df172dcb94aa90e7d898eacfc61157ff15), ROM_BIOS(1))
ROMX_LOAD( "bank6_0.1.bin", 0x18000, 0x4000, CRC(e2cda7a6) SHA1(01b1796d9485fde6994cb5afbe97514b54cfbb3a), ROM_BIOS(0))
ROMX_LOAD( "bank7.bin", 0x1c000, 0x4000, CRC(5e98b5b6) SHA1(f22d74d6a24f5929efaf2983caabd33859232a94), ROM_BIOS(1))
ROMX_LOAD( "bank7_0.1.bin", 0x1c000, 0x4000, CRC(d8e821b2) SHA1(18245a75529d2f496cdbdc28cdf40def157b20c0), ROM_BIOS(0))
ROM_REGION( 0x200, "lcd_vram", ROMREGION_ERASE00) //HD61202 internal RAM (4096 bits)
ROM_END
ROM_START( pcg815 )
ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF )
ROM_REGION( 0x58000, "user1", ROMREGION_ERASEFF )
ROM_LOAD( "rom00.bin", 0x000000, 0x004000, CRC(43767d51) SHA1(0d8b8b88a5d084f750daffc0abbb6b868fd3f144) )
ROM_LOAD( "rom01.bin", 0x004000, 0x004000, CRC(b0e32ace) SHA1(e84c84c18c09dd2920fa38e77d8049b980692d29) )
ROM_LOAD( "rom02.bin", 0x008000, 0x004000, CRC(f5cb78ba) SHA1(dfb2e415a5603a820b960d810995dd1109d84547) )
ROM_LOAD( "rom03.bin", 0x00c000, 0x004000, CRC(5eff142b) SHA1(71d8d0a1bd0bcdef43f951036d9e1da0377d6a33) )
ROM_LOAD( "rom04.bin", 0x010000, 0x004000, CRC(cb91bab5) SHA1(5b354ba6fc48043f03b573ad470518e9bb48cf99) )
ROM_LOAD( "rom05.bin", 0x014000, 0x004000, CRC(ccaa1876) SHA1(404bf36c3832ee1a4602fa6a917d1ef2db5411c1) )
ROM_LOAD( "rom06.bin", 0x018000, 0x004000, CRC(9d80802f) SHA1(aec989b8763d1346313a13c761ed0306b4f84257) )
ROM_LOAD( "rom07.bin", 0x01c000, 0x004000, CRC(618a7be8) SHA1(5f16e47eeeb9c153bb95c6d6e3af276576b8274e) )
ROM_LOAD( "rom08.bin", 0x020000, 0x004000, CRC(d8ba21a9) SHA1(a5580f22864afee8d4a8f1ecf6231acbde16b612) )
ROM_LOAD( "rom09.bin", 0x024000, 0x004000, CRC(f6f49677) SHA1(e0d70a11b7dd21662cb444ac93d4b43f584909b5) )
ROM_LOAD( "rom0a.bin", 0x028000, 0x004000, CRC(ecbabb64) SHA1(14beef60dfd1f18375459e9acb9527589e09e3ce) )
ROM_LOAD( "base.bin", 0x02c000, 0x000040, CRC(1a8b2044) SHA1(8576c69532d138eb78ff7a59f668a1a62a670447) )
ROM_REGION( 0x1000, "lcd_vram", ROMREGION_ERASE00)
ROM_END
ROM_START( pcg850v )
ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF )
ROM_REGION( 0x58000, "user1", ROMREGION_ERASEFF )
ROM_LOAD( "rom00.bin", 0x00000, 0x4000, CRC(c41a7a3e) SHA1(8b85d07e6f2fa048f8a958c261ab3344df750bd2))
ROM_LOAD( "rom01.bin", 0x04000, 0x4000, CRC(45cafcaf) SHA1(e6142ac2ddb50c90bf1afd03ee2d2741abde8b76))
ROM_LOAD( "rom02.bin", 0x08000, 0x4000, CRC(c81a804e) SHA1(322b9c6ca5cb7bc41a55c7874838e601ef50644e))
ROM_LOAD( "rom03.bin", 0x0c000, 0x4000, CRC(9301e937) SHA1(b152186577abf86a7fb535cd63985f2a67e154b9))
ROM_LOAD( "rom04.bin", 0x10000, 0x4000, CRC(6bf11755) SHA1(fe7458758d26fabfcca34e791fe2425104830b7b))
ROM_LOAD( "rom05.bin", 0x14000, 0x4000, CRC(8a808f5e) SHA1(448caf0cc30de483d876c31785c8bb27305860b8))
ROM_LOAD( "rom06.bin", 0x18000, 0x4000, CRC(3902f135) SHA1(40fbd51718a830e3f374843990522e29508376fd))
ROM_LOAD( "rom07.bin", 0x1c000, 0x4000, CRC(618a7be8) SHA1(5f16e47eeeb9c153bb95c6d6e3af276576b8274e))
ROM_LOAD( "rom08.bin", 0x20000, 0x4000, CRC(bf05b34d) SHA1(8556d64ddd89191c9dc048280e384f9146d81a16))
ROM_LOAD( "rom09.bin", 0x24000, 0x4000, CRC(b75dbd0a) SHA1(ca149134a819fa52591ae1733270f8b3c811a18a))
ROM_LOAD( "rom0a.bin", 0x28000, 0x4000, CRC(e7c5ec8f) SHA1(70cac20d4f01b5b2fdd76837659bc4947a1ebd21))
ROM_LOAD( "rom0b.bin", 0x2c000, 0x4000, CRC(bdc4f889) SHA1(154d6223e8e750fcbffdb069215fee9492685747))
ROM_LOAD( "rom0c.bin", 0x30000, 0x4000, CRC(6ef5560a) SHA1(5b2ad8e36354f448fe01acba1d2f69630de345a7))
ROM_LOAD( "rom0d.bin", 0x34000, 0x4000, CRC(4295a44e) SHA1(0f8dfc759ed17f2b0acc1dc4912e881b1f0f65aa))
ROM_LOAD( "rom0e.bin", 0x38000, 0x4000, CRC(0c8212e1) SHA1(8145728d87ea5a5e29c0e98c3d2d4278b1070359))
ROM_LOAD( "rom0f.bin", 0x3c000, 0x4000, CRC(33c30dba) SHA1(296fb6fa3921822c3458acde0962c3a25cb19a1e))
ROM_LOAD( "rom10.bin", 0x40000, 0x4000, CRC(553a0926) SHA1(2149827f9a2eb879756b3da609e17fc5b1c9bd78))
ROM_LOAD( "rom11.bin", 0x44000, 0x4000, CRC(385a128d) SHA1(eda1192a75e4cfb50c0ac058f230a84cbfe67d51))
ROM_LOAD( "rom12.bin", 0x48000, 0x4000, CRC(cd12dfca) SHA1(50a5defdeb4da9b2eac196816559056fc55e1dca))
ROM_LOAD( "rom13.bin", 0x4c000, 0x4000, CRC(9bca873b) SHA1(4ce43553fb15c0ca866e9582a3ef8dc22a2795b4))
ROM_LOAD( "rom14.bin", 0x50000, 0x4000, CRC(a2938c40) SHA1(d2c24401eea5e56268ef6eadcc612c8bbaa3342a))
ROM_LOAD( "rom15.bin", 0x54000, 0x4000, CRC(53a0bf0a) SHA1(bf27baeaf208628fbe3c959d623cc08de21cf9f8))
ROM_REGION( 0x1000, "lcd_vram", ROMREGION_ERASE00)
ROM_END
/* Driver */
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
COMP( 1991, pce220, 0, 0, pce220, pce220, pce220_state, empty_init, "Sharp", "PC-E220", MACHINE_NOT_WORKING )
COMP( 1992, pcg815, 0, 0, pcg815, pcg850v, pcg850v_state, empty_init, "Sharp", "PC-G815", MACHINE_NOT_WORKING )
COMP( 2001, pcg850v, 0, 0, pcg850v, pcg850v, pcg850v_state, empty_init, "Sharp", "PC-G850V", MACHINE_NOT_WORKING )