casio/cz230s.cpp: Added Casio CZ-230S and SZ-1. (#11969)

* cpu/upd7810: Added support for internal RAM.
* sound/upd934g.cpp: Corrected channel mapping for play sample command.
* video/mn1252.cpp: Added Panasonic MN1252 LCD controller emulation.
* casio/ra3.cpp: Added RA-5 8 KiB RAM cartridge.

New working systems
----------
Casio CZ-230S [BCM, =CO=Windler, Devin Acker]
Casio SZ-1 [BCM, Devin Acker]
This commit is contained in:
Devin Acker 2024-01-26 17:34:04 -05:00 committed by GitHub
parent d851eb3224
commit 8e9d6cc955
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
14 changed files with 1729 additions and 25 deletions

View File

@ -809,6 +809,18 @@ if (VIDEOS["MOS8563"]~=null) then
} }
end end
--------------------------------------------------
--
--@src/devices/video/mn1252.h,VIDEOS["MN1252"] = true
--------------------------------------------------
if (VIDEOS["MN1252"]~=null) then
files {
MAME_DIR .. "src/devices/video/mn1252.cpp",
MAME_DIR .. "src/devices/video/mn1252.h",
}
end
-------------------------------------------------- --------------------------------------------------
-- --
--@src/devices/video/pc_vga.h,VIDEOS["PC_VGA"] = true --@src/devices/video/pc_vga.h,VIDEOS["PC_VGA"] = true

View File

@ -389,7 +389,8 @@ void upd7810_device::upd_internal_128_ram_map(address_map &map)
void upd7810_device::upd_internal_256_ram_map(address_map &map) void upd7810_device::upd_internal_256_ram_map(address_map &map)
{ {
map(0xff00, 0xffff).ram(); map(0xff00, 0xffff).view(m_ram_view);
m_ram_view[0](0xff00, 0xffff).ram();
} }
void upd7810_device::upd_internal_4096_rom_128_ram_map(address_map &map) void upd7810_device::upd_internal_4096_rom_128_ram_map(address_map &map)
@ -401,7 +402,8 @@ void upd7810_device::upd_internal_4096_rom_128_ram_map(address_map &map)
void upd7810_device::upd_internal_4096_rom_256_ram_map(address_map &map) void upd7810_device::upd_internal_4096_rom_256_ram_map(address_map &map)
{ {
map(0x0000, 0x0fff).rom(); map(0x0000, 0x0fff).rom();
map(0xff00, 0xffff).ram(); map(0xff00, 0xffff).view(m_ram_view);
m_ram_view[0](0xff00, 0xffff).ram();
} }
upd7810_device::upd7810_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, address_map_constructor internal_map) upd7810_device::upd7810_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, address_map_constructor internal_map)
@ -424,6 +426,7 @@ upd7810_device::upd7810_device(const machine_config &mconfig, device_type type,
, m_pf_out_cb(*this) , m_pf_out_cb(*this)
, m_pt_in_cb(*this, 0) // TODO: uPD7807 only , m_pt_in_cb(*this, 0) // TODO: uPD7807 only
, m_program_config("program", ENDIANNESS_LITTLE, 8, 16, 0, internal_map) , m_program_config("program", ENDIANNESS_LITTLE, 8, 16, 0, internal_map)
, m_ram_view(*this, "ram_view")
, m_pa_pullups(0xff) , m_pa_pullups(0xff)
, m_pb_pullups(0xff) , m_pb_pullups(0xff)
, m_pc_pullups(0xff) , m_pc_pullups(0xff)

View File

@ -236,6 +236,7 @@ protected:
static const struct opcode_s s_opXX_78c06[256]; static const struct opcode_s s_opXX_78c06[256];
address_space_config m_program_config; address_space_config m_program_config;
memory_view m_ram_view;
PAIR m_ppc; /* previous program counter */ PAIR m_ppc; /* previous program counter */
PAIR m_pc; /* program counter */ PAIR m_pc; /* program counter */

View File

@ -1042,6 +1042,11 @@ void upd7810_device::MOV_TMM_A()
void upd7810_device::MOV_MM_A() void upd7810_device::MOV_MM_A()
{ {
MM = A; MM = A;
if (BIT(A, 3))
m_ram_view.select(0);
else
m_ram_view.disable();
} }
/* 4d d1: 0100 1101 1101 0001 */ /* 4d d1: 0100 1101 1101 0001 */

View File

@ -9,13 +9,14 @@
TODO: TODO:
- Correct MUTED and ACCENTED (currently just changes volume) - Correct MUTED and ACCENTED (currently just changes volume)
- T1 input - T1 input
- 8 channels?
***************************************************************************/ ***************************************************************************/
#include "emu.h" #include "emu.h"
#include "upd934g.h" #include "upd934g.h"
#define VERBOSE (0)
#include "logmacro.h"
//************************************************************************** //**************************************************************************
// DEVICE DEFINITIONS // DEVICE DEFINITIONS
@ -54,13 +55,9 @@ void upd934g_device::device_start()
// register for save states // register for save states
save_pointer(NAME(m_addr), 16); save_pointer(NAME(m_addr), 16);
for (unsigned i = 0; i < 4; i++) save_item(STRUCT_MEMBER(m_channel, pos));
{ save_item(STRUCT_MEMBER(m_channel, playing));
save_item(NAME(m_channel[i].pos), i); save_item(STRUCT_MEMBER(m_channel, effect));
save_item(NAME(m_channel[i].playing), i);
save_item(NAME(m_channel[i].volume), i);
save_item(NAME(m_channel[i].effect), i);
}
save_item(NAME(m_sample)); save_item(NAME(m_sample));
save_item(NAME(m_ready)); save_item(NAME(m_ready));
@ -93,13 +90,13 @@ void upd934g_device::sound_stream_update(sound_stream &stream, std::vector<read_
for (unsigned i = 0; i < outputs[ch].samples(); i++) for (unsigned i = 0; i < outputs[ch].samples(); i++)
{ {
int8_t raw = static_cast<int8_t>(read_byte(m_channel[ch].pos)); int16_t raw = static_cast<int8_t>(read_byte(m_channel[ch].pos)) * 4;
// normal, muted, accented // normal, muted, accented
const double adjust[] = { 0, 0.7, 0.4, 1.0 }; const double adjust[] = { 0, 0.7, 0.4, 1.0 };
raw *= adjust[m_channel[ch].effect]; raw *= adjust[m_channel[ch].effect];
outputs[ch].put_int(i, raw * (m_channel[ch].volume + 1), 32768 / 64); outputs[ch].put_int(i, raw, 32768 / 64);
if (++m_channel[ch].pos >= end) if (++m_channel[ch].pos >= end)
{ {
@ -127,24 +124,23 @@ void upd934g_device::write(offs_t offset, uint8_t data)
// format of data written here is: // format of data written here is:
// 76------ command // 76------ command
// --5432-- sample number // --5432-- sample number
// ------10 volume? // ------10 output channel
m_sample = (data >> 2) & 0x0f; m_sample = (data >> 2) & 0x0f;
switch (data >> 6) switch (data >> 6)
{ {
case 0: case 0:
logerror("CMD STORE ADDRESS sample %x\n", m_sample); LOG("CMD STORE ADDRESS sample %x\n", m_sample);
break; break;
case 1: case 1: // normal
case 2: case 2: // muted
case 3: case 3: // accented
logerror("CMD PLAY sample %x (channel %d, effect %d)\n", m_sample, m_sample >> 1, data >> 6);
if (m_sample < 8)
{ {
m_channel[m_sample >> 1].pos = m_addr[m_sample]; const u8 ch = (data & 3) ^ 2; // effective order seems to be "2, 3, 0, 1"
m_channel[m_sample >> 1].playing = m_sample; LOG("CMD PLAY sample %x (channel %d, effect %d)\n", m_sample, ch, data >> 6);
m_channel[m_sample >> 1].volume = data & 0x03; m_channel[ch].pos = m_addr[m_sample];
m_channel[m_sample >> 1].effect = data >> 6; m_channel[ch].playing = m_sample;
m_channel[ch].effect = data >> 6;
} }
break; break;
} }
@ -154,7 +150,7 @@ void upd934g_device::write(offs_t offset, uint8_t data)
break; break;
case 2: case 2:
m_addr[m_sample] = (m_addr[m_sample] & 0x00ff) | (data << 8); m_addr[m_sample] = (m_addr[m_sample] & 0x00ff) | (data << 8);
logerror(" sample %x address = %04x\n", m_sample, m_addr[m_sample]); LOG(" sample %x address = %04x\n", m_sample, m_addr[m_sample]);
break; break;
case 3: case 3:
m_ready = true; m_ready = true;

View File

@ -45,7 +45,6 @@ private:
{ {
uint16_t pos; uint16_t pos;
int playing; int playing;
int volume;
int effect; int effect;
} }
m_channel[4]; m_channel[4];

View File

@ -0,0 +1,103 @@
// license:BSD-3-Clause
// copyright-holders:Devin Acker
/***************************************************************************
Panasonic MN1252 LCD controller
***************************************************************************/
#include "emu.h"
#include "mn1252.h"
#include <cassert>
DEFINE_DEVICE_TYPE(MN1252, mn1252_device, "mn1252", "Panasonic MN1252 LCD controller")
const u8 mn1252_device::OUTPUT_DIGITS[0x40] =
{
// bit 0..7 = segment a..h (from datasheet)
0x00, 0x77, 0x7f, 0x39, 0x3f, 0x79, 0x71, 0x3d,
0x76, 0x06, 0x1e, 0xf0, 0x38, 0xb7, 0xb6, 0xbf,
0x73, 0xbf, 0xf3, 0x6d, 0x07, 0x3e, 0xa6, 0xbe,
0xf2, 0x6e, 0x5b, 0x48, 0x0f, 0x46, 0x49, 0x44,
0x00, 0x08, 0x10, 0x18, 0x20, 0x28, 0x30, 0x38,
0x7c, 0x58, 0x5e, 0x54, 0x5c, 0x40, 0x21, 0x0c,
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x01, 0x36, 0x5f, 0x7b, 0x74, 0x62
};
mn1252_device::mn1252_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, MN1252, tag, owner, clock)
{
}
/**************************************************************************/
void mn1252_device::device_start()
{
save_item(NAME(m_data));
save_item(NAME(m_first_nibble));
save_item(NAME(m_nibble_count));
save_item(NAME(m_ce));
save_item(NAME(m_std));
save_item(NAME(m_output));
}
/**************************************************************************/
void mn1252_device::device_reset()
{
m_data = m_first_nibble = 0;
m_nibble_count = 0;
m_ce = m_std = 0;
std::fill(std::begin(m_output), std::end(m_output), 0);
}
/**************************************************************************/
u16 mn1252_device::output(offs_t digit) const
{
assert(digit < 6);
return m_output[digit];
}
/**************************************************************************/
void mn1252_device::data_w(u8 data)
{
m_data = data & 0xf;
}
/**************************************************************************/
void mn1252_device::ce_w(int state)
{
if (!m_ce && state)
{
m_nibble_count = 0;
}
m_ce = state;
}
/**************************************************************************/
void mn1252_device::std_w(int state)
{
if (m_ce && m_std && !state && m_nibble_count < 12)
{
if (!(m_nibble_count % 2))
{
m_first_nibble = m_data;
}
else
{
const u8 data = (m_first_nibble << 4) | m_data;
u16 output = OUTPUT_DIGITS[data & 0x3f];
if (BIT(data, 6)) output |= 0x80; // segment h
if (BIT(data, 7)) output |= 0x100; // segment p
m_output[m_nibble_count / 2] = output;
}
m_nibble_count++;
}
m_std = state;
}

View File

@ -0,0 +1,42 @@
// license:BSD-3-Clause
// copyright-holders:Devin Acker
/***************************************************************************
Panasonic MN1252 LCD controller
***************************************************************************/
#ifndef MAME_VIDEO_MN1252_H
#define MAME_VIDEO_MN1252_H
#pragma once
class mn1252_device : public device_t
{
public:
mn1252_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
u16 output(offs_t digit) const;
void data_w(u8 data);
void ce_w(int state);
void std_w(int state);
protected:
virtual void device_start() override;
virtual void device_reset() override;
private:
static const u8 OUTPUT_DIGITS[0x40];
u8 m_data;
u8 m_first_nibble;
u8 m_nibble_count;
u8 m_ce, m_std;
u16 m_output[6];
};
DECLARE_DEVICE_TYPE(MN1252, mn1252_device)
#endif // MAME_VIDEO_MN1252_H

694
src/mame/casio/cz230s.cpp Normal file
View File

@ -0,0 +1,694 @@
// license: BSD-3-Clause
// copyright-holders: Devin Acker
/***************************************************************************
Casio CZ-230S digital synthesizer and SZ-1 MIDI sequencer
Misc. stuff:
Both of these devices have a way of loading and running external code.
- CZ-230S:
Hold "portamento speed", "value up", and "value down" together on boot. This will cause the
LCD to display "L-", as when loading from tape. At this point, the unit will try to load
$700 bytes over MIDI/serial to address $3800 and then jump to it.
- SZ-1:
While not recording or playing, pressing the Rest + Dot + Triplet buttons at the same time will
cause the firmware to check for a JMP instruction (54) at the first byte of cartridge memory
($e000), and execute it if there is one.
TODO: auto power off. Even after activating this, both units still continue executing as normal
(and the power switch itself is not connected to the CPU, unlike on the CZ-101/1000)
***************************************************************************/
#include "emu.h"
#include "ra3.h"
#include "bus/midi/midiinport.h"
#include "bus/midi/midioutport.h"
#include "cpu/upd7810/upd7811.h"
#include "imagedev/cassette.h"
#include "machine/clock.h"
#include "machine/nvram.h"
#include "sound/beep.h"
#include "sound/upd933.h"
#include "sound/upd934g.h"
#include "video/mn1252.h"
#include "screen.h"
#include "speaker.h"
#include "cz230s.lh"
#include "sz1.lh"
namespace {
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
class cz230s_state : public driver_device
{
public:
cz230s_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_lcdc(*this, "lcdc"),
m_cassette(*this, "cassette"),
m_pd(*this, "pd"),
m_pcm(*this, "pcm"),
m_keys(*this, "KC%u", 0U),
m_lcd_seg(*this, "%u.%u", 0U, 0U),
m_led(*this, "led%u.%u", 0U, 0U),
m_rhythm(*this, "rhythm_pos"),
m_mode(*this, "mode_pos")
{ }
void config_base(machine_config &config, u16 screen_w, u16 screen_h, bool midi_thru = true);
void cz230s(machine_config &config);
void sz1(machine_config &config);
void keys_w(int state) { m_key_sel = state; }
void keys_mux_w(int state) { m_key_mux = state; }
template <int Row> DECLARE_CUSTOM_INPUT_MEMBER(keys_row_r);
template <int Row> u8 keys_analog_r();
DECLARE_INPUT_CHANGED_MEMBER(rhythm_w);
template <int Bit> DECLARE_CUSTOM_INPUT_MEMBER(rhythm_r) { return m_rhythm >> Bit; }
DECLARE_INPUT_CHANGED_MEMBER(mode_w);
DECLARE_CUSTOM_INPUT_MEMBER(mode_r) { return m_mode; }
void cassette_w(int state);
void cassette_motor_w(int state);
DECLARE_CUSTOM_INPUT_MEMBER(cassette_r);
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
private:
void cz230s_map(address_map &map);
void cz230s_pcm_map(address_map &map);
void sz1_map(address_map &map);
void pcm_w(offs_t offset, u8 data);
template <int Num> void led_w(u8 data);
void port_a_w(u8 data);
u8 keys_r();
void render_w(int state);
required_device<upd7811_device> m_maincpu;
required_device<mn1252_device> m_lcdc;
required_device<cassette_image_device> m_cassette;
optional_device<upd933_device> m_pd;
optional_device<upd934g_device> m_pcm;
optional_ioport_array<12> m_keys;
output_finder<6, 9> m_lcd_seg;
output_finder<2, 8> m_led;
output_finder<> m_rhythm;
output_finder<> m_mode;
u8 m_port_a;
u8 m_key_sel;
u8 m_key_mux;
u8 m_midi_rx;
};
//**************************************************************************
// ADDRESS MAPS
//**************************************************************************
void cz230s_state::cz230s_map(address_map &map)
{
map.unmap_value_high();
// map(0x0000, 0x0fff).rom(); - internal
map(0x1000, 0x1fff).w(FUNC(cz230s_state::pcm_w));
map(0x2000, 0x3fff).ram().share("nvram");
map(0x4000, 0x7fff).rw(m_pd, FUNC(upd933_device::read), FUNC(upd933_device::write));
map(0x8000, 0xffff).rom().region("program", 0);
}
/**************************************************************************/
void cz230s_state::cz230s_pcm_map(address_map &map)
{
map(0x0000, 0x7fff).rom();
}
/**************************************************************************/
void cz230s_state::sz1_map(address_map &map)
{
map.unmap_value_high();
// map(0x0000, 0x0fff).rom(); - internal
map(0x4000, 0x7fff).rom().region("program", 0);
map(0x8000, 0x9fff).mirror(0x2000).ram().share("nvram");
map(0xc000, 0xcfff).w(FUNC(cz230s_state::led_w<0>));
map(0xd000, 0xdfff).w(FUNC(cz230s_state::led_w<1>));
map(0xe000, 0xffff).rw("cart", FUNC(casio_ram_cart_device::read), FUNC(casio_ram_cart_device::write));
}
//**************************************************************************
// INPUT PORT DEFINITIONS
//**************************************************************************
static INPUT_PORTS_START( cz230s )
PORT_START("KC0")
PORT_BIT(0x001, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("C2")
PORT_BIT(0x002, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("C#2")
PORT_BIT(0x004, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("D2")
PORT_BIT(0x008, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("D#2")
PORT_BIT(0x010, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("E2")
PORT_BIT(0x020, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("F2")
PORT_BIT(0x1c0, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x200, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("Solo / Insert")
PORT_BIT(0x400, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("Portamento On/Off")
PORT_BIT(0x800, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("Bend Range / Check")
PORT_START("KC1")
PORT_BIT(0x001, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("F#2")
PORT_BIT(0x002, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("G2")
PORT_BIT(0x004, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("G#2")
PORT_BIT(0x008, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("A2")
PORT_BIT(0x010, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("A#2")
PORT_BIT(0x020, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("B2")
PORT_BIT(0x040, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_NAME("Rhythm 1")
PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_NAME("Rhythm 2")
PORT_BIT(0x100, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_NAME("Rhythm 3")
PORT_BIT(0x200, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_NAME("Rhythm 4")
PORT_BIT(0x400, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_NAME("Rhythm 5")
PORT_BIT(0x800, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_NAME("Preset 1")
PORT_START("KC2")
PORT_BIT(0x001, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("C3")
PORT_BIT(0x002, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("C#3")
PORT_BIT(0x004, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("D3")
PORT_BIT(0x008, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("D#3")
PORT_BIT(0x010, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("E3")
PORT_BIT(0x020, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("F3")
PORT_BIT(0x040, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_NAME("Rhythm 6")
PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_NAME("Rhythm 7")
PORT_BIT(0x100, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_NAME("Rhythm 8")
PORT_BIT(0x200, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_9) PORT_NAME("Rhythm 9")
PORT_BIT(0x400, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_0) PORT_NAME("Rhythm 10")
PORT_BIT(0x800, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_NAME("Preset 2")
PORT_START("KC3")
PORT_BIT(0x001, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("F#3")
PORT_BIT(0x002, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("G3")
PORT_BIT(0x004, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("G#3")
PORT_BIT(0x008, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("A3")
PORT_BIT(0x010, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("A#3")
PORT_BIT(0x020, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("B3")
PORT_BIT(0x040, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_J) PORT_NAME("Program")
PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_NAME("Intro / Fill In")
PORT_BIT(0x100, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_LEFT) PORT_NAME("Tempo Down")
PORT_BIT(0x200, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_RIGHT) PORT_NAME("Tempo Up")
PORT_BIT(0x400, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("Start / Stop / Record")
PORT_BIT(0x800, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_D) PORT_NAME("Synchro / Clear")
PORT_START("KC4")
PORT_BIT(0x001, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("C4")
PORT_BIT(0x002, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("C#4")
PORT_BIT(0x004, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("D4")
PORT_BIT(0x008, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("D#4")
PORT_BIT(0x010, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("E4")
PORT_BIT(0x020, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("F4")
PORT_BIT(0xfc0, IP_ACTIVE_LOW, IPT_CUSTOM) PORT_CUSTOM_MEMBER(cz230s_state, rhythm_r<0>)
PORT_START("KC5")
PORT_BIT(0x001, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("F#4")
PORT_BIT(0x002, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("G4")
PORT_BIT(0x004, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("G#4")
PORT_BIT(0x008, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("A4")
PORT_BIT(0x010, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("A#4")
PORT_BIT(0x020, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("B4")
PORT_BIT(0xfc0, IP_ACTIVE_LOW, IPT_CUSTOM) PORT_CUSTOM_MEMBER(cz230s_state, rhythm_r<6>)
PORT_START("KC6")
PORT_BIT(0x001, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("C5")
PORT_BIT(0x002, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("C#5")
PORT_BIT(0x004, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("D5")
PORT_BIT(0x008, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("D#5")
PORT_BIT(0x010, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("E5")
PORT_BIT(0x020, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("F5")
PORT_BIT(0x3c0, IP_ACTIVE_LOW, IPT_CUSTOM) PORT_CUSTOM_MEMBER(cz230s_state, rhythm_r<12>)
PORT_BIT(0xc00, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_START("KC7")
PORT_BIT(0x001, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("F#5")
PORT_BIT(0x002, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("G5")
PORT_BIT(0x004, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("G#5")
PORT_BIT(0x008, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("A5")
PORT_BIT(0x010, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("A#5")
PORT_BIT(0x020, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("B5")
PORT_BIT(0x7c0, IP_ACTIVE_LOW, IPT_CUSTOM) PORT_CUSTOM_MEMBER(cz230s_state, mode_r)
PORT_BIT(0x800, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_START("KC8")
PORT_BIT(0x001, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("C6")
PORT_BIT(0x03e, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x040, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_Y) PORT_NAME("MT")
PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("MIDI Channel")
PORT_BIT(0x100, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("Portamento Speed")
PORT_BIT(0x200, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("Transpose")
PORT_BIT(0x400, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_DOWN) PORT_NAME("Value Down / Save")
PORT_BIT(0x800, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_UP) PORT_NAME("Value Up / Load")
PORT_START("KC9")
PORT_BIT(0x03f, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x040, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Tone 4")
PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Tone 5")
PORT_BIT(0x100, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("Tone 6")
PORT_BIT(0x200, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("Tone 7")
PORT_BIT(0x400, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("Tone 8")
PORT_BIT(0x800, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("Tone 9")
PORT_START("KC10")
PORT_BIT(0x03f, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x040, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("Tone 0")
PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Tone 1")
PORT_BIT(0x100, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Tone 2")
PORT_BIT(0x200, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Tone 3")
PORT_BIT(0x400, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME("Cancel")
PORT_BIT(0x800, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_START("KC11")
PORT_BIT(0x03f, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x040, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("Tune Down")
PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("Tune Up")
PORT_BIT(0x100, 0x000, IPT_OTHER ) PORT_TOGGLE PORT_NAME("MIDI Clock")
PORT_DIPSETTING(0x100, "External")
PORT_DIPSETTING(0x000, "Internal")
PORT_BIT(0x200, 0x000, IPT_OTHER ) PORT_TOGGLE PORT_NAME("MIDI")
PORT_DIPSETTING(0x200, DEF_STR(Off)) // this should be on by default
PORT_DIPSETTING(0x000, DEF_STR(On))
PORT_BIT(0x400, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x800, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_TOGGLE PORT_NAME("Auto Power Off")
PORT_START("RHYTHM")
PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Rhythm Sound (BD)") PORT_CHANGED_MEMBER(DEVICE_SELF, cz230s_state, rhythm_w, 0x0001)
PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Rhythm Sound (SD)") PORT_CHANGED_MEMBER(DEVICE_SELF, cz230s_state, rhythm_w, 0x0002)
PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Rhythm Sound (LT)") PORT_CHANGED_MEMBER(DEVICE_SELF, cz230s_state, rhythm_w, 0x0004)
PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Rhythm Sound (HT)") PORT_CHANGED_MEMBER(DEVICE_SELF, cz230s_state, rhythm_w, 0x0008)
PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Rhythm Sound (LB)") PORT_CHANGED_MEMBER(DEVICE_SELF, cz230s_state, rhythm_w, 0x0010)
PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Rhythm Sound (HB)") PORT_CHANGED_MEMBER(DEVICE_SELF, cz230s_state, rhythm_w, 0x0020)
PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Rhythm Sound (CH)") PORT_CHANGED_MEMBER(DEVICE_SELF, cz230s_state, rhythm_w, 0x0040)
PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Rhythm Sound (Rim)") PORT_CHANGED_MEMBER(DEVICE_SELF, cz230s_state, rhythm_w, 0x0080)
PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Rhythm Sound (OH)") PORT_CHANGED_MEMBER(DEVICE_SELF, cz230s_state, rhythm_w, 0x0100)
PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Rhythm Sound (CB)") PORT_CHANGED_MEMBER(DEVICE_SELF, cz230s_state, rhythm_w, 0x0200)
PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Rhythm Sound (Ride)") PORT_CHANGED_MEMBER(DEVICE_SELF, cz230s_state, rhythm_w, 0x0400)
PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Rhythm Sound (Claps)") PORT_CHANGED_MEMBER(DEVICE_SELF, cz230s_state, rhythm_w, 0x0800)
PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Rhythm Sound (PD 1)") PORT_CHANGED_MEMBER(DEVICE_SELF, cz230s_state, rhythm_w, 0x1000)
PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Rhythm Sound (PD 2)") PORT_CHANGED_MEMBER(DEVICE_SELF, cz230s_state, rhythm_w, 0x2000)
PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Rhythm Sound (PD 3)") PORT_CHANGED_MEMBER(DEVICE_SELF, cz230s_state, rhythm_w, 0x4000)
PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Rhythm Sound (PD 4)") PORT_CHANGED_MEMBER(DEVICE_SELF, cz230s_state, rhythm_w, 0x8000)
PORT_START("MODE")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Mode (Pattern Play)") PORT_CHANGED_MEMBER(DEVICE_SELF, cz230s_state, mode_w, 0x01)
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Mode (Pattern Memory 4/4)") PORT_CHANGED_MEMBER(DEVICE_SELF, cz230s_state, mode_w, 0x02)
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Mode (Pattern Memory 3/4)") PORT_CHANGED_MEMBER(DEVICE_SELF, cz230s_state, mode_w, 0x04)
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Mode (Song Play)") PORT_CHANGED_MEMBER(DEVICE_SELF, cz230s_state, mode_w, 0x08)
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Mode (Song Memory)") PORT_CHANGED_MEMBER(DEVICE_SELF, cz230s_state, mode_w, 0x10)
PORT_START("PB")
PORT_BIT(0x0f, IP_ACTIVE_HIGH, IPT_OUTPUT) PORT_WRITE_LINE_MEMBER(cz230s_state, keys_w)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_CUSTOM) PORT_READ_LINE_DEVICE_MEMBER("pd", upd933_device, rq_r)
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_OUTPUT) PORT_WRITE_LINE_DEVICE_MEMBER("pd", upd933_device, cs_w)
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_OUTPUT) // TODO: auto power off
PORT_START("PC")
PORT_BIT(0x07, IP_ACTIVE_HIGH, IPT_UNUSED) // MIDI in/out/clock
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_CUSTOM) PORT_CUSTOM_MEMBER(cz230s_state, cassette_r)
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_OUTPUT) PORT_WRITE_LINE_MEMBER(cz230s_state, cassette_w)
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_OUTPUT) PORT_WRITE_LINE_MEMBER(cz230s_state, cassette_motor_w)
PORT_BIT(0xc0, IP_ACTIVE_LOW, IPT_OUTPUT) PORT_WRITE_LINE_MEMBER(cz230s_state, keys_mux_w)
PORT_START("AN1")
PORT_BIT(0xff, 0x7f, IPT_PADDLE) PORT_NAME("Pitch Wheel") PORT_SENSITIVITY(100) PORT_KEYDELTA(10) PORT_CODE_DEC(JOYCODE_Y_DOWN_SWITCH) PORT_CODE_INC(JOYCODE_Y_UP_SWITCH)
PORT_START("AN2")
PORT_CONFNAME(0xff, 0xff, "Battery Level")
PORT_CONFSETTING( 0x00, "Low")
PORT_CONFSETTING( 0xff, "Normal")
PORT_START("AN3")
PORT_BIT(0xff, 0xff, IPT_POSITIONAL_H) PORT_NAME("PD Rhythm Volume") PORT_REVERSE PORT_SENSITIVITY(100) PORT_KEYDELTA(10) PORT_CENTERDELTA(0) PORT_CODE_DEC(JOYCODE_X_LEFT_SWITCH) PORT_CODE_INC(JOYCODE_X_RIGHT_SWITCH)
INPUT_PORTS_END
static INPUT_PORTS_START( sz1 )
PORT_START("KC0")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("Rest")
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Dot")
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Triplet")
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Tie")
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_LEFT) PORT_NAME("Reverse / Save")
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_RIGHT) PORT_NAME("Forward / Load")
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_Z) PORT_NAME("Play / Check")
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_X) PORT_NAME("Stop")
PORT_START("KC1")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("8th Note")
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("16th Note")
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("32nd Note")
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_DOWN ) PORT_NAME("Tempo Down")
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("Real Time")
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("Manual")
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_D) PORT_NAME("Record")
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_NAME("Reset")
PORT_START("KC2")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("Quarter Note")
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("Half Note")
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("Whole Note")
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_UP) PORT_NAME("Tempo Up")
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_NAME("Track 1")
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_NAME("Track 2")
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_NAME("Track 3")
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_NAME("Track 4")
PORT_START("KC3")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("Copy")
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_INSERT) PORT_NAME("Insert")
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("Delete")
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER) PORT_NAME("Metronome / Enter")
PORT_BIT(0xf0, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_START("KC4")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("Repeat")
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("MIDI")
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_TOGGLE PORT_NAME("Auto Power Off")
PORT_BIT(0x20, 0x00, IPT_OTHER ) PORT_TOGGLE PORT_NAME("MIDI Clock")
PORT_DIPSETTING(0x20, "External")
PORT_DIPSETTING(0x00, "Internal")
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_OTHER ) PORT_TOGGLE PORT_NAME("Touch Data")
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("Cartridge / MT")
PORT_START("PA")
PORT_BIT(0x0f, IP_ACTIVE_HIGH, IPT_OUTPUT) PORT_WRITE_LINE_DEVICE_MEMBER("lcdc", mn1252_device, data_w)
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_OUTPUT) PORT_WRITE_LINE_DEVICE_MEMBER("lcdc", mn1252_device, ce_w)
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_OUTPUT) PORT_WRITE_LINE_DEVICE_MEMBER("lcdc", mn1252_device, std_w)
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_CUSTOM) PORT_CUSTOM_MEMBER(cz230s_state, keys_row_r<7>)
PORT_START("PB")
PORT_BIT(0x1f, IP_ACTIVE_LOW, IPT_OUTPUT) PORT_WRITE_LINE_MEMBER(cz230s_state, keys_w)
PORT_BIT(0x60, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_OUTPUT) // TODO: auto power off
PORT_START("PC")
PORT_BIT(0x07, IP_ACTIVE_HIGH, IPT_UNUSED) // MIDI in/out/clock
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_CUSTOM) PORT_CUSTOM_MEMBER(cz230s_state, cassette_r)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OUTPUT) PORT_WRITE_LINE_DEVICE_MEMBER("beep", beep_device, set_state)
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_OUTPUT) PORT_WRITE_LINE_MEMBER(cz230s_state, cassette_motor_w)
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_OUTPUT) PORT_WRITE_LINE_MEMBER(cz230s_state, cassette_w)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Foot Switch")
INPUT_PORTS_END
//**************************************************************************
// MACHINE EMULATION
//**************************************************************************
void cz230s_state::machine_start()
{
m_lcd_seg.resolve();
m_led.resolve();
m_rhythm.resolve();
m_mode.resolve();
m_rhythm = 1;
m_mode = 1;
m_port_a = 0;
save_item(NAME(m_port_a));
save_item(NAME(m_key_sel));
save_item(NAME(m_key_mux));
save_item(NAME(m_midi_rx));
}
/**************************************************************************/
void cz230s_state::machine_reset()
{
m_key_sel = m_key_mux = 0;
m_midi_rx = 1;
}
/**************************************************************************/
void cz230s_state::pcm_w(offs_t offset, u8 data)
{
data = (BIT(offset, 0, 6) << 2) | BIT(offset, 8, 2);
m_pcm->write(offset >> 10, data);
}
/**************************************************************************/
template <int Num>
void cz230s_state::led_w(u8 data)
{
for (int i = 0; i < 8; i++)
m_led[Num][i] = BIT(data, i);
}
/**************************************************************************/
void cz230s_state::port_a_w(u8 data)
{
m_lcdc->data_w(data & 0xf);
m_lcdc->std_w(BIT(data, 5));
m_lcdc->ce_w(BIT(data, 6));
if (BIT(data, 7) && !BIT(m_port_a, 7))
led_w<0>(~data & 0x3f);
m_port_a = data;
}
/**************************************************************************/
u8 cz230s_state::keys_r()
{
u8 data = 0x3f;
if (m_key_sel < m_keys.size())
{
const u16 input = m_keys[m_key_sel].read_safe(0xfff);
if (BIT(m_key_mux, 0))
data &= (input & 0x3f);
if (BIT(m_key_mux, 1))
data &= (input >> 6);
}
return data;
}
/**************************************************************************/
template <int Row>
CUSTOM_INPUT_MEMBER(cz230s_state::keys_row_r)
{
u8 data = 0xff;
for (int i = 0; i < 5; i++)
if (BIT(m_key_sel, i))
data &= m_keys[i].read_safe(0xff);
return BIT(data, Row);
}
/**************************************************************************/
template <int Row>
u8 cz230s_state::keys_analog_r()
{
return keys_row_r<Row>() ? 0xff : 0x00;
}
/**************************************************************************/
INPUT_CHANGED_MEMBER(cz230s_state::rhythm_w)
{
if (!oldval && newval)
m_rhythm = param;
}
/**************************************************************************/
INPUT_CHANGED_MEMBER(cz230s_state::mode_w)
{
if (!oldval && newval)
m_mode = param;
}
/**************************************************************************/
void cz230s_state::cassette_w(int state)
{
m_cassette->output(state ? -1.0 : 1.0);
}
/**************************************************************************/
void cz230s_state::cassette_motor_w(int state)
{
m_cassette->change_state(state ? CASSETTE_MOTOR_ENABLED : CASSETTE_MOTOR_DISABLED, CASSETTE_MASK_MOTOR);
}
/**************************************************************************/
CUSTOM_INPUT_MEMBER(cz230s_state::cassette_r)
{
return m_cassette->input() > 0 ? 0 : 1;
}
/**************************************************************************/
void cz230s_state::render_w(int state)
{
if (!state)
return;
for (int digit = 0; digit < 6; digit++)
{
const u16 data = m_lcdc->output(digit);
for (int seg = 0; seg < 9; seg++)
m_lcd_seg[digit][seg] = BIT(data, seg);
}
}
//**************************************************************************
// MACHINE DEFINTIONS
//**************************************************************************
void cz230s_state::config_base(machine_config &config, u16 screen_w, u16 screen_h, bool midi_thru)
{
UPD7811(config, m_maincpu, 10_MHz_XTAL);
CLOCK(config, "midi_clock", 2_MHz_XTAL).signal_handler().set(m_maincpu, FUNC(upd7810_device::sck_w));
midi_port_device &mdin(MIDI_PORT(config, "mdin", midiin_slot, "midiin"));
mdin.rxd_handler().set([this](int state) { m_midi_rx = state; });
m_maincpu->rxd_func().set([this]() { return m_midi_rx; });
MIDI_PORT(config, "mdout", midiout_slot, "midiout");
m_maincpu->txd_func().set("mdout", FUNC(midi_port_device::write_txd));
if (midi_thru)
{
MIDI_PORT(config, "mdthru", midiout_slot, "midiout");
mdin.rxd_handler().append("mdthru", FUNC(midi_port_device::write_txd));
}
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
MN1252(config, m_lcdc);
auto &screen = SCREEN(config, "screen", SCREEN_TYPE_SVG);
screen.set_refresh_hz(60);
screen.set_size(screen_w, screen_h);
screen.set_visarea_full();
screen.screen_vblank().set(FUNC(cz230s_state::render_w));
SPEAKER(config, "speaker").front_center();
CASSETTE(config, m_cassette);
m_cassette->set_default_state(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED);
m_cassette->add_route(ALL_OUTPUTS, "speaker", 0.05);
}
/**************************************************************************/
void cz230s_state::cz230s(machine_config &config)
{
config_base(config, 975, 205);
m_maincpu->set_addrmap(AS_PROGRAM, &cz230s_state::cz230s_map);
m_maincpu->pa_in_cb().set(FUNC(cz230s_state::keys_r));
m_maincpu->pa_out_cb().set(FUNC(cz230s_state::port_a_w));
m_maincpu->pb_in_cb().set_ioport("PB");
m_maincpu->pb_out_cb().set_ioport("PB");
m_maincpu->pc_in_cb().set_ioport("PC");
m_maincpu->pc_out_cb().set_ioport("PC");
m_maincpu->an1_func().set_ioport("AN1");
m_maincpu->an2_func().set_ioport("AN2");
m_maincpu->an3_func().set_ioport("AN3");
UPD933(config, m_pd, 8.96_MHz_XTAL / 2);
m_pd->irq_cb().set_inputline(m_maincpu, UPD7810_INTF1);
m_pd->add_route(0, "speaker", 1.0);
UPD934G(config, m_pcm, 1'280'000);
m_pcm->set_addrmap(0, &cz230s_state::cz230s_pcm_map);
m_pcm->add_route(ALL_OUTPUTS, "speaker", 0.5);
config.set_default_layout(layout_cz230s);
}
/**************************************************************************/
void cz230s_state::sz1(machine_config &config)
{
config_base(config, 938, 205, false);
m_maincpu->set_addrmap(AS_PROGRAM, &cz230s_state::sz1_map);
m_maincpu->pa_in_cb().set_ioport("PA");
m_maincpu->pa_out_cb().set_ioport("PA");
m_maincpu->pb_out_cb().set_ioport("PB");
m_maincpu->pc_in_cb().set_ioport("PC");
m_maincpu->pc_out_cb().set_ioport("PC");
m_maincpu->an0_func().set(FUNC(cz230s_state::keys_analog_r<0>));
m_maincpu->an1_func().set(FUNC(cz230s_state::keys_analog_r<1>));
m_maincpu->an2_func().set(FUNC(cz230s_state::keys_analog_r<2>));
m_maincpu->an3_func().set(FUNC(cz230s_state::keys_analog_r<3>));
m_maincpu->an4_func().set(FUNC(cz230s_state::keys_analog_r<4>));
m_maincpu->an5_func().set(FUNC(cz230s_state::keys_analog_r<5>));
m_maincpu->an6_func().set(FUNC(cz230s_state::keys_analog_r<6>));
CASIO_RA5(config, "cart");
BEEP(config, "beep", 2000).add_route(ALL_OUTPUTS, "speaker", 0.5); // TODO: verify freq
config.set_default_layout(layout_sz1);
}
//**************************************************************************
// ROM DEFINITIONS
//**************************************************************************
ROM_START( cz230s )
ROM_REGION(0x1000, "maincpu", 0)
ROM_LOAD("upd7811g-301.bin", 0x0000, 0x1000, CRC(506b008c) SHA1(2d91d817bd0fa4688591160e53cbc6e14acd7014))
ROM_REGION(0x8000, "program", 0)
ROM_LOAD("hn613256pda4.bin", 0x0000, 0x8000, CRC(f58758ec) SHA1(11e5c95e51e1c77c89682ea3db85b9457f8b6cf6))
ROM_REGION(0x8000, "pcm", 0)
ROM_LOAD("hn613256pct1.bin", 0x0000, 0x8000, CRC(97b9805b) SHA1(f3502a26b6a9bccb60bea11ae940619ab9960e05))
ROM_REGION(0x2000, "nvram", 0)
ROM_LOAD("init_ram.bin", 0x0000, 0x2000, CRC(eb756425) SHA1(3a21b45269a00d27d5943de50825edc329062c60))
ROM_REGION(0x7bb5, "screen", 0)
ROM_LOAD("cz230s.svg", 0x0000, 0x7bb5, CRC(e35cc3d3) SHA1(36cb369414f1e65843cd0ea318ad27f536b582be))
ROM_END
ROM_START( sz1 )
ROM_REGION(0x1000, "maincpu", 0)
ROM_LOAD("upd7811g-120.bin", 0x0000, 0x1000, CRC(597ac04a) SHA1(96451a764296eaa22aaad3cba121226dcba865f4))
ROM_REGION(0x4000, "program", 0)
ROM_LOAD("program.bin", 0x0000, 0x4000, CRC(15f83fa5) SHA1(cb0d8d8390266f247dc7718b95bc658d1719d105))
ROM_REGION(0x6437, "screen", 0)
ROM_LOAD("sz1.svg", 0x0000, 0x6437, CRC(fd14625b) SHA1(069790868b382725d309fcab0148147f76ff82cc))
ROM_END
} // anonymous namespace
//**************************************************************************
// SYSTEM DRIVERS
//**************************************************************************
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
SYST( 1985, cz230s, 0, 0, cz230s, cz230s, cz230s_state, empty_init, "Casio", "CZ-230S", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
SYST( 1985, sz1, 0, 0, sz1, sz1, cz230s_state, empty_init, "Casio", "SZ-1", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )

View File

@ -13,6 +13,7 @@
// device type definition // device type definition
DEFINE_DEVICE_TYPE(CASIO_RA3, casio_ra3_device, "casio_ra3", "Casio RA-3 RAM cartridge") DEFINE_DEVICE_TYPE(CASIO_RA3, casio_ra3_device, "casio_ra3", "Casio RA-3 RAM cartridge")
DEFINE_DEVICE_TYPE(CASIO_RA5, casio_ra5_device, "casio_ra5", "Casio RA-5 RAM cartridge")
DEFINE_DEVICE_TYPE(CASIO_RA6, casio_ra6_device, "casio_ra6", "Casio RA-6 RAM cartridge") DEFINE_DEVICE_TYPE(CASIO_RA6, casio_ra6_device, "casio_ra6", "Casio RA-6 RAM cartridge")
/**************************************************************************/ /**************************************************************************/
@ -34,6 +35,12 @@ casio_ra3_device::casio_ra3_device(const machine_config &mconfig, const char *ta
{ {
} }
/**************************************************************************/
casio_ra5_device::casio_ra5_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: casio_ram_cart_device(mconfig, CASIO_RA5, tag, owner, clock, 0x2000)
{
}
/**************************************************************************/ /**************************************************************************/
casio_ra6_device::casio_ra6_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) casio_ra6_device::casio_ra6_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: casio_ram_cart_device(mconfig, CASIO_RA6, tag, owner, clock, 0x4000) : casio_ram_cart_device(mconfig, CASIO_RA6, tag, owner, clock, 0x4000)

View File

@ -47,6 +47,12 @@ public:
casio_ra3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); casio_ra3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
}; };
class casio_ra5_device : public casio_ram_cart_device
{
public:
casio_ra5_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
};
class casio_ra6_device : public casio_ram_cart_device class casio_ra6_device : public casio_ram_cart_device
{ {
public: public:
@ -55,6 +61,7 @@ public:
// device type definition // device type definition
DECLARE_DEVICE_TYPE(CASIO_RA3, casio_ra3_device) DECLARE_DEVICE_TYPE(CASIO_RA3, casio_ra3_device)
DECLARE_DEVICE_TYPE(CASIO_RA5, casio_ra5_device)
DECLARE_DEVICE_TYPE(CASIO_RA6, casio_ra6_device) DECLARE_DEVICE_TYPE(CASIO_RA6, casio_ra6_device)
#endif // MAME_CASIO_RA3_H #endif // MAME_CASIO_RA3_H

601
src/mame/layout/cz230s.lay Normal file
View File

@ -0,0 +1,601 @@
<?xml version="1.0"?>
<!--
license:CC0-1.0
-->
<mamelayout version="2">
<element name="bg"><rect><color red="0.06" green="0.06" blue="0.06" /></rect></element>
<element name="black"><rect><color red="0" green="0" blue="0" /></rect></element>
<element name="grey"><rect><color red="0.04" green="0.04" blue="0.04" /></rect></element>
<element name="white"><rect><color red="1" green="1" blue="1" /></rect></element>
<!-- text elements -->
<element name="num1"><text string="1" /></element>
<element name="num2"><text string="2" /></element>
<element name="num3"><text string="3" /></element>
<element name="num4"><text string="4" /></element>
<element name="solo">
<text string="SOLO"><color red="1" green="0.9" blue="0.4" /></text>
</element>
<element name="insert"><text string="(INSERT)" /></element>
<element name="portamento1">
<text string="PORTAMENTO"><color red="1" green="0.9" blue="0.4" /></text>
</element>
<element name="on_off"><text string="ON/OFF" /></element>
<element name="rhythm">
<text string="RHYTHM"><color red="1" green="0.9" blue="0.4" /></text>
</element>
<element name="tempo"><text string="TEMPO" /></element>
<element name="arrow_up"><text string="&#x25b2;" /></element>
<element name="arrow_down"><text string="&#x25bc;" /></element>
<element name="start"><text string="START" /></element>
<element name="stop"><text string="/STOP" /></element>
<element name="record"><text string="(RECORD)" /></element>
<element name="synchro"><text string="SYNCHRO" /></element>
<element name="clear"><text string="(CLEAR)" /></element>
<element name="intro"><text string="INTRO./FILL-IN" /></element>
<element name="bar"><text string="(1/2/FILL-IN BAR)" /></element>
<element name="preset"><text string="PRESET" /></element>
<element name="program"><text string="PROGRAM" /></element>
<element name="rhythm_sound">
<text string="RHYTHM SOUND SOURCE"><color red="1" green="0.9" blue="0.4" /></text>
</element>
<element name="bd"><text string="BD" /></element>
<element name="sd"><text string="SD" /></element>
<element name="lt"><text string="LT" /></element>
<element name="ht"><text string="HT" /></element>
<element name="lb"><text string="LB" /></element>
<element name="hb"><text string="HB" /></element>
<element name="ch"><text string="CH" /></element>
<element name="rim"><text string="RIM" /></element>
<element name="oh"><text string="OH" /></element>
<element name="cb"><text string="CB" /></element>
<element name="ride"><text string="RIDE" /></element>
<element name="claps"><text string="CLAPS" /></element>
<element name="pd"><text string="PD" /></element>
<element name="rhythm_mode">
<text string="RHYTHM MODE"><color red="1" green="0.9" blue="0.4" /></text>
</element>
<element name="pattern"><text string="PATTERN" /></element>
<element name="song"><text string="SONG" /></element>
<element name="play1">
<rect><color red="1" green="1" blue="1" /></rect>
<text string="PLAY" align="1"><color red="0.04" green="0.04" blue="0.04" /></text>
</element>
<element name="play2">
<rect><color red="0.04" green="0.04" blue="0.04" /></rect>
<text string="PLAY" align="2" />
</element>
<element name="memory1">
<rect><color red="0.04" green="0.04" blue="0.04" /></rect>
<text string="MEMORY" align="1" />
</element>
<element name="memory2">
<rect><color red="0.04" green="0.04" blue="0.04" /></rect>
<text string="MEMORY" align="2" />
</element>
<element name="mem34"><text string="3/4" /></element>
<element name="mem44"><text string="4/4" /></element>
<element name="data_entry">
<text string="DATA ENTRY"><color red="1" green="0.9" blue="0.4" /></text>
</element>
<element name="value"><text string="VALUE" /></element>
<element name="save"><text string="(SAVE)" /></element>
<element name="load"><text string="(LOAD)" /></element>
<element name="midi"><text string="MIDI CH" /></element>
<element name="transpose"><text string="TRANSPOSE" /></element>
<element name="portamento2"><text string="PORTAMENTO" /></element>
<element name="speed"><text string="SPEED" /></element>
<element name="bend"><text string="BEND" /></element>
<element name="range"><text string="RANGE" /></element>
<element name="check"><text string="(CHECK)" /></element>
<element name="mt"><text string="MT" /></element>
<element name="pd_sound">
<text string="PD SOUND SELECTOR"><color red="1" green="0.9" blue="0.4" /></text>
</element>
<element name="tune"><text string="TUNE"><color red="1" green="0.9" blue="0.4" /></text></element>
<element name="power"><text string="POWER"><color red="1" green="0.9" blue="0.4" /></text></element>
<element name="arrow_left"><text string="&#x25c0;" /></element>
<element name="accent"><text string="ACCENT"></text></element>
<!-- LED primitives -->
<element name="led" defstate="0">
<rect state="0"><color red="0.2" green="0" blue="0" /></rect>
<rect state="1"><color red="1" green="0.1" blue="0" /></rect>
</element>
<element name="led_g" defstate="0">
<rect state="1"><color red="0" green="1" blue="0.1" /></rect>
</element>
<!-- button primitives -->
<element name="button" defstate="0">
<rect><color red="0.05" green="0.05" blue="0.05" /><bounds x="0" y="0" width="15" height="5" /></rect>
<rect state="0"><color red="0.9" green="0.9" blue="0.8" /><bounds xc="7.5" yc="2.5" width="13.5" height="4.5" /></rect>
<rect state="1"><color red="0.5" green="0.5" blue="0.42" /><bounds xc="7.5" yc="2.5" width="13.5" height="4.5" /></rect>
</element>
<element name="button_grey" defstate="0">
<rect><color red="0.05" green="0.05" blue="0.05" /><bounds x="0" y="0" width="15" height="5" /></rect>
<rect state="0"><color red="0.1" green="0.1" blue="0.1" /><bounds xc="7.5" yc="2.5" width="13.5" height="4.5" /></rect>
<rect state="1"><color red="0.07" green="0.07" blue="0.07" /><bounds xc="7.5" yc="2.5" width="13.5" height="4.5" /></rect>
</element>
<element name="button_blue" defstate="0">
<rect><color red="0.05" green="0.05" blue="0.05" /><bounds x="0" y="0" width="15" height="5" /></rect>
<rect state="0"><color red="0.35" green="0.45" blue="0.92" /><bounds xc="7.5" yc="2.5" width="13.5" height="4.5" /></rect>
<rect state="1"><color red="0.2" green="0.3" blue="0.75" /><bounds xc="7.5" yc="2.5" width="13.5" height="4.5" /></rect>
</element>
<element name="button_yellow" defstate="0">
<rect><color red="0.05" green="0.05" blue="0.05" /><bounds x="0" y="0" width="15" height="5" /></rect>
<rect state="0"><color red="1" green="0.9" blue="0.4" /><bounds xc="7.5" yc="2.5" width="13.5" height="4.5" /></rect>
<rect state="1"><color red="0.8" green="0.7" blue="0.25" /><bounds xc="7.5" yc="2.5" width="13.5" height="4.5" /></rect>
</element>
<element name="button_down" defstate="0">
<rect><color red="0.05" green="0.05" blue="0.05" /><bounds x="0" y="0" width="15" height="10" /></rect>
<rect state="0"><color red="0.9" green="0.9" blue="0.8" /><bounds xc="7.5" yc="5" width="13.5" height="8.5" /></rect>
<rect state="1"><color red="0.5" green="0.5" blue="0.42" /><bounds xc="7.5" yc="5" width="13.5" height="8.5" /></rect>
<image>
<bounds xc="7.5" yc="5" width="10" height="10" />
<data><![CDATA[
<?xml version="1.0" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 10 10" version="1.1">
<polygon points="2,2 5,8 8,2" fill="none" stroke="black" stroke-width="0.4" />
</svg>
]]></data>
</image>
</element>
<element name="button_up" defstate="0">
<rect><color red="0.05" green="0.05" blue="0.05" /><bounds x="0" y="0" width="15" height="10" /></rect>
<rect state="0"><color red="0.9" green="0.9" blue="0.8" /><bounds xc="7.5" yc="5" width="13.5" height="8.5" /></rect>
<rect state="1"><color red="0.5" green="0.5" blue="0.42" /><bounds xc="7.5" yc="5" width="13.5" height="8.5" /></rect>
<image>
<bounds xc="7.5" yc="5" width="10" height="10" />
<data><![CDATA[
<?xml version="1.0" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 10 10" version="1.1">
<polygon points="2,8 5,2 8,8" fill="none" stroke="black" stroke-width="0.4" />
</svg>
]]></data>
</image>
</element>
<repeat count="11">
<param name="num" start="0" increment="1" />
<element name="button_num_~num~" defstate="0">
<rect><color red="0.05" green="0.05" blue="0.05" /><bounds x="0" y="0" width="15" height="5" /></rect>
<rect state="0"><color red="0.9" green="0.9" blue="0.8" /><bounds xc="7.5" yc="2.5" width="13.5" height="4.5" /></rect>
<rect state="1"><color red="0.5" green="0.5" blue="0.42" /><bounds xc="7.5" yc="2.5" width="13.5" height="4.5" /></rect>
<text string="~num~"><bounds xc="7.5" yc="2.5" width="15" height="4" /><color red="0" green="0" blue="0" /></text>
</element>
</repeat>
<element name="button_clear" defstate="0">
<rect><color red="0.05" green="0.05" blue="0.05" /><bounds x="0" y="0" width="15" height="5" /></rect>
<rect state="0"><color red="0.8" green="0.2" blue="0.1" /><bounds xc="7.5" yc="2.5" width="13.5" height="4.5" /></rect>
<rect state="1"><color red="0.6" green="0.1" blue="0" /><bounds xc="7.5" yc="2.5" width="13.5" height="4.5" /></rect>
<text string="C"><bounds xc="7.5" yc="2.5" width="15" height="4" /><color red="0" green="0" blue="0" /></text>
</element>
<!-- note chart -->
<element name="note_chart">
<rect><color red="1" green="1" blue="1"/><bounds x="0" y="0" width="135" height="12" /></rect>
<rect><color red="0.04" green="0.04" blue="0.04" /><bounds x="0.5" y="0.5" width="134" height="11" /></rect>
<rect><color red="1" green="0.9" blue="0.4" /><bounds x="5" y="1" width="94" height="0.5" /></rect>
<rect><color red="1" green="0.9" blue="0.4" /><bounds x="5" y="1" width="0.5" height="8" /></rect>
<disk><color red="1" green="0.9" blue="0.4" /><bounds x="3" y="8" width="2.5" height="1.5" /></disk>
<rect><color red="1" green="0.9" blue="0.4" /><bounds x="52" y="1" width="0.5" height="8" /></rect>
<disk><color red="1" green="0.9" blue="0.4" /><bounds x="50" y="8" width="2.5" height="1.5" /></disk>
<rect><color red="1" green="0.9" blue="0.4" /><bounds x="98.5" y="1" width="0.5" height="8" /></rect>
<disk><color red="1" green="0.9" blue="0.4" /><bounds x="96.5" y="8" width="2.5" height="1.5" /></disk>
<rect><color red="0.2" green="0.8" blue="0.6" /><bounds x="8" y="2" width="102" height="0.5" /></rect>
<rect><color red="0.2" green="0.8" blue="0.6" /><bounds x="8" y="3" width="102" height="0.5" /></rect>
<rect><color red="0.2" green="0.8" blue="0.6" /><bounds x="8" y="2" width="0.5" height="7" /></rect>
<disk><color red="0.2" green="0.8" blue="0.6" /><bounds x="6" y="8" width="2.5" height="1.5" /></disk>
<rect><color red="0.2" green="0.8" blue="0.6" /><bounds x="40" y="2" width="0.5" height="7" /></rect>
<disk><color red="0.2" green="0.8" blue="0.6" /><bounds x="38" y="8" width="2.5" height="1.5" /></disk>
<rect><color red="0.2" green="0.8" blue="0.6" /><bounds x="75" y="2" width="0.5" height="7" /></rect>
<disk><color red="0.2" green="0.8" blue="0.6" /><bounds x="73" y="8" width="2.5" height="1.5" /></disk>
<rect><color red="0.2" green="0.8" blue="0.6" /><bounds x="109.5" y="2" width="0.5" height="7" /></rect>
<disk><color red="0.2" green="0.8" blue="0.6" /><bounds x="107.5" y="8" width="2.5" height="1.5" /></disk>
</element>
<!-- rhythm sound slider -->
<element name="rhythm_sw">
<rect><color red="0.06" green="0.06" blue="0.06" /><bounds x="0" y="0" width="104" height="8" /></rect>
<rect><color red="0" green="0" blue="0" /><bounds x="4" yc="4" width="96" height="4" /></rect>
<rect>
<color red="0.12" green="0.12" blue="0.12" />
<bounds state="0x0001" xc="6" y="0" width="12" height="8" />
<bounds state="0x0002" xc="12" y="0" width="12" height="8" />
<bounds state="0x0004" xc="18" y="0" width="12" height="8" />
<bounds state="0x0008" xc="24" y="0" width="12" height="8" />
<bounds state="0x0010" xc="30" y="0" width="12" height="8" />
<bounds state="0x0020" xc="36" y="0" width="12" height="8" />
<bounds state="0x0040" xc="42" y="0" width="12" height="8" />
<bounds state="0x0080" xc="48" y="0" width="12" height="8" />
<bounds state="0x0100" xc="54" y="0" width="12" height="8" />
<bounds state="0x0200" xc="60" y="0" width="12" height="8" />
<bounds state="0x0400" xc="66" y="0" width="12" height="8" />
<bounds state="0x0800" xc="72" y="0" width="12" height="8" />
<bounds state="0x1000" xc="80" y="0" width="12" height="8" />
<bounds state="0x2000" xc="86" y="0" width="12" height="8" />
<bounds state="0x4000" xc="92" y="0" width="12" height="8" />
<bounds state="0x8000" xc="98" y="0" width="12" height="8" />
</rect>
<rect>
<color red="1" green="1" blue="1" />
<bounds state="0x0001" xc="6" y="0" width="1" height="8" />
<bounds state="0x0002" xc="12" y="0" width="1" height="8" />
<bounds state="0x0004" xc="18" y="0" width="1" height="8" />
<bounds state="0x0008" xc="24" y="0" width="1" height="8" />
<bounds state="0x0010" xc="30" y="0" width="1" height="8" />
<bounds state="0x0020" xc="36" y="0" width="1" height="8" />
<bounds state="0x0040" xc="42" y="0" width="1" height="8" />
<bounds state="0x0080" xc="48" y="0" width="1" height="8" />
<bounds state="0x0100" xc="54" y="0" width="1" height="8" />
<bounds state="0x0200" xc="60" y="0" width="1" height="8" />
<bounds state="0x0400" xc="66" y="0" width="1" height="8" />
<bounds state="0x0800" xc="72" y="0" width="1" height="8" />
<bounds state="0x1000" xc="80" y="0" width="1" height="8" />
<bounds state="0x2000" xc="86" y="0" width="1" height="8" />
<bounds state="0x4000" xc="92" y="0" width="1" height="8" />
<bounds state="0x8000" xc="98" y="0" width="1" height="8" />
</rect>
</element>
<group name="rhythm_slider">
<repeat count="16">
<param name="x" start="6" increment="6" />
<param name="mask" start="1" lshift="1" />
<element ref="grey" inputtag="RHYTHM" inputmask="~mask~"><bounds xc="~x~" y="5" width="4" height="8" /></element>
</repeat>
<element ref="bd"><bounds xc="6" y="0" width="10" height="5" /></element>
<element ref="sd"><bounds xc="12" y="13" width="10" height="5" /></element>
<element ref="lt"><bounds xc="18" y="0" width="10" height="5" /></element>
<element ref="ht"><bounds xc="24" y="13" width="10" height="5" /></element>
<element ref="lb"><bounds xc="30" y="0" width="10" height="5" /></element>
<element ref="hb"><bounds xc="36" y="13" width="10" height="5" /></element>
<element ref="ch"><bounds xc="42" y="0" width="10" height="5" /></element>
<element ref="rim"><bounds xc="48" y="13" width="10" height="5" /></element>
<element ref="oh"><bounds xc="54" y="0" width="10" height="5" /></element>
<element ref="cb"><bounds xc="60" y="13" width="10" height="5" /></element>
<element ref="ride"><bounds xc="66" y="0" width="10" height="5" /></element>
<element ref="claps"><bounds xc="72" y="13" width="15" height="5" /></element>
<element ref="num1"><bounds xc="80" y="0" width="10" height="5" /></element>
<element ref="num2"><bounds xc="86" y="13" width="10" height="5" /></element>
<element ref="num3"><bounds xc="92" y="0" width="10" height="5" /></element>
<element ref="num4"><bounds xc="98" y="13" width="10" height="5" /></element>
<element ref="rhythm_sw" name="rhythm_pos"><bounds x="0" y="5" width="104" height="8" /></element>
</group>
<!-- rhythm mode slider -->
<element name="mode_sw">
<rect><color red="0.06" green="0.06" blue="0.06" /><bounds x="0" y="0" width="36" height="8" /></rect>
<rect><color red="0" green="0" blue="0" /><bounds x="4" yc="4" width="28" height="4" /></rect>
<rect>
<color red="0.12" green="0.12" blue="0.12" />
<bounds state="0x0001" xc="6" y="0" width="12" height="8" />
<bounds state="0x0002" xc="12" y="0" width="12" height="8" />
<bounds state="0x0004" xc="18" y="0" width="12" height="8" />
<bounds state="0x0008" xc="24" y="0" width="12" height="8" />
<bounds state="0x0010" xc="30" y="0" width="12" height="8" />
</rect>
<rect>
<color red="1" green="1" blue="1" />
<bounds state="0x0001" xc="6" y="0" width="1" height="8" />
<bounds state="0x0002" xc="12" y="0" width="1" height="8" />
<bounds state="0x0004" xc="18" y="0" width="1" height="8" />
<bounds state="0x0008" xc="24" y="0" width="1" height="8" />
<bounds state="0x0010" xc="30" y="0" width="1" height="8" />
</rect>
</element>
<group name="mode_slider">
<repeat count="5">
<param name="x" start="11" increment="6" />
<param name="mask" start="1" lshift="1" />
<element ref="grey" inputtag="MODE" inputmask="~mask~"><bounds xc="~x~" y="10" width="4" height="8" /></element>
</repeat>
<element ref="white"><bounds x="0" yc="2.5" width="23" height="0.5" /></element>
<element ref="memory1"><bounds x="0" y="0" width="15" height="5" /></element>
<element ref="white"><bounds x="0" yc="7.5" width="12" height="0.5" /></element>
<element ref="play1"><bounds x="0" y="5" width="8" height="5" /></element>
<element ref="mem44"><bounds xc="17" y="5" width="10" height="5" /></element>
<element ref="mem34"><bounds xc="23" y="5" width="10" height="5" /></element>
<element ref="white"><bounds x="29" yc="2.5" width="10" height="0.5" /></element>
<element ref="white"><bounds x="29" y="2.5" width="0.5" height="5" /></element>
<element ref="memory2"><bounds x="31" y="0" width="15" height="5" /></element>
<element ref="white"><bounds x="35" yc="7.5" width="10" height="0.5" /></element>
<element ref="play2"><bounds x="37" y="5" width="9" height="5" /></element>
<element ref="mode_sw" name="mode_pos"><bounds x="5" y="10" width="36" height="8" /></element>
<element ref="pattern"><bounds xc="12" y="18" width="20" height="5" /></element>
<element ref="song"><bounds xc="35" y="18" width="10" height="5" /></element>
</group>
<!-- effect group -->
<group name="effect">
<element ref="grey"><bounds x="0" y="0" width="32" height="78" /></element>
<element ref="white"><bounds x="1" y="1" width="0.75" height="74" /></element>
<element ref="white"><bounds xc="17" y="50" width="30" height="0.75" /></element>
<element ref="led" name="led0.4"><bounds xc="17" y="26" width="6" height="3" /></element>
<element ref="insert"><bounds xc="17" y="32" width="15" height="3" /></element>
<element ref="button" inputtag="KC0" inputmask="0x200"><bounds xc="17" y="37" width="15" height="5" /></element>
<element ref="solo"><bounds xc="17" y="44" width="28" height="5" /></element>
<element ref="led" name="led0.2"><bounds xc="17" y="52" width="6" height="3" /></element>
<element ref="on_off"><bounds xc="17" y="58" width="15" height="3" /></element>
<element ref="button" inputtag="KC0" inputmask="0x400"><bounds xc="17" y="63" width="15" height="5" /></element>
<element ref="portamento1"><bounds xc="17" y="70" width="28" height="5" /></element>
</group>
<!-- rhythm group -->
<group name="rhythm">
<element ref="grey"><bounds x="0" y="0" width="206" height="78" /></element>
<element ref="white"><bounds x="1" y="1" width="0.75" height="74" /></element>
<group ref="rhythm_slider"><bounds xc="100" y="6" width="75" height="13" /></group>
<element ref="rhythm_sound"><bounds xc="100" y="20" width="75" height="5" /></element>
<element ref="led" name="led0.3"><bounds xc="144" y="11" width="6" height="3" /></element>
<element ref="pd"><bounds xc="144" y="15" width="15" height="4" /></element>
<group ref="mode_slider"><bounds xc="180" y="1" width="44" height="18" /></group>
<element ref="rhythm_mode"><bounds xc="180" y="20" width="40" height="5" /></element>
<element ref="arrow_down"><bounds xc="12.5" y="31" width="15" height="5" /></element>
<element ref="button" inputtag="KC3" inputmask="0x100"><bounds x="5" y="37" width="15" height="5" /></element>
<element ref="arrow_up"><bounds xc="29.5" y="31" width="15" height="5" /></element>
<element ref="button" inputtag="KC3" inputmask="0x200"><bounds x="22" y="37" width="15" height="5" /></element>
<element ref="tempo"><bounds xc="21" y="44" width="15" height="4" /></element>
<element ref="button_num_1" inputtag="KC1" inputmask="0x40"><bounds x="45" y="37" width="15" height="5" /></element>
<element ref="button_num_2" inputtag="KC1" inputmask="0x80"><bounds x="61" y="37" width="15" height="5" /></element>
<element ref="button_num_3" inputtag="KC1" inputmask="0x100"><bounds x="77" y="37" width="15" height="5" /></element>
<element ref="button_num_4" inputtag="KC1" inputmask="0x200"><bounds x="93" y="37" width="15" height="5" /></element>
<element ref="button_num_5" inputtag="KC1" inputmask="0x400"><bounds x="109" y="37" width="15" height="5" /></element>
<element ref="button_num_6" inputtag="KC2" inputmask="0x40"><bounds x="125" y="37" width="15" height="5" /></element>
<element ref="button_num_7" inputtag="KC2" inputmask="0x80"><bounds x="141" y="37" width="15" height="5" /></element>
<element ref="button_num_8" inputtag="KC2" inputmask="0x100"><bounds x="157" y="37" width="15" height="5" /></element>
<element ref="button_num_9" inputtag="KC2" inputmask="0x200"><bounds x="173" y="37" width="15" height="5" /></element>
<element ref="button_num_10" inputtag="KC2" inputmask="0x400"><bounds x="189" y="37" width="15" height="5" /></element>
<element ref="led" name="led0.1"><bounds xc="21" y="52" width="6" height="3" /></element>
<element ref="led_g" name="led0.0"><bounds xc="21" y="52" width="6" height="3" /></element>
<element ref="start"><bounds xc="12.5" y="55" width="15" height="4" /></element>
<element ref="stop"><bounds xc="12.5" y="59" width="15" height="4" /></element>
<element ref="button_yellow" inputtag="KC3" inputmask="0x400"><bounds x="5" y="63" width="15" height="5" /></element>
<element ref="record"><bounds xc="12.5" y="69" width="15" height="3" /></element>
<element ref="synchro"><bounds xc="29.5" y="57" width="15" height="4" /></element>
<element ref="button_yellow" inputtag="KC3" inputmask="0x800"><bounds x="22" y="63" width="15" height="5" /></element>
<element ref="clear"><bounds xc="29.5" y="69" width="15" height="3" /></element>
<element ref="intro"><bounds xc="72.5" y="57" width="45" height="4" /></element>
<element ref="button_blue" inputtag="KC3" inputmask="0x80"><bounds x="50" y="63" width="45" height="5" /></element>
<element ref="bar"><bounds xc="72.5" y="69" width="45" height="3" /></element>
<element ref="preset"><bounds xc="143.5" y="55" width="15" height="4" /></element>
<element ref="num1"><bounds xc="143.5" y="59" width="15" height="4" /></element>
<element ref="button" inputtag="KC1" inputmask="0x800"><bounds x="136" y="63" width="15" height="5" /></element>
<element ref="preset"><bounds xc="160.5" y="55" width="15" height="4" /></element>
<element ref="num2"><bounds xc="160.5" y="59" width="15" height="4" /></element>
<element ref="button" inputtag="KC2" inputmask="0x800"><bounds x="153" y="63" width="15" height="5" /></element>
<element ref="program"><bounds xc="178.5" y="55" width="15" height="4" /></element>
<element ref="button" inputtag="KC3" inputmask="0x40"><bounds x="171" y="63" width="15" height="5" /></element>
<element ref="rhythm"><bounds xc="103" y="70" width="64" height="5" /></element>
</group>
<!-- data entry group -->
<group name="data">
<element ref="black"><bounds x="0" y="0" width="106" height="48" /></element>
<element ref="white"><bounds xc="53" y="2" width="96" height="23" /></element>
<element ref="black"><bounds xc="53" y="3" width="94.5" height="21.5" /></element>
<screen index="0"><bounds xc="53" yc="13.5" width="85.5" height="17.975" /></screen>
<element ref="midi"><bounds xc="12.5" y="33" width="15" height="4" /></element>
<element ref="button_grey" inputtag="KC8" inputmask="0x80"><bounds x="5" y="37" width="15" height="5" /></element>
<element ref="transpose"><bounds xc="29.5" y="33" width="18" height="4" /></element>
<element ref="button_grey" inputtag="KC8" inputmask="0x200"><bounds x="22" y="37" width="15" height="5" /></element>
<element ref="portamento2"><bounds xc="46.5" y="29" width="20" height="4" /></element>
<element ref="speed"><bounds xc="46.5" y="33" width="15" height="4" /></element>
<element ref="button_grey" inputtag="KC8" inputmask="0x100"><bounds x="39" y="37" width="15" height="5" /></element>
<element ref="bend"><bounds xc="63.5" y="29" width="15" height="4" /></element>
<element ref="range"><bounds xc="63.5" y="33" width="15" height="4" /></element>
<element ref="check"><bounds xc="63.5" y="43" width="15" height="3" /></element>
<element ref="button_grey" inputtag="KC0" inputmask="0x800"><bounds x="56" y="37" width="15" height="5" /></element>
<element ref="mt"><bounds xc="92.5" y="33" width="15" height="4" /></element>
<element ref="button_blue" inputtag="KC8" inputmask="0x40"><bounds x="85" y="37" width="15" height="5" /></element>
<element ref="grey"><bounds x="0" y="50" width="106" height="28" /></element>
<element ref="value"><bounds xc="53" y="51" width="64" height="4" /></element>
<element ref="save"><bounds xc="43" y="55" width="15" height="3" /></element>
<element ref="button_down" inputtag="KC8" inputmask="0x400"><bounds xc="43" y="58" width="15" height="10" /></element>
<element ref="load"><bounds xc="63" y="55" width="15" height="3" /></element>
<element ref="button_up" inputtag="KC8" inputmask="0x800"><bounds xc="63" y="58" width="15" height="10" /></element>
<element ref="data_entry"><bounds xc="53" y="70" width="64" height="5" /></element>
</group>
<!-- PD sound group -->
<group name="pd">
<element ref="black"><bounds x="0" y="0" width="244" height="48" /></element>
<element ref="grey"><bounds x="2" y="50" width="252" height="28" /></element>
<element ref="button_num_5" inputtag="KC9" inputmask="0x80"><bounds x="45" y="53" width="15" height="5" /></element>
<element ref="button_num_6" inputtag="KC9" inputmask="0x100"><bounds x="65" y="53" width="15" height="5" /></element>
<element ref="button_num_7" inputtag="KC9" inputmask="0x200"><bounds x="85" y="53" width="15" height="5" /></element>
<element ref="button_num_8" inputtag="KC9" inputmask="0x400"><bounds x="105" y="53" width="15" height="5" /></element>
<element ref="button_num_9" inputtag="KC9" inputmask="0x800"><bounds x="125" y="53" width="15" height="5" /></element>
<element ref="button_clear" inputtag="KC10" inputmask="0x400"><bounds x="145" y="58" width="15" height="5" /></element>
<element ref="button_num_0" inputtag="KC10" inputmask="0x40"><bounds x="45" y="63" width="15" height="5" /></element>
<element ref="button_num_1" inputtag="KC10" inputmask="0x80"><bounds x="65" y="63" width="15" height="5" /></element>
<element ref="button_num_2" inputtag="KC10" inputmask="0x100"><bounds x="85" y="63" width="15" height="5" /></element>
<element ref="button_num_3" inputtag="KC10" inputmask="0x200"><bounds x="105" y="63" width="15" height="5" /></element>
<element ref="button_num_4" inputtag="KC9" inputmask="0x40"><bounds x="125" y="63" width="15" height="5" /></element>
<element ref="pd_sound"><bounds xc="92.5" y="70" width="64" height="5" /></element>
<element ref="arrow_down"><bounds xc="220" y="53" width="15" height="5" /></element>
<element ref="button_grey" inputtag="KC11" inputmask="0x40"><bounds xc="220" y="60" width="15" height="8" /></element>
<element ref="arrow_up"><bounds xc="240" y="53" width="15" height="5" /></element>
<element ref="button_grey" inputtag="KC11" inputmask="0x80"><bounds xc="240" y="60" width="15" height="8" /></element>
<element ref="tune"><bounds xc="230" y="70" width="64" height="5" /></element>
</group>
<!-- keyboard primitives -->
<element name="keyfill"><rect><color red="0.0" green="0.0" blue="0.0" /></rect></element>
<element name="whitekey" defstate="0">
<rect state="0"><bounds x="0" y="0" width="79" height="252" /><color red="1.0" green="1.0" blue="1.0" /></rect>
<rect state="1"><bounds x="0" y="0" width="79" height="252" /><color red="0.9" green="0.9" blue="0.9" /></rect>
</element>
<element name="whitekey-l" defstate="0">
<rect state="0"><bounds x="0" y="0" width="45" height="252" /><color red="1.0" green="1.0" blue="1.0" /></rect>
<rect state="0"><bounds x="0" y="252" width="79" height="172" /><color red="1.0" green="1.0" blue="1.0" /></rect>
<rect state="1"><bounds x="0" y="0" width="45" height="252" /><color red="0.9" green="0.9" blue="0.9" /></rect>
<rect state="1"><bounds x="0" y="252" width="79" height="172" /><color red="0.9" green="0.9" blue="0.9" /></rect>
</element>
<element name="whitekey-m" defstate="0">
<rect state="0"><bounds x="13" y="0" width="53" height="252" /><color red="1.0" green="1.0" blue="1.0" /></rect>
<rect state="0"><bounds x="0" y="252" width="79" height="172" /><color red="1.0" green="1.0" blue="1.0" /></rect>
<rect state="1"><bounds x="13" y="0" width="53" height="252" /><color red="0.9" green="0.9" blue="0.9" /></rect>
<rect state="1"><bounds x="0" y="252" width="79" height="172" /><color red="0.9" green="0.9" blue="0.9" /></rect>
</element>
<element name="whitekey-lm" defstate="0">
<rect state="0"><bounds x="10" y="0" width="44" height="252" /><color red="1.0" green="1.0" blue="1.0" /></rect>
<rect state="0"><bounds x="0" y="252" width="79" height="172" /><color red="1.0" green="1.0" blue="1.0" /></rect>
<rect state="1"><bounds x="10" y="0" width="44" height="252" /><color red="0.9" green="0.9" blue="0.9" /></rect>
<rect state="1"><bounds x="0" y="252" width="79" height="172" /><color red="0.9" green="0.9" blue="0.9" /></rect>
</element>
<element name="whitekey-rm" defstate="0">
<rect state="0"><bounds x="22" y="0" width="44" height="252" /><color red="1.0" green="1.0" blue="1.0" /></rect>
<rect state="0"><bounds x="0" y="252" width="79" height="172" /><color red="1.0" green="1.0" blue="1.0" /></rect>
<rect state="1"><bounds x="22" y="0" width="44" height="252" /><color red="0.9" green="0.9" blue="0.9" /></rect>
<rect state="1"><bounds x="0" y="252" width="79" height="172" /><color red="0.9" green="0.9" blue="0.9" /></rect>
</element>
<element name="whitekey-r" defstate="0">
<rect state="0"><bounds x="34" y="0" width="45" height="252" /><color red="1.0" green="1.0" blue="1.0" /></rect>
<rect state="0"><bounds x="0" y="252" width="79" height="172" /><color red="1.0" green="1.0" blue="1.0" /></rect>
<rect state="1"><bounds x="34" y="0" width="45" height="252" /><color red="0.9" green="0.9" blue="0.9" /></rect>
<rect state="1"><bounds x="0" y="252" width="79" height="172" /><color red="0.9" green="0.9" blue="0.9" /></rect>
</element>
<element name="blackkey" defstate="0">
<rect state="0"><bounds x="0" y="0" width="44" height="252" /><color red="0.0" green="0.0" blue="0.0" /></rect>
<rect state="0"><bounds x="4" y="0" width="36" height="248" /><color red="0.1" green="0.1" blue="0.1" /></rect>
<rect state="1"><bounds x="0" y="0" width="44" height="252" /><color red="0.1" green="0.1" blue="0.1" /></rect>
<rect state="1"><bounds x="4" y="0" width="36" height="248" /><color red="0.1" green="0.1" blue="0.1" /></rect>
</element>
<!-- keyboard group -->
<group name="keyboard">
<element ref="keyfill"><bounds x="72" y="98" width="2396" height="444" /></element>
<!-- octave 1 -->
<element ref="blackkey" inputtag="KC0" inputmask="0x02"><bounds x="130" y="108" width="44" height="252" /></element>
<element ref="blackkey" inputtag="KC0" inputmask="0x08"><bounds x="233" y="108" width="44" height="252" /></element>
<element ref="blackkey" inputtag="KC1" inputmask="0x01"><bounds x="373" y="108" width="44" height="252" /></element>
<element ref="blackkey" inputtag="KC1" inputmask="0x04"><bounds x="467" y="108" width="44" height="252" /></element>
<element ref="blackkey" inputtag="KC1" inputmask="0x10"><bounds x="561" y="108" width="44" height="252" /></element>
<element ref="whitekey-l" inputtag="KC0" inputmask="0x01"><bounds x="82" y="108" width="79" height="424" /></element>
<element ref="whitekey-m" inputtag="KC0" inputmask="0x04"><bounds x="164" y="108" width="79" height="424" /></element>
<element ref="whitekey-r" inputtag="KC0" inputmask="0x10"><bounds x="246" y="108" width="79" height="424" /></element>
<element ref="whitekey-l" inputtag="KC0" inputmask="0x20"><bounds x="328" y="108" width="79" height="424" /></element>
<element ref="whitekey-lm" inputtag="KC1" inputmask="0x02"><bounds x="410" y="108" width="79" height="424" /></element>
<element ref="whitekey-rm" inputtag="KC1" inputmask="0x08"><bounds x="492" y="108" width="79" height="424" /></element>
<element ref="whitekey-r" inputtag="KC1" inputmask="0x20"><bounds x="574" y="108" width="79" height="424" /></element>
<!-- octave 2 -->
<element ref="blackkey" inputtag="KC2" inputmask="0x02"><bounds x="704" y="108" width="44" height="252" /></element>
<element ref="blackkey" inputtag="KC2" inputmask="0x08"><bounds x="807" y="108" width="44" height="252" /></element>
<element ref="blackkey" inputtag="KC3" inputmask="0x01"><bounds x="947" y="108" width="44" height="252" /></element>
<element ref="blackkey" inputtag="KC3" inputmask="0x04"><bounds x="1041" y="108" width="44" height="252" /></element>
<element ref="blackkey" inputtag="KC3" inputmask="0x10"><bounds x="1135" y="108" width="44" height="252" /></element>
<element ref="whitekey-l" inputtag="KC2" inputmask="0x01"><bounds x="656" y="108" width="79" height="424" /></element>
<element ref="whitekey-m" inputtag="KC2" inputmask="0x04"><bounds x="738" y="108" width="79" height="424" /></element>
<element ref="whitekey-r" inputtag="KC2" inputmask="0x10"><bounds x="820" y="108" width="79" height="424" /></element>
<element ref="whitekey-l" inputtag="KC2" inputmask="0x20"><bounds x="902" y="108" width="79" height="424" /></element>
<element ref="whitekey-lm" inputtag="KC3" inputmask="0x02"><bounds x="984" y="108" width="79" height="424" /></element>
<element ref="whitekey-rm" inputtag="KC3" inputmask="0x08"><bounds x="1066" y="108" width="79" height="424" /></element>
<element ref="whitekey-r" inputtag="KC3" inputmask="0x20"><bounds x="1148" y="108" width="79" height="424" /></element>
<!-- octave 3 -->
<element ref="blackkey" inputtag="KC4" inputmask="0x02"><bounds x="1278" y="108" width="44" height="252" /></element>
<element ref="blackkey" inputtag="KC4" inputmask="0x08"><bounds x="1381" y="108" width="44" height="252" /></element>
<element ref="blackkey" inputtag="KC5" inputmask="0x01"><bounds x="1521" y="108" width="44" height="252" /></element>
<element ref="blackkey" inputtag="KC5" inputmask="0x04"><bounds x="1615" y="108" width="44" height="252" /></element>
<element ref="blackkey" inputtag="KC5" inputmask="0x10"><bounds x="1709" y="108" width="44" height="252" /></element>
<element ref="whitekey-l" inputtag="KC4" inputmask="0x01"><bounds x="1230" y="108" width="79" height="424" /></element>
<element ref="whitekey-m" inputtag="KC4" inputmask="0x04"><bounds x="1312" y="108" width="79" height="424" /></element>
<element ref="whitekey-r" inputtag="KC4" inputmask="0x10"><bounds x="1394" y="108" width="79" height="424" /></element>
<element ref="whitekey-l" inputtag="KC4" inputmask="0x20"><bounds x="1476" y="108" width="79" height="424" /></element>
<element ref="whitekey-lm" inputtag="KC5" inputmask="0x02"><bounds x="1558" y="108" width="79" height="424" /></element>
<element ref="whitekey-rm" inputtag="KC5" inputmask="0x08"><bounds x="1640" y="108" width="79" height="424" /></element>
<element ref="whitekey-r" inputtag="KC5" inputmask="0x20"><bounds x="1722" y="108" width="79" height="424" /></element>
<!-- octave 4 -->
<element ref="blackkey" inputtag="KC6" inputmask="0x02"><bounds x="1852" y="108" width="44" height="252" /></element>
<element ref="blackkey" inputtag="KC6" inputmask="0x08"><bounds x="1955" y="108" width="44" height="252" /></element>
<element ref="blackkey" inputtag="KC7" inputmask="0x01"><bounds x="2095" y="108" width="44" height="252" /></element>
<element ref="blackkey" inputtag="KC7" inputmask="0x04"><bounds x="2189" y="108" width="44" height="252" /></element>
<element ref="blackkey" inputtag="KC7" inputmask="0x10"><bounds x="2283" y="108" width="44" height="252" /></element>
<element ref="whitekey-l" inputtag="KC6" inputmask="0x01"><bounds x="1804" y="108" width="79" height="424" /></element>
<element ref="whitekey-m" inputtag="KC6" inputmask="0x04"><bounds x="1886" y="108" width="79" height="424" /></element>
<element ref="whitekey-r" inputtag="KC6" inputmask="0x10"><bounds x="1968" y="108" width="79" height="424" /></element>
<element ref="whitekey-l" inputtag="KC6" inputmask="0x20"><bounds x="2050" y="108" width="79" height="424" /></element>
<element ref="whitekey-lm" inputtag="KC7" inputmask="0x02"><bounds x="2132" y="108" width="79" height="424" /></element>
<element ref="whitekey-rm" inputtag="KC7" inputmask="0x08"><bounds x="2214" y="108" width="79" height="424" /></element>
<element ref="whitekey-r" inputtag="KC7" inputmask="0x20"><bounds x="2296" y="108" width="79" height="424" /></element>
<!-- final key -->
<element ref="whitekey" inputtag="KC8" inputmask="0x01"><bounds x="2378" y="108" width="79" height="424" /></element>
</group>
<group name="panel">
<group ref="effect"><bounds x="0" y="0" width="32" height="78" /></group>
<group ref="rhythm"><bounds x="32" y="0" width="206" height="78" /></group>
<group ref="data"><bounds x="240" y="0" width="106" height="78" /></group>
<group ref="pd"><bounds x="346" y="0" width="254" height="78" /></group>
</group>
<view name="Keyboard">
<bounds x="0" y="0" width="640" height="202" />
<element ref="bg"><bounds x="0" y="16" width="640" height="186" /></element>
<element ref="grey"><bounds x="0" y="18" width="36" height="184" /></element>
<element ref="grey"><bounds x="620" y="18" width="36" height="184" /></element>
<group ref="panel"><bounds x="36" y="18" width="600" height="78" /></group>
<element ref="led" name="led0.5"><bounds xc="630" y="40" width="6" height="3" /></element>
<element ref="power"><bounds xc="630" y="50" width="64" height="5" /></element>
<element ref="grey"><bounds xc="328" y="98" width="580" height="40" /></element>
<element ref="note_chart"><bounds x="40" y="99" width="135" height="12" /></element>
<element ref="note_chart"><bounds x="180" y="99" width="135" height="12" /></element>
<element ref="note_chart"><bounds x="320" y="99" width="135" height="12" /></element>
<element ref="mem34"><bounds x="442" y="105" width="15" height="4" /></element>
<element ref="note_chart"><bounds x="460" y="99" width="135" height="12" /></element>
<element ref="mem44"><bounds x="582" y="105" width="15" height="4" /></element>
<element ref="accent"><bounds xc="608" y="105" width="15" height="4" /></element>
<element ref="arrow_left"><bounds xc="245" y="110" width="15" height="6" /></element>
<group ref="keyboard"><bounds xc="328" y="116" width="584" height="86" /></group>
</view>
</mamelayout>

230
src/mame/layout/sz1.lay Normal file
View File

@ -0,0 +1,230 @@
<?xml version="1.0"?>
<!--
license:CC0-1.0
-->
<mamelayout version="2">
<element name="bg"><rect><color red="0.06" green="0.06" blue="0.06" /></rect></element>
<element name="grey"><rect><color red="0.04" green="0.04" blue="0.04" /></rect></element>
<element name="yellow"><rect><color red="0.9" green="0.85" blue="0.45" /></rect></element>
<element name="led" defstate="0">
<rect state="0"><color red="0.2" green="0" blue="0" /></rect>
<rect state="1"><color red="1" green="0.1" blue="0" /></rect>
</element>
<!-- text elements -->
<element name="copy"><text string="COPY" /></element>
<element name="edit"><text string="EDIT" /></element>
<element name="insert"><text string="INSERT" /></element>
<element name="delete"><text string="DELETE" /></element>
<element name="midi"><text string="MIDI" /></element>
<element name="repeat"><text string="REPEAT" /></element>
<element name="track"><text string="TRACK" /></element>
<element name="track1"><text string="1" /></element>
<element name="track2"><text string="2" /></element>
<element name="track3"><text string="3" /></element>
<element name="track4"><text string="4" /></element>
<element name="cartridge"><text string="CARTRIDGE" /></element>
<element name="mt"><text string="/MT" /></element>
<element name="note4"><text string="1/4" /></element>
<element name="note2"><text string="1/2" /></element>
<element name="note1"><text string="1/1" /></element>
<element name="note8"><text string="1/8" /></element>
<element name="note16"><text string="1/16" /></element>
<element name="note32"><text string="1/32" /></element>
<element name="rest"><text string="REST" /></element>
<element name="dot"><text string="DOT" /></element>
<element name="triplet"><text string="TRIPLET" /></element>
<element name="tie"><text string="TIE" /></element>
<element name="manual_data"><text string="MANUAL DATA" /></element>
<element name="metronome"><text string="METRONOME" /></element>
<element name="enter"><text string="/ENTER" /></element>
<element name="tempo"><text string="TEMPO" /></element>
<element name="down"><text string="DOWN" /></element>
<element name="up"><text string="UP" /></element>
<element name="record_track"><text string="RECORD TRACK" /></element>
<element name="realtime"><text string="REAL TIME" /></element>
<element name="manual"><text string="MANUAL" /></element>
<element name="record"><text string="RECORD" /></element>
<element name="reset"><text string="RESET" /></element>
<element name="rev"><text string="REV" /></element>
<element name="fwd"><text string="FWD" /></element>
<element name="play"><text string="PLAY" /></element>
<element name="stop"><text string="STOP" /></element>
<element name="save"><text string="SAVE" /></element>
<element name="load"><text string="LOAD" /></element>
<element name="check"><text string="CHECK" /></element>
<!-- button primitives -->
<element name="button_black" defstate="0">
<rect><color red="0.05" green="0.05" blue="0.05" /><bounds x="0" y="0" width="15" height="15" /></rect>
<rect state="0"><color red="0.14" green="0.14" blue="0.14" /><bounds xc="7.5" yc="7.5" width="13.5" height="13.5" /></rect>
<rect state="1"><color red="0.08" green="0.08" blue="0.08" /><bounds xc="7.5" yc="7.5" width="13.5" height="13.5" /></rect>
</element>
<element name="button_black_small" defstate="0">
<rect><color red="0.05" green="0.05" blue="0.05" /><bounds x="0" y="0" width="10" height="15" /></rect>
<rect state="0"><color red="0.14" green="0.14" blue="0.14" /><bounds xc="5" yc="7.5" width="8.5" height="13.5" /></rect>
<rect state="1"><color red="0.08" green="0.08" blue="0.08" /><bounds xc="5" yc="7.5" width="8.5" height="13.5" /></rect>
</element>
<element name="button_tempo" defstate="0">
<rect><color red="0.05" green="0.05" blue="0.05" /><bounds x="0" y="0" width="15" height="15" /></rect>
<rect state="0"><color red="0.11" green="0.1" blue="0.1" /><bounds xc="7.5" yc="7.5" width="13.5" height="13.5" /></rect>
<rect state="1"><color red="0.075" green="0.07" blue="0.07" /><bounds xc="7.5" yc="7.5" width="13.5" height="13.5" /></rect>
</element>
<element name="button_track" defstate="0">
<rect><color red="0.05" green="0.05" blue="0.05" /><bounds x="0" y="0" width="15" height="15" /></rect>
<rect state="0"><color red="0.45" green="0.45" blue="0.45" /><bounds xc="7.5" yc="7.5" width="13.5" height="13.5" /></rect>
<rect state="1"><color red="0.3" green="0.3" blue="0.3" /><bounds xc="7.5" yc="7.5" width="13.5" height="13.5" /></rect>
</element>
<element name="button_track_small" defstate="0">
<rect><color red="0.05" green="0.05" blue="0.05" /><bounds x="0" y="0" width="10" height="15" /></rect>
<rect state="0"><color red="0.45" green="0.45" blue="0.45" /><bounds xc="5" yc="7.5" width="8.5" height="13.5" /></rect>
<rect state="1"><color red="0.3" green="0.3" blue="0.3" /><bounds xc="5" yc="7.5" width="8.5" height="13.5" /></rect>
</element>
<element name="button_blue" defstate="0">
<rect><color red="0.05" green="0.05" blue="0.05" /><bounds x="0" y="0" width="15" height="15" /></rect>
<rect state="0"><color red="0.35" green="0.45" blue="0.92" /><bounds xc="7.5" yc="7.5" width="13.5" height="13.5" /></rect>
<rect state="1"><color red="0.2" green="0.3" blue="0.75" /><bounds xc="7.5" yc="7.5" width="13.5" height="13.5" /></rect>
</element>
<element name="button_record" defstate="0">
<rect><color red="0.05" green="0.05" blue="0.05" /><bounds x="0" y="0" width="15" height="15" /></rect>
<rect state="0"><color red="0.55" green="0.6" blue="0.8" /><bounds xc="7.5" yc="7.5" width="13.5" height="13.5" /></rect>
<rect state="1"><color red="0.42" green="0.45" blue="0.6" /><bounds xc="7.5" yc="7.5" width="13.5" height="13.5" /></rect>
</element>
<element name="button_copy" defstate="0">
<rect><color red="0.05" green="0.05" blue="0.05" /><bounds x="0" y="0" width="10" height="15" /></rect>
<rect state="0"><color red="0.55" green="0.6" blue="0.8" /><bounds xc="5" yc="7.5" width="8.5" height="13.5" /></rect>
<rect state="1"><color red="0.42" green="0.45" blue="0.6" /><bounds xc="5" yc="7.5" width="8.5" height="13.5" /></rect>
</element>
<view name="Normal">
<element ref="bg"><bounds x="-15" y="30" width="215" height="110" /></element>
<element ref="grey"><bounds x="-15" y="30" width="215" height="2" /></element>
<element ref="grey"><bounds x="-15" y="45" width="215" height="2" /></element>
<screen index="0"><bounds x="15" y="33" width="50" height="10.93" /></screen>
<!-- copy/insert/delete -->
<element ref="button_copy" inputtag="KC3" inputmask="0x01"><bounds xc="22.5" y="60" width="10" height="15" /></element>
<element ref="copy"><bounds xc="22.5" yc="67.5" width="8" height="3" /></element>
<element ref="edit"><bounds xc="45" yc="52" width="20" height="3" /></element>
<element ref="yellow"><bounds xc="45" y="54" width="24" height="0.5" /></element>
<element ref="button_black_small" inputtag="KC3" inputmask="0x02"><bounds xc="37.5" y="60" width="10" height="15" /></element>
<element ref="insert"><bounds xc="37.5" yc="67.5" width="8" height="3" /></element>
<element ref="button_black_small" inputtag="KC3" inputmask="0x04"><bounds xc="52.5" y="60" width="10" height="15" /></element>
<element ref="delete"><bounds xc="52.5" yc="67.5" width="8" height="3" /></element>
<!-- manual data -->
<element ref="yellow"><bounds xc="30" y="84" width="58" height="1" /></element>
<element ref="yellow"><bounds xc="30" y="138" width="58" height="1" /></element>
<element ref="button_black" inputtag="KC2" inputmask="0x01"><bounds x="15" y="90" width="15" height="15" /></element>
<element ref="note4"><bounds xc="22.5" yc="97.5" width="13" height="4" /></element>
<element ref="button_black" inputtag="KC2" inputmask="0x02"><bounds x="30" y="90" width="15" height="15" /></element>
<element ref="note2"><bounds xc="37.5" yc="97.5" width="10" height="4" /></element>
<element ref="button_black" inputtag="KC2" inputmask="0x04"><bounds x="45" y="90" width="15" height="15" /></element>
<element ref="note1"><bounds xc="52.5" yc="97.5" width="10" height="4" /></element>
<element ref="button_black" inputtag="KC1" inputmask="0x01"><bounds x="15" y="105" width="15" height="15" /></element>
<element ref="note8"><bounds xc="22.5" yc="112.5" width="13" height="4" /></element>
<element ref="button_black" inputtag="KC1" inputmask="0x02"><bounds x="30" y="105" width="15" height="15" /></element>
<element ref="note16"><bounds xc="37.5" yc="112.5" width="13" height="4" /></element>
<element ref="button_black" inputtag="KC1" inputmask="0x04"><bounds x="45" y="105" width="15" height="15" /></element>
<element ref="note32"><bounds xc="52.5" yc="112.5" width="13" height="4" /></element>
<element ref="button_black" inputtag="KC0" inputmask="0x01"><bounds x="0" y="120" width="15" height="15" /></element>
<element ref="rest"><bounds xc="7.5" yc="127.5" width="13" height="3" /></element>
<element ref="button_black" inputtag="KC0" inputmask="0x02"><bounds x="15" y="120" width="15" height="15" /></element>
<element ref="dot"><bounds xc="22.5" yc="127.5" width="13" height="3" /></element>
<element ref="button_black" inputtag="KC0" inputmask="0x04"><bounds x="30" y="120" width="15" height="15" /></element>
<element ref="triplet"><bounds xc="37.5" yc="127.5" width="13" height="3" /></element>
<element ref="button_black" inputtag="KC0" inputmask="0x08"><bounds x="45" y="120" width="15" height="15" /></element>
<element ref="tie"><bounds xc="52.5" yc="127.5" width="13" height="3" /></element>
<element ref="manual_data"><bounds xc="30" y="135" width="30" height="3" /></element>
<!-- midi / repeat -->
<element ref="led" name="led1.3"><bounds xc="82.5" yc="57" width="4" height="2" /></element>
<element ref="led" name="led1.4"><bounds xc="102.5" yc="57" width="4" height="2" /></element>
<element ref="button_track" inputtag="KC4" inputmask="0x04"><bounds x="75" y="60" width="15" height="15" /></element>
<element ref="midi"><bounds xc="82.5" yc="67.5" width="13" height="3" /></element>
<element ref="button_track" inputtag="KC4" inputmask="0x02"><bounds x="95" y="60" width="15" height="15" /></element>
<element ref="repeat"><bounds xc="102.5" yc="67.5" width="13" height="3" /></element>
<!-- metronome -->
<element ref="led" name="led1.5"><bounds xc="92.5" yc="87" width="4" height="2" /></element>
<element ref="button_tempo" inputtag="KC3" inputmask="0x08"><bounds xc="92.5" y="90" width="15" height="15" /></element>
<element ref="metronome"><bounds xc="92.5" yc="96" width="13" height="3" /></element>
<element ref="enter"><bounds xc="92.5" yc="99" width="13" height="3" /></element>
<!-- tempo -->
<element ref="button_tempo" inputtag="KC1" inputmask="0x08"><bounds x="75" y="120" width="15" height="15" /></element>
<element ref="down"><bounds xc="82.5" yc="127.5" width="13" height="4" /></element>
<element ref="button_tempo" inputtag="KC2" inputmask="0x08"><bounds x="95" y="120" width="15" height="15" /></element>
<element ref="up"><bounds xc="102.5" yc="127.5" width="13" height="4" /></element>
<!-- tracks, cartridge/mt -->
<element ref="led" name="led0.7"><bounds xc="130" yc="57" width="4" height="2" /></element>
<element ref="led" name="led1.0"><bounds xc="140" yc="57" width="4" height="2" /></element>
<element ref="led" name="led1.1"><bounds xc="150" yc="57" width="4" height="2" /></element>
<element ref="led" name="led1.2"><bounds xc="160" yc="57" width="4" height="2" /></element>
<element ref="track"><bounds xc="145" yc="52" width="20" height="3" /></element>
<element ref="yellow"><bounds xc="145" y="54" width="38" height="0.5" /></element>
<element ref="button_track_small" inputtag="KC2" inputmask="0x10"><bounds x="125" y="60" width="10" height="15" /></element>
<element ref="track1"><bounds xc="130" yc="67.5" width="8" height="4" /></element>
<element ref="button_track_small" inputtag="KC2" inputmask="0x20"><bounds x="135" y="60" width="10" height="15" /></element>
<element ref="track2"><bounds xc="140" yc="67.5" width="8" height="4" /></element>
<element ref="button_track_small" inputtag="KC2" inputmask="0x40"><bounds x="145" y="60" width="10" height="15" /></element>
<element ref="track3"><bounds xc="150" yc="67.5" width="8" height="4" /></element>
<element ref="button_track_small" inputtag="KC2" inputmask="0x80"><bounds x="155" y="60" width="10" height="15" /></element>
<element ref="track4"><bounds xc="160" yc="67.5" width="8" height="4" /></element>
<element ref="led" name="led1.6"><bounds xc="177.5" yc="57" width="4" height="2" /></element>
<element ref="button_track" inputtag="KC4" inputmask="0x80"><bounds x="170" y="60" width="15" height="15" /></element>
<element ref="cartridge"><bounds xc="177.5" yc="66" width="13" height="3" /></element>
<element ref="mt"><bounds xc="177.5" yc="69" width="13" height="3" /></element>
<element ref="yellow"><bounds xc="155" y="84" width="58" height="1" /></element>
<element ref="yellow"><bounds xc="155" y="138" width="58" height="1" /></element>
<!-- real time/manual/record/reset -->
<element ref="led" name="led0.4"><bounds xc="132.5" yc="87" width="4" height="2" /></element>
<element ref="led" name="led0.5"><bounds xc="147.5" yc="87" width="4" height="2" /></element>
<element ref="led" name="led0.6"><bounds xc="162.5" yc="87" width="4" height="2" /></element>
<element ref="button_blue" inputtag="KC1" inputmask="0x10"><bounds x="125" y="90" width="15" height="15" /></element>
<element ref="realtime"><bounds xc="132.5" yc="97.5" width="13" height="3" /></element>
<element ref="button_blue" inputtag="KC1" inputmask="0x20"><bounds x="140" y="90" width="15" height="15" /></element>
<element ref="manual"><bounds xc="147.5" yc="97.5" width="13" height="3" /></element>
<element ref="button_record" inputtag="KC1" inputmask="0x40"><bounds x="155" y="90" width="15" height="15" /></element>
<element ref="record"><bounds xc="162.5" yc="97.5" width="13" height="3" /></element>
<element ref="button_blue" inputtag="KC1" inputmask="0x80"><bounds x="170" y="90" width="15" height="15" /></element>
<element ref="reset"><bounds xc="177.5" yc="97.5" width="13" height="3" /></element>
<element ref="yellow"><bounds xc="140" y="106" width="28" height="0.5" /></element>
<element ref="record_track"><bounds xc="140" yc="109" width="20" height="3" /></element>
<!-- rev/fwd/play/stop -->
<element ref="led" name="led0.0"><bounds xc="132.5" yc="117" width="4" height="2" /></element>
<element ref="led" name="led0.1"><bounds xc="147.5" yc="117" width="4" height="2" /></element>
<element ref="led" name="led0.2"><bounds xc="162.5" yc="117" width="4" height="2" /></element>
<element ref="led" name="led0.3"><bounds xc="177.5" yc="117" width="4" height="2" /></element>
<element ref="button_blue" inputtag="KC0" inputmask="0x10"><bounds x="125" y="120" width="15" height="15" /></element>
<element ref="rev"><bounds xc="132.5" yc="127.5" width="13" height="3" /></element>
<element ref="save"><bounds xc="132.5" y="135" width="13" height="3" /></element>
<element ref="button_blue" inputtag="KC0" inputmask="0x20"><bounds x="140" y="120" width="15" height="15" /></element>
<element ref="fwd"><bounds xc="147.5" yc="127.5" width="13" height="3" /></element>
<element ref="load"><bounds xc="147.5" y="135" width="13" height="3" /></element>
<element ref="button_blue" inputtag="KC0" inputmask="0x40"><bounds x="155" y="120" width="15" height="15" /></element>
<element ref="play"><bounds xc="162.5" yc="127.5" width="13" height="3" /></element>
<element ref="check"><bounds xc="162.5" y="135" width="13" height="3" /></element>
<element ref="button_blue" inputtag="KC0" inputmask="0x80"><bounds x="170" y="120" width="15" height="15" /></element>
<element ref="stop"><bounds xc="177.5" yc="127.5" width="13" height="3" /></element>
</view>
</mamelayout>

View File

@ -15916,6 +15916,10 @@ mz1 // 1986 Casio (unreleased)
@source:casio/cz101.cpp @source:casio/cz101.cpp
cz101 // 1984 Casio cz101 // 1984 Casio
@source:casio/cz230s.cpp
cz230s // 1985 Casio
sz1 // 1985 Casio
@source:casio/fp200.cpp @source:casio/fp200.cpp
fp200 // fp200 //