primo: some PORT_CHAR corrections, small cleanup

This commit is contained in:
hap 2024-10-16 20:07:51 +02:00
parent f81cf3039a
commit 0327678158
3 changed files with 46 additions and 80 deletions

View File

@ -104,7 +104,7 @@ I/O Ports:
Interrupts:
NMI - 20ms (50HZ), can be disbled/enabled by I/O write
ToDO:
TODO:
- primoc64 works, but it seems it should be used with a commodore 64
disk drive. This isn't emulated.
@ -125,7 +125,7 @@ void primo_state::primoa_io(address_map &map)
{
map.global_mask(0xff);
map(0x00, 0x3f).rw(FUNC(primo_state::be_1_r), FUNC(primo_state::ki_1_w));
map(0xfd, 0xfd).w(FUNC(primo_state::FD_w));
map(0xfd, 0xfd).w(FUNC(primo_state::fd_w));
}
void primo_state::primob_io(address_map &map)
@ -133,7 +133,7 @@ void primo_state::primob_io(address_map &map)
map.global_mask(0xff);
map(0x00, 0x3f).rw(FUNC(primo_state::be_1_r), FUNC(primo_state::ki_1_w));
map(0x40, 0x7f).rw(FUNC(primo_state::be_2_r), FUNC(primo_state::ki_2_w));
map(0xfd, 0xfd).w(FUNC(primo_state::FD_w));
map(0xfd, 0xfd).w(FUNC(primo_state::fd_w));
}
void primo_state::primo32_mem(address_map &map)
@ -161,9 +161,9 @@ static INPUT_PORTS_START( primo )
PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y')
PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP))
PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S')
PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("SHIFT") PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1)
PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("SHIFT") PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1)
PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E')
PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("UPPER") PORT_CODE(KEYCODE_LALT) PORT_CHAR(UCHAR_MAMEKEY(LALT))
PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("UPPER") PORT_CODE(KEYCODE_LALT) PORT_CHAR(UCHAR_MAMEKEY(LALT))
PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W')
PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("CTR") PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_MAMEKEY(LCONTROL))
PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D')
@ -203,7 +203,7 @@ static INPUT_PORTS_START( primo )
PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J')
PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_HOME) PORT_CHAR('>') PORT_CHAR('<')
PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L')
PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('-') PORT_CHAR('|')
PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('-') PORT_CHAR(U'í')
PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K')
PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR(':')
PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M')
@ -212,22 +212,22 @@ static INPUT_PORTS_START( primo )
PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR(';')
PORT_START( "IN3" )
PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("?") PORT_CODE(KEYCODE_EQUALS) PORT_CHAR(UCHAR_MAMEKEY(F2))
PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR(U'ü') PORT_CHAR(U'Ü')
PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('*') PORT_CHAR('\'')
PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P')
PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("\xC2\xA3") PORT_CODE(KEYCODE_END) PORT_CHAR(UCHAR_MAMEKEY(F3))
PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_END) PORT_CHAR(U'ú') PORT_CHAR(U'ű')
PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O')
PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("CLS") PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(UCHAR_MAMEKEY(BACKSPACE))
PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("CLS") PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8)
PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("RETURN") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(UCHAR_MAMEKEY(ENTER))
PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("RETURN") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13)
PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT))
PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("\xE2\x80\x9A") PORT_CODE(KEYCODE_COLON) PORT_CHAR(UCHAR_MAMEKEY(F4))
PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("\xC2\xA2") PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(UCHAR_MAMEKEY(F5))
PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("\xC2\xA0") PORT_CODE(KEYCODE_QUOTE) PORT_CHAR(UCHAR_MAMEKEY(F6))
PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_CHAR(U'é') PORT_CHAR(U'É')
PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(U'ó') PORT_CHAR(U'ő')
PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR(U'á') PORT_CHAR(U'Á')
PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT))
PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("\xE2\x80\x9D") PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR(UCHAR_MAMEKEY(F7))
PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("BRK") PORT_CODE(KEYCODE_ESC) PORT_CHAR(UCHAR_MAMEKEY(ESC))
PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR(U'ö') PORT_CHAR(U'Ö')
PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("BRK") PORT_CODE(KEYCODE_ESC) PORT_CHAR(27)
PORT_START( "RESET" )
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Reset") PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1))
@ -244,7 +244,8 @@ static INPUT_PORTS_START( primo )
PORT_CONFSETTING( 0x01, DEF_STR( Off ) )
INPUT_PORTS_END
static const cassette_image::Options primo_cassette_options = {
static const cassette_image::Options primo_cassette_options =
{
1, /* channels */
16, /* bits per sample */
22050 /* sample frequency */
@ -307,32 +308,24 @@ void primo_state::primob32(machine_config &config)
{
primoa32(config);
m_maincpu->set_addrmap(AS_IO, &primo_state::primob_io);
MCFG_MACHINE_RESET_OVERRIDE(primo_state, primob)
}
void primo_state::primob48(machine_config &config)
{
primoa48(config);
m_maincpu->set_addrmap(AS_IO, &primo_state::primob_io);
MCFG_MACHINE_RESET_OVERRIDE(primo_state, primob)
}
void primo_state::primob64(machine_config &config)
{
primoa64(config);
m_maincpu->set_addrmap(AS_IO, &primo_state::primob_io);
MCFG_MACHINE_RESET_OVERRIDE(primo_state, primob)
}
void primo_state::primoc64(machine_config &config)
{
primoa64(config);
m_maincpu->set_addrmap(AS_IO, &primo_state::primob_io);
MCFG_MACHINE_RESET_OVERRIDE(primo_state, primob)
}
ROM_START( primoa32 )
@ -371,7 +364,7 @@ ROM_END
ROM_START( primob64 )
ROM_REGION( 0x4000, "maincpu", 0 )
ROM_SYSTEM_BIOS(0, "standard", "Standard")
ROM_SYSTEM_BIOS(0, "std", "Standard")
ROMX_LOAD( "b64.rom", 0x0000, 0x4000, CRC(cea28188) SHA1(a77e42e97402e601b78ab3751eac1e85d0bbb4a0), ROM_BIOS(0) )
ROM_SYSTEM_BIOS(1, "cdos", "CDOS")
ROMX_LOAD( "b64cdos.rom", 0x0000, 0x4000, CRC(73305e4d) SHA1(c090c3430cdf19eed8363377b981e1c21a4ed169), ROM_BIOS(1) )
@ -386,10 +379,10 @@ ROM_START( primoc64 )
ROM_END
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
COMP( 1984, primoa32, 0, 0, primoa32, primo, primo_state, init_primo, "Microkey", "Primo A-32", MACHINE_SUPPORTS_SAVE )
COMP( 1984, primoa48, primoa32, 0, primoa48, primo, primo_state, init_primo, "Microkey", "Primo A-48", MACHINE_SUPPORTS_SAVE )
COMP( 1984, primoa64, primoa32, 0, primoa64, primo, primo_state, init_primo, "Microkey", "Primo A-64", MACHINE_SUPPORTS_SAVE )
COMP( 1984, primob32, primoa32, 0, primob32, primo, primo_state, init_primo, "Microkey", "Primo B-32", MACHINE_SUPPORTS_SAVE )
COMP( 1984, primob48, primoa32, 0, primob48, primo, primo_state, init_primo, "Microkey", "Primo B-48", MACHINE_SUPPORTS_SAVE )
COMP( 1984, primob64, primoa32, 0, primob64, primo, primo_state, init_primo, "Microkey", "Primo B-64", MACHINE_SUPPORTS_SAVE )
COMP( 1984, primoc64, primoa32, 0, primoc64, primo, primo_state, init_primo, "Microkey", "Primo C-64", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
COMP( 1984, primoa32, 0, 0, primoa32, primo, primo_state, empty_init, "Microkey", "Primo A-32", MACHINE_SUPPORTS_SAVE )
COMP( 1984, primoa48, primoa32, 0, primoa48, primo, primo_state, empty_init, "Microkey", "Primo A-48", MACHINE_SUPPORTS_SAVE )
COMP( 1984, primoa64, primoa32, 0, primoa64, primo, primo_state, empty_init, "Microkey", "Primo A-64", MACHINE_SUPPORTS_SAVE )
COMP( 1984, primob32, primoa32, 0, primob32, primo, primo_state, empty_init, "Microkey", "Primo B-32", MACHINE_SUPPORTS_SAVE )
COMP( 1984, primob48, primoa32, 0, primob48, primo, primo_state, empty_init, "Microkey", "Primo B-48", MACHINE_SUPPORTS_SAVE )
COMP( 1984, primob64, primoa32, 0, primob64, primo, primo_state, empty_init, "Microkey", "Primo B-64", MACHINE_SUPPORTS_SAVE )
COMP( 1984, primoc64, primoa32, 0, primoc64, primo, primo_state, empty_init, "Microkey", "Primo C-64", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )

View File

@ -1,10 +1,5 @@
// license:BSD-3-Clause
// copyright-holders:Krzysztof Strzecha
/*****************************************************************************
*
* includes/primo.h
*
****************************************************************************/
#ifndef MAME_MICROKEY_PRIMO_H
#define MAME_MICROKEY_PRIMO_H
@ -39,8 +34,6 @@ public:
, m_vram(*this, "videoram")
{ }
void init_primo();
void primob32(machine_config &config);
void primob64(machine_config &config);
void primoa32(machine_config &config);
@ -49,15 +42,16 @@ public:
void primoc64(machine_config &config);
void primoa48(machine_config &config);
protected:
virtual void machine_reset() override ATTR_COLD;
virtual void machine_start() override ATTR_COLD;
private:
uint8_t be_1_r(offs_t offset);
uint8_t be_2_r();
void ki_1_w(uint8_t data);
void ki_2_w(uint8_t data);
void FD_w(uint8_t data);
void machine_reset() override ATTR_COLD;
void machine_start() override ATTR_COLD;
DECLARE_MACHINE_RESET(primob);
void fd_w(uint8_t data);
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void vblank_irq(int state);
void update_memory();
@ -89,9 +83,9 @@ private:
memory_region *m_cart1_rom = nullptr;
memory_region *m_cart2_rom = nullptr;
uint16_t m_video_memory_base = 0;
uint8_t m_port_FD = 0;
int m_nmi = 0;
uint16_t m_video_memory_base = 0x2800;
uint8_t m_port_fd = 0;
uint8_t m_nmi = 0;
};

View File

@ -2,8 +2,6 @@
// copyright-holders:Krzysztof Strzecha
/*******************************************************************************
primo.c
Functions to emulate general aspects of Microkey Primo computers
(RAM, ROM, interrupts, I/O ports)
@ -20,7 +18,6 @@
#include "screen.h"
/*******************************************************************************
Interrupt callback
@ -33,6 +30,7 @@ void primo_state::vblank_irq(int state)
m_maincpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
}
/*******************************************************************************
Memory banking
@ -42,7 +40,7 @@ void primo_state::vblank_irq(int state)
void primo_state::update_memory()
{
address_space& space = m_maincpu->space(AS_PROGRAM);
switch (m_port_FD & 0x03)
switch (m_port_fd & 0x03)
{
case 0x00: /* Original ROM */
space.unmap_write(0x0000, 0x3fff);
@ -61,9 +59,10 @@ void primo_state::update_memory()
membank("bank1")->set_base(m_cart1_rom->base());
break;
}
logerror ("Memory update: %02x\n", m_port_FD);
logerror("Memory update: %02x\n", m_port_fd);
}
/*******************************************************************************
IO read/write handlers
@ -121,7 +120,7 @@ uint8_t primo_state::be_2_r()
// bit 0 - joystic 1 (not implemeted yet)
logerror ("IOR BE-2 data:%02x\n", data);
logerror("IOR BE-2 data:%02x\n", data);
return data;
}
@ -181,29 +180,18 @@ void primo_state::ki_2_w(uint8_t data)
// bit 0 - not used
// logerror ("IOW KI-2 data:%02x\n", data);
//logerror("IOW KI-2 data:%02x\n", data);
}
void primo_state::FD_w(uint8_t data)
void primo_state::fd_w(uint8_t data)
{
if (!m_mem_exp_port->read())
{
m_port_FD = data;
m_port_fd = data;
update_memory();
}
}
/*******************************************************************************
Driver initialization
*******************************************************************************/
void primo_state::init_primo()
{
m_port_FD = 0x00;
m_video_memory_base = 0x2800;
}
/*******************************************************************************
@ -214,7 +202,7 @@ void primo_state::init_primo()
void primo_state::common_machine_init()
{
if (m_mem_exp_port->read())
m_port_FD = 0x00;
m_port_fd = 0x00;
update_memory();
m_maincpu->set_clock_scale(m_clock_port->read() ? 1.5 : 1.0);
}
@ -222,7 +210,7 @@ void primo_state::common_machine_init()
void primo_state::machine_start()
{
save_item(NAME(m_video_memory_base));
save_item(NAME(m_port_FD));
save_item(NAME(m_port_fd));
save_item(NAME(m_nmi));
std::string region_tag;
@ -235,13 +223,6 @@ void primo_state::machine_reset()
common_machine_init();
}
MACHINE_RESET_MEMBER(primo_state,primob)
{
common_machine_init();
//removed cbm_drive_0_config(SERIAL, 8);
//removed cbm_drive_1_config(SERIAL, 9);
}
/*******************************************************************************
@ -249,7 +230,7 @@ MACHINE_RESET_MEMBER(primo_state,primob)
*******************************************************************************/
void primo_state::setup_pss (uint8_t* snapshot_data, uint32_t snapshot_size)
void primo_state::setup_pss(uint8_t* snapshot_data, uint32_t snapshot_size)
{
/* Z80 registers */
m_maincpu->set_state_int(Z80_BC, snapshot_data[4] + snapshot_data[5]*256);
@ -267,7 +248,6 @@ void primo_state::setup_pss (uint8_t* snapshot_data, uint32_t snapshot_size)
m_maincpu->set_state_int(Z80_IX, snapshot_data[26] + snapshot_data[27]*256);
m_maincpu->set_state_int(Z80_IY, snapshot_data[28] + snapshot_data[29]*256);
/* IO ports */
// KI-1 bit 7 - NMI generator enable/disable
@ -296,13 +276,13 @@ SNAPSHOT_LOAD_MEMBER(primo_state::snapshot_cb)
return std::make_pair(std::error_condition(), std::string());
}
/*******************************************************************************
Quicload files (.pp)
*******************************************************************************/
void primo_state::setup_pp(uint8_t* quickload_data, uint32_t quickload_size)
{
u16 load_addr = quickload_data[0] + quickload_data[1]*256;
@ -313,7 +293,7 @@ void primo_state::setup_pp(uint8_t* quickload_data, uint32_t quickload_size)
m_maincpu->set_state_int(Z80_PC, start_addr);
logerror ("Quickload .pp l: %04x r: %04x s: %04x\n", load_addr, start_addr, quickload_size-4);
logerror("Quickload .pp l: %04x r: %04x s: %04x\n", load_addr, start_addr, quickload_size-4);
}
QUICKLOAD_LOAD_MEMBER(primo_state::quickload_cb)
@ -346,4 +326,3 @@ u32 primo_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, cons
}
return 0;
}