/***************************************************************************

        AC1 video driver by Miodrag Milanovic

        15/01/2009 Preliminary driver.

****************************************************************************/

#include "driver.h"
#include "machine/z80pio.h"
#include "includes/ac1.h"

static READ8_DEVICE_HANDLER (ac1_port_b_r)
{	
	return 0xff;
}

#define BNOT(x) ((x) ? 0 : 1)

static READ8_DEVICE_HANDLER (ac1_port_a_r)
{
	UINT8 line0 = input_port_read(device->machine, "LINE0");
	UINT8 line1 = input_port_read(device->machine, "LINE1");
	UINT8 line2 = input_port_read(device->machine, "LINE2");
	UINT8 line3 = input_port_read(device->machine, "LINE3");
	UINT8 line4 = input_port_read(device->machine, "LINE4");
	UINT8 line5 = input_port_read(device->machine, "LINE5");
	UINT8 line6 = input_port_read(device->machine, "LINE6");
	
	UINT8 SH    = BNOT(BIT(line6,0));
	UINT8 CTRL  = BNOT(BIT(line6,1));
	UINT8 SPACE = BIT(line6,2);
	UINT8 ENTER = BIT(line6,3);
	UINT8 BACK  = BIT(line6,4);
	
	UINT8 all = line0 | line1 | line2 | line3 | line4 | line5;
	UINT8 s1 = BNOT(BIT(all,0));UINT8 z1 = (line0 !=0) ? 0 : 1;
	UINT8 s2 = BNOT(BIT(all,1));UINT8 z2 = (line1 !=0) ? 0 : 1;
	UINT8 s3 = BNOT(BIT(all,2));UINT8 z3 = (line2 !=0) ? 0 : 1;
	UINT8 s4 = BNOT(BIT(all,3));UINT8 z4 = (line3 !=0) ? 0 : 1;
	UINT8 s5 = BNOT(BIT(all,4));UINT8 z5 = (line4 !=0) ? 0 : 1;
	UINT8 s6 = BNOT(BIT(all,5));UINT8 z6 = (line5 !=0) ? 0 : 1;
	UINT8 s7 = BNOT(BIT(all,6));
	UINT8 s8 = BNOT(BIT(all,7));
	UINT8 tast,td0,td1,td2,td3,td4,td5,td6,dg5;
	
	/* Additional double keys */
	if (SPACE) {
		z1 = 0; s1 = 0; SH = 0;
	}
	if (ENTER) {
		z4 = 0; s6 = 0; CTRL = 0;
	}
	if (BACK) {
		z4 = 0; s1 = 0; CTRL = 0;
	}
	
	tast = BNOT(s1 & s2 & s3 & s4 & s5 &s6 & s7 & s8);
	td0  = BNOT(s2 & s4 & s6 & s8);
	td1  = BNOT(s3 & s4 & s7 & s8);
	td2  = BNOT(s5 & s6 & s7 & s8);
	td3  = BNOT(z2 & z4 & z6);
	td4  = BNOT(BNOT(BNOT(z1 & z2) & SH) & z5 & z6);
	dg5  = BNOT(z3 & z4 & z5 & z6);
	td5  = BNOT(BNOT(dg5 & BNOT(SH)) & z1 & z2);
	td6  = (dg5 & CTRL);
	return td0 + (td1 << 1) +(td2 << 2) +(td3 << 3) +(td4 << 4) +(td5 << 5) +(td6 << 6) +(tast << 7);	
}

static WRITE8_DEVICE_HANDLER (ac1_port_a_w)
{
}

static WRITE8_DEVICE_HANDLER (ac1_port_b_w)
{
}

const z80pio_interface ac1_z80pio_intf =
{
	NULL,	/* callback when change interrupt status */
	ac1_port_a_r,
	ac1_port_b_r,
	ac1_port_a_w,
	ac1_port_b_w,
	NULL,
	NULL
};

/* Driver initialization */
DRIVER_INIT(ac1)
{
}

MACHINE_RESET( ac1 )
{
}
