diff options
Diffstat (limited to 'src/mame/drivers/fidel68k.cpp')
-rw-r--r-- | src/mame/drivers/fidel68k.cpp | 50 |
1 files changed, 43 insertions, 7 deletions
diff --git a/src/mame/drivers/fidel68k.cpp b/src/mame/drivers/fidel68k.cpp index 8ee543db846..b7ccd80b23b 100644 --- a/src/mame/drivers/fidel68k.cpp +++ b/src/mame/drivers/fidel68k.cpp @@ -224,6 +224,10 @@ private: optional_device<ram_device> m_ram; // Excel 68000 + void fex68k_prepare_display(); + DECLARE_READ8_MEMBER(fex68k_input_r); + DECLARE_WRITE8_MEMBER(fex68k_leds_w); + DECLARE_WRITE8_MEMBER(fex68k_7seg_w); DECLARE_WRITE8_MEMBER(fex68k_mux_w); void fex68k_map(address_map &map); void fex68km2_map(address_map &map); @@ -257,6 +261,34 @@ private: Excel 68000 ******************************************************************************/ +void fidel68k_state::fex68k_prepare_display() +{ + // 4*7seg leds, 8*8 chessboard leds + u8 seg_data = bitswap<8>(m_7seg_data,0,1,3,2,7,5,6,4); + set_display_segmask(0x55, 0x7f); + display_matrix(16, 8, m_led_data << 8 | seg_data, m_inp_mux); +} + +READ8_MEMBER(fidel68k_state::fex68k_input_r) +{ + // a1-a3,d7: multiplexed inputs (active low) + return (read_inputs(9) >> offset & 1) ? 0 : 0x80; +} + +WRITE8_MEMBER(fidel68k_state::fex68k_leds_w) +{ + // a1-a3,d0: led data + m_led_data = (m_led_data & ~(1 << offset)) | ((data & 1) << offset); + fex68k_prepare_display(); +} + +WRITE8_MEMBER(fidel68k_state::fex68k_7seg_w) +{ + // a1-a3,d0(d8): digit segment data + m_7seg_data = (m_7seg_data & ~(1 << offset)) | ((data & 1) << offset); + fex68k_prepare_display(); +} + WRITE8_MEMBER(fidel68k_state::fex68k_mux_w) { // a1-a3,d0: 74259 @@ -264,7 +296,12 @@ WRITE8_MEMBER(fidel68k_state::fex68k_mux_w) m_led_select = (m_led_select & ~mask) | ((data & 1) ? mask : 0); // 74259 Q0-Q3: 74145 A-D (Q4-Q7 N/C) - eag_mux_w(space, offset, m_led_select & 0xf); + // 74145 0-8: input mux, digit/led select + // 74145 9: speaker out + u16 sel = 1 << (m_led_select & 0xf); + m_dac->write(BIT(sel, 9)); + m_inp_mux = sel & 0x1ff; + fex68k_prepare_display(); } @@ -347,10 +384,9 @@ void fidel68k_state::init_fdes2265() void fidel68k_state::eag_prepare_display() { - // Excel 68000: 4*7seg leds, 8*8 chessboard leds - // EAG: 8*7seg leds(2 panels), (8+1)*8 chessboard leds + // 8*7seg leds(2 panels), (8+1)*8 chessboard leds u8 seg_data = bitswap<8>(m_7seg_data,0,1,3,2,7,5,6,4); - set_display_segmask(0x1ff, 0x7f); + set_display_segmask(0x1ef, 0x7f); display_matrix(16, 9, m_led_data << 8 | seg_data, m_inp_mux); } @@ -402,10 +438,10 @@ WRITE8_MEMBER(fidel68k_state::eag_mux_w) void fidel68k_state::fex68k_map(address_map &map) { map(0x000000, 0x00ffff).rom(); - map(0x000000, 0x00000f).mirror(0x00fff0).w(FUNC(fidel68k_state::eag_leds_w)).umask16(0x00ff); - map(0x000000, 0x00000f).mirror(0x00fff0).w(FUNC(fidel68k_state::eag_7seg_w)).umask16(0xff00); + map(0x000000, 0x00000f).mirror(0x00fff0).w(FUNC(fidel68k_state::fex68k_leds_w)).umask16(0x00ff); + map(0x000000, 0x00000f).mirror(0x00fff0).w(FUNC(fidel68k_state::fex68k_7seg_w)).umask16(0xff00); map(0x044000, 0x047fff).ram(); - map(0x100000, 0x10000f).mirror(0x03fff0).r(FUNC(fidel68k_state::eag_input1_r)).umask16(0x00ff); + map(0x100000, 0x10000f).mirror(0x03fff0).r(FUNC(fidel68k_state::fex68k_input_r)).umask16(0x00ff); map(0x140000, 0x14000f).mirror(0x03fff0).w(FUNC(fidel68k_state::fex68k_mux_w)).umask16(0x00ff); } |