summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--src/mame/drivers/rd110.cpp142
1 files changed, 75 insertions, 67 deletions
diff --git a/src/mame/drivers/rd110.cpp b/src/mame/drivers/rd110.cpp
index e19c0baf88b..65363abdaef 100644
--- a/src/mame/drivers/rd110.cpp
+++ b/src/mame/drivers/rd110.cpp
@@ -45,116 +45,124 @@ static INPUT_PORTS_START( d110 )
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Edit") PORT_CODE(KEYCODE_A)
INPUT_PORTS_END
+
class d110_state : public driver_device
{
public:
- required_device<i8x9x_device> cpu;
- required_device<ram_device> ram;
- required_device<nvram_device> rams;
- required_device<ram_device> memc;
- required_device<nvram_device> memcs;
- required_device<msm6222b_device> lcd;
- required_device<timer_device> midi_timer;
-
- d110_state(const machine_config &mconfig, device_type type, const char *tag);
-
- virtual void machine_start() override;
- virtual void machine_reset() override;
- DECLARE_PALETTE_INIT(d110);
-
- uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ d110_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_ram(*this, "ram")
+ , m_rams(*this, "rams")
+ , m_memc(*this, "memc")
+ , m_memcs(*this, "memcs")
+ , m_lcd(*this, "lcd")
+ , m_midi_timer(*this, "midi_timer")
+ , m_maincpu(*this, "maincpu") { }
DECLARE_WRITE8_MEMBER(bank_w);
DECLARE_WRITE8_MEMBER(so_w);
DECLARE_WRITE16_MEMBER(midi_w);
-
DECLARE_READ8_MEMBER(lcd_ctrl_r);
DECLARE_WRITE8_MEMBER(lcd_ctrl_w);
DECLARE_WRITE8_MEMBER(lcd_data_w);
DECLARE_READ16_MEMBER(port0_r);
-
TIMER_DEVICE_CALLBACK_MEMBER(midi_timer_cb);
TIMER_DEVICE_CALLBACK_MEMBER(samples_timer_cb);
+ DECLARE_PALETTE_INIT(d110);
+ uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
private:
- uint8_t lcd_data_buffer[256];
- int lcd_data_buffer_pos;
- uint8_t midi;
- int midi_pos;
- uint8_t port0;
- required_device<cpu_device> m_maincpu;
-};
-d110_state::d110_state(const machine_config &mconfig, device_type type, const char *tag) :
- driver_device(mconfig, type, tag),
- cpu(*this, "maincpu"),
- ram(*this, "ram"),
- rams(*this, "rams"),
- memc(*this, "memc"),
- memcs(*this, "memcs"),
- lcd(*this, "lcd"),
- midi_timer(*this, "midi_timer")
-,
- m_maincpu(*this, "maincpu") {
-}
+ uint8_t m_lcd_data_buffer[256];
+ int m_lcd_data_buffer_pos;
+ uint8_t m_midi;
+ int m_midi_pos;
+ uint8_t m_port0;
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+ required_device<ram_device> m_ram;
+ required_device<nvram_device> m_rams;
+ required_device<ram_device> m_memc;
+ required_device<nvram_device> m_memcs;
+ required_device<msm6222b_device> m_lcd;
+ required_device<timer_device> m_midi_timer;
+ required_device<i8x9x_device> m_maincpu;
+};
uint32_t d110_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
+ uint8_t y,ra,gfx;
+ uint16_t sy=0,x;
+ const uint8_t *data = m_lcd->render();
bitmap.fill(0);
- const uint8_t *data = lcd->render();
- for(int l=0; l<2; l++)
- for(int c=0; c<20; c++)
- for(int y=0; y<8; y++) {
- uint8_t v = data[c*16 + l*40*16 + y];
- for(int x=0; x<5; x++)
- bitmap.pix16(y+9*l, c*6+x) = v & (0x10 >> x) ? 1 : 0;
+
+ for (y = 0; y < 2; y++)
+ {
+ for (ra = 0; ra < 9; ra++)
+ {
+ uint16_t *p = &bitmap.pix16(sy++);
+
+ for (x = 0; x < 16; x++)
+ {
+ gfx = 0;
+ if (ra < 8)
+ gfx = data[x*16 + y*640 + ra];
+
+ *p++ = BIT(gfx, 4);
+ *p++ = BIT(gfx, 3);
+ *p++ = BIT(gfx, 2);
+ *p++ = BIT(gfx, 1);
+ *p++ = BIT(gfx, 0);
+ *p++ = 0;
}
+ }
+ }
return 0;
}
void d110_state::machine_start()
{
- rams->set_base(ram->pointer(), 32768);
- memcs->set_base(memc->pointer(), 32768);
+ m_rams->set_base(m_ram->pointer(), 32768);
+ m_memcs->set_base(m_memc->pointer(), 32768);
membank("bank")->configure_entries(0x00, 4, memregion("maincpu")->base(), 0x4000);
- membank("bank")->configure_entries(0x10, 2, ram->pointer(), 0x4000);
+ membank("bank")->configure_entries(0x10, 2, m_ram->pointer(), 0x4000);
membank("bank")->configure_entries(0x20, 8, memregion("presets")->base(), 0x4000);
- membank("bank")->configure_entries(0x30, 2, memc->pointer(), 0x4000);
- membank("fixed")->set_base(ram->pointer());
+ membank("bank")->configure_entries(0x30, 2, m_memc->pointer(), 0x4000);
+ membank("fixed")->set_base(m_ram->pointer());
- lcd_data_buffer_pos = 0;
+ m_lcd_data_buffer_pos = 0;
}
void d110_state::machine_reset()
{
// midi_timer->adjust(attotime::from_hz(1));
- midi_pos = 0;
- port0 = 0x80; // battery ok
+ m_midi_pos = 0;
+ m_port0 = 0x80; // battery ok
}
WRITE8_MEMBER(d110_state::lcd_ctrl_w)
{
- lcd->control_w(data);
- for(int i=0; i != lcd_data_buffer_pos; i++)
- lcd->data_w(lcd_data_buffer[i]);
- lcd_data_buffer_pos = 0;
+ m_lcd->control_w(data);
+ for(int i=0; i != m_lcd_data_buffer_pos; i++)
+ m_lcd->data_w(m_lcd_data_buffer[i]);
+ m_lcd_data_buffer_pos = 0;
}
READ8_MEMBER(d110_state::lcd_ctrl_r)
{
// Busy flag in the msm622b is bit 7, while the software expects it in bit 0...
- return lcd->control_r() >> 7;
+ return m_lcd->control_r() >> 7;
}
WRITE8_MEMBER(d110_state::lcd_data_w)
{
- if(lcd_data_buffer_pos == sizeof(lcd_data_buffer)) {
- logerror("Warning: lcd data buffer overflow (%04x)\n", cpu->pc());
+ if(m_lcd_data_buffer_pos == sizeof(m_lcd_data_buffer)) {
+ logerror("Warning: lcd data buffer overflow (%04x)\n", m_maincpu->pc());
return;
}
- lcd_data_buffer[lcd_data_buffer_pos++] = data;
+ m_lcd_data_buffer[m_lcd_data_buffer_pos++] = data;
}
WRITE8_MEMBER(d110_state::bank_w)
@@ -165,27 +173,27 @@ WRITE8_MEMBER(d110_state::bank_w)
WRITE16_MEMBER(d110_state::midi_w)
{
logerror("midi_out %02x\n", data);
- midi = data;
+ m_midi = data;
}
TIMER_DEVICE_CALLBACK_MEMBER(d110_state::midi_timer_cb)
{
const static uint8_t midi_data[3] = { 0x91, 0x40, 0x7f };
- midi = midi_data[midi_pos++];
- logerror("midi_in %02x\n", midi);
- cpu->serial_w(midi);
- if(midi_pos < sizeof(midi_data))
- midi_timer->adjust(attotime::from_hz(1250));
+ m_midi = midi_data[m_midi_pos++];
+ logerror("midi_in %02x\n", m_midi);
+ m_maincpu->serial_w(m_midi);
+ if(m_midi_pos < sizeof(midi_data))
+ m_midi_timer->adjust(attotime::from_hz(1250));
}
READ16_MEMBER(d110_state::port0_r)
{
- return port0;
+ return m_port0;
}
TIMER_DEVICE_CALLBACK_MEMBER(d110_state::samples_timer_cb)
{
- port0 ^= 0x10;
+ m_port0 ^= 0x10;
}
WRITE8_MEMBER(d110_state::so_w)