diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/devices/video/sed1520.cpp | 8 | ||||
-rw-r--r-- | src/devices/video/sed1520.h | 35 | ||||
-rw-r--r-- | src/mame/drivers/chessmst.cpp | 126 | ||||
-rw-r--r-- | src/mame/drivers/digel804.cpp | 97 | ||||
-rw-r--r-- | src/mame/drivers/ecoinf2.cpp | 142 | ||||
-rw-r--r-- | src/mame/drivers/monty.cpp | 15 | ||||
-rw-r--r-- | src/mame/drivers/pc2000.cpp | 135 | ||||
-rw-r--r-- | src/mame/drivers/tecnbras.cpp | 79 | ||||
-rw-r--r-- | src/mame/drivers/tispeak.cpp | 77 |
9 files changed, 409 insertions, 305 deletions
diff --git a/src/devices/video/sed1520.cpp b/src/devices/video/sed1520.cpp index 708d685ad18..feca2ed10fd 100644 --- a/src/devices/video/sed1520.cpp +++ b/src/devices/video/sed1520.cpp @@ -33,7 +33,7 @@ DEFINE_DEVICE_TYPE(SED1520, sed1520_device, "sed1520", "Epson SED1520") sed1520_device::sed1520_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, SED1520, tag, owner, clock), m_lcd_on(0), m_busy(0), m_page(0), m_column(0), m_old_column(0), m_start_line(0), m_adc(0), m_static_drive(0), m_modify_write(false), - m_screen_update_func(nullptr) + m_screen_update_cb() { } @@ -44,6 +44,8 @@ sed1520_device::sed1520_device(const machine_config &mconfig, const char *tag, d void sed1520_device::device_start() { + m_screen_update_cb.bind_relative_to(*owner()); + // state saving save_item(NAME(m_lcd_on)); save_item(NAME(m_busy)); @@ -84,8 +86,8 @@ uint32_t sed1520_device::screen_update(screen_device &screen, bitmap_ind16 &bitm { if (m_lcd_on) { - if (m_screen_update_func) - m_screen_update_func(*this, bitmap, cliprect, m_vram, m_start_line, m_adc); + if (!m_screen_update_cb.isnull()) + m_screen_update_cb(bitmap, cliprect, m_vram, m_start_line, m_adc); } else if (m_static_drive) return UPDATE_HAS_NOT_CHANGED; diff --git a/src/devices/video/sed1520.h b/src/devices/video/sed1520.h index 8b1529f8790..1c7b60e040e 100644 --- a/src/devices/video/sed1520.h +++ b/src/devices/video/sed1520.h @@ -12,15 +12,18 @@ #pragma once -#define MCFG_SED1520_ADD( _tag, _cb ) \ - MCFG_DEVICE_ADD( _tag, SED1520, 0 ) \ - downcast<sed1520_device &>(*device).set_screen_update_cb(_cb); +#define SED1520CB_UPDATE(cls, fnc) sed1520_device::screen_update_delegate((&cls::fnc), (#cls "::" #fnc), DEVICE_SELF, ((cls *)nullptr)) +#define SED1520CB_DEVUPDATE(tag, cls, fnc) sed1520_device::screen_update_delegate((&cls::fnc), (#cls "::" #fnc), (tag), ((cls *)nullptr)) + +#define MCFG_SED1520_ADD(tag, cb) \ + MCFG_DEVICE_ADD(tag, SED1520, 0) \ + downcast<sed1520_device &>(*device).set_screen_update_cb(SED1520CB_##cb); //************************************************************************** // TYPE DEFINITIONS //************************************************************************** -#define SED1520_UPDATE_CB(name) uint32_t name(device_t &device, bitmap_ind16 &bitmap, const rectangle &cliprect, uint8_t *vram, int start_line, int adc) +#define SED1520_UPDATE_CB(name) uint32_t name(bitmap_ind16 &bitmap, const rectangle &cliprect, uint8_t *vram, int start_line, int adc) // ======================> sed1520_device @@ -28,13 +31,13 @@ class sed1520_device : public device_t { public: - typedef uint32_t (*screen_update_func)(device_t &device, bitmap_ind16 &bitmap, const rectangle &cliprect, uint8_t *vram, int start_line, int adc); + typedef device_delegate<uint32_t (bitmap_ind16 &bitmap, const rectangle &cliprect, uint8_t *vram, int start_line, int adc)> screen_update_delegate; // construction/destruction sed1520_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); // sconfiguration helpers - template <typename Object> void set_screen_update_cb(Object &&cb) { m_screen_update_func = std::forward<Object>(cb); } + template <typename Object> void set_screen_update_cb(Object &&cb) { m_screen_update_cb = std::forward<Object>(cb); } // device interface virtual DECLARE_WRITE8_MEMBER(write); @@ -52,18 +55,18 @@ protected: private: // internal state - uint8_t m_lcd_on; - uint8_t m_busy; - uint8_t m_page; - uint8_t m_column; - uint8_t m_old_column; - uint8_t m_start_line; - uint8_t m_adc; - uint8_t m_static_drive; + uint8_t m_lcd_on; + uint8_t m_busy; + uint8_t m_page; + uint8_t m_column; + uint8_t m_old_column; + uint8_t m_start_line; + uint8_t m_adc; + uint8_t m_static_drive; bool m_modify_write; - screen_update_func m_screen_update_func; + screen_update_delegate m_screen_update_cb; - uint8_t m_vram[0x140]; + uint8_t m_vram[0x140]; }; diff --git a/src/mame/drivers/chessmst.cpp b/src/mame/drivers/chessmst.cpp index b3428ee6826..ed77600d74a 100644 --- a/src/mame/drivers/chessmst.cpp +++ b/src/mame/drivers/chessmst.cpp @@ -31,27 +31,27 @@ class chessmst_state : public driver_device { public: chessmst_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_pia2(*this, "z80pio2"), - m_speaker(*this, "speaker"), - m_beeper(*this, "beeper"), - m_extra(*this, "EXTRA") + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + , m_pia2(*this, "z80pio2") + , m_speaker(*this, "speaker") + , m_beeper(*this, "beeper") + , m_extra(*this, "EXTRA") + , m_buttons(*this, "BUTTONS") + , m_digits(*this, "digit%u", 0U) + , m_leds(*this, "led_%c%u", unsigned('a'), 1U) { } - required_device<cpu_device> m_maincpu; - required_device<z80pio_device> m_pia2; - optional_device<speaker_sound_device> m_speaker; - optional_device<beep_device> m_beeper; - required_ioport m_extra; + DECLARE_INPUT_CHANGED_MEMBER(chessmst_sensor); + DECLARE_INPUT_CHANGED_MEMBER(reset_button); + DECLARE_INPUT_CHANGED_MEMBER(view_monitor_button); - uint16_t m_matrix; - uint16_t m_led_sel; - uint8_t m_sensor[64]; - uint8_t m_digit_matrix; - int m_digit_dot; - uint16_t m_digit; + void chessmst(machine_config &config); + void chessmsta(machine_config &config); + void chessmstdm(machine_config &config); +protected: + virtual void machine_start() override; virtual void machine_reset() override; DECLARE_WRITE8_MEMBER( digits_w ); @@ -60,20 +60,31 @@ public: DECLARE_WRITE8_MEMBER( pio1_port_b_dm_w ); DECLARE_READ8_MEMBER( pio2_port_a_r ); DECLARE_WRITE8_MEMBER( pio2_port_b_w ); - DECLARE_INPUT_CHANGED_MEMBER(chessmst_sensor); - DECLARE_INPUT_CHANGED_MEMBER(reset_button); - DECLARE_INPUT_CHANGED_MEMBER(view_monitor_button); DECLARE_WRITE_LINE_MEMBER( timer_555_w ); - void chessmst(machine_config &config); - void chessmsta(machine_config &config); - void chessmstdm(machine_config &config); void chessmst_io(address_map &map); void chessmst_mem(address_map &map); void chessmstdm(address_map &map); void chessmstdm_io(address_map &map); + private: void update_display(); + + required_device<cpu_device> m_maincpu; + required_device<z80pio_device> m_pia2; + optional_device<speaker_sound_device> m_speaker; + optional_device<beep_device> m_beeper; + required_ioport m_extra; + required_ioport m_buttons; + output_finder<4> m_digits; + output_finder<10, 8> m_leds; + + uint16_t m_matrix; + uint16_t m_led_sel; + uint8_t m_sensor[64]; + uint8_t m_digit_matrix; + int m_digit_dot; + uint16_t m_digit; }; @@ -245,6 +256,19 @@ static INPUT_PORTS_START( chessmstdm ) INPUT_PORTS_END +void chessmst_state::machine_start() +{ + m_digits.resolve(); + m_leds.resolve(); + + save_item(NAME(m_matrix)); + save_item(NAME(m_led_sel)); + save_item(NAME(m_sensor)); + save_item(NAME(m_digit_matrix)); + save_item(NAME(m_digit_dot)); + save_item(NAME(m_digit)); +} + void chessmst_state::machine_reset() { //reset all sensors @@ -257,10 +281,10 @@ void chessmst_state::machine_reset() void chessmst_state::update_display() { - for(int i=0; i<4; i++) + for (int i = 0; i < 4; i++) { if (BIT(m_digit_matrix, i)) - output().set_indexed_value("digit", i, bitswap<16>(m_digit, 3,5,12,10,14,1,2,13,8,6,11,15,7,9,4,0) | (m_digit_dot << 16)); + m_digits[i] = bitswap<16>(m_digit, 3,5,12,10,14,1,2,13,8,6,11,15,7,9,4,0) | (m_digit_dot << 16); } } @@ -274,28 +298,18 @@ WRITE8_MEMBER( chessmst_state::digits_w ) WRITE8_MEMBER( chessmst_state::pio1_port_a_w ) { - for (int row=1; row<=8; row++) + for (int row = 0; row < 8; row++) { - if (m_led_sel & 0x01) - output().set_indexed_value("led_a", row, BIT(data, 8-row)); - if (m_led_sel & 0x02) - output().set_indexed_value("led_b", row, BIT(data, 8-row)); - if (m_led_sel & 0x04) - output().set_indexed_value("led_c", row, BIT(data, 8-row)); - if (m_led_sel & 0x08) - output().set_indexed_value("led_d", row, BIT(data, 8-row)); - if (m_led_sel & 0x10) - output().set_indexed_value("led_e", row, BIT(data, 8-row)); - if (m_led_sel & 0x20) - output().set_indexed_value("led_f", row, BIT(data, 8-row)); - if (m_led_sel & 0x40) - output().set_indexed_value("led_g", row, BIT(data, 8-row)); - if (m_led_sel & 0x80) - output().set_indexed_value("led_h", row, BIT(data, 8-row)); - if (m_led_sel & 0x100) - output().set_indexed_value("led_i", row, BIT(data, 8-row)); - if (m_led_sel & 0x200) - output().set_indexed_value("led_j", row, BIT(data, 8-row)); + if (BIT(m_led_sel, 0)) m_leds[0][row] = BIT(data, 7 - row); + if (BIT(m_led_sel, 1)) m_leds[1][row] = BIT(data, 7 - row); + if (BIT(m_led_sel, 2)) m_leds[2][row] = BIT(data, 7 - row); + if (BIT(m_led_sel, 3)) m_leds[3][row] = BIT(data, 7 - row); + if (BIT(m_led_sel, 4)) m_leds[4][row] = BIT(data, 7 - row); + if (BIT(m_led_sel, 5)) m_leds[5][row] = BIT(data, 7 - row); + if (BIT(m_led_sel, 6)) m_leds[6][row] = BIT(data, 7 - row); + if (BIT(m_led_sel, 7)) m_leds[7][row] = BIT(data, 7 - row); + if (BIT(m_led_sel, 8)) m_leds[8][row] = BIT(data, 7 - row); + if (BIT(m_led_sel, 9)) m_leds[9][row] = BIT(data, 7 - row); } m_led_sel = 0; @@ -337,7 +351,7 @@ READ8_MEMBER( chessmst_state::pio2_port_a_r ) } if (m_matrix & 0x100) - data |= ioport("BUTTONS")->read(); + data |= m_buttons->read(); return data; } @@ -363,17 +377,17 @@ static const z80_daisy_config chessmstdm_daisy_chain[] = MACHINE_CONFIG_START(chessmst_state::chessmst) /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", Z80, XTAL(9'830'400)/4) // U880 Z80 clone + MCFG_CPU_ADD("maincpu", Z80, 9.8304_MHz_XTAL/4) // U880 Z80 clone MCFG_CPU_PROGRAM_MAP(chessmst_mem) MCFG_CPU_IO_MAP(chessmst_io) MCFG_Z80_DAISY_CHAIN(chessmst_daisy_chain) - MCFG_DEVICE_ADD("z80pio1", Z80PIO, XTAL(9'830'400)/4) + MCFG_DEVICE_ADD("z80pio1", Z80PIO, 9.8304_MHz_XTAL/4) MCFG_Z80PIO_OUT_INT_CB(INPUTLINE("maincpu", INPUT_LINE_IRQ0)) MCFG_Z80PIO_OUT_PA_CB(WRITE8(chessmst_state, pio1_port_a_w)) MCFG_Z80PIO_OUT_PB_CB(WRITE8(chessmst_state, pio1_port_b_w)) - MCFG_DEVICE_ADD("z80pio2", Z80PIO, XTAL(9'830'400)/4) + MCFG_DEVICE_ADD("z80pio2", Z80PIO, 9.8304_MHz_XTAL/4) MCFG_Z80PIO_IN_PA_CB(READ8(chessmst_state, pio2_port_a_r)) MCFG_Z80PIO_OUT_PB_CB(WRITE8(chessmst_state, pio2_port_b_w)) @@ -388,17 +402,17 @@ MACHINE_CONFIG_END MACHINE_CONFIG_START(chessmst_state::chessmsta) /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", Z80, XTAL(8'000'000)/4) // U880 Z80 clone + MCFG_CPU_ADD("maincpu", Z80, 8_MHz_XTAL/4) // U880 Z80 clone MCFG_CPU_PROGRAM_MAP(chessmst_mem) MCFG_CPU_IO_MAP(chessmst_io) MCFG_Z80_DAISY_CHAIN(chessmst_daisy_chain) - MCFG_DEVICE_ADD("z80pio1", Z80PIO, XTAL(8'000'000)/4) + MCFG_DEVICE_ADD("z80pio1", Z80PIO, 8_MHz_XTAL/4) MCFG_Z80PIO_OUT_INT_CB(INPUTLINE("maincpu", INPUT_LINE_IRQ0)) MCFG_Z80PIO_OUT_PA_CB(WRITE8(chessmst_state, pio1_port_a_w)) MCFG_Z80PIO_OUT_PB_CB(WRITE8(chessmst_state, pio1_port_b_w)) - MCFG_DEVICE_ADD("z80pio2", Z80PIO, XTAL(8'000'000)/4) + MCFG_DEVICE_ADD("z80pio2", Z80PIO, 8_MHz_XTAL/4) MCFG_Z80PIO_IN_PA_CB(READ8(chessmst_state, pio2_port_a_r)) MCFG_Z80PIO_OUT_PB_CB(WRITE8(chessmst_state, pio2_port_b_w)) @@ -413,17 +427,17 @@ MACHINE_CONFIG_END MACHINE_CONFIG_START(chessmst_state::chessmstdm) /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", Z80, XTAL(8'000'000)/2) // U880 Z80 clone + MCFG_CPU_ADD("maincpu", Z80, 8_MHz_XTAL/2) // U880 Z80 clone MCFG_CPU_PROGRAM_MAP(chessmstdm) MCFG_CPU_IO_MAP(chessmstdm_io) MCFG_Z80_DAISY_CHAIN(chessmstdm_daisy_chain) - MCFG_DEVICE_ADD("z80pio1", Z80PIO, XTAL(8'000'000)/4) + MCFG_DEVICE_ADD("z80pio1", Z80PIO, 8_MHz_XTAL/4) MCFG_Z80PIO_OUT_PA_CB(WRITE8(chessmst_state, pio1_port_a_w)) MCFG_Z80PIO_OUT_PB_CB(WRITE8(chessmst_state, pio1_port_b_dm_w)) MCFG_Z80PIO_IN_PB_CB(IOPORT("EXTRA")) - MCFG_DEVICE_ADD("z80pio2", Z80PIO, XTAL(8'000'000)/4) + MCFG_DEVICE_ADD("z80pio2", Z80PIO, 8_MHz_XTAL/4) MCFG_Z80PIO_OUT_INT_CB(INPUTLINE("maincpu", INPUT_LINE_IRQ0)) MCFG_Z80PIO_IN_PA_CB(READ8(chessmst_state, pio2_port_a_r)) MCFG_Z80PIO_OUT_PB_CB(WRITE8(chessmst_state, pio2_port_b_w)) diff --git a/src/mame/drivers/digel804.cpp b/src/mame/drivers/digel804.cpp index aebd0280a42..9d329605596 100644 --- a/src/mame/drivers/digel804.cpp +++ b/src/mame/drivers/digel804.cpp @@ -70,28 +70,27 @@ class digel804_state : public driver_device { public: - digel804_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), + digel804_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), m_speaker(*this, "speaker"), m_acia(*this, "acia"), m_vfd(*this, "vfd"), m_kb(*this, "74c923"), m_ram(*this, RAM_TAG), - m_rambank(*this, "bankedram") + m_rambank(*this, "bankedram"), + m_func_leds(*this, "func_led%u", 0U) { } - required_device<cpu_device> m_maincpu; - required_device<speaker_sound_device> m_speaker; - required_device<mos6551_device> m_acia; - required_device<roc10937_device> m_vfd; - required_device<mm74c922_device> m_kb; - required_device<ram_device> m_ram; - required_memory_bank m_rambank; + DECLARE_INPUT_CHANGED_MEMBER(mode_change); + void digel804(machine_config &config); + +protected: + virtual void machine_start() override; virtual void machine_reset() override; - DECLARE_DRIVER_INIT(digel804); + DECLARE_WRITE8_MEMBER( op00 ); DECLARE_READ8_MEMBER( ip40 ); DECLARE_WRITE8_MEMBER( op40 ); @@ -114,9 +113,22 @@ public: DECLARE_READ8_MEMBER( acia_control_r ); DECLARE_WRITE8_MEMBER( acia_control_w ); DECLARE_WRITE_LINE_MEMBER( acia_irq_w ); - DECLARE_WRITE_LINE_MEMBER( ep804_acia_irq_w ); DECLARE_WRITE_LINE_MEMBER( da_w ); - DECLARE_INPUT_CHANGED_MEMBER(mode_change); + + void z80_mem_804_1_4(address_map &map); + void z80_io_1_4(address_map &map); + +private: + required_device<cpu_device> m_maincpu; + required_device<speaker_sound_device> m_speaker; + required_device<mos6551_device> m_acia; + required_device<roc10937_device> m_vfd; + required_device<mm74c922_device> m_kb; + required_device<ram_device> m_ram; + required_memory_bank m_rambank; + + output_finder<16> m_func_leds; + // current speaker state for port 45 uint8_t m_speaker_state; // ram stuff for banking @@ -132,20 +144,44 @@ public: uint8_t m_chipinsert_state; uint8_t m_keyen_state; uint8_t m_op41; +}; + + +class ep804_state : public digel804_state +{ +public: + using digel804_state::digel804_state; + void ep804(machine_config &config); - void digel804(machine_config &config); - void z80_io_1_2(address_map &map); - void z80_io_1_4(address_map &map); + +protected: + DECLARE_WRITE_LINE_MEMBER( ep804_acia_irq_w ); + void z80_mem_804_1_2(address_map &map); - void z80_mem_804_1_4(address_map &map); + void z80_io_1_2(address_map &map); }; enum { MODE_OFF, MODE_KEY, MODE_REM, MODE_SIM }; -DRIVER_INIT_MEMBER(digel804_state,digel804) +void digel804_state::machine_start() { + m_func_leds.resolve(); + + save_item(NAME(m_speaker_state)); + save_item(NAME(m_ram_bank)); + save_item(NAME(m_acia_intq)); + save_item(NAME(m_overload_state)); + save_item(NAME(m_key_intq)); + save_item(NAME(m_remote_mode)); + save_item(NAME(m_key_mode)); + save_item(NAME(m_sim_mode)); + save_item(NAME(m_powerfail_state)); + save_item(NAME(m_chipinsert_state)); + save_item(NAME(m_keyen_state)); + save_item(NAME(m_op41)); + m_speaker_state = 0; //port43_rtn = 0xEE;//0xB6; m_acia_intq = 1; // /INT source 1 @@ -344,8 +380,8 @@ WRITE8_MEMBER( digel804_state::op46 ) output().set_value("busy_led", BIT(data,6)); output().set_value("error_led", BIT(data,5)); - for(int i=0; i<16; i++) - output().set_indexed_value("func_led", i, (!(data & 0x10) && ((~data & 0x0f) == i)) ? 1 : 0); + for (int i = 0; i < 16; i++) + m_func_leds[i] = (!(data & 0x10) && ((~data & 0x0f) == i)) ? 1 : 0; } WRITE8_MEMBER( digel804_state::op47 ) // eprom timing/power and control write @@ -446,7 +482,7 @@ ADDRESS_MAP_START(digel804_state::z80_mem_804_1_4) // f800-ffff is open bus in mapper, 7f ADDRESS_MAP_END -ADDRESS_MAP_START(digel804_state::z80_mem_804_1_2) +ADDRESS_MAP_START(ep804_state::z80_mem_804_1_2) ADDRESS_MAP_UNMAP_HIGH AM_RANGE(0x0000, 0x1fff) AM_ROM // 3f in mapper = rom D41 AM_RANGE(0x2000, 0x3fff) AM_ROM // 5f in mapper = rom D42 @@ -489,7 +525,7 @@ ADDRESS_MAP_START(digel804_state::z80_io_1_4) ADDRESS_MAP_END -ADDRESS_MAP_START(digel804_state::z80_io_1_2) +ADDRESS_MAP_START(ep804_state::z80_io_1_2) ADDRESS_MAP_UNMAP_HIGH ADDRESS_MAP_GLOBAL_MASK(0xff) // io bits: x 1 x x x * * * @@ -586,13 +622,13 @@ WRITE_LINE_MEMBER( digel804_state::acia_irq_w ) m_maincpu->set_input_line(0, (m_key_intq & m_acia_intq) ? CLEAR_LINE : ASSERT_LINE); } -WRITE_LINE_MEMBER( digel804_state::ep804_acia_irq_w ) +WRITE_LINE_MEMBER( ep804_state::ep804_acia_irq_w ) { } MACHINE_CONFIG_START(digel804_state::digel804) /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", Z80, XTAL(3'686'400)/2) /* Z80A, X1(aka E0 on schematics): 3.6864Mhz */ + MCFG_CPU_ADD("maincpu", Z80, 3.6864_MHz_XTAL/2) /* Z80A, X1(aka E0 on schematics): 3.6864Mhz */ MCFG_CPU_PROGRAM_MAP(z80_mem_804_1_4) MCFG_CPU_IO_MAP(z80_io_1_4) MCFG_QUANTUM_TIME(attotime::from_hz(60)) @@ -611,7 +647,7 @@ MACHINE_CONFIG_START(digel804_state::digel804) /* acia */ MCFG_DEVICE_ADD("acia", MOS6551, 0) - MCFG_MOS6551_XTAL(XTAL(3'686'400)/2) + MCFG_MOS6551_XTAL(3.6864_MHz_XTAL/2) MCFG_MOS6551_IRQ_HANDLER(WRITELINE(digel804_state, acia_irq_w)) MCFG_MOS6551_TXD_HANDLER(DEVWRITELINE("rs232", rs232_port_device, write_txd)) MCFG_MOS6551_RTS_HANDLER(DEVWRITELINE("rs232", rs232_port_device, write_rts)) @@ -634,15 +670,16 @@ MACHINE_CONFIG_START(digel804_state::digel804) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) MACHINE_CONFIG_END -MACHINE_CONFIG_START(digel804_state::ep804) +MACHINE_CONFIG_START(ep804_state::ep804) digel804(config); + /* basic machine hardware */ MCFG_CPU_MODIFY("maincpu") /* Z80, X1(aka E0 on schematics): 3.6864Mhz */ MCFG_CPU_PROGRAM_MAP(z80_mem_804_1_2) MCFG_CPU_IO_MAP(z80_io_1_2) MCFG_DEVICE_MODIFY("acia") - MCFG_MOS6551_IRQ_HANDLER(WRITELINE(digel804_state, ep804_acia_irq_w)) + MCFG_MOS6551_IRQ_HANDLER(WRITELINE(ep804_state, ep804_acia_irq_w)) MCFG_RAM_MODIFY(RAM_TAG) MCFG_RAM_DEFAULT_SIZE("32K") @@ -730,6 +767,6 @@ ROM_END Drivers ******************************************************************************/ -// YEAR NAME PARENT COMPAT MACHINE INPUT STATE INIT COMPANY FULLNAME FLAGS -COMP( 1985, digel804, 0, 0, digel804, digel804, digel804_state, digel804, "Digelec, Inc", "Digelec 804 EPROM Programmer", MACHINE_NOT_WORKING ) -COMP( 1982, ep804, digel804, 0, ep804, digel804, digel804_state, digel804, "Wavetek/Digelec, Inc", "EP804 EPROM Programmer", MACHINE_NOT_WORKING ) +// YEAR NAME PARENT COMPAT MACHINE INPUT STATE INIT COMPANY FULLNAME FLAGS +COMP( 1985, digel804, 0, 0, digel804, digel804, digel804_state, 0, "Digelec, Inc", "Digelec 804 EPROM Programmer", MACHINE_NOT_WORKING ) +COMP( 1982, ep804, digel804, 0, ep804, digel804, ep804_state, 0, "Wavetek/Digelec, Inc", "EP804 EPROM Programmer", MACHINE_NOT_WORKING ) diff --git a/src/mame/drivers/ecoinf2.cpp b/src/mame/drivers/ecoinf2.cpp index ac51dc61a68..940162e6020 100644 --- a/src/mame/drivers/ecoinf2.cpp +++ b/src/mame/drivers/ecoinf2.cpp @@ -21,69 +21,41 @@ class ecoinf2_state : public driver_device { public: - ecoinf2_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), + ecoinf2_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), - m_reel0(*this, "reel0"), - m_reel1(*this, "reel1"), - m_reel2(*this, "reel2"), - m_reel3(*this, "reel3"), + m_reels(*this, "reel%s", 0U), m_meters(*this, "meters"), m_coins(*this, "COINS"), m_key(*this, "PERKEY"), - m_panel(*this, "PANEL") + m_panel(*this, "PANEL"), + m_lamp_outputs(*this, "lamp%u", 0U), + m_led_outputs(*this, "digit%u", 0U), + m_coinlamp_outputs(*this, "coinlamp%u", 0U) { - strobe_amount = 0; - strobe_addr = 0; } - required_device<cpu_device> m_maincpu; - required_device<stepper_device> m_reel0; - required_device<stepper_device> m_reel1; - required_device<stepper_device> m_reel2; - required_device<stepper_device> m_reel3; - required_device<meters_device> m_meters; - required_ioport m_coins; - required_ioport m_key; - required_ioport m_panel; + void ecoinf2_oxo(machine_config &config); - uint16_t m_lamps[16]; - uint16_t m_leds[16]; - //uint16_t m_chars[14]; -// void update_display(); - int m_optic_pattern; - DECLARE_WRITE_LINE_MEMBER(reel0_optic_cb) { if (state) m_optic_pattern |= 0x01; else m_optic_pattern &= ~0x01; } - DECLARE_WRITE_LINE_MEMBER(reel1_optic_cb) { if (state) m_optic_pattern |= 0x02; else m_optic_pattern &= ~0x02; } - DECLARE_WRITE_LINE_MEMBER(reel2_optic_cb) { if (state) m_optic_pattern |= 0x04; else m_optic_pattern &= ~0x04; } - DECLARE_WRITE_LINE_MEMBER(reel3_optic_cb) { if (state) m_optic_pattern |= 0x08; else m_optic_pattern &= ~0x08; } - int strobe_addr; - int strobe_amount; +protected: + template <unsigned N> DECLARE_WRITE_LINE_MEMBER(reel_optic_cb) { if (state) m_optic_pattern |= (1 << N); else m_optic_pattern &= ~(1 << N); } DECLARE_WRITE8_MEMBER(ox_port5c_out_w); - DECLARE_DRIVER_INIT(ecoinf2); void update_lamps() { - for (int i=0; i<16; i++) + for (int i = 0; i < 16; i++) { - for (int bit=0;bit<16;bit++) - { - int data = ((m_lamps[i] << bit)&0x8000)>>15; - - output().set_indexed_value("lamp", (i*16)+bit, data ); - } + for (int bit = 0; bit < 16; bit++) + m_lamp_outputs[(i << 4) | bit] = BIT(m_lamps[i], 15 - i); } } - void update_leds(void) + void update_leds() { - for (int i=0; i<16; i++) + for (int i = 0; i < 16; i++) { - for (int bit=0;bit<16;bit++) - { - int data = ((m_leds[i] << bit)&0x8000)>>15; - - output().set_digit_value((i*16)+bit, data ); - } + for (int bit = 0; bit < 16; bit++) + m_led_outputs[(i << 4) | bit] = BIT(m_leds[i], 15 - i); } } @@ -181,8 +153,8 @@ public: DECLARE_WRITE8_MEMBER(ppi8255_ic24_write_b_payouts) { //TODO: Fix up payout enables - all available bits enable one slide each - output().set_value("coinlamp0", data&0x40 ); - output().set_value("coinlamp1", data&0x80 ); + m_coinlamp_outputs[0] = BIT(data, 6); + m_coinlamp_outputs[1] = BIT(data, 7); } DECLARE_WRITE8_MEMBER(ppi8255_ic24_write_c_inhibits) @@ -197,24 +169,22 @@ public: } - - DECLARE_WRITE8_MEMBER(ppi8255_ic23_write_a_reel01) { - m_reel0->update( data &0x0f); - m_reel1->update((data>>4)&0x0f); + m_reels[0]->update( data &0x0f); + m_reels[1]->update((data>>4)&0x0f); - awp_draw_reel(machine(),"reel1", *m_reel0); - awp_draw_reel(machine(),"reel2", *m_reel1); + awp_draw_reel(machine(),"reel1", *m_reels[0]); + awp_draw_reel(machine(),"reel2", *m_reels[1]); } DECLARE_WRITE8_MEMBER(ppi8255_ic23_write_b_reel23) { - m_reel2->update( data &0x0f); - m_reel3->update((data>>4)&0x0f); + m_reels[2]->update( data &0x0f); + m_reels[3]->update((data>>4)&0x0f); - awp_draw_reel(machine(),"reel3", *m_reel2); - awp_draw_reel(machine(),"reel4", *m_reel3); + awp_draw_reel(machine(),"reel3", *m_reels[2]); + awp_draw_reel(machine(),"reel4", *m_reels[3]); } DECLARE_READ8_MEMBER(ppi8255_ic23_read_c_key) @@ -224,11 +194,34 @@ public: return data; } - DECLARE_MACHINE_START(ecoinf2); + virtual void machine_start() override + { + m_lamp_outputs.resolve(); + m_led_outputs.resolve(); + m_coinlamp_outputs.resolve(); + } - void ecoinf2_oxo(machine_config &config); void oxo_memmap(address_map &map); void oxo_portmap(address_map &map); + +private: + required_device<cpu_device> m_maincpu; + required_device_array<stepper_device, 4> m_reels; + required_device<meters_device> m_meters; + required_ioport m_coins; + required_ioport m_key; + required_ioport m_panel; + output_finder<16 * 16> m_lamp_outputs; + output_finder<16 * 16> m_led_outputs; + output_finder<2> m_coinlamp_outputs; + + uint16_t m_lamps[16]; + uint16_t m_leds[16]; + //uint16_t m_chars[14]; + int m_optic_pattern; + + int strobe_addr = 0; + int strobe_amount = 0; }; @@ -538,13 +531,13 @@ MACHINE_CONFIG_START(ecoinf2_state::ecoinf2_oxo) MCFG_I8255_IN_PORTC_CB(READ8(ecoinf2_state, ppi8255_ic13_read_c_panel)) MCFG_ECOIN_200STEP_ADD("reel0") - MCFG_STEPPER_OPTIC_CALLBACK(WRITELINE(ecoinf2_state, reel0_optic_cb)) + MCFG_STEPPER_OPTIC_CALLBACK(WRITELINE(ecoinf2_state, reel_optic_cb<0>)) MCFG_ECOIN_200STEP_ADD("reel1") - MCFG_STEPPER_OPTIC_CALLBACK(WRITELINE(ecoinf2_state, reel1_optic_cb)) + MCFG_STEPPER_OPTIC_CALLBACK(WRITELINE(ecoinf2_state, reel_optic_cb<1>)) MCFG_ECOIN_200STEP_ADD("reel2") - MCFG_STEPPER_OPTIC_CALLBACK(WRITELINE(ecoinf2_state, reel2_optic_cb)) + MCFG_STEPPER_OPTIC_CALLBACK(WRITELINE(ecoinf2_state, reel_optic_cb<2>)) MCFG_ECOIN_200STEP_ADD("reel3") - MCFG_STEPPER_OPTIC_CALLBACK(WRITELINE(ecoinf2_state, reel3_optic_cb)) + MCFG_STEPPER_OPTIC_CALLBACK(WRITELINE(ecoinf2_state, reel_optic_cb<3>)) MCFG_DEVICE_ADD("meters", METERS, 0) MCFG_METERS_NUMBER(8) @@ -788,18 +781,15 @@ ROM_START( ec_sumnc ) ROM_LOAD( "smn94.bin", 0x0000, 0x010000, CRC(9ade016a) SHA1(1c75dc46436253c4e6730f40523d016098c20683) ) ROM_LOAD( "smncscst", 0x0000, 0x010000, CRC(1147531a) SHA1(c303187452afdcb79e0f182d26d2c27693f69d76) ) ROM_END -DRIVER_INIT_MEMBER(ecoinf2_state,ecoinf2) -{ -} // OXO wh type (Phoenix?) (watchdog on port 5c?) -GAME( 19??, ec_oxocg, 0 , ecoinf2_oxo, ecoinf2, ecoinf2_state, ecoinf2, ROT0, "Electrocoin", "Oxo Classic Gold (Electrocoin) (?)", MACHINE_NO_SOUND|MACHINE_REQUIRES_ARTWORK|MACHINE_NOT_WORKING|MACHINE_MECHANICAL) -GAME( 19??, ec_oxocl, 0 , ecoinf2_oxo, ecoinf2, ecoinf2_state, ecoinf2, ROT0, "Electrocoin", "Oxo Club (Electrocoin) (?)", MACHINE_NO_SOUND|MACHINE_REQUIRES_ARTWORK|MACHINE_NOT_WORKING|MACHINE_MECHANICAL) -GAME( 19??, ec_oxogb, 0 , ecoinf2_oxo, ecoinf2, ecoinf2_state, ecoinf2, ROT0, "Electrocoin", "Oxo Golden Bars (Electrocoin) (?)", MACHINE_NO_SOUND|MACHINE_REQUIRES_ARTWORK|MACHINE_NOT_WORKING|MACHINE_MECHANICAL) -GAME( 19??, ec_oxorl, 0 , ecoinf2_oxo, ecoinf2, ecoinf2_state, ecoinf2, ROT0, "Electrocoin", "Oxo Reels (Electrocoin) (?)", MACHINE_NO_SOUND|MACHINE_REQUIRES_ARTWORK|MACHINE_NOT_WORKING|MACHINE_MECHANICAL) -GAME( 19??, ec_oxorv, 0 , ecoinf2_oxo, ecoinf2, ecoinf2_state, ecoinf2, ROT0, "Electrocoin", "Oxo Revolution (Electrocoin) (?)", MACHINE_NO_SOUND|MACHINE_REQUIRES_ARTWORK|MACHINE_NOT_WORKING|MACHINE_MECHANICAL) -GAME( 19??, ec_suprl, 0 , ecoinf2_oxo, ecoinf2, ecoinf2_state, ecoinf2, ROT0, "Electrocoin", "Super Reels (Electrocoin) (?)", MACHINE_NO_SOUND|MACHINE_REQUIRES_ARTWORK|MACHINE_NOT_WORKING|MACHINE_MECHANICAL) -GAME( 19??, ec_rcc, 0 , ecoinf2_oxo, ecoinf2, ecoinf2_state, ecoinf2, ROT0, "Electrocoin", "Royal Casino Club (Electrocoin) (?)", MACHINE_NO_SOUND|MACHINE_REQUIRES_ARTWORK|MACHINE_NOT_WORKING|MACHINE_MECHANICAL) - -GAME( 19??, ec_sumnd, 0 , ecoinf2_oxo, ecoinf2, ecoinf2_state, ecoinf2, ROT0, "Concept Games Ltd", "Super Multi Nudger (Concept / Electrocoin Oxo) (?)", MACHINE_NO_SOUND|MACHINE_REQUIRES_ARTWORK|MACHINE_NOT_WORKING|MACHINE_MECHANICAL) -GAME( 19??, ec_sumnc, 0 , ecoinf2_oxo, ecoinf2, ecoinf2_state, ecoinf2, ROT0, "Concept Games Ltd", "Casino Super Multi Nudger (Concept / Electrocoin Oxo) (?)", MACHINE_NO_SOUND|MACHINE_REQUIRES_ARTWORK|MACHINE_NOT_WORKING|MACHINE_MECHANICAL) +GAME( 19??, ec_oxocg, 0 , ecoinf2_oxo, ecoinf2, ecoinf2_state, 0, ROT0, "Electrocoin", "Oxo Classic Gold (Electrocoin) (?)", MACHINE_NO_SOUND|MACHINE_REQUIRES_ARTWORK|MACHINE_NOT_WORKING|MACHINE_MECHANICAL) +GAME( 19??, ec_oxocl, 0 , ecoinf2_oxo, ecoinf2, ecoinf2_state, 0, ROT0, "Electrocoin", "Oxo Club (Electrocoin) (?)", MACHINE_NO_SOUND|MACHINE_REQUIRES_ARTWORK|MACHINE_NOT_WORKING|MACHINE_MECHANICAL) +GAME( 19??, ec_oxogb, 0 , ecoinf2_oxo, ecoinf2, ecoinf2_state, 0, ROT0, "Electrocoin", "Oxo Golden Bars (Electrocoin) (?)", MACHINE_NO_SOUND|MACHINE_REQUIRES_ARTWORK|MACHINE_NOT_WORKING|MACHINE_MECHANICAL) +GAME( 19??, ec_oxorl, 0 , ecoinf2_oxo, ecoinf2, ecoinf2_state, 0, ROT0, "Electrocoin", "Oxo Reels (Electrocoin) (?)", MACHINE_NO_SOUND|MACHINE_REQUIRES_ARTWORK|MACHINE_NOT_WORKING|MACHINE_MECHANICAL) +GAME( 19??, ec_oxorv, 0 , ecoinf2_oxo, ecoinf2, ecoinf2_state, 0, ROT0, "Electrocoin", "Oxo Revolution (Electrocoin) (?)", MACHINE_NO_SOUND|MACHINE_REQUIRES_ARTWORK|MACHINE_NOT_WORKING|MACHINE_MECHANICAL) +GAME( 19??, ec_suprl, 0 , ecoinf2_oxo, ecoinf2, ecoinf2_state, 0, ROT0, "Electrocoin", "Super Reels (Electrocoin) (?)", MACHINE_NO_SOUND|MACHINE_REQUIRES_ARTWORK|MACHINE_NOT_WORKING|MACHINE_MECHANICAL) +GAME( 19??, ec_rcc, 0 , ecoinf2_oxo, ecoinf2, ecoinf2_state, 0, ROT0, "Electrocoin", "Royal Casino Club (Electrocoin) (?)", MACHINE_NO_SOUND|MACHINE_REQUIRES_ARTWORK|MACHINE_NOT_WORKING|MACHINE_MECHANICAL) + +GAME( 19??, ec_sumnd, 0 , ecoinf2_oxo, ecoinf2, ecoinf2_state, 0, ROT0, "Concept Games Ltd", "Super Multi Nudger (Concept / Electrocoin Oxo) (?)", MACHINE_NO_SOUND|MACHINE_REQUIRES_ARTWORK|MACHINE_NOT_WORKING|MACHINE_MECHANICAL) +GAME( 19??, ec_sumnc, 0 , ecoinf2_oxo, ecoinf2, ecoinf2_state, 0, ROT0, "Concept Games Ltd", "Casino Super Multi Nudger (Concept / Electrocoin Oxo) (?)", MACHINE_NO_SOUND|MACHINE_REQUIRES_ARTWORK|MACHINE_NOT_WORKING|MACHINE_MECHANICAL) diff --git a/src/mame/drivers/monty.cpp b/src/mame/drivers/monty.cpp index d96d45807d9..3568b82d9e2 100644 --- a/src/mame/drivers/monty.cpp +++ b/src/mame/drivers/monty.cpp @@ -49,21 +49,26 @@ public: elem = 0xff000000; } + DECLARE_WRITE_LINE_MEMBER(key_pressed); + + void monty(machine_config &config); + void mmonty(machine_config &config); + +protected: DECLARE_WRITE8_MEMBER(sound_w); DECLARE_WRITE8_MEMBER(ioDisplayWrite_w); DECLARE_WRITE8_MEMBER(ioCommandWrite0_w); DECLARE_WRITE8_MEMBER(ioCommandWrite1_w); DECLARE_WRITE_LINE_MEMBER(halt_changed); - DECLARE_WRITE_LINE_MEMBER(key_pressed); // screen updates uint32_t lcd_update(screen_device& screen, bitmap_rgb32& bitmap, const rectangle& cliprect); + SED1520_UPDATE_CB(screen_update); - void monty(machine_config &config); - void mmonty(machine_config &config); void mmonty_mem(address_map &map); void monty_io(address_map &map); void monty_mem(address_map &map); + private: required_device<cpu_device> m_maincpu; required_device<speaker_sound_device> m_speaker; @@ -249,7 +254,7 @@ uint32_t monty_state::lcd_update(screen_device& screen, bitmap_rgb32& bitmap, co } -SED1520_UPDATE_CB(monty_screen_update) +SED1520_UPDATE_CB(monty_state::screen_update) { // TODO: Not really a SED1520 - there are two SED1503s return 0x00; @@ -278,7 +283,7 @@ MACHINE_CONFIG_START(monty_state::monty) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) // LCD controller interfaces - MCFG_SED1520_ADD("sed1520_0", monty_screen_update) + MCFG_SED1520_ADD("sed1520_0", UPDATE(monty_state, screen_update)) MACHINE_CONFIG_END MACHINE_CONFIG_START(monty_state::mmonty) diff --git a/src/mame/drivers/pc2000.cpp b/src/mame/drivers/pc2000.cpp index 20dc39511ac..060bb5fe367 100644 --- a/src/mame/drivers/pc2000.cpp +++ b/src/mame/drivers/pc2000.cpp @@ -44,19 +44,13 @@ public: , m_bank0(*this, "bank0") , m_bank1(*this, "bank1") , m_bank2(*this, "bank2") + , m_rows{ { *this, "IN%X", 0 }, { *this, "IN%X", 8 } } { } - required_device<cpu_device> m_maincpu; - optional_device<hd44780_device> m_lcdc; - required_device<beep_device> m_beep; - required_device<generic_slot_device> m_cart; - optional_memory_bank m_bank0; - required_memory_bank m_bank1; - optional_memory_bank m_bank2; - - uint8_t m_mux_data; - uint8_t m_beep_state; + void pc2000(machine_config &config); + void gl2000(machine_config &config); +protected: virtual void machine_start() override; virtual void machine_reset() override; @@ -69,27 +63,58 @@ public: DECLARE_WRITE8_MEMBER( beep_w ); DECLARE_PALETTE_INIT(pc2000); DECLARE_DEVICE_IMAGE_LOAD_MEMBER(pc2000_cart); - void pc2000(machine_config &config); - void gl2000(machine_config &config); + void pc2000_io(address_map &map); void pc2000_mem(address_map &map); + + required_device<cpu_device> m_maincpu; + optional_device<hd44780_device> m_lcdc; + required_device<beep_device> m_beep; + required_device<generic_slot_device> m_cart; + optional_memory_bank m_bank0; + required_memory_bank m_bank1; + optional_memory_bank m_bank2; + +private: + required_ioport_array<8> m_rows[2]; + + uint8_t m_mux_data; + uint8_t m_beep_state; }; class gl3000s_state : public pc2000_state { public: gl3000s_state(const machine_config &mconfig, device_type type, const char *tag) - : pc2000_state(mconfig, type, tag), - m_lcdc_r(*this, "sed1520_r"), - m_lcdc_l(*this, "sed1520_l") - { } + : pc2000_state(mconfig, type, tag) + , m_lcdc_r(*this, "sed1520_r") + , m_lcdc_l(*this, "sed1520_l") + , m_lev_out(*this, "LEV%u", 1U) + , m_try_out(*this, "TRY%u", 1U) + , m_tick_out(*this, "TICK%u", 0U) + , m_time_out(*this, "TIME%u", 0U) + , m_points_out(*this, "P%u%u", 1U, 0U) + { } - required_device<sed1520_device> m_lcdc_r; - required_device<sed1520_device> m_lcdc_l; + void gl3000s(machine_config &config); +protected: + void machine_start() override; uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - void gl3000s(machine_config &config); void gl3000s_io(address_map &map); + +private: + int sed1520_screen_update(bitmap_ind16 &bitmap, const rectangle &cliprect, uint8_t *vram, int start_line, int adc, int start_x); + SED1520_UPDATE_CB(screen_update_right); + SED1520_UPDATE_CB(screen_update_left); + + required_device<sed1520_device> m_lcdc_r; + required_device<sed1520_device> m_lcdc_l; + output_finder<4> m_lev_out; + output_finder<3> m_try_out; + output_finder<8> m_tick_out; + output_finder<3> m_time_out; + output_finder<2, 3> m_points_out; }; class gl4004_state : public pc2000_state @@ -97,11 +122,13 @@ class gl4004_state : public pc2000_state public: gl4004_state(const machine_config &mconfig, device_type type, const char *tag) : pc2000_state(mconfig, type, tag) - { } + { } + void gl4000(machine_config &config); + +protected: virtual void machine_start() override; HD44780_PIXEL_UPDATE(gl4000_pixel_update); - void gl4000(machine_config &config); }; class pc1000_state : public pc2000_state @@ -109,9 +136,12 @@ class pc1000_state : public pc2000_state public: pc1000_state(const machine_config &mconfig, device_type type, const char *tag) : pc2000_state(mconfig, type, tag) - { } + { } + void misterx(machine_config &config); + void pc1000(machine_config &config); +protected: virtual void machine_start() override; virtual void machine_reset() override; @@ -121,27 +151,19 @@ public: DECLARE_READ8_MEMBER( lcdc_control_r ); DECLARE_WRITE8_MEMBER( lcdc_control_w ); HD44780_PIXEL_UPDATE(pc1000_pixel_update); - void misterx(machine_config &config); - void pc1000(machine_config &config); + void pc1000_io(address_map &map); void pc1000_mem(address_map &map); }; -/* TODO: put a breakpoint at 1625 and test the inputs, writes at dce4 are the scancode values */ +// TODO: put a breakpoint at 1625 and test the inputs, writes at dce4 are the scancode values READ8_MEMBER( pc2000_state::key_matrix_r ) { - static const char *const bitnames[2][8] = - { - {"IN0", "IN1", "IN2", "IN3", "IN4", "IN5", "IN6", "IN7"}, - {"IN8", "IN9", "INA", "INB", "INC", "IND", "INE", "INF"} - }; - uint8_t data = 0xff; - - for (int line=0; line<8; line++) - if (m_mux_data & (1<<line)) - data &= ioport(bitnames[offset][line])->read(); + for (int line = 0; line < 8; line++) + if (BIT(m_mux_data, line)) + data &= m_rows[offset & 1][line]->read(); return data; } @@ -200,6 +222,17 @@ ADDRESS_MAP_START(pc2000_state::pc2000_io) ADDRESS_MAP_END +void gl3000s_state::machine_start() +{ + pc2000_state::machine_start(); + + m_lev_out.resolve(); + m_try_out.resolve(); + m_tick_out.resolve(); + m_time_out.resolve(); + m_points_out.resolve(); +} + uint32_t gl3000s_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { bitmap.fill(0); @@ -208,7 +241,7 @@ uint32_t gl3000s_state::screen_update(screen_device &screen, bitmap_ind16 &bitma return 0; } -int gl3000s_sed1520_screen_update(device_t &device, bitmap_ind16 &bitmap, const rectangle &cliprect, uint8_t *vram, int start_line, int adc, int start_x) +int gl3000s_state::sed1520_screen_update(bitmap_ind16 &bitmap, const rectangle &cliprect, uint8_t *vram, int start_line, int adc, int start_x) { for (int y=0; y<2; y++) { @@ -231,12 +264,12 @@ int gl3000s_sed1520_screen_update(device_t &device, bitmap_ind16 &bitmap, const return 0; } -SED1520_UPDATE_CB(gl3000s_screen_update_right) +SED1520_UPDATE_CB(gl3000s_state::screen_update_right) { - return gl3000s_sed1520_screen_update(device, bitmap, cliprect, vram, start_line, adc, 119); + return sed1520_screen_update(bitmap, cliprect, vram, start_line, adc, 119); } -SED1520_UPDATE_CB(gl3000s_screen_update_left) +SED1520_UPDATE_CB(gl3000s_state::screen_update_left) { uint8_t sec[5]; uint8_t points[2][5]; @@ -273,10 +306,10 @@ SED1520_UPDATE_CB(gl3000s_screen_update_left) else if ((x == 75 || x == 77 || x == 79) && yi == 5) points[y][dpos] |= (state << 4); else if ((x == 75 || x == 77 || x == 79) && yi == 6) points[y][dpos] |= (state << 3); - else if (y == 1 && x >= 65 && x <= 68 && yi == 7) device.machine().output().set_indexed_value("LEV", x - 64, state); - else if (x >= 59 && x <= 60 && yi == 7) device.machine().output().set_indexed_value("TRY", x - 58 + (y ? 0 : 1), state); - else if (y == 1 && x >= 61 && x <= 64 && yi == 7) device.machine().output().set_indexed_value("TICK", x - 59, state); - else if (y == 0 && x >= 61 && x <= 64 && yi == 7) device.machine().output().set_indexed_value("TICK", 62 - x + (x >= 63 ? 8 : 0), state); + else if (y == 1 && x >= 65 && x <= 68 && yi == 7) m_lev_out[x - 65] = state; + else if (x >= 59 && x <= 60 && yi == 7) m_try_out[x - 59 + (y ? 0 : 1)] = state; + else if (y == 1 && x >= 61 && x <= 64 && yi == 7) m_tick_out[x - 59] = state; + else if (y == 0 && x >= 61 && x <= 64 && yi == 7) m_tick_out[62 - x + (x >= 63 ? 8 : 0)] = state; else if (x < 74 && yi < 7) { @@ -286,14 +319,14 @@ SED1520_UPDATE_CB(gl3000s_screen_update_left) } } - for(int i=0; i < 3; i++) + for (int i = 0; i < 3; i++) { - device.machine().output().set_indexed_value("TIME", i, sec[i]); - device.machine().output().set_indexed_value("P1", i, points[1][i]); - device.machine().output().set_indexed_value("P2", i, points[0][i]); + m_time_out[i] = sec[i]; + m_points_out[0][i] = points[1][i]; + m_points_out[1][i] = points[0][i]; } - return gl3000s_sed1520_screen_update(device, bitmap, cliprect, vram, start_line, adc, 58); + return sed1520_screen_update(bitmap, cliprect, vram, start_line, adc, 58); } @@ -766,7 +799,7 @@ void pc2000_state::machine_start() std::string region_tag; uint8_t *bios = memregion("bios")->base(); memory_region *cart_region = memregion(region_tag.assign(m_cart->tag()).append(GENERIC_ROM_REGION_TAG).c_str()); - uint8_t *cart = (cart_region != nullptr) ? cart_region->base() : memregion("bios")->base(); + uint8_t *cart = cart_region ? cart_region->base() : bios; m_bank0->configure_entries(0, 0x10, bios, 0x4000); m_bank1->configure_entries(0, 0x10, bios, 0x4000); @@ -904,8 +937,8 @@ MACHINE_CONFIG_START(gl3000s_state::gl3000s) MCFG_CPU_IO_MAP(gl3000s_io) MCFG_DEVICE_REMOVE("hd44780") - MCFG_SED1520_ADD("sed1520_l", gl3000s_screen_update_left) // left panel is 59 pixels (0-58) - MCFG_SED1520_ADD("sed1520_r", gl3000s_screen_update_right) // right panel is 61 pixels (59-119) + MCFG_SED1520_ADD("sed1520_l", UPDATE(gl3000s_state, screen_update_left)) // left panel is 59 pixels (0-58) + MCFG_SED1520_ADD("sed1520_r", UPDATE(gl3000s_state, screen_update_right)) // right panel is 61 pixels (59-119) MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_SIZE(120, 24) diff --git a/src/mame/drivers/tecnbras.cpp b/src/mame/drivers/tecnbras.cpp index f489558d149..0c6fdc00785 100644 --- a/src/mame/drivers/tecnbras.cpp +++ b/src/mame/drivers/tecnbras.cpp @@ -21,31 +21,41 @@ #include "emu.h" #include "cpu/mcs51/mcs51.h" + +#include <algorithm> + #include "tecnbras.lh" + class tecnbras_state : public driver_device { public: tecnbras_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) , m_maincpu(*this, "maincpu") + , m_dmds(*this, "dmd_%u", 0U) { } + void tecnbras(machine_config &config); + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + DECLARE_WRITE8_MEMBER(set_x_position_w); DECLARE_WRITE8_MEMBER(print_column_w); -// DECLARE_WRITE8_MEMBER(tecnbras_io_w); -// DECLARE_READ8_MEMBER(tecnbras_io_r); - DECLARE_DRIVER_INIT(tecnbras); -void tecnbras(machine_config &config); -void i80c31_io(address_map &map); -void i80c31_prg(address_map &map); + //DECLARE_WRITE8_MEMBER(tecnbras_io_w); + //DECLARE_READ8_MEMBER(tecnbras_io_r); + void i80c31_io(address_map &map); + void i80c31_prg(address_map &map); + private: + required_device<cpu_device> m_maincpu; + output_finder<14 * 7> m_dmds; + int m_xcoord; char m_digit[14][7]; - virtual void machine_start() override; - virtual void machine_reset() override; - required_device<cpu_device> m_maincpu; }; ADDRESS_MAP_START(tecnbras_state::i80c31_prg) @@ -59,16 +69,6 @@ ADDRESS_MAP_START(tecnbras_state::i80c31_io) AM_RANGE(0x06B8, 0x06BC) AM_WRITE(print_column_w) ADDRESS_MAP_END -DRIVER_INIT_MEMBER( tecnbras_state, tecnbras ) -{ - m_xcoord = 0; - for (auto & elem : m_digit){ - for (int y=0; y<7; y++){ - elem[y] = 0; - } - } -} - WRITE8_MEMBER(tecnbras_state::set_x_position_w) { m_xcoord = offset; @@ -76,25 +76,34 @@ WRITE8_MEMBER(tecnbras_state::set_x_position_w) WRITE8_MEMBER(tecnbras_state::print_column_w) { - int x = m_xcoord + offset; - for (int i=0; i<7; i++){ - if((x/5) < ARRAY_LENGTH(m_digit)){ - m_digit[x/5][i] &= ~(1 << (x%5)); - m_digit[x/5][i] |= BIT(data, 7-i) ? (1 << (x%5)) : 0; - output().set_indexed_value("dmd_", (x/5)*7 + i, 0x1F & m_digit[x/5][i]); + int const x = m_xcoord + offset; + int const ch = x / 5; + if (ch < ARRAY_LENGTH(m_digit)) { + int const row = x % 5; + for (int i = 0; i < 7; i++) { + m_digit[ch][i] &= ~(1 << row); + m_digit[ch][i] |= BIT(data, 7 - i) ? (1 << row) : 0; + m_dmds[(ch * 7) + i] = 0x1F & m_digit[ch][i]; } } } void tecnbras_state::machine_start() { -/* - for (int x=0; x<14; x++){ - for (int y=0; y<7; y++){ - output().set_indexed_value("dmd_", x*7 + y, y); - } - } -*/ + m_dmds.resolve(); + + save_item(NAME(m_xcoord)); + save_item(NAME(m_digit)); + + m_xcoord = 0; + for (auto &elem : m_digit) + std::fill(std::begin(elem), std::end(elem), 0); + +#if 0 + for (int x = 0; x < ARRAY_LENGTH(m_digit); x++) + for (int y = 0; y < 7; y++) + m_dmds[(x * 7) + y] = y; +#endif } void tecnbras_state::machine_reset() @@ -103,7 +112,7 @@ void tecnbras_state::machine_reset() MACHINE_CONFIG_START(tecnbras_state::tecnbras) /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", I80C31, XTAL(12'000'000)) /* verified on pcb */ + MCFG_CPU_ADD("maincpu", I80C31, 12_MHz_XTAL) // verified on pcb MCFG_CPU_PROGRAM_MAP(i80c31_prg) MCFG_CPU_IO_MAP(i80c31_io) MCFG_MCS51_PORT_P1_OUT_CB(NOOP) // buzzer ? @@ -132,5 +141,5 @@ ROM_START( tecnbras ) ROM_LOAD( "tecnbras.u2", 0x0000, 0x8000, CRC(1a1e18fc) SHA1(8907e72f0356a2e2e1097dabac6d6b0b3d717f85) ) ROM_END -// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP( 200?, tecnbras, 0, 0, tecnbras, 0, tecnbras_state, tecnbras, "Tecnbras", "Dot Matrix Display (70x7 pixels)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_SOUND) +// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS +COMP( 200?, tecnbras, 0, 0, tecnbras, 0, tecnbras_state, 0, "Tecnbras", "Dot Matrix Display (70x7 pixels)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_SOUND ) diff --git a/src/mame/drivers/tispeak.cpp b/src/mame/drivers/tispeak.cpp index d3eeae0036e..c49051437d9 100644 --- a/src/mame/drivers/tispeak.cpp +++ b/src/mame/drivers/tispeak.cpp @@ -429,19 +429,37 @@ K28 modules: class tispeak_state : public hh_tms1k_state { public: - tispeak_state(const machine_config &mconfig, device_type type, const char *tag) - : hh_tms1k_state(mconfig, type, tag), + tispeak_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag), m_tms5100(*this, "tms5100"), m_tms6100(*this, "tms6100"), - m_cart(*this, "cartslot") + m_cart(*this, "cartslot"), + m_ol_out(*this, "ol%u", 1U) { } - // devices - required_device<tms5110_device> m_tms5100; - required_device<tms6100_device> m_tms6100; - optional_device<generic_slot_device> m_cart; - virtual DECLARE_INPUT_CHANGED_MEMBER(power_button) override; + + DECLARE_DRIVER_INIT(snspell); + DECLARE_DRIVER_INIT(tntell); + DECLARE_DRIVER_INIT(lantutor); + + // machine configs + void tms5110_route(machine_config &config); + void sns_tmc0281(machine_config &config); + void sns_tmc0281d(machine_config &config); + void sns_cd2801(machine_config &config); + void snspellit(machine_config &config); + void snspellsp(machine_config &config); + void snspellc(machine_config &config); + void snspellcuk(machine_config &config); + void snmath(machine_config &config); + void snread(machine_config &config); + void tntell(machine_config &config); + void vocaid(machine_config &config); + void lantutor(machine_config &config); + void k28m2(machine_config &config); + +protected: virtual void power_off() override; void prepare_display(); bool vfd_filament_on() { return m_display_decay[15][16] != 0; } @@ -462,36 +480,27 @@ public: DECLARE_WRITE16_MEMBER(k28_write_o); DECLARE_WRITE16_MEMBER(k28_write_r); - // cartridge - u32 m_cart_max_size; - u8* m_cart_base; - void init_cartridge(); DECLARE_DEVICE_IMAGE_LOAD_MEMBER(tispeak_cartridge); - DECLARE_DRIVER_INIT(snspell); - DECLARE_DRIVER_INIT(tntell); - DECLARE_DRIVER_INIT(lantutor); - u8 m_overlay; TIMER_DEVICE_CALLBACK_MEMBER(tntell_get_overlay); - // machine configs - void tms5110_route(machine_config &config); - void sns_tmc0281(machine_config &config); - void sns_tmc0281d(machine_config &config); - void sns_cd2801(machine_config &config); - void snspellit(machine_config &config); - void snspellsp(machine_config &config); - void snspellc(machine_config &config); - void snspellcuk(machine_config &config); - void snmath(machine_config &config); - void snread(machine_config &config); - void tntell(machine_config &config); - void vocaid(machine_config &config); - void lantutor(machine_config &config); - void k28m2(machine_config &config); + void init_cartridge(); -protected: virtual void machine_start() override; + +private: + // devices + required_device<tms5110_device> m_tms5100; + required_device<tms6100_device> m_tms6100; + optional_device<generic_slot_device> m_cart; + + output_finder<5> m_ol_out; + + // cartridge + u32 m_cart_max_size; + u8* m_cart_base; + + u8 m_overlay; }; @@ -499,6 +508,8 @@ void tispeak_state::machine_start() { hh_tms1k_state::machine_start(); + m_ol_out.resolve(); + init_cartridge(); } @@ -689,7 +700,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(tispeak_state::tntell_get_overlay) m_overlay = m_inp_matrix[10]->read(); for (int i = 0; i < 5; i++) - output().set_indexed_value("ol", i+1, m_overlay >> i & 1); + m_ol_out[i] = BIT(m_overlay, i); } |