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