summaryrefslogtreecommitdiffstatshomepage
path: root/src/mess/machine/mz80.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mess/machine/mz80.c')
-rw-r--r--src/mess/machine/mz80.c103
1 files changed, 103 insertions, 0 deletions
diff --git a/src/mess/machine/mz80.c b/src/mess/machine/mz80.c
new file mode 100644
index 00000000000..fe5bdd25f70
--- /dev/null
+++ b/src/mess/machine/mz80.c
@@ -0,0 +1,103 @@
+/***************************************************************************
+
+ MZ80 driver by Miodrag Milanovic
+
+ 22/11/2008 Preliminary driver.
+
+****************************************************************************/
+
+#include "includes/mz80.h"
+
+
+/* Driver initialization */
+DRIVER_INIT_MEMBER(mz80_state,mz80k)
+{
+}
+
+MACHINE_RESET( mz80k )
+{
+ mz80_state *state = machine.driver_data<mz80_state>();
+ state->m_mz80k_tempo_strobe = 0;
+ state->m_mz80k_vertical = 0;
+ state->m_mz80k_cursor_cnt = 0;
+ state->m_mz80k_keyboard_line = 0;
+}
+
+
+READ8_MEMBER( mz80_state::mz80k_8255_portb_r )
+{
+ char kbdrow[8];
+ sprintf(kbdrow,"LINE%d", m_mz80k_keyboard_line);
+ if (m_mz80k_keyboard_line > 9)
+ return 0xff;
+ else
+ return ioport(kbdrow)->read();
+}
+
+READ8_MEMBER( mz80_state::mz80k_8255_portc_r )
+{
+ UINT8 val = 0;
+ val |= m_mz80k_vertical ? 0x80 : 0x00;
+ val |= ((m_mz80k_cursor_cnt & 0x3f) > 31) ? 0x40 : 0x00;
+ val |= (m_cass->get_state() & CASSETTE_MASK_UISTATE)== CASSETTE_PLAY ? 0x10 : 0x00;
+
+ if (m_cass->input() > 0.00)
+ val |= 0x20;
+
+ return val;
+}
+
+WRITE8_MEMBER( mz80_state::mz80k_8255_porta_w )
+{
+ m_mz80k_keyboard_line = data & 0x0f;
+}
+
+WRITE8_MEMBER( mz80_state::mz80k_8255_portc_w )
+{
+// logerror("mz80k_8255_portc_w %02x\n",data);
+}
+
+
+WRITE_LINE_MEMBER( mz80_state::pit_out0_changed )
+{
+ if(!m_prev_state && state)
+ m_speaker_level++;
+
+ m_prev_state = state;
+ speaker_level_w(m_speaker, BIT(m_speaker_level, 1));
+}
+
+WRITE_LINE_MEMBER( mz80_state::pit_out2_changed )
+{
+ cputag_set_input_line(machine(), "maincpu", 0, HOLD_LINE);
+}
+
+I8255_INTERFACE( mz80k_8255_int )
+{
+ DEVCB_NULL,
+ DEVCB_DRIVER_MEMBER(mz80_state, mz80k_8255_porta_w),
+ DEVCB_DRIVER_MEMBER(mz80_state, mz80k_8255_portb_r),
+ DEVCB_NULL,
+ DEVCB_DRIVER_MEMBER(mz80_state, mz80k_8255_portc_r),
+ DEVCB_DRIVER_MEMBER(mz80_state, mz80k_8255_portc_w),
+};
+
+const struct pit8253_config mz80k_pit8253_config =
+{
+ {
+ /* clockin gate callback */
+ { XTAL_8MHz/ 4, DEVCB_NULL, DEVCB_DRIVER_LINE_MEMBER(mz80_state, pit_out0_changed) },
+ { XTAL_8MHz/256, DEVCB_NULL, DEVCB_DEVICE_LINE("pit8253", pit8253_clk2_w) },
+ { 0, DEVCB_NULL, DEVCB_DRIVER_LINE_MEMBER(mz80_state, pit_out2_changed) },
+ }
+};
+
+READ8_MEMBER( mz80_state::mz80k_strobe_r )
+{
+ return 0x7e | (UINT8)m_mz80k_tempo_strobe;
+}
+
+WRITE8_MEMBER( mz80_state::mz80k_strobe_w )
+{
+ pit8253_gate0_w(m_pit, BIT(data, 0));
+}