1 /***************************************************************************
2 
3   machine.c
4 
5   Functions to emulate general aspects of the machine (RAM, ROM, interrupts,
6   I/O ports)
7 
8 ***************************************************************************/
9 
10 #include "driver.h"
11 
12 
13 
14 int arkanoid_paddle_select;
15 
16 static int z80write,fromz80,m68705write,toz80;
17 
18 static unsigned char portA_in,portA_out,ddrA;
19 static unsigned char portC_out,ddrC;
20 
21 FILE *thelog;
22 
arkanoid_init_machine(void)23 void arkanoid_init_machine(void)
24 {
25 	portA_in = portA_out = z80write = m68705write = 0;
26 }
27 
READ_HANDLER(arkanoid_Z80_mcu_r)28 READ_HANDLER( arkanoid_Z80_mcu_r )
29 {
30 	/* return the last value the 68705 wrote, and mark that we've read it */
31 	m68705write = 0;
32 	return toz80;
33 }
34 
WRITE_HANDLER(arkanoid_Z80_mcu_w)35 WRITE_HANDLER( arkanoid_Z80_mcu_w )
36 {
37 	/* a write from the Z80 has occurred, mark it and remember the value */
38 	z80write = 1;
39 	fromz80 = data;
40 
41 	/* give up a little bit of time to let the 68705 detect the write */
42 	cpu_spinuntil_trigger(700);
43 }
44 
READ_HANDLER(arkanoid_68705_portA_r)45 READ_HANDLER( arkanoid_68705_portA_r )
46 {
47 	return (portA_out & ddrA) | (portA_in & ~ddrA);
48 }
49 
WRITE_HANDLER(arkanoid_68705_portA_w)50 WRITE_HANDLER( arkanoid_68705_portA_w )
51 {
52 	portA_out = data;
53 }
54 
WRITE_HANDLER(arkanoid_68705_ddrA_w)55 WRITE_HANDLER( arkanoid_68705_ddrA_w )
56 {
57 	ddrA = data;
58 }
59 
60 
READ_HANDLER(arkanoid_68705_portC_r)61 READ_HANDLER( arkanoid_68705_portC_r )
62 {
63 	int res=0;
64 
65 	/* bit 0 is high on a write strobe; clear it once we've detected it */
66 	if (z80write) res |= 0x01;
67 
68 	/* bit 1 is high if the previous write has been read */
69 	if (!m68705write) res |= 0x02;
70 
71 	return (portC_out & ddrC) | (res & ~ddrC);
72 }
73 
WRITE_HANDLER(arkanoid_68705_portC_w)74 WRITE_HANDLER( arkanoid_68705_portC_w )
75 {
76 	if ((ddrC & 0x04) && (~data & 0x04) && (portC_out & 0x04))
77 	{
78 		/* mark that the command has been seen */
79 		cpu_trigger(700);
80 
81 		/* return the last value the Z80 wrote */
82 		z80write = 0;
83 		portA_in = fromz80;
84 	}
85 	if ((ddrC & 0x08) && (~data & 0x08) && (portC_out & 0x08))
86 	{
87 		/* a write from the 68705 to the Z80; remember its value */
88 		m68705write = 1;
89 		toz80 = portA_out;
90 	}
91 
92 	portC_out = data;
93 }
94 
WRITE_HANDLER(arkanoid_68705_ddrC_w)95 WRITE_HANDLER( arkanoid_68705_ddrC_w )
96 {
97 	ddrC = data;
98 }
99 
100 
101 
READ_HANDLER(arkanoid_68705_input_0_r)102 READ_HANDLER( arkanoid_68705_input_0_r )
103 {
104 	int res = input_port_0_r(offset) & 0x3f;
105 
106 	/* bit 0x40 comes from the sticky bit */
107 	if (!z80write) res |= 0x40;
108 
109 	/* bit 0x80 comes from a write latch */
110 	if (!m68705write) res |= 0x80;
111 
112 	return res;
113 }
114 
READ_HANDLER(arkanoid_input_2_r)115 READ_HANDLER( arkanoid_input_2_r )
116 {
117 	if (arkanoid_paddle_select)
118 	{
119 		return input_port_3_r(offset);
120 	}
121 	else
122 	{
123 		return input_port_2_r(offset);
124 	}
125 }
126 
127