diff --git a/.gitattributes b/.gitattributes index 497d87f3591..9a8979dd92c 100644 --- a/.gitattributes +++ b/.gitattributes @@ -7255,6 +7255,8 @@ src/mess/machine/c64/mikro_assembler.c svneol=native#text/plain src/mess/machine/c64/mikro_assembler.h svneol=native#text/plain src/mess/machine/c64/multiscreen.c svneol=native#text/plain src/mess/machine/c64/multiscreen.h svneol=native#text/plain +src/mess/machine/c64/music64.c svneol=native#text/plain +src/mess/machine/c64/music64.h svneol=native#text/plain src/mess/machine/c64/neoram.c svneol=native#text/plain src/mess/machine/c64/neoram.h svneol=native#text/plain src/mess/machine/c64/ocean.c svneol=native#text/plain diff --git a/hash/c64_cart.xml b/hash/c64_cart.xml index bbe5b94f736..dc483cae2db 100644 --- a/hash/c64_cart.xml +++ b/hash/c64_cart.xml @@ -6932,4 +6932,16 @@ + + Wersiboard Music 64 + 1985 + Wersi + + + + + + + + diff --git a/hash/c64_cass.xml b/hash/c64_cass.xml index 4b145e1e0a7..d0230c2cb81 100644 --- a/hash/c64_cass.xml +++ b/hash/c64_cass.xml @@ -15,4 +15,43 @@ + + CMK 49 Computer Musical Keyboard + 198? + Siel + + + + + + + + + + + Mono-64 + 198? + Novel International + + + + + + + + + + + Poly-64 + 198? + Novel International + + + + + + + + + diff --git a/hash/c64_flop.xml b/hash/c64_flop.xml index 2825037e75f..4d23f8d723e 100644 --- a/hash/c64_flop.xml +++ b/hash/c64_flop.xml @@ -1033,6 +1033,34 @@ + + Music 64 + 198? + Novel International + + + + + + + + + + + + CMK 49 Computer Musical Keyboard + 198? + Siel + + + + + + + + + + diff --git a/src/mess/machine/c64/music64.c b/src/mess/machine/c64/music64.c new file mode 100644 index 00000000000..86c3ba848ae --- /dev/null +++ b/src/mess/machine/c64/music64.c @@ -0,0 +1,239 @@ +/********************************************************************** + + Wersi Wersiboard Music 64 / Siel CMK 49 Keyboard emulation + + Copyright MESS Team. + Visit http://mamedev.org for licensing and usage restrictions. + +**********************************************************************/ + +/* +5 PRINT "MUSIC 64 & CMK 49 TEST" +6 PRINT " BY CARLO MERLANO" +7 PRINT "PLAY THE MUSIC KEYBOARD!" +8 F1=65.4:POKE 54296,15 +9 POKE 54277,25:POKE 54278,68 +10 IF PE=255 THEN POKE 54276,0 +20 FOR I=1 TO 8 +30 PO=57087+I:PE=PEEK(PO) +40 IF PE<255 THEN GOSUB 100 +50 NEXT I +60 GOTO 10 +100 KK=LOG(255-PE)/LOG(2)+8*I-7 +110 FKK=(2^(1/12))^(KK-1)*F1 +120 N=FKK*16.3835 +130 NHI=INT(N/256):NLO=N-NHI*256 +140 POKE 54276,17 +150 POKE 54273,NHI:POKE 54272,NLO +160 I=0 +170 RETURN +*/ + +#include "music64.h" + + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +const device_type C64_MUSIC64 = &device_creator; + + +//------------------------------------------------- +// MACHINE_CONFIG_FRAGMENT( c64_music64 ) +//------------------------------------------------- + +static MACHINE_CONFIG_FRAGMENT( c64_music64 ) + MCFG_C64_PASSTHRU_EXPANSION_SLOT_ADD() +MACHINE_CONFIG_END + + +//------------------------------------------------- +// machine_config_additions - device-specific +// machine configurations +//------------------------------------------------- + +machine_config_constructor c64_music64_cartridge_device::device_mconfig_additions() const +{ + return MACHINE_CONFIG_NAME( c64_music64 ); +} + + +//------------------------------------------------- +// INPUT_PORTS( c64_music64 ) +//------------------------------------------------- + +static INPUT_PORTS_START( c64_music64 ) + PORT_START("KB0") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("C2") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("C#2") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("D") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("D#2") + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("E2") + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F2") + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F#2") + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("G2") + + PORT_START("KB1") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("G#2") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("A3") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("A#3") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("B3") + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("C3") + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("C#3") + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("D3") + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("D#3") + + PORT_START("KB2") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("E3") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F3") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F#3") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("G3") + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("G#3") + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("A4") + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("A#4") + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("B4") + + PORT_START("KB3") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("C4") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("C#4") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("D4") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("D#4") + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("E4") + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F4") + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F#4") + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("G4") + + PORT_START("KB4") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("G#4") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("A5") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("A#5") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("B5") + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("C5") + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("C#5") + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("D5") + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("D#5") + + PORT_START("KB5") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("E5") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F5") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F#5") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("G5") + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("G#5") + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("A6") + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("A#6") + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("B6") + + PORT_START("KB6") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("C6") + PORT_BIT( 0xfe, IP_ACTIVE_LOW, IPT_UNUSED ) +INPUT_PORTS_END + + +//------------------------------------------------- +// input_ports - device-specific input ports +//------------------------------------------------- + +ioport_constructor c64_music64_cartridge_device::device_input_ports() const +{ + return INPUT_PORTS_NAME( c64_music64 ); +} + + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// c64_music64_cartridge_device - constructor +//------------------------------------------------- + +c64_music64_cartridge_device::c64_music64_cartridge_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + device_t(mconfig, C64_MUSIC64, "C64 Music 64 cartridge", tag, owner, clock, "c64_music64", __FILE__), + device_c64_expansion_card_interface(mconfig, *this), + m_exp(*this, C64_EXPANSION_SLOT_TAG), + m_kb0(*this, "KB0"), + m_kb1(*this, "KB1"), + m_kb2(*this, "KB2"), + m_kb3(*this, "KB3"), + m_kb4(*this, "KB4"), + m_kb5(*this, "KB5"), + m_kb6(*this, "KB6") +{ +} + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void c64_music64_cartridge_device::device_start() +{ +} + + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void c64_music64_cartridge_device::device_reset() +{ +} + + +//------------------------------------------------- +// c64_cd_r - cartridge data read +//------------------------------------------------- + +UINT8 c64_music64_cartridge_device::c64_cd_r(address_space &space, offs_t offset, UINT8 data, int sphi2, int ba, int roml, int romh, int io1, int io2) +{ + data = m_exp->cd_r(space, offset, data, sphi2, ba, roml, romh, io1, io2); + + if (!io2) + { + switch (offset & 0x07) + { + case 0x00: data = m_kb0->read(); break; + case 0x01: data = m_kb1->read(); break; + case 0x02: data = m_kb2->read(); break; + case 0x03: data = m_kb3->read(); break; + case 0x04: data = m_kb4->read(); break; + case 0x05: data = m_kb5->read(); break; + case 0x06: data = m_kb6->read(); break; + } + } + + return data; +} + + +//------------------------------------------------- +// c64_cd_w - cartridge data write +//------------------------------------------------- + +void c64_music64_cartridge_device::c64_cd_w(address_space &space, offs_t offset, UINT8 data, int sphi2, int ba, int roml, int romh, int io1, int io2) +{ + m_exp->cd_w(space, offset, data, sphi2, ba, roml, romh, io1, io2); +} + + +//------------------------------------------------- +// c64_game_r - GAME read +//------------------------------------------------- + +int c64_music64_cartridge_device::c64_game_r(offs_t offset, int sphi2, int ba, int rw, int hiram) +{ + return m_exp->game_r(offset, sphi2, ba, rw, hiram); +} + + +//------------------------------------------------- +// c64_exrom_r - EXROM read +//------------------------------------------------- + +int c64_music64_cartridge_device::c64_exrom_r(offs_t offset, int sphi2, int ba, int rw, int hiram) +{ + return m_exp->exrom_r(offset, sphi2, ba, rw, hiram); +} diff --git a/src/mess/machine/c64/music64.h b/src/mess/machine/c64/music64.h new file mode 100644 index 00000000000..e5bcfdb46c6 --- /dev/null +++ b/src/mess/machine/c64/music64.h @@ -0,0 +1,65 @@ +/********************************************************************** + + Wersi Wersiboard Music 64 / Siel CMK 49 Keyboard emulation + + Copyright MESS Team. + Visit http://mamedev.org for licensing and usage restrictions. + +**********************************************************************/ + +#pragma once + +#ifndef __MUSIC64__ +#define __MUSIC64__ + +#include "emu.h" +#include "machine/c64/exp.h" +#include "machine/cbmipt.h" + + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> c64_music64_cartridge_device + +class c64_music64_cartridge_device : public device_t, + public device_c64_expansion_card_interface +{ +public: + // construction/destruction + c64_music64_cartridge_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // optional information overrides + virtual machine_config_constructor device_mconfig_additions() const; + virtual ioport_constructor device_input_ports() const; + +protected: + // device-level overrides + virtual void device_start(); + virtual void device_reset(); + + // device_c64_expansion_card_interface overrides + virtual UINT8 c64_cd_r(address_space &space, offs_t offset, UINT8 data, int sphi2, int ba, int roml, int romh, int io1, int io2); + virtual void c64_cd_w(address_space &space, offs_t offset, UINT8 data, int sphi2, int ba, int roml, int romh, int io1, int io2); + virtual int c64_game_r(offs_t offset, int sphi2, int ba, int rw, int hiram); + virtual int c64_exrom_r(offs_t offset, int sphi2, int ba, int rw, int hiram); + +private: + required_device m_exp; + required_ioport m_kb0; + required_ioport m_kb1; + required_ioport m_kb2; + required_ioport m_kb3; + required_ioport m_kb4; + required_ioport m_kb5; + required_ioport m_kb6; +}; + + +// device type definition +extern const device_type C64_MUSIC64; + + +#endif diff --git a/src/mess/machine/cbmipt.c b/src/mess/machine/cbmipt.c index 500a555dede..680a403ef03 100644 --- a/src/mess/machine/cbmipt.c +++ b/src/mess/machine/cbmipt.c @@ -1133,6 +1133,7 @@ SLOT_INTERFACE_START( c64_expansion_cards ) SLOT_INTERFACE("midipp", C64_MIDI_PASSPORT) SLOT_INTERFACE("midisci", C64_MIDI_SCI) SLOT_INTERFACE("midisiel", C64_MIDI_SIEL) + SLOT_INTERFACE("music64", C64_MUSIC64) SLOT_INTERFACE("neoram", C64_NEORAM) SLOT_INTERFACE("reu1700", C64_REU1700) SLOT_INTERFACE("reu1750", C64_REU1750) diff --git a/src/mess/machine/cbmipt.h b/src/mess/machine/cbmipt.h index ed59cb998b8..890816577e7 100644 --- a/src/mess/machine/cbmipt.h +++ b/src/mess/machine/cbmipt.h @@ -42,6 +42,7 @@ #include "machine/c64/midi_siel.h" #include "machine/c64/mikro_assembler.h" #include "machine/c64/multiscreen.h" +#include "machine/c64/music64.h" #include "machine/c64/neoram.h" #include "machine/c64/ocean.h" #include "machine/c64/pagefox.h" diff --git a/src/mess/mess.mak b/src/mess/mess.mak index da48b085166..c06f009462c 100644 --- a/src/mess/mess.mak +++ b/src/mess/mess.mak @@ -1114,6 +1114,7 @@ $(MESSOBJ)/cbm.a: \ $(MESS_MACHINE)/c64/midi_siel.o \ $(MESS_MACHINE)/c64/mikro_assembler.o \ $(MESS_MACHINE)/c64/multiscreen.o \ + $(MESS_MACHINE)/c64/music64.o \ $(MESS_MACHINE)/c64/neoram.o\ $(MESS_MACHINE)/c64/ocean.o \ $(MESS_MACHINE)/c64/pagefox.o \