summaryrefslogtreecommitdiffstatshomepage
path: root/src/mess/machine/irisha.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mess/machine/irisha.c')
-rw-r--r--src/mess/machine/irisha.c155
1 files changed, 155 insertions, 0 deletions
diff --git a/src/mess/machine/irisha.c b/src/mess/machine/irisha.c
new file mode 100644
index 00000000000..3936dd21438
--- /dev/null
+++ b/src/mess/machine/irisha.c
@@ -0,0 +1,155 @@
+/***************************************************************************
+
+ Irisha machine driver by Miodrag Milanovic
+
+ 27/03/2008 Preliminary driver.
+
+****************************************************************************/
+
+
+#include "includes/irisha.h"
+
+
+/* Driver initialization */
+DRIVER_INIT_MEMBER(irisha_state,irisha)
+{
+ m_keyboard_mask = 0;
+}
+
+
+
+static TIMER_CALLBACK( irisha_key )
+{
+ irisha_state *state = machine.driver_data<irisha_state>();
+ state->m_keypressed = 1;
+ state->m_keyboard_cnt = 0;
+}
+
+MACHINE_START( irisha )
+{
+ machine.scheduler().timer_pulse(attotime::from_msec(30), FUNC(irisha_key));
+}
+
+MACHINE_RESET( irisha )
+{
+ irisha_state *state = machine.driver_data<irisha_state>();
+ state->m_keypressed = 0;
+}
+
+void irisha_state::update_speaker()
+{
+ int level = ((m_ppi_portc & 0x20) || (m_ppi_porta & 0x10) || !m_sg1_line) ? 1 : 0;
+
+ speaker_level_w(m_speaker, level);
+}
+
+static const char *const keynames[] = {
+ "LINE0", "LINE1", "LINE2", "LINE3",
+ "LINE4", "LINE5", "LINE6", "LINE7",
+ "LINE8", "LINE9"
+};
+
+READ8_MEMBER(irisha_state::irisha_8255_portb_r)
+{
+ if (m_keypressed==1) {
+ m_keypressed = 0;
+ return 0x80;
+ }
+
+ return 0x00;
+}
+
+READ8_MEMBER(irisha_state::irisha_8255_portc_r)
+{
+ logerror("irisha_8255_portc_r\n");
+ return 0;
+}
+
+READ8_MEMBER(irisha_state::irisha_keyboard_r)
+{
+ UINT8 keycode;
+ if (m_keyboard_cnt!=0 && m_keyboard_cnt<11) {
+ keycode = ioport(keynames[m_keyboard_cnt-1])->read() ^ 0xff;
+ } else {
+ keycode = 0xff;
+ }
+ m_keyboard_cnt++;
+ return keycode;
+}
+
+WRITE8_MEMBER(irisha_state::irisha_8255_porta_w)
+{
+ logerror("irisha_8255_porta_w %02x\n",data);
+
+ m_ppi_porta = data;
+
+ update_speaker();
+}
+
+WRITE8_MEMBER(irisha_state::irisha_8255_portb_w)
+{
+ logerror("irisha_8255_portb_w %02x\n",data);
+}
+
+WRITE8_MEMBER(irisha_state::irisha_8255_portc_w)
+{
+ //logerror("irisha_8255_portc_w %02x\n",data);
+
+ if (data & 0x40)
+ pit8253_gate2_w(m_pit, (BIT(m_ppi_porta,5) && !BIT(data,5)) ? 1 : 0);
+
+ m_ppi_portc = data;
+
+ update_speaker();
+}
+
+WRITE_LINE_MEMBER(irisha_state::speaker_w)
+{
+ m_sg1_line = state;
+ update_speaker();
+}
+
+I8255A_INTERFACE( irisha_ppi8255_interface )
+{
+ DEVCB_NULL,
+ DEVCB_DRIVER_MEMBER(irisha_state, irisha_8255_porta_w),
+ DEVCB_DRIVER_MEMBER(irisha_state, irisha_8255_portb_r),
+ DEVCB_DRIVER_MEMBER(irisha_state, irisha_8255_portb_w),
+ DEVCB_DRIVER_MEMBER(irisha_state, irisha_8255_portc_r),
+ DEVCB_DRIVER_MEMBER(irisha_state, irisha_8255_portc_w),
+};
+
+static WRITE_LINE_DEVICE_HANDLER( irisha_pic_set_int_line )
+{
+ cputag_set_input_line(device->machine(), "maincpu", 0, state ? HOLD_LINE : CLEAR_LINE);
+}
+
+const struct pic8259_interface irisha_pic8259_config =
+{
+ DEVCB_LINE(irisha_pic_set_int_line),
+ DEVCB_LINE_VCC,
+ DEVCB_NULL
+};
+
+const struct pit8253_config irisha_pit8253_intf =
+{
+ {
+ {
+ XTAL_16MHz / 9,
+ DEVCB_LINE_VCC,
+ DEVCB_DEVICE_LINE("pic8259", pic8259_ir0_w)
+ },
+ {
+ XTAL_16MHz / 9 / 8 / 8,
+ DEVCB_LINE_VCC,
+ DEVCB_NULL // UART transmit/receive clock
+ },
+ {
+ XTAL_16MHz / 9,
+ DEVCB_NULL,
+ DEVCB_DRIVER_LINE_MEMBER(irisha_state, speaker_w)
+ }
+ }
+};
+
+