summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/fidel68k.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/fidel68k.cpp')
-rw-r--r--src/mame/drivers/fidel68k.cpp50
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);
}