1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
// license:BSD-3-Clause
// copyright-holders:AJR
/*******************************************************************************
Skeleton driver for Suzuki BH-1000/Hammond GM-1000 sound module.
*******************************************************************************/
#include "emu.h"
//#include "bus/midi/midi.h"
#include "cpu/m37710/m37710.h"
#include "machine/nvram.h"
#include "video/hd44780.h"
#include "emupal.h"
#include "screen.h"
namespace {
class gm1000_state : public driver_device
{
public:
gm1000_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
, m_nvram(*this, "nvram", 0x800, ENDIANNESS_LITTLE)
{
}
void gm1000(machine_config &config);
private:
HD44780_PIXEL_UPDATE(lcd_pixel_update);
void mem_map(address_map &map);
required_device<m37702s1_device> m_maincpu;
memory_share_creator<u8> m_nvram;
};
HD44780_PIXEL_UPDATE(gm1000_state::lcd_pixel_update)
{
if (x < 5 && y < 8 && line < 2 && pos < 24)
bitmap.pix(line * 8 + y, pos * 6 + x) = state;
}
void gm1000_state::mem_map(address_map &map)
{
map(0x000400, 0x000403).rw("lcdc", FUNC(hd44780_device::read), FUNC(hd44780_device::write)).umask16(0x00ff);
map(0x004000, 0x007fff).ram();
map(0x008000, 0x03ffff).rom().region("program", 0x8000);
map(0x040000, 0x04ffff).rom().region("program", 0);
map(0x050000, 0x050fff).lrw8(
[this](offs_t offset) { return m_nvram[offset]; }, "nvram_r",
[this](offs_t offset, u8 data) { m_nvram[offset] = data; }, "nvram_w").umask16(0x00ff);
map(0x064000, 0x06efff).ram();
map(0x070002, 0x070005).nopr();
}
static INPUT_PORTS_START(gm1000)
// Keycode assignments are rather arbitrary and do not at all reflect the panel layout
PORT_START("P4")
PORT_BIT(0x0f, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_LEFT) PORT_NAME("Parameter " UTF8_LEFT)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_RIGHT) PORT_NAME("Parameter " UTF8_RIGHT)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_DOWN) PORT_NAME("Data " UTF8_LEFT)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_UP) PORT_NAME("Data " UTF8_RIGHT)
PORT_START("P6")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("All Mute")
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_BACKSLASH) PORT_NAME("P. Mute")
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_RSHIFT) PORT_NAME("P. Monitor")
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER) PORT_NAME("Display")
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_COMMA) PORT_NAME("Part " UTF8_LEFT)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_STOP) PORT_NAME("Part " UTF8_RIGHT)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("Instrument " UTF8_LEFT)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_NAME("Instrument " UTF8_RIGHT)
INPUT_PORTS_END
void gm1000_state::gm1000(machine_config &config)
{
M37702S1(config, m_maincpu, 4'000'000); // unknown clock; type guessed
m_maincpu->set_addrmap(AS_PROGRAM, &gm1000_state::mem_map);
m_maincpu->p4_in_cb().set_ioport("P4");
m_maincpu->p6_in_cb().set_ioport("P6");
m_maincpu->an0_cb().set_constant(0xc0); // battery voltage
m_maincpu->an2_cb().set_constant(0x80); // ?
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
screen.set_refresh_hz(60);
screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
screen.set_screen_update("lcdc", FUNC(hd44780_device::screen_update));
screen.set_size(6*24, 8*2);
screen.set_visarea_full();
screen.set_palette("palette");
screen.set_color(rgb_t::green());
PALETTE(config, "palette", palette_device::MONOCHROME_INVERTED);
hd44780_device &lcdc(HD44780(config, "lcdc", 0));
lcdc.set_lcd_size(2, 24);
lcdc.set_pixel_update_cb(FUNC(gm1000_state::lcd_pixel_update));
lcdc.set_function_set_at_any_time(true);
}
ROM_START(gm1000)
ROM_REGION16_LE(0x40000, "program", 0)
ROM_LOAD16_BYTE("bh1_mgs71a__u6_sysl__v2.1_bf66.u6", 0x00000, 0x20000, CRC(d003880c) SHA1(5cf727c42dd1b903c0048f147b461676e8c35faf)) // MX27C1000-90
ROM_LOAD16_BYTE("bh1_mgs71a__u7_sysh__v2.1_2fac.u7", 0x00001, 0x20000, CRC(989417a1) SHA1(3de4f10a2e7cde5eb93f04bd75db36e194b1d991)) // MX27C1000-90
ROM_REGION(0x800000, "waves", 0) // DIP42 mask ROMs "© SUZUKI 1993"
ROM_LOAD("319-35006_wd06__m531602c-53.u13", 0x000000, 0x200000, NO_DUMP)
ROM_LOAD("319-35007_wd07__m531602c-52.u14", 0x200000, 0x200000, NO_DUMP)
ROM_LOAD("319-35008_wd08__m531602c-54.u15", 0x200000, 0x200000, NO_DUMP)
ROM_LOAD("319-35009_wd09__m531602c-55.u16", 0x200000, 0x200000, NO_DUMP)
ROM_END
} // anonymous namespace
SYST(1994, gm1000, 0, 0, gm1000, gm1000, gm1000_state, empty_init, "Suzuki (Hammond license)", "GM-1000 GM Sound Module", MACHINE_IS_SKELETON)
|