Previous 15994 Revisions Next

r14342 Saturday 4th February, 2012 at 13:56:27 UTC by Curt Coder
[C64] Retired old driver, moved Ultimax to its own driver (vic10). [Curt Coder]
[hash]max.xml vic10.xml*
[src/mess]mess.lst mess.mak
[src/mess/drivers]c128.c c64.c c64x.c c65.c vic10.c*
[src/mess/includes]c128.h c64.h c64_legacy.h* c64x.h c65.h vic10.h*
[src/mess/machine]c128.c c64.c c65.c cbmipt.c cbmipt.h vic10exp.c* vic10exp.h* vic10std.c* vic10std.h*

hash/max.xml
r14341r14342
1<?xml version="1.0"?>
2<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
3<softwarelist name="max" description="Commodore Max / Ultimax / VIC10 cartridges">
4
5   <software name="avengera" cloneof="avenger">
6      <description>Avenger (Jpn, v.02)</description>
7      <year>1982</year>
8      <publisher>Commodore</publisher>
9      <info name="serial" value="C-64621" />
10      <part name="cart" interface="ultimax_cart">
11         <feature name="game" value="0" />
12         <feature name="exrom" value="1" />
13
14         <dataarea name="romh" size="8192">
15            <rom name="avengera.bin" size="8192" crc="e80c1019" sha1="6c715fded043e339f2b897956ffde0fac2caf25a" offset="0x0000" />
16         </dataarea>
17      </part>
18   </software>
19
20   <software name="avenger">
21      <description>Avenger (Euro, USA)</description>
22      <year>1983</year>
23      <publisher>Commodore</publisher>
24      <info name="serial" value="C-64621" />
25      <part name="cart" interface="ultimax_cart">
26         <feature name="game" value="0" />
27         <feature name="exrom" value="1" />
28
29         <dataarea name="romh" size="8192">
30            <rom name="avenger.bin" size="8192" crc="d4e52fd4" sha1="78e0b6f764668d8f551810bfd62332b6059053c2" offset="0x0000" />
31         </dataarea>
32      </part>
33   </software>
34
35   <software name="bowling">
36      <description>Bowling (Jpn)</description>
37      <year>1983</year>
38      <publisher>HAL Laboratory</publisher>
39      <part name="cart" interface="ultimax_cart">
40         <feature name="game" value="0" />
41         <feature name="exrom" value="1" />
42
43         <dataarea name="roml" size="8192">
44            <rom name="bowling.80" size="8192" crc="95894739" sha1="6b7bf66b094286606a10ec0345d04f725c22920e" offset="0x0000" />
45         </dataarea>
46         <dataarea name="romh" size="8192">
47            <rom name="bowling.e0" size="8192" crc="f3950757" sha1="37146c6bd9eec5edd4524a7423fa8a0a7bec4698" offset="0x0000" />
48         </dataarea>
49      </part>
50   </software>
51
52   <software name="clownsa" cloneof="clowns">
53      <description>Clowns (Jpn, v.01)</description>
54      <year>1982</year>
55      <publisher>Commodore</publisher>
56      <info name="serial" value="C-64606" />
57      <part name="cart" interface="ultimax_cart">
58         <feature name="game" value="0" />
59         <feature name="exrom" value="1" />
60
61         <dataarea name="romh" size="8192">
62            <rom name="clownsa.bin" size="8192" crc="d50c1428" sha1="fb48b5a639e4235ce522d62c5f8713d66102c75e" offset="0x0000" />
63         </dataarea>
64      </part>
65   </software>
66
67   <software name="clowns">
68      <description>Clowns (Jpn, Newer)</description>
69      <year>1982</year>
70      <publisher>Commodore</publisher>
71      <info name="serial" value="C-64606" />
72      <part name="cart" interface="ultimax_cart">
73         <feature name="game" value="0" />
74         <feature name="exrom" value="1" />
75
76         <dataarea name="romh" size="8192">
77            <rom name="clowns.bin" size="8192" crc="85aa080b" sha1="ffebfc19263dc50d3a808135dbe88567617af6b8" offset="0x0000" />
78         </dataarea>
79      </part>
80   </software>
81
82   <software name="jupiter">
83      <description>Jupiter Lander (World, v.02)</description>
84      <year>1982</year>
85      <publisher>Commodore / HAL Laboratory</publisher>
86      <info name="serial" value="C-64601" />
87      <part name="cart" interface="ultimax_cart">
88         <feature name="game" value="0" />
89         <feature name="exrom" value="1" />
90
91         <dataarea name="romh" size="8192">
92            <rom name="jupiter.bin" size="8192" crc="a5af43e5" sha1="d6620a6f38a14e51ed98d26a0c721f5c80fcd8f3" offset="0x0000" />
93         </dataarea>
94      </part>
95   </software>
96
97   <software name="kickman">
98      <description>Kickman (World, v.03)</description>
99      <year>1982</year>
100      <publisher>Commodore / HAL Laboratory</publisher>
101      <info name="serial" value="C-64602" />
102      <part name="cart" interface="ultimax_cart">
103         <feature name="game" value="0" />
104         <feature name="exrom" value="1" />
105
106         <dataarea name="romh" size="8192">
107            <rom name="kickman.bin" size="8192" crc="f15dcfe7" sha1="7d8091a2b560644f10d39449775e6a8447e772ca" offset="0x0000" />
108         </dataarea>
109      </part>
110   </software>
111
112   <software name="lemans">
113      <description>Le Mans (Euro, USA)</description>
114      <year>1982</year>
115      <publisher>Commodore / HAL Laboratory</publisher>
116      <info name="serial" value="C-64616" />
117      <part name="cart" interface="ultimax_cart">
118         <feature name="game" value="0" />
119         <feature name="exrom" value="1" />
120
121         <dataarea name="romh" size="8192">
122            <rom name="lemans.bin" size="8192" crc="5cdba9a9" sha1="c6a3e317a09b7232878c892b61d9d0204e482439" offset="0x0000" />
123         </dataarea>
124      </part>
125   </software>
126
127   <software name="basic">
128      <description>MAX Basic (Jpn)</description>
129      <year>19??</year>
130      <publisher>Commodore</publisher>
131      <part name="cart" interface="ultimax_cart">
132         <feature name="game" value="0" />
133         <feature name="exrom" value="1" />
134
135         <dataarea name="roml" size="8192">
136            <rom name="basic.80" size="8192" crc="489aab86" sha1="448e0403baed7fcdc3be6ce8497958beaf3b4566" offset="0x0000" />
137         </dataarea>
138         <dataarea name="romh" size="8192">
139            <rom name="basic.e0" size="8192" crc="caac20ff" sha1="f31ba36a5f8fca7722d4b482716166b578301ed4" offset="0x0000" />
140         </dataarea>
141      </part>
142   </software>
143
144   <software name="minibas">
145      <description>Mini Basic I (Jpn)</description>
146      <year>19??</year>
147      <publisher>Commodore</publisher>
148      <part name="cart" interface="ultimax_cart">
149         <feature name="game" value="0" />
150         <feature name="exrom" value="1" />
151
152         <dataarea name="romh" size="8192">
153            <rom name="minibas.bin" size="8192" crc="65ad75c8" sha1="dd77e7b59c44a40fc77b783818f71b5e49ea820d" offset="0x0000" />
154         </dataarea>
155      </part>
156   </software>
157
158   <software name="moleatck">
159      <description>Mole Attack (Jpn, v.01)</description>
160      <year>1982</year>
161      <publisher>Commodore / HAL Laboratory</publisher>
162      <part name="cart" interface="ultimax_cart">
163         <feature name="game" value="0" />
164         <feature name="exrom" value="1" />
165
166         <dataarea name="romh" size="8192">
167            <rom name="moleatck.bin" size="8192" crc="1a26d98b" sha1="49270fd55a9be51361673d4f4722ed3101bd0b27" offset="0x0000" />
168         </dataarea>
169      </part>
170   </software>
171
172   <software name="moneywar">
173      <description>Money Wars (Jpn, v.01)</description>
174      <year>1982</year>
175      <publisher>Commodore / HAL Laboratory</publisher>
176      <part name="cart" interface="ultimax_cart">
177         <feature name="game" value="0" />
178         <feature name="exrom" value="1" />
179
180         <dataarea name="romh" size="8192">
181            <rom name="moneywar.bin" size="8192" crc="909f78c1" sha1="2449fb3ee8e502eebd6b51109d58399a6e1ad783" offset="0x0000" />
182         </dataarea>
183      </part>
184   </software>
185
186   <software name="musicmak">
187      <!-- Alt title: Music Composer (on all lists, also on CBM part list) -->
188      <description>Music Maker (World)</description>
189      <year>1982</year>
190      <publisher>Commodore</publisher>
191      <info name="serial" value="C-64403" />
192      <part name="cart" interface="ultimax_cart">
193         <feature name="game" value="0" />
194         <feature name="exrom" value="1" />
195
196         <dataarea name="romh" size="8192">
197            <rom name="musicmak.bin" size="8192" crc="95b82cf4" sha1="a8467cf175c4e1a5560042a60268dd4db7ac58c6" offset="0x0000" />
198         </dataarea>
199      </part>
200   </software>
201
202   <software name="musicm">
203      <description>Music Machine (Euro, USA)</description>
204      <year>1982</year>
205      <publisher>Commodore</publisher>
206      <info name="serial" value="C-64402" />
207      <part name="cart" interface="ultimax_cart">
208         <feature name="game" value="0" />
209         <feature name="exrom" value="1" />
210
211         <dataarea name="romh" size="8192">
212            <rom name="musicm.bin" size="4096" crc="f86946a9" sha1="2592d8716331804dbc07d406e10f009ec472b7b2" offset="0x1000" />
213         </dataarea>
214      </part>
215   </software>
216
217   <software name="omegar">
218      <description>Omega Race (Jpn, v.02)</description>
219      <year>1982</year>
220      <publisher>Commodore</publisher>
221      <info name="serial" value="C-64614" />
222      <part name="cart" interface="ultimax_cart">
223         <feature name="game" value="0" />
224         <feature name="exrom" value="1" />
225
226         <dataarea name="romh" size="8192">
227            <rom name="omegar.bin" size="8192" crc="dbb11bb4" sha1="1c1d4179dce0209664e611e6fdc96b195bcf7a55" offset="0x0000" />
228         </dataarea>
229      </part>
230   </software>
231
232   <software name="pinball">
233      <description>Pinball Spectacular (World)</description>
234      <year>1983</year>
235      <publisher>Commodore / HAL Laboratory</publisher>
236      <info name="serial" value="C-64617" />
237      <part name="cart" interface="ultimax_cart">
238         <feature name="game" value="0" />
239         <feature name="exrom" value="1" />
240
241         <dataarea name="roml" size="4096">
242            <rom name="pinball.80" size="4096" crc="1dd12488" sha1="dc725c526d9359437fbe37b0635173f83dd8bcfc" offset="0x0000" />
243         </dataarea>
244         <dataarea name="romh" size="8192">
245            <rom name="pinball.e0" size="8192" crc="b64a4507" sha1="ec019df6e914a973d2cb83c5baf4cffc798ba1dd" offset="0x0000" />
246         </dataarea>
247      </part>
248   </software>
249
250   <software name="radarrr2" cloneof="radarrr">
251      <description>Radar Rat Race (Alt)</description>
252      <year>1982</year>
253      <publisher>Commodore</publisher>
254      <info name="serial" value="C-64605" />
255      <part name="cart" interface="ultimax_cart">
256         <feature name="game" value="0" />
257         <feature name="exrom" value="1" />
258
259         <dataarea name="romh" size="8192">
260            <rom name="radarrr2.bin" size="8192" crc="1f7291f5" sha1="409d70bc29134494c44d03dde47357a265089d1a" offset="0x0000" />
261         </dataarea>
262      </part>
263   </software>
264
265   <software name="radarrr1" cloneof="radarrr">
266      <description>Radar Rat Race (Jpn, v.02, Alt)</description>
267      <year>1982</year>
268      <publisher>Commodore</publisher>
269      <info name="serial" value="C-64605" />
270      <part name="cart" interface="ultimax_cart">
271         <feature name="game" value="0" />
272         <feature name="exrom" value="1" />
273
274         <dataarea name="romh" size="8192">
275            <rom name="radarrr1.bin" size="8192" crc="bfaebf6b" sha1="aa71572d16440734ed0ed9ee253a11237765ea22" offset="0x0000" />
276         </dataarea>
277      </part>
278   </software>
279
280   <software name="radarrr">
281      <description>Radar Rat Race (Jpn, v.02)</description>
282      <year>1982</year>
283      <publisher>Commodore</publisher>
284      <info name="serial" value="C-64605" />
285      <part name="cart" interface="ultimax_cart">
286         <feature name="game" value="0" />
287         <feature name="exrom" value="1" />
288
289         <dataarea name="romh" size="8192">
290            <rom name="radarrr.bin" size="8192" crc="cf74e0a0" sha1="c7190cb744fef2e7502cbbd4ccf8042c9bf89ae3" offset="0x0000" />
291         </dataarea>
292      </part>
293   </software>
294
295   <software name="roadrace">
296      <description>Road Race (Jpn, v.02)</description>
297      <year>1983</year>
298      <publisher>Commodore / HAL Laboratory</publisher>
299      <part name="cart" interface="ultimax_cart">
300         <dataarea name="romh" size="8192">
301            <rom name="roadrace.bin" size="8192" crc="43ecc555" sha1="0e074d796a5e783e509c57716400a13bb59335cb" offset="0x0000" />
302         </dataarea>
303      </part>
304   </software>
305
306   <software name="seawolf">
307      <description>Sea Wolf (Euro, USA)</description>
308      <year>1982</year>
309      <publisher>Commodore</publisher>
310      <info name="serial" value="C-64603" />
311      <part name="cart" interface="ultimax_cart">
312         <feature name="game" value="0" />
313         <feature name="exrom" value="1" />
314
315         <dataarea name="romh" size="8192">
316            <rom name="seawolf.bin" size="8192" crc="10daba85" sha1="90d5665bf22c7ebc10d6ebcc533fd2e8272ab7c7" offset="0x0000" />
317         </dataarea>
318      </part>
319   </software>
320
321   <software name="spedmath">
322      <description>Speed Math &amp; Bingo Math (Euro, USA, v.01)</description>
323      <year>1982</year>
324      <publisher>Commodore</publisher>
325      <info name="serial" value="C-64604" />
326      <part name="cart" interface="ultimax_cart">
327         <feature name="game" value="0" />
328         <feature name="exrom" value="1" />
329
330         <dataarea name="romh" size="8192">
331            <rom name="spedmath.bin" size="8192" crc="c2fad208" sha1="9fd52d27d11e40a12fcad5e37e5e01d00961a794" offset="0x0000" />
332         </dataarea>
333      </part>
334   </software>
335
336   <software name="supalien">
337      <description>Super Alien (Jpn, v.01)</description>
338      <year>1982</year>
339      <publisher>Commodore</publisher>
340      <part name="cart" interface="ultimax_cart">
341         <feature name="game" value="0" />
342         <feature name="exrom" value="1" />
343
344         <dataarea name="romh" size="8192">
345            <rom name="supalien.bin" size="8192" crc="8d5177a1" sha1="c38aad32bfcb9a90c110ddcafa5cb73dcaba8cdd" offset="0x0000" />
346         </dataarea>
347      </part>
348   </software>
349
350   <software name="solarsys">
351      <description>The Visible Solar System (Euro, USA)</description>
352      <year>1982</year>
353      <publisher>Commodore</publisher>
354      <info name="serial" value="C-64609" />
355      <part name="cart" interface="ultimax_cart">
356         <feature name="game" value="0" />
357         <feature name="exrom" value="1" />
358
359         <dataarea name="romh" size="8192">
360            <rom name="solarsys.bin" size="8192" crc="400f79c8" sha1="b6d20a2b8781838186a5ad8d1494df4124c8a326" offset="0x0000" />
361         </dataarea>
362      </part>
363   </software>
364
365   <software name="wowa" cloneof="wow">
366      <description>Wizard of Wor (Jpn)</description>
367      <year>1982</year>
368      <publisher>Commodore</publisher>
369      <info name="serial" value="C-64615" />
370      <part name="cart" interface="ultimax_cart">
371         <feature name="game" value="0" />
372         <feature name="exrom" value="1" />
373
374         <dataarea name="romh" size="8192">
375            <rom name="wizard of wor (japan) (max).bin" size="8192" crc="4178f536" sha1="65162698ec8e658aa582a5a7a209b3bda704cbb9" offset="0x0000" />
376         </dataarea>
377      </part>
378   </software>
379
380   <software name="wow">
381      <description>Wizard of Wor (Jpn, v.02)</description>
382      <year>1982</year>
383      <publisher>Commodore</publisher>
384      <info name="serial" value="C-64615" />
385      <part name="cart" interface="ultimax_cart">
386         <feature name="game" value="0" />
387         <feature name="exrom" value="1" />
388
389         <dataarea name="romh" size="8192">
390            <rom name="wizard of wor (japan) (v02) (max).bin" size="8192" crc="5cd2948e" sha1="f0f30868331d85e29b3adfaf71bc0abeb042ff42" offset="0x0000" />
391         </dataarea>
392      </part>
393   </software>
394
395</softwarelist>
hash/vic10.xml
r0r14342
1<?xml version="1.0"?>
2<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
3<softwarelist name="vic10" description="Commodore VIC-10 / Max Machine / UltiMax cartridges">
4 
5   <software name="avengera" cloneof="avenger">
6      <description>Avenger (Jpn, v.02)</description>
7      <year>1982</year>
8      <publisher>Commodore</publisher>
9      <info name="serial" value="C-64621" />
10      <part name="cart" interface="vic10_cart">
11         <feature name="game" value="0" />
12         <feature name="exrom" value="1" />
13 
14         <dataarea name="uprom" size="0x2000">
15            <rom name="avengera.bin" size="0x2000" crc="e80c1019" sha1="6c715fded043e339f2b897956ffde0fac2caf25a" offset="0x0000" />
16         </dataarea>
17      </part>
18   </software>
19 
20   <software name="avenger">
21      <description>Avenger (Euro, USA)</description>
22      <year>1983</year>
23      <publisher>Commodore</publisher>
24      <info name="serial" value="C-64621" />
25      <part name="cart" interface="vic10_cart">
26         <feature name="game" value="0" />
27         <feature name="exrom" value="1" />
28 
29         <dataarea name="uprom" size="0x2000">
30            <rom name="avenger.bin" size="0x2000" crc="d4e52fd4" sha1="78e0b6f764668d8f551810bfd62332b6059053c2" offset="0x0000" />
31         </dataarea>
32      </part>
33   </software>
34 
35   <software name="bowling">
36      <description>Bowling (Jpn)</description>
37      <year>1983</year>
38      <publisher>HAL Laboratory</publisher>
39      <part name="cart" interface="vic10_cart">
40         <feature name="game" value="0" />
41         <feature name="exrom" value="1" />
42 
43         <dataarea name="lorom" size="0x2000">
44            <rom name="bowling.80" size="0x2000" crc="95894739" sha1="6b7bf66b094286606a10ec0345d04f725c22920e" offset="0x0000" />
45         </dataarea>
46         <dataarea name="uprom" size="0x2000">
47            <rom name="bowling.e0" size="0x2000" crc="f3950757" sha1="37146c6bd9eec5edd4524a7423fa8a0a7bec4698" offset="0x0000" />
48         </dataarea>
49      </part>
50   </software>
51 
52   <software name="clownsa" cloneof="clowns">
53      <description>Clowns (Jpn, v.01)</description>
54      <year>1982</year>
55      <publisher>Commodore</publisher>
56      <info name="serial" value="C-64606" />
57      <part name="cart" interface="vic10_cart">
58         <feature name="game" value="0" />
59         <feature name="exrom" value="1" />
60 
61         <dataarea name="uprom" size="0x2000">
62            <rom name="clownsa.bin" size="0x2000" crc="d50c1428" sha1="fb48b5a639e4235ce522d62c5f8713d66102c75e" offset="0x0000" />
63         </dataarea>
64      </part>
65   </software>
66 
67   <software name="clowns">
68      <description>Clowns (Jpn, Newer)</description>
69      <year>1982</year>
70      <publisher>Commodore</publisher>
71      <info name="serial" value="C-64606" />
72      <part name="cart" interface="vic10_cart">
73         <feature name="game" value="0" />
74         <feature name="exrom" value="1" />
75 
76         <dataarea name="uprom" size="0x2000">
77            <rom name="clowns.bin" size="0x2000" crc="85aa080b" sha1="ffebfc19263dc50d3a808135dbe88567617af6b8" offset="0x0000" />
78         </dataarea>
79      </part>
80   </software>
81 
82   <software name="jupiter">
83      <description>Jupiter Lander (World, v.02)</description>
84      <year>1982</year>
85      <publisher>Commodore / HAL Laboratory</publisher>
86      <info name="serial" value="C-64601" />
87      <part name="cart" interface="vic10_cart">
88         <feature name="game" value="0" />
89         <feature name="exrom" value="1" />
90 
91         <dataarea name="uprom" size="0x2000">
92            <rom name="jupiter.bin" size="0x2000" crc="a5af43e5" sha1="d6620a6f38a14e51ed98d26a0c721f5c80fcd8f3" offset="0x0000" />
93         </dataarea>
94      </part>
95   </software>
96 
97   <software name="kickman">
98      <description>Kickman (World, v.03)</description>
99      <year>1982</year>
100      <publisher>Commodore / HAL Laboratory</publisher>
101      <info name="serial" value="C-64602" />
102      <part name="cart" interface="vic10_cart">
103         <feature name="game" value="0" />
104         <feature name="exrom" value="1" />
105 
106         <dataarea name="uprom" size="0x2000">
107            <rom name="kickman.bin" size="0x2000" crc="f15dcfe7" sha1="7d8091a2b560644f10d39449775e6a8447e772ca" offset="0x0000" />
108         </dataarea>
109      </part>
110   </software>
111 
112   <software name="lemans">
113      <description>Le Mans (Euro, USA)</description>
114      <year>1982</year>
115      <publisher>Commodore / HAL Laboratory</publisher>
116      <info name="serial" value="C-64616" />
117      <part name="cart" interface="vic10_cart">
118         <feature name="game" value="0" />
119         <feature name="exrom" value="1" />
120 
121         <dataarea name="uprom" size="0x2000">
122            <rom name="lemans.bin" size="0x2000" crc="5cdba9a9" sha1="c6a3e317a09b7232878c892b61d9d0204e482439" offset="0x0000" />
123         </dataarea>
124      </part>
125   </software>
126 
127   <software name="basic">
128      <description>MAX Basic (Jpn)</description>
129      <year>19??</year>
130      <publisher>Commodore</publisher>
131      <part name="cart" interface="vic10_cart">
132         <feature name="game" value="0" />
133         <feature name="exrom" value="1" />
134 
135         <dataarea name="lorom" size="0x2000">
136            <rom name="basic.80" size="0x2000" crc="489aab86" sha1="448e0403baed7fcdc3be6ce8497958beaf3b4566" offset="0x0000" />
137         </dataarea>
138         <dataarea name="uprom" size="0x2000">
139            <rom name="basic.e0" size="0x2000" crc="caac20ff" sha1="f31ba36a5f8fca7722d4b482716166b578301ed4" offset="0x0000" />
140         </dataarea>
141         <dataarea name="exram" size="0x800" />
142      </part>
143   </software>
144 
145   <software name="minibas">
146      <description>Mini Basic I (Jpn)</description>
147      <year>19??</year>
148      <publisher>Commodore</publisher>
149      <part name="cart" interface="vic10_cart">
150         <feature name="game" value="0" />
151         <feature name="exrom" value="1" />
152 
153         <dataarea name="uprom" size="0x2000">
154            <rom name="minibas.bin" size="0x2000" crc="65ad75c8" sha1="dd77e7b59c44a40fc77b783818f71b5e49ea820d" offset="0x0000" />
155         </dataarea>
156      </part>
157   </software>
158 
159   <software name="moleatck">
160      <description>Mole Attack (Jpn, v.01)</description>
161      <year>1982</year>
162      <publisher>Commodore / HAL Laboratory</publisher>
163      <part name="cart" interface="vic10_cart">
164         <feature name="game" value="0" />
165         <feature name="exrom" value="1" />
166 
167         <dataarea name="uprom" size="0x2000">
168            <rom name="moleatck.bin" size="0x2000" crc="1a26d98b" sha1="49270fd55a9be51361673d4f4722ed3101bd0b27" offset="0x0000" />
169         </dataarea>
170      </part>
171   </software>
172 
173   <software name="moneywar">
174      <description>Money Wars (Jpn, v.01)</description>
175      <year>1982</year>
176      <publisher>Commodore / HAL Laboratory</publisher>
177      <part name="cart" interface="vic10_cart">
178         <feature name="game" value="0" />
179         <feature name="exrom" value="1" />
180 
181         <dataarea name="uprom" size="0x2000">
182            <rom name="moneywar.bin" size="0x2000" crc="909f78c1" sha1="2449fb3ee8e502eebd6b51109d58399a6e1ad783" offset="0x0000" />
183         </dataarea>
184      </part>
185   </software>
186 
187   <software name="musicmak">
188      <!-- Alt title: Music Composer (on all lists, also on CBM part list) -->
189      <description>Music Maker (World)</description>
190      <year>1982</year>
191      <publisher>Commodore</publisher>
192      <info name="serial" value="C-64403" />
193      <part name="cart" interface="vic10_cart">
194         <feature name="game" value="0" />
195         <feature name="exrom" value="1" />
196 
197         <dataarea name="uprom" size="0x2000">
198            <rom name="musicmak.bin" size="0x2000" crc="95b82cf4" sha1="a8467cf175c4e1a5560042a60268dd4db7ac58c6" offset="0x0000" />
199         </dataarea>
200      </part>
201   </software>
202 
203   <software name="musicm">
204      <description>Music Machine (Euro, USA)</description>
205      <year>1982</year>
206      <publisher>Commodore</publisher>
207      <info name="serial" value="C-64402" />
208      <part name="cart" interface="vic10_cart">
209         <feature name="game" value="0" />
210         <feature name="exrom" value="1" />
211 
212         <dataarea name="uprom" size="0x2000">
213            <rom name="musicm.bin" size="0x1000" crc="f86946a9" sha1="2592d8716331804dbc07d406e10f009ec472b7b2" offset="0x1000" />
214         </dataarea>
215      </part>
216   </software>
217 
218   <software name="omegar">
219      <description>Omega Race (Jpn, v.02)</description>
220      <year>1982</year>
221      <publisher>Commodore</publisher>
222      <info name="serial" value="C-64614" />
223      <part name="cart" interface="vic10_cart">
224         <feature name="game" value="0" />
225         <feature name="exrom" value="1" />
226 
227         <dataarea name="uprom" size="0x2000">
228            <rom name="omegar.bin" size="0x2000" crc="dbb11bb4" sha1="1c1d4179dce0209664e611e6fdc96b195bcf7a55" offset="0x0000" />
229         </dataarea>
230      </part>
231   </software>
232 
233   <software name="pinball">
234      <description>Pinball Spectacular (World)</description>
235      <year>1983</year>
236      <publisher>Commodore / HAL Laboratory</publisher>
237      <info name="serial" value="C-64617" />
238      <part name="cart" interface="vic10_cart">
239         <feature name="game" value="0" />
240         <feature name="exrom" value="1" />
241 
242         <dataarea name="lorom" size="0x2000">
243            <rom name="pinball.80" size="0x1000" crc="1dd12488" sha1="dc725c526d9359437fbe37b0635173f83dd8bcfc" offset="0x0000" />
244         </dataarea>
245         <dataarea name="uprom" size="0x2000">
246            <rom name="pinball.e0" size="0x2000" crc="b64a4507" sha1="ec019df6e914a973d2cb83c5baf4cffc798ba1dd" offset="0x0000" />
247         </dataarea>
248      </part>
249   </software>
250 
251   <software name="radarrr2" cloneof="radarrr">
252      <description>Radar Rat Race (Alt)</description>
253      <year>1982</year>
254      <publisher>Commodore</publisher>
255      <info name="serial" value="C-64605" />
256      <part name="cart" interface="vic10_cart">
257         <feature name="game" value="0" />
258         <feature name="exrom" value="1" />
259 
260         <dataarea name="uprom" size="0x2000">
261            <rom name="radarrr2.bin" size="0x2000" crc="1f7291f5" sha1="409d70bc29134494c44d03dde47357a265089d1a" offset="0x0000" />
262         </dataarea>
263      </part>
264   </software>
265 
266   <software name="radarrr1" cloneof="radarrr">
267      <description>Radar Rat Race (Jpn, v.02, Alt)</description>
268      <year>1982</year>
269      <publisher>Commodore</publisher>
270      <info name="serial" value="C-64605" />
271      <part name="cart" interface="vic10_cart">
272         <feature name="game" value="0" />
273         <feature name="exrom" value="1" />
274 
275         <dataarea name="uprom" size="0x2000">
276            <rom name="radarrr1.bin" size="0x2000" crc="bfaebf6b" sha1="aa71572d16440734ed0ed9ee253a11237765ea22" offset="0x0000" />
277         </dataarea>
278      </part>
279   </software>
280 
281   <software name="radarrr">
282      <description>Radar Rat Race (Jpn, v.02)</description>
283      <year>1982</year>
284      <publisher>Commodore</publisher>
285      <info name="serial" value="C-64605" />
286      <part name="cart" interface="vic10_cart">
287         <feature name="game" value="0" />
288         <feature name="exrom" value="1" />
289 
290         <dataarea name="uprom" size="0x2000">
291            <rom name="radarrr.bin" size="0x2000" crc="cf74e0a0" sha1="c7190cb744fef2e7502cbbd4ccf8042c9bf89ae3" offset="0x0000" />
292         </dataarea>
293      </part>
294   </software>
295 
296   <software name="roadrace">
297      <description>Road Race (Jpn, v.02)</description>
298      <year>1983</year>
299      <publisher>Commodore / HAL Laboratory</publisher>
300      <part name="cart" interface="vic10_cart">
301         <dataarea name="uprom" size="0x2000">
302            <rom name="roadrace.bin" size="0x2000" crc="43ecc555" sha1="0e074d796a5e783e509c57716400a13bb59335cb" offset="0x0000" />
303         </dataarea>
304      </part>
305   </software>
306 
307   <software name="seawolf">
308      <description>Sea Wolf (Euro, USA)</description>
309      <year>1982</year>
310      <publisher>Commodore</publisher>
311      <info name="serial" value="C-64603" />
312      <part name="cart" interface="vic10_cart">
313         <feature name="game" value="0" />
314         <feature name="exrom" value="1" />
315 
316         <dataarea name="uprom" size="0x2000">
317            <rom name="seawolf.bin" size="0x2000" crc="10daba85" sha1="90d5665bf22c7ebc10d6ebcc533fd2e8272ab7c7" offset="0x0000" />
318         </dataarea>
319      </part>
320   </software>
321 
322   <software name="spedmath">
323      <description>Speed Math &amp; Bingo Math (Euro, USA, v.01)</description>
324      <year>1982</year>
325      <publisher>Commodore</publisher>
326      <info name="serial" value="C-64604" />
327      <part name="cart" interface="vic10_cart">
328         <feature name="game" value="0" />
329         <feature name="exrom" value="1" />
330 
331         <dataarea name="uprom" size="0x2000">
332            <rom name="spedmath.bin" size="0x2000" crc="c2fad208" sha1="9fd52d27d11e40a12fcad5e37e5e01d00961a794" offset="0x0000" />
333         </dataarea>
334      </part>
335   </software>
336 
337   <software name="supalien">
338      <description>Super Alien (Jpn, v.01)</description>
339      <year>1982</year>
340      <publisher>Commodore</publisher>
341      <part name="cart" interface="vic10_cart">
342         <feature name="game" value="0" />
343         <feature name="exrom" value="1" />
344 
345         <dataarea name="uprom" size="0x2000">
346            <rom name="supalien.bin" size="0x2000" crc="8d5177a1" sha1="c38aad32bfcb9a90c110ddcafa5cb73dcaba8cdd" offset="0x0000" />
347         </dataarea>
348      </part>
349   </software>
350 
351   <software name="solarsys">
352      <description>The Visible Solar System (Euro, USA)</description>
353      <year>1982</year>
354      <publisher>Commodore</publisher>
355      <info name="serial" value="C-64609" />
356      <part name="cart" interface="vic10_cart">
357         <feature name="game" value="0" />
358         <feature name="exrom" value="1" />
359 
360         <dataarea name="uprom" size="0x2000">
361            <rom name="solarsys.bin" size="0x2000" crc="400f79c8" sha1="b6d20a2b8781838186a5ad8d1494df4124c8a326" offset="0x0000" />
362         </dataarea>
363      </part>
364   </software>
365 
366   <software name="wowa" cloneof="wow">
367      <description>Wizard of Wor (Jpn)</description>
368      <year>1982</year>
369      <publisher>Commodore</publisher>
370      <info name="serial" value="C-64615" />
371      <part name="cart" interface="vic10_cart">
372         <feature name="game" value="0" />
373         <feature name="exrom" value="1" />
374 
375         <dataarea name="uprom" size="0x2000">
376            <rom name="wizard of wor (japan) (max).bin" size="0x2000" crc="4178f536" sha1="65162698ec8e658aa582a5a7a209b3bda704cbb9" offset="0x0000" />
377         </dataarea>
378      </part>
379   </software>
380 
381   <software name="wow">
382      <description>Wizard of Wor (Jpn, v.02)</description>
383      <year>1982</year>
384      <publisher>Commodore</publisher>
385      <info name="serial" value="C-64615" />
386      <part name="cart" interface="vic10_cart">
387         <feature name="game" value="0" />
388         <feature name="exrom" value="1" />
389 
390         <dataarea name="uprom" size="0x2000">
391            <rom name="wizard of wor (japan) (v02) (max).bin" size="0x2000" crc="5cd2948e" sha1="f0f30868331d85e29b3adfaf71bc0abeb042ff42" offset="0x0000" />
392         </dataarea>
393      </part>
394   </software>
395 
396</softwarelist>
src/mess/machine/cbmipt.c
r14341r14342
11381138   SLOT_INTERFACE("ieee488", VIC1112)
11391139SLOT_INTERFACE_END
11401140
1141SLOT_INTERFACE_START( vic10_expansion_cards )
1142   SLOT_INTERFACE("standard", VIC10_STD)
1143SLOT_INTERFACE_END
1144   
11411145SLOT_INTERFACE_START( c64_expansion_cards )
11421146   SLOT_INTERFACE("standard", C64_STD)
11431147   SLOT_INTERFACE("xl80", C64_XL80)
src/mess/machine/cbmipt.h
r14341r14342
2020#include "machine/vic1111.h"
2121#include "machine/vic1112.h"
2222#include "machine/vic1210.h"
23#include "machine/vic10std.h"
2324#include "machine/vic20std.h"
2425
2526
r14341r14342
8990extern const slot_interface slot_interface_sx1541_iec_devices[];
9091extern const slot_interface slot_interface_cbm_ieee488_devices[];
9192extern const slot_interface slot_interface_vic20_expansion_cards[];
93extern const slot_interface slot_interface_vic10_expansion_cards[];
9294extern const slot_interface slot_interface_c64_expansion_cards[];
9395extern const slot_interface slot_interface_c64_user_port_cards[];
9496
src/mess/machine/c64.c
r14341r14342
2323#include "video/vic6567.h"
2424
2525#include "includes/cbm.h"
26#include "includes/c64.h"
26#include "includes/c64_legacy.h"
2727
2828#include "imagedev/cassette.h"
2929#include "imagedev/cartslot.h"
src/mess/machine/c65.c
r14341r14342
99
1010#include "includes/cbm.h"
1111#include "includes/c65.h"
12#include "includes/c64.h"
12#include "includes/c64_legacy.h"
1313#include "cpu/m6502/m4510.h"
1414#include "sound/sid6581.h"
1515#include "machine/6526cia.h"
src/mess/machine/vic10std.c
r0r14342
1/**********************************************************************
2 
3    Commodore VIC-10 Standard 8K/16K ROM Cartridge emulation
4 
5    Copyright MESS Team.
6    Visit http://mamedev.org for licensing and usage restrictions.
7 
8**********************************************************************/
9 
10#include "vic10std.h"
11 
12 
13 
14//**************************************************************************
15//  DEVICE DEFINITIONS
16//**************************************************************************
17 
18const device_type VIC10_STD = &device_creator<vic10_standard_cartridge_device>;
19 
20 
21 
22//**************************************************************************
23//  LIVE DEVICE
24//**************************************************************************
25 
26//-------------------------------------------------
27//  vic10_standard_cartridge_device - constructor
28//-------------------------------------------------
29 
30vic10_standard_cartridge_device::vic10_standard_cartridge_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
31    : device_t(mconfig, VIC10_STD, "Standard Cartridge", tag, owner, clock),
32     device_vic10_expansion_card_interface(mconfig, *this),
33     m_exram(NULL),
34     m_lorom(NULL),
35     m_uprom(NULL)
36{
37}
38 
39 
40//-------------------------------------------------
41//  device_start - device-specific startup
42//-------------------------------------------------
43 
44void vic10_standard_cartridge_device::device_start()
45{
46}
47 
48 
49//-------------------------------------------------
50//  vic10_exram_pointer - get expanded RAM pointer
51//-------------------------------------------------
52 
53UINT8* vic10_standard_cartridge_device::vic10_exram_pointer()
54{
55   if (m_exram == NULL)
56   {
57      m_exram = auto_alloc_array(machine(), UINT8, 0x800);
58   }
59 
60   return m_exram;
61}
62 
63 
64//-------------------------------------------------
65//  vic10_exram_r - expanded RAM read
66//-------------------------------------------------
67 
68UINT8 vic10_standard_cartridge_device::vic10_exram_r(address_space &space, offs_t offset)
69{
70   UINT8 data = 0;
71 
72   if (m_exram != NULL)
73   {
74      data = m_exram[offset & 0x7ff];
75   }
76 
77   return data;
78}
79 
80 
81//-------------------------------------------------
82//  vic10_exram_w - expanded RAM write
83//-------------------------------------------------
84 
85void vic10_standard_cartridge_device::vic10_exram_w(address_space &space, offs_t offset, UINT8 data)
86{
87   if (m_exram != NULL)
88   {
89      m_exram[offset & 0x7ff] = data;
90   }
91}
92 
93 
94//-------------------------------------------------
95//  vic10_lorom_pointer - get lower ROM pointer
96//-------------------------------------------------
97 
98UINT8* vic10_standard_cartridge_device::vic10_lorom_pointer()
99{
100   if (m_lorom == NULL)
101   {
102      m_lorom = auto_alloc_array(machine(), UINT8, 0x2000);
103   }
104 
105   return m_lorom;
106}
107 
108 
109//-------------------------------------------------
110//  vic10_lorom_r - lower ROM read
111//-------------------------------------------------
112 
113UINT8 vic10_standard_cartridge_device::vic10_lorom_r(address_space &space, offs_t offset)
114{
115   UINT8 data = 0;
116 
117   if (m_lorom != NULL)
118   {
119      data = m_lorom[offset & 0x1fff];
120   }
121 
122   return data;
123}
124 
125 
126//-------------------------------------------------
127//  vic10_uprom_pointer - get upper ROM pointer
128//-------------------------------------------------
129 
130UINT8* vic10_standard_cartridge_device::vic10_uprom_pointer()
131{
132   if (m_uprom == NULL)
133   {
134      m_uprom = auto_alloc_array(machine(), UINT8, 0x2000);
135   }
136 
137   return m_uprom;
138}
139 
140 
141//-------------------------------------------------
142//  vic10_uprom_r - upper ROM read
143//-------------------------------------------------
144 
145UINT8 vic10_standard_cartridge_device::vic10_uprom_r(address_space &space, offs_t offset)
146{
147   UINT8 data = 0;
148 
149   if (m_uprom != NULL)
150   {
151      data = m_uprom[offset & 0x1fff];
152   }
153 
154   return data;
155}
src/mess/machine/vic10std.h
r0r14342
1/**********************************************************************
2 
3    Commodore VIC-10 Standard 8K/16K ROM Cartridge emulation
4 
5    Copyright MESS Team.
6    Visit http://mamedev.org for licensing and usage restrictions.
7 
8**********************************************************************/
9 
10#pragma once
11 
12#ifndef __VIC10_STD__
13#define __VIC10_STD__
14 
15#define ADDRESS_MAP_MODERN
16 
17#include "emu.h"
18#include "machine/vic10exp.h"
19 
20 
21 
22//**************************************************************************
23//  TYPE DEFINITIONS
24//**************************************************************************
25 
26// ======================> vic10_standard_cartridge_device
27 
28class vic10_standard_cartridge_device :  public device_t,
29                               public device_vic10_expansion_card_interface
30{
31public:
32    // construction/destruction
33    vic10_standard_cartridge_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
34 
35protected:
36    // device-level overrides
37    virtual void device_start();
38 
39   // device_vic10_expansion_card_interface overrides
40   virtual UINT8 vic10_exram_r(address_space &space, offs_t offset);
41   virtual void vic10_exram_w(address_space &space, offs_t offset, UINT8 data);
42   virtual UINT8 vic10_lorom_r(address_space &space, offs_t offset);
43   virtual UINT8 vic10_uprom_r(address_space &space, offs_t offset);
44   virtual UINT8* vic10_lorom_pointer();
45   virtual UINT8* vic10_uprom_pointer();
46   virtual UINT8* vic10_exram_pointer();
47 
48private:
49   UINT8 *m_exram;
50   UINT8 *m_lorom;
51   UINT8 *m_uprom;
52};
53 
54 
55// device type definition
56extern const device_type VIC10_STD;
57 
58 
59 
60#endif
src/mess/machine/c128.c
r14341r14342
1111
1212#include "emu.h"
1313#include "includes/c128.h"
14#include "includes/c64.h"
14#include "includes/c64_legacy.h"
1515#include "includes/cbm.h"
1616#include "machine/cbmiec.h"
1717#include "cpu/m6502/m6502.h"
src/mess/machine/vic10exp.c
r0r14342
1/**********************************************************************
2 
3    Commodore VIC-10 Expansion Port emulation
4 
5    Copyright MESS Team.
6    Visit http://mamedev.org for licensing and usage restrictions.
7 
8**********************************************************************/
9 
10#include "emu.h"
11#include "emuopts.h"
12#include "machine/vic10exp.h"
13 
14 
15//**************************************************************************
16//  GLOBAL VARIABLES
17//**************************************************************************
18 
19const device_type VIC10_EXPANSION_SLOT = &device_creator<vic10_expansion_slot_device>;
20 
21 
22//**************************************************************************
23//  DEVICE VIC10_EXPANSION CARD INTERFACE
24//**************************************************************************
25 
26//-------------------------------------------------
27//  device_vic10_expansion_card_interface - constructor
28//-------------------------------------------------
29 
30device_vic10_expansion_card_interface::device_vic10_expansion_card_interface(const machine_config &mconfig, device_t &device)
31   : device_slot_card_interface(mconfig,device)
32{
33   m_slot = dynamic_cast<vic10_expansion_slot_device *>(device.owner());
34}
35 
36 
37//-------------------------------------------------
38//  ~device_vic10_expansion_card_interface - destructor
39//-------------------------------------------------
40 
41device_vic10_expansion_card_interface::~device_vic10_expansion_card_interface()
42{
43}
44 
45 
46 
47//**************************************************************************
48//  LIVE DEVICE
49//**************************************************************************
50 
51//-------------------------------------------------
52//  vic10_expansion_slot_device - constructor
53//-------------------------------------------------
54 
55vic10_expansion_slot_device::vic10_expansion_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
56        device_t(mconfig, VIC10_EXPANSION_SLOT, "VIC-10 expansion port", tag, owner, clock),
57      device_slot_interface(mconfig, *this),
58      device_image_interface(mconfig, *this)
59{
60}
61 
62 
63//-------------------------------------------------
64//  vic10_expansion_slot_device - destructor
65//-------------------------------------------------
66 
67vic10_expansion_slot_device::~vic10_expansion_slot_device()
68{
69}
70 
71 
72//-------------------------------------------------
73//  device_config_complete - perform any
74//  operations now that the configuration is
75//  complete
76//-------------------------------------------------
77 
78void vic10_expansion_slot_device::device_config_complete()
79{
80   // inherit a copy of the static data
81   const vic10_expansion_slot_interface *intf = reinterpret_cast<const vic10_expansion_slot_interface *>(static_config());
82   if (intf != NULL)
83   {
84      *static_cast<vic10_expansion_slot_interface *>(this) = *intf;
85   }
86 
87   // or initialize to defaults if none provided
88   else
89   {
90       memset(&m_out_irq_cb, 0, sizeof(m_out_irq_cb));
91       memset(&m_out_sp_cb, 0, sizeof(m_out_sp_cb));
92       memset(&m_out_cnt_cb, 0, sizeof(m_out_cnt_cb));
93       memset(&m_out_res_cb, 0, sizeof(m_out_res_cb));
94   }
95 
96   // set brief and instance name
97   update_names();
98}
99 
100 
101//-------------------------------------------------
102//  device_start - device-specific startup
103//-------------------------------------------------
104 
105void vic10_expansion_slot_device::device_start()
106{
107   m_cart = dynamic_cast<device_vic10_expansion_card_interface *>(get_card_device());
108 
109   // resolve callbacks
110   m_out_irq_func.resolve(m_out_irq_cb, *this);
111   m_out_sp_func.resolve(m_out_sp_cb, *this);
112   m_out_cnt_func.resolve(m_out_cnt_cb, *this);
113   m_out_res_func.resolve(m_out_res_cb, *this);
114}
115 
116 
117//-------------------------------------------------
118//  call_load -
119//-------------------------------------------------
120 
121bool vic10_expansion_slot_device::call_load()
122{
123   if (m_cart)
124   {
125      size_t size = 0;
126 
127      if (software_entry() == NULL)
128      {
129         size = length();
130 
131         if (!mame_stricmp(filetype(), "80"))
132         {
133            fread(m_cart->vic10_lorom_pointer(), 0x2000);
134             
135            if (size == 0x4000)
136            {
137               fread(m_cart->vic10_uprom_pointer(), 0x2000);
138            }
139         }
140         else if (!mame_stricmp(filetype(), "e0")) fread(m_cart->vic10_uprom_pointer(), size);
141      }
142      else
143      {
144         size = get_software_region_length("lorom");
145         if (size) memcpy(m_cart->vic10_lorom_pointer(), get_software_region("lorom"), size);
146 
147         size = get_software_region_length("uprom");
148         if (size) memcpy(m_cart->vic10_uprom_pointer(), get_software_region("uprom"), size);
149         
150         size = get_software_region_length("exram");
151         if (size) m_cart->vic10_exram_pointer();
152      }
153   }
154 
155   return IMAGE_INIT_PASS;
156}
157 
158 
159//-------------------------------------------------
160//  call_softlist_load -
161//-------------------------------------------------
162 
163bool vic10_expansion_slot_device::call_softlist_load(char *swlist, char *swname, rom_entry *start_entry)
164{
165   load_software_part_region(this, swlist, swname, start_entry);
166 
167   return true;
168}
169 
170 
171//-------------------------------------------------
172//  get_default_card_software -
173//-------------------------------------------------
174 
175const char * vic10_expansion_slot_device::get_default_card_software(const machine_config &config, emu_options &options) const
176{
177   return software_get_default_slot(config, options, this, "standard");
178}
179 
180 
181//-------------------------------------------------
182//  screen_update -
183//-------------------------------------------------
184 
185UINT32 vic10_expansion_slot_device::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
186{
187   bool value = false;
188 
189   if (m_cart != NULL)
190   {
191      value = m_cart->vic10_screen_update(screen, bitmap, cliprect);
192   }
193 
194   return value;
195}
196 
197 
198READ8_MEMBER( vic10_expansion_slot_device::lorom_r ) { UINT8 data = 0; if (m_cart != NULL) data = m_cart->vic10_lorom_r(space, offset); return data; }
199WRITE8_MEMBER( vic10_expansion_slot_device::lorom_w ) { if (m_cart != NULL) m_cart->vic10_lorom_w(space, offset, data); }
200READ8_MEMBER( vic10_expansion_slot_device::uprom_r ) { UINT8 data = 0; if (m_cart != NULL) data = m_cart->vic10_uprom_r(space, offset); return data; }
201WRITE8_MEMBER( vic10_expansion_slot_device::uprom_w ) { if (m_cart != NULL) m_cart->vic10_uprom_w(space, offset, data); }
202READ8_MEMBER( vic10_expansion_slot_device::exram_r ) { UINT8 data = 0; if (m_cart != NULL) data = m_cart->vic10_exram_r(space, offset); return data; }
203WRITE8_MEMBER( vic10_expansion_slot_device::exram_w ) { if (m_cart != NULL) m_cart->vic10_exram_w(space, offset, data); }
204 
205READ_LINE_MEMBER( vic10_expansion_slot_device::p0_r ) { int state = 0; if (m_cart != NULL) state = m_cart->vic10_p0_r(); return state; }
206WRITE_LINE_MEMBER( vic10_expansion_slot_device::p0_w ) { if (m_cart != NULL) m_cart->vic10_p0_w(state); }
207WRITE_LINE_MEMBER( vic10_expansion_slot_device::irq_w ) { m_out_irq_func(state); }
208WRITE_LINE_MEMBER( vic10_expansion_slot_device::sp_w ) { m_out_sp_func(state); if (m_cart != NULL) m_cart->vic10_sp_w(state); }
209WRITE_LINE_MEMBER( vic10_expansion_slot_device::cnt_w ) { m_out_cnt_func(state); if (m_cart != NULL) m_cart->vic10_cnt_w(state); }
210WRITE_LINE_MEMBER( vic10_expansion_slot_device::res_w ) { m_out_res_func(state); }
src/mess/machine/vic10exp.h
r0r14342
1/**********************************************************************
2 
3    Commodore VIC-10 Expansion Port emulation
4 
5    Copyright MESS Team.
6    Visit http://mamedev.org for licensing and usage restrictions.
7 
8**********************************************************************
9 
10 
11**********************************************************************/
12 
13#pragma once
14 
15#ifndef __VIC10_EXPANSION_SLOT__
16#define __VIC10_EXPANSION_SLOT__
17 
18#include "emu.h"
19 
20 
21 
22//**************************************************************************
23//  CONSTANTS
24//**************************************************************************
25 
26#define VIC10_EXPANSION_SLOT_TAG      "exp"
27 
28 
29 
30//**************************************************************************
31//  INTERFACE CONFIGURATION MACROS
32//**************************************************************************
33 
34#define VIC10_EXPANSION_INTERFACE(_name) \
35   const vic10_expansion_slot_interface (_name) =
36 
37 
38#define MCFG_VIC10_EXPANSION_SLOT_ADD(_tag, _config, _slot_intf, _def_slot, _def_inp) \
39    MCFG_DEVICE_ADD(_tag, VIC10_EXPANSION_SLOT, 0) \
40    MCFG_DEVICE_CONFIG(_config) \
41   MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, _def_inp)
42 
43 
44 
45//**************************************************************************
46//  TYPE DEFINITIONS
47//**************************************************************************
48 
49// ======================> vic10_expansion_slot_interface
50 
51struct vic10_expansion_slot_interface
52{
53    devcb_write_line   m_out_irq_cb;
54    devcb_write_line   m_out_sp_cb;
55    devcb_write_line   m_out_cnt_cb;
56    devcb_write_line   m_out_res_cb;
57};
58 
59 
60// ======================> vic10_expansion_slot_device
61 
62class device_vic10_expansion_card_interface;
63 
64class vic10_expansion_slot_device : public device_t,
65                            public vic10_expansion_slot_interface,
66                            public device_slot_interface,
67                            public device_image_interface
68{
69public:
70   // construction/destruction
71   vic10_expansion_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
72   virtual ~vic10_expansion_slot_device();
73 
74   DECLARE_READ8_MEMBER( lorom_r );
75   DECLARE_WRITE8_MEMBER( lorom_w );
76   DECLARE_READ8_MEMBER( uprom_r );
77   DECLARE_WRITE8_MEMBER( uprom_w );
78   DECLARE_READ8_MEMBER( exram_r );
79   DECLARE_WRITE8_MEMBER( exram_w );
80 
81   DECLARE_READ_LINE_MEMBER( p0_r );
82   DECLARE_WRITE_LINE_MEMBER( p0_w );
83 
84   DECLARE_WRITE_LINE_MEMBER( irq_w );
85   DECLARE_WRITE_LINE_MEMBER( sp_w );
86   DECLARE_WRITE_LINE_MEMBER( cnt_w );
87   DECLARE_WRITE_LINE_MEMBER( res_w );
88 
89   UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
90 
91protected:
92   // device-level overrides
93   virtual void device_config_complete();
94   virtual void device_start();
95 
96   // image-level overrides
97   virtual bool call_load();
98   virtual bool call_softlist_load(char *swlist, char *swname, rom_entry *start_entry);
99 
100   virtual iodevice_t image_type() const { return IO_CARTSLOT; }
101 
102   virtual bool is_readable()  const { return 1; }
103   virtual bool is_writeable() const { return 0; }
104   virtual bool is_creatable() const { return 0; }
105   virtual bool must_be_loaded() const { return 1; }
106   virtual bool is_reset_on_load() const { return 1; }
107   virtual const char *image_interface() const { return "vic10_cart"; }
108   virtual const char *file_extensions() const { return "80,e0"; }
109   virtual const option_guide *create_option_guide() const { return NULL; }
110 
111   // slot interface overrides
112   virtual const char * get_default_card_software(const machine_config &config, emu_options &options) const;
113 
114   devcb_resolved_write_line   m_out_irq_func;
115   devcb_resolved_write_line   m_out_sp_func;
116   devcb_resolved_write_line   m_out_cnt_func;
117   devcb_resolved_write_line   m_out_res_func;
118 
119   device_vic10_expansion_card_interface *m_cart;
120};
121 
122 
123// ======================> device_vic10_expansion_card_interface
124 
125// class representing interface-specific live vic10_expansion card
126class device_vic10_expansion_card_interface : public device_slot_card_interface
127{
128public:
129   // construction/destruction
130   device_vic10_expansion_card_interface(const machine_config &mconfig, device_t &device);
131   virtual ~device_vic10_expansion_card_interface();
132 
133   // RAM
134   virtual UINT8* vic10_exram_pointer() { return NULL; }
135   virtual UINT8 vic10_exram_r(address_space &space, offs_t offset) { return 0; };
136   virtual void vic10_exram_w(address_space &space, offs_t offset, UINT8 data) { };
137   
138   // ROM
139   virtual UINT8* vic10_lorom_pointer() { return NULL; }
140   virtual UINT8 vic10_lorom_r(address_space &space, offs_t offset) { return 0; };
141   virtual void vic10_lorom_w(address_space &space, offs_t offset, UINT8 data) { };
142 
143   virtual UINT8* vic10_uprom_pointer() { return NULL; }
144   virtual UINT8 vic10_uprom_r(address_space &space, offs_t offset) { return 0; };
145   virtual void vic10_uprom_w(address_space &space, offs_t offset, UINT8 data) { };
146 
147   // I/O
148   virtual int vic10_p0_r() { return 0; };
149   virtual void vic10_p0_w(int state) { };
150   virtual void vic10_sp_w(int state) { };
151   virtual void vic10_cnt_w(int state) { };
152 
153   // video
154   virtual UINT32 vic10_screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { return false; }
155 
156protected:
157   vic10_expansion_slot_device *m_slot;
158};
159 
160 
161// device type definition
162extern const device_type VIC10_EXPANSION_SLOT;
163 
164 
165 
166#endif
src/mess/includes/c64x.h
r14341r14342
1#pragma once
2 
3#ifndef __C64X__
4#define __C64X__
5 
6#define ADDRESS_MAP_MODERN
7 
8#include "emu.h"
9#include "formats/cbm_snqk.h"
10#include "includes/cbm.h"
11#include "machine/6526cia.h"
12#include "machine/c64exp.h"
13#include "machine/c64user.h"
14#include "machine/cbmiec.h"
15#include "machine/cbmipt.h"
16#include "machine/ram.h"
17#include "sound/dac.h"
18#include "sound/sid6581.h"
19#include "video/vic6567.h"
20 
21#define M6510_TAG      "u7"
22#define MOS6567_TAG      "u19"
23#define MOS6569_TAG      "u19"
24#define MOS6851_TAG      "u18"
25#define MOS6526_1_TAG   "u1"
26#define MOS6526_2_TAG   "u2"
27#define SCREEN_TAG      "screen"
28#define TIMER_C1531_TAG   "c1531"
29 
30class c64_state : public driver_device
31{
32public:
33   c64_state(const machine_config &mconfig, device_type type, const char *tag)
34      : driver_device(mconfig, type, tag),
35        m_maincpu(*this, M6510_TAG),
36        m_vic(*this, MOS6569_TAG),
37        m_sid(*this, MOS6851_TAG),
38        m_cia1(*this, MOS6526_1_TAG),
39        m_cia2(*this, MOS6526_2_TAG),
40        m_iec(*this, CBM_IEC_TAG),
41        m_exp(*this, C64_EXPANSION_SLOT_TAG),
42        m_user(*this, C64_USER_PORT_TAG),
43        m_ram(*this, RAM_TAG),
44        m_cassette(*this, CASSETTE_TAG),
45        m_cassette_timer(*this, TIMER_C1531_TAG),
46        m_loram(1),
47        m_hiram(1),
48        m_charen(1),
49        m_cia1_irq(CLEAR_LINE),
50        m_cia2_irq(CLEAR_LINE),
51        m_vic_irq(CLEAR_LINE),
52        m_exp_irq(CLEAR_LINE),
53        m_exp_nmi(CLEAR_LINE),
54        m_cass_rd(1),
55        m_iec_srq(1)
56   { }
57 
58   required_device<cpu_device> m_maincpu;
59   required_device<device_t> m_vic;
60   required_device<device_t> m_sid;
61   required_device<mos6526_device> m_cia1;
62   required_device<mos6526_device> m_cia2;
63   optional_device<cbm_iec_device> m_iec;
64   required_device<c64_expansion_slot_device> m_exp;
65   required_device<c64_user_port_device> m_user;
66   required_device<ram_device> m_ram;
67   optional_device<cassette_image_device> m_cassette;
68   optional_device<timer_device> m_cassette_timer;
69 
70   virtual void machine_start();
71   virtual UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
72   
73   void check_interrupts();
74   void bankswitch(offs_t offset, offs_t va, int rw, int aec, int ba, int cas, int *casram, int *basic, int *kernal, int *charom, int *grw, int *io, int *roml, int *romh);
75   UINT8 read_memory(address_space &space, offs_t offset, int casram, int basic, int kernal, int charom, int io, int roml, int romh);
76   
77   DECLARE_READ8_MEMBER( read );
78   DECLARE_WRITE8_MEMBER( write );
79 
80   DECLARE_READ8_MEMBER( vic_lightpen_x_cb );
81   DECLARE_READ8_MEMBER( vic_lightpen_y_cb );
82   DECLARE_READ8_MEMBER( vic_lightpen_button_cb );
83   DECLARE_READ8_MEMBER( vic_dma_read );
84   DECLARE_READ8_MEMBER( vic_dma_read_color );
85   DECLARE_WRITE_LINE_MEMBER( vic_irq_w );
86   DECLARE_READ8_MEMBER( vic_rdy_cb );
87   DECLARE_WRITE_LINE_MEMBER( cia1_irq_w );
88   DECLARE_READ8_MEMBER( cia1_pa_r );
89   DECLARE_READ8_MEMBER( cia1_pb_r );
90   DECLARE_WRITE8_MEMBER( cia1_pb_w );
91   DECLARE_WRITE_LINE_MEMBER( cia2_irq_w );
92   DECLARE_READ8_MEMBER( cia2_pa_r );
93   DECLARE_WRITE8_MEMBER( cia2_pa_w );
94   DECLARE_READ8_MEMBER( cpu_r );
95   DECLARE_WRITE8_MEMBER( cpu_w );
96   DECLARE_WRITE_LINE_MEMBER( iec_srq_w );
97   DECLARE_WRITE_LINE_MEMBER( exp_irq_w );
98   DECLARE_WRITE_LINE_MEMBER( exp_nmi_w );
99   
100   // memory state
101   int m_loram;
102   int m_hiram;
103   int m_charen;
104   UINT8 *m_basic;
105   UINT8 *m_kernal;
106   UINT8 *m_charom;
107   
108   // video state
109   UINT8 *m_color_ram;
110   int m_va14;
111   int m_va15;
112   
113   // interrupt state
114   int m_cia1_irq;
115   int m_cia2_irq;
116   int m_vic_irq;
117   int m_exp_irq;
118   int m_exp_nmi;
119   int m_cass_rd;
120   int m_iec_srq;
121};
122 
123 
124class sx64_state : public c64_state
125{
126public:
127   sx64_state(const machine_config &mconfig, device_type type, const char *tag)
128      : c64_state(mconfig, type, tag)
129   { }
130 
131   DECLARE_READ8_MEMBER( cpu_r );
132   DECLARE_WRITE8_MEMBER( cpu_w );
133};
134 
135 
136class c64c_state : public c64_state
137{
138public:
139   c64c_state(const machine_config &mconfig, device_type type, const char *tag)
140      : c64_state(mconfig, type, tag)
141   { }
142 
143   virtual void machine_start();
144};
145 
146 
147class c64gs_state : public c64c_state
148{
149public:
150   c64gs_state(const machine_config &mconfig, device_type type, const char *tag)
151      : c64c_state(mconfig, type, tag)
152   { }
153 
154   virtual void machine_start();
155 
156   DECLARE_READ8_MEMBER( cpu_r );
157   DECLARE_WRITE8_MEMBER( cpu_w );
158};
159 
160 
161 
162#endif
src/mess/includes/c65.h
r14341r14342
77#ifndef C65_H_
88#define C65_H_
99
10#include "includes/c64.h"
10#include "includes/c64_legacy.h"
1111#include "machine/6526cia.h"
1212
1313typedef struct
src/mess/includes/c128.h
r14341r14342
1414#ifndef __C128_H__
1515#define __C128_H__
1616
17#include "includes/c64.h"
17#include "includes/c64_legacy.h"
1818#include "machine/6526cia.h"
1919
2020class c128_state : public legacy_c64_state
src/mess/includes/c64_legacy.h
r0r14342
1/*****************************************************************************
2 *
3 * includes/c64.h
4 *
5 * Commodore C64 Home Computer
6 *
7 * peter.trauner@jk.uni-linz.ac.at
8 *
9 * Documentation: www.funet.fi
10 *
11 ****************************************************************************/
12 
13#ifndef C64_H_
14#define C64_H_
15 
16#include "machine/6526cia.h"
17#include "machine/cbmiec.h"
18#include "imagedev/cartslot.h"
19 
20#define C64_MAX_ROMBANK 64 // .crt files contain multiple 'CHIPs', i.e. rom banks (of variable size) with headers. Known carts have at most 64 'CHIPs'.
21 
22typedef struct {
23   int addr, size, index, start;
24} C64_ROM;
25 
26typedef struct _c64_cart_t c64_cart_t;
27struct _c64_cart_t {
28   C64_ROM     bank[C64_MAX_ROMBANK];
29   INT8        game;
30   INT8        exrom;
31   UINT8       mapper;
32   UINT8       n_banks;
33};
34 
35class legacy_c64_state : public driver_device
36{
37public:
38   legacy_c64_state(const machine_config &mconfig, device_type type, const char *tag)
39      : driver_device(mconfig, type, tag),
40        m_iec(*this, CBM_IEC_TAG),
41        m_roml_writable(0)
42    { }
43 
44   optional_device<cbm_iec_device> m_iec;
45 
46   DECLARE_READ8_MEMBER( c64_lightpen_x_cb );
47   DECLARE_READ8_MEMBER( c64_lightpen_y_cb );
48   DECLARE_READ8_MEMBER( c64_lightpen_button_cb );
49   DECLARE_READ8_MEMBER( c64_dma_read );
50   DECLARE_READ8_MEMBER( c64_dma_read_ultimax );
51   DECLARE_READ8_MEMBER( c64_dma_read_color );
52   DECLARE_WRITE_LINE_MEMBER( c64_vic_interrupt );
53   DECLARE_READ8_MEMBER( c64_rdy_cb );
54 
55   int m_old_level;
56   int m_old_data;
57   int m_old_exrom;
58   int m_old_game;
59   UINT8 m_vicirq;
60   emu_timer *m_datasette_timer;
61   emu_timer *m_cartridge_timer;
62   UINT8 *m_colorram;
63   UINT8 *m_basic;
64   UINT8 *m_kernal;
65   UINT8 *m_chargen;
66   UINT8 *m_memory;
67   int m_pal;
68   int m_tape_on;
69   UINT8 *m_c64_roml;
70   UINT8 *m_c64_romh;
71   UINT8 *m_vicaddr;
72   UINT8 *m_c128_vicaddr;
73   UINT8 m_game;
74   UINT8 m_exrom;
75   UINT8 *m_io_mirror;
76   UINT8 m_port_data;
77   UINT8 *m_roml;
78   UINT8 *m_romh;
79   int m_roml_writable;
80   int m_ultimax;
81   int m_cia1_on;
82   int m_io_enabled;
83   int m_is_sx64;
84   UINT8 *m_io_ram_w_ptr;
85   UINT8 *m_io_ram_r_ptr;
86   c64_cart_t m_cart;
87   int m_nmilevel;
88};
89 
90 
91/*----------- defined in machine/c64.c -----------*/
92 
93/* private area */
94 
95extern READ8_DEVICE_HANDLER(c64_m6510_port_read);
96extern WRITE8_DEVICE_HANDLER(c64_m6510_port_write);
97 
98READ8_HANDLER ( c64_colorram_read );
99WRITE8_HANDLER ( c64_colorram_write );
100 
101DRIVER_INIT( c64 );
102DRIVER_INIT( c64pal );
103DRIVER_INIT( ultimax );
104DRIVER_INIT( c64gs );
105DRIVER_INIT( sx64 );
106 
107MACHINE_START( c64 );
108MACHINE_RESET( c64 );
109INTERRUPT_GEN( c64_frame_interrupt );
110TIMER_CALLBACK( c64_tape_timer );
111 
112/* private area */
113WRITE8_HANDLER(c64_roml_w);
114 
115READ8_HANDLER(c64_ioarea_r);
116WRITE8_HANDLER(c64_ioarea_w);
117 
118WRITE8_HANDLER ( c64_write_io );
119READ8_HANDLER ( c64_read_io );
120int c64_paddle_read (device_t *device, int which);
121 
122extern const mos6526_interface c64_ntsc_cia0, c64_pal_cia0;
123extern const mos6526_interface c64_ntsc_cia1, c64_pal_cia1;
124 
125MACHINE_CONFIG_EXTERN( c64_cartslot );
126MACHINE_CONFIG_EXTERN( ultimax_cartslot );
127 
128#endif /* C64_H_ */
src/mess/includes/c64.h
r14341r14342
1/*****************************************************************************
2 *
3 * includes/c64.h
4 *
5 * Commodore C64 Home Computer
6 *
7 * peter.trauner@jk.uni-linz.ac.at
8 *
9 * Documentation: www.funet.fi
10 *
11 ****************************************************************************/
1#pragma once
122
13#ifndef C64_H_
14#define C64_H_
3#ifndef __C64__
4#define __C64__
155
6#define ADDRESS_MAP_MODERN
7
8#include "emu.h"
9#include "formats/cbm_snqk.h"
10#include "includes/cbm.h"
1611#include "machine/6526cia.h"
12#include "machine/c64exp.h"
13#include "machine/c64user.h"
1714#include "machine/cbmiec.h"
18#include "imagedev/cartslot.h"
15#include "machine/cbmipt.h"
16#include "machine/ram.h"
17#include "sound/dac.h"
18#include "sound/sid6581.h"
19#include "video/vic6567.h"
1920
20#define C64_MAX_ROMBANK 64 // .crt files contain multiple 'CHIPs', i.e. rom banks (of variable size) with headers. Known carts have at most 64 'CHIPs'.
21#define M6510_TAG      "u7"
22#define MOS6567_TAG      "u19"
23#define MOS6569_TAG      "u19"
24#define MOS6851_TAG      "u18"
25#define MOS6526_1_TAG   "u1"
26#define MOS6526_2_TAG   "u2"
27#define SCREEN_TAG      "screen"
28#define TIMER_C1531_TAG   "c1531"
2129
22typedef struct {
23   int addr, size, index, start;
24} C64_ROM;
25
26typedef struct _c64_cart_t c64_cart_t;
27struct _c64_cart_t {
28   C64_ROM     bank[C64_MAX_ROMBANK];
29   INT8        game;
30   INT8        exrom;
31   UINT8       mapper;
32   UINT8       n_banks;
33};
34
35class legacy_c64_state : public driver_device
30class c64_state : public driver_device
3631{
3732public:
38   legacy_c64_state(const machine_config &mconfig, device_type type, const char *tag)
33   c64_state(const machine_config &mconfig, device_type type, const char *tag)
3934      : driver_device(mconfig, type, tag),
35        m_maincpu(*this, M6510_TAG),
36        m_vic(*this, MOS6569_TAG),
37        m_sid(*this, MOS6851_TAG),
38        m_cia1(*this, MOS6526_1_TAG),
39        m_cia2(*this, MOS6526_2_TAG),
4040        m_iec(*this, CBM_IEC_TAG),
41        m_roml_writable(0)
42    { }
41        m_exp(*this, C64_EXPANSION_SLOT_TAG),
42        m_user(*this, C64_USER_PORT_TAG),
43        m_ram(*this, RAM_TAG),
44        m_cassette(*this, CASSETTE_TAG),
45        m_cassette_timer(*this, TIMER_C1531_TAG),
46        m_loram(1),
47        m_hiram(1),
48        m_charen(1),
49        m_cia1_irq(CLEAR_LINE),
50        m_cia2_irq(CLEAR_LINE),
51        m_vic_irq(CLEAR_LINE),
52        m_exp_irq(CLEAR_LINE),
53        m_exp_nmi(CLEAR_LINE),
54        m_cass_rd(1),
55        m_iec_srq(1)
56   { }
4357
58   required_device<cpu_device> m_maincpu;
59   required_device<device_t> m_vic;
60   required_device<device_t> m_sid;
61   required_device<mos6526_device> m_cia1;
62   required_device<mos6526_device> m_cia2;
4463   optional_device<cbm_iec_device> m_iec;
64   required_device<c64_expansion_slot_device> m_exp;
65   required_device<c64_user_port_device> m_user;
66   required_device<ram_device> m_ram;
67   optional_device<cassette_image_device> m_cassette;
68   optional_device<timer_device> m_cassette_timer;
4569
46   DECLARE_READ8_MEMBER( c64_lightpen_x_cb );
47   DECLARE_READ8_MEMBER( c64_lightpen_y_cb );
48   DECLARE_READ8_MEMBER( c64_lightpen_button_cb );
49   DECLARE_READ8_MEMBER( c64_dma_read );
50   DECLARE_READ8_MEMBER( c64_dma_read_ultimax );
51   DECLARE_READ8_MEMBER( c64_dma_read_color );
52   DECLARE_WRITE_LINE_MEMBER( c64_vic_interrupt );
53   DECLARE_READ8_MEMBER( c64_rdy_cb );
70   virtual void machine_start();
71   virtual UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
72   
73   void check_interrupts();
74   void bankswitch(offs_t offset, offs_t va, int rw, int aec, int ba, int cas, int *casram, int *basic, int *kernal, int *charom, int *grw, int *io, int *roml, int *romh);
75   UINT8 read_memory(address_space &space, offs_t offset, int casram, int basic, int kernal, int charom, int io, int roml, int romh);
76   
77   DECLARE_READ8_MEMBER( read );
78   DECLARE_WRITE8_MEMBER( write );
5479
55   int m_old_level;
56   int m_old_data;
57   int m_old_exrom;
58   int m_old_game;
59   UINT8 m_vicirq;
60   emu_timer *m_datasette_timer;
61   emu_timer *m_cartridge_timer;
62   UINT8 *m_colorram;
80   DECLARE_READ8_MEMBER( vic_lightpen_x_cb );
81   DECLARE_READ8_MEMBER( vic_lightpen_y_cb );
82   DECLARE_READ8_MEMBER( vic_lightpen_button_cb );
83   DECLARE_READ8_MEMBER( vic_dma_read );
84   DECLARE_READ8_MEMBER( vic_dma_read_color );
85   DECLARE_WRITE_LINE_MEMBER( vic_irq_w );
86   DECLARE_READ8_MEMBER( vic_rdy_cb );
87   DECLARE_WRITE_LINE_MEMBER( cia1_irq_w );
88   DECLARE_READ8_MEMBER( cia1_pa_r );
89   DECLARE_READ8_MEMBER( cia1_pb_r );
90   DECLARE_WRITE8_MEMBER( cia1_pb_w );
91   DECLARE_WRITE_LINE_MEMBER( cia2_irq_w );
92   DECLARE_READ8_MEMBER( cia2_pa_r );
93   DECLARE_WRITE8_MEMBER( cia2_pa_w );
94   DECLARE_READ8_MEMBER( cpu_r );
95   DECLARE_WRITE8_MEMBER( cpu_w );
96   DECLARE_WRITE_LINE_MEMBER( iec_srq_w );
97   DECLARE_WRITE_LINE_MEMBER( exp_irq_w );
98   DECLARE_WRITE_LINE_MEMBER( exp_nmi_w );
99   
100   // memory state
101   int m_loram;
102   int m_hiram;
103   int m_charen;
63104   UINT8 *m_basic;
64105   UINT8 *m_kernal;
65   UINT8 *m_chargen;
66   UINT8 *m_memory;
67   int m_pal;
68   int m_tape_on;
69   UINT8 *m_c64_roml;
70   UINT8 *m_c64_romh;
71   UINT8 *m_vicaddr;
72   UINT8 *m_c128_vicaddr;
73   UINT8 m_game;
74   UINT8 m_exrom;
75   UINT8 *m_io_mirror;
76   UINT8 m_port_data;
77   UINT8 *m_roml;
78   UINT8 *m_romh;
79   int m_roml_writable;
80   int m_ultimax;
81   int m_cia1_on;
82   int m_io_enabled;
83   int m_is_sx64;
84   UINT8 *m_io_ram_w_ptr;
85   UINT8 *m_io_ram_r_ptr;
86   c64_cart_t m_cart;
87   int m_nmilevel;
106   UINT8 *m_charom;
107   
108   // video state
109   UINT8 *m_color_ram;
110   int m_va14;
111   int m_va15;
112   
113   // interrupt state
114   int m_cia1_irq;
115   int m_cia2_irq;
116   int m_vic_irq;
117   int m_exp_irq;
118   int m_exp_nmi;
119   int m_cass_rd;
120   int m_iec_srq;
88121};
89122
90123
91/*----------- defined in machine/c64.c -----------*/
124class sx64_state : public c64_state
125{
126public:
127   sx64_state(const machine_config &mconfig, device_type type, const char *tag)
128      : c64_state(mconfig, type, tag)
129   { }
92130
93/* private area */
131   DECLARE_READ8_MEMBER( cpu_r );
132   DECLARE_WRITE8_MEMBER( cpu_w );
133};
94134
95extern READ8_DEVICE_HANDLER(c64_m6510_port_read);
96extern WRITE8_DEVICE_HANDLER(c64_m6510_port_write);
97135
98READ8_HANDLER ( c64_colorram_read );
99WRITE8_HANDLER ( c64_colorram_write );
136class c64c_state : public c64_state
137{
138public:
139   c64c_state(const machine_config &mconfig, device_type type, const char *tag)
140      : c64_state(mconfig, type, tag)
141   { }
100142
101DRIVER_INIT( c64 );
102DRIVER_INIT( c64pal );
103DRIVER_INIT( ultimax );
104DRIVER_INIT( c64gs );
105DRIVER_INIT( sx64 );
143   virtual void machine_start();
144};
106145
107MACHINE_START( c64 );
108MACHINE_RESET( c64 );
109INTERRUPT_GEN( c64_frame_interrupt );
110TIMER_CALLBACK( c64_tape_timer );
111146
112/* private area */
113WRITE8_HANDLER(c64_roml_w);
147class c64gs_state : public c64c_state
148{
149public:
150   c64gs_state(const machine_config &mconfig, device_type type, const char *tag)
151      : c64c_state(mconfig, type, tag)
152   { }
114153
115READ8_HANDLER(c64_ioarea_r);
116WRITE8_HANDLER(c64_ioarea_w);
154   virtual void machine_start();
117155
118WRITE8_HANDLER ( c64_write_io );
119READ8_HANDLER ( c64_read_io );
120int c64_paddle_read (device_t *device, int which);
156   DECLARE_READ8_MEMBER( cpu_r );
157   DECLARE_WRITE8_MEMBER( cpu_w );
158};
121159
122extern const mos6526_interface c64_ntsc_cia0, c64_pal_cia0;
123extern const mos6526_interface c64_ntsc_cia1, c64_pal_cia1;
124160
125MACHINE_CONFIG_EXTERN( c64_cartslot );
126MACHINE_CONFIG_EXTERN( ultimax_cartslot );
127161
128#endif /* C64_H_ */
162#endif
src/mess/includes/vic10.h
r0r14342
1#pragma once
2 
3#ifndef __VIC10__
4#define __VIC10__
5 
6#define ADDRESS_MAP_MODERN
7 
8#include "emu.h"
9#include "includes/cbm.h"
10#include "machine/6526cia.h"
11#include "machine/cbmipt.h"
12#include "machine/ram.h"
13#include "sound/dac.h"
14#include "sound/sid6581.h"
15#include "video/vic6567.h"
16 
17#define M6510_TAG      "u3"
18#define MOS6566_TAG      "u2"
19#define MOS6581_TAG      "u6"
20#define MOS6526_TAG      "u9"
21#define SCREEN_TAG      "screen"
22#define TIMER_C1531_TAG   "c1531"
23 
24class vic10_state : public driver_device
25{
26public:
27   vic10_state(const machine_config &mconfig, device_type type, const char *tag)
28      : driver_device(mconfig, type, tag),
29        m_maincpu(*this, M6510_TAG),
30        m_vic(*this, MOS6566_TAG),
31        m_sid(*this, MOS6581_TAG),
32        m_cia(*this, MOS6526_TAG),
33        m_exp(*this, VIC10_EXPANSION_SLOT_TAG),
34        m_ram(*this, RAM_TAG),
35        m_cassette(*this, CASSETTE_TAG),
36        m_cassette_timer(*this, TIMER_C1531_TAG),
37        m_cia_irq(CLEAR_LINE),
38        m_vic_irq(CLEAR_LINE),
39        m_exp_irq(CLEAR_LINE)
40   { }
41 
42   required_device<cpu_device> m_maincpu;
43   required_device<device_t> m_vic;
44   required_device<device_t> m_sid;
45   required_device<mos6526_device> m_cia;
46   required_device<vic10_expansion_slot_device> m_exp;
47   required_device<ram_device> m_ram;
48   optional_device<cassette_image_device> m_cassette;
49   optional_device<timer_device> m_cassette_timer;
50 
51   virtual void machine_start();
52   virtual UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
53   
54   void check_interrupts();
55   
56   DECLARE_READ8_MEMBER( vic_lightpen_x_cb );
57   DECLARE_READ8_MEMBER( vic_lightpen_y_cb );
58   DECLARE_READ8_MEMBER( vic_lightpen_button_cb );
59   DECLARE_READ8_MEMBER( vic_dma_read );
60   DECLARE_READ8_MEMBER( vic_dma_read_color );
61   DECLARE_WRITE_LINE_MEMBER( vic_irq_w );
62   DECLARE_READ8_MEMBER( vic_rdy_cb );
63   DECLARE_WRITE_LINE_MEMBER( cia_irq_w );
64   DECLARE_READ8_MEMBER( cia_pa_r );
65   DECLARE_READ8_MEMBER( cia_pb_r );
66   DECLARE_WRITE8_MEMBER( cia_pb_w );
67   DECLARE_READ8_MEMBER( cpu_r );
68   DECLARE_WRITE8_MEMBER( cpu_w );
69   DECLARE_WRITE_LINE_MEMBER( exp_irq_w );
70   
71   // video state
72   UINT8 *m_color_ram;
73   
74   // interrupt state
75   int m_cia_irq;
76   int m_vic_irq;
77   int m_exp_irq;
78};
79 
80 
81 
82#endif
src/mess/mess.lst
r14341r14342
547547vic20p   // Commodore VIC 20 (PAL)
548548vic20s   // Commodore VIC 20 (Swedish Expanson Kit)
549549
550max      // Commodore Max Machine (Japan)
550vic10      // Commodore Max Machine (Japan)
551551c64n
552552c64p   // Commodore 64 (PAL)
553553c64j   // Commodore 64 (Japan)
src/mess/mess.mak
r14341r14342
734734   $(MESS_DRIVERS)/ace.o      \
735735   $(MESS_FORMATS)/ace_ace.o   \
736736
737$(MESSOBJ)/casio.a:         \
737$(MESSOBJ)/casio.a:            \
738738   $(MESS_DRIVERS)/casloopy.o   \
739739   $(MESS_DRIVERS)/cfx9850.o   \
740   $(MESS_DRIVERS)/fp1100.o        \
740   $(MESS_DRIVERS)/fp1100.o    \
741741   $(MESS_DRIVERS)/pv1000.o   \
742742   $(MESS_DRIVERS)/pv2000.o   \
743743   $(MESS_DRIVERS)/pb1000.o   \
744   $(MESS_DRIVERS)/fp6000.o        \
744   $(MESS_DRIVERS)/fp6000.o    \
745745   $(MESS_VIDEO)/hd44352.o      \
746746
747747$(MESSOBJ)/cbm.a:            \
r14341r14342
749749   $(MESS_DRIVERS)/pet.o      \
750750   $(MESS_MACHINE)/pet.o      \
751751   $(MESS_DRIVERS)/c64.o      \
752   $(MESS_DRIVERS)/c64x.o      \
752   $(MESS_MACHINE)/c64.o      \
753753   $(MESS_DRIVERS)/c64dtv.o   \
754754   $(MESS_MACHINE)/c64exp.o   \
755755   $(MESS_MACHINE)/c64user.o   \
756756   $(MESS_MACHINE)/c64_std.o   \
757757   $(MESS_MACHINE)/c64_xl80.o   \
758758   $(MESS_MACHINE)/interpod.o   \
759   $(MESS_DRIVERS)/vic10.o      \
760   $(MESS_MACHINE)/vic10exp.o   \
761   $(MESS_MACHINE)/vic10std.o   \
759762   $(MESS_DRIVERS)/vic20.o      \
760763   $(MESS_MACHINE)/vic20exp.o   \
761764   $(MESS_MACHINE)/vic20std.o   \
r14341r14342
766769   $(MESS_MACHINE)/vic1210.o   \
767770   $(MESS_AUDIO)/ted7360.o      \
768771   $(MESS_AUDIO)/t6721.o      \
772   $(MESS_DRIVERS)/c16.o      \
769773   $(MESS_MACHINE)/c16.o      \
770   $(MESS_DRIVERS)/c16.o      \
771774   $(MESS_DRIVERS)/cbmb.o      \
772775   $(MESS_MACHINE)/cbmb.o      \
773776   $(MESS_VIDEO)/cbmb.o      \
774777   $(MESS_DRIVERS)/c65.o      \
778   $(MESS_MACHINE)/c65.o      \
775779   $(MESS_DRIVERS)/c128.o      \
780   $(MESS_MACHINE)/c128.o      \
776781   $(MESS_MACHINE)/cbmiec.o   \
777782   $(MESS_MACHINE)/c1541.o      \
778783   $(MESS_MACHINE)/c1551.o      \
r14341r14342
787792   $(MESS_DRIVERS)/clcd.o      \
788793   $(MESS_MACHINE)/cbm.o      \
789794   $(MESS_MACHINE)/cbmipt.o   \
790   $(MESS_MACHINE)/c64.o      \
791   $(MESS_MACHINE)/c65.o      \
792   $(MESS_MACHINE)/c128.o      \
793795   $(MESS_MACHINE)/64h156.o   \
794796   $(MESS_VIDEO)/vdc8563.o      \
795797   $(MESS_VIDEO)/vic6567.o      \
src/mess/drivers/c64x.c
r14341r14342
1/*
2 
3   TODO:
4   
5   - PLA dump (http://www.zimmers.net/cbmpics/cbm/c64/pla.txt)
6   - cartridge loading
7   - migrate remaining drivers from c64.c
8 
9*/
10 
11#include "includes/c64x.h"
12 
13 
14//**************************************************************************
15//  MACROS / CONSTANTS
16//**************************************************************************
17 
18#define A15 BIT(offset, 15)
19#define A14 BIT(offset, 14)
20#define A13 BIT(offset, 13)
21#define A12 BIT(offset, 12)
22#define VA13 BIT(va, 13)
23#define VA12 BIT(va, 12)
24 
25 
26 
27//**************************************************************************
28//  INTERRUPTS
29//**************************************************************************
30 
31//-------------------------------------------------
32//  check_interrupts -
33//-------------------------------------------------
34 
35void c64_state::check_interrupts()
36{
37   int restore = BIT(input_port_read(machine(), "SPECIAL"), 7);
38   
39   m_maincpu->set_input_line(INPUT_LINE_IRQ0, m_cia1_irq | m_vic_irq | m_exp_irq);
40   m_maincpu->set_input_line(INPUT_LINE_NMI, m_cia2_irq | restore | m_exp_nmi);
41   
42   mos6526_flag_w(m_cia1, m_cass_rd & m_iec_srq);
43}
44 
45 
46 
47//**************************************************************************
48//  MEMORY MANAGEMENT UNIT
49//**************************************************************************
50 
51//-------------------------------------------------
52//  bankswitch -
53//-------------------------------------------------
54 
55void c64_state::bankswitch(offs_t offset, offs_t va, int rw, int aec, int ba, int cas, int *casram, int *basic, int *kernal, int *charom, int *grw, int *io, int *roml, int *romh)
56{
57   int game = m_exp->game_r();
58   int exrom = m_exp->exrom_r();
59 
60   *romh = (m_hiram & A15 & !A14 & A13 & !aec & rw & !exrom & !game 
61         || A15 & A14 & A13 & !aec & exrom & !game 
62         || aec & exrom & !game & VA13 & VA12);
63 
64   *roml = (m_loram & m_hiram & A15 & !A14 & !A13 & !aec & rw & !exrom 
65         || A15 & !A14 & !A13 & !aec & exrom & !game);
66 
67   *io = (m_hiram & m_charen & A15 & A14 & !A13 & A12 & ba & !aec & rw & game 
68         || m_hiram & m_charen & A15 & A14 & !A13 & A12 & !aec & !rw & game 
69         || m_loram & m_charen & A15 & A14 & !A13 & A12 & ba & !aec & rw & game 
70         || m_loram & m_charen & A15 & A14 & !A13 & A12 & !aec & !rw & game 
71         || m_hiram & m_charen & A15 & A14 & !A13 & A12 & ba & !aec & rw & !exrom & !game 
72         || m_hiram & m_charen & A15 & A14 & !A13 & A12 & !aec & !rw & !exrom & !game 
73         || m_loram & m_charen & A15 & A14 & !A13 & A12 & ba & !aec & rw & !exrom & !game 
74         || m_loram & m_charen & A15 & A14 & !A13 & A12 & !aec & !rw & !exrom & !game 
75         || A15 & A14 & !A13 & A12 & ba & !aec & rw & exrom & !game 
76         || A15 & A14 & !A13 & A12 & !aec & !rw & exrom & !game);
77 
78   *grw = (!cas & A15 & A14 & !A13 & A12 &   !aec & !rw);
79   
80   *charom = (m_hiram & !m_charen & A15 & A14 & !A13 & A12 & !aec & rw & game 
81         || m_loram & !m_charen & A15 & A14 & !A13 & A12 & !aec & rw & game 
82         || m_hiram & !m_charen & A15 & A14 & !A13 & A12 & !aec & rw & !exrom & !game 
83         || m_va14 & aec & game & !VA13 & VA12 
84         || m_va14 & aec & !exrom & !game & !VA13 & VA12);               
85 
86   *kernal = (m_hiram & A15 & A14 & A13 & !aec & rw & game 
87         || m_hiram & A15 & A14 & A13 & !aec & rw & !exrom & !game);
88             
89   *basic = (m_loram & m_hiram & A15 & !A14 & A13 & !aec & rw & game);
90 
91   *casram = !(m_loram & m_hiram & A15 & !A14 & A13 & !aec & rw & game 
92         || m_hiram & A15 & A14 & A13 & !aec & rw & game 
93         || m_hiram & A15 & A14 & A13 & !aec & rw & !exrom & !game 
94         || m_hiram & !m_charen & A15 & A14 & !A13 & A12 & !aec & rw & game 
95         || m_loram & !m_charen & A15 & A14 & !A13 & A12 & !aec & rw & game 
96         || m_hiram & !m_charen & A15 & A14 & !A13 & A12 & !aec & rw & !exrom & !game 
97         || m_va14 & aec & game & !VA13 & VA12 
98         || m_va14 & aec & !exrom & !game & !VA13 & VA12 
99         || m_hiram & m_charen & A15 & A14 & !A13 & A12 & ba & !aec & rw & game 
100         || m_hiram & m_charen & A15 & A14 & !A13 & A12 & !aec & !rw & game 
101         || m_loram & m_charen & A15 & A14 & !A13 & A12 & ba & !aec & rw & game 
102         || m_loram & m_charen & A15 & A14 & !A13 & A12 & !aec & !rw & game 
103         || m_hiram & m_charen & A15 & A14 & !A13 & A12 & ba & !aec & rw & !exrom & !game 
104         || m_hiram & m_charen & A15 & A14 & !A13 & A12 & !aec & !rw & !exrom & !game 
105         || m_loram & m_charen & A15 & A14 & !A13 & A12 & ba & !aec & rw & !exrom & !game 
106         || m_loram & m_charen & A15 & A14 & !A13 & A12 & !aec & !rw & !exrom & !game 
107         || A15 & A14 & !A13 & A12 & ba & !aec & rw & exrom & !game 
108         || A15 & A14 & !A13 & A12 & !aec & !rw & exrom & !game 
109         || m_loram & m_hiram & A15 & !A14 & !A13 & !aec & rw & !exrom 
110         || A15 & !A14 & !A13 & !aec & exrom & !game 
111         || m_hiram & A15 & !A14 & A13 & !aec & rw & !exrom & !game 
112         || A15 & A14 & A13 & !aec & exrom & !game 
113         || aec & exrom & !game & VA13 & VA12 
114         || !A15 & !A14 & A12 & exrom & !game 
115         || !A15 & !A14 & A13 & exrom & !game 
116         || !A15 & A14 & exrom & !game 
117         || A15 & !A14 & A13 & exrom & !game 
118         || A15 & A14 & !A13 & !A12 & exrom & !game 
119         || cas);
120}
121 
122 
123//-------------------------------------------------
124//  read_memory -
125//-------------------------------------------------
126 
127UINT8 c64_state::read_memory(address_space &space, offs_t offset, int casram, int basic, int kernal, int charom, int io, int roml, int romh)
128{
129   UINT8 data = 0;
130   
131   if (casram)
132   {
133      data = m_ram->pointer()[offset];
134   }
135   else if (basic)
136   {
137      data = m_basic[offset & 0x1fff];
138   }
139   else if (kernal)
140   {
141      data = m_kernal[offset & 0x1fff];
142   }
143   else if (charom)
144   {
145      data = m_charom[offset & 0xfff];
146   }
147   else if (io)
148   {
149      switch ((offset >> 10) & 0x03)
150      {
151      case 0: // VIC
152         data = vic2_port_r(m_vic, offset & 0x3f);
153         break;
154 
155      case 1: // SID
156         data = sid6581_r(m_sid, offset & 0x1f);
157         break;
158 
159      case 2: // COLOR
160         data = m_color_ram[offset & 0x3ff];
161         break;
162 
163      case 3: // CIAS
164         switch ((offset >> 8) & 0x03)
165         {
166         case 0: // CIA1
167            if (offset & 1)
168               cia_set_port_mask_value(m_cia1, 1, input_port_read(machine(), "CTRLSEL") & 0x80 ? c64_keyline[9] : c64_keyline[8] );
169            else
170               cia_set_port_mask_value(m_cia1, 0, input_port_read(machine(), "CTRLSEL") & 0x80 ? c64_keyline[8] : c64_keyline[9] );
171               
172            data = mos6526_r(m_cia1, offset & 0x0f);
173            break;
174             
175         case 1: // CIA2
176            data = mos6526_r(m_cia2, offset & 0x0f);
177            break;
178             
179         case 2: // I/O1
180            data = m_exp->io1_r(space, offset);
181            break;
182             
183         case 3: // I/O2
184            data = m_exp->io2_r(space, offset);
185            break;
186         }
187         break;
188      }
189   }
190   else if (roml)
191   {
192      data = m_exp->roml_r(space, offset);
193   }
194   else if (romh)
195   {
196      data = m_exp->romh_r(space, offset);
197   }
198   
199   return data;
200}
201 
202 
203//-------------------------------------------------
204//  read -
205//-------------------------------------------------
206 
207READ8_MEMBER( c64_state::read )
208{
209   int casram, basic, kernal, charom, grw, io, roml, romh;
210   
211   bankswitch(offset, 0, 1, 0, 1, 0, &casram, &basic, &kernal, &charom, &grw, &io, &roml, &romh);
212   
213   return read_memory(space, offset, casram, basic, kernal, charom, io, roml, romh);
214}
215 
216 
217//-------------------------------------------------
218//  write -
219//-------------------------------------------------
220 
221WRITE8_MEMBER( c64_state::write )
222{
223   int casram, basic, kernal, charom, grw, io, roml, romh;
224   
225   bankswitch(offset, 0, 0, 0, 1, 0, &casram, &basic, &kernal, &charom, &grw, &io, &roml, &romh);
226 
227   if (casram)
228   {
229      m_ram->pointer()[offset] = data;
230   }
231   else if (io)
232   {
233      switch ((offset >> 10) & 0x03)
234      {
235      case 0: // VIC
236         vic2_port_w(m_vic, offset & 0x3f, data);
237         break;
238 
239      case 1: // SID
240         sid6581_w(m_sid, offset & 0x1f, data);
241         break;
242 
243      case 2: // COLOR
244         if (grw) m_color_ram[offset & 0x3ff] = 0xf0 | data;
245         break;
246 
247      case 3: // CIAS
248         switch ((offset >> 8) & 0x03)
249         {
250         case 0: // CIA1
251            mos6526_w(m_cia1, offset & 0x0f, data);
252            break;
253             
254         case 1: // CIA2
255            mos6526_w(m_cia2, offset & 0x0f, data);
256            break;
257             
258         case 2: // I/O1
259            m_exp->io1_w(space, offset, data);
260            break;
261             
262         case 3: // I/O2
263            m_exp->io2_w(space, offset, data);
264            break;
265         }
266         break;
267      }
268   }
269}
270 
271 
272 
273//**************************************************************************
274//  ADDRESS MAPS
275//**************************************************************************
276 
277//-------------------------------------------------
278//  ADDRESS_MAP( c64_mem )
279//-------------------------------------------------
280 
281static ADDRESS_MAP_START( c64_mem, AS_PROGRAM, 8, c64_state )
282   AM_RANGE(0x0000, 0xffff) AM_READWRITE(read, write)
283ADDRESS_MAP_END
284 
285 
286 
287//**************************************************************************
288//  INPUT PORTS
289//**************************************************************************
290 
291//-------------------------------------------------
292//  INPUT_PORTS( c64 )
293//-------------------------------------------------
294 
295static INPUT_PORTS_START( c64 )
296   PORT_INCLUDE( common_cbm_keyboard )      // ROW0 -> ROW7
297 
298   PORT_INCLUDE( c64_special )            // SPECIAL
299 
300   PORT_INCLUDE( c64_controls )         // CTRLSEL, JOY0, JOY1, PADDLE0 -> PADDLE3, TRACKX, TRACKY, LIGHTX, LIGHTY, OTHER
301INPUT_PORTS_END
302 
303 
304//-------------------------------------------------
305//  INPUT_PORTS( c64sw )
306//-------------------------------------------------
307 
308static INPUT_PORTS_START( c64sw )
309   PORT_INCLUDE( c64 )
310 
311   PORT_MODIFY( "ROW5" )
312   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("\xc3\xa5") PORT_CODE(KEYCODE_OPENBRACE)   PORT_CHAR('\xA5')
313   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON)                        PORT_CHAR(';') PORT_CHAR(']')
314   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS)                     PORT_CHAR('=')
315   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS)                        PORT_CHAR('-')
316 
317   PORT_MODIFY( "ROW6" )
318   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("\xc3\xa4") PORT_CODE(KEYCODE_BACKSLASH)   PORT_CHAR('\xA4')
319   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("\xc3\xb6") PORT_CODE(KEYCODE_QUOTE)      PORT_CHAR('\xB6')
320   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE)                  PORT_CHAR('@')
321   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH2)                  PORT_CHAR(':') PORT_CHAR('*')
322INPUT_PORTS_END
323 
324 
325//-------------------------------------------------
326//  INPUT_PORTS( c64gs )
327//-------------------------------------------------
328 
329static INPUT_PORTS_START( c64gs )
330   PORT_INCLUDE( c64 )
331 
332   /* 2008 FP: This has to be cleaned up later */
333   /* C64gs should simply not scan these inputs */
334   /* as a temporary solution, we keep PeT IPT_UNUSED shortcut */
335 
336   PORT_MODIFY( "ROW0" ) /* no keyboard */
337   PORT_BIT (0xff, 0x00, IPT_UNUSED )
338   PORT_MODIFY( "ROW1" ) /* no keyboard */
339   PORT_BIT (0xff, 0x00, IPT_UNUSED )
340   PORT_MODIFY( "ROW2" ) /* no keyboard */
341   PORT_BIT (0xff, 0x00, IPT_UNUSED )
342   PORT_MODIFY( "ROW3" ) /* no keyboard */
343   PORT_BIT (0xff, 0x00, IPT_UNUSED )
344   PORT_MODIFY( "ROW4" ) /* no keyboard */
345   PORT_BIT (0xff, 0x00, IPT_UNUSED )
346   PORT_MODIFY( "ROW5" ) /* no keyboard */
347   PORT_BIT (0xff, 0x00, IPT_UNUSED )
348   PORT_MODIFY( "ROW6" ) /* no keyboard */
349   PORT_BIT (0xff, 0x00, IPT_UNUSED )
350   PORT_MODIFY( "ROW7" ) /* no keyboard */
351   PORT_BIT (0xff, 0x00, IPT_UNUSED )
352   PORT_MODIFY( "SPECIAL" ) /* no keyboard */
353   PORT_BIT (0xff, 0x00, IPT_UNUSED )
354INPUT_PORTS_END
355 
356 
357 
358//**************************************************************************
359//  DEVICE CONFIGURATION
360//**************************************************************************
361 
362//-------------------------------------------------
363//  vic2_interface vic_intf
364//-------------------------------------------------
365 
366static const unsigned char c64_palette[] =
367{
368// black, white, red, cyan
369// purple, green, blue, yellow
370// orange, brown, light red, dark gray,
371// medium gray, light green, light blue, light gray
372// taken from the vice emulator
373   0x00, 0x00, 0x00,  0xfd, 0xfe, 0xfc,  0xbe, 0x1a, 0x24,  0x30, 0xe6, 0xc6,
374   0xb4, 0x1a, 0xe2,  0x1f, 0xd2, 0x1e,  0x21, 0x1b, 0xae,  0xdf, 0xf6, 0x0a,
375   0xb8, 0x41, 0x04,  0x6a, 0x33, 0x04,  0xfe, 0x4a, 0x57,  0x42, 0x45, 0x40,
376   0x70, 0x74, 0x6f,  0x59, 0xfe, 0x59,  0x5f, 0x53, 0xfe,  0xa4, 0xa7, 0xa2
377};
378 
379static PALETTE_INIT( c64 )
380{
381   int i;
382 
383   for (i = 0; i < sizeof(c64_palette) / 3; i++)
384   {
385      palette_set_color_rgb(machine, i, c64_palette[i * 3], c64_palette[i * 3 + 1], c64_palette[i * 3 + 2]);
386   }
387}
388 
389static PALETTE_INIT( pet64 )
390{
391   int i;
392   for (i = 0; i < 16; i++)
393      palette_set_color_rgb(machine, i, 0, c64_palette[i * 3 + 1], 0);
394}
395 
396UINT32 c64_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
397{
398   vic2_video_update(m_vic, bitmap, cliprect);
399 
400   return 0;
401}
402 
403static INTERRUPT_GEN( c64_frame_interrupt )
404{
405   c64_state *state = device->machine().driver_data<c64_state>();
406   
407   state->check_interrupts();
408   cbm_common_interrupt(device);
409}
410 
411READ8_MEMBER( c64_state::vic_lightpen_x_cb )
412{
413   return input_port_read(machine(), "LIGHTX") & ~0x01;
414}
415 
416READ8_MEMBER( c64_state::vic_lightpen_y_cb )
417{
418   return input_port_read(machine(), "LIGHTY") & ~0x01;
419}
420 
421READ8_MEMBER( c64_state::vic_lightpen_button_cb )
422{
423   return input_port_read(machine(), "OTHER") & 0x04;
424}
425 
426READ8_MEMBER( c64_state::vic_dma_read )
427{
428   int casram, basic, kernal, charom, grw, io, roml, romh;
429   
430   offset = (!m_va15 << 15) | (!m_va14 << 14) | offset;
431   
432   bankswitch(0, offset, 1, 1, 0, 0, &casram, &basic, &kernal, &charom, &grw, &io, &roml, &romh);
433   
434   return read_memory(space, offset, casram, basic, kernal, charom, io, roml, romh);
435}
436 
437READ8_MEMBER( c64_state::vic_dma_read_color )
438{
439   return m_color_ram[offset & 0x3ff];
440}
441 
442WRITE_LINE_MEMBER( c64_state::vic_irq_w )
443{
444   m_vic_irq = state;
445   
446   check_interrupts();
447}
448 
449READ8_MEMBER( c64_state::vic_rdy_cb )
450{
451   return input_port_read(machine(), "CYCLES") & 0x07;
452}
453 
454static const vic2_interface vic_ntsc_intf = 
455{
456   SCREEN_TAG,
457   M6510_TAG,
458   VIC6567,
459   DEVCB_DRIVER_MEMBER(c64_state, vic_lightpen_x_cb),
460   DEVCB_DRIVER_MEMBER(c64_state, vic_lightpen_y_cb),
461   DEVCB_DRIVER_MEMBER(c64_state, vic_lightpen_button_cb),
462   DEVCB_DRIVER_MEMBER(c64_state, vic_dma_read),
463   DEVCB_DRIVER_MEMBER(c64_state, vic_dma_read_color),
464   DEVCB_DRIVER_LINE_MEMBER(c64_state, vic_irq_w),
465   DEVCB_DRIVER_MEMBER(c64_state, vic_rdy_cb)
466};
467 
468static const vic2_interface vic_pal_intf = 
469{
470   SCREEN_TAG,
471   M6510_TAG,
472   VIC6569,
473   DEVCB_DRIVER_MEMBER(c64_state, vic_lightpen_x_cb),
474   DEVCB_DRIVER_MEMBER(c64_state, vic_lightpen_y_cb),
475   DEVCB_DRIVER_MEMBER(c64_state, vic_lightpen_button_cb),
476   DEVCB_DRIVER_MEMBER(c64_state, vic_dma_read),
477   DEVCB_DRIVER_MEMBER(c64_state, vic_dma_read_color),
478   DEVCB_DRIVER_LINE_MEMBER(c64_state, vic_irq_w),
479   DEVCB_DRIVER_MEMBER(c64_state, vic_rdy_cb)
480};
481 
482 
483//-------------------------------------------------
484//  sid6581_interface sid_intf
485//-------------------------------------------------
486 
487static int c64_paddle_read( device_t *device, int which )
488{
489   running_machine &machine = device->machine();
490   c64_state *state = device->machine().driver_data<c64_state>();
491   
492   int pot1 = 0xff, pot2 = 0xff, pot3 = 0xff, pot4 = 0xff, temp;
493   UINT8 cia0porta = mos6526_pa_r(state->m_cia1, 0);
494   int controller1 = input_port_read(machine, "CTRLSEL") & 0x07;
495   int controller2 = input_port_read(machine, "CTRLSEL") & 0x70;
496   // Notice that only a single input is defined for Mouse & Lightpen in both ports
497   switch (controller1)
498   {
499      case 0x01:
500         if (which)
501            pot2 = input_port_read(machine, "PADDLE2");
502         else
503            pot1 = input_port_read(machine, "PADDLE1");
504         break;
505 
506      case 0x02:
507         if (which)
508            pot2 = input_port_read(machine, "TRACKY");
509         else
510            pot1 = input_port_read(machine, "TRACKX");
511         break;
512 
513      case 0x03:
514         if (which && (input_port_read(machine, "JOY1_2B") & 0x20))   // Joy1 Button 2
515            pot1 = 0x00;
516         break;
517 
518      case 0x04:
519         if (which)
520            pot2 = input_port_read(machine, "LIGHTY");
521         else
522            pot1 = input_port_read(machine, "LIGHTX");
523         break;
524 
525      case 0x06:
526         if (which && (input_port_read(machine, "OTHER") & 0x04))   // Lightpen Signal
527            pot2 = 0x00;
528         break;
529 
530      case 0x00:
531      case 0x07:
532         break;
533 
534      default:
535         logerror("Invalid Controller Setting %d\n", controller1);
536         break;
537   }
538 
539   switch (controller2)
540   {
541      case 0x10:
542         if (which)
543            pot4 = input_port_read(machine, "PADDLE4");
544         else
545            pot3 = input_port_read(machine, "PADDLE3");
546         break;
547 
548      case 0x20:
549         if (which)
550            pot4 = input_port_read(machine, "TRACKY");
551         else
552            pot3 = input_port_read(machine, "TRACKX");
553         break;
554 
555      case 0x30:
556         if (which && (input_port_read(machine, "JOY2_2B") & 0x20))   // Joy2 Button 2
557            pot4 = 0x00;
558         break;
559 
560      case 0x40:
561         if (which)
562            pot4 = input_port_read(machine, "LIGHTY");
563         else
564            pot3 = input_port_read(machine, "LIGHTX");
565         break;
566 
567      case 0x60:
568         if (which && (input_port_read(machine, "OTHER") & 0x04))   // Lightpen Signal
569            pot4 = 0x00;
570         break;
571 
572      case 0x00:
573      case 0x70:
574         break;
575 
576      default:
577         logerror("Invalid Controller Setting %d\n", controller1);
578         break;
579   }
580 
581   if (input_port_read(machine, "CTRLSEL") & 0x80)      // Swap
582   {
583      temp = pot1; pot1 = pot3; pot3 = temp;
584      temp = pot2; pot2 = pot4; pot4 = temp;
585   }
586 
587   switch (cia0porta & 0xc0)
588   {
589      case 0x40:
590         return which ? pot2 : pot1;
591 
592      case 0x80:
593         return which ? pot4 : pot3;
594 
595      case 0xc0:
596         return which ? pot2 : pot1;
597 
598      default:
599         return 0;
600   }
601}
602 
603static const sid6581_interface sid_intf =
604{
605   c64_paddle_read
606};
607 
608 
609//-------------------------------------------------
610//  mos6526_interface cia1_intf
611//-------------------------------------------------
612 
613WRITE_LINE_MEMBER( c64_state::cia1_irq_w )
614{
615   m_cia1_irq = state;
616   
617   check_interrupts();
618}
619 
620READ8_MEMBER( c64_state::cia1_pa_r )
621{
622   /*
623       
624      bit      description
625       
626      PA0      COL0, JOY B0
627      PA1      COL1, JOY B1
628      PA2      COL2, JOY B2
629      PA3      COL3, JOY B3
630      PA4      COL4, BTNB
631      PA5      COL5
632      PA6      COL6
633      PA7      COL7
634       
635   */
636 
637   UINT8 cia0portb = mos6526_pb_r(m_cia1, 0);
638 
639   return cbm_common_cia0_port_a_r(m_cia1, cia0portb);
640}
641 
642READ8_MEMBER( c64_state::cia1_pb_r )
643{
644   /*
645       
646      bit      description
647       
648      PB0      JOY A0
649      PB1      JOY A1
650      PB2      JOY A2
651      PB3      JOY A3
652      PB4      BTNA/_LP
653      PB5
654      PB6
655      PB7
656       
657   */
658 
659   UINT8 cia0porta = mos6526_pa_r(m_cia1, 0);
660 
661   return cbm_common_cia0_port_b_r(m_cia1, cia0porta);
662}
663 
664WRITE8_MEMBER( c64_state::cia1_pb_w )
665{
666   /*
667       
668      bit      description
669       
670      PB0      ROW0
671      PB1      ROW1
672      PB2      ROW2
673      PB3      ROW3
674      PB4      ROW4
675      PB5      ROW5
676      PB6      ROW6
677      PB7      ROW7
678       
679   */
680   
681   vic2_lightpen_write(m_vic, BIT(data, 4));
682}
683 
684static const mos6526_interface cia1_intf =
685{
686   10,
687   DEVCB_DRIVER_LINE_MEMBER(c64_state, cia1_irq_w),
688   DEVCB_NULL,
689   DEVCB_DEVICE_LINE_MEMBER(C64_USER_PORT_TAG, c64_user_port_device, sp1_w),
690   DEVCB_DEVICE_LINE_MEMBER(C64_USER_PORT_TAG, c64_user_port_device, cnt1_w),
691   DEVCB_DRIVER_MEMBER(c64_state, cia1_pa_r),
692   DEVCB_NULL,
693   DEVCB_DRIVER_MEMBER(c64_state, cia1_pb_r),
694   DEVCB_DRIVER_MEMBER(c64_state, cia1_pb_w)
695};
696 
697 
698//-------------------------------------------------
699//  mos6526_interface cia2_intf
700//-------------------------------------------------
701 
702WRITE_LINE_MEMBER( c64_state::cia2_irq_w )
703{
704   m_cia2_irq = state;
705   
706   check_interrupts();
707}
708 
709READ8_MEMBER( c64_state::cia2_pa_r )
710{
711   /*
712       
713      bit      description
714       
715      PA0
716      PA1
717      PA2      USER PORT
718      PA3
719      PA4
720      PA5
721      PA6      CLK
722      PA7      DATA
723       
724   */
725   
726   UINT8 data = 0;
727   
728   // user port
729   data |= m_user->pa2_r() << 2;
730   
731   // IEC bus
732   data |= m_iec->clk_r() << 6;
733   data |= m_iec->data_r() << 7;
734   
735   return data;
736}
737 
738WRITE8_MEMBER( c64_state::cia2_pa_w )
739{
740   /*
741       
742      bit      description
743       
744      PA0      _VA14
745      PA1      _VA15
746      PA2      USER PORT
747      PA3      ATN OUT
748      PA4      CLK OUT
749      PA5      DATA OUT
750      PA6
751      PA7
752       
753   */
754   
755   // VIC banking
756   m_va14 = BIT(data, 0);
757   m_va15 = BIT(data, 1);
758   
759   // user port
760   m_user->pa2_w(BIT(data, 2));
761   
762   // IEC bus
763   m_iec->atn_w(!BIT(data, 3));
764   m_iec->clk_w(!BIT(data, 4));
765   m_iec->data_w(!BIT(data, 5));
766}
767 
768static const mos6526_interface cia2_intf =
769{
770   10,
771   DEVCB_DRIVER_LINE_MEMBER(c64_state, cia2_irq_w),
772   DEVCB_DEVICE_LINE_MEMBER(C64_USER_PORT_TAG, c64_user_port_device, pc2_w),
773   DEVCB_DEVICE_LINE_MEMBER(C64_USER_PORT_TAG, c64_user_port_device, sp2_w),
774   DEVCB_DEVICE_LINE_MEMBER(C64_USER_PORT_TAG, c64_user_port_device, cnt2_w),
775   DEVCB_DRIVER_MEMBER(c64_state, cia2_pa_r),
776   DEVCB_DRIVER_MEMBER(c64_state, cia2_pa_w),
777   DEVCB_DEVICE_MEMBER(C64_USER_PORT_TAG, c64_user_port_device, pb_r),
778   DEVCB_DEVICE_MEMBER(C64_USER_PORT_TAG, c64_user_port_device, pb_w)
779};
780 
781 
782//-------------------------------------------------
783//  m6502_interface cpu_intf
784//-------------------------------------------------
785 
786READ8_MEMBER( c64_state::cpu_r )
787{
788   /*
789       
790      bit      description
791       
792      P0      1
793      P1      1
794      P2      1
795      P3
796      P4      CASS SENS
797      P5       
798       
799   */
800   
801   UINT8 data = 0x07;
802   
803   data |= ((m_cassette->get_state() & CASSETTE_MASK_UISTATE) == CASSETTE_STOPPED) << 4;
804   
805   return data;
806}
807 
808WRITE8_MEMBER( c64_state::cpu_w )
809{
810   /*
811       
812      bit      description
813       
814      P0      LORAM
815      P1      HIRAM
816      P2      CHAREN
817      P3      CASS WRT
818      P4
819      P5      CASS MOTOR
820       
821   */
822 
823   // HACK apply pull-up resistors
824   data |= (offset ^ 0x07) & 0x07;
825   
826   m_loram = BIT(data, 0);
827   m_hiram = BIT(data, 1);
828   m_charen = BIT(data, 2);
829   
830   // cassette write
831   m_cassette->output(BIT(data, 3) ? -(0x5a9e >> 1) : +(0x5a9e >> 1));
832   
833   // cassette motor
834   if (!BIT(data, 5))
835   {
836      m_cassette->change_state(CASSETTE_MOTOR_ENABLED, CASSETTE_MASK_MOTOR);
837      m_cassette_timer->adjust(attotime::zero, 0, attotime::from_hz(44100));
838   }
839   else
840   {
841      m_cassette->change_state(CASSETTE_MOTOR_DISABLED, CASSETTE_MASK_MOTOR);
842      m_cassette_timer->reset();
843   }
844}
845 
846static const m6502_interface cpu_intf =
847{
848   NULL,
849   NULL,
850   DEVCB_DRIVER_MEMBER(c64_state, cpu_r),
851   DEVCB_DRIVER_MEMBER(c64_state, cpu_w)
852};
853 
854 
855//-------------------------------------------------
856//  m6502_interface sx64_cpu_intf
857//-------------------------------------------------
858 
859READ8_MEMBER( sx64_state::cpu_r )
860{
861   /*
862       
863      bit      description
864       
865      P0      1
866      P1      1
867      P2      1
868      P3      1
869      P4      1
870      P5      1
871       
872   */
873 
874   return 0x3f;
875}
876 
877WRITE8_MEMBER( sx64_state::cpu_w )
878{
879   /*
880       
881      bit      description
882       
883      P0      LORAM
884      P1      HIRAM
885      P2      CHAREN
886      P3       
887      P4
888      P5       
889       
890   */
891 
892   // HACK apply pull-up resistors
893   data |= (offset ^ 0x07) & 0x07;
894   
895   m_loram = BIT(data, 0);
896   m_hiram = BIT(data, 1);
897   m_charen = BIT(data, 2);
898}
899 
900static const m6502_interface sx64_cpu_intf =
901{
902   NULL,
903   NULL,
904   DEVCB_DRIVER_MEMBER(sx64_state, cpu_r),
905   DEVCB_DRIVER_MEMBER(sx64_state, cpu_w)
906};
907 
908 
909//-------------------------------------------------
910//  m6502_interface c64g_cpu_intf
911//-------------------------------------------------
912 
913READ8_MEMBER( c64gs_state::cpu_r )
914{
915   /*
916       
917      bit      description
918       
919      P0      1
920      P1      1
921      P2      1
922      P3      1
923      P4      1
924      P5      1
925       
926   */
927 
928   return 0x3f;
929}
930 
931WRITE8_MEMBER( c64gs_state::cpu_w )
932{
933   /*
934       
935      bit      description
936       
937      P0      LORAM
938      P1      HIRAM
939      P2      CHAREN
940      P3       
941      P4
942      P5       
943       
944   */
945 
946   // HACK apply pull-up resistors
947   data |= (offset ^ 0x07) & 0x07;
948   
949   m_loram = BIT(data, 0);
950   m_hiram = BIT(data, 1);
951   m_charen = BIT(data, 2);
952}
953 
954static const m6502_interface c64gs_cpu_intf =
955{
956   NULL,
957   NULL,
958   DEVCB_DRIVER_MEMBER(c64gs_state, cpu_r),
959   DEVCB_DRIVER_MEMBER(c64gs_state, cpu_w)
960};
961 
962 
963//-------------------------------------------------
964//  TIMER_DEVICE_CALLBACK( cassette_tick )
965//-------------------------------------------------
966 
967static TIMER_DEVICE_CALLBACK( cassette_tick )
968{
969   c64_state *state = timer.machine().driver_data<c64_state>();
970 
971   state->m_cass_rd = state->m_cassette->input() > +0.0;
972   
973   state->check_interrupts();
974}
975 
976 
977//-------------------------------------------------
978//  CBM_IEC_INTERFACE( iec_intf )
979//-------------------------------------------------
980 
981WRITE_LINE_MEMBER( c64_state::iec_srq_w )
982{
983   m_iec_srq = state;
984   
985   check_interrupts();
986}
987 
988static CBM_IEC_INTERFACE( iec_intf )
989{
990   DEVCB_DRIVER_LINE_MEMBER(c64_state, iec_srq_w),
991   DEVCB_DEVICE_LINE_MEMBER(C64_USER_PORT_TAG, c64_user_port_device, atn_w),
992   DEVCB_NULL,
993   DEVCB_NULL,
994   DEVCB_NULL
995};
996 
997 
998//-------------------------------------------------
999//  C64_EXPANSION_INTERFACE( expansion_intf )
1000//-------------------------------------------------
1001 
1002WRITE_LINE_MEMBER( c64_state::exp_irq_w )
1003{
1004   m_exp_irq = state;
1005   
1006   check_interrupts();
1007}
1008 
1009WRITE_LINE_MEMBER( c64_state::exp_nmi_w )
1010{
1011   m_exp_nmi = state;
1012   
1013   check_interrupts();
1014}
1015 
1016static C64_EXPANSION_INTERFACE( expansion_intf )
1017{
1018   DEVCB_DRIVER_LINE_MEMBER(c64_state, exp_irq_w),
1019   DEVCB_DRIVER_LINE_MEMBER(c64_state, exp_nmi_w),
1020   DEVCB_NULL, // DMA
1021   DEVCB_CPU_INPUT_LINE(M6510_TAG, INPUT_LINE_RESET)
1022};
1023 
1024 
1025//-------------------------------------------------
1026//  C64_USER_PORT_INTERFACE( user_intf )
1027//-------------------------------------------------
1028 
1029static C64_USER_PORT_INTERFACE( user_intf )
1030{
1031   DEVCB_DEVICE_LINE(MOS6526_1_TAG, mos6526_sp_w),
1032   DEVCB_DEVICE_LINE(MOS6526_1_TAG, mos6526_cnt_w),
1033   DEVCB_DEVICE_LINE(MOS6526_2_TAG, mos6526_sp_w),
1034   DEVCB_DEVICE_LINE(MOS6526_2_TAG, mos6526_cnt_w),
1035   DEVCB_DEVICE_LINE(MOS6526_2_TAG, mos6526_flag_w),
1036   DEVCB_CPU_INPUT_LINE(M6510_TAG, INPUT_LINE_RESET)
1037};
1038 
1039 
1040 
1041//**************************************************************************
1042//  MACHINE INITIALIZATION
1043//**************************************************************************
1044 
1045//-------------------------------------------------
1046//  MACHINE_START( c64 )
1047//-------------------------------------------------
1048 
1049void c64_state::machine_start()
1050{
1051   // find memory regions
1052   m_basic = machine().region("basic")->base();
1053   m_kernal = machine().region("kernal")->base();
1054   m_charom = machine().region("charom")->base();
1055   
1056   // allocate memory
1057   m_color_ram = auto_alloc_array(machine(), UINT8, 0x400);
1058   
1059   // state saving
1060   save_item(NAME(m_loram));
1061   save_item(NAME(m_hiram));
1062   save_item(NAME(m_charen));
1063   save_pointer(NAME(m_color_ram), 0x400);
1064   save_item(NAME(m_va14));
1065   save_item(NAME(m_va15));
1066   save_item(NAME(m_cia1_irq));
1067   save_item(NAME(m_cia2_irq));
1068   save_item(NAME(m_vic_irq));
1069   save_item(NAME(m_exp_irq));
1070   save_item(NAME(m_exp_nmi));
1071   save_item(NAME(m_cass_rd));
1072   save_item(NAME(m_iec_srq));
1073}
1074 
1075 
1076//-------------------------------------------------
1077//  MACHINE_START( c64c )
1078//-------------------------------------------------
1079 
1080void c64c_state::machine_start()
1081{
1082   c64_state::machine_start();
1083   
1084   // find memory regions
1085   m_basic = machine().region(M6510_TAG)->base();
1086   m_kernal = machine().region(M6510_TAG)->base() + 0x2000;
1087}
1088 
1089 
1090//-------------------------------------------------
1091//  MACHINE_START( c64gs )
1092//-------------------------------------------------
1093 
1094void c64gs_state::machine_start()
1095{
1096   c64c_state::machine_start();
1097}
1098 
1099 
1100 
1101//**************************************************************************
1102//  MACHINE DRIVERS
1103//**************************************************************************
1104 
1105//-------------------------------------------------
1106//  MACHINE_CONFIG( ntsc )
1107//-------------------------------------------------
1108 
1109static MACHINE_CONFIG_START( ntsc, c64_state )
1110   // basic hardware
1111   MCFG_CPU_ADD(M6510_TAG, M6510, VIC6567_CLOCK)
1112   MCFG_CPU_PROGRAM_MAP(c64_mem)
1113   MCFG_CPU_CONFIG(cpu_intf)
1114   MCFG_CPU_VBLANK_INT(SCREEN_TAG, c64_frame_interrupt)
1115   MCFG_QUANTUM_TIME(attotime::from_hz(60))
1116 
1117   // video hardware
1118   MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
1119   MCFG_SCREEN_REFRESH_RATE(VIC6567_VRETRACERATE)
1120   MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
1121   MCFG_SCREEN_SIZE(VIC6567_COLUMNS, VIC6567_LINES)
1122   MCFG_SCREEN_VISIBLE_AREA(0, VIC6567_VISIBLECOLUMNS - 1, 0, VIC6567_VISIBLELINES - 1)
1123   MCFG_SCREEN_UPDATE_DRIVER(c64_state, screen_update)
1124 
1125   MCFG_PALETTE_INIT(c64)
1126   MCFG_PALETTE_LENGTH(ARRAY_LENGTH(c64_palette) / 3)
1127 
1128   MCFG_VIC2_ADD(MOS6567_TAG, vic_ntsc_intf)
1129 
1130   // sound hardware
1131   MCFG_SPEAKER_STANDARD_MONO("mono")
1132   MCFG_SOUND_ADD(MOS6851_TAG, SID6581, VIC6567_CLOCK)
1133   MCFG_SOUND_CONFIG(sid_intf)
1134   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
1135   MCFG_SOUND_ADD("dac", DAC, 0)
1136   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
1137 
1138   // devices
1139   MCFG_MOS6526R1_ADD(MOS6526_1_TAG, VIC6567_CLOCK, cia1_intf)
1140   MCFG_MOS6526R1_ADD(MOS6526_2_TAG, VIC6567_CLOCK, cia2_intf)
1141   MCFG_QUICKLOAD_ADD("quickload", cbm_c64, "p00,prg,t64", CBM_QUICKLOAD_DELAY_SECONDS)
1142   MCFG_CASSETTE_ADD(CASSETTE_TAG, cbm_cassette_interface)
1143   MCFG_TIMER_ADD(TIMER_C1531_TAG, cassette_tick)
1144   MCFG_CBM_IEC_ADD(iec_intf, "c1541")
1145   MCFG_C64_EXPANSION_SLOT_ADD(C64_EXPANSION_SLOT_TAG, expansion_intf, c64_expansion_cards, NULL, NULL)
1146   MCFG_C64_USER_PORT_ADD(C64_USER_PORT_TAG, user_intf, c64_user_port_cards, NULL, NULL)
1147 
1148   // software list
1149   MCFG_SOFTWARE_LIST_ADD("cart_list_c64", "c64_cart")
1150   MCFG_SOFTWARE_LIST_FILTER("cart_list_c64", "NTSC")
1151   MCFG_SOFTWARE_LIST_ADD("disk_list", "c64_flop")
1152   MCFG_SOFTWARE_LIST_FILTER("disk_list", "NTSC")
1153 
1154   // internal ram
1155   MCFG_RAM_ADD(RAM_TAG)
1156   MCFG_RAM_DEFAULT_SIZE("64K")
1157MACHINE_CONFIG_END
1158 
1159 
1160//-------------------------------------------------
1161//  MACHINE_CONFIG( pet64 )
1162//-------------------------------------------------
1163 
1164static MACHINE_CONFIG_DERIVED( pet64, ntsc )
1165   MCFG_PALETTE_INIT( pet64 )
1166MACHINE_CONFIG_END
1167 
1168 
1169//-------------------------------------------------
1170//  MACHINE_CONFIG( ntsc_sx )
1171//-------------------------------------------------
1172 
1173static MACHINE_CONFIG_START( ntsc_sx, sx64_state )
1174   // basic hardware
1175   MCFG_CPU_ADD(M6510_TAG, M6510, VIC6567_CLOCK)
1176   MCFG_CPU_PROGRAM_MAP(c64_mem)
1177   MCFG_CPU_CONFIG(sx64_cpu_intf)
1178   MCFG_CPU_VBLANK_INT(SCREEN_TAG, c64_frame_interrupt)
1179   MCFG_QUANTUM_TIME(attotime::from_hz(60))
1180 
1181   // video hardware
1182   MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
1183   MCFG_SCREEN_REFRESH_RATE(VIC6567_VRETRACERATE)
1184   MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
1185   MCFG_SCREEN_SIZE(VIC6567_COLUMNS, VIC6567_LINES)
1186   MCFG_SCREEN_VISIBLE_AREA(0, VIC6567_VISIBLECOLUMNS - 1, 0, VIC6567_VISIBLELINES - 1)
1187   MCFG_SCREEN_UPDATE_DRIVER(sx64_state, screen_update)
1188 
1189   MCFG_PALETTE_INIT(c64)
1190   MCFG_PALETTE_LENGTH(ARRAY_LENGTH(c64_palette) / 3)
1191 
1192   MCFG_VIC2_ADD(MOS6567_TAG, vic_ntsc_intf)
1193 
1194   // sound hardware
1195   MCFG_SPEAKER_STANDARD_MONO("mono")
1196   MCFG_SOUND_ADD(MOS6851_TAG, SID6581, VIC6567_CLOCK)
1197   MCFG_SOUND_CONFIG(sid_intf)
1198   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
1199   MCFG_SOUND_ADD("dac", DAC, 0)
1200   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
1201 
1202   // devices
1203   MCFG_MOS6526R1_ADD(MOS6526_1_TAG, VIC6567_CLOCK, cia1_intf)
1204   MCFG_MOS6526R1_ADD(MOS6526_2_TAG, VIC6567_CLOCK, cia2_intf)
1205   MCFG_QUICKLOAD_ADD("quickload", cbm_c64, "p00,prg,t64", CBM_QUICKLOAD_DELAY_SECONDS)
1206   MCFG_CBM_IEC_BUS_ADD(iec_intf)
1207   MCFG_CBM_IEC_SLOT_ADD("iec4", 4, cbm_iec_devices, NULL, NULL)
1208   MCFG_CBM_IEC_SLOT_ADD("iec8", 8, sx1541_iec_devices, "sx1541", NULL)
1209   MCFG_CBM_IEC_SLOT_ADD("iec9", 9, cbm_iec_devices, NULL, NULL)
1210   MCFG_CBM_IEC_SLOT_ADD("iec10", 10, cbm_iec_devices, NULL, NULL)
1211   MCFG_CBM_IEC_SLOT_ADD("iec11", 11, cbm_iec_devices, NULL, NULL)
1212   MCFG_C64_EXPANSION_SLOT_ADD(C64_EXPANSION_SLOT_TAG, expansion_intf, c64_expansion_cards, NULL, NULL)
1213   MCFG_C64_USER_PORT_ADD(C64_USER_PORT_TAG, user_intf, c64_user_port_cards, NULL, NULL)
1214 
1215   // software list
1216   MCFG_SOFTWARE_LIST_ADD("cart_list_c64", "c64_cart")
1217   MCFG_SOFTWARE_LIST_FILTER("cart_list_c64", "NTSC")
1218   MCFG_SOFTWARE_LIST_ADD("disk_list", "c64_flop")
1219   MCFG_SOFTWARE_LIST_FILTER("disk_list", "NTSC")
1220 
1221   // internal ram
1222   MCFG_RAM_ADD(RAM_TAG)
1223   MCFG_RAM_DEFAULT_SIZE("64K")
1224MACHINE_CONFIG_END
1225 
1226 
1227//-------------------------------------------------
1228//  MACHINE_CONFIG( ntsc_dx )
1229//-------------------------------------------------
1230 
1231static MACHINE_CONFIG_START( ntsc_dx, sx64_state )
1232   // basic hardware
1233   MCFG_CPU_ADD(M6510_TAG, M6510, VIC6567_CLOCK)
1234   MCFG_CPU_PROGRAM_MAP(c64_mem)
1235   MCFG_CPU_CONFIG(sx64_cpu_intf)
1236   MCFG_CPU_VBLANK_INT(SCREEN_TAG, c64_frame_interrupt)
1237   MCFG_QUANTUM_TIME(attotime::from_hz(60))
1238 
1239   // video hardware
1240   MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
1241   MCFG_SCREEN_REFRESH_RATE(VIC6567_VRETRACERATE)
1242   MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
1243   MCFG_SCREEN_SIZE(VIC6567_COLUMNS, VIC6567_LINES)
1244   MCFG_SCREEN_VISIBLE_AREA(0, VIC6567_VISIBLECOLUMNS - 1, 0, VIC6567_VISIBLELINES - 1)
1245   MCFG_SCREEN_UPDATE_DRIVER(sx64_state, screen_update)
1246 
1247   MCFG_PALETTE_INIT(c64)
1248   MCFG_PALETTE_LENGTH(ARRAY_LENGTH(c64_palette) / 3)
1249 
1250   MCFG_VIC2_ADD(MOS6567_TAG, vic_ntsc_intf)
1251 
1252   // sound hardware
1253   MCFG_SPEAKER_STANDARD_MONO("mono")
1254   MCFG_SOUND_ADD(MOS6851_TAG, SID6581, VIC6567_CLOCK)
1255   MCFG_SOUND_CONFIG(sid_intf)
1256   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
1257   MCFG_SOUND_ADD("dac", DAC, 0)
1258   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
1259 
1260   // devices
1261   MCFG_MOS6526R1_ADD(MOS6526_1_TAG, VIC6567_CLOCK, cia1_intf)
1262   MCFG_MOS6526R1_ADD(MOS6526_2_TAG, VIC6567_CLOCK, cia2_intf)
1263   MCFG_QUICKLOAD_ADD("quickload", cbm_c64, "p00,prg,t64", CBM_QUICKLOAD_DELAY_SECONDS)
1264   MCFG_CBM_IEC_BUS_ADD(iec_intf)
1265   MCFG_CBM_IEC_SLOT_ADD("iec4", 4, cbm_iec_devices, NULL, NULL)
1266   MCFG_CBM_IEC_SLOT_ADD("iec8", 8, sx1541_iec_devices, "sx1541", NULL)
1267   MCFG_CBM_IEC_SLOT_ADD("iec9", 9, sx1541_iec_devices, "sx1541", NULL)
1268   MCFG_CBM_IEC_SLOT_ADD("iec10", 10, cbm_iec_devices, NULL, NULL)
1269   MCFG_CBM_IEC_SLOT_ADD("iec11", 11, cbm_iec_devices, NULL, NULL)
1270   MCFG_C64_EXPANSION_SLOT_ADD(C64_EXPANSION_SLOT_TAG, expansion_intf, c64_expansion_cards, NULL, NULL)
1271   MCFG_C64_USER_PORT_ADD(C64_USER_PORT_TAG, user_intf, c64_user_port_cards, NULL, NULL)
1272 
1273   // software list
1274   MCFG_SOFTWARE_LIST_ADD("cart_list_c64", "c64_cart")
1275   MCFG_SOFTWARE_LIST_FILTER("cart_list_c64", "NTSC")
1276   MCFG_SOFTWARE_LIST_ADD("disk_list", "c64_flop")
1277   MCFG_SOFTWARE_LIST_FILTER("disk_list", "NTSC")
1278 
1279   // internal ram
1280   MCFG_RAM_ADD(RAM_TAG)
1281   MCFG_RAM_DEFAULT_SIZE("64K")
1282MACHINE_CONFIG_END
1283 
1284 
1285//-------------------------------------------------
1286//  MACHINE_CONFIG( ntsc_c )
1287//-------------------------------------------------
1288 
1289static MACHINE_CONFIG_START( ntsc_c, c64c_state )
1290   // basic hardware
1291   MCFG_CPU_ADD(M6510_TAG, M6510, VIC6567_CLOCK)
1292   MCFG_CPU_PROGRAM_MAP(c64_mem)
1293   MCFG_CPU_CONFIG(cpu_intf)
1294   MCFG_CPU_VBLANK_INT(SCREEN_TAG, c64_frame_interrupt)
1295   MCFG_QUANTUM_TIME(attotime::from_hz(60))
1296 
1297   // video hardware
1298   MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
1299   MCFG_SCREEN_REFRESH_RATE(VIC6567_VRETRACERATE)
1300   MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
1301   MCFG_SCREEN_SIZE(VIC6567_COLUMNS, VIC6567_LINES)
1302   MCFG_SCREEN_VISIBLE_AREA(0, VIC6567_VISIBLECOLUMNS - 1, 0, VIC6567_VISIBLELINES - 1)
1303   MCFG_SCREEN_UPDATE_DRIVER(c64c_state, screen_update)
1304 
1305   MCFG_PALETTE_INIT(c64)
1306   MCFG_PALETTE_LENGTH(ARRAY_LENGTH(c64_palette) / 3)
1307 
1308   MCFG_VIC2_ADD(MOS6567_TAG, vic_ntsc_intf)
1309 
1310   // sound hardware
1311   MCFG_SPEAKER_STANDARD_MONO("mono")
1312   MCFG_SOUND_ADD(MOS6851_TAG, SID6581, VIC6567_CLOCK)
1313   MCFG_SOUND_CONFIG(sid_intf)
1314   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
1315   MCFG_SOUND_ADD("dac", DAC, 0)
1316   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
1317 
1318   // devices
1319   MCFG_MOS6526R1_ADD(MOS6526_1_TAG, VIC6567_CLOCK, cia1_intf)
1320   MCFG_MOS6526R1_ADD(MOS6526_2_TAG, VIC6567_CLOCK, cia2_intf)
1321   MCFG_QUICKLOAD_ADD("quickload", cbm_c64, "p00,prg,t64", CBM_QUICKLOAD_DELAY_SECONDS)
1322   MCFG_CASSETTE_ADD(CASSETTE_TAG, cbm_cassette_interface)
1323   MCFG_TIMER_ADD(TIMER_C1531_TAG, cassette_tick)
1324   MCFG_CBM_IEC_ADD(iec_intf, "c1541")
1325   MCFG_C64_EXPANSION_SLOT_ADD(C64_EXPANSION_SLOT_TAG, expansion_intf, c64_expansion_cards, NULL, NULL)
1326   MCFG_C64_USER_PORT_ADD(C64_USER_PORT_TAG, user_intf, c64_user_port_cards, NULL, NULL)
1327 
1328   // software list
1329   MCFG_SOFTWARE_LIST_ADD("cart_list_c64", "c64_cart")
1330   MCFG_SOFTWARE_LIST_FILTER("cart_list_c64", "NTSC")
1331   MCFG_SOFTWARE_LIST_ADD("disk_list", "c64_flop")
1332   MCFG_SOFTWARE_LIST_FILTER("disk_list", "NTSC")
1333 
1334   // internal ram
1335   MCFG_RAM_ADD(RAM_TAG)
1336   MCFG_RAM_DEFAULT_SIZE("64K")
1337MACHINE_CONFIG_END
1338 
1339 
1340//-------------------------------------------------
1341//  MACHINE_CONFIG( pal )
1342//-------------------------------------------------
1343 
1344static MACHINE_CONFIG_START( pal, c64_state )
1345   // basic hardware
1346   MCFG_CPU_ADD(M6510_TAG, M6510, VIC6569_CLOCK)
1347   MCFG_CPU_PROGRAM_MAP(c64_mem)
1348   MCFG_CPU_CONFIG(cpu_intf)
1349   MCFG_CPU_VBLANK_INT(SCREEN_TAG, c64_frame_interrupt)
1350   MCFG_QUANTUM_TIME(attotime::from_hz(50))
1351 
1352   // video hardware
1353   MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
1354   MCFG_SCREEN_REFRESH_RATE(VIC6569_VRETRACERATE)
1355   MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
1356   MCFG_SCREEN_SIZE(VIC6569_COLUMNS, VIC6569_LINES)
1357   MCFG_SCREEN_VISIBLE_AREA(0, VIC6569_VISIBLECOLUMNS - 1, 0, VIC6569_VISIBLELINES - 1)
1358   MCFG_SCREEN_UPDATE_DRIVER(c64_state, screen_update)
1359 
1360   MCFG_PALETTE_INIT(c64)
1361   MCFG_PALETTE_LENGTH(ARRAY_LENGTH(c64_palette) / 3)
1362 
1363   MCFG_VIC2_ADD(MOS6569_TAG, vic_pal_intf)
1364 
1365   // sound hardware
1366   MCFG_SPEAKER_STANDARD_MONO("mono")
1367   MCFG_SOUND_ADD(MOS6851_TAG, SID6581, VIC6569_CLOCK)
1368   MCFG_SOUND_CONFIG(sid_intf)
1369   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
1370   MCFG_SOUND_ADD("dac", DAC, 0)
1371   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
1372 
1373   // devices
1374   MCFG_MOS6526R1_ADD(MOS6526_1_TAG, VIC6569_CLOCK, cia1_intf)
1375   MCFG_MOS6526R1_ADD(MOS6526_2_TAG, VIC6569_CLOCK, cia2_intf)
1376   MCFG_QUICKLOAD_ADD("quickload", cbm_c64, "p00,prg,t64", CBM_QUICKLOAD_DELAY_SECONDS)
1377   MCFG_CASSETTE_ADD(CASSETTE_TAG, cbm_cassette_interface)
1378   MCFG_TIMER_ADD(TIMER_C1531_TAG, cassette_tick)
1379   MCFG_CBM_IEC_ADD(iec_intf, "c1541")
1380   MCFG_C64_EXPANSION_SLOT_ADD(C64_EXPANSION_SLOT_TAG, expansion_intf, c64_expansion_cards, NULL, NULL)
1381   MCFG_C64_USER_PORT_ADD(C64_USER_PORT_TAG, user_intf, c64_user_port_cards, NULL, NULL)
1382 
1383   // software list
1384   MCFG_SOFTWARE_LIST_ADD("cart_list_c64", "c64_cart")
1385   MCFG_SOFTWARE_LIST_FILTER("cart_list_c64", "PAL")
1386   MCFG_SOFTWARE_LIST_ADD("disk_list", "c64_flop")
1387   MCFG_SOFTWARE_LIST_FILTER("disk_list", "PAL")
1388 
1389   // internal ram
1390   MCFG_RAM_ADD(RAM_TAG)
1391   MCFG_RAM_DEFAULT_SIZE("64K")
1392MACHINE_CONFIG_END
1393 
1394 
1395//-------------------------------------------------
1396//  MACHINE_CONFIG( pal_sx )
1397//-------------------------------------------------
1398 
1399static MACHINE_CONFIG_START( pal_sx, sx64_state )
1400   // basic hardware
1401   MCFG_CPU_ADD(M6510_TAG, M6510, VIC6569_CLOCK)
1402   MCFG_CPU_PROGRAM_MAP(c64_mem)
1403   MCFG_CPU_CONFIG(sx64_cpu_intf)
1404   MCFG_CPU_VBLANK_INT(SCREEN_TAG, c64_frame_interrupt)
1405   MCFG_QUANTUM_TIME(attotime::from_hz(50))
1406 
1407   // video hardware
1408   MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
1409   MCFG_SCREEN_REFRESH_RATE(VIC6569_VRETRACERATE)
1410   MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
1411   MCFG_SCREEN_SIZE(VIC6569_COLUMNS, VIC6569_LINES)
1412   MCFG_SCREEN_VISIBLE_AREA(0, VIC6569_VISIBLECOLUMNS - 1, 0, VIC6569_VISIBLELINES - 1)
1413   MCFG_SCREEN_UPDATE_DRIVER(sx64_state, screen_update)
1414 
1415   MCFG_PALETTE_INIT(c64)
1416   MCFG_PALETTE_LENGTH(ARRAY_LENGTH(c64_palette) / 3)
1417 
1418   MCFG_VIC2_ADD(MOS6569_TAG, vic_pal_intf)
1419 
1420   // sound hardware
1421   MCFG_SPEAKER_STANDARD_MONO("mono")
1422   MCFG_SOUND_ADD(MOS6851_TAG, SID6581, VIC6569_CLOCK)
1423   MCFG_SOUND_CONFIG(sid_intf)
1424   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
1425   MCFG_SOUND_ADD("dac", DAC, 0)
1426   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
1427 
1428   // devices
1429   MCFG_MOS6526R1_ADD(MOS6526_1_TAG, VIC6569_CLOCK, cia1_intf)
1430   MCFG_MOS6526R1_ADD(MOS6526_2_TAG, VIC6569_CLOCK, cia2_intf)
1431   MCFG_QUICKLOAD_ADD("quickload", cbm_c64, "p00,prg,t64", CBM_QUICKLOAD_DELAY_SECONDS)
1432   MCFG_CBM_IEC_BUS_ADD(iec_intf)
1433   MCFG_CBM_IEC_SLOT_ADD("iec4", 4, cbm_iec_devices, NULL, NULL)
1434   MCFG_CBM_IEC_SLOT_ADD("iec8", 8, sx1541_iec_devices, "sx1541", NULL)
1435   MCFG_CBM_IEC_SLOT_ADD("iec9", 9, cbm_iec_devices, NULL, NULL)
1436   MCFG_CBM_IEC_SLOT_ADD("iec10", 10, cbm_iec_devices, NULL, NULL)
1437   MCFG_CBM_IEC_SLOT_ADD("iec11", 11, cbm_iec_devices, NULL, NULL)
1438   MCFG_C64_EXPANSION_SLOT_ADD(C64_EXPANSION_SLOT_TAG, expansion_intf, c64_expansion_cards, NULL, NULL)
1439   MCFG_C64_USER_PORT_ADD(C64_USER_PORT_TAG, user_intf, c64_user_port_cards, NULL, NULL)
1440 
1441   // software list
1442   MCFG_SOFTWARE_LIST_ADD("cart_list_c64", "c64_cart")
1443   MCFG_SOFTWARE_LIST_FILTER("cart_list_c64", "PAL")
1444   MCFG_SOFTWARE_LIST_ADD("disk_list", "c64_flop")
1445   MCFG_SOFTWARE_LIST_FILTER("disk_list", "PAL")
1446 
1447   // internal ram
1448   MCFG_RAM_ADD(RAM_TAG)
1449   MCFG_RAM_DEFAULT_SIZE("64K")
1450MACHINE_CONFIG_END
1451 
1452 
1453//-------------------------------------------------
1454//  MACHINE_CONFIG( pal_c )
1455//-------------------------------------------------
1456 
1457static MACHINE_CONFIG_START( pal_c, c64c_state )
1458   // basic hardware
1459   MCFG_CPU_ADD(M6510_TAG, M6510, VIC6569_CLOCK)
1460   MCFG_CPU_PROGRAM_MAP(c64_mem)
1461   MCFG_CPU_CONFIG(cpu_intf)
1462   MCFG_CPU_VBLANK_INT(SCREEN_TAG, c64_frame_interrupt)
1463   MCFG_QUANTUM_TIME(attotime::from_hz(50))
1464 
1465   // video hardware
1466   MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
1467   MCFG_SCREEN_REFRESH_RATE(VIC6569_VRETRACERATE)
1468   MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
1469   MCFG_SCREEN_SIZE(VIC6569_COLUMNS, VIC6569_LINES)
1470   MCFG_SCREEN_VISIBLE_AREA(0, VIC6569_VISIBLECOLUMNS - 1, 0, VIC6569_VISIBLELINES - 1)
1471   MCFG_SCREEN_UPDATE_DRIVER(c64c_state, screen_update)
1472 
1473   MCFG_PALETTE_INIT(c64)
1474   MCFG_PALETTE_LENGTH(ARRAY_LENGTH(c64_palette) / 3)
1475 
1476   MCFG_VIC2_ADD(MOS6569_TAG, vic_pal_intf)
1477 
1478   // sound hardware
1479   MCFG_SPEAKER_STANDARD_MONO("mono")
1480   MCFG_SOUND_ADD(MOS6851_TAG, SID6581, VIC6569_CLOCK)
1481   MCFG_SOUND_CONFIG(sid_intf)
1482   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
1483   MCFG_SOUND_ADD("dac", DAC, 0)
1484   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
1485 
1486   // devices
1487   MCFG_MOS6526R1_ADD(MOS6526_1_TAG, VIC6569_CLOCK, cia1_intf)
1488   MCFG_MOS6526R1_ADD(MOS6526_2_TAG, VIC6569_CLOCK, cia2_intf)
1489   MCFG_QUICKLOAD_ADD("quickload", cbm_c64, "p00,prg,t64", CBM_QUICKLOAD_DELAY_SECONDS)
1490   MCFG_CASSETTE_ADD(CASSETTE_TAG, cbm_cassette_interface)
1491   MCFG_TIMER_ADD(TIMER_C1531_TAG, cassette_tick)
1492   MCFG_CBM_IEC_ADD(iec_intf, "c1541")
1493   MCFG_C64_EXPANSION_SLOT_ADD(C64_EXPANSION_SLOT_TAG, expansion_intf, c64_expansion_cards, NULL, NULL)
1494   MCFG_C64_USER_PORT_ADD(C64_USER_PORT_TAG, user_intf, c64_user_port_cards, NULL, NULL)
1495 
1496   // software list
1497   MCFG_SOFTWARE_LIST_ADD("cart_list_c64", "c64_cart")
1498   MCFG_SOFTWARE_LIST_FILTER("cart_list_c64", "PAL")
1499   MCFG_SOFTWARE_LIST_ADD("disk_list", "c64_flop")
1500   MCFG_SOFTWARE_LIST_FILTER("disk_list", "PAL")
1501 
1502   // internal ram
1503   MCFG_RAM_ADD(RAM_TAG)
1504   MCFG_RAM_DEFAULT_SIZE("64K")
1505MACHINE_CONFIG_END
1506 
1507 
1508//-------------------------------------------------
1509//  MACHINE_CONFIG( pal_gs )
1510//-------------------------------------------------
1511 
1512static MACHINE_CONFIG_START( pal_gs, c64gs_state )
1513   // basic hardware
1514   MCFG_CPU_ADD(M6510_TAG, M6510, VIC6569_CLOCK)
1515   MCFG_CPU_PROGRAM_MAP(c64_mem)
1516   MCFG_CPU_CONFIG(c64gs_cpu_intf)
1517   MCFG_CPU_VBLANK_INT(SCREEN_TAG, c64_frame_interrupt)
1518   MCFG_QUANTUM_TIME(attotime::from_hz(50))
1519 
1520   // video hardware
1521   MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
1522   MCFG_SCREEN_REFRESH_RATE(VIC6569_VRETRACERATE)
1523   MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
1524   MCFG_SCREEN_SIZE(VIC6569_COLUMNS, VIC6569_LINES)
1525   MCFG_SCREEN_VISIBLE_AREA(0, VIC6569_VISIBLECOLUMNS - 1, 0, VIC6569_VISIBLELINES - 1)
1526   MCFG_SCREEN_UPDATE_DRIVER(c64gs_state, screen_update)
1527 
1528   MCFG_PALETTE_INIT(c64)
1529   MCFG_PALETTE_LENGTH(ARRAY_LENGTH(c64_palette) / 3)
1530 
1531   MCFG_VIC2_ADD(MOS6569_TAG, vic_pal_intf)
1532 
1533   // sound hardware
1534   MCFG_SPEAKER_STANDARD_MONO("mono")
1535   MCFG_SOUND_ADD(MOS6851_TAG, SID6581, VIC6569_CLOCK)
1536   MCFG_SOUND_CONFIG(sid_intf)
1537   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
1538   MCFG_SOUND_ADD("dac", DAC, 0)
1539   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
1540 
1541   // devices
1542   MCFG_MOS6526R1_ADD(MOS6526_1_TAG, VIC6569_CLOCK, cia1_intf)
1543   MCFG_MOS6526R1_ADD(MOS6526_2_TAG, VIC6569_CLOCK, cia2_intf)
1544   MCFG_CBM_IEC_BUS_ADD(iec_intf)
1545   MCFG_C64_EXPANSION_SLOT_ADD(C64_EXPANSION_SLOT_TAG, expansion_intf, c64_expansion_cards, NULL, NULL)
1546   MCFG_C64_USER_PORT_ADD(C64_USER_PORT_TAG, user_intf, c64_user_port_cards, NULL, NULL)
1547 
1548   // software list
1549   MCFG_SOFTWARE_LIST_ADD("cart_list_c64", "c64_cart")
1550   MCFG_SOFTWARE_LIST_FILTER("cart_list_c64", "PAL")
1551 
1552   // internal ram
1553   MCFG_RAM_ADD(RAM_TAG)
1554   MCFG_RAM_DEFAULT_SIZE("64K")
1555MACHINE_CONFIG_END
1556 
1557 
1558 
1559//**************************************************************************
1560//  ROMS
1561//**************************************************************************
1562 
1563//-------------------------------------------------
1564//  ROM( c64n )
1565//-------------------------------------------------
1566 
1567ROM_START( c64n )
1568   ROM_REGION( 0x2000, "basic", 0 )
1569   ROM_LOAD( "901226-01.u3", 0x0000, 0x2000, CRC(f833d117) SHA1(79015323128650c742a3694c9429aa91f355905e) )
1570 
1571   ROM_REGION( 0x2000, "kernal", 0 )
1572   ROM_DEFAULT_BIOS("r3")
1573   ROM_SYSTEM_BIOS(0, "r1", "Kernal rev. 1" )
1574   ROMX_LOAD( "901227-01.u4", 0x0000, 0x2000, CRC(dce782fa) SHA1(87cc04d61fc748b82df09856847bb5c2754a2033), ROM_BIOS(1) )
1575   ROM_SYSTEM_BIOS(1, "r2", "Kernal rev. 2" )
1576   ROMX_LOAD( "901227-02.u4", 0x0000, 0x2000, CRC(a5c687b3) SHA1(0e2e4ee3f2d41f00bed72f9ab588b83e306fdb13), ROM_BIOS(2) )
1577   ROM_SYSTEM_BIOS(2, "r3", "Kernal rev. 3" )
1578   ROMX_LOAD( "901227-03.u4", 0x0000, 0x2000, CRC(dbe3e7c7) SHA1(1d503e56df85a62fee696e7618dc5b4e781df1bb), ROM_BIOS(3) )
1579   ROM_SYSTEM_BIOS(3, "jiffydos", "JiffyDOS v6.01" )
1580   ROMX_LOAD( "jiffydos c64.u4", 0x0000, 0x2000, CRC(2f79984c) SHA1(31e73e66eccb28732daea8ec3ad1addd9b39a017), ROM_BIOS(4) )
1581 
1582   ROM_REGION( 0x1000, "charom", 0 )
1583   ROM_LOAD( "901225-01.u5", 0x0000, 0x1000, CRC(ec4272ee) SHA1(adc7c31e18c7c7413d54802ef2f4193da14711aa) )
1584   
1585   ROM_REGION( 0x100, "pla", 0 )
1586   ROM_LOAD( "906114-01.u17", 0x000, 0x100, NO_DUMP )
1587ROM_END
1588 
1589 
1590//-------------------------------------------------
1591//  ROM( c64j )
1592//-------------------------------------------------
1593 
1594ROM_START( c64j )
1595   ROM_REGION( 0x2000, "basic", 0 )
1596   ROM_LOAD( "901226-01.u3", 0x0000, 0x2000, CRC(f833d117) SHA1(79015323128650c742a3694c9429aa91f355905e) )
1597 
1598   ROM_REGION( 0x2000, "kernal", 0 )
1599   ROM_LOAD( "906145-02.u4", 0x0000, 0x2000, CRC(3a9ef6f1) SHA1(4ff0f11e80f4b57430d8f0c3799ed0f0e0f4565d) )
1600 
1601   ROM_REGION( 0x1000, "charom", 0 )
1602   ROM_LOAD( "906143-02.u5", 0x0000, 0x1000, CRC(1604f6c1) SHA1(0fad19dbcdb12461c99657b2979dbb5c2e47b527) )
1603   
1604   ROM_REGION( 0x100, "pla", 0 )
1605   ROM_LOAD( "906114-01.u17", 0x000, 0x100, NO_DUMP )
1606ROM_END
1607 
1608 
1609//-------------------------------------------------
1610//  ROM( c64p )
1611//-------------------------------------------------
1612 
1613#define rom_c64p rom_c64n
1614 
1615 
1616//-------------------------------------------------
1617//  ROM( c64sw )
1618//-------------------------------------------------
1619 
1620ROM_START( c64sw )
1621   ROM_REGION( 0x2000, "basic", 0 )
1622   ROM_LOAD( "901226-01.u3", 0x0000, 0x2000, CRC(f833d117) SHA1(79015323128650c742a3694c9429aa91f355905e) )
1623 
1624   ROM_REGION( 0x2000, "kernal", 0 )
1625   ROM_LOAD( "kernel.u4",   0x0000, 0x2000, CRC(f10c2c25) SHA1(e4f52d9b36c030eb94524eb49f6f0774c1d02e5e) )
1626 
1627   ROM_REGION( 0x1000, "charom", 0 )
1628   ROM_SYSTEM_BIOS( 0, "default", "Swedish Characters" )
1629   ROMX_LOAD( "charswe.u5", 0x0000, 0x1000, CRC(bee9b3fd) SHA1(446ae58f7110d74d434301491209299f66798d8a), ROM_BIOS(1) )
1630   ROM_SYSTEM_BIOS( 1, "alt", "Swedish Characters (Alt)" )
1631   ROMX_LOAD( "charswe2.u5", 0x0000, 0x1000, CRC(377a382b) SHA1(20df25e0ba1c88f31689c1521397c96968967fac), ROM_BIOS(2) )
1632   
1633   ROM_REGION( 0x100, "pla", 0 )
1634   ROM_LOAD( "906114-01.u17", 0x000, 0x100, NO_DUMP )
1635ROM_END
1636 
1637 
1638//-------------------------------------------------
1639//  ROM( pet64 )
1640//-------------------------------------------------
1641 
1642ROM_START( pet64 )
1643   ROM_REGION( 0x2000, "basic", 0 )
1644   ROM_LOAD( "901226-01.u3", 0x0000, 0x2000, CRC(f833d117) SHA1(79015323128650c742a3694c9429aa91f355905e) )
1645 
1646   ROM_REGION( 0x2000, "kernal", 0 )
1647   ROM_LOAD( "901246-01.u4", 0x0000, 0x2000, CRC(789c8cc5) SHA1(6c4fa9465f6091b174df27dfe679499df447503c) )
1648 
1649   ROM_REGION( 0x1000, "charom", 0 )
1650   ROM_LOAD( "901225-01.u5", 0x0000, 0x1000, CRC(ec4272ee) SHA1(adc7c31e18c7c7413d54802ef2f4193da14711aa) )
1651   
1652   ROM_REGION( 0x100, "pla", 0 )
1653   ROM_LOAD( "906114-01.u17", 0x000, 0x100, NO_DUMP )
1654ROM_END
1655 
1656 
1657//-------------------------------------------------
1658//  ROM( edu64 )
1659//-------------------------------------------------
1660 
1661#define rom_edu64   rom_c64n
1662 
1663 
1664//-------------------------------------------------
1665//  ROM( sx64n )
1666//-------------------------------------------------
1667 
1668ROM_START( sx64n )
1669   ROM_REGION( 0x2000, "basic", 0 )
1670   ROM_LOAD( "901226-01.ud4", 0x0000, 0x2000, CRC(f833d117) SHA1(79015323128650c742a3694c9429aa91f355905e) )
1671 
1672   ROM_REGION( 0x2000, "kernal", 0 )
1673   ROM_SYSTEM_BIOS(0, "cbm", "Original" )
1674   ROMX_LOAD( "251104-04.ud3", 0x0000, 0x2000, CRC(2c5965d4) SHA1(aa136e91ecf3c5ac64f696b3dbcbfc5ba0871c98), ROM_BIOS(1) )
1675   ROM_SYSTEM_BIOS(1, "jiffydos", "JiffyDOS v6.01" )
1676   ROMX_LOAD( "jiffydos sx64.ud3", 0x0000, 0x2000, CRC(2b5a88f5) SHA1(942c2150123dc30f40b3df6086132ef0a3c43948), ROM_BIOS(2) )
1677   ROM_SYSTEM_BIOS(2, "1541flash", "1541 FLASH!" )
1678   ROMX_LOAD( "1541 flash.ud3", 0x0000, 0x2000, CRC(0a1c9b85) SHA1(0bfcaab0ae453b663a6e01cd59a9764805419e00), ROM_BIOS(3) )
1679 
1680   ROM_REGION( 0x1000, "charom", 0 )
1681   ROM_LOAD( "901225-01.ud1", 0x0000, 0x1000, CRC(ec4272ee) SHA1(adc7c31e18c7c7413d54802ef2f4193da14711aa) )
1682 
1683   ROM_REGION( 0x100, "pla", 0 )
1684   ROM_LOAD( "906114-01.ue4", 0x000, 0x100, NO_DUMP )
1685ROM_END
1686 
1687 
1688//-------------------------------------------------
1689//  ROM( rom_sx64p )
1690//-------------------------------------------------
1691 
1692#define rom_sx64p   rom_sx64n
1693 
1694 
1695//-------------------------------------------------
1696//  ROM( vip64 )
1697//-------------------------------------------------
1698 
1699ROM_START( vip64 )
1700   ROM_REGION( 0x2000, "basic", 0 )
1701   ROM_LOAD( "901226-01.ud4", 0x0000, 0x2000, CRC(f833d117) SHA1(79015323128650c742a3694c9429aa91f355905e) )
1702 
1703   ROM_REGION( 0x2000, "kernal", 0 )
1704   ROM_LOAD( "kernelsx.ud3", 0x0000, 0x2000, CRC(7858d3d7) SHA1(097cda60469492a8916c2677b7cce4e12a944bc0) )
1705   
1706   ROM_REGION( 0x1000, "charom", 0 )
1707   ROM_LOAD( "charswe.ud1", 0x0000, 0x1000, CRC(bee9b3fd) SHA1(446ae58f7110d74d434301491209299f66798d8a) )
1708 
1709   ROM_REGION( 0x100, "pla", 0 )
1710   ROM_LOAD( "906114-01.ue4", 0x000, 0x100, NO_DUMP )
1711ROM_END
1712 
1713 
1714//-------------------------------------------------
1715//  ROM( dx64 )
1716//-------------------------------------------------
1717 
1718// ROM_LOAD( "dx64kern.bin", 0x0000, 0x2000, CRC(58065128) ) TODO where is this illusive ROM?
1719#define rom_dx64    rom_sx64n
1720 
1721 
1722//-------------------------------------------------
1723//  ROM( c64cn )
1724//-------------------------------------------------
1725 
1726ROM_START( c64cn )
1727   ROM_REGION( 0x4000, M6510_TAG, 0 )
1728   ROM_LOAD( "251913-01.u4", 0x0000, 0x4000, CRC(0010ec31) SHA1(765372a0e16cbb0adf23a07b80f6b682b39fbf88) )
1729 
1730   ROM_REGION( 0x1000, "charom", 0 )
1731   ROM_LOAD( "901225-01.u5", 0x0000, 0x1000, CRC(ec4272ee) SHA1(adc7c31e18c7c7413d54802ef2f4193da14711aa) )
1732 
1733   ROM_REGION( 0x100, "pla", 0 )
1734   ROM_LOAD( "252715-01.u8", 0x000, 0x100, NO_DUMP )
1735ROM_END
1736 
1737 
1738//-------------------------------------------------
1739//  ROM( c64cp )
1740//-------------------------------------------------
1741 
1742#define rom_c64cp      rom_c64cn
1743 
1744 
1745//-------------------------------------------------
1746//  ROM( c64g )
1747//-------------------------------------------------
1748 
1749#define rom_c64g      rom_c64cn
1750 
1751 
1752//-------------------------------------------------
1753//  ROM( c64csw )
1754//-------------------------------------------------
1755 
1756ROM_START( c64csw )
1757   ROM_REGION( 0x4000, M6510_TAG, 0 )
1758   ROM_LOAD( "325182-01.u4", 0x0000, 0x4000, CRC(2aff27d3) SHA1(267654823c4fdf2167050f41faa118218d2569ce) ) // 128/64 FI
1759 
1760   ROM_REGION( 0x1000, "charom", 0 )
1761   ROM_LOAD( "cbm 64 skand.gen.u5", 0x0000, 0x1000, CRC(377a382b) SHA1(20df25e0ba1c88f31689c1521397c96968967fac) )
1762 
1763   ROM_REGION( 0x100, "pla", 0 )
1764   ROM_LOAD( "252715-01.u8", 0x000, 0x100, NO_DUMP )
1765ROM_END
1766 
1767 
1768//-------------------------------------------------
1769//  ROM( c64gs )
1770//-------------------------------------------------
1771 
1772ROM_START( c64gs )
1773   ROM_REGION( 0x4000, M6510_TAG, 0 )
1774   ROM_LOAD( "390852-01.u4", 0x0000, 0x4000, CRC(b0a9c2da) SHA1(21940ef5f1bfe67d7537164f7ca130a1095b067a) )
1775 
1776   ROM_REGION( 0x1000, "charom", 0 )
1777   ROM_LOAD( "901225-01.u5", 0x0000, 0x1000, CRC(ec4272ee) SHA1(adc7c31e18c7c7413d54802ef2f4193da14711aa) )
1778 
1779   ROM_REGION( 0x100, "pla", 0 )
1780   ROM_LOAD( "252715-01.u8", 0x000, 0x100, NO_DUMP )
1781ROM_END
1782 
1783 
1784 
1785//**************************************************************************
1786//  SYSTEM DRIVERS
1787//**************************************************************************
1788 
1789//    YEAR  NAME    PARENT  COMPAT  MACHINE    INPUT      INIT    COMPANY                        FULLNAME                               FLAGS
1790COMP( 1982,   c64n,   0,     0,      ntsc,      c64,      0,      "Commodore Business Machines", "Commodore 64 (NTSC)",                    0 )
1791COMP( 1982,   c64j,   c64n,     0,      ntsc,      c64,      0,      "Commodore Business Machines", "Commodore 64 (Japan)",                   0 )
1792COMP( 1982,   c64p,   c64n,     0,      pal,      c64,      0,      "Commodore Business Machines", "Commodore 64 (PAL)",                    0 )
1793COMP( 1982,   c64sw,   c64n,   0,      pal,      c64sw,      0,      "Commodore Business Machines", "Commodore 64 / VIC-64S (Sweden/Finland)",    0 )
1794COMP( 1983, pet64,   c64n,     0,       pet64,      c64,        0,        "Commodore Business Machines", "PET 64 / CBM 4064 (NTSC)",                0 )
1795COMP( 1983, edu64,  c64n,     0,       pet64,      c64,        0,        "Commodore Business Machines", "Educator 64 (NTSC)",                   0 )
1796COMP( 1984, sx64n,   c64n,   0,      ntsc_sx,   c64,      0,      "Commodore Business Machines", "SX-64 / Executive 64 (NTSC)",             0 )
1797COMP( 1984, sx64p,   c64n,   0,      pal_sx,      c64,      0,      "Commodore Business Machines", "SX-64 / Executive 64 (PAL)",             0 )
1798COMP( 1984, vip64,   c64n,   0,      pal_sx,      c64sw,      0,      "Commodore Business Machines", "VIP-64 (Sweden/Finland)",               0 )
1799COMP( 1984, dx64,   c64n,   0,      ntsc_dx,   c64,      0,      "Commodore Business Machines", "DX-64 (NTSC)",                         0 )
1800//COMP(1983, clipper,  c64,  0, c64pal,  clipper, c64pal,  "PDC", "Clipper", GAME_NOT_WORKING) // C64 in a briefcase with 3" floppy, electroluminescent flat screen, thermal printer
1801//COMP(1983, tesa6240, c64,  0, c64pal,  c64,     c64pal,  "Tesa", "6240", GAME_NOT_WORKING) // modified SX64 with label printer
1802COMP( 1986, c64cn,   c64n,   0,       ntsc_c,      c64,      0,      "Commodore Business Machines", "Commodore 64C (NTSC)",                   0 )
1803COMP( 1986, c64cp,   c64n,   0,       pal_c,      c64,      0,      "Commodore Business Machines", "Commodore 64C (PAL)",                   0 )
1804COMP( 1986, c64csw,   c64n,   0,       pal_c,      c64sw,      0,      "Commodore Business Machines", "Commodore 64C (Sweden/Finland)",          0 )
1805COMP( 1986, c64g,   c64n,   0,      pal_c,      c64,      0,      "Commodore Business Machines", "Commodore 64G (PAL)",                   0 )
1806CONS( 1990, c64gs,   c64n,   0,      pal_gs,      c64gs,      0,      "Commodore Business Machines", "Commodore 64 Games System (PAL)",          0 )
src/mess/drivers/c65.c
r14341r14342
5858#include "video/vic4567.h"
5959#include "includes/cbm.h"
6060#include "formats/cbm_snqk.h"
61#include "includes/c64.h"
61#include "includes/c64_legacy.h"
6262#include "includes/c65.h"
6363#include "machine/cbmiec.h"
6464#include "machine/ram.h"
src/mess/drivers/c128.c
r14341r14342
188188#include "machine/cbmiec.h"
189189
190190#include "includes/c128.h"
191#include "includes/c64.h"
191#include "includes/c64_legacy.h"
192192
193193
194194/*************************************
src/mess/drivers/c64.c
r14341r14342
1/***************************************************************************
2    commodore c64 home computer
1/*
32
4    PeT mess@utanet.at
3   TODO:
4   
5   - PLA dump (http://www.zimmers.net/cbmpics/cbm/c64/pla.txt)
6   - cartridge loading
57
6    documentation
7     www.funet.fi
8***************************************************************************/
8*/
99
10/*
10#include "includes/c64.h"
1111
122008 - Driver Updates
13---------------------
1412
15(most of the informations are taken from http://www.zimmers.net/cbmpics/ )
1613
14//**************************************************************************
15//  MACROS / CONSTANTS
16//**************************************************************************
1717
18[CBM systems which belong to this driver]
18#define A15 BIT(offset, 15)
19#define A14 BIT(offset, 14)
20#define A13 BIT(offset, 13)
21#define A12 BIT(offset, 12)
22#define VA13 BIT(va, 13)
23#define VA12 BIT(va, 12)
1924
20* Commodore Max Machine (1982, Japan)
2125
22  The Max Machine was produced by Commodore Japan and was released along
23with the C64 in Japan. Also known as "UltiMax" (in North America ads)
24or "VC-10 / VIC-10" (in some European advertising), it was designed to be a
25game console. It has no internal kernel and no BASIC, everything must be
26supplied by the cart. A Mini BASIC and a BASIC carts were produced (the
27latter with support for LOAD/SAVE commands as well). The character rom
28is not present either and its content was, again, in the cart. Max Machine
29carts can be run by both C64 and C128.
3026
31CPU: MOS Technology 6510 (1 MHz)
32RAM: 4 kilobytes (2 kilobytes?)
33ROM: none
34Video: MOS 6566 "VIC-II" (320 x 200 Hi-Resolution, 40 columns text, 16
35    colors)
36Sound: MOS 6581 "SID" (3 voice stereo synthesizer/digital sound
37    capabilities)
38Ports: 6526 CIA (Power switch; 2 Commodore "Joystick" ports; 'EXPANSION'
39    port; "TV" port; CBM Datasette port)
40Keyboard: Full-sized QWERTY "Contact-Pad"
27//**************************************************************************
28//  INTERRUPTS
29//**************************************************************************
4130
31//-------------------------------------------------
32//  check_interrupts -
33//-------------------------------------------------
4234
43* Commodore 64 (1982)
35void c64_state::check_interrupts()
36{
37   int restore = BIT(input_port_read(machine(), "SPECIAL"), 7);
38   
39   m_maincpu->set_input_line(INPUT_LINE_IRQ0, m_cia1_irq | m_vic_irq | m_exp_irq);
40   m_maincpu->set_input_line(INPUT_LINE_NMI, m_cia2_irq | restore | m_exp_nmi);
41   
42   mos6526_flag_w(m_cia1, m_cass_rd & m_iec_srq);
43}
4444
45  Released in August 1982 in the US and marketed as a lower end home
46computer, the C64 dominated the home computer market for a few years,
47outselling competitors like Apple computers, IBM PCs and TRS-80s.
48During the early stages of the project it was called VIC-40, but the
49named was changed in the end probably to fit the name scheme used at
50time for business product (letter + memory size: P128 & B256).
51It was also advertised as VC 64 in Germany, and as VIC 64S in Sweden
52(the latter came with a modified character set)
5345
54CPU: CSG 6510 (1 MHz)
55RAM: 64 kilobytes
56ROM: 20 kilobytes
57Video: MOS 6569 "VIC-II" (320 x 200 Hi-Resolution, 40 columns text, 16
58    colors)
59Sound: MOS 6581 "SID" (3 voice stereo synthesizer/digital sound
60    capabilities)
61Ports: MOS 6526 CIA x2 (Power switch; 2 Commodore Joystick/Mouse ports;
62    CBM Serial port; CBM Datasette port; parallel programmable "User"
63    port; CBM Monitor port; C64 expansion port)
64Keyboard: Full-sized 62 key QWERTY (8 programmable function keys; 2
65    cursor keys, 2 directions each)
6646
67BIOS:
68    kernal.901227-02.bin
69    basic.901226-01.bin
70    characters.901225-01.bin
47//**************************************************************************
48//  MEMORY MANAGEMENT UNIT
49//**************************************************************************
7150
51//-------------------------------------------------
52//  bankswitch -
53//-------------------------------------------------
7254
73* Commodore 64 (1982, Japan)
55void c64_state::bankswitch(offs_t offset, offs_t va, int rw, int aec, int ba, int cas, int *casram, int *basic, int *kernal, int *charom, int *grw, int *io, int *roml, int *romh)
56{
57   int game = m_exp->game_r();
58   int exrom = m_exp->exrom_r();
7459
75  Released in Japan at the same time as Max Machine, in the hope to repeat
76the success of the VIC-1001, this system was a flop. Technically it is the
77same as the C64, but it has native support for the Katakana character set.
60   *romh = (m_hiram & A15 & !A14 & A13 & !aec & rw & !exrom & !game
61         || A15 & A14 & A13 & !aec & exrom & !game
62         || aec & exrom & !game & VA13 & VA12);
7863
79Video: MOS 6569 "VIC-II" (320 x 200 Hi-Resolution, 40 columns text, 16
80    colors)
81Keyboard: Full-sized 62 key QWERTY (8 programmable function keys; 2
82    cursor keys, 2 directions each; Katakana characters accessible through
83    C= key)
64   *roml = (m_loram & m_hiram & A15 & !A14 & !A13 & !aec & rw & !exrom
65         || A15 & !A14 & !A13 & !aec & exrom & !game);
8466
85BIOS
86    kernal.906145-02.bin
87    basic.901226-01.bin
88    characters.906143-02.bin
67   *io = (m_hiram & m_charen & A15 & A14 & !A13 & A12 & ba & !aec & rw & game
68         || m_hiram & m_charen & A15 & A14 & !A13 & A12 & !aec & !rw & game
69         || m_loram & m_charen & A15 & A14 & !A13 & A12 & ba & !aec & rw & game
70         || m_loram & m_charen & A15 & A14 & !A13 & A12 & !aec & !rw & game
71         || m_hiram & m_charen & A15 & A14 & !A13 & A12 & ba & !aec & rw & !exrom & !game
72         || m_hiram & m_charen & A15 & A14 & !A13 & A12 & !aec & !rw & !exrom & !game
73         || m_loram & m_charen & A15 & A14 & !A13 & A12 & ba & !aec & rw & !exrom & !game
74         || m_loram & m_charen & A15 & A14 & !A13 & A12 & !aec & !rw & !exrom & !game
75         || A15 & A14 & !A13 & A12 & ba & !aec & rw & exrom & !game
76         || A15 & A14 & !A13 & A12 & !aec & !rw & exrom & !game);
8977
78   *grw = (!cas & A15 & A14 & !A13 & A12 &   !aec & !rw);
79   
80   *charom = (m_hiram & !m_charen & A15 & A14 & !A13 & A12 & !aec & rw & game
81         || m_loram & !m_charen & A15 & A14 & !A13 & A12 & !aec & rw & game
82         || m_hiram & !m_charen & A15 & A14 & !A13 & A12 & !aec & rw & !exrom & !game
83         || m_va14 & aec & game & !VA13 & VA12
84         || m_va14 & aec & !exrom & !game & !VA13 & VA12);               
9085
91* PET 64 (1983)
86   *kernal = (m_hiram & A15 & A14 & A13 & !aec & rw & game
87         || m_hiram & A15 & A14 & A13 & !aec & rw & !exrom & !game);
88           
89   *basic = (m_loram & m_hiram & A15 & !A14 & A13 & !aec & rw & game);
9290
93  Also known as CBM 4064, it was a C64 fitted in a PET case and with a PET
94monochrome screen. Exactly like the C64, it features a VIC-II video chip,
95a SID sound chip, 2 x CIA 6526, 64K of memory and BASIC 2.0. Being forced
96to display on a monochrome screen, color codes were removed from the front
97of number keys. The kernel itself was modified to output only white
98characters on a black background. A plate with BASIC commands and other hints
99was put above the keyboard.
91   *casram = !(m_loram & m_hiram & A15 & !A14 & A13 & !aec & rw & game
92         || m_hiram & A15 & A14 & A13 & !aec & rw & game
93         || m_hiram & A15 & A14 & A13 & !aec & rw & !exrom & !game
94         || m_hiram & !m_charen & A15 & A14 & !A13 & A12 & !aec & rw & game
95         || m_loram & !m_charen & A15 & A14 & !A13 & A12 & !aec & rw & game
96         || m_hiram & !m_charen & A15 & A14 & !A13 & A12 & !aec & rw & !exrom & !game
97         || m_va14 & aec & game & !VA13 & VA12
98         || m_va14 & aec & !exrom & !game & !VA13 & VA12
99         || m_hiram & m_charen & A15 & A14 & !A13 & A12 & ba & !aec & rw & game
100         || m_hiram & m_charen & A15 & A14 & !A13 & A12 & !aec & !rw & game
101         || m_loram & m_charen & A15 & A14 & !A13 & A12 & ba & !aec & rw & game
102         || m_loram & m_charen & A15 & A14 & !A13 & A12 & !aec & !rw & game
103         || m_hiram & m_charen & A15 & A14 & !A13 & A12 & ba & !aec & rw & !exrom & !game
104         || m_hiram & m_charen & A15 & A14 & !A13 & A12 & !aec & !rw & !exrom & !game
105         || m_loram & m_charen & A15 & A14 & !A13 & A12 & ba & !aec & rw & !exrom & !game
106         || m_loram & m_charen & A15 & A14 & !A13 & A12 & !aec & !rw & !exrom & !game
107         || A15 & A14 & !A13 & A12 & ba & !aec & rw & exrom & !game
108         || A15 & A14 & !A13 & A12 & !aec & !rw & exrom & !game
109         || m_loram & m_hiram & A15 & !A14 & !A13 & !aec & rw & !exrom
110         || A15 & !A14 & !A13 & !aec & exrom & !game
111         || m_hiram & A15 & !A14 & A13 & !aec & rw & !exrom & !game
112         || A15 & A14 & A13 & !aec & exrom & !game
113         || aec & exrom & !game & VA13 & VA12
114         || !A15 & !A14 & A12 & exrom & !game
115         || !A15 & !A14 & A13 & exrom & !game
116         || !A15 & A14 & exrom & !game
117         || A15 & !A14 & A13 & exrom & !game
118         || A15 & A14 & !A13 & !A12 & exrom & !game
119         || cas);
120}
100121
101Video: MOS 6569 "VIC-II" (320 x 200 Hi-Resolution, 40 columns text, 16
102    colors, monochrome 14" monitor support)
103Sound: MOS 6581 "SID" (3 voice stereo synthesizer/digital sound
104    capabilities; Internal speaker)
105Keyboard: Full-sized 62 key QWERTY (8 programmable function keys; 2
106    cursor keys, 2 directions each; complete BASIC reference on keyboard
107    panel )
108122
109BIOS
110    kernal.4064.901246-01.bin
111    basic.901226-01.bin
112    characters.901225-01.bin
123//-------------------------------------------------
124//  read_memory -
125//-------------------------------------------------
113126
127UINT8 c64_state::read_memory(address_space &space, offs_t offset, int casram, int basic, int kernal, int charom, int io, int roml, int romh)
128{
129   UINT8 data = 0;
130   
131   if (casram)
132   {
133      data = m_ram->pointer()[offset];
134   }
135   else if (basic)
136   {
137      data = m_basic[offset & 0x1fff];
138   }
139   else if (kernal)
140   {
141      data = m_kernal[offset & 0x1fff];
142   }
143   else if (charom)
144   {
145      data = m_charom[offset & 0xfff];
146   }
147   else if (io)
148   {
149      switch ((offset >> 10) & 0x03)
150      {
151      case 0: // VIC
152         data = vic2_port_r(m_vic, offset & 0x3f);
153         break;
114154
115* Educator 64 (1983)
155      case 1: // SID
156         data = sid6581_r(m_sid, offset & 0x1f);
157         break;
116158
117 Basically the same as the PET 64, but it uses a standard C64 kernel,
118allowing  to 'explore' all shades of green the monitor was capable of. Also
119the BASIC plate is slightly different. There could have been an earlier
120version, already called Educator 64, which came with no monitor and in a
121C64 case.
159      case 2: // COLOR
160         data = m_color_ram[offset & 0x3ff];
161         break;
122162
123Keyboard: Full-sized 62 key QWERTY (8 programmable function keys; 2
124    cursor keys, 2 directions each; complete BASIC reference on keyboard
125    panel )
163      case 3: // CIAS
164         switch ((offset >> 8) & 0x03)
165         {
166         case 0: // CIA1
167            if (offset & 1)
168               cia_set_port_mask_value(m_cia1, 1, input_port_read(machine(), "CTRLSEL") & 0x80 ? c64_keyline[9] : c64_keyline[8] );
169            else
170               cia_set_port_mask_value(m_cia1, 0, input_port_read(machine(), "CTRLSEL") & 0x80 ? c64_keyline[8] : c64_keyline[9] );
171               
172            data = mos6526_r(m_cia1, offset & 0x0f);
173            break;
174           
175         case 1: // CIA2
176            data = mos6526_r(m_cia2, offset & 0x0f);
177            break;
178           
179         case 2: // I/O1
180            data = m_exp->io1_r(space, offset);
181            break;
182           
183         case 3: // I/O2
184            data = m_exp->io2_r(space, offset);
185            break;
186         }
187         break;
188      }
189   }
190   else if (roml)
191   {
192      data = m_exp->roml_r(space, offset);
193   }
194   else if (romh)
195   {
196      data = m_exp->romh_r(space, offset);
197   }
198   
199   return data;
200}
126201
127BIOS
128    kernal.901227-02.bin
129    basic.901226-01.bin
130    characters.901225-01.bin
131202
203//-------------------------------------------------
204//  read -
205//-------------------------------------------------
132206
133* SX-64 Executive Computer (1984)
207READ8_MEMBER( c64_state::read )
208{
209   int casram, basic, kernal, charom, grw, io, roml, romh;
210   
211   bankswitch(offset, 0, 1, 0, 1, 0, &casram, &basic, &kernal, &charom, &grw, &io, &roml, &romh);
212   
213   return read_memory(space, offset, casram, basic, kernal, charom, io, roml, romh);
214}
134215
135  Portable color computer based on the C64 hardware. The unit is heavy, with
136its metal case, features a built-in disk driver (mostly 1541 compatible) and
137has a large handle to carry the computer around. The detachable keyboard can
138be used as protective front plate. The SX-64 had a 4" full color screen and a
139built-in speaker. The only differences between the C64 and the SX-64 are in
140the start up colors and in the SX-64 better support for the internal floppy
141drive. The tape drive support was removed in the portable system.
142216
143CPU: MOS 6510 (1 MHz)
144RAM: 64 kilobytes (68 with the 1541)
145ROM: 20 kilobytes (36 with the 1541)
146Video: MOS 6569 "VIC-II" (320 x 200 Hi-Resolution, 40 columns text, 16
147    colors, 4" Full-color screen)
148Sound: MOS 6581 "SID" (3 voice stereo synthesizer/digital sound
149    capabilities; Internal MONO speaker)
150Ports: MOS 6526 CIA x2 (Power switch; 2 Commodore Joystick/Mouse ports;
151    CBM Serial port; CBM Datasette port; parallel programmable "User"
152    port; CBM Monitor port; C64 expansion port)
153Keyboard: Full-sized 62 key QWERTY (8 programmable function keys; 2
154    cursor keys, 2 directions each; detachable)
155Additional hardware: Commodore 1541 Disk Drive (5.25" 170K SS SD Floppy)
217//-------------------------------------------------
218//  write -
219//-------------------------------------------------
156220
157BIOS:
158    kernal.sx.251104-04.bin
159    basic.901226-01.bin
160    characters.901225-01.bin
221WRITE8_MEMBER( c64_state::write )
222{
223   int casram, basic, kernal, charom, grw, io, roml, romh;
224   
225   bankswitch(offset, 0, 0, 0, 1, 0, &casram, &basic, &kernal, &charom, &grw, &io, &roml, &romh);
161226
227   if (casram)
228   {
229      m_ram->pointer()[offset] = data;
230   }
231   else if (io)
232   {
233      switch ((offset >> 10) & 0x03)
234      {
235      case 0: // VIC
236         vic2_port_w(m_vic, offset & 0x3f, data);
237         break;
162238
163* DX-64 (198?)
239      case 1: // SID
240         sid6581_w(m_sid, offset & 0x1f, data);
241         break;
164242
165  Rumored version of a SX-64 variant featuring two floppy drives. Not sure
166if it ever reached the prototype stage.
243      case 2: // COLOR
244         if (grw) m_color_ram[offset & 0x3ff] = 0xf0 | data;
245         break;
167246
247      case 3: // CIAS
248         switch ((offset >> 8) & 0x03)
249         {
250         case 0: // CIA1
251            mos6526_w(m_cia1, offset & 0x0f, data);
252            break;
253           
254         case 1: // CIA2
255            mos6526_w(m_cia2, offset & 0x0f, data);
256            break;
257           
258         case 2: // I/O1
259            m_exp->io1_w(space, offset, data);
260            break;
261           
262         case 3: // I/O2
263            m_exp->io2_w(space, offset, data);
264            break;
265         }
266         break;
267      }
268   }
269}
168270
169* Commodore 64C (1986)
170271
171  Redesigned version of the C64, released with slightly upgraded versions
172of chips and peripherals. It came often bundled with GEOS, GUI based OS
173by Berkeley Softworks (it was stored on floppy disks). It's also known as
174C64-II but the name doesn't seems to have ever been official (only used
175by magazines at early stage of ad & review). Another redesign, in a slightly
176larger case (closer to the original C64) is known as Commodore 64G, because
177mainly sold in Germany. Other repackaged versions followed, built around the
178same kernel and chips.
179272
180CPU: CSG 8500 (1 MHz; 6510 compatible)
181RAM: 64 kilobytes
182ROM: 20 kilobytes
183Video: MOS 8565 "VIC-II" (320 x 200 Hi-Resolution, 40 columns text, 16
184    colors)
185Sound: CSG 8580 "SID" (3 voice stereo synthesizer/digital sound
186    capabilities)
187Ports: MOS 6526 CIA x2 (Power switch; 2 Commodore Joystick/Mouse ports;
188    CBM Serial port; CBM Datasette port; parallel programmable "User"
189    port; CBM Monitor port; C64 expansion port)
190Keyboard: Full-sized 62 key QWERTY (8 programmable function keys; 2
191    cursor keys, 2 directions each)
273//**************************************************************************
274//  ADDRESS MAPS
275//**************************************************************************
192276
193BIOS:
194    64c.251913-01.bin
195    characters.901225-01.bin
277//-------------------------------------------------
278//  ADDRESS_MAP( c64_mem )
279//-------------------------------------------------
196280
281static ADDRESS_MAP_START( c64_mem, AS_PROGRAM, 8, c64_state )
282   AM_RANGE(0x0000, 0xffff) AM_READWRITE(read, write)
283ADDRESS_MAP_END
197284
198* Commodore 64 Games System (1990)
199285
200  Repackaged C64 with neither keyboard, nor ports. Basically, the
201system came far too late to enter the console market of the 90s.
202286
203CPU: CSG 6510 (1 MHz)
204RAM: 64 kilobytes
205ROM: 16 kilobytes
206Video: MOS 8565 "VIC-II" (320 x 200 Hi-Resolution, 40 columns text, 16
207    colors)
208Sound: CSG 8580 "SID" (3 voice stereo synthesizer/digital sound
209    capabilities)
210Ports: MOS 6526 CIA (Power switch; 2 Commodore Joystick/Mouse ports;
211    CBM Monitor port; C64 expansion port)
287//**************************************************************************
288//  INPUT PORTS
289//**************************************************************************
212290
213BIOS:
214    64gs.390852-01.bin
215    characters.901225-01.bin
291//-------------------------------------------------
292//  INPUT_PORTS( c64 )
293//-------------------------------------------------
216294
217* Commodore 64 "Gold" (1984, US - 1986, Germany)
295static INPUT_PORTS_START( c64 )
296   PORT_INCLUDE( common_cbm_keyboard )      // ROW0 -> ROW7
218297
219  Commemorative version released to celebrate the one millionth Commodore 64
220sold in the country. The whole case is golden colored. It is also reasonable
221to assume that the US version is based on the original C64, while the German
222version is based on the C64C.
298   PORT_INCLUDE( c64_special )            // SPECIAL
223299
300   PORT_INCLUDE( c64_controls )         // CTRLSEL, JOY0, JOY1, PADDLE0 -> PADDLE3, TRACKX, TRACKY, LIGHTX, LIGHTY, OTHER
301INPUT_PORTS_END
224302
225[Rumored / Unconfirmed]
226303
227VC-10 - Ultimax with built-in (even if stripped down) BASIC 2.0
228SX-100 - Rumored SX-64 prototype with built-in b&w screen
229C64CGS - C64GS in a C64C-like case, sold in Ireland (?), with a keyboard (?)
304//-------------------------------------------------
305//  INPUT_PORTS( c64sw )
306//-------------------------------------------------
230307
308static INPUT_PORTS_START( c64sw )
309   PORT_INCLUDE( c64 )
231310
232[Known Fake / Unofficial BIOS]
311   PORT_MODIFY( "ROW5" )
312   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("\xc3\xa5") PORT_CODE(KEYCODE_OPENBRACE)   PORT_CHAR('\xA5')
313   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON)                        PORT_CHAR(';') PORT_CHAR(']')
314   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS)                     PORT_CHAR('=')
315   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS)                        PORT_CHAR('-')
233316
234Max Machine - These are BASIC V2.0 and kernel contained in the MAX BASIC
235cart, not a real Max BIOS.
236    basic.901230-01.bin
237    kernal.901231-01.bin
317   PORT_MODIFY( "ROW6" )
318   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("\xc3\xa4") PORT_CODE(KEYCODE_BACKSLASH)   PORT_CHAR('\xA4')
319   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("\xc3\xb6") PORT_CODE(KEYCODE_QUOTE)      PORT_CHAR('\xB6')
320   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE)                  PORT_CHAR('@')
321   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH2)                  PORT_CHAR(':') PORT_CHAR('*')
322INPUT_PORTS_END
238323
239Character roms
240    c64-german.bin - amateur hack
241    c64-hungarian.bin - amateur hack
242    kauno.bin - calligraphic font for the C64, data saved from a 1985 tape
243324
244[Peripherals]
325//-------------------------------------------------
326//  INPUT_PORTS( c64gs )
327//-------------------------------------------------
245328
246- CBM 1530 Datasette Recorder
247- VIC 1541 / 1541-II / 1571 / 1581 disk drive (up to 5 at a time)
248- Commodore Modem Cartridge 1650 / 1660 / 1670
249- IEEE Interface Expansion Card
250- Commodore CBM 8050 / 4040 Dual Floppy Disk Drives (through IEEE Interface)
251- Commodore 6400 Letter Quality Printer (through IEEE Interface)
252- Commodore 8023 Dot Matrix Printer (through IEEE Interface)
253- Commodore 1520 Printer / Plotter
254- Commodore 1701 / 1702 Monitor
329static INPUT_PORTS_START( c64gs )
330   PORT_INCLUDE( c64 )
255331
256- Lt. Kernal Hard Drive
257- CMD HD-Series
332   // 2008 FP: This has to be cleaned up later
333   // C64gs should simply not scan these inputs
334   // as a temporary solution, we keep PeT IPT_UNUSED shortcut
258335
259- Commodore Joysticks
260- Commodore Paddles
261- Commodore 1350 / 1351 Mouse
262- CMD SmartMouse
263- Inkwell Light Pen
264- Koala Pad
265- Commodore Music Maker overlay
266- External music keyboard (to be plugged into the Sound Expander)
336   PORT_MODIFY( "ROW0" ) // no keyboard
337   PORT_BIT (0xff, 0x00, IPT_UNUSED )
338   PORT_MODIFY( "ROW1" ) // no keyboard
339   PORT_BIT (0xff, 0x00, IPT_UNUSED )
340   PORT_MODIFY( "ROW2" ) // no keyboard
341   PORT_BIT (0xff, 0x00, IPT_UNUSED )
342   PORT_MODIFY( "ROW3" ) // no keyboard
343   PORT_BIT (0xff, 0x00, IPT_UNUSED )
344   PORT_MODIFY( "ROW4" ) // no keyboard
345   PORT_BIT (0xff, 0x00, IPT_UNUSED )
346   PORT_MODIFY( "ROW5" ) // no keyboard
347   PORT_BIT (0xff, 0x00, IPT_UNUSED )
348   PORT_MODIFY( "ROW6" ) // no keyboard
349   PORT_BIT (0xff, 0x00, IPT_UNUSED )
350   PORT_MODIFY( "ROW7" ) // no keyboard
351   PORT_BIT (0xff, 0x00, IPT_UNUSED )
352   PORT_MODIFY( "SPECIAL" ) // no keyboard
353   PORT_BIT (0xff, 0x00, IPT_UNUSED )
354INPUT_PORTS_END
267355
268- Commodore REU: REU stands for RAM Expansion Unit for C64 & C128. Three
269models 1700 (128 KB) and 1750 (512 KB), and later the 1764 (256 KB, for the
270C64)
271- Commodore Sound Expander Cart
272- Commodore Sound Sampler Cart
273- Berkeley Softworks GeoRAM
274- Schnedler Systems Turbo Master CPU
275- Creative Micro Designs (CMD) RAMDrive, RAMLink and Super CPU Accelerator
276- CMD SID symphony cartridge
277- Commodore Universal Btx Decoder: Same design of the REU, it's a decoder
278for the Bildschirmtext, a sort of videotext online service similar to the
279French Minitel. It allowed the C64 + Decoder to replace the very expensive
280standalone decoder.
281356
282Freezer Carts: Datel "Action Replay", Freeze Frame MK III B, Trilogic
283"Expert", "The Final Cartridge III", "Retro Replay"
284Kernal Replacement: SpeedDOS, DolphinDOS, JiffyDOS etc.
285357
286[TO DO]
358//**************************************************************************
359//  DEVICE CONFIGURATION
360//**************************************************************************
287361
288* Floppy drives:
362//-------------------------------------------------
363//  vic2_interface vic_intf
364//-------------------------------------------------
289365
290- Drives 8 & 9 supported, but limited compatibility. Real 1541 emulation is
291needed.
366static const unsigned char c64_palette[] =
367{
368// black, white, red, cyan
369// purple, green, blue, yellow
370// orange, brown, light red, dark gray,
371// medium gray, light green, light blue, light gray
372// taken from the vice emulator
373   0x00, 0x00, 0x00,  0xfd, 0xfe, 0xfc,  0xbe, 0x1a, 0x24,  0x30, 0xe6, 0xc6,
374   0xb4, 0x1a, 0xe2,  0x1f, 0xd2, 0x1e,  0x21, 0x1b, 0xae,  0xdf, 0xf6, 0x0a,
375   0xb8, 0x41, 0x04,  0x6a, 0x33, 0x04,  0xfe, 0x4a, 0x57,  0x42, 0x45, 0x40,
376   0x70, 0x74, 0x6f,  0x59, 0xfe, 0x59,  0x5f, 0x53, 0xfe,  0xa4, 0xa7, 0xa2
377};
292378
293* Cartridges:
379static PALETTE_INIT( c64 )
380{
381   int i;
294382
295- Currently only Type 0 hardware is supported (check cart code in
296machine/c64.c for more notes). Other Types may load but not work.
383   for (i = 0; i < sizeof(c64_palette) / 3; i++)
384   {
385      palette_set_color_rgb(machine, i, c64_palette[i * 3], c64_palette[i * 3 + 1], c64_palette[i * 3 + 2]);
386   }
387}
297388
298* Datasette:
389static PALETTE_INIT( pet64 )
390{
391   int i;
392   for (i = 0; i < 16; i++)
393      palette_set_color_rgb(machine, i, 0, c64_palette[i * 3 + 1], 0);
394}
299395
300- Currently, .t64 images are supported as Quickload device. This only works
301if the file contains a single entry with a start address of $0801. This
302covers most of the existing files, but the format is desinged to be much
303more flexible and it could be implemented as a real tape format.
396UINT32 c64_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
397{
398   vic2_video_update(m_vic, bitmap, cliprect);
304399
305* Other Peripherals:
400   return 0;
401}
306402
307- Lightpen support is unfinished
308- Missing support for (it might or might not be added eventually):
309printers; IEEE488; CPM cartridge, Speech cartridge, FM Sound cartridge
310and other expansion modules; userport; rs232/v.24 interface; Super CPU;
311dual SID configuration
403static INTERRUPT_GEN( c64_frame_interrupt )
404{
405   c64_state *state = device->machine().driver_data<c64_state>();
406   
407   state->check_interrupts();
408   cbm_common_interrupt(device);
409}
312410
313* Informations / BIOS / Supported Sets:
411READ8_MEMBER( c64_state::vic_lightpen_x_cb )
412{
413   return input_port_read(machine(), "LIGHTX") & ~0x01;
414}
314415
315- Find out if C64 was sold both as VIC 64S and C64 in Sweden, and which
316were inner/outer differences. For sure advertising was using the VIC 64S
317name.
318- Was it really sold as VC 64 in Germany, or was it just a nickname used
319at launch to indicate standard C64 units?
320- What's the difference between Educator 64-1 and Educator 64-2? My guess
321is that Edu64-1 was a standard PET64/CBMB4064 with a different name, while
322the Edu64-1 used the full C64 BIOS. Confirmations are needed, anyway.
416READ8_MEMBER( c64_state::vic_lightpen_y_cb )
417{
418   return input_port_read(machine(), "LIGHTY") & ~0x01;
419}
323420
421READ8_MEMBER( c64_state::vic_lightpen_button_cb )
422{
423   return input_port_read(machine(), "OTHER") & 0x04;
424}
324425
426READ8_MEMBER( c64_state::vic_dma_read )
427{
428   int casram, basic, kernal, charom, grw, io, roml, romh;
429   
430   offset = (!m_va15 << 15) | (!m_va14 << 14) | offset;
431   
432   bankswitch(0, offset, 1, 1, 0, 0, &casram, &basic, &kernal, &charom, &grw, &io, &roml, &romh);
433   
434   return read_memory(space, offset, casram, basic, kernal, charom, io, roml, romh);
435}
325436
326C64DTV TODO:
327  - basically everything! it needs proper bankswitch and specific hardware bits!
328 */
437READ8_MEMBER( c64_state::vic_dma_read_color )
438{
439   return m_color_ram[offset & 0x3ff];
440}
329441
330#include "emu.h"
331#include "cpu/m6502/m6502.h"
332#include "sound/sid6581.h"
333#include "sound/dac.h"
334#include "machine/6526cia.h"
442WRITE_LINE_MEMBER( c64_state::vic_irq_w )
443{
444   m_vic_irq = state;
445   
446   check_interrupts();
447}
335448
336#include "machine/cbmipt.h"
337#include "video/vic6567.h"
449READ8_MEMBER( c64_state::vic_rdy_cb )
450{
451   return input_port_read(machine(), "CYCLES") & 0x07;
452}
338453
339/* devices config */
340#include "includes/cbm.h"
341#include "formats/cbm_snqk.h"
342#include "machine/cbmiec.h"
343#include "machine/c64exp.h"
454static const vic2_interface vic_ntsc_intf =
455{
456   SCREEN_TAG,
457   M6510_TAG,
458   VIC6567,
459   DEVCB_DRIVER_MEMBER(c64_state, vic_lightpen_x_cb),
460   DEVCB_DRIVER_MEMBER(c64_state, vic_lightpen_y_cb),
461   DEVCB_DRIVER_MEMBER(c64_state, vic_lightpen_button_cb),
462   DEVCB_DRIVER_MEMBER(c64_state, vic_dma_read),
463   DEVCB_DRIVER_MEMBER(c64_state, vic_dma_read_color),
464   DEVCB_DRIVER_LINE_MEMBER(c64_state, vic_irq_w),
465   DEVCB_DRIVER_MEMBER(c64_state, vic_rdy_cb)
466};
344467
345#include "includes/c64.h"
468static const vic2_interface vic_pal_intf =
469{
470   SCREEN_TAG,
471   M6510_TAG,
472   VIC6569,
473   DEVCB_DRIVER_MEMBER(c64_state, vic_lightpen_x_cb),
474   DEVCB_DRIVER_MEMBER(c64_state, vic_lightpen_y_cb),
475   DEVCB_DRIVER_MEMBER(c64_state, vic_lightpen_button_cb),
476   DEVCB_DRIVER_MEMBER(c64_state, vic_dma_read),
477   DEVCB_DRIVER_MEMBER(c64_state, vic_dma_read_color),
478   DEVCB_DRIVER_LINE_MEMBER(c64_state, vic_irq_w),
479   DEVCB_DRIVER_MEMBER(c64_state, vic_rdy_cb)
480};
346481
347#define VC1540_ROM( cpu )   \
348   ROM_REGION( 0x10000, cpu, 0 )   \
349   ROM_LOAD( "325302-01.ua2", 0xc000, 0x2000, CRC(29ae9752) SHA1(8e0547430135ba462525c224e76356bd3d430f11) )   \
350   ROM_LOAD( "325303-01.ub3", 0xe000, 0x2000, CRC(10b39158) SHA1(56dfe79b26f50af4e83fd9604857756d196516b9) )
351482
352/*
353    rev. 01 - It is believed to be the first revision of the 1541 firmware. The service manual says that this ROM
354        is for North America and Japan only.
355    rev. 02 - Second version of the 1541 firmware. The service manual says that this ROM was not available in North
356        America (Japan only?).
357    rev. 03 - It is said to be the first version that is usable in Europe (in the service manual?).
358    rev. 05 - From an old-style 1541 with short board.
359    rev. 06AA - From an old-style 1541 with short board.
360*/
361#define VC1541_ROM( cpu )   \
362   ROM_REGION( 0x10000, cpu, 0 )   \
363   ROM_SYSTEM_BIOS( 0, "rev1", "VC-1541 rev. 01" )   \
364   ROMX_LOAD( "325302-01.ua2", 0xc000, 0x2000, CRC(29ae9752) SHA1(8e0547430135ba462525c224e76356bd3d430f11), ROM_BIOS(1) )   \
365   ROMX_LOAD( "901229-01.ub3", 0xe000, 0x2000, CRC(9a48d3f0) SHA1(7a1054c6156b51c25410caec0f609efb079d3a77), ROM_BIOS(1) )   \
366   ROM_SYSTEM_BIOS( 1, "rev2", "VC-1541 rev. 02" )   \
367   ROMX_LOAD( "325302-01.ua2", 0xc000, 0x2000, CRC(29ae9752) SHA1(8e0547430135ba462525c224e76356bd3d430f11), ROM_BIOS(2) )   \
368   ROMX_LOAD( "901229-02.ub3", 0xe000, 0x2000, CRC(b29bab75) SHA1(91321142e226168b1139c30c83896933f317d000), ROM_BIOS(2) )   \
369   ROM_SYSTEM_BIOS( 2, "rev3", "VC-1541 rev. 03" )   \
370   ROMX_LOAD( "325302-01.ua2", 0xc000, 0x2000, CRC(29ae9752) SHA1(8e0547430135ba462525c224e76356bd3d430f11), ROM_BIOS(3) )   \
371   ROMX_LOAD( "901229-03.ub3", 0xe000, 0x2000, CRC(9126e74a) SHA1(03d17bd745066f1ead801c5183ac1d3af7809744), ROM_BIOS(3) )   \
372   ROM_SYSTEM_BIOS( 3, "rev5", "VC-1541 rev. 05" )   \
373   ROMX_LOAD( "325302-01.ua2", 0xc000, 0x2000, CRC(29ae9752) SHA1(8e0547430135ba462525c224e76356bd3d430f11), ROM_BIOS(4) )   \
374   ROMX_LOAD( "901229-05.ub3", 0xe000, 0x2000, CRC(361c9f37) SHA1(f5d60777440829e46dc91285e662ba072acd2d8b), ROM_BIOS(4) )   \
375   ROM_SYSTEM_BIOS( 4, "rev6aa", "VC-1541 rev. 06AA" )   \
376   ROMX_LOAD( "325302-01.ua2", 0xc000, 0x2000, CRC(29ae9752) SHA1(8e0547430135ba462525c224e76356bd3d430f11), ROM_BIOS(5) )   \
377   ROMX_LOAD( "901229-06aa.ub3", 0xe000, 0x2000, CRC(3a235039) SHA1(c7f94f4f51d6de4cdc21ecbb7e57bb209f0530c0), ROM_BIOS(5) )   \
378   ROM_SYSTEM_BIOS( 5, "rev1c", "VC-1541C rev. 01" )   \
379   ROMX_LOAD( "251968-01.ua2", 0xc000, 0x4000, CRC(1b3ca08d) SHA1(8e893932de8cce244117fcea4c46b7c39c6a7765), ROM_BIOS(6) )   \
380   ROM_SYSTEM_BIOS( 6, "rev2c", "VC-1541C rev. 02" )   \
381   ROMX_LOAD( "251968-02.ua2", 0xc000, 0x4000, CRC(2d862d20) SHA1(38a7a489c7bbc8661cf63476bf1eb07b38b1c704), ROM_BIOS(7) )   \
382   ROM_SYSTEM_BIOS( 7, "rev3ii", "VC-1541-II" )   \
383   ROMX_LOAD( "251968-03.u4", 0xc000, 0x4000, CRC(899fa3c5) SHA1(d3b78c3dbac55f5199f33f3fe0036439811f7fb3), ROM_BIOS(8) )   \
384   ROM_SYSTEM_BIOS( 8, "reviin", "VC-1541-II (with Newtronics D500)" )   \
385   ROMX_LOAD( "355640-01.u4", 0xc000, 0x4000, CRC(57224cde) SHA1(ab16f56989b27d89babe5f89c5a8cb3da71a82f0), ROM_BIOS(9) )   \
483//-------------------------------------------------
484//  sid6581_interface sid_intf
485//-------------------------------------------------
386486
487static int paddle_read( device_t *device, int which )
488{
489   running_machine &machine = device->machine();
490   c64_state *state = device->machine().driver_data<c64_state>();
491   
492   int pot1 = 0xff, pot2 = 0xff, pot3 = 0xff, pot4 = 0xff, temp;
493   UINT8 cia0porta = mos6526_pa_r(state->m_cia1, 0);
494   int controller1 = input_port_read(machine, "CTRLSEL") & 0x07;
495   int controller2 = input_port_read(machine, "CTRLSEL") & 0x70;
496   // Notice that only a single input is defined for Mouse & Lightpen in both ports
497   switch (controller1)
498   {
499      case 0x01:
500         if (which)
501            pot2 = input_port_read(machine, "PADDLE2");
502         else
503            pot1 = input_port_read(machine, "PADDLE1");
504         break;
387505
506      case 0x02:
507         if (which)
508            pot2 = input_port_read(machine, "TRACKY");
509         else
510            pot1 = input_port_read(machine, "TRACKX");
511         break;
388512
389// currently not used (hacked drive firmware with more RAM)
390#define DOLPHIN_ROM( cpu )   \
391   ROM_REGION( 0x10000, cpu, 0 )   \
392   ROM_LOAD( "c1541.rom", 0xa000, 0x6000, CRC(bd8e42b2) SHA1(d6aff55fc70876fa72be45c666b6f42b92689b4d) )
513      case 0x03:
514         if (which && (input_port_read(machine, "JOY1_2B") & 0x20))   // Joy1 Button 2
515            pot1 = 0x00;
516         break;
393517
518      case 0x04:
519         if (which)
520            pot2 = input_port_read(machine, "LIGHTY");
521         else
522            pot1 = input_port_read(machine, "LIGHTX");
523         break;
394524
395/*************************************
396 *
397 *  Main CPU memory handlers
398 *
399 *************************************/
525      case 0x06:
526         if (which && (input_port_read(machine, "OTHER") & 0x04))   // Lightpen Signal
527            pot2 = 0x00;
528         break;
400529
401static ADDRESS_MAP_START(ultimax_mem , AS_PROGRAM, 8)
402   AM_RANGE(0x0000, 0x0fff) AM_RAM AM_BASE_MEMBER(legacy_c64_state, m_memory)
403   AM_RANGE(0x8000, 0x9fff) AM_ROM AM_BASE_MEMBER(legacy_c64_state, m_c64_roml)
404   AM_RANGE(0xd000, 0xd3ff) AM_DEVREADWRITE("vic2", vic2_port_r, vic2_port_w)
405   AM_RANGE(0xd400, 0xd7ff) AM_DEVREADWRITE("sid6581", sid6581_r, sid6581_w)
406   AM_RANGE(0xd800, 0xdbff) AM_RAM_WRITE( c64_colorram_write) AM_BASE_MEMBER(legacy_c64_state, m_colorram) /* colorram  */
407   AM_RANGE(0xdc00, 0xdcff) AM_DEVREADWRITE("cia_0", mos6526_r, mos6526_w)
408   AM_RANGE(0xe000, 0xffff) AM_ROM AM_BASE_MEMBER(legacy_c64_state, m_c64_romh)            /* ram or kernel rom */
409ADDRESS_MAP_END
530      case 0x00:
531      case 0x07:
532         break;
410533
534      default:
535         logerror("Invalid Controller Setting %d\n", controller1);
536         break;
537   }
411538
412/*************************************
413 *
414 *  Input Ports
415 *
416 *************************************/
539   switch (controller2)
540   {
541      case 0x10:
542         if (which)
543            pot4 = input_port_read(machine, "PADDLE4");
544         else
545            pot3 = input_port_read(machine, "PADDLE3");
546         break;
417547
418static INPUT_PORTS_START( c64 )
419   PORT_INCLUDE( common_cbm_keyboard )      /* ROW0 -> ROW7 */
548      case 0x20:
549         if (which)
550            pot4 = input_port_read(machine, "TRACKY");
551         else
552            pot3 = input_port_read(machine, "TRACKX");
553         break;
420554
421   PORT_INCLUDE( c64_special )            /* SPECIAL */
555      case 0x30:
556         if (which && (input_port_read(machine, "JOY2_2B") & 0x20))   // Joy2 Button 2
557            pot4 = 0x00;
558         break;
422559
423   PORT_INCLUDE( c64_controls )         /* CTRLSEL, JOY0, JOY1, PADDLE0 -> PADDLE3, TRACKX, TRACKY, LIGHTX, LIGHTY, OTHER */
424INPUT_PORTS_END
560      case 0x40:
561         if (which)
562            pot4 = input_port_read(machine, "LIGHTY");
563         else
564            pot3 = input_port_read(machine, "LIGHTX");
565         break;
425566
567      case 0x60:
568         if (which && (input_port_read(machine, "OTHER") & 0x04))   // Lightpen Signal
569            pot4 = 0x00;
570         break;
426571
572      case 0x00:
573      case 0x70:
574         break;
427575
576      default:
577         logerror("Invalid Controller Setting %d\n", controller1);
578         break;
579   }
428580
429/*************************************
430 *
431 *  Graphics definitions
432 *
433 *************************************/
581   if (input_port_read(machine, "CTRLSEL") & 0x80)      // Swap
582   {
583      temp = pot1; pot1 = pot3; pot3 = temp;
584      temp = pot2; pot2 = pot4; pot4 = temp;
585   }
434586
435static const unsigned char c64_palette[] =
587   switch (cia0porta & 0xc0)
588   {
589      case 0x40:
590         return which ? pot2 : pot1;
591
592      case 0x80:
593         return which ? pot4 : pot3;
594
595      case 0xc0:
596         return which ? pot2 : pot1;
597
598      default:
599         return 0;
600   }
601}
602
603static const sid6581_interface sid_intf =
436604{
437/* black, white, red, cyan */
438/* purple, green, blue, yellow */
439/* orange, brown, light red, dark gray, */
440/* medium gray, light green, light blue, light gray */
441/* taken from the vice emulator */
442   0x00, 0x00, 0x00,  0xfd, 0xfe, 0xfc,  0xbe, 0x1a, 0x24,  0x30, 0xe6, 0xc6,
443   0xb4, 0x1a, 0xe2,  0x1f, 0xd2, 0x1e,  0x21, 0x1b, 0xae,  0xdf, 0xf6, 0x0a,
444   0xb8, 0x41, 0x04,  0x6a, 0x33, 0x04,  0xfe, 0x4a, 0x57,  0x42, 0x45, 0x40,
445   0x70, 0x74, 0x6f,  0x59, 0xfe, 0x59,  0x5f, 0x53, 0xfe,  0xa4, 0xa7, 0xa2
605   paddle_read
446606};
447607
448static PALETTE_INIT( c64 )
608
609//-------------------------------------------------
610//  mos6526_interface cia1_intf
611//-------------------------------------------------
612
613WRITE_LINE_MEMBER( c64_state::cia1_irq_w )
449614{
450   int i;
451
452   for (i = 0; i < sizeof(c64_palette) / 3; i++)
453   {
454      palette_set_color_rgb(machine, i, c64_palette[i * 3], c64_palette[i * 3 + 1], c64_palette[i * 3 + 2]);
455   }
615   m_cia1_irq = state;
616   
617   check_interrupts();
456618}
457619
620READ8_MEMBER( c64_state::cia1_pa_r )
621{
622   /*
623     
624      bit      description
625     
626      PA0      COL0, JOY B0
627      PA1      COL1, JOY B1
628      PA2      COL2, JOY B2
629      PA3      COL3, JOY B3
630      PA4      COL4, BTNB
631      PA5      COL5
632      PA6      COL6
633      PA7      COL7
634     
635   */
458636
459/*************************************
460 *
461 *  Sound definitions
462 *
463 *************************************/
637   UINT8 cia0portb = mos6526_pb_r(m_cia1, 0);
464638
639   return cbm_common_cia0_port_a_r(m_cia1, cia0portb);
640}
465641
466static const sid6581_interface c64_sound_interface =
642READ8_MEMBER( c64_state::cia1_pb_r )
467643{
468   c64_paddle_read
469};
644   /*
645     
646      bit      description
647     
648      PB0      JOY A0
649      PB1      JOY A1
650      PB2      JOY A2
651      PB3      JOY A3
652      PB4      BTNA/_LP
653      PB5
654      PB6
655      PB7
656     
657   */
470658
659   UINT8 cia0porta = mos6526_pa_r(m_cia1, 0);
471660
472static const m6502_interface c64_m6510_interface =
661   return cbm_common_cia0_port_b_r(m_cia1, cia0porta);
662}
663
664WRITE8_MEMBER( c64_state::cia1_pb_w )
473665{
474   NULL,
475   NULL,
476   DEVCB_HANDLER(c64_m6510_port_read),
477   DEVCB_HANDLER(c64_m6510_port_write)
478};
666   /*
667     
668      bit      description
669     
670      PB0      ROW0
671      PB1      ROW1
672      PB2      ROW2
673      PB3      ROW3
674      PB4      ROW4
675      PB5      ROW5
676      PB6      ROW6
677      PB7      ROW7
678     
679   */
680   
681   vic2_lightpen_write(m_vic, BIT(data, 4));
682}
479683
480static CBM_IEC_INTERFACE( cbm_iec_intf )
684static const mos6526_interface cia1_intf =
481685{
686   10,
687   DEVCB_DRIVER_LINE_MEMBER(c64_state, cia1_irq_w),
482688   DEVCB_NULL,
689   DEVCB_DEVICE_LINE_MEMBER(C64_USER_PORT_TAG, c64_user_port_device, sp1_w),
690   DEVCB_DEVICE_LINE_MEMBER(C64_USER_PORT_TAG, c64_user_port_device, cnt1_w),
691   DEVCB_DRIVER_MEMBER(c64_state, cia1_pa_r),
483692   DEVCB_NULL,
484   DEVCB_NULL,
485   DEVCB_NULL,
486   DEVCB_NULL
693   DEVCB_DRIVER_MEMBER(c64_state, cia1_pb_r),
694   DEVCB_DRIVER_MEMBER(c64_state, cia1_pb_w)
487695};
488696
489697
490/*************************************
491 *
492 *  VIC II interfaces
493 *
494 *************************************/
698//-------------------------------------------------
699//  mos6526_interface cia2_intf
700//-------------------------------------------------
495701
496static SCREEN_UPDATE_IND16( c64 )
702WRITE_LINE_MEMBER( c64_state::cia2_irq_w )
497703{
498   device_t *vic2 = screen.machine().device("vic2");
499
500   vic2_video_update(vic2, bitmap, cliprect);
501   return 0;
704   m_cia2_irq = state;
705   
706   check_interrupts();
502707}
503708
504READ8_MEMBER( legacy_c64_state::c64_lightpen_x_cb )
709READ8_MEMBER( c64_state::cia2_pa_r )
505710{
506   return input_port_read(machine(), "LIGHTX") & ~0x01;
711   /*
712     
713      bit      description
714     
715      PA0
716      PA1
717      PA2      USER PORT
718      PA3
719      PA4
720      PA5
721      PA6      CLK
722      PA7      DATA
723     
724   */
725   
726   UINT8 data = 0;
727   
728   // user port
729   data |= m_user->pa2_r() << 2;
730   
731   // IEC bus
732   data |= m_iec->clk_r() << 6;
733   data |= m_iec->data_r() << 7;
734   
735   return data;
507736}
508737
509READ8_MEMBER( legacy_c64_state::c64_lightpen_y_cb )
738WRITE8_MEMBER( c64_state::cia2_pa_w )
510739{
511   return input_port_read(machine(), "LIGHTY") & ~0x01;
740   /*
741     
742      bit      description
743     
744      PA0      _VA14
745      PA1      _VA15
746      PA2      USER PORT
747      PA3      ATN OUT
748      PA4      CLK OUT
749      PA5      DATA OUT
750      PA6
751      PA7
752     
753   */
754   
755   // VIC banking
756   m_va14 = BIT(data, 0);
757   m_va15 = BIT(data, 1);
758   
759   // user port
760   m_user->pa2_w(BIT(data, 2));
761   
762   // IEC bus
763   m_iec->atn_w(!BIT(data, 3));
764   m_iec->clk_w(!BIT(data, 4));
765   m_iec->data_w(!BIT(data, 5));
512766}
513767
514READ8_MEMBER( legacy_c64_state::c64_lightpen_button_cb )
768static const mos6526_interface cia2_intf =
515769{
516   return input_port_read(machine(), "OTHER") & 0x04;
770   10,
771   DEVCB_DRIVER_LINE_MEMBER(c64_state, cia2_irq_w),
772   DEVCB_DEVICE_LINE_MEMBER(C64_USER_PORT_TAG, c64_user_port_device, pc2_w),
773   DEVCB_DEVICE_LINE_MEMBER(C64_USER_PORT_TAG, c64_user_port_device, sp2_w),
774   DEVCB_DEVICE_LINE_MEMBER(C64_USER_PORT_TAG, c64_user_port_device, cnt2_w),
775   DEVCB_DRIVER_MEMBER(c64_state, cia2_pa_r),
776   DEVCB_DRIVER_MEMBER(c64_state, cia2_pa_w),
777   DEVCB_DEVICE_MEMBER(C64_USER_PORT_TAG, c64_user_port_device, pb_r),
778   DEVCB_DEVICE_MEMBER(C64_USER_PORT_TAG, c64_user_port_device, pb_w)
779};
780
781
782//-------------------------------------------------
783//  m6502_interface cpu_intf
784//-------------------------------------------------
785
786READ8_MEMBER( c64_state::cpu_r )
787{
788   /*
789     
790      bit      description
791     
792      P0      1
793      P1      1
794      P2      1
795      P3
796      P4      CASS SENS
797      P5     
798     
799   */
800   
801   UINT8 data = 0x07;
802   
803   data |= ((m_cassette->get_state() & CASSETTE_MASK_UISTATE) == CASSETTE_STOPPED) << 4;
804   
805   return data;
517806}
518807
519READ8_MEMBER( legacy_c64_state::c64_dma_read )
808WRITE8_MEMBER( c64_state::cpu_w )
520809{
521   if (!m_game && m_exrom)
810   /*
811     
812      bit      description
813     
814      P0      LORAM
815      P1      HIRAM
816      P2      CHAREN
817      P3      CASS WRT
818      P4
819      P5      CASS MOTOR
820     
821   */
822
823   // HACK apply pull-up resistors
824   data |= (offset ^ 0x07) & 0x07;
825   
826   m_loram = BIT(data, 0);
827   m_hiram = BIT(data, 1);
828   m_charen = BIT(data, 2);
829   
830   // cassette write
831   m_cassette->output(BIT(data, 3) ? -(0x5a9e >> 1) : +(0x5a9e >> 1));
832   
833   // cassette motor
834   if (!BIT(data, 5))
522835   {
523      if (offset < 0x3000)
524         return m_memory[offset];
525
526      return m_c64_romh[offset & 0x1fff];
836      m_cassette->change_state(CASSETTE_MOTOR_ENABLED, CASSETTE_MASK_MOTOR);
837      m_cassette_timer->adjust(attotime::zero, 0, attotime::from_hz(44100));
527838   }
839   else
840   {
841      m_cassette->change_state(CASSETTE_MOTOR_DISABLED, CASSETTE_MASK_MOTOR);
842      m_cassette_timer->reset();
843   }
844}
528845
529   if (((m_vicaddr - m_memory + offset) & 0x7000) == 0x1000)
530      return m_chargen[offset & 0xfff];
846static const m6502_interface cpu_intf =
847{
848   NULL,
849   NULL,
850   DEVCB_DRIVER_MEMBER(c64_state, cpu_r),
851   DEVCB_DRIVER_MEMBER(c64_state, cpu_w)
852};
531853
532   return m_vicaddr[offset];
854
855//-------------------------------------------------
856//  m6502_interface sx64_cpu_intf
857//-------------------------------------------------
858
859READ8_MEMBER( sx64_state::cpu_r )
860{
861   /*
862     
863      bit      description
864     
865      P0      1
866      P1      1
867      P2      1
868      P3      1
869      P4      1
870      P5      1
871     
872   */
873
874   return 0x3f;
533875}
534876
535READ8_MEMBER( legacy_c64_state::c64_dma_read_ultimax )
877WRITE8_MEMBER( sx64_state::cpu_w )
536878{
537   if (offset < 0x3000)
538      return m_memory[offset];
879   /*
880     
881      bit      description
882     
883      P0      LORAM
884      P1      HIRAM
885      P2      CHAREN
886      P3     
887      P4
888      P5     
889     
890   */
539891
540   return m_c64_romh[offset & 0x1fff];
892   // HACK apply pull-up resistors
893   data |= (offset ^ 0x07) & 0x07;
894   
895   m_loram = BIT(data, 0);
896   m_hiram = BIT(data, 1);
897   m_charen = BIT(data, 2);
541898}
542899
543READ8_MEMBER( legacy_c64_state::c64_dma_read_color )
900static const m6502_interface sx64_cpu_intf =
544901{
545   return m_colorram[offset & 0x3ff] & 0xf;
902   NULL,
903   NULL,
904   DEVCB_DRIVER_MEMBER(sx64_state, cpu_r),
905   DEVCB_DRIVER_MEMBER(sx64_state, cpu_w)
906};
907
908
909//-------------------------------------------------
910//  m6502_interface c64g_cpu_intf
911//-------------------------------------------------
912
913READ8_MEMBER( c64gs_state::cpu_r )
914{
915   /*
916     
917      bit      description
918     
919      P0      1
920      P1      1
921      P2      1
922      P3      1
923      P4      1
924      P5      1
925     
926   */
927
928   return 0x3f;
546929}
547930
548READ8_MEMBER( legacy_c64_state::c64_rdy_cb )
931WRITE8_MEMBER( c64gs_state::cpu_w )
549932{
550   return input_port_read(machine(), "CYCLES") & 0x07;
933   /*
934     
935      bit      description
936     
937      P0      LORAM
938      P1      HIRAM
939      P2      CHAREN
940      P3     
941      P4
942      P5     
943     
944   */
945
946   // HACK apply pull-up resistors
947   data |= (offset ^ 0x07) & 0x07;
948   
949   m_loram = BIT(data, 0);
950   m_hiram = BIT(data, 1);
951   m_charen = BIT(data, 2);
551952}
552953
553static const vic2_interface c64_vic2_ntsc_intf = {
554   "screen",
555   "maincpu",
556   VIC6567,
557   DEVCB_DRIVER_MEMBER(legacy_c64_state, c64_lightpen_x_cb),
558   DEVCB_DRIVER_MEMBER(legacy_c64_state, c64_lightpen_y_cb),
559   DEVCB_DRIVER_MEMBER(legacy_c64_state, c64_lightpen_button_cb),
560   DEVCB_DRIVER_MEMBER(legacy_c64_state, c64_dma_read),
561   DEVCB_DRIVER_MEMBER(legacy_c64_state, c64_dma_read_color),
562   DEVCB_DRIVER_LINE_MEMBER(legacy_c64_state, c64_vic_interrupt),
563   DEVCB_DRIVER_MEMBER(legacy_c64_state, c64_rdy_cb)
954static const m6502_interface c64gs_cpu_intf =
955{
956   NULL,
957   NULL,
958   DEVCB_DRIVER_MEMBER(c64gs_state, cpu_r),
959   DEVCB_DRIVER_MEMBER(c64gs_state, cpu_w)
564960};
565961
566static const vic2_interface c64_vic2_pal_intf = {
567   "screen",
568   "maincpu",
569   VIC6569,
570   DEVCB_DRIVER_MEMBER(legacy_c64_state, c64_lightpen_x_cb),
571   DEVCB_DRIVER_MEMBER(legacy_c64_state, c64_lightpen_y_cb),
572   DEVCB_DRIVER_MEMBER(legacy_c64_state, c64_lightpen_button_cb),
573   DEVCB_DRIVER_MEMBER(legacy_c64_state, c64_dma_read),
574   DEVCB_DRIVER_MEMBER(legacy_c64_state, c64_dma_read_color),
575   DEVCB_DRIVER_LINE_MEMBER(legacy_c64_state, c64_vic_interrupt),
576   DEVCB_DRIVER_MEMBER(legacy_c64_state, c64_rdy_cb)
577};
578962
579static const vic2_interface ultimax_vic2_intf = {
580   "screen",
581   "maincpu",
582   VIC6567,
583   DEVCB_DRIVER_MEMBER(legacy_c64_state, c64_lightpen_x_cb),
584   DEVCB_DRIVER_MEMBER(legacy_c64_state, c64_lightpen_y_cb),
585   DEVCB_DRIVER_MEMBER(legacy_c64_state, c64_lightpen_button_cb),
586   DEVCB_DRIVER_MEMBER(legacy_c64_state, c64_dma_read_ultimax),
587   DEVCB_DRIVER_MEMBER(legacy_c64_state, c64_dma_read_color),
588   DEVCB_DRIVER_LINE_MEMBER(legacy_c64_state, c64_vic_interrupt),
589   DEVCB_DRIVER_MEMBER(legacy_c64_state, c64_rdy_cb)
963//-------------------------------------------------
964//  TIMER_DEVICE_CALLBACK( cassette_tick )
965//-------------------------------------------------
966
967static TIMER_DEVICE_CALLBACK( cassette_tick )
968{
969   c64_state *state = timer.machine().driver_data<c64_state>();
970
971   state->m_cass_rd = state->m_cassette->input() > +0.0;
972   
973   state->check_interrupts();
974}
975
976
977//-------------------------------------------------
978//  CBM_IEC_INTERFACE( iec_intf )
979//-------------------------------------------------
980
981WRITE_LINE_MEMBER( c64_state::iec_srq_w )
982{
983   m_iec_srq = state;
984   
985   check_interrupts();
986}
987
988static CBM_IEC_INTERFACE( iec_intf )
989{
990   DEVCB_DRIVER_LINE_MEMBER(c64_state, iec_srq_w),
991   DEVCB_DEVICE_LINE_MEMBER(C64_USER_PORT_TAG, c64_user_port_device, atn_w),
992   DEVCB_NULL,
993   DEVCB_NULL,
994   DEVCB_NULL
590995};
591996
592static C64_EXPANSION_INTERFACE( c64_expansion_intf )
997
998//-------------------------------------------------
999//  C64_EXPANSION_INTERFACE( expansion_intf )
1000//-------------------------------------------------
1001
1002WRITE_LINE_MEMBER( c64_state::exp_irq_w )
5931003{
594   DEVCB_CPU_INPUT_LINE("maincpu", INPUT_LINE_IRQ0),
595   DEVCB_CPU_INPUT_LINE("maincpu", INPUT_LINE_NMI),
1004   m_exp_irq = state;
1005   
1006   check_interrupts();
1007}
1008
1009WRITE_LINE_MEMBER( c64_state::exp_nmi_w )
1010{
1011   m_exp_nmi = state;
1012   
1013   check_interrupts();
1014}
1015
1016static C64_EXPANSION_INTERFACE( expansion_intf )
1017{
1018   DEVCB_DRIVER_LINE_MEMBER(c64_state, exp_irq_w),
1019   DEVCB_DRIVER_LINE_MEMBER(c64_state, exp_nmi_w),
5961020   DEVCB_NULL, // DMA
597   DEVCB_NULL // RESET
1021   DEVCB_CPU_INPUT_LINE(M6510_TAG, INPUT_LINE_RESET)
5981022};
5991023
6001024
601/*************************************
602 *
603 *  Machine driver
604 *
605 *************************************/
1025//-------------------------------------------------
1026//  C64_USER_PORT_INTERFACE( user_intf )
1027//-------------------------------------------------
6061028
607static MACHINE_CONFIG_START( ultimax, legacy_c64_state )
608   /* basic machine hardware */
609   MCFG_CPU_ADD("maincpu", M6510, VIC6567_CLOCK)
610   MCFG_CPU_PROGRAM_MAP( ultimax_mem)
611   MCFG_CPU_CONFIG( c64_m6510_interface )
612   MCFG_CPU_VBLANK_INT("screen", c64_frame_interrupt)
613   //MCFG_CPU_PERIODIC_INT(vic2_raster_irq, VIC6567_HRETRACERATE)
1029static C64_USER_PORT_INTERFACE( user_intf )
1030{
1031   DEVCB_DEVICE_LINE(MOS6526_1_TAG, mos6526_sp_w),
1032   DEVCB_DEVICE_LINE(MOS6526_1_TAG, mos6526_cnt_w),
1033   DEVCB_DEVICE_LINE(MOS6526_2_TAG, mos6526_sp_w),
1034   DEVCB_DEVICE_LINE(MOS6526_2_TAG, mos6526_cnt_w),
1035   DEVCB_DEVICE_LINE(MOS6526_2_TAG, mos6526_flag_w),
1036   DEVCB_CPU_INPUT_LINE(M6510_TAG, INPUT_LINE_RESET)
1037};
1038
1039
1040
1041//**************************************************************************
1042//  MACHINE INITIALIZATION
1043//**************************************************************************
1044
1045//-------------------------------------------------
1046//  MACHINE_START( c64 )
1047//-------------------------------------------------
1048
1049void c64_state::machine_start()
1050{
1051   // find memory regions
1052   m_basic = machine().region("basic")->base();
1053   m_kernal = machine().region("kernal")->base();
1054   m_charom = machine().region("charom")->base();
1055   
1056   // allocate memory
1057   m_color_ram = auto_alloc_array(machine(), UINT8, 0x400);
1058   
1059   // state saving
1060   save_item(NAME(m_loram));
1061   save_item(NAME(m_hiram));
1062   save_item(NAME(m_charen));
1063   save_pointer(NAME(m_color_ram), 0x400);
1064   save_item(NAME(m_va14));
1065   save_item(NAME(m_va15));
1066   save_item(NAME(m_cia1_irq));
1067   save_item(NAME(m_cia2_irq));
1068   save_item(NAME(m_vic_irq));
1069   save_item(NAME(m_exp_irq));
1070   save_item(NAME(m_exp_nmi));
1071   save_item(NAME(m_cass_rd));
1072   save_item(NAME(m_iec_srq));
1073}
1074
1075
1076//-------------------------------------------------
1077//  MACHINE_START( c64c )
1078//-------------------------------------------------
1079
1080void c64c_state::machine_start()
1081{
1082   c64_state::machine_start();
1083   
1084   // find memory regions
1085   m_basic = machine().region(M6510_TAG)->base();
1086   m_kernal = machine().region(M6510_TAG)->base() + 0x2000;
1087}
1088
1089
1090//-------------------------------------------------
1091//  MACHINE_START( c64gs )
1092//-------------------------------------------------
1093
1094void c64gs_state::machine_start()
1095{
1096   c64c_state::machine_start();
1097}
1098
1099
1100
1101//**************************************************************************
1102//  MACHINE DRIVERS
1103//**************************************************************************
1104
1105//-------------------------------------------------
1106//  MACHINE_CONFIG( ntsc )
1107//-------------------------------------------------
1108
1109static MACHINE_CONFIG_START( ntsc, c64_state )
1110   // basic hardware
1111   MCFG_CPU_ADD(M6510_TAG, M6510, VIC6567_CLOCK)
1112   MCFG_CPU_PROGRAM_MAP(c64_mem)
1113   MCFG_CPU_CONFIG(cpu_intf)
1114   MCFG_CPU_VBLANK_INT(SCREEN_TAG, c64_frame_interrupt)
6141115   MCFG_QUANTUM_TIME(attotime::from_hz(60))
6151116
616   MCFG_MACHINE_START( c64 )
617   MCFG_MACHINE_RESET( c64 )
1117   // video hardware
1118   MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
1119   MCFG_SCREEN_REFRESH_RATE(VIC6567_VRETRACERATE)
1120   MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
1121   MCFG_SCREEN_SIZE(VIC6567_COLUMNS, VIC6567_LINES)
1122   MCFG_SCREEN_VISIBLE_AREA(0, VIC6567_VISIBLECOLUMNS - 1, 0, VIC6567_VISIBLELINES - 1)
1123   MCFG_SCREEN_UPDATE_DRIVER(c64_state, screen_update)
6181124
619   /* video hardware */
620   MCFG_SCREEN_ADD("screen", RASTER)
1125   MCFG_PALETTE_INIT(c64)
1126   MCFG_PALETTE_LENGTH(ARRAY_LENGTH(c64_palette) / 3)
1127
1128   MCFG_VIC2_ADD(MOS6567_TAG, vic_ntsc_intf)
1129
1130   // sound hardware
1131   MCFG_SPEAKER_STANDARD_MONO("mono")
1132   MCFG_SOUND_ADD(MOS6851_TAG, SID6581, VIC6567_CLOCK)
1133   MCFG_SOUND_CONFIG(sid_intf)
1134   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
1135   MCFG_SOUND_ADD("dac", DAC, 0)
1136   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
1137
1138   // devices
1139   MCFG_MOS6526R1_ADD(MOS6526_1_TAG, VIC6567_CLOCK, cia1_intf)
1140   MCFG_MOS6526R1_ADD(MOS6526_2_TAG, VIC6567_CLOCK, cia2_intf)
1141   MCFG_QUICKLOAD_ADD("quickload", cbm_c64, "p00,prg,t64", CBM_QUICKLOAD_DELAY_SECONDS)
1142   MCFG_CASSETTE_ADD(CASSETTE_TAG, cbm_cassette_interface)
1143   MCFG_TIMER_ADD(TIMER_C1531_TAG, cassette_tick)
1144   MCFG_CBM_IEC_ADD(iec_intf, "c1541")
1145   MCFG_C64_EXPANSION_SLOT_ADD(C64_EXPANSION_SLOT_TAG, expansion_intf, c64_expansion_cards, NULL, NULL)
1146   MCFG_C64_USER_PORT_ADD(C64_USER_PORT_TAG, user_intf, c64_user_port_cards, NULL, NULL)
1147
1148   // software list
1149   MCFG_SOFTWARE_LIST_ADD("cart_list_c64", "c64_cart")
1150   MCFG_SOFTWARE_LIST_FILTER("cart_list_c64", "NTSC")
1151   MCFG_SOFTWARE_LIST_ADD("disk_list", "c64_flop")
1152   MCFG_SOFTWARE_LIST_FILTER("disk_list", "NTSC")
1153
1154   // internal ram
1155   MCFG_RAM_ADD(RAM_TAG)
1156   MCFG_RAM_DEFAULT_SIZE("64K")
1157MACHINE_CONFIG_END
1158
1159
1160//-------------------------------------------------
1161//  MACHINE_CONFIG( pet64 )
1162//-------------------------------------------------
1163
1164static MACHINE_CONFIG_DERIVED( pet64, ntsc )
1165   MCFG_PALETTE_INIT( pet64 )
1166MACHINE_CONFIG_END
1167
1168
1169//-------------------------------------------------
1170//  MACHINE_CONFIG( ntsc_sx )
1171//-------------------------------------------------
1172
1173static MACHINE_CONFIG_START( ntsc_sx, sx64_state )
1174   // basic hardware
1175   MCFG_CPU_ADD(M6510_TAG, M6510, VIC6567_CLOCK)
1176   MCFG_CPU_PROGRAM_MAP(c64_mem)
1177   MCFG_CPU_CONFIG(sx64_cpu_intf)
1178   MCFG_CPU_VBLANK_INT(SCREEN_TAG, c64_frame_interrupt)
1179   MCFG_QUANTUM_TIME(attotime::from_hz(60))
1180
1181   // video hardware
1182   MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
6211183   MCFG_SCREEN_REFRESH_RATE(VIC6567_VRETRACERATE)
622   MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) /* not accurate */
1184   MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
6231185   MCFG_SCREEN_SIZE(VIC6567_COLUMNS, VIC6567_LINES)
6241186   MCFG_SCREEN_VISIBLE_AREA(0, VIC6567_VISIBLECOLUMNS - 1, 0, VIC6567_VISIBLELINES - 1)
625   MCFG_SCREEN_UPDATE_STATIC( c64 )
1187   MCFG_SCREEN_UPDATE_DRIVER(sx64_state, screen_update)
6261188
627   MCFG_PALETTE_INIT( c64 )
1189   MCFG_PALETTE_INIT(c64)
6281190   MCFG_PALETTE_LENGTH(ARRAY_LENGTH(c64_palette) / 3)
6291191
630   MCFG_VIC2_ADD("vic2", ultimax_vic2_intf)
1192   MCFG_VIC2_ADD(MOS6567_TAG, vic_ntsc_intf)
6311193
632   /* sound hardware */
1194   // sound hardware
6331195   MCFG_SPEAKER_STANDARD_MONO("mono")
634   MCFG_SOUND_ADD("sid6581", SID6581, VIC6567_CLOCK)
635   MCFG_SOUND_CONFIG(c64_sound_interface)
1196   MCFG_SOUND_ADD(MOS6851_TAG, SID6581, VIC6567_CLOCK)
1197   MCFG_SOUND_CONFIG(sid_intf)
6361198   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
6371199   MCFG_SOUND_ADD("dac", DAC, 0)
6381200   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
6391201
640   /* quickload */
1202   // devices
1203   MCFG_MOS6526R1_ADD(MOS6526_1_TAG, VIC6567_CLOCK, cia1_intf)
1204   MCFG_MOS6526R1_ADD(MOS6526_2_TAG, VIC6567_CLOCK, cia2_intf)
6411205   MCFG_QUICKLOAD_ADD("quickload", cbm_c64, "p00,prg,t64", CBM_QUICKLOAD_DELAY_SECONDS)
1206   MCFG_CBM_IEC_BUS_ADD(iec_intf)
1207   MCFG_CBM_IEC_SLOT_ADD("iec4", 4, cbm_iec_devices, NULL, NULL)
1208   MCFG_CBM_IEC_SLOT_ADD("iec8", 8, sx1541_iec_devices, "sx1541", NULL)
1209   MCFG_CBM_IEC_SLOT_ADD("iec9", 9, cbm_iec_devices, NULL, NULL)
1210   MCFG_CBM_IEC_SLOT_ADD("iec10", 10, cbm_iec_devices, NULL, NULL)
1211   MCFG_CBM_IEC_SLOT_ADD("iec11", 11, cbm_iec_devices, NULL, NULL)
1212   MCFG_C64_EXPANSION_SLOT_ADD(C64_EXPANSION_SLOT_TAG, expansion_intf, c64_expansion_cards, NULL, NULL)
1213   MCFG_C64_USER_PORT_ADD(C64_USER_PORT_TAG, user_intf, c64_user_port_cards, NULL, NULL)
6421214
643   /* cassette */
644   MCFG_CASSETTE_ADD( CASSETTE_TAG, cbm_cassette_interface )
1215   // software list
1216   MCFG_SOFTWARE_LIST_ADD("cart_list_c64", "c64_cart")
1217   MCFG_SOFTWARE_LIST_FILTER("cart_list_c64", "NTSC")
1218   MCFG_SOFTWARE_LIST_ADD("disk_list", "c64_flop")
1219   MCFG_SOFTWARE_LIST_FILTER("disk_list", "NTSC")
6451220
646   /* cia */
647   MCFG_MOS6526R1_ADD("cia_0", VIC6567_CLOCK, c64_ntsc_cia0)
648   MCFG_MOS6526R1_ADD("cia_1", VIC6567_CLOCK, c64_ntsc_cia1)
1221   // internal ram
1222   MCFG_RAM_ADD(RAM_TAG)
1223   MCFG_RAM_DEFAULT_SIZE("64K")
1224MACHINE_CONFIG_END
6491225
650   MCFG_FRAGMENT_ADD(ultimax_cartslot)
6511226
652   MCFG_C64_EXPANSION_SLOT_ADD("exp", c64_expansion_intf, c64_expansion_cards, NULL, NULL)
1227//-------------------------------------------------
1228//  MACHINE_CONFIG( ntsc_dx )
1229//-------------------------------------------------
1230
1231static MACHINE_CONFIG_START( ntsc_dx, sx64_state )
1232   // basic hardware
1233   MCFG_CPU_ADD(M6510_TAG, M6510, VIC6567_CLOCK)
1234   MCFG_CPU_PROGRAM_MAP(c64_mem)
1235   MCFG_CPU_CONFIG(sx64_cpu_intf)
1236   MCFG_CPU_VBLANK_INT(SCREEN_TAG, c64_frame_interrupt)
1237   MCFG_QUANTUM_TIME(attotime::from_hz(60))
1238
1239   // video hardware
1240   MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
1241   MCFG_SCREEN_REFRESH_RATE(VIC6567_VRETRACERATE)
1242   MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
1243   MCFG_SCREEN_SIZE(VIC6567_COLUMNS, VIC6567_LINES)
1244   MCFG_SCREEN_VISIBLE_AREA(0, VIC6567_VISIBLECOLUMNS - 1, 0, VIC6567_VISIBLELINES - 1)
1245   MCFG_SCREEN_UPDATE_DRIVER(sx64_state, screen_update)
1246
1247   MCFG_PALETTE_INIT(c64)
1248   MCFG_PALETTE_LENGTH(ARRAY_LENGTH(c64_palette) / 3)
1249
1250   MCFG_VIC2_ADD(MOS6567_TAG, vic_ntsc_intf)
1251
1252   // sound hardware
1253   MCFG_SPEAKER_STANDARD_MONO("mono")
1254   MCFG_SOUND_ADD(MOS6851_TAG, SID6581, VIC6567_CLOCK)
1255   MCFG_SOUND_CONFIG(sid_intf)
1256   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
1257   MCFG_SOUND_ADD("dac", DAC, 0)
1258   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
1259
1260   // devices
1261   MCFG_MOS6526R1_ADD(MOS6526_1_TAG, VIC6567_CLOCK, cia1_intf)
1262   MCFG_MOS6526R1_ADD(MOS6526_2_TAG, VIC6567_CLOCK, cia2_intf)
1263   MCFG_QUICKLOAD_ADD("quickload", cbm_c64, "p00,prg,t64", CBM_QUICKLOAD_DELAY_SECONDS)
1264   MCFG_CBM_IEC_BUS_ADD(iec_intf)
1265   MCFG_CBM_IEC_SLOT_ADD("iec4", 4, cbm_iec_devices, NULL, NULL)
1266   MCFG_CBM_IEC_SLOT_ADD("iec8", 8, sx1541_iec_devices, "sx1541", NULL)
1267   MCFG_CBM_IEC_SLOT_ADD("iec9", 9, sx1541_iec_devices, "sx1541", NULL)
1268   MCFG_CBM_IEC_SLOT_ADD("iec10", 10, cbm_iec_devices, NULL, NULL)
1269   MCFG_CBM_IEC_SLOT_ADD("iec11", 11, cbm_iec_devices, NULL, NULL)
1270   MCFG_C64_EXPANSION_SLOT_ADD(C64_EXPANSION_SLOT_TAG, expansion_intf, c64_expansion_cards, NULL, NULL)
1271   MCFG_C64_USER_PORT_ADD(C64_USER_PORT_TAG, user_intf, c64_user_port_cards, NULL, NULL)
1272
1273   // software list
1274   MCFG_SOFTWARE_LIST_ADD("cart_list_c64", "c64_cart")
1275   MCFG_SOFTWARE_LIST_FILTER("cart_list_c64", "NTSC")
1276   MCFG_SOFTWARE_LIST_ADD("disk_list", "c64_flop")
1277   MCFG_SOFTWARE_LIST_FILTER("disk_list", "NTSC")
1278
1279   // internal ram
1280   MCFG_RAM_ADD(RAM_TAG)
1281   MCFG_RAM_DEFAULT_SIZE("64K")
6531282MACHINE_CONFIG_END
6541283
6551284
656/*************************************
657 *
658 *  ROM definition(s)
659 *
660 *************************************/
1285//-------------------------------------------------
1286//  MACHINE_CONFIG( ntsc_c )
1287//-------------------------------------------------
6611288
1289static MACHINE_CONFIG_START( ntsc_c, c64c_state )
1290   // basic hardware
1291   MCFG_CPU_ADD(M6510_TAG, M6510, VIC6567_CLOCK)
1292   MCFG_CPU_PROGRAM_MAP(c64_mem)
1293   MCFG_CPU_CONFIG(cpu_intf)
1294   MCFG_CPU_VBLANK_INT(SCREEN_TAG, c64_frame_interrupt)
1295   MCFG_QUANTUM_TIME(attotime::from_hz(60))
6621296
663ROM_START( max )
664   ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF )
665   ROM_REGION( 0x80000, "user1", ROMREGION_ERASE00 )
1297   // video hardware
1298   MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
1299   MCFG_SCREEN_REFRESH_RATE(VIC6567_VRETRACERATE)
1300   MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
1301   MCFG_SCREEN_SIZE(VIC6567_COLUMNS, VIC6567_LINES)
1302   MCFG_SCREEN_VISIBLE_AREA(0, VIC6567_VISIBLECOLUMNS - 1, 0, VIC6567_VISIBLELINES - 1)
1303   MCFG_SCREEN_UPDATE_DRIVER(c64c_state, screen_update)
1304
1305   MCFG_PALETTE_INIT(c64)
1306   MCFG_PALETTE_LENGTH(ARRAY_LENGTH(c64_palette) / 3)
1307
1308   MCFG_VIC2_ADD(MOS6567_TAG, vic_ntsc_intf)
1309
1310   // sound hardware
1311   MCFG_SPEAKER_STANDARD_MONO("mono")
1312   MCFG_SOUND_ADD(MOS6851_TAG, SID6581, VIC6567_CLOCK)
1313   MCFG_SOUND_CONFIG(sid_intf)
1314   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
1315   MCFG_SOUND_ADD("dac", DAC, 0)
1316   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
1317
1318   // devices
1319   MCFG_MOS6526R1_ADD(MOS6526_1_TAG, VIC6567_CLOCK, cia1_intf)
1320   MCFG_MOS6526R1_ADD(MOS6526_2_TAG, VIC6567_CLOCK, cia2_intf)
1321   MCFG_QUICKLOAD_ADD("quickload", cbm_c64, "p00,prg,t64", CBM_QUICKLOAD_DELAY_SECONDS)
1322   MCFG_CASSETTE_ADD(CASSETTE_TAG, cbm_cassette_interface)
1323   MCFG_TIMER_ADD(TIMER_C1531_TAG, cassette_tick)
1324   MCFG_CBM_IEC_ADD(iec_intf, "c1541")
1325   MCFG_C64_EXPANSION_SLOT_ADD(C64_EXPANSION_SLOT_TAG, expansion_intf, c64_expansion_cards, NULL, NULL)
1326   MCFG_C64_USER_PORT_ADD(C64_USER_PORT_TAG, user_intf, c64_user_port_cards, NULL, NULL)
1327
1328   // software list
1329   MCFG_SOFTWARE_LIST_ADD("cart_list_c64", "c64_cart")
1330   MCFG_SOFTWARE_LIST_FILTER("cart_list_c64", "NTSC")
1331   MCFG_SOFTWARE_LIST_ADD("disk_list", "c64_flop")
1332   MCFG_SOFTWARE_LIST_FILTER("disk_list", "NTSC")
1333
1334   // internal ram
1335   MCFG_RAM_ADD(RAM_TAG)
1336   MCFG_RAM_DEFAULT_SIZE("64K")
1337MACHINE_CONFIG_END
1338
1339
1340//-------------------------------------------------
1341//  MACHINE_CONFIG( pal )
1342//-------------------------------------------------
1343
1344static MACHINE_CONFIG_START( pal, c64_state )
1345   // basic hardware
1346   MCFG_CPU_ADD(M6510_TAG, M6510, VIC6569_CLOCK)
1347   MCFG_CPU_PROGRAM_MAP(c64_mem)
1348   MCFG_CPU_CONFIG(cpu_intf)
1349   MCFG_CPU_VBLANK_INT(SCREEN_TAG, c64_frame_interrupt)
1350   MCFG_QUANTUM_TIME(attotime::from_hz(50))
1351
1352   // video hardware
1353   MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
1354   MCFG_SCREEN_REFRESH_RATE(VIC6569_VRETRACERATE)
1355   MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
1356   MCFG_SCREEN_SIZE(VIC6569_COLUMNS, VIC6569_LINES)
1357   MCFG_SCREEN_VISIBLE_AREA(0, VIC6569_VISIBLECOLUMNS - 1, 0, VIC6569_VISIBLELINES - 1)
1358   MCFG_SCREEN_UPDATE_DRIVER(c64_state, screen_update)
1359
1360   MCFG_PALETTE_INIT(c64)
1361   MCFG_PALETTE_LENGTH(ARRAY_LENGTH(c64_palette) / 3)
1362
1363   MCFG_VIC2_ADD(MOS6569_TAG, vic_pal_intf)
1364
1365   // sound hardware
1366   MCFG_SPEAKER_STANDARD_MONO("mono")
1367   MCFG_SOUND_ADD(MOS6851_TAG, SID6581, VIC6569_CLOCK)
1368   MCFG_SOUND_CONFIG(sid_intf)
1369   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
1370   MCFG_SOUND_ADD("dac", DAC, 0)
1371   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
1372
1373   // devices
1374   MCFG_MOS6526R1_ADD(MOS6526_1_TAG, VIC6569_CLOCK, cia1_intf)
1375   MCFG_MOS6526R1_ADD(MOS6526_2_TAG, VIC6569_CLOCK, cia2_intf)
1376   MCFG_QUICKLOAD_ADD("quickload", cbm_c64, "p00,prg,t64", CBM_QUICKLOAD_DELAY_SECONDS)
1377   MCFG_CASSETTE_ADD(CASSETTE_TAG, cbm_cassette_interface)
1378   MCFG_TIMER_ADD(TIMER_C1531_TAG, cassette_tick)
1379   MCFG_CBM_IEC_ADD(iec_intf, "c1541")
1380   MCFG_C64_EXPANSION_SLOT_ADD(C64_EXPANSION_SLOT_TAG, expansion_intf, c64_expansion_cards, NULL, NULL)
1381   MCFG_C64_USER_PORT_ADD(C64_USER_PORT_TAG, user_intf, c64_user_port_cards, NULL, NULL)
1382
1383   // software list
1384   MCFG_SOFTWARE_LIST_ADD("cart_list_c64", "c64_cart")
1385   MCFG_SOFTWARE_LIST_FILTER("cart_list_c64", "PAL")
1386   MCFG_SOFTWARE_LIST_ADD("disk_list", "c64_flop")
1387   MCFG_SOFTWARE_LIST_FILTER("disk_list", "PAL")
1388
1389   // internal ram
1390   MCFG_RAM_ADD(RAM_TAG)
1391   MCFG_RAM_DEFAULT_SIZE("64K")
1392MACHINE_CONFIG_END
1393
1394
1395//-------------------------------------------------
1396//  MACHINE_CONFIG( pal_sx )
1397//-------------------------------------------------
1398
1399static MACHINE_CONFIG_START( pal_sx, sx64_state )
1400   // basic hardware
1401   MCFG_CPU_ADD(M6510_TAG, M6510, VIC6569_CLOCK)
1402   MCFG_CPU_PROGRAM_MAP(c64_mem)
1403   MCFG_CPU_CONFIG(sx64_cpu_intf)
1404   MCFG_CPU_VBLANK_INT(SCREEN_TAG, c64_frame_interrupt)
1405   MCFG_QUANTUM_TIME(attotime::from_hz(50))
1406
1407   // video hardware
1408   MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
1409   MCFG_SCREEN_REFRESH_RATE(VIC6569_VRETRACERATE)
1410   MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
1411   MCFG_SCREEN_SIZE(VIC6569_COLUMNS, VIC6569_LINES)
1412   MCFG_SCREEN_VISIBLE_AREA(0, VIC6569_VISIBLECOLUMNS - 1, 0, VIC6569_VISIBLELINES - 1)
1413   MCFG_SCREEN_UPDATE_DRIVER(sx64_state, screen_update)
1414
1415   MCFG_PALETTE_INIT(c64)
1416   MCFG_PALETTE_LENGTH(ARRAY_LENGTH(c64_palette) / 3)
1417
1418   MCFG_VIC2_ADD(MOS6569_TAG, vic_pal_intf)
1419
1420   // sound hardware
1421   MCFG_SPEAKER_STANDARD_MONO("mono")
1422   MCFG_SOUND_ADD(MOS6851_TAG, SID6581, VIC6569_CLOCK)
1423   MCFG_SOUND_CONFIG(sid_intf)
1424   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
1425   MCFG_SOUND_ADD("dac", DAC, 0)
1426   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
1427
1428   // devices
1429   MCFG_MOS6526R1_ADD(MOS6526_1_TAG, VIC6569_CLOCK, cia1_intf)
1430   MCFG_MOS6526R1_ADD(MOS6526_2_TAG, VIC6569_CLOCK, cia2_intf)
1431   MCFG_QUICKLOAD_ADD("quickload", cbm_c64, "p00,prg,t64", CBM_QUICKLOAD_DELAY_SECONDS)
1432   MCFG_CBM_IEC_BUS_ADD(iec_intf)
1433   MCFG_CBM_IEC_SLOT_ADD("iec4", 4, cbm_iec_devices, NULL, NULL)
1434   MCFG_CBM_IEC_SLOT_ADD("iec8", 8, sx1541_iec_devices, "sx1541", NULL)
1435   MCFG_CBM_IEC_SLOT_ADD("iec9", 9, cbm_iec_devices, NULL, NULL)
1436   MCFG_CBM_IEC_SLOT_ADD("iec10", 10, cbm_iec_devices, NULL, NULL)
1437   MCFG_CBM_IEC_SLOT_ADD("iec11", 11, cbm_iec_devices, NULL, NULL)
1438   MCFG_C64_EXPANSION_SLOT_ADD(C64_EXPANSION_SLOT_TAG, expansion_intf, c64_expansion_cards, NULL, NULL)
1439   MCFG_C64_USER_PORT_ADD(C64_USER_PORT_TAG, user_intf, c64_user_port_cards, NULL, NULL)
1440
1441   // software list
1442   MCFG_SOFTWARE_LIST_ADD("cart_list_c64", "c64_cart")
1443   MCFG_SOFTWARE_LIST_FILTER("cart_list_c64", "PAL")
1444   MCFG_SOFTWARE_LIST_ADD("disk_list", "c64_flop")
1445   MCFG_SOFTWARE_LIST_FILTER("disk_list", "PAL")
1446
1447   // internal ram
1448   MCFG_RAM_ADD(RAM_TAG)
1449   MCFG_RAM_DEFAULT_SIZE("64K")
1450MACHINE_CONFIG_END
1451
1452
1453//-------------------------------------------------
1454//  MACHINE_CONFIG( pal_c )
1455//-------------------------------------------------
1456
1457static MACHINE_CONFIG_START( pal_c, c64c_state )
1458   // basic hardware
1459   MCFG_CPU_ADD(M6510_TAG, M6510, VIC6569_CLOCK)
1460   MCFG_CPU_PROGRAM_MAP(c64_mem)
1461   MCFG_CPU_CONFIG(cpu_intf)
1462   MCFG_CPU_VBLANK_INT(SCREEN_TAG, c64_frame_interrupt)
1463   MCFG_QUANTUM_TIME(attotime::from_hz(50))
1464
1465   // video hardware
1466   MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
1467   MCFG_SCREEN_REFRESH_RATE(VIC6569_VRETRACERATE)
1468   MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
1469   MCFG_SCREEN_SIZE(VIC6569_COLUMNS, VIC6569_LINES)
1470   MCFG_SCREEN_VISIBLE_AREA(0, VIC6569_VISIBLECOLUMNS - 1, 0, VIC6569_VISIBLELINES - 1)
1471   MCFG_SCREEN_UPDATE_DRIVER(c64c_state, screen_update)
1472
1473   MCFG_PALETTE_INIT(c64)
1474   MCFG_PALETTE_LENGTH(ARRAY_LENGTH(c64_palette) / 3)
1475
1476   MCFG_VIC2_ADD(MOS6569_TAG, vic_pal_intf)
1477
1478   // sound hardware
1479   MCFG_SPEAKER_STANDARD_MONO("mono")
1480   MCFG_SOUND_ADD(MOS6851_TAG, SID6581, VIC6569_CLOCK)
1481   MCFG_SOUND_CONFIG(sid_intf)
1482   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
1483   MCFG_SOUND_ADD("dac", DAC, 0)
1484   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
1485
1486   // devices
1487   MCFG_MOS6526R1_ADD(MOS6526_1_TAG, VIC6569_CLOCK, cia1_intf)
1488   MCFG_MOS6526R1_ADD(MOS6526_2_TAG, VIC6569_CLOCK, cia2_intf)
1489   MCFG_QUICKLOAD_ADD("quickload", cbm_c64, "p00,prg,t64", CBM_QUICKLOAD_DELAY_SECONDS)
1490   MCFG_CASSETTE_ADD(CASSETTE_TAG, cbm_cassette_interface)
1491   MCFG_TIMER_ADD(TIMER_C1531_TAG, cassette_tick)
1492   MCFG_CBM_IEC_ADD(iec_intf, "c1541")
1493   MCFG_C64_EXPANSION_SLOT_ADD(C64_EXPANSION_SLOT_TAG, expansion_intf, c64_expansion_cards, NULL, NULL)
1494   MCFG_C64_USER_PORT_ADD(C64_USER_PORT_TAG, user_intf, c64_user_port_cards, NULL, NULL)
1495
1496   // software list
1497   MCFG_SOFTWARE_LIST_ADD("cart_list_c64", "c64_cart")
1498   MCFG_SOFTWARE_LIST_FILTER("cart_list_c64", "PAL")
1499   MCFG_SOFTWARE_LIST_ADD("disk_list", "c64_flop")
1500   MCFG_SOFTWARE_LIST_FILTER("disk_list", "PAL")
1501
1502   // internal ram
1503   MCFG_RAM_ADD(RAM_TAG)
1504   MCFG_RAM_DEFAULT_SIZE("64K")
1505MACHINE_CONFIG_END
1506
1507
1508//-------------------------------------------------
1509//  MACHINE_CONFIG( pal_gs )
1510//-------------------------------------------------
1511
1512static MACHINE_CONFIG_START( pal_gs, c64gs_state )
1513   // basic hardware
1514   MCFG_CPU_ADD(M6510_TAG, M6510, VIC6569_CLOCK)
1515   MCFG_CPU_PROGRAM_MAP(c64_mem)
1516   MCFG_CPU_CONFIG(c64gs_cpu_intf)
1517   MCFG_CPU_VBLANK_INT(SCREEN_TAG, c64_frame_interrupt)
1518   MCFG_QUANTUM_TIME(attotime::from_hz(50))
1519
1520   // video hardware
1521   MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
1522   MCFG_SCREEN_REFRESH_RATE(VIC6569_VRETRACERATE)
1523   MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
1524   MCFG_SCREEN_SIZE(VIC6569_COLUMNS, VIC6569_LINES)
1525   MCFG_SCREEN_VISIBLE_AREA(0, VIC6569_VISIBLECOLUMNS - 1, 0, VIC6569_VISIBLELINES - 1)
1526   MCFG_SCREEN_UPDATE_DRIVER(c64gs_state, screen_update)
1527
1528   MCFG_PALETTE_INIT(c64)
1529   MCFG_PALETTE_LENGTH(ARRAY_LENGTH(c64_palette) / 3)
1530
1531   MCFG_VIC2_ADD(MOS6569_TAG, vic_pal_intf)
1532
1533   // sound hardware
1534   MCFG_SPEAKER_STANDARD_MONO("mono")
1535   MCFG_SOUND_ADD(MOS6851_TAG, SID6581, VIC6569_CLOCK)
1536   MCFG_SOUND_CONFIG(sid_intf)
1537   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
1538   MCFG_SOUND_ADD("dac", DAC, 0)
1539   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
1540
1541   // devices
1542   MCFG_MOS6526R1_ADD(MOS6526_1_TAG, VIC6569_CLOCK, cia1_intf)
1543   MCFG_MOS6526R1_ADD(MOS6526_2_TAG, VIC6569_CLOCK, cia2_intf)
1544   MCFG_CBM_IEC_BUS_ADD(iec_intf)
1545   MCFG_C64_EXPANSION_SLOT_ADD(C64_EXPANSION_SLOT_TAG, expansion_intf, c64_expansion_cards, NULL, NULL)
1546   MCFG_C64_USER_PORT_ADD(C64_USER_PORT_TAG, user_intf, c64_user_port_cards, NULL, NULL)
1547
1548   // software list
1549   MCFG_SOFTWARE_LIST_ADD("cart_list_c64", "c64_cart")
1550   MCFG_SOFTWARE_LIST_FILTER("cart_list_c64", "PAL")
1551
1552   // internal ram
1553   MCFG_RAM_ADD(RAM_TAG)
1554   MCFG_RAM_DEFAULT_SIZE("64K")
1555MACHINE_CONFIG_END
1556
1557
1558
1559//**************************************************************************
1560//  ROMS
1561//**************************************************************************
1562
1563//-------------------------------------------------
1564//  ROM( c64n )
1565//-------------------------------------------------
1566
1567ROM_START( c64n )
1568   ROM_REGION( 0x2000, "basic", 0 )
1569   ROM_LOAD( "901226-01.u3", 0x0000, 0x2000, CRC(f833d117) SHA1(79015323128650c742a3694c9429aa91f355905e) )
1570
1571   ROM_REGION( 0x2000, "kernal", 0 )
1572   ROM_DEFAULT_BIOS("r3")
1573   ROM_SYSTEM_BIOS(0, "r1", "Kernal rev. 1" )
1574   ROMX_LOAD( "901227-01.u4", 0x0000, 0x2000, CRC(dce782fa) SHA1(87cc04d61fc748b82df09856847bb5c2754a2033), ROM_BIOS(1) )
1575   ROM_SYSTEM_BIOS(1, "r2", "Kernal rev. 2" )
1576   ROMX_LOAD( "901227-02.u4", 0x0000, 0x2000, CRC(a5c687b3) SHA1(0e2e4ee3f2d41f00bed72f9ab588b83e306fdb13), ROM_BIOS(2) )
1577   ROM_SYSTEM_BIOS(2, "r3", "Kernal rev. 3" )
1578   ROMX_LOAD( "901227-03.u4", 0x0000, 0x2000, CRC(dbe3e7c7) SHA1(1d503e56df85a62fee696e7618dc5b4e781df1bb), ROM_BIOS(3) )
1579   ROM_SYSTEM_BIOS(3, "jiffydos", "JiffyDOS v6.01" )
1580   ROMX_LOAD( "jiffydos c64.u4", 0x0000, 0x2000, CRC(2f79984c) SHA1(31e73e66eccb28732daea8ec3ad1addd9b39a017), ROM_BIOS(4) )
1581
1582   ROM_REGION( 0x1000, "charom", 0 )
1583   ROM_LOAD( "901225-01.u5", 0x0000, 0x1000, CRC(ec4272ee) SHA1(adc7c31e18c7c7413d54802ef2f4193da14711aa) )
1584   
1585   ROM_REGION( 0x100, "pla", 0 )
1586   ROM_LOAD( "906114-01.u17", 0x000, 0x100, NO_DUMP )
6661587ROM_END
6671588
6681589
669/***************************************************************************
1590//-------------------------------------------------
1591//  ROM( c64j )
1592//-------------------------------------------------
6701593
671  Game driver(s)
1594ROM_START( c64j )
1595   ROM_REGION( 0x2000, "basic", 0 )
1596   ROM_LOAD( "901226-01.u3", 0x0000, 0x2000, CRC(f833d117) SHA1(79015323128650c742a3694c9429aa91f355905e) )
6721597
673***************************************************************************/
1598   ROM_REGION( 0x2000, "kernal", 0 )
1599   ROM_LOAD( "906145-02.u4", 0x0000, 0x2000, CRC(3a9ef6f1) SHA1(4ff0f11e80f4b57430d8f0c3799ed0f0e0f4565d) )
6741600
675/*   YEAR  NAME   PARENT COMPAT MACHINE  INPUT    INIT     COMPANY                            FULLNAME */
1601   ROM_REGION( 0x1000, "charom", 0 )
1602   ROM_LOAD( "906143-02.u5", 0x0000, 0x1000, CRC(1604f6c1) SHA1(0fad19dbcdb12461c99657b2979dbb5c2e47b527) )
1603   
1604   ROM_REGION( 0x100, "pla", 0 )
1605   ROM_LOAD( "906114-01.u17", 0x000, 0x100, NO_DUMP )
1606ROM_END
6761607
677COMP(1982, max,      0,    0,    ultimax, c64,     ultimax, "Commodore Business Machines", "Commodore Max Machine", 0)
1608
1609//-------------------------------------------------
1610//  ROM( c64p )
1611//-------------------------------------------------
1612
1613#define rom_c64p rom_c64n
1614
1615
1616//-------------------------------------------------
1617//  ROM( c64sw )
1618//-------------------------------------------------
1619
1620ROM_START( c64sw )
1621   ROM_REGION( 0x2000, "basic", 0 )
1622   ROM_LOAD( "901226-01.u3", 0x0000, 0x2000, CRC(f833d117) SHA1(79015323128650c742a3694c9429aa91f355905e) )
1623
1624   ROM_REGION( 0x2000, "kernal", 0 )
1625   ROM_LOAD( "kernel.u4",   0x0000, 0x2000, CRC(f10c2c25) SHA1(e4f52d9b36c030eb94524eb49f6f0774c1d02e5e) )
1626
1627   ROM_REGION( 0x1000, "charom", 0 )
1628   ROM_SYSTEM_BIOS( 0, "default", "Swedish Characters" )
1629   ROMX_LOAD( "charswe.u5", 0x0000, 0x1000, CRC(bee9b3fd) SHA1(446ae58f7110d74d434301491209299f66798d8a), ROM_BIOS(1) )
1630   ROM_SYSTEM_BIOS( 1, "alt", "Swedish Characters (Alt)" )
1631   ROMX_LOAD( "charswe2.u5", 0x0000, 0x1000, CRC(377a382b) SHA1(20df25e0ba1c88f31689c1521397c96968967fac), ROM_BIOS(2) )
1632   
1633   ROM_REGION( 0x100, "pla", 0 )
1634   ROM_LOAD( "906114-01.u17", 0x000, 0x100, NO_DUMP )
1635ROM_END
1636
1637
1638//-------------------------------------------------
1639//  ROM( pet64 )
1640//-------------------------------------------------
1641
1642ROM_START( pet64 )
1643   ROM_REGION( 0x2000, "basic", 0 )
1644   ROM_LOAD( "901226-01.u3", 0x0000, 0x2000, CRC(f833d117) SHA1(79015323128650c742a3694c9429aa91f355905e) )
1645
1646   ROM_REGION( 0x2000, "kernal", 0 )
1647   ROM_LOAD( "901246-01.u4", 0x0000, 0x2000, CRC(789c8cc5) SHA1(6c4fa9465f6091b174df27dfe679499df447503c) )
1648
1649   ROM_REGION( 0x1000, "charom", 0 )
1650   ROM_LOAD( "901225-01.u5", 0x0000, 0x1000, CRC(ec4272ee) SHA1(adc7c31e18c7c7413d54802ef2f4193da14711aa) )
1651   
1652   ROM_REGION( 0x100, "pla", 0 )
1653   ROM_LOAD( "906114-01.u17", 0x000, 0x100, NO_DUMP )
1654ROM_END
1655
1656
1657//-------------------------------------------------
1658//  ROM( edu64 )
1659//-------------------------------------------------
1660
1661#define rom_edu64   rom_c64n
1662
1663
1664//-------------------------------------------------
1665//  ROM( sx64n )
1666//-------------------------------------------------
1667
1668ROM_START( sx64n )
1669   ROM_REGION( 0x2000, "basic", 0 )
1670   ROM_LOAD( "901226-01.ud4", 0x0000, 0x2000, CRC(f833d117) SHA1(79015323128650c742a3694c9429aa91f355905e) )
1671
1672   ROM_REGION( 0x2000, "kernal", 0 )
1673   ROM_SYSTEM_BIOS(0, "cbm", "Original" )
1674   ROMX_LOAD( "251104-04.ud3", 0x0000, 0x2000, CRC(2c5965d4) SHA1(aa136e91ecf3c5ac64f696b3dbcbfc5ba0871c98), ROM_BIOS(1) )
1675   ROM_SYSTEM_BIOS(1, "jiffydos", "JiffyDOS v6.01" )
1676   ROMX_LOAD( "jiffydos sx64.ud3", 0x0000, 0x2000, CRC(2b5a88f5) SHA1(942c2150123dc30f40b3df6086132ef0a3c43948), ROM_BIOS(2) )
1677   ROM_SYSTEM_BIOS(2, "1541flash", "1541 FLASH!" )
1678   ROMX_LOAD( "1541 flash.ud3", 0x0000, 0x2000, CRC(0a1c9b85) SHA1(0bfcaab0ae453b663a6e01cd59a9764805419e00), ROM_BIOS(3) )
1679
1680   ROM_REGION( 0x1000, "charom", 0 )
1681   ROM_LOAD( "901225-01.ud1", 0x0000, 0x1000, CRC(ec4272ee) SHA1(adc7c31e18c7c7413d54802ef2f4193da14711aa) )
1682
1683   ROM_REGION( 0x100, "pla", 0 )
1684   ROM_LOAD( "906114-01.ue4", 0x000, 0x100, NO_DUMP )
1685ROM_END
1686
1687
1688//-------------------------------------------------
1689//  ROM( rom_sx64p )
1690//-------------------------------------------------
1691
1692#define rom_sx64p   rom_sx64n
1693
1694
1695//-------------------------------------------------
1696//  ROM( vip64 )
1697//-------------------------------------------------
1698
1699ROM_START( vip64 )
1700   ROM_REGION( 0x2000, "basic", 0 )
1701   ROM_LOAD( "901226-01.ud4", 0x0000, 0x2000, CRC(f833d117) SHA1(79015323128650c742a3694c9429aa91f355905e) )
1702
1703   ROM_REGION( 0x2000, "kernal", 0 )
1704   ROM_LOAD( "kernelsx.ud3", 0x0000, 0x2000, CRC(7858d3d7) SHA1(097cda60469492a8916c2677b7cce4e12a944bc0) )
1705   
1706   ROM_REGION( 0x1000, "charom", 0 )
1707   ROM_LOAD( "charswe.ud1", 0x0000, 0x1000, CRC(bee9b3fd) SHA1(446ae58f7110d74d434301491209299f66798d8a) )
1708
1709   ROM_REGION( 0x100, "pla", 0 )
1710   ROM_LOAD( "906114-01.ue4", 0x000, 0x100, NO_DUMP )
1711ROM_END
1712
1713
1714//-------------------------------------------------
1715//  ROM( dx64 )
1716//-------------------------------------------------
1717
1718// ROM_LOAD( "dx64kern.bin", 0x0000, 0x2000, CRC(58065128) ) TODO where is this illusive ROM?
1719#define rom_dx64    rom_sx64n
1720
1721
1722//-------------------------------------------------
1723//  ROM( c64cn )
1724//-------------------------------------------------
1725
1726ROM_START( c64cn )
1727   ROM_REGION( 0x4000, M6510_TAG, 0 )
1728   ROM_LOAD( "251913-01.u4", 0x0000, 0x4000, CRC(0010ec31) SHA1(765372a0e16cbb0adf23a07b80f6b682b39fbf88) )
1729
1730   ROM_REGION( 0x1000, "charom", 0 )
1731   ROM_LOAD( "901225-01.u5", 0x0000, 0x1000, CRC(ec4272ee) SHA1(adc7c31e18c7c7413d54802ef2f4193da14711aa) )
1732
1733   ROM_REGION( 0x100, "pla", 0 )
1734   ROM_LOAD( "252715-01.u8", 0x000, 0x100, NO_DUMP )
1735ROM_END
1736
1737
1738//-------------------------------------------------
1739//  ROM( c64cp )
1740//-------------------------------------------------
1741
1742#define rom_c64cp      rom_c64cn
1743
1744
1745//-------------------------------------------------
1746//  ROM( c64g )
1747//-------------------------------------------------
1748
1749#define rom_c64g      rom_c64cn
1750
1751
1752//-------------------------------------------------
1753//  ROM( c64csw )
1754//-------------------------------------------------
1755
1756ROM_START( c64csw )
1757   ROM_REGION( 0x4000, M6510_TAG, 0 )
1758   ROM_LOAD( "325182-01.u4", 0x0000, 0x4000, CRC(2aff27d3) SHA1(267654823c4fdf2167050f41faa118218d2569ce) ) // 128/64 FI
1759
1760   ROM_REGION( 0x1000, "charom", 0 )
1761   ROM_LOAD( "cbm 64 skand.gen.u5", 0x0000, 0x1000, CRC(377a382b) SHA1(20df25e0ba1c88f31689c1521397c96968967fac) )
1762
1763   ROM_REGION( 0x100, "pla", 0 )
1764   ROM_LOAD( "252715-01.u8", 0x000, 0x100, NO_DUMP )
1765ROM_END
1766
1767
1768//-------------------------------------------------
1769//  ROM( c64gs )
1770//-------------------------------------------------
1771
1772ROM_START( c64gs )
1773   ROM_REGION( 0x4000, M6510_TAG, 0 )
1774   ROM_LOAD( "390852-01.u4", 0x0000, 0x4000, CRC(b0a9c2da) SHA1(21940ef5f1bfe67d7537164f7ca130a1095b067a) )
1775
1776   ROM_REGION( 0x1000, "charom", 0 )
1777   ROM_LOAD( "901225-01.u5", 0x0000, 0x1000, CRC(ec4272ee) SHA1(adc7c31e18c7c7413d54802ef2f4193da14711aa) )
1778
1779   ROM_REGION( 0x100, "pla", 0 )
1780   ROM_LOAD( "252715-01.u8", 0x000, 0x100, NO_DUMP )
1781ROM_END
1782
1783
1784
1785//**************************************************************************
1786//  SYSTEM DRIVERS
1787//**************************************************************************
1788
1789//    YEAR  NAME    PARENT  COMPAT  MACHINE    INPUT      INIT    COMPANY                        FULLNAME                               FLAGS
1790COMP( 1982,   c64n,   0,     0,      ntsc,      c64,      0,      "Commodore Business Machines", "Commodore 64 (NTSC)",                    0 )
1791COMP( 1982,   c64j,   c64n,     0,      ntsc,      c64,      0,      "Commodore Business Machines", "Commodore 64 (Japan)",                   0 )
1792COMP( 1982,   c64p,   c64n,     0,      pal,      c64,      0,      "Commodore Business Machines", "Commodore 64 (PAL)",                    0 )
1793COMP( 1982,   c64sw,   c64n,   0,      pal,      c64sw,      0,      "Commodore Business Machines", "Commodore 64 / VIC-64S (Sweden/Finland)",    0 )
1794COMP( 1983, pet64,   c64n,     0,       pet64,      c64,        0,        "Commodore Business Machines", "PET 64 / CBM 4064 (NTSC)",                0 )
1795COMP( 1983, edu64,  c64n,     0,       pet64,      c64,        0,        "Commodore Business Machines", "Educator 64 (NTSC)",                   0 )
1796COMP( 1984, sx64n,   c64n,   0,      ntsc_sx,   c64,      0,      "Commodore Business Machines", "SX-64 / Executive 64 (NTSC)",             0 )
1797COMP( 1984, sx64p,   c64n,   0,      pal_sx,      c64,      0,      "Commodore Business Machines", "SX-64 / Executive 64 (PAL)",             0 )
1798COMP( 1984, vip64,   c64n,   0,      pal_sx,      c64sw,      0,      "Commodore Business Machines", "VIP-64 (Sweden/Finland)",               0 )
1799COMP( 1984, dx64,   c64n,   0,      ntsc_dx,   c64,      0,      "Commodore Business Machines", "DX-64 (NTSC)",                         0 )
1800//COMP(1983, clipper,  c64,  0, c64pal,  clipper, c64pal,  "PDC", "Clipper", GAME_NOT_WORKING) // C64 in a briefcase with 3" floppy, electroluminescent flat screen, thermal printer
1801//COMP(1983, tesa6240, c64,  0, c64pal,  c64,     c64pal,  "Tesa", "6240", GAME_NOT_WORKING) // modified SX64 with label printer
1802COMP( 1986, c64cn,   c64n,   0,       ntsc_c,      c64,      0,      "Commodore Business Machines", "Commodore 64C (NTSC)",                   0 )
1803COMP( 1986, c64cp,   c64n,   0,       pal_c,      c64,      0,      "Commodore Business Machines", "Commodore 64C (PAL)",                   0 )
1804COMP( 1986, c64csw,   c64n,   0,       pal_c,      c64sw,      0,      "Commodore Business Machines", "Commodore 64C (Sweden/Finland)",          0 )
1805COMP( 1986, c64g,   c64n,   0,      pal_c,      c64,      0,      "Commodore Business Machines", "Commodore 64G (PAL)",                   0 )
1806CONS( 1990, c64gs,   c64n,   0,      pal_gs,      c64gs,      0,      "Commodore Business Machines", "Commodore 64 Games System (PAL)",          0 )
src/mess/drivers/vic10.c
r0r14342
1/*
2 
3   TODO:
4 
5   - memory mapping with PLA
6   - PLA dump
7 
8*/
9 
10 
11 
12#include "includes/vic10.h"
13 
14 
15 
16//**************************************************************************
17//  INTERRUPTS
18//**************************************************************************
19 
20//-------------------------------------------------
21//  check_interrupts -
22//-------------------------------------------------
23 
24void vic10_state::check_interrupts()
25{
26   m_maincpu->set_input_line(INPUT_LINE_IRQ0, m_cia_irq | m_vic_irq | m_exp_irq);
27}
28 
29 
30 
31//**************************************************************************
32//  ADDRESS MAPS
33//**************************************************************************
34 
35//-------------------------------------------------
36//  ADDRESS_MAP( vic10_mem )
37//-------------------------------------------------
38 
39static ADDRESS_MAP_START( vic10_mem, AS_PROGRAM, 8, vic10_state )
40   AM_RANGE(0x0000, 0x07ff) AM_RAM
41   AM_RANGE(0x0800, 0x0fff) AM_DEVREADWRITE(VIC10_EXPANSION_SLOT_TAG, vic10_expansion_slot_device, exram_r, exram_w)
42   AM_RANGE(0x8000, 0x9fff) AM_DEVREADWRITE(VIC10_EXPANSION_SLOT_TAG, vic10_expansion_slot_device, lorom_r, lorom_w)
43   AM_RANGE(0xd000, 0xd3ff) AM_DEVREADWRITE_LEGACY(MOS6566_TAG, vic2_port_r, vic2_port_w)
44   AM_RANGE(0xd400, 0xd7ff) AM_DEVREADWRITE_LEGACY(MOS6581_TAG, sid6581_r, sid6581_w)
45   AM_RANGE(0xd800, 0xdbff) AM_RAM AM_BASE(m_color_ram)
46   AM_RANGE(0xdc00, 0xdcff) AM_DEVREADWRITE_LEGACY(MOS6526_TAG, mos6526_r, mos6526_w)
47   AM_RANGE(0xe000, 0xffff) AM_DEVREADWRITE(VIC10_EXPANSION_SLOT_TAG, vic10_expansion_slot_device, uprom_r, uprom_w)
48ADDRESS_MAP_END
49 
50 
51 
52//**************************************************************************
53//  INPUT PORTS
54//**************************************************************************
55 
56//-------------------------------------------------
57//  INPUT_PORTS( vic10 )
58//-------------------------------------------------
59 
60static INPUT_PORTS_START( vic10 )
61   PORT_INCLUDE( common_cbm_keyboard )      // ROW0 -> ROW7
62 
63   PORT_INCLUDE( c64_special )            // SPECIAL
64 
65   PORT_INCLUDE( c64_controls )         // CTRLSEL, JOY0, JOY1, PADDLE0 -> PADDLE3, TRACKX, TRACKY, LIGHTX, LIGHTY, OTHER
66INPUT_PORTS_END
67 
68 
69 
70//**************************************************************************
71//  DEVICE CONFIGURATION
72//**************************************************************************
73 
74//-------------------------------------------------
75//  vic2_interface vic_intf
76//-------------------------------------------------
77 
78static const unsigned char vic10_palette[] =
79{
80// black, white, red, cyan
81// purple, green, blue, yellow
82// orange, brown, light red, dark gray,
83// medium gray, light green, light blue, light gray
84// taken from the vice emulator
85   0x00, 0x00, 0x00,  0xfd, 0xfe, 0xfc,  0xbe, 0x1a, 0x24,  0x30, 0xe6, 0xc6,
86   0xb4, 0x1a, 0xe2,  0x1f, 0xd2, 0x1e,  0x21, 0x1b, 0xae,  0xdf, 0xf6, 0x0a,
87   0xb8, 0x41, 0x04,  0x6a, 0x33, 0x04,  0xfe, 0x4a, 0x57,  0x42, 0x45, 0x40,
88   0x70, 0x74, 0x6f,  0x59, 0xfe, 0x59,  0x5f, 0x53, 0xfe,  0xa4, 0xa7, 0xa2
89};
90 
91static PALETTE_INIT( vic10 )
92{
93   int i;
94 
95   for (i = 0; i < sizeof(vic10_palette) / 3; i++)
96   {
97      palette_set_color_rgb(machine, i, vic10_palette[i * 3], vic10_palette[i * 3 + 1], vic10_palette[i * 3 + 2]);
98   }
99}
100 
101UINT32 vic10_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
102{
103   vic2_video_update(m_vic, bitmap, cliprect);
104 
105   return 0;
106}
107 
108static INTERRUPT_GEN( vic10_frame_interrupt )
109{
110   cbm_common_interrupt(device);
111}
112 
113READ8_MEMBER( vic10_state::vic_lightpen_x_cb )
114{
115   return input_port_read(machine(), "LIGHTX") & ~0x01;
116}
117 
118READ8_MEMBER( vic10_state::vic_lightpen_y_cb )
119{
120   return input_port_read(machine(), "LIGHTY") & ~0x01;
121}
122 
123READ8_MEMBER( vic10_state::vic_lightpen_button_cb )
124{
125   return input_port_read(machine(), "OTHER") & 0x04;
126}
127 
128READ8_MEMBER( vic10_state::vic_dma_read )
129{
130   address_space *program = m_maincpu->memory().space(AS_PROGRAM);
131   
132   if (offset < 0x3000)
133      return program->read_byte(offset);
134 
135   return program->read_byte(0xe000 + (offset & 0x1fff));
136}
137 
138READ8_MEMBER( vic10_state::vic_dma_read_color )
139{
140   return m_color_ram[offset & 0x3ff] & 0x0f;
141}
142 
143WRITE_LINE_MEMBER( vic10_state::vic_irq_w )
144{
145   m_vic_irq = state;
146   
147   check_interrupts();
148}
149 
150READ8_MEMBER( vic10_state::vic_rdy_cb )
151{
152   return input_port_read(machine(), "CYCLES") & 0x07;
153}
154 
155static const vic2_interface vic_intf = 
156{
157   SCREEN_TAG,
158   M6510_TAG,
159   VIC6567,
160   DEVCB_DRIVER_MEMBER(vic10_state, vic_lightpen_x_cb),
161   DEVCB_DRIVER_MEMBER(vic10_state, vic_lightpen_y_cb),
162   DEVCB_DRIVER_MEMBER(vic10_state, vic_lightpen_button_cb),
163   DEVCB_DRIVER_MEMBER(vic10_state, vic_dma_read),
164   DEVCB_DRIVER_MEMBER(vic10_state, vic_dma_read_color),
165   DEVCB_DRIVER_LINE_MEMBER(vic10_state, vic_irq_w),
166   DEVCB_DRIVER_MEMBER(vic10_state, vic_rdy_cb)
167};
168 
169 
170//-------------------------------------------------
171//  sid6581_interface sid_intf
172//-------------------------------------------------
173 
174static int vic10_paddle_read( device_t *device, int which )
175{
176   running_machine &machine = device->machine();
177   vic10_state *state = device->machine().driver_data<vic10_state>();
178   
179   int pot1 = 0xff, pot2 = 0xff, pot3 = 0xff, pot4 = 0xff, temp;
180   UINT8 cia0porta = mos6526_pa_r(state->m_cia, 0);
181   int controller1 = input_port_read(machine, "CTRLSEL") & 0x07;
182   int controller2 = input_port_read(machine, "CTRLSEL") & 0x70;
183   // Notice that only a single input is defined for Mouse & Lightpen in both ports
184   switch (controller1)
185   {
186      case 0x01:
187         if (which)
188            pot2 = input_port_read(machine, "PADDLE2");
189         else
190            pot1 = input_port_read(machine, "PADDLE1");
191         break;
192 
193      case 0x02:
194         if (which)
195            pot2 = input_port_read(machine, "TRACKY");
196         else
197            pot1 = input_port_read(machine, "TRACKX");
198         break;
199 
200      case 0x03:
201         if (which && (input_port_read(machine, "JOY1_2B") & 0x20))   // Joy1 Button 2
202            pot1 = 0x00;
203         break;
204 
205      case 0x04:
206         if (which)
207            pot2 = input_port_read(machine, "LIGHTY");
208         else
209            pot1 = input_port_read(machine, "LIGHTX");
210         break;
211 
212      case 0x06:
213         if (which && (input_port_read(machine, "OTHER") & 0x04))   // Lightpen Signal
214            pot2 = 0x00;
215         break;
216 
217      case 0x00:
218      case 0x07:
219         break;
220 
221      default:
222         logerror("Invalid Controller Setting %d\n", controller1);
223         break;
224   }
225 
226   switch (controller2)
227   {
228      case 0x10:
229         if (which)
230            pot4 = input_port_read(machine, "PADDLE4");
231         else
232            pot3 = input_port_read(machine, "PADDLE3");
233         break;
234 
235      case 0x20:
236         if (which)
237            pot4 = input_port_read(machine, "TRACKY");
238         else
239            pot3 = input_port_read(machine, "TRACKX");
240         break;
241 
242      case 0x30:
243         if (which && (input_port_read(machine, "JOY2_2B") & 0x20))   // Joy2 Button 2
244            pot4 = 0x00;
245         break;
246 
247      case 0x40:
248         if (which)
249            pot4 = input_port_read(machine, "LIGHTY");
250         else
251            pot3 = input_port_read(machine, "LIGHTX");
252         break;
253 
254      case 0x60:
255         if (which && (input_port_read(machine, "OTHER") & 0x04))   // Lightpen Signal
256            pot4 = 0x00;
257         break;
258 
259      case 0x00:
260      case 0x70:
261         break;
262 
263      default:
264         logerror("Invalid Controller Setting %d\n", controller1);
265         break;
266   }
267 
268   if (input_port_read(machine, "CTRLSEL") & 0x80)      // Swap
269   {
270      temp = pot1; pot1 = pot3; pot3 = temp;
271      temp = pot2; pot2 = pot4; pot4 = temp;
272   }
273 
274   switch (cia0porta & 0xc0)
275   {
276      case 0x40:
277         return which ? pot2 : pot1;
278 
279      case 0x80:
280         return which ? pot4 : pot3;
281 
282      case 0xc0:
283         return which ? pot2 : pot1;
284 
285      default:
286         return 0;
287   }
288}
289 
290static const sid6581_interface sid_intf =
291{
292   vic10_paddle_read
293};
294 
295 
296//-------------------------------------------------
297//  mos6526_interface cia_intf
298//-------------------------------------------------
299 
300WRITE_LINE_MEMBER( vic10_state::cia_irq_w )
301{
302   m_cia_irq = state;
303   
304   check_interrupts();
305}
306 
307READ8_MEMBER( vic10_state::cia_pa_r )
308{
309   /*
310       
311      bit      description
312       
313      PA0      COL0, JOY B0
314      PA1      COL1, JOY B1
315      PA2      COL2, JOY B2
316      PA3      COL3, JOY B3
317      PA4      COL4, BTNB
318      PA5      COL5
319      PA6      COL6
320      PA7      COL7
321       
322   */
323 
324   UINT8 cia0portb = mos6526_pb_r(m_cia, 0);
325 
326   return cbm_common_cia0_port_a_r(m_cia, cia0portb);
327}
328 
329READ8_MEMBER( vic10_state::cia_pb_r )
330{
331   /*
332       
333      bit      description
334       
335      PB0      JOY A0
336      PB1      JOY A1
337      PB2      JOY A2
338      PB3      JOY A3
339      PB4      BTNA/_LP
340      PB5
341      PB6
342      PB7
343       
344   */
345 
346   UINT8 cia0porta = mos6526_pa_r(m_cia, 0);
347 
348   return cbm_common_cia0_port_b_r(m_cia, cia0porta);
349}
350 
351WRITE8_MEMBER( vic10_state::cia_pb_w )
352{
353   /*
354       
355      bit      description
356       
357      PB0      ROW0
358      PB1      ROW1
359      PB2      ROW2
360      PB3      ROW3
361      PB4      ROW4
362      PB5      ROW5
363      PB6      ROW6
364      PB7      ROW7
365       
366   */
367   
368   vic2_lightpen_write(m_vic, BIT(data, 4));
369}
370 
371static const mos6526_interface cia_intf =
372{
373   10,
374   DEVCB_DRIVER_LINE_MEMBER(vic10_state, cia_irq_w),
375   DEVCB_NULL,
376   DEVCB_DEVICE_LINE_MEMBER(VIC10_EXPANSION_SLOT_TAG, vic10_expansion_slot_device, sp_w),
377   DEVCB_DEVICE_LINE_MEMBER(VIC10_EXPANSION_SLOT_TAG, vic10_expansion_slot_device, cnt_w),
378   DEVCB_DRIVER_MEMBER(vic10_state, cia_pa_r),
379   DEVCB_NULL,
380   DEVCB_DRIVER_MEMBER(vic10_state, cia_pb_r),
381   DEVCB_DRIVER_MEMBER(vic10_state, cia_pb_w)
382};
383 
384 
385//-------------------------------------------------
386//  m6502_interface cpu_intf
387//-------------------------------------------------
388 
389READ8_MEMBER( vic10_state::cpu_r )
390{
391   /*
392       
393      bit      description
394       
395      P0      EXPANSION PORT
396      P1      1
397      P2      1
398      P3
399      P4      CASS SENS
400      P5       
401       
402   */
403   
404   UINT8 data = 0x06;
405   
406   data |= m_exp->p0_r();
407   
408   data |= ((m_cassette->get_state() & CASSETTE_MASK_UISTATE) == CASSETTE_STOPPED) << 4;
409   
410   return data;
411}
412 
413WRITE8_MEMBER( vic10_state::cpu_w )
414{
415   /*
416       
417      bit      description
418       
419      P0      EXPANSION PORT
420      P1       
421      P2       
422      P3      CASS WRT
423      P4
424      P5      CASS MOTOR
425       
426   */
427   
428   if (BIT(offset, 0))
429   {
430      m_exp->p0_w(BIT(data, 0));
431   }
432 
433   // cassette write
434   m_cassette->output(BIT(data, 3) ? -(0x5a9e >> 1) : +(0x5a9e >> 1));
435   
436   // cassette motor
437   if (!BIT(data, 5))
438   {
439      m_cassette->change_state(CASSETTE_MOTOR_ENABLED, CASSETTE_MASK_MOTOR);
440      m_cassette_timer->adjust(attotime::zero, 0, attotime::from_hz(44100));
441   }
442   else
443   {
444      m_cassette->change_state(CASSETTE_MOTOR_DISABLED, CASSETTE_MASK_MOTOR);
445      m_cassette_timer->reset();
446   }
447}
448 
449static const m6502_interface cpu_intf =
450{
451   NULL,
452   NULL,
453   DEVCB_DRIVER_MEMBER(vic10_state, cpu_r),
454   DEVCB_DRIVER_MEMBER(vic10_state, cpu_w)
455};
456 
457 
458//-------------------------------------------------
459//  TIMER_DEVICE_CALLBACK( cassette_tick )
460//-------------------------------------------------
461 
462static TIMER_DEVICE_CALLBACK( cassette_tick )
463{
464   vic10_state *state = timer.machine().driver_data<vic10_state>();
465 
466   mos6526_flag_w(state->m_cia, state->m_cassette->input() > +0.0);
467}
468 
469 
470//-------------------------------------------------
471//  C64_EXPANSION_INTERFACE( expansion_intf )
472//-------------------------------------------------
473 
474WRITE_LINE_MEMBER( vic10_state::exp_irq_w )
475{
476   m_exp_irq = state;
477   
478   check_interrupts();
479}
480 
481static VIC10_EXPANSION_INTERFACE( expansion_intf )
482{
483   DEVCB_DRIVER_LINE_MEMBER(vic10_state, exp_irq_w),
484   DEVCB_DEVICE_LINE(MOS6526_TAG, mos6526_sp_w),
485   DEVCB_DEVICE_LINE(MOS6526_TAG, mos6526_cnt_w),
486   DEVCB_CPU_INPUT_LINE(M6510_TAG, INPUT_LINE_RESET)
487};
488 
489 
490 
491//**************************************************************************
492//  MACHINE INITIALIZATION
493//**************************************************************************
494 
495//-------------------------------------------------
496//  MACHINE_START( vic10 )
497//-------------------------------------------------
498 
499void vic10_state::machine_start()
500{
501   // state saving
502   save_item(NAME(m_cia_irq));
503   save_item(NAME(m_vic_irq));
504   save_item(NAME(m_exp_irq));
505}
506 
507 
508//**************************************************************************
509//  MACHINE DRIVERS
510//**************************************************************************
511 
512//-------------------------------------------------
513//  MACHINE_CONFIG( vic10 )
514//-------------------------------------------------
515 
516static MACHINE_CONFIG_START( vic10, vic10_state )
517   // basic hardware
518   MCFG_CPU_ADD(M6510_TAG, M6510, XTAL_8MHz/8)
519   MCFG_CPU_PROGRAM_MAP(vic10_mem)
520   MCFG_CPU_CONFIG(cpu_intf)
521   MCFG_CPU_VBLANK_INT(SCREEN_TAG, vic10_frame_interrupt)
522   MCFG_QUANTUM_TIME(attotime::from_hz(60))
523 
524   // video hardware
525   MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
526   MCFG_SCREEN_REFRESH_RATE(VIC6567_VRETRACERATE)
527   MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
528   MCFG_SCREEN_SIZE(VIC6567_COLUMNS, VIC6567_LINES)
529   MCFG_SCREEN_VISIBLE_AREA(0, VIC6567_VISIBLECOLUMNS - 1, 0, VIC6567_VISIBLELINES - 1)
530   MCFG_SCREEN_UPDATE_DRIVER(vic10_state, screen_update)
531 
532   MCFG_PALETTE_INIT(vic10)
533   MCFG_PALETTE_LENGTH(ARRAY_LENGTH(vic10_palette) / 3)
534 
535   MCFG_VIC2_ADD(MOS6566_TAG, vic_intf)
536 
537   // sound hardware
538   MCFG_SPEAKER_STANDARD_MONO("mono")
539   MCFG_SOUND_ADD(MOS6581_TAG, SID6581, XTAL_8MHz/8)
540   MCFG_SOUND_CONFIG(sid_intf)
541   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
542   MCFG_SOUND_ADD("dac", DAC, 0)
543   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
544 
545   // devices
546   MCFG_MOS6526R1_ADD(MOS6526_TAG, XTAL_8MHz/8, cia_intf)
547   MCFG_CASSETTE_ADD(CASSETTE_TAG, cbm_cassette_interface)
548   MCFG_TIMER_ADD(TIMER_C1531_TAG, cassette_tick)
549   MCFG_VIC10_EXPANSION_SLOT_ADD(VIC10_EXPANSION_SLOT_TAG, expansion_intf, vic10_expansion_cards, NULL, NULL)
550 
551   // software list
552   MCFG_SOFTWARE_LIST_ADD("cart_list", "vic10")
553 
554   // internal ram
555   MCFG_RAM_ADD(RAM_TAG)
556   MCFG_RAM_DEFAULT_SIZE("4K")
557MACHINE_CONFIG_END
558 
559 
560 
561//**************************************************************************
562//  ROM DEFINITIONS
563//**************************************************************************
564 
565ROM_START( vic10 )
566   ROM_REGION( 0x100, "pla", 0 )
567   ROM_LOAD( "6703.u4", 0x000, 0x100, NO_DUMP )
568ROM_END
569 
570 
571 
572//**************************************************************************
573//  GAME DRIVERS
574//**************************************************************************
575 
576COMP( 1982, vic10,      0,    0,    vic10, vic10,     0, "Commodore Business Machines", "VIC-10 / Max Machine / UltiMax (NTSC)", GAME_NOT_WORKING )

Previous 15994 Revisions Next


© 1998-2018 The MESS Team