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 unsigned char *superpac_sharedram;
14 unsigned char *superpac_customio_1,*superpac_customio_2;
15 
16 static int coin1, coin2, credits, start1, start2;
17 
18 static int crednum[] = { 1, 2, 3, 6, 7, 1, 3, 1 };
19 static int credden[] = { 1, 1, 1, 1, 1, 2, 2, 3 };
20 
superpac_init_machine(void)21 void superpac_init_machine(void)
22 {
23 	/* Reset all flags */
24 	coin1 = coin2 = start1 = start2 = credits = 0;
25 }
26 
27 
READ_HANDLER(superpac_sharedram_r)28 READ_HANDLER( superpac_sharedram_r )
29 {
30 	return superpac_sharedram[offset];
31 }
32 
WRITE_HANDLER(superpac_sharedram_w)33 WRITE_HANDLER( superpac_sharedram_w )
34 {
35 	superpac_sharedram[offset] = data;
36 }
37 
38 
WRITE_HANDLER(superpac_reset_2_w)39 WRITE_HANDLER( superpac_reset_2_w )
40 {
41 	cpu_set_reset_line(1,PULSE_LINE);
42 }
43 
44 
superpac_update_credits(void)45 void superpac_update_credits (void)
46 {
47 	int val = readinputport (3) & 0x0f, temp;
48 	if (val & 1)
49 	{
50 		if (!coin1) credits++, coin1++;
51 	}
52 	else coin1 = 0;
53 
54 	if (val & 2)
55 	{
56 		if (!coin2) credits++, coin2++;
57 	}
58 	else coin2 = 0;
59 
60 	temp = readinputport (1) & 7;
61 	val = readinputport (3) >> 4;
62 	if (val & 1)
63 	{
64 		if (!start1 && credits >= credden[temp]) credits -= credden[temp], start1++;
65 	}
66 	else start1 = 0;
67 
68 	if (val & 2)
69 	{
70 		if (!start2 && credits >= 2 * credden[temp]) credits -= 2 * credden[temp], start2++;
71 	}
72 	else start2 = 0;
73 }
74 
75 
READ_HANDLER(superpac_customio_1_r)76 READ_HANDLER( superpac_customio_1_r )
77 {
78 	int val, temp;
79 
80 	/* default return value */
81 	val = superpac_customio_1[offset];
82 
83 	superpac_update_credits();
84 
85 	switch (superpac_customio_1[8])
86 	{
87 	/* mode 1 & 3 are used by Pac & Pal, and returns actual important values */
88 	case 1:
89 	case 3:
90 		switch (offset)
91 		{
92 		case 0:
93 			val = readinputport (3) & 0x0f;
94 			break;
95 
96 		case 1:
97 			val = readinputport (2) & 0x0f;
98 			break;
99 
100 		case 2:
101 			val = readinputport (4) & 0x0f;
102 			break;
103 
104 		case 3:
105 			val = (readinputport (3) >> 4) & 3;
106 			val |= val << 2;
107 
108 			/* I don't know the exact mix, but the low bit is used both for
109 			   the fire button and for player 1 start; I'm just ORing for now */
110 			val |= readinputport (2) >> 4;
111 			break;
112 
113 		case 4:
114 		case 5:
115 		case 6:
116 		case 7:
117 			val = 0x0f;
118 			break;
119 		}
120 
121 		break;
122 
123 	/* mode 4 is the standard, and returns actual important values */
124 	case 4:
125 		switch (offset)
126 		{
127 		case 0:
128 			temp = readinputport (1) & 7;
129 			val = (credits * crednum[temp] / credden[temp]) / 10;
130 			break;
131 
132 		case 1:
133 			temp = readinputport (1) & 7;
134 			val = (credits * crednum[temp] / credden[temp]) % 10;
135 			break;
136 
137 		case 4:
138 			val = readinputport (2) & 0x0f;
139 			break;
140 
141 		case 5:
142 			val = readinputport (2) >> 4;
143 			break;
144 
145 		case 6:
146 			val = readinputport (4) & 0x0f;
147 			break;
148 
149 		case 7:
150 			val = readinputport (4) >> 4;
151 			break;
152 		}
153 
154 		break;
155 
156 	/* mode 8 is the test mode: always return 0 for these locations */
157 	case 8:
158 		credits = 0;
159 		if (offset >= 9 && offset <= 15)
160 			val = 0;
161 		break;
162 	}
163 
164 	return val;
165 }
166 
167 
READ_HANDLER(superpac_customio_2_r)168 READ_HANDLER( superpac_customio_2_r )
169 {
170 	int val;
171 
172 	/* default return value */
173 	val = superpac_customio_2[offset];
174 
175 	switch (superpac_customio_2[8])
176 	{
177 	/* mode 3 is the standard for Pac & Pal, and returns actual important values */
178 	case 3:
179 		switch (offset)
180 		{
181 		case 0:
182 		case 1:
183 		case 2:
184 		case 3:
185 			val = 0;
186 			break;
187 
188 		case 4:
189 			val = readinputport (0) & 0x0f;
190 			break;
191 
192 		case 5:
193 			val = readinputport (1) >> 4;
194 			break;
195 
196 		case 6:
197 			val = readinputport (1) & 0x0f;
198 			break;
199 
200 		case 7:
201 			val = (readinputport (3) >> 4) & 0x0c;
202 			break;
203 		}
204 
205 		break;
206 
207 	/* mode 9 is the standard, and returns actual important values */
208 	case 9:
209 		switch (offset)
210 		{
211 		case 0:
212 			val = readinputport (1) & 0x0f;
213 			break;
214 
215 		case 1:
216 			val = readinputport (1) >> 4;
217 			break;
218 
219 		case 2:
220 			val = 0;
221 			break;
222 
223 		case 3:
224 			val = readinputport (0) & 0x0f;
225 			break;
226 
227 		case 4:
228 			val = readinputport (0) >> 4;
229 			break;
230 
231 		case 5:
232 			val = 0;
233 			break;
234 
235 		case 6:
236 			val = (readinputport (3) >> 4) & 0x0c;
237 			break;
238 
239 		case 7:
240 			val = 0;
241 			break;
242 		}
243 
244 		break;
245 
246 	/* mode 8 is the test mode: always return 0 for these locations */
247 	case 8:
248 		credits = 0;
249 		if (offset >= 9 && offset <= 15)
250 			val = 0;
251 		break;
252 	}
253 
254 	return val;
255 }
256 
257 
WRITE_HANDLER(superpac_interrupt_enable_w)258 WRITE_HANDLER( superpac_interrupt_enable_w )
259 {
260 	interrupt_enable_w(0, offset);
261 }
262 
263 
WRITE_HANDLER(superpac_cpu_enable_w)264 WRITE_HANDLER( superpac_cpu_enable_w )
265 {
266 	cpu_set_halt_line(1, offset ? CLEAR_LINE : ASSERT_LINE);
267 }
268