trunk/hash/scv.xml
r32469 | r32470 | |
63 | 63 | <year>1984</year> |
64 | 64 | <publisher>Epoch</publisher> |
65 | 65 | <part name="cart" interface="scv_cart"> |
| 66 | <feature name="slot" value="rom8k" /> |
66 | 67 | <dataarea name="rom" size="8192"> |
67 | 68 | <rom name="astrwrs.bin" size="8192" crc="2dbdb166" sha1="53a9a308b6f0bcb2137704f70657698719551b5e" offset="0000" /> |
68 | 69 | </dataarea> |
r32469 | r32470 | |
74 | 75 | <year>1984</year> |
75 | 76 | <publisher>Epoch</publisher> |
76 | 77 | <part name="cart" interface="scv_cart"> |
| 78 | <feature name="slot" value="rom8k" /> |
77 | 79 | <dataarea name="rom" size="8192"> |
78 | 80 | <rom name="astrwrs2.bin" size="8192" crc="34781de1" sha1="b419f2fccf3b2fbd360da2833064d2ea8bd6500b" offset="0000" /> |
79 | 81 | </dataarea> |
r32469 | r32470 | |
85 | 87 | <year>1985</year> |
86 | 88 | <publisher>Epoch</publisher> |
87 | 89 | <part name="cart" interface="scv_cart"> |
| 90 | <feature name="slot" value="rom32k" /> |
88 | 91 | <dataarea name="rom" size="32768"> |
89 | 92 | <rom name="basic.bin" size="32768" crc="ca965c2b" sha1="c68e2b81dec2c83e2aa5626c8df4011eada45245" offset="0000" /> |
90 | 93 | </dataarea> |
r32469 | r32470 | |
97 | 100 | <year>1984</year> |
98 | 101 | <publisher>Epoch</publisher> |
99 | 102 | <part name="cart" interface="scv_cart"> |
| 103 | <feature name="slot" value="rom16k" /> |
100 | 104 | <dataarea name="rom" size="16384"> |
101 | 105 | <rom name="baseball.bin" size="16384" crc="56f1c473" sha1="37a1dce6c1921950c588d6492cd1b57feb615175" offset="0000" /> |
102 | 106 | </dataarea> |
r32469 | r32470 | |
108 | 112 | <year>1985</year> |
109 | 113 | <publisher>Epoch</publisher> |
110 | 114 | <part name="cart" interface="scv_cart"> |
| 115 | <feature name="slot" value="rom16k" /> |
111 | 116 | <dataarea name="rom" size="16384"> |
112 | 117 | <rom name="boulder_dash.bin" size="16384" crc="e045884c" sha1="55942e5b7824314b072b7b40c6b72db0d5404189" offset="0" /> |
113 | 118 | </dataarea> |
r32469 | r32470 | |
119 | 124 | <year>1985</year> |
120 | 125 | <publisher>Epoch</publisher> |
121 | 126 | <part name="cart" interface="scv_cart"> |
| 127 | <feature name="slot" value="rom16k" /> |
122 | 128 | <dataarea name="rom" size="16384"> |
123 | 129 | <rom name="comic_circus.bin" size="16384" crc="ea55faed" sha1="2e4ceb2bf68d26c263c3d1c63f7e2143ef2355bc" offset="0" /> |
124 | 130 | </dataarea> |
r32469 | r32470 | |
130 | 136 | <year>1985</year> |
131 | 137 | <publisher>Epoch</publisher> |
132 | 138 | <part name="cart" interface="scv_cart"> |
| 139 | <feature name="slot" value="rom64k" /> |
133 | 140 | <dataarea name="rom" size="65536"> |
134 | 141 | <rom name="doraemon.0" size="32768" crc="ee0b874d" sha1="425eb6ed31faa2afdecc216145616f577f72db9a" offset="0" /> |
135 | 142 | <rom name="doraemon.1" size="32768" crc="d2de91a6" sha1="6aba5ee3d08afad222bec9a176c2607829fa5cc6" offset="0x8000" /> |
r32469 | r32470 | |
142 | 149 | <year>1986</year> |
143 | 150 | <publisher>Epoch</publisher> |
144 | 151 | <part name="cart" interface="scv_cart"> |
| 152 | <feature name="slot" value="rom128k" /> |
145 | 153 | <dataarea name="rom" size="131072"> |
146 | 154 | <rom name="dragonba.bin" size="131072" crc="ea251664" sha1="bd3791ed43a2019a255152e3fc0d8a663cb9567a" offset="0" /> |
147 | 155 | </dataarea> |
r32469 | r32470 | |
153 | 161 | <year>1986</year> |
154 | 162 | <publisher>Epoch</publisher> |
155 | 163 | <part name="cart" interface="scv_cart"> |
| 164 | <feature name="slot" value="rom32k_ram" /> |
156 | 165 | <dataarea name="rom" size="32768"> |
157 | 166 | <rom name="dragonsl.bin" size="32768" crc="5971940f" sha1="c6e67e05d365fa81d3d9a3ad66d41bfeb1c3dd0d" offset="0" /> |
158 | 167 | </dataarea> |
r32469 | r32470 | |
166 | 175 | <year>1984</year> |
167 | 176 | <publisher>Epoch</publisher> |
168 | 177 | <part name="cart" interface="scv_cart"> |
| 178 | <feature name="slot" value="rom16k" /> |
169 | 179 | <dataarea name="rom" size="16384"> |
170 | 180 | <rom name="elevfght.bin" size="16384" crc="72dd6031" sha1="8b2c185408309ee1e75d40299c003041db17b133" offset="0000" /> |
171 | 181 | </dataarea> |
r32469 | r32470 | |
178 | 188 | <year>1985</year> |
179 | 189 | <publisher>Epoch</publisher> |
180 | 190 | <part name="cart" interface="scv_cart"> |
| 191 | <feature name="slot" value="rom64k" /> |
181 | 192 | <dataarea name="rom" size="65536"> |
182 | 193 | <rom name="kungfurd.0" size="32768" crc="9cfc5a67" sha1="1c34470c1f389db7be755e130db298f6b475c7ce" offset="0" /> |
183 | 194 | <rom size="24576" offset="0x8000" loadflag="reload" /> |
r32469 | r32470 | |
191 | 202 | <year>1984</year> |
192 | 203 | <publisher>Epoch</publisher> |
193 | 204 | <part name="cart" interface="scv_cart"> |
| 205 | <feature name="slot" value="rom16k" /> |
194 | 206 | <dataarea name="rom" size="16384"> |
195 | 207 | <rom name="lupin3.bin" size="16384" crc="16d7eb4a" sha1="62698c7c9d9723f74214626a4211a3c3f34e9dd5" offset="0" /> |
196 | 208 | </dataarea> |
r32469 | r32470 | |
202 | 214 | <year>1986</year> |
203 | 215 | <publisher>Epoch</publisher> |
204 | 216 | <part name="cart" interface="scv_cart"> |
| 217 | <feature name="slot" value="rom32k" /> |
205 | 218 | <dataarea name="rom" size="32768"> |
206 | 219 | <rom name="mappy.bin" size="32768" crc="605829bb" sha1="70dc025ab3f32e18fd6f373dc47c9aa7fb9d48f0" offset="0" /> |
207 | 220 | </dataarea> |
r32469 | r32470 | |
213 | 226 | <year>1985</year> |
214 | 227 | <publisher>Epoch</publisher> |
215 | 228 | <part name="cart" interface="scv_cart"> |
| 229 | <feature name="slot" value="rom32k" /> |
216 | 230 | <dataarea name="rom" size="32768"> |
217 | 231 | <rom name="mlkprncs.bin" size="32768" crc="b2457990" sha1="b6234f99e474abd87a22a4b691b66bcb12e664cb" offset="0" /> |
218 | 232 | </dataarea> |
r32469 | r32470 | |
224 | 238 | <year>1985</year> |
225 | 239 | <publisher>Epoch</publisher> |
226 | 240 | <part name="cart" interface="scv_cart"> |
| 241 | <feature name="slot" value="rom16k" /> |
227 | 242 | <dataarea name="rom" size="16384"> |
228 | 243 | <rom name="miner_2049er.bin" size="16384" crc="b0ffc6e2" sha1="0414878f4aedade180b273257497c1d11cdccb2f" offset="0" /> |
229 | 244 | </dataarea> |
r32469 | r32470 | |
236 | 251 | <year>1986</year> |
237 | 252 | <publisher>Epoch</publisher> |
238 | 253 | <part name="cart" interface="scv_cart"> |
| 254 | <feature name="slot" value="rom128k" /> |
239 | 255 | <dataarea name="rom" size="131072"> |
240 | 256 | <rom name="y2mnstld.bin" size="131072" crc="3ac28fe0" sha1="5ae7796ad35a7c537de11ebd3cfe3868d67235a1" offset="0" /> |
241 | 257 | </dataarea> |
r32469 | r32470 | |
247 | 263 | <year>1984</year> |
248 | 264 | <publisher>Epoch</publisher> |
249 | 265 | <part name="cart" interface="scv_cart"> |
| 266 | <feature name="slot" value="rom16k" /> |
250 | 267 | <dataarea name="rom" size="16384"> |
251 | 268 | <rom name="nebula.bin" size="16384" crc="5e6a4caf" sha1="699eaf434e73a42e71adf52426b22f0dd85e2897" offset="0000" /> |
252 | 269 | </dataarea> |
r32469 | r32470 | |
258 | 275 | <year>1984</year> |
259 | 276 | <publisher>Epoch</publisher> |
260 | 277 | <part name="cart" interface="scv_cart"> |
| 278 | <feature name="slot" value="rom16k" /> |
261 | 279 | <dataarea name="rom" size="16384"> |
262 | 280 | <rom name="nebulaa.bin" size="16384" crc="efb4bdcd" sha1="94a4b9a92d6f9a5f4a68721be4cc35920ca32628" offset="0" /> |
263 | 281 | </dataarea> |
r32469 | r32470 | |
269 | 287 | <year>1985</year> |
270 | 288 | <publisher>Epoch</publisher> |
271 | 289 | <part name="cart" interface="scv_cart"> |
| 290 | <feature name="slot" value="rom128k_ram" /> |
272 | 291 | <dataarea name="rom" size="131072"> |
273 | 292 | <rom name="polepos2.bin" size="131072" crc="cb69903d" sha1="472900d7b7fa6cdf30014731dcc925ef5ca65499" offset="0" /> |
274 | 293 | </dataarea> |
r32469 | r32470 | |
282 | 301 | <year>1985</year> |
283 | 302 | <publisher>Epoch</publisher> |
284 | 303 | <part name="cart" interface="scv_cart"> |
| 304 | <feature name="slot" value="rom32k_ram" /> |
285 | 305 | <dataarea name="rom" size="32768"> |
286 | 306 | <rom name="popchips.bin" size="32768" crc="cc4fb04d" sha1="5979abd6051d531eafe1ea3b37c97ce2e3e97f8e" offset="0" /> |
287 | 307 | </dataarea> |
r32469 | r32470 | |
295 | 315 | <year>1986</year> |
296 | 316 | <publisher>Epoch</publisher> |
297 | 317 | <part name="cart" interface="scv_cart"> |
| 318 | <feature name="slot" value="rom128k" /> |
298 | 319 | <dataarea name="rom" size="131072"> |
299 | 320 | <rom name="prowrest.bin" size="131072" crc="5b1fb2a8" sha1="55fe356c04ce3db83cb3148d867cc8b8060cbb48" offset="0" /> |
300 | 321 | </dataarea> |
r32469 | r32470 | |
306 | 327 | <year>1984</year> |
307 | 328 | <publisher>Epoch</publisher> |
308 | 329 | <part name="cart" interface="scv_cart"> |
| 330 | <feature name="slot" value="rom16k" /> |
309 | 331 | <dataarea name="rom" size="16384"> |
310 | 332 | <rom name="punchboy.bin" size="16384" crc="4107f03a" sha1="e7391c71ba7deede3db22191ea058ccf429d7bb5" offset="0000" /> |
311 | 333 | </dataarea> |
r32469 | r32470 | |
317 | 339 | <year>1984</year> |
318 | 340 | <publisher>Epoch</publisher> |
319 | 341 | <part name="cart" interface="scv_cart"> |
| 342 | <feature name="slot" value="rom16k" /> |
320 | 343 | <dataarea name="rom" size="16384"> |
321 | 344 | <rom name="real_graphic_mahjong.bin" size="16384" crc="d3d9106c" sha1="7190ff2944c1ffbde6866e720417b86b3844ffa2" offset="0" /> |
322 | 345 | </dataarea> |
r32469 | r32470 | |
328 | 351 | <year>1986</year> |
329 | 352 | <publisher>Epoch</publisher> |
330 | 353 | <part name="cart" interface="scv_cart"> |
| 354 | <feature name="slot" value="rom64k" /> |
331 | 355 | <dataarea name="rom" size="65536"> |
332 | 356 | <rom name="skykid.bin" size="65536" crc="f49f2085" sha1="7342fe10d38c79ed12fbfa94b5fd4bf1266c2571" offset="0" /> |
333 | 357 | </dataarea> |
r32469 | r32470 | |
339 | 363 | <year>1985</year> |
340 | 364 | <publisher>Epoch</publisher> |
341 | 365 | <part name="cart" interface="scv_cart"> |
| 366 | <feature name="slot" value="rom64k" /> |
342 | 367 | <dataarea name="rom" size="65536"> |
343 | 368 | <rom name="starspeeder.1" size="8192" crc="7978c4a6" sha1="6bb5ff3946867fa7adb6561dc084ef5a7a92c507" offset="0" /> |
344 | 369 | <rom size="8192" offset="0x2000" loadflag="reload" /> |
r32469 | r32470 | |
354 | 379 | <year>1985</year> |
355 | 380 | <publisher>Epoch</publisher> |
356 | 381 | <part name="cart" interface="scv_cart"> |
| 382 | <feature name="slot" value="rom32k_ram" /> |
357 | 383 | <dataarea name="rom" size="32768"> |
358 | 384 | <rom name="shoginyu.bin" size="32768" crc="84005c4c" sha1="bd6681013dbbae94c03e501932836db07943468e" offset="0" /> |
359 | 385 | </dataarea> |
r32469 | r32470 | |
367 | 393 | <year>1985</year> |
368 | 394 | <publisher>Epoch</publisher> |
369 | 395 | <part name="cart" interface="scv_cart"> |
| 396 | <feature name="slot" value="rom32k" /> |
370 | 397 | <dataarea name="rom" size="32768"> |
371 | 398 | <rom name="sansupyuta.bin" size="32768" crc="6e7e01b5" sha1="dc05257c831cffa5ec66302c88e1d45a92c6dc9c" offset="0" /> |
372 | 399 | </dataarea> |
r32469 | r32470 | |
379 | 406 | <year>1985</year> |
380 | 407 | <publisher>Epoch</publisher> |
381 | 408 | <part name="cart" interface="scv_cart"> |
| 409 | <feature name="slot" value="rom16k" /> |
382 | 410 | <dataarea name="rom" size="16384"> |
383 | 411 | <rom name="soccer.bin" size="16384" crc="8283907c" sha1="61e4b8e43cc593b3a2e838c08f6dad6cca77d712" offset="0000" /> |
384 | 412 | </dataarea> |
r32469 | r32470 | |
391 | 419 | <year>1985</year> |
392 | 420 | <publisher>Epoch</publisher> |
393 | 421 | <part name="cart" interface="scv_cart"> |
| 422 | <feature name="slot" value="rom16k" /> |
394 | 423 | <dataarea name="rom" size="16384"> |
395 | 424 | <rom name="soccera.bin" size="16384" crc="590eeefd" sha1="951ecd2a1d2e7d900c13e91ff028723a9df9e60e" offset="0000" /> |
396 | 425 | </dataarea> |
r32469 | r32470 | |
403 | 432 | <year>1984</year> |
404 | 433 | <publisher>Epoch</publisher> |
405 | 434 | <part name="cart" interface="scv_cart"> |
| 435 | <feature name="slot" value="rom16k" /> |
406 | 436 | <dataarea name="rom" size="16384"> |
407 | 437 | <rom name="suprgolf.bin" size="16384" crc="0c0581c9" sha1="2d3ab09907a4a9c5d66306f316c7211f498cbcc2" offset="0000" /> |
408 | 438 | </dataarea> |
r32469 | r32470 | |
414 | 444 | <year>1985</year> |
415 | 445 | <publisher>Epoch</publisher> |
416 | 446 | <part name="cart" interface="scv_cart"> |
| 447 | <feature name="slot" value="rom16k" /> |
417 | 448 | <dataarea name="rom" size="16384"> |
418 | 449 | <rom name="ttball.bin" size="16384" crc="7f873bfa" sha1="093235ac2234c4c4e78a2addaab780d7a2cbe004" offset="0" /> |
419 | 450 | </dataarea> |
r32469 | r32470 | |
425 | 456 | <year>1985</year> |
426 | 457 | <publisher>Epoch</publisher> |
427 | 458 | <part name="cart" interface="scv_cart"> |
| 459 | <feature name="slot" value="rom16k" /> |
428 | 460 | <dataarea name="rom" size="16384"> |
429 | 461 | <rom name="wheelrcr.bin" size="16384" crc="9d9b29db" sha1="479f767384e7b7bfe58eeadd67dbe642fe8a2fcf" offset="0000" /> |
430 | 462 | </dataarea> |
trunk/hash/vboy.xml
r32469 | r32470 | |
21 | 21 | <info name="serial" value="VUE-VPBE-USA"/> |
22 | 22 | <info name="release" value="19960322"/> |
23 | 23 | <part name="cart" interface="vboy_cart"> |
| 24 | <feature name="slot" value="vb_rom" /> |
24 | 25 | <dataarea name="rom" size="2097152"> |
25 | 26 | <rom name="3-d tetris (usa).bin" size="1048576" crc="bb71b522" sha1="5177015a91442e56bd76af39447bca365e06c272" offset="000000" /> |
26 | 27 | <rom size="1048576" offset="0x100000" loadflag="reload" /> |
r32469 | r32470 | |
36 | 37 | <publisher>Nintendo</publisher> |
37 | 38 | <info name="serial" value="VUE-VBHE-JPN, VUE-VBHE-USA"/> |
38 | 39 | <part name="cart" interface="vboy_cart"> |
| 40 | <feature name="slot" value="vb_rom" /> |
39 | 41 | <dataarea name="rom" size="2097152"> |
40 | 42 | <rom name="bound high! (ju).bin" size="2097152" crc="e81a3703" sha1="1196ef8b9a96a0ff2f3634f8eb1c4865c0fb6b01" offset="000000" /> |
41 | 43 | </dataarea> |
r32469 | r32470 | |
50 | 52 | <info name="serial" value="VUE-VGPJ-JPN, VUE-VGPJ-USA"/> |
51 | 53 | <info name="release" value="19950701 (JPN), 19950814 (USA)"/> |
52 | 54 | <part name="cart" interface="vboy_cart"> |
| 55 | <feature name="slot" value="vb_rom" /> |
53 | 56 | <dataarea name="rom" size="2097152"> |
54 | 57 | <rom name="galactic pinball (japan, usa).bin" size="1048576" crc="c9710a36" sha1="93a25abf4f86e71a49c1c3a470140bb40cb693d6" offset="000000" /> |
55 | 58 | <rom size="1048576" offset="0x100000" loadflag="reload" /> |
r32469 | r32470 | |
65 | 68 | <info name="serial" value="VUE-VVGE-USA"/> |
66 | 69 | <info name="release" value="199511xx"/> |
67 | 70 | <part name="cart" interface="vboy_cart"> |
| 71 | <feature name="slot" value="vb_eeprom" /> |
68 | 72 | <dataarea name="rom" size="2097152"> |
69 | 73 | <rom name="golf (usa).bin" size="2097152" crc="2199af41" sha1="23ce3c174789cdd306497d86cb2c4e76ba8b06e5" offset="000000" /> |
70 | 74 | </dataarea> |
r32469 | r32470 | |
81 | 85 | <info name="serial" value="VUE-VIMJ-JPN"/> |
82 | 86 | <info name="release" value="19951013"/> |
83 | 87 | <part name="cart" interface="vboy_cart"> |
| 88 | <feature name="slot" value="vb_rom" /> |
84 | 89 | <dataarea name="rom" size="2097152"> |
85 | 90 | <rom name="innsmouth no yakata (japan).bin" size="1048576" crc="83cb6a00" sha1="37e06e53ce2810e870835c48decdd6c72079bfda" offset="000000" /> |
86 | 91 | <rom size="1048576" offset="0x100000" loadflag="reload" /> |
r32469 | r32470 | |
96 | 101 | <info name="serial" value="VUE-VJBE-USA"/> |
97 | 102 | <info name="release" value="19951020"/> |
98 | 103 | <part name="cart" interface="vboy_cart"> |
| 104 | <feature name="slot" value="vb_rom" /> |
99 | 105 | <dataarea name="rom" size="2097152"> |
100 | 106 | <rom name="jack bros. (usa).bin" size="1048576" crc="a44de03c" sha1="0e086d7ef2bd8b97315196943fd0b71da07aa8f1" offset="000000" /> |
101 | 107 | <rom size="1048576" offset="0x100000" loadflag="reload" /> |
r32469 | r32470 | |
111 | 117 | <info name="serial" value="VUE-VJBJ-JPN"/> |
112 | 118 | <info name="release" value="19950929"/> |
113 | 119 | <part name="cart" interface="vboy_cart"> |
| 120 | <feature name="slot" value="vb_rom" /> |
114 | 121 | <dataarea name="rom" size="2097152"> |
115 | 122 | <rom name="jack bros. no meiro de hiihoo! (japan).bin" size="1048576" crc="cab61e8b" sha1="a973406590382ee503037271330d68d2834b79db" offset="000000" /> |
116 | 123 | <rom size="1048576" offset="0x100000" loadflag="reload" /> |
r32469 | r32470 | |
126 | 133 | <info name="serial" value="VUE-VMCJ-JPN, VUE-VMCJ-USA"/> |
127 | 134 | <info name="release" value="19950928 (JPN), 199510xx (USA)"/> |
128 | 135 | <part name="cart" interface="vboy_cart"> |
| 136 | <feature name="slot" value="vb_rom" /> |
129 | 137 | <dataarea name="rom" size="2097152"> |
130 | 138 | <rom name="mario clash (japan, usa).bin" size="1048576" crc="a47de78c" sha1="7556a778b60490bdb81774bcbaa7413fc84cb985" offset="000000" /> |
131 | 139 | <rom size="1048576" offset="0x100000" loadflag="reload" /> |
r32469 | r32470 | |
141 | 149 | <info name="serial" value="VUE-VMTJ-JPN, VUE-VMTJ-USA"/> |
142 | 150 | <info name="release" value="19950721 (JPN), 19950814 (USA)"/> |
143 | 151 | <part name="cart" interface="vboy_cart"> |
| 152 | <feature name="slot" value="vb_rom" /> |
144 | 153 | <dataarea name="rom" size="2097152"> |
145 | 154 | <rom name="mario's tennis (japan, usa).bin" size="524288" crc="7ce7460d" sha1="5162f7fa9e3eae4338c53ccba641ba080c768754" offset="000000" /> |
146 | 155 | <rom size="524288" offset="0x080000" loadflag="reload" /> |
r32469 | r32470 | |
158 | 167 | <info name="serial" value="VUE-VNFE-USA"/> |
159 | 168 | <info name="release" value="19960226"/> |
160 | 169 | <part name="cart" interface="vboy_cart"> |
| 170 | <feature name="slot" value="vb_rom" /> |
161 | 171 | <dataarea name="rom" size="2097152"> |
162 | 172 | <rom name="nester's funky bowling (usa).bin" size="2097152" crc="df4d56b4" sha1="f4a4c7928f15102cf14c90c5f044e5f7cc7c32f9" offset="000000" /> |
163 | 173 | </dataarea> |
r32469 | r32470 | |
170 | 180 | <publisher>Bullet-Proof Software</publisher> |
171 | 181 | <info name="alt_title" value="ニコちゃんバトル"/> |
172 | 182 | <part name="cart" interface="vboy_cart"> |
| 183 | <feature name="slot" value="vb_rom" /> |
173 | 184 | <dataarea name="rom" size="2097152"> |
174 | 185 | <rom name="nikochan battle (j)(prototype).bin" size="1048576" crc="f3cd40dd" sha1="217ca062f65d4e8b2848085918af5ac4b33b12d4" offset="000000" /> |
175 | 186 | <rom size="1048576" offset="0x100000" loadflag="reload" /> |
r32469 | r32470 | |
185 | 196 | <info name="serial" value="VUE-VH2E-USA"/> |
186 | 197 | <info name="release" value="199512xx"/> |
187 | 198 | <part name="cart" interface="vboy_cart"> |
| 199 | <feature name="slot" value="vb_rom" /> |
188 | 200 | <dataarea name="rom" size="2097152"> |
189 | 201 | <rom name="panic bomber (usa).bin" size="524288" crc="19bb2dfb" sha1="80216b2874cf162f301d571bb8aebc98d80b4f3e" offset="000000" /> |
190 | 202 | <rom size="524288" offset="0x080000" loadflag="reload" /> |
r32469 | r32470 | |
202 | 214 | <info name="serial" value="VUE-VREE-USA"/> |
203 | 215 | <info name="release" value="19950814"/> |
204 | 216 | <part name="cart" interface="vboy_cart"> |
| 217 | <feature name="slot" value="vb_rom" /> |
205 | 218 | <dataarea name="rom" size="2097152"> |
206 | 219 | <rom name="red alarm (usa).bin" size="1048576" crc="aa10a7b4" sha1="494fa60cb8997880b4e8cd3270b21d6c2768a48a" offset="000000" /> |
207 | 220 | <rom size="1048576" offset="0x100000" loadflag="reload" /> |
r32469 | r32470 | |
217 | 230 | <info name="serial" value="VUE-VREJ-JPN"/> |
218 | 231 | <info name="release" value="19950721"/> |
219 | 232 | <part name="cart" interface="vboy_cart"> |
| 233 | <feature name="slot" value="vb_rom" /> |
220 | 234 | <dataarea name="rom" size="2097152"> |
221 | 235 | <rom name="red alarm (japan).bin" size="1048576" crc="7e85c45d" sha1="f5057fa9bfd9d60b9dcfc004cfdd12aa8eb1cb4a" offset="000000" /> |
222 | 236 | <rom size="1048576" offset="0x100000" loadflag="reload" /> |
r32469 | r32470 | |
232 | 246 | <info name="serial" value="VUE-VSDJ-JPN"/> |
233 | 247 | <info name="release" value="19951222"/> |
234 | 248 | <part name="cart" interface="vboy_cart"> |
| 249 | <feature name="slot" value="vb_rom" /> |
235 | 250 | <dataarea name="rom" size="2097152"> |
236 | 251 | <rom name="sd gundam - dimension war (japan).bin" size="1048576" crc="44788197" sha1="1a67f6bdb45db46e22b8aadea754a68ad379ae29" offset="000000" /> |
237 | 252 | <rom size="1048576" offset="0x100000" loadflag="reload" /> |
r32469 | r32470 | |
247 | 262 | <info name="serial" value="VUE-VSPJ-JPN"/> |
248 | 263 | <info name="release" value="19951201"/> |
249 | 264 | <part name="cart" interface="vboy_cart"> |
| 265 | <feature name="slot" value="vb_rom" /> |
250 | 266 | <dataarea name="rom" size="2097152"> |
251 | 267 | <rom name="space invaders - virtual collection (japan).bin" size="524288" crc="fa44402d" sha1="16ad904faafd24642dfd056d10a768e81f0d9bfa" offset="000000" /> |
252 | 268 | <rom size="524288" offset="0x080000" loadflag="reload" /> |
r32469 | r32470 | |
261 | 277 | <year>1995</year> |
262 | 278 | <publisher>Nintendo</publisher> |
263 | 279 | <part name="cart" interface="vboy_cart"> |
| 280 | <feature name="slot" value="vb_rom" /> |
264 | 281 | <dataarea name="rom" size="2097152"> |
265 | 282 | <rom name="space pinball prototype (j).bin" size="2097152" crc="44c2b723" sha1="dc182360c7c8d26323db8921f09db76638e81ced" offset="000000" /> |
266 | 283 | </dataarea> |
r32469 | r32470 | |
275 | 292 | <info name="serial" value="VUE-VSSJ-JPN"/> |
276 | 293 | <info name="release" value="19950929"/> |
277 | 294 | <part name="cart" interface="vboy_cart"> |
| 295 | <feature name="slot" value="vb_rom" /> |
278 | 296 | <dataarea name="rom" size="2097152"> |
279 | 297 | <rom name="space squash (japan).bin" size="524288" crc="60895693" sha1="3f08cae2b6f9e386529949ff954220860db1af64" offset="000000" /> |
280 | 298 | <rom size="524288" offset="0x080000" loadflag="reload" /> |
r32469 | r32470 | |
292 | 310 | <info name="serial" value="VUE-VTBJ-JPN, VUE-VTBJ-USA"/> |
293 | 311 | <info name="release" value="19950721 (JPN), 19950814 (USA)"/> |
294 | 312 | <part name="cart" interface="vboy_cart"> |
| 313 | <feature name="slot" value="vb_eeprom" /> |
295 | 314 | <dataarea name="rom" size="2097152"> |
296 | 315 | <rom name="teleroboxer (japan, usa).bin" size="1048576" crc="36103000" sha1="c59e020f9674774c5cbc022317ebba0eb1d744f7" offset="000000" /> |
297 | 316 | <rom size="1048576" offset="0x100000" loadflag="reload" /> |
r32469 | r32470 | |
309 | 328 | <info name="serial" value="VUE-VH2J-JPN"/> |
310 | 329 | <info name="release" value="19950721"/> |
311 | 330 | <part name="cart" interface="vboy_cart"> |
| 331 | <feature name="slot" value="vb_rom" /> |
312 | 332 | <dataarea name="rom" size="2097152"> |
313 | 333 | <rom name="tobidase! panibon (japan).bin" size="524288" crc="40498f5e" sha1="b8a12a9677afa5cbce6ed43eb0effb5a02875534" offset="000000" /> |
314 | 334 | <rom size="524288" offset="0x080000" loadflag="reload" /> |
r32469 | r32470 | |
326 | 346 | <info name="serial" value="VUE-VVBJ-JPN"/> |
327 | 347 | <info name="release" value="19951222"/> |
328 | 348 | <part name="cart" interface="vboy_cart"> |
| 349 | <feature name="slot" value="vb_rom" /> |
329 | 350 | <dataarea name="rom" size="2097152"> |
330 | 351 | <rom name="virtual bowling (japan).bin" size="1048576" crc="20688279" sha1="a5be7654037050f0a781e70efea0191f43d26f06" offset="000000" /> |
331 | 352 | <rom size="1048576" offset="0x100000" loadflag="reload" /> |
r32469 | r32470 | |
341 | 362 | <info name="serial" value="VUE-VVFJ-JPN"/> |
342 | 363 | <info name="release" value="19951016"/> |
343 | 364 | <part name="cart" interface="vboy_cart"> |
| 365 | <feature name="slot" value="vb_eeprom" /> |
344 | 366 | <dataarea name="rom" size="2097152"> |
345 | 367 | <rom name="virtual fishing (japan).bin" size="1048576" crc="526cc969" sha1="583b409b7215159219d08e789db46140062095f2" offset="000000" /> |
346 | 368 | <rom size="1048576" offset="0x100000" loadflag="reload" /> |
r32469 | r32470 | |
358 | 380 | <info name="serial" value="VUE-VH3E-USA"/> |
359 | 381 | <info name="release" value="19951201"/> |
360 | 382 | <part name="cart" interface="vboy_cart"> |
| 383 | <feature name="slot" value="vb_rom" /> |
361 | 384 | <dataarea name="rom" size="2097152"> |
362 | 385 | <rom name="vertical force (usa).bin" size="1048576" crc="4c32ba5e" sha1="38f9008f60b09deef1151d46b905b090a0338200" offset="000000" /> |
363 | 386 | <rom size="1048576" offset="0x100000" loadflag="reload" /> |
r32469 | r32470 | |
373 | 396 | <info name="serial" value="VUE-VH3J-JPN"/> |
374 | 397 | <info name="release" value="19950812"/> |
375 | 398 | <part name="cart" interface="vboy_cart"> |
| 399 | <feature name="slot" value="vb_rom" /> |
376 | 400 | <dataarea name="rom" size="2097152"> |
377 | 401 | <rom name="vertical force (japan).bin" size="1048576" crc="9e9b8b92" sha1="c7204ba5cfe7d26394b5e22badc580c8ed8c0b37" offset="000000" /> |
378 | 402 | <rom size="1048576" offset="0x100000" loadflag="reload" /> |
r32469 | r32470 | |
388 | 412 | <info name="serial" value="VUE-VVGJ-JPN"/> |
389 | 413 | <info name="release" value="19950811"/> |
390 | 414 | <part name="cart" interface="vboy_cart"> |
| 415 | <feature name="slot" value="vb_eeprom" /> |
391 | 416 | <dataarea name="rom" size="2097152"> |
392 | 417 | <rom name="t&e virtual golf (japan).bin" size="2097152" crc="6ba07915" sha1="c595285d42c69f14b2b418c1edfbe4a7f9a624b6" offset="000000" /> |
393 | 418 | </dataarea> |
r32469 | r32470 | |
404 | 429 | <info name="serial" value="VUE-VJVJ-JPN"/> |
405 | 430 | <info name="release" value="19951208"/> |
406 | 431 | <part name="cart" interface="vboy_cart"> |
| 432 | <feature name="slot" value="vb_rom" /> |
407 | 433 | <dataarea name="rom" size="2097152"> |
408 | 434 | <rom name="virtual lab (japan).bin" size="1048576" crc="8989fe0a" sha1="d96c9f8aac5b4ea012a8fe659bb68fb1159a9c6d" offset="000000" /> |
409 | 435 | <rom size="1048576" offset="0x100000" loadflag="reload" /> |
r32469 | r32470 | |
419 | 445 | <info name="serial" value="VUE-VVPE-USA"/> |
420 | 446 | <info name="release" value="19950911"/> |
421 | 447 | <part name="cart" interface="vboy_cart"> |
| 448 | <feature name="slot" value="vb_rom" /> |
422 | 449 | <dataarea name="rom" size="2097152"> |
423 | 450 | <rom name="virtual league baseball (usa).bin" size="1048576" crc="736b40d6" sha1="266fe615ee3df1160a20b456824699f16810fa28" offset="000000" /> |
424 | 451 | <rom size="1048576" offset="0x100000" loadflag="reload" /> |
r32469 | r32470 | |
434 | 461 | <info name="serial" value="VUE-VVPJ-JPN"/> |
435 | 462 | <info name="release" value="19950811"/> |
436 | 463 | <part name="cart" interface="vboy_cart"> |
| 464 | <feature name="slot" value="vb_rom" /> |
437 | 465 | <dataarea name="rom" size="2097152"> |
438 | 466 | <rom name="virtual pro yakyuu '95 (japan).bin" size="1048576" crc="9ba8bb5e" sha1="ab8fa82b79512eefefccdccea6768078a374c4aa" offset="000000" /> |
439 | 467 | <rom size="1048576" offset="0x100000" loadflag="reload" /> |
r32469 | r32470 | |
449 | 477 | <info name="serial" value="VUE-VTRJ-JPN"/> |
450 | 478 | <info name="release" value="19950825"/> |
451 | 479 | <part name="cart" interface="vboy_cart"> |
| 480 | <feature name="slot" value="vb_rom" /> |
452 | 481 | <dataarea name="rom" size="2097152"> |
453 | 482 | <rom name="v-tetris (japan).bin" size="524288" crc="3ccb67ae" sha1="ff7d4dfc467e6e0d3fe8517102132a65a9d17589" offset="000000" /> |
454 | 483 | <rom size="524288" offset="0x080000" loadflag="reload" /> |
r32469 | r32470 | |
466 | 495 | <info name="serial" value="VUE-VWCJ-JPN, VUE-VWCJ-USA"/> |
467 | 496 | <info name="release" value="19951201 (JPN), 199511xx (USA)"/> |
468 | 497 | <part name="cart" interface="vboy_cart"> |
| 498 | <feature name="slot" value="vb_eeprom" /> |
469 | 499 | <dataarea name="rom" size="2097152"> |
470 | 500 | <rom name="virtual boy wario land (japan, usa).bin" size="2097152" crc="133e9372" sha1="274c328fbd904f20e69172ab826bf8f94ced1bdb" offset="000000" /> |
471 | 501 | </dataarea> |
r32469 | r32470 | |
482 | 512 | <info name="serial" value="VUE-VWEE-USA"/> |
483 | 513 | <info name="release" value="19951221"/> |
484 | 514 | <part name="cart" interface="vboy_cart"> |
| 515 | <feature name="slot" value="vb_rom" /> |
485 | 516 | <dataarea name="rom" size="2097152"> |
486 | 517 | <rom name="waterworld (usa).bin" size="2097152" crc="82a95e51" sha1="dcc46484bd0acab0ac1ea178f425a0f5ccfb8dc2" offset="000000" /> |
487 | 518 | </dataarea> |
trunk/src/emu/bus/scv/rom.c
r0 | r32470 | |
| 1 | /*********************************************************************************************************** |
| 2 | |
| 3 | |
| 4 | Epoch Super Cassette Vision cart emulation |
| 5 | |
| 6 | |
| 7 | ***********************************************************************************************************/ |
| 8 | |
| 9 | |
| 10 | #include "emu.h" |
| 11 | #include "rom.h" |
| 12 | |
| 13 | |
| 14 | //------------------------------------------------- |
| 15 | // scv_rom_device - constructor |
| 16 | //------------------------------------------------- |
| 17 | |
| 18 | const device_type SCV_ROM8K = &device_creator<scv_rom8_device>; |
| 19 | const device_type SCV_ROM16K = &device_creator<scv_rom16_device>; |
| 20 | const device_type SCV_ROM32K = &device_creator<scv_rom32_device>; |
| 21 | const device_type SCV_ROM32K_RAM8K = &device_creator<scv_rom32ram8_device>; |
| 22 | const device_type SCV_ROM64K = &device_creator<scv_rom64_device>; |
| 23 | const device_type SCV_ROM128K = &device_creator<scv_rom128_device>; |
| 24 | const device_type SCV_ROM128K_RAM4K = &device_creator<scv_rom128ram4_device>; |
| 25 | |
| 26 | |
| 27 | scv_rom8_device::scv_rom8_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source) |
| 28 | : device_t(mconfig, type, name, tag, owner, clock, shortname, source), |
| 29 | device_scv_cart_interface( mconfig, *this ) |
| 30 | { |
| 31 | } |
| 32 | |
| 33 | scv_rom8_device::scv_rom8_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 34 | : device_t(mconfig, SCV_ROM8K, "SCV 8K Carts", tag, owner, clock, "scv_rom8", __FILE__), |
| 35 | device_scv_cart_interface( mconfig, *this ) |
| 36 | { |
| 37 | } |
| 38 | |
| 39 | scv_rom16_device::scv_rom16_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 40 | : scv_rom8_device(mconfig, SCV_ROM16K, "SCV 16K Carts", tag, owner, clock, "scv_rom16", __FILE__) |
| 41 | { |
| 42 | } |
| 43 | |
| 44 | scv_rom32_device::scv_rom32_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 45 | : scv_rom8_device(mconfig, SCV_ROM32K, "SCV 32K Carts", tag, owner, clock, "scv_rom32", __FILE__) |
| 46 | { |
| 47 | } |
| 48 | |
| 49 | scv_rom32ram8_device::scv_rom32ram8_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 50 | : scv_rom8_device(mconfig, SCV_ROM32K_RAM8K, "SCV 32K + RAM 8K Carts", tag, owner, clock, "scv_rom32_ram8", __FILE__) |
| 51 | { |
| 52 | } |
| 53 | |
| 54 | scv_rom64_device::scv_rom64_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 55 | : scv_rom8_device(mconfig, SCV_ROM16K, "SCV 64K Carts", tag, owner, clock, "scv_rom64", __FILE__) |
| 56 | { |
| 57 | } |
| 58 | |
| 59 | scv_rom128_device::scv_rom128_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 60 | : scv_rom8_device(mconfig, SCV_ROM32K, "SCV 128K Carts", tag, owner, clock, "scv_rom128", __FILE__) |
| 61 | { |
| 62 | } |
| 63 | |
| 64 | scv_rom128ram4_device::scv_rom128ram4_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 65 | : scv_rom8_device(mconfig, SCV_ROM128K_RAM4K, "SCV 128K + RAM 4K Carts", tag, owner, clock, "scv_rom128_ram4", __FILE__) |
| 66 | { |
| 67 | } |
| 68 | |
| 69 | |
| 70 | //------------------------------------------------- |
| 71 | // mapper specific start/reset |
| 72 | //------------------------------------------------- |
| 73 | |
| 74 | void scv_rom32ram8_device::device_start() |
| 75 | { |
| 76 | save_item(NAME(m_ram_enabled)); |
| 77 | } |
| 78 | |
| 79 | void scv_rom32ram8_device::device_reset() |
| 80 | { |
| 81 | m_ram_enabled = 1; |
| 82 | } |
| 83 | |
| 84 | |
| 85 | void scv_rom64_device::device_start() |
| 86 | { |
| 87 | save_item(NAME(m_bank_base)); |
| 88 | } |
| 89 | |
| 90 | void scv_rom64_device::device_reset() |
| 91 | { |
| 92 | m_bank_base = 0; |
| 93 | } |
| 94 | |
| 95 | |
| 96 | void scv_rom128_device::device_start() |
| 97 | { |
| 98 | save_item(NAME(m_bank_base)); |
| 99 | } |
| 100 | |
| 101 | void scv_rom128_device::device_reset() |
| 102 | { |
| 103 | m_bank_base = 0; |
| 104 | } |
| 105 | |
| 106 | |
| 107 | void scv_rom128ram4_device::device_start() |
| 108 | { |
| 109 | save_item(NAME(m_bank_base)); |
| 110 | save_item(NAME(m_ram_enabled)); |
| 111 | } |
| 112 | |
| 113 | void scv_rom128ram4_device::device_reset() |
| 114 | { |
| 115 | m_bank_base = 0; |
| 116 | m_ram_enabled = 1; |
| 117 | } |
| 118 | |
| 119 | |
| 120 | |
| 121 | /*------------------------------------------------- |
| 122 | mapper specific handlers |
| 123 | -------------------------------------------------*/ |
| 124 | |
| 125 | READ8_MEMBER(scv_rom8_device::read_cart) |
| 126 | { |
| 127 | return m_rom[offset & 0x1fff]; |
| 128 | } |
| 129 | |
| 130 | |
| 131 | READ8_MEMBER(scv_rom16_device::read_cart) |
| 132 | { |
| 133 | return m_rom[offset & 0x3fff]; |
| 134 | } |
| 135 | |
| 136 | |
| 137 | READ8_MEMBER(scv_rom32_device::read_cart) |
| 138 | { |
| 139 | return m_rom[offset]; |
| 140 | } |
| 141 | |
| 142 | |
| 143 | READ8_MEMBER(scv_rom32ram8_device::read_cart) |
| 144 | { |
| 145 | if (m_ram_enabled && offset >= 0x6000) |
| 146 | return m_ram[offset & 0x1fff]; |
| 147 | |
| 148 | return m_rom[offset]; |
| 149 | } |
| 150 | |
| 151 | WRITE8_MEMBER(scv_rom32ram8_device::write_cart) |
| 152 | { |
| 153 | if (m_ram_enabled && offset >= 0x6000) |
| 154 | m_ram[offset & 0x1fff] = data; |
| 155 | } |
| 156 | |
| 157 | WRITE8_MEMBER(scv_rom32ram8_device::write_bank) |
| 158 | { |
| 159 | m_ram_enabled = BIT(data, 5); |
| 160 | } |
| 161 | |
| 162 | |
| 163 | READ8_MEMBER(scv_rom64_device::read_cart) |
| 164 | { |
| 165 | return m_rom[offset + (m_bank_base * 0x8000)]; |
| 166 | } |
| 167 | |
| 168 | WRITE8_MEMBER(scv_rom64_device::write_bank) |
| 169 | { |
| 170 | m_bank_base = BIT(data, 5); |
| 171 | } |
| 172 | |
| 173 | |
| 174 | READ8_MEMBER(scv_rom128_device::read_cart) |
| 175 | { |
| 176 | return m_rom[offset + (m_bank_base * 0x8000)]; |
| 177 | } |
| 178 | |
| 179 | WRITE8_MEMBER(scv_rom128_device::write_bank) |
| 180 | { |
| 181 | m_bank_base = (data >> 5) & 0x03; |
| 182 | } |
| 183 | |
| 184 | |
| 185 | READ8_MEMBER(scv_rom128ram4_device::read_cart) |
| 186 | { |
| 187 | if (m_ram_enabled && offset >= 0x7000) |
| 188 | return m_ram[offset & 0xfff]; |
| 189 | |
| 190 | return m_rom[offset + (m_bank_base * 0x8000)]; |
| 191 | } |
| 192 | |
| 193 | WRITE8_MEMBER(scv_rom128ram4_device::write_cart) |
| 194 | { |
| 195 | if (m_ram_enabled && offset >= 0x7000) |
| 196 | m_ram[offset & 0xfff] = data; |
| 197 | } |
| 198 | |
| 199 | WRITE8_MEMBER(scv_rom128ram4_device::write_bank) |
| 200 | { |
| 201 | m_bank_base = (data >> 5) & 0x03; |
| 202 | m_ram_enabled = BIT(data, 6); |
| 203 | } |
trunk/src/emu/bus/scv/slot.c
r0 | r32470 | |
| 1 | /*********************************************************************************************************** |
| 2 | |
| 3 | Epoch Super Cassette Vision cart emulation |
| 4 | (through slot devices) |
| 5 | |
| 6 | ***********************************************************************************************************/ |
| 7 | |
| 8 | |
| 9 | #include "emu.h" |
| 10 | #include "slot.h" |
| 11 | |
| 12 | //************************************************************************** |
| 13 | // GLOBAL VARIABLES |
| 14 | //************************************************************************** |
| 15 | |
| 16 | const device_type SCV_CART_SLOT = &device_creator<scv_cart_slot_device>; |
| 17 | |
| 18 | //************************************************************************** |
| 19 | // SCV cartridges Interface |
| 20 | //************************************************************************** |
| 21 | |
| 22 | //------------------------------------------------- |
| 23 | // device_scv_cart_interface - constructor |
| 24 | //------------------------------------------------- |
| 25 | |
| 26 | device_scv_cart_interface::device_scv_cart_interface(const machine_config &mconfig, device_t &device) |
| 27 | : device_slot_card_interface(mconfig, device), |
| 28 | m_rom(NULL), |
| 29 | m_rom_size(0) |
| 30 | { |
| 31 | } |
| 32 | |
| 33 | |
| 34 | //------------------------------------------------- |
| 35 | // ~device_scv_cart_interface - destructor |
| 36 | //------------------------------------------------- |
| 37 | |
| 38 | device_scv_cart_interface::~device_scv_cart_interface() |
| 39 | { |
| 40 | } |
| 41 | |
| 42 | //------------------------------------------------- |
| 43 | // rom_alloc - alloc the space for the cart |
| 44 | //------------------------------------------------- |
| 45 | |
| 46 | void device_scv_cart_interface::rom_alloc(UINT32 size, const char *tag) |
| 47 | { |
| 48 | if (m_rom == NULL) |
| 49 | { |
| 50 | astring tempstring(tag); |
| 51 | tempstring.cat(SCVSLOT_ROM_REGION_TAG); |
| 52 | m_rom = device().machine().memory().region_alloc(tempstring, size, 1, ENDIANNESS_LITTLE)->base(); |
| 53 | m_rom_size = size; |
| 54 | } |
| 55 | } |
| 56 | |
| 57 | |
| 58 | //------------------------------------------------- |
| 59 | // ram_alloc - alloc the space for the ram |
| 60 | //------------------------------------------------- |
| 61 | |
| 62 | void device_scv_cart_interface::ram_alloc(UINT32 size) |
| 63 | { |
| 64 | m_ram.resize(size); |
| 65 | } |
| 66 | |
| 67 | |
| 68 | //************************************************************************** |
| 69 | // LIVE DEVICE |
| 70 | //************************************************************************** |
| 71 | |
| 72 | //------------------------------------------------- |
| 73 | // scv_cart_slot_device - constructor |
| 74 | //------------------------------------------------- |
| 75 | scv_cart_slot_device::scv_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : |
| 76 | device_t(mconfig, SCV_CART_SLOT, "SCV Cartridge Slot", tag, owner, clock, "scv_cart_slot", __FILE__), |
| 77 | device_image_interface(mconfig, *this), |
| 78 | device_slot_interface(mconfig, *this), |
| 79 | m_type(SCV_8K) |
| 80 | { |
| 81 | } |
| 82 | |
| 83 | |
| 84 | //------------------------------------------------- |
| 85 | // scv_cart_slot_device - destructor |
| 86 | //------------------------------------------------- |
| 87 | |
| 88 | scv_cart_slot_device::~scv_cart_slot_device() |
| 89 | { |
| 90 | } |
| 91 | |
| 92 | //------------------------------------------------- |
| 93 | // device_start - device-specific startup |
| 94 | //------------------------------------------------- |
| 95 | |
| 96 | void scv_cart_slot_device::device_start() |
| 97 | { |
| 98 | m_cart = dynamic_cast<device_scv_cart_interface *>(get_card_device()); |
| 99 | } |
| 100 | |
| 101 | //------------------------------------------------- |
| 102 | // device_config_complete - perform any |
| 103 | // operations now that the configuration is |
| 104 | // complete |
| 105 | //------------------------------------------------- |
| 106 | |
| 107 | void scv_cart_slot_device::device_config_complete() |
| 108 | { |
| 109 | // set brief and instance name |
| 110 | update_names(); |
| 111 | } |
| 112 | |
| 113 | |
| 114 | //------------------------------------------------- |
| 115 | // SCV PCB |
| 116 | //------------------------------------------------- |
| 117 | |
| 118 | struct scv_slot |
| 119 | { |
| 120 | int pcb_id; |
| 121 | const char *slot_option; |
| 122 | }; |
| 123 | |
| 124 | // Here, we take the feature attribute from .xml (i.e. the PCB name) and we assign a unique ID to it |
| 125 | static const scv_slot slot_list[] = |
| 126 | { |
| 127 | { SCV_8K, "rom8k" }, |
| 128 | { SCV_16K, "rom16k" }, |
| 129 | { SCV_32K, "rom32k" }, |
| 130 | { SCV_32K_RAM, "rom32k_ram" }, |
| 131 | { SCV_64K, "rom64k" }, |
| 132 | { SCV_128K, "rom128k" }, |
| 133 | { SCV_128K_RAM, "rom128k_ram" } |
| 134 | }; |
| 135 | |
| 136 | static int scv_get_pcb_id(const char *slot) |
| 137 | { |
| 138 | for (int i = 0; i < ARRAY_LENGTH(slot_list); i++) |
| 139 | { |
| 140 | if (!core_stricmp(slot_list[i].slot_option, slot)) |
| 141 | return slot_list[i].pcb_id; |
| 142 | } |
| 143 | |
| 144 | return 0; |
| 145 | } |
| 146 | |
| 147 | static const char *scv_get_slot(int type) |
| 148 | { |
| 149 | for (int i = 0; i < ARRAY_LENGTH(slot_list); i++) |
| 150 | { |
| 151 | if (slot_list[i].pcb_id == type) |
| 152 | return slot_list[i].slot_option; |
| 153 | } |
| 154 | |
| 155 | return "rom8k"; |
| 156 | } |
| 157 | |
| 158 | |
| 159 | /*------------------------------------------------- |
| 160 | call load |
| 161 | -------------------------------------------------*/ |
| 162 | |
| 163 | bool scv_cart_slot_device::call_load() |
| 164 | { |
| 165 | if (m_cart) |
| 166 | { |
| 167 | UINT8 *ROM; |
| 168 | UINT32 len = (software_entry() == NULL) ? length() : get_software_region_length("rom"); |
| 169 | bool has_ram = (software_entry() != NULL) && get_software_region("ram"); |
| 170 | |
| 171 | if (len > 0x20000) |
| 172 | { |
| 173 | seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size"); |
| 174 | return IMAGE_INIT_FAIL; |
| 175 | } |
| 176 | |
| 177 | m_cart->rom_alloc(len, tag()); |
| 178 | if (has_ram) |
| 179 | m_cart->ram_alloc(get_software_region_length("ram")); |
| 180 | |
| 181 | ROM = m_cart->get_rom_base(); |
| 182 | |
| 183 | if (software_entry() == NULL) |
| 184 | fread(ROM, len); |
| 185 | else |
| 186 | memcpy(ROM, get_software_region("rom"), len); |
| 187 | |
| 188 | if (software_entry() == NULL) |
| 189 | m_type = get_cart_type(ROM, len); |
| 190 | else |
| 191 | { |
| 192 | const char *pcb_name = get_feature("slot"); |
| 193 | if (pcb_name) |
| 194 | m_type = scv_get_pcb_id(pcb_name); |
| 195 | } |
| 196 | |
| 197 | // for the moment we only support RAM from softlist and in the following configurations |
| 198 | // 1) 32K ROM + 8K RAM; 2) 128K ROM + 4K RAM |
| 199 | if (m_type == SCV_32K && has_ram) |
| 200 | m_type = SCV_32K_RAM; |
| 201 | if (m_type == SCV_128K && has_ram) |
| 202 | m_type = SCV_128K_RAM; |
| 203 | |
| 204 | //printf("Type: %s\n", scv_get_slot(m_type)); |
| 205 | |
| 206 | return IMAGE_INIT_PASS; |
| 207 | } |
| 208 | |
| 209 | return IMAGE_INIT_PASS; |
| 210 | } |
| 211 | |
| 212 | |
| 213 | /*------------------------------------------------- |
| 214 | call softlist load |
| 215 | -------------------------------------------------*/ |
| 216 | |
| 217 | bool scv_cart_slot_device::call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry) |
| 218 | { |
| 219 | load_software_part_region(*this, swlist, swname, start_entry); |
| 220 | return TRUE; |
| 221 | } |
| 222 | |
| 223 | |
| 224 | |
| 225 | /*------------------------------------------------- |
| 226 | get_cart_type - code to detect NVRAM type from |
| 227 | fullpath |
| 228 | -------------------------------------------------*/ |
| 229 | |
| 230 | int scv_cart_slot_device::get_cart_type(UINT8 *ROM, UINT32 len) |
| 231 | { |
| 232 | int type = SCV_8K; |
| 233 | |
| 234 | // TO DO: is there any way to identify carts with RAM?!? |
| 235 | switch (len) |
| 236 | { |
| 237 | case 0x2000: |
| 238 | type = SCV_8K; |
| 239 | break; |
| 240 | case 0x4000: |
| 241 | type = SCV_16K; |
| 242 | break; |
| 243 | case 0x8000: |
| 244 | type = SCV_32K; |
| 245 | break; |
| 246 | case 0x10000: |
| 247 | type = SCV_64K; |
| 248 | break; |
| 249 | case 0x20000: |
| 250 | type = SCV_128K; |
| 251 | break; |
| 252 | } |
| 253 | |
| 254 | return type; |
| 255 | } |
| 256 | |
| 257 | |
| 258 | /*------------------------------------------------- |
| 259 | get default card software |
| 260 | -------------------------------------------------*/ |
| 261 | |
| 262 | void scv_cart_slot_device::get_default_card_software(astring &result) |
| 263 | { |
| 264 | if (open_image_file(mconfig().options())) |
| 265 | { |
| 266 | const char *slot_string = "rom8k"; |
| 267 | UINT32 len = core_fsize(m_file); |
| 268 | dynamic_buffer rom(len); |
| 269 | int type; |
| 270 | |
| 271 | core_fread(m_file, rom, len); |
| 272 | |
| 273 | type = get_cart_type(rom, len); |
| 274 | slot_string = scv_get_slot(type); |
| 275 | |
| 276 | //printf("type: %s\n", slot_string); |
| 277 | clear(); |
| 278 | |
| 279 | result.cpy(slot_string); |
| 280 | return; |
| 281 | } |
| 282 | |
| 283 | software_get_default_slot(result, "rom8k"); |
| 284 | } |
| 285 | |
| 286 | /*------------------------------------------------- |
| 287 | read |
| 288 | -------------------------------------------------*/ |
| 289 | |
| 290 | READ8_MEMBER(scv_cart_slot_device::read_cart) |
| 291 | { |
| 292 | if (m_cart) |
| 293 | return m_cart->read_cart(space, offset); |
| 294 | else |
| 295 | return 0xff; |
| 296 | } |
| 297 | |
| 298 | /*------------------------------------------------- |
| 299 | write |
| 300 | -------------------------------------------------*/ |
| 301 | |
| 302 | WRITE8_MEMBER(scv_cart_slot_device::write_cart) |
| 303 | { |
| 304 | if (m_cart) |
| 305 | m_cart->write_cart(space, offset, data); |
| 306 | } |
| 307 | |
| 308 | |
| 309 | /*------------------------------------------------- |
| 310 | write_bank |
| 311 | -------------------------------------------------*/ |
| 312 | |
| 313 | WRITE8_MEMBER(scv_cart_slot_device::write_bank) |
| 314 | { |
| 315 | if (m_cart) |
| 316 | m_cart->write_bank(space, offset, data); |
| 317 | } |
| 318 | |
trunk/src/emu/bus/scv/rom.h
r0 | r32470 | |
| 1 | #ifndef __SCV_ROM_H |
| 2 | #define __SCV_ROM_H |
| 3 | |
| 4 | #include "slot.h" |
| 5 | |
| 6 | |
| 7 | // ======================> scv_rom8_device |
| 8 | |
| 9 | class scv_rom8_device : public device_t, |
| 10 | public device_scv_cart_interface |
| 11 | { |
| 12 | public: |
| 13 | // construction/destruction |
| 14 | scv_rom8_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source); |
| 15 | scv_rom8_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 16 | |
| 17 | // device-level overrides |
| 18 | virtual void device_start() {} |
| 19 | virtual void device_reset() {} |
| 20 | |
| 21 | // reading and writing |
| 22 | virtual DECLARE_READ8_MEMBER(read_cart); |
| 23 | }; |
| 24 | |
| 25 | // ======================> scv_rom16_device |
| 26 | |
| 27 | class scv_rom16_device : public scv_rom8_device |
| 28 | { |
| 29 | public: |
| 30 | // construction/destruction |
| 31 | scv_rom16_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 32 | |
| 33 | // reading and writing |
| 34 | virtual DECLARE_READ8_MEMBER(read_cart); |
| 35 | }; |
| 36 | |
| 37 | |
| 38 | // ======================> scv_rom32_device |
| 39 | |
| 40 | class scv_rom32_device : public scv_rom8_device |
| 41 | { |
| 42 | public: |
| 43 | // construction/destruction |
| 44 | scv_rom32_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 45 | |
| 46 | // reading and writing |
| 47 | virtual DECLARE_READ8_MEMBER(read_cart); |
| 48 | }; |
| 49 | |
| 50 | |
| 51 | // ======================> scv_rom32ram8_device |
| 52 | |
| 53 | class scv_rom32ram8_device : public scv_rom8_device |
| 54 | { |
| 55 | public: |
| 56 | // construction/destruction |
| 57 | scv_rom32ram8_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 58 | |
| 59 | // device-level overrides |
| 60 | virtual void device_start(); |
| 61 | virtual void device_reset(); |
| 62 | |
| 63 | // reading and writing |
| 64 | virtual DECLARE_READ8_MEMBER(read_cart); |
| 65 | virtual DECLARE_WRITE8_MEMBER(write_cart); |
| 66 | virtual DECLARE_WRITE8_MEMBER(write_bank); |
| 67 | |
| 68 | private: |
| 69 | UINT8 m_ram_enabled; |
| 70 | }; |
| 71 | |
| 72 | |
| 73 | // ======================> scv_rom64_device |
| 74 | |
| 75 | class scv_rom64_device : public scv_rom8_device |
| 76 | { |
| 77 | public: |
| 78 | // construction/destruction |
| 79 | scv_rom64_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 80 | |
| 81 | // device-level overrides |
| 82 | virtual void device_start(); |
| 83 | virtual void device_reset(); |
| 84 | |
| 85 | // reading and writing |
| 86 | virtual DECLARE_READ8_MEMBER(read_cart); |
| 87 | virtual DECLARE_WRITE8_MEMBER(write_bank); |
| 88 | |
| 89 | private: |
| 90 | UINT8 m_bank_base; |
| 91 | }; |
| 92 | |
| 93 | |
| 94 | // ======================> scv_rom128_device |
| 95 | |
| 96 | class scv_rom128_device : public scv_rom8_device |
| 97 | { |
| 98 | public: |
| 99 | // construction/destruction |
| 100 | scv_rom128_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 101 | |
| 102 | // device-level overrides |
| 103 | virtual void device_start(); |
| 104 | virtual void device_reset(); |
| 105 | |
| 106 | // reading and writing |
| 107 | virtual DECLARE_READ8_MEMBER(read_cart); |
| 108 | virtual DECLARE_WRITE8_MEMBER(write_bank); |
| 109 | |
| 110 | private: |
| 111 | UINT8 m_bank_base; |
| 112 | }; |
| 113 | |
| 114 | |
| 115 | // ======================> scv_rom128ram4_device |
| 116 | |
| 117 | class scv_rom128ram4_device : public scv_rom8_device |
| 118 | { |
| 119 | public: |
| 120 | // construction/destruction |
| 121 | scv_rom128ram4_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 122 | |
| 123 | // device-level overrides |
| 124 | virtual void device_start(); |
| 125 | virtual void device_reset(); |
| 126 | |
| 127 | // reading and writing |
| 128 | virtual DECLARE_READ8_MEMBER(read_cart); |
| 129 | virtual DECLARE_WRITE8_MEMBER(write_cart); |
| 130 | virtual DECLARE_WRITE8_MEMBER(write_bank); |
| 131 | |
| 132 | private: |
| 133 | UINT8 m_bank_base, m_ram_enabled; |
| 134 | }; |
| 135 | |
| 136 | |
| 137 | |
| 138 | // device type definition |
| 139 | extern const device_type SCV_ROM8K; |
| 140 | extern const device_type SCV_ROM16K; |
| 141 | extern const device_type SCV_ROM32K; |
| 142 | extern const device_type SCV_ROM32K_RAM8K; |
| 143 | extern const device_type SCV_ROM64K; |
| 144 | extern const device_type SCV_ROM128K; |
| 145 | extern const device_type SCV_ROM128K_RAM4K; |
| 146 | |
| 147 | |
| 148 | |
| 149 | #endif |
trunk/src/emu/bus/vboy/slot.c
r0 | r32470 | |
| 1 | /*********************************************************************************************************** |
| 2 | |
| 3 | Nintendo Virtual Boy cart emulation |
| 4 | (through slot devices) |
| 5 | |
| 6 | ***********************************************************************************************************/ |
| 7 | |
| 8 | |
| 9 | #include "emu.h" |
| 10 | #include "slot.h" |
| 11 | |
| 12 | //************************************************************************** |
| 13 | // GLOBAL VARIABLES |
| 14 | //************************************************************************** |
| 15 | |
| 16 | const device_type VBOY_CART_SLOT = &device_creator<vboy_cart_slot_device>; |
| 17 | |
| 18 | //************************************************************************** |
| 19 | // vboy cartridges Interface |
| 20 | //************************************************************************** |
| 21 | |
| 22 | //------------------------------------------------- |
| 23 | // device_vboy_cart_interface - constructor |
| 24 | //------------------------------------------------- |
| 25 | |
| 26 | device_vboy_cart_interface::device_vboy_cart_interface(const machine_config &mconfig, device_t &device) |
| 27 | : device_slot_card_interface(mconfig, device), |
| 28 | m_rom(NULL), |
| 29 | m_rom_size(0), |
| 30 | m_rom_mask(0) |
| 31 | { |
| 32 | } |
| 33 | |
| 34 | |
| 35 | //------------------------------------------------- |
| 36 | // ~device_vboy_cart_interface - destructor |
| 37 | //------------------------------------------------- |
| 38 | |
| 39 | device_vboy_cart_interface::~device_vboy_cart_interface() |
| 40 | { |
| 41 | } |
| 42 | |
| 43 | //------------------------------------------------- |
| 44 | // rom_alloc - alloc the space for the cart |
| 45 | //------------------------------------------------- |
| 46 | |
| 47 | void device_vboy_cart_interface::rom_alloc(UINT32 size, const char *tag) |
| 48 | { |
| 49 | if (m_rom == NULL) |
| 50 | { |
| 51 | astring tempstring(tag); |
| 52 | tempstring.cat(VBOYSLOT_ROM_REGION_TAG); |
| 53 | m_rom = (UINT32 *)device().machine().memory().region_alloc(tempstring, size, 4, ENDIANNESS_LITTLE)->base(); |
| 54 | m_rom_size = size/4; |
| 55 | m_rom_mask = m_rom_size - 1; |
| 56 | } |
| 57 | } |
| 58 | |
| 59 | |
| 60 | //------------------------------------------------- |
| 61 | // ram_alloc - alloc the space for the ram |
| 62 | //------------------------------------------------- |
| 63 | |
| 64 | void device_vboy_cart_interface::eeprom_alloc(UINT32 size) |
| 65 | { |
| 66 | m_eeprom.resize(size/sizeof(UINT32)); |
| 67 | } |
| 68 | |
| 69 | |
| 70 | //************************************************************************** |
| 71 | // LIVE DEVICE |
| 72 | //************************************************************************** |
| 73 | |
| 74 | //------------------------------------------------- |
| 75 | // vboy_cart_slot_device - constructor |
| 76 | //------------------------------------------------- |
| 77 | vboy_cart_slot_device::vboy_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : |
| 78 | device_t(mconfig, VBOY_CART_SLOT, "Nintendo Virtual Boy Cartridge Slot", tag, owner, clock, "vboy_cart_slot", __FILE__), |
| 79 | device_image_interface(mconfig, *this), |
| 80 | device_slot_interface(mconfig, *this), |
| 81 | m_type(VBOY_STD) |
| 82 | { |
| 83 | } |
| 84 | |
| 85 | |
| 86 | //------------------------------------------------- |
| 87 | // vboy_cart_slot_device - destructor |
| 88 | //------------------------------------------------- |
| 89 | |
| 90 | vboy_cart_slot_device::~vboy_cart_slot_device() |
| 91 | { |
| 92 | } |
| 93 | |
| 94 | //------------------------------------------------- |
| 95 | // device_start - device-specific startup |
| 96 | //------------------------------------------------- |
| 97 | |
| 98 | void vboy_cart_slot_device::device_start() |
| 99 | { |
| 100 | m_cart = dynamic_cast<device_vboy_cart_interface *>(get_card_device()); |
| 101 | } |
| 102 | |
| 103 | //------------------------------------------------- |
| 104 | // device_config_complete - perform any |
| 105 | // operations now that the configuration is |
| 106 | // complete |
| 107 | //------------------------------------------------- |
| 108 | |
| 109 | void vboy_cart_slot_device::device_config_complete() |
| 110 | { |
| 111 | // set brief and instance name |
| 112 | update_names(); |
| 113 | } |
| 114 | |
| 115 | |
| 116 | //------------------------------------------------- |
| 117 | // vboy PCB |
| 118 | //------------------------------------------------- |
| 119 | |
| 120 | struct vboy_slot |
| 121 | { |
| 122 | int pcb_id; |
| 123 | const char *slot_option; |
| 124 | }; |
| 125 | |
| 126 | // Here, we take the feature attribute from .xml (i.e. the PCB name) and we assign a unique ID to it |
| 127 | static const vboy_slot slot_list[] = |
| 128 | { |
| 129 | { VBOY_STD, "vb_rom" }, |
| 130 | { VBOY_EEPROM, "vb_eeprom" } |
| 131 | }; |
| 132 | |
| 133 | static int vboy_get_pcb_id(const char *slot) |
| 134 | { |
| 135 | for (int i = 0; i < ARRAY_LENGTH(slot_list); i++) |
| 136 | { |
| 137 | if (!core_stricmp(slot_list[i].slot_option, slot)) |
| 138 | return slot_list[i].pcb_id; |
| 139 | } |
| 140 | |
| 141 | return 0; |
| 142 | } |
| 143 | |
| 144 | #if 0 |
| 145 | static const char *vboy_get_slot(int type) |
| 146 | { |
| 147 | for (int i = 0; i < ARRAY_LENGTH(slot_list); i++) |
| 148 | { |
| 149 | if (slot_list[i].pcb_id == type) |
| 150 | return slot_list[i].slot_option; |
| 151 | } |
| 152 | |
| 153 | return "vb_rom"; |
| 154 | } |
| 155 | #endif |
| 156 | |
| 157 | /*------------------------------------------------- |
| 158 | call load |
| 159 | -------------------------------------------------*/ |
| 160 | |
| 161 | bool vboy_cart_slot_device::call_load() |
| 162 | { |
| 163 | if (m_cart) |
| 164 | { |
| 165 | UINT8 *ROM; |
| 166 | UINT32 len = (software_entry() == NULL) ? length() : get_software_region_length("rom"); |
| 167 | bool has_eeprom = (software_entry() != NULL) && get_software_region("eeprom"); |
| 168 | |
| 169 | if (len > 0x200000) |
| 170 | { |
| 171 | seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size"); |
| 172 | return IMAGE_INIT_FAIL; |
| 173 | } |
| 174 | |
| 175 | m_cart->rom_alloc(len, tag()); |
| 176 | if (has_eeprom) |
| 177 | m_cart->eeprom_alloc(get_software_region_length("eeprom")); |
| 178 | |
| 179 | ROM = (UINT8 *)m_cart->get_rom_base(); |
| 180 | |
| 181 | if (software_entry() == NULL) |
| 182 | fread(ROM, len); |
| 183 | else |
| 184 | memcpy(ROM, get_software_region("rom"), len); |
| 185 | |
| 186 | if (software_entry() == NULL) |
| 187 | m_type = vboy_get_pcb_id("vb_rom"); |
| 188 | else |
| 189 | { |
| 190 | const char *pcb_name = get_feature("slot"); |
| 191 | if (pcb_name) |
| 192 | m_type = vboy_get_pcb_id(pcb_name); |
| 193 | } |
| 194 | |
| 195 | //printf("Type: %s\n", vboy_get_slot(m_type)); |
| 196 | |
| 197 | return IMAGE_INIT_PASS; |
| 198 | } |
| 199 | |
| 200 | return IMAGE_INIT_PASS; |
| 201 | } |
| 202 | |
| 203 | |
| 204 | /*------------------------------------------------- |
| 205 | call_unload |
| 206 | -------------------------------------------------*/ |
| 207 | |
| 208 | void vboy_cart_slot_device::call_unload() |
| 209 | { |
| 210 | if (m_cart && m_cart->get_eeprom_size()) |
| 211 | battery_save(m_cart->get_eeprom_base(), m_cart->get_eeprom_size() * 4); |
| 212 | } |
| 213 | |
| 214 | /*------------------------------------------------- |
| 215 | call softlist load |
| 216 | -------------------------------------------------*/ |
| 217 | |
| 218 | bool vboy_cart_slot_device::call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry) |
| 219 | { |
| 220 | load_software_part_region(*this, swlist, swname, start_entry); |
| 221 | return TRUE; |
| 222 | } |
| 223 | |
| 224 | |
| 225 | |
| 226 | /*------------------------------------------------- |
| 227 | get default card software |
| 228 | -------------------------------------------------*/ |
| 229 | |
| 230 | void vboy_cart_slot_device::get_default_card_software(astring &result) |
| 231 | { |
| 232 | software_get_default_slot(result, "vb_rom"); |
| 233 | } |
| 234 | |
| 235 | /*------------------------------------------------- |
| 236 | read |
| 237 | -------------------------------------------------*/ |
| 238 | |
| 239 | READ32_MEMBER(vboy_cart_slot_device::read_cart) |
| 240 | { |
| 241 | if (m_cart) |
| 242 | return m_cart->read_cart(space, offset, mem_mask); |
| 243 | else |
| 244 | return 0xffffffff; |
| 245 | } |
| 246 | |
| 247 | /*------------------------------------------------- |
| 248 | read |
| 249 | -------------------------------------------------*/ |
| 250 | |
| 251 | READ32_MEMBER(vboy_cart_slot_device::read_eeprom) |
| 252 | { |
| 253 | if (m_cart) |
| 254 | return m_cart->read_eeprom(space, offset, mem_mask); |
| 255 | else |
| 256 | return 0xffffffff; |
| 257 | } |
| 258 | |
| 259 | /*------------------------------------------------- |
| 260 | write |
| 261 | -------------------------------------------------*/ |
| 262 | |
| 263 | WRITE32_MEMBER(vboy_cart_slot_device::write_eeprom) |
| 264 | { |
| 265 | if (m_cart) |
| 266 | m_cart->write_eeprom(space, offset, data, mem_mask); |
| 267 | } |
trunk/src/mess/drivers/vboy.c
r32469 | r32470 | |
28 | 28 | |
29 | 29 | #include "emu.h" |
30 | 30 | #include "cpu/v810/v810.h" |
31 | | #include "imagedev/cartslot.h" |
32 | 31 | #include "audio/vboy.h" |
| 32 | #include "bus/vboy/slot.h" |
| 33 | #include "bus/vboy/rom.h" |
33 | 34 | #include "vboy.lh" |
34 | 35 | |
35 | 36 | #define READ_BGMAP(bgoffs) m_bgmap[(bgoffs) & 0xffff] |
r32469 | r32470 | |
104 | 105 | public: |
105 | 106 | vboy_state(const machine_config &mconfig, device_type type, const char *tag) |
106 | 107 | : driver_device(mconfig, type, tag), |
107 | | m_maintimer(*this, "timer_main"), |
108 | 108 | m_maincpu(*this, "maincpu"), |
109 | | m_palette(*this, "palette") |
| 109 | m_cart(*this, "cartslot"), |
| 110 | m_maintimer(*this, "timer_main"), |
| 111 | m_palette(*this, "palette") |
110 | 112 | { |
111 | 113 | m_vip_regs.INTPND = 0; |
112 | 114 | m_vip_regs.INTENB = 0; |
r32469 | r32470 | |
151 | 153 | m_vboy_timer.latch = 0; |
152 | 154 | } |
153 | 155 | |
154 | | required_device<timer_device> m_maintimer; |
155 | 156 | required_device<cpu_device> m_maincpu; |
| 157 | required_device<vboy_cart_slot_device> m_cart; |
| 158 | required_device<timer_device> m_maintimer; |
156 | 159 | required_device<palette_device> m_palette; |
157 | 160 | |
158 | 161 | DECLARE_READ32_MEMBER(io_r); |
159 | 162 | DECLARE_WRITE32_MEMBER(io_w); |
160 | 163 | DECLARE_READ16_MEMBER(vip_r); |
161 | 164 | DECLARE_WRITE16_MEMBER(vip_w); |
162 | | DECLARE_WRITE16_MEMBER(vboy_font0_w); |
163 | | DECLARE_WRITE16_MEMBER(vboy_font1_w); |
164 | | DECLARE_WRITE16_MEMBER(vboy_font2_w); |
165 | | DECLARE_WRITE16_MEMBER(vboy_font3_w); |
166 | | DECLARE_READ16_MEMBER(vboy_font0_r); |
167 | | DECLARE_READ16_MEMBER(vboy_font1_r); |
168 | | DECLARE_READ16_MEMBER(vboy_font2_r); |
169 | | DECLARE_READ16_MEMBER(vboy_font3_r); |
| 165 | DECLARE_WRITE16_MEMBER(font0_w); |
| 166 | DECLARE_WRITE16_MEMBER(font1_w); |
| 167 | DECLARE_WRITE16_MEMBER(font2_w); |
| 168 | DECLARE_WRITE16_MEMBER(font3_w); |
| 169 | DECLARE_READ16_MEMBER(font0_r); |
| 170 | DECLARE_READ16_MEMBER(font1_r); |
| 171 | DECLARE_READ16_MEMBER(font2_r); |
| 172 | DECLARE_READ16_MEMBER(font3_r); |
170 | 173 | DECLARE_WRITE16_MEMBER(vboy_bgmap_w); |
171 | 174 | DECLARE_READ16_MEMBER(vboy_bgmap_r); |
172 | | DECLARE_READ8_MEMBER(vboy_lfb0_r); |
173 | | DECLARE_READ8_MEMBER(vboy_lfb1_r); |
174 | | DECLARE_READ8_MEMBER(vboy_rfb0_r); |
175 | | DECLARE_READ8_MEMBER(vboy_rfb1_r); |
176 | | DECLARE_WRITE8_MEMBER(vboy_lfb0_w); |
177 | | DECLARE_WRITE8_MEMBER(vboy_lfb1_w); |
178 | | DECLARE_WRITE8_MEMBER(vboy_rfb0_w); |
179 | | DECLARE_WRITE8_MEMBER(vboy_rfb1_w); |
| 175 | DECLARE_READ8_MEMBER(lfb0_r); |
| 176 | DECLARE_READ8_MEMBER(lfb1_r); |
| 177 | DECLARE_READ8_MEMBER(rfb0_r); |
| 178 | DECLARE_READ8_MEMBER(rfb1_r); |
| 179 | DECLARE_WRITE8_MEMBER(lfb0_w); |
| 180 | DECLARE_WRITE8_MEMBER(lfb1_w); |
| 181 | DECLARE_WRITE8_MEMBER(rfb0_w); |
| 182 | DECLARE_WRITE8_MEMBER(rfb1_w); |
180 | 183 | UINT16 *m_font; |
181 | 184 | UINT16 *m_bgmap; |
182 | 185 | UINT8 *m_l_frame_0; |
r32469 | r32470 | |
195 | 198 | void m_timer_tick(void); |
196 | 199 | void m_scanline_tick(int scanline, UINT8 screen_type); |
197 | 200 | void m_set_irq(UINT16 irq_vector); |
198 | | UINT8 *m_nvptr; |
199 | | UINT32 m_vboy_sram[0x10000/4]; |
200 | | device_t *m_nvimage; |
201 | | DECLARE_READ32_MEMBER(sram_r); |
202 | | DECLARE_WRITE32_MEMBER(sram_w); |
203 | 201 | |
204 | 202 | void put_obj(bitmap_ind16 &bitmap, const rectangle &cliprect, int x, int y, UINT16 code, UINT8 pal); |
205 | 203 | void fill_ovr_char(UINT16 code, UINT8 pal); |
r32469 | r32470 | |
220 | 218 | TIMER_DEVICE_CALLBACK_MEMBER(timer_pad_tick); |
221 | 219 | TIMER_DEVICE_CALLBACK_MEMBER(vboy_scanlineL); |
222 | 220 | TIMER_DEVICE_CALLBACK_MEMBER(vboy_scanlineR); |
223 | | void vboy_machine_stop(); |
224 | | DECLARE_DEVICE_IMAGE_LOAD_MEMBER(vboy_cart); |
225 | 221 | }; |
226 | 222 | |
227 | 223 | |
228 | 224 | void vboy_state::video_start() |
229 | 225 | { |
230 | | //int i; |
231 | | |
232 | 226 | // Allocate memory for temporary screens |
233 | 227 | m_ovr_tempdraw_map = auto_alloc_array_clear(machine(), INT32, 0x40); |
234 | 228 | |
r32469 | r32470 | |
1031 | 1025 | |
1032 | 1026 | |
1033 | 1027 | |
1034 | | WRITE16_MEMBER( vboy_state::vboy_font0_w ) |
| 1028 | WRITE16_MEMBER( vboy_state::font0_w ) |
1035 | 1029 | { |
1036 | 1030 | WRITE_FONT(offset); |
1037 | 1031 | } |
1038 | 1032 | |
1039 | | WRITE16_MEMBER( vboy_state::vboy_font1_w ) |
| 1033 | WRITE16_MEMBER( vboy_state::font1_w ) |
1040 | 1034 | { |
1041 | 1035 | WRITE_FONT(offset+0x1000); |
1042 | 1036 | } |
1043 | 1037 | |
1044 | | WRITE16_MEMBER( vboy_state::vboy_font2_w ) |
| 1038 | WRITE16_MEMBER( vboy_state::font2_w ) |
1045 | 1039 | { |
1046 | 1040 | WRITE_FONT(offset+0x2000); |
1047 | 1041 | } |
1048 | 1042 | |
1049 | | WRITE16_MEMBER( vboy_state::vboy_font3_w ) |
| 1043 | WRITE16_MEMBER( vboy_state::font3_w ) |
1050 | 1044 | { |
1051 | 1045 | WRITE_FONT(offset+0x3000); |
1052 | 1046 | } |
1053 | 1047 | |
1054 | | READ16_MEMBER( vboy_state::vboy_font0_r ) |
| 1048 | READ16_MEMBER( vboy_state::font0_r ) |
1055 | 1049 | { |
1056 | 1050 | return READ_FONT(offset); |
1057 | 1051 | } |
1058 | 1052 | |
1059 | | READ16_MEMBER( vboy_state::vboy_font1_r ) |
| 1053 | READ16_MEMBER( vboy_state::font1_r ) |
1060 | 1054 | { |
1061 | 1055 | return READ_FONT(offset + 0x1000); |
1062 | 1056 | } |
1063 | 1057 | |
1064 | | READ16_MEMBER( vboy_state::vboy_font2_r ) |
| 1058 | READ16_MEMBER( vboy_state::font2_r ) |
1065 | 1059 | { |
1066 | 1060 | return READ_FONT(offset + 0x2000); |
1067 | 1061 | } |
1068 | 1062 | |
1069 | | READ16_MEMBER( vboy_state::vboy_font3_r ) |
| 1063 | READ16_MEMBER( vboy_state::font3_r ) |
1070 | 1064 | { |
1071 | 1065 | return READ_FONT(offset + 0x3000); |
1072 | 1066 | } |
r32469 | r32470 | |
1081 | 1075 | return m_bgmap[offset]; |
1082 | 1076 | } |
1083 | 1077 | |
1084 | | READ8_MEMBER( vboy_state::vboy_lfb0_r ) { return m_l_frame_0[offset]; } |
1085 | | READ8_MEMBER( vboy_state::vboy_lfb1_r ) { return m_l_frame_1[offset]; } |
1086 | | READ8_MEMBER( vboy_state::vboy_rfb0_r ) { return m_r_frame_0[offset]; } |
1087 | | READ8_MEMBER( vboy_state::vboy_rfb1_r ) { return m_r_frame_1[offset]; } |
1088 | | WRITE8_MEMBER( vboy_state::vboy_lfb0_w ) { m_l_frame_0[offset] = data; } |
1089 | | WRITE8_MEMBER( vboy_state::vboy_lfb1_w ) { m_l_frame_1[offset] = data; } |
1090 | | WRITE8_MEMBER( vboy_state::vboy_rfb0_w ) { m_r_frame_0[offset] = data; } |
1091 | | WRITE8_MEMBER( vboy_state::vboy_rfb1_w ) { m_r_frame_1[offset] = data; } |
| 1078 | READ8_MEMBER( vboy_state::lfb0_r ) { return m_l_frame_0[offset]; } |
| 1079 | READ8_MEMBER( vboy_state::lfb1_r ) { return m_l_frame_1[offset]; } |
| 1080 | READ8_MEMBER( vboy_state::rfb0_r ) { return m_r_frame_0[offset]; } |
| 1081 | READ8_MEMBER( vboy_state::rfb1_r ) { return m_r_frame_1[offset]; } |
| 1082 | WRITE8_MEMBER( vboy_state::lfb0_w ) { m_l_frame_0[offset] = data; } |
| 1083 | WRITE8_MEMBER( vboy_state::lfb1_w ) { m_l_frame_1[offset] = data; } |
| 1084 | WRITE8_MEMBER( vboy_state::rfb0_w ) { m_r_frame_0[offset] = data; } |
| 1085 | WRITE8_MEMBER( vboy_state::rfb1_w ) { m_r_frame_1[offset] = data; } |
1092 | 1086 | |
1093 | 1087 | |
1094 | 1088 | static ADDRESS_MAP_START( vboy_mem, AS_PROGRAM, 32, vboy_state ) |
1095 | 1089 | ADDRESS_MAP_GLOBAL_MASK(0x07ffffff) |
1096 | | AM_RANGE( 0x00000000, 0x00005fff ) AM_READWRITE8(vboy_lfb0_r,vboy_lfb0_w,0xffffffff) // L frame buffer 0 |
1097 | | AM_RANGE( 0x00006000, 0x00007fff ) AM_READWRITE16(vboy_font0_r, vboy_font0_w, 0xffffffff) // Font 0-511 |
1098 | | AM_RANGE( 0x00008000, 0x0000dfff ) AM_READWRITE8(vboy_lfb1_r,vboy_lfb1_w,0xffffffff) // L frame buffer 1 |
1099 | | AM_RANGE( 0x0000e000, 0x0000ffff ) AM_READWRITE16(vboy_font1_r, vboy_font1_w, 0xffffffff) // Font 512-1023 |
1100 | | AM_RANGE( 0x00010000, 0x00015fff ) AM_READWRITE8(vboy_rfb0_r,vboy_rfb0_w,0xffffffff) // R frame buffer 0 |
1101 | | AM_RANGE( 0x00016000, 0x00017fff ) AM_READWRITE16(vboy_font2_r, vboy_font2_w, 0xffffffff) // Font 1024-1535 |
1102 | | AM_RANGE( 0x00018000, 0x0001dfff ) AM_READWRITE8(vboy_rfb1_r,vboy_rfb1_w,0xffffffff) // R frame buffer 1 |
1103 | | AM_RANGE( 0x0001e000, 0x0001ffff ) AM_READWRITE16(vboy_font3_r, vboy_font3_w, 0xffffffff) // Font 1536-2047 |
| 1090 | AM_RANGE( 0x00000000, 0x00005fff ) AM_READWRITE8(lfb0_r, lfb0_w,0xffffffff) // L frame buffer 0 |
| 1091 | AM_RANGE( 0x00006000, 0x00007fff ) AM_READWRITE16(font0_r, font0_w, 0xffffffff) // Font 0-511 |
| 1092 | AM_RANGE( 0x00008000, 0x0000dfff ) AM_READWRITE8(lfb1_r, lfb1_w,0xffffffff) // L frame buffer 1 |
| 1093 | AM_RANGE( 0x0000e000, 0x0000ffff ) AM_READWRITE16(font1_r, font1_w, 0xffffffff) // Font 512-1023 |
| 1094 | AM_RANGE( 0x00010000, 0x00015fff ) AM_READWRITE8(rfb0_r, rfb0_w,0xffffffff) // R frame buffer 0 |
| 1095 | AM_RANGE( 0x00016000, 0x00017fff ) AM_READWRITE16(font2_r, font2_w, 0xffffffff) // Font 1024-1535 |
| 1096 | AM_RANGE( 0x00018000, 0x0001dfff ) AM_READWRITE8(rfb1_r, rfb1_w,0xffffffff) // R frame buffer 1 |
| 1097 | AM_RANGE( 0x0001e000, 0x0001ffff ) AM_READWRITE16(font3_r, font3_w, 0xffffffff) // Font 1536-2047 |
1104 | 1098 | |
1105 | 1099 | AM_RANGE( 0x00020000, 0x0003ffff ) AM_READWRITE16(vboy_bgmap_r,vboy_bgmap_w, 0xffffffff) // VIPC memory |
1106 | 1100 | |
1107 | 1101 | //AM_RANGE( 0x00040000, 0x0005ffff ) AM_RAM // VIPC |
1108 | 1102 | AM_RANGE( 0x0005f800, 0x0005f87f ) AM_READWRITE16(vip_r, vip_w, 0xffffffff) |
1109 | 1103 | |
1110 | | AM_RANGE( 0x00078000, 0x00079fff ) AM_READWRITE16(vboy_font0_r, vboy_font0_w, 0xffffffff) // Font 0-511 mirror |
1111 | | AM_RANGE( 0x0007a000, 0x0007bfff ) AM_READWRITE16(vboy_font1_r, vboy_font1_w, 0xffffffff) // Font 512-1023 mirror |
1112 | | AM_RANGE( 0x0007c000, 0x0007dfff ) AM_READWRITE16(vboy_font2_r, vboy_font2_w, 0xffffffff) // Font 1024-1535 mirror |
1113 | | AM_RANGE( 0x0007e000, 0x0007ffff ) AM_READWRITE16(vboy_font3_r, vboy_font3_w, 0xffffffff) // Font 1536-2047 mirror |
| 1104 | AM_RANGE( 0x00078000, 0x00079fff ) AM_READWRITE16(font0_r, font0_w, 0xffffffff) // Font 0-511 mirror |
| 1105 | AM_RANGE( 0x0007a000, 0x0007bfff ) AM_READWRITE16(font1_r, font1_w, 0xffffffff) // Font 512-1023 mirror |
| 1106 | AM_RANGE( 0x0007c000, 0x0007dfff ) AM_READWRITE16(font2_r, font2_w, 0xffffffff) // Font 1024-1535 mirror |
| 1107 | AM_RANGE( 0x0007e000, 0x0007ffff ) AM_READWRITE16(font3_r, font3_w, 0xffffffff) // Font 1536-2047 mirror |
1114 | 1108 | |
1115 | 1109 | AM_RANGE( 0x01000000, 0x010005ff ) AM_DEVREADWRITE8("vbsnd", vboysnd_device, read, write, 0xffffffff) |
1116 | 1110 | AM_RANGE( 0x02000000, 0x0200002b ) AM_MIRROR(0x0ffff00) AM_READWRITE(io_r, io_w) // Hardware control registers mask 0xff |
1117 | 1111 | //AM_RANGE( 0x04000000, 0x04ffffff ) // Expansion area |
1118 | 1112 | AM_RANGE( 0x05000000, 0x0500ffff ) AM_MIRROR(0x0ff0000) AM_RAM AM_SHARE("wram")// Main RAM - 64K mask 0xffff |
1119 | | // AM_RANGE( 0x06000000, 0x06003fff ) AM_RAM AM_SHARE("nvram") // Cart RAM - 8K NVRAM |
1120 | | AM_RANGE( 0x07000000, 0x071fffff ) AM_MIRROR(0x0e00000) AM_ROM AM_REGION("cartridge", 0) /* ROM */ |
| 1113 | AM_RANGE( 0x06000000, 0x06003fff ) AM_DEVREADWRITE("cartslot", vboy_cart_slot_device, read_eeprom, write_eeprom) // Cart RAM - 8K NVRAM |
| 1114 | AM_RANGE( 0x07000000, 0x071fffff ) AM_MIRROR(0x0e00000) AM_DEVREAD("cartslot", vboy_cart_slot_device, read_cart) /* ROM */ |
1121 | 1115 | ADDRESS_MAP_END |
1122 | 1116 | |
1123 | 1117 | static ADDRESS_MAP_START( vboy_io, AS_IO, 32, vboy_state ) |
1124 | 1118 | ADDRESS_MAP_GLOBAL_MASK(0x07ffffff) |
1125 | 1119 | AM_RANGE( 0x00000000, 0x00005fff ) AM_RAM AM_SHARE("l_frame_0") // L frame buffer 0 |
1126 | | AM_RANGE( 0x00006000, 0x00007fff ) AM_READWRITE16(vboy_font0_r, vboy_font0_w, 0xffffffff) // Font 0-511 |
| 1120 | AM_RANGE( 0x00006000, 0x00007fff ) AM_READWRITE16(font0_r, font0_w, 0xffffffff) // Font 0-511 |
1127 | 1121 | AM_RANGE( 0x00008000, 0x0000dfff ) AM_RAM AM_SHARE("l_frame_1") // L frame buffer 1 |
1128 | | AM_RANGE( 0x0000e000, 0x0000ffff ) AM_READWRITE16(vboy_font1_r, vboy_font1_w, 0xffffffff) // Font 512-1023 |
| 1122 | AM_RANGE( 0x0000e000, 0x0000ffff ) AM_READWRITE16(font1_r, font1_w, 0xffffffff) // Font 512-1023 |
1129 | 1123 | AM_RANGE( 0x00010000, 0x00015fff ) AM_RAM AM_SHARE("r_frame_0") // R frame buffer 0 |
1130 | | AM_RANGE( 0x00016000, 0x00017fff ) AM_READWRITE16(vboy_font2_r, vboy_font2_w, 0xffffffff) // Font 1024-1535 |
| 1124 | AM_RANGE( 0x00016000, 0x00017fff ) AM_READWRITE16(font2_r, font2_w, 0xffffffff) // Font 1024-1535 |
1131 | 1125 | AM_RANGE( 0x00018000, 0x0001dfff ) AM_RAM AM_SHARE("r_frame_1") // R frame buffer 1 |
1132 | | AM_RANGE( 0x0001e000, 0x0001ffff ) AM_READWRITE16(vboy_font3_r, vboy_font3_w, 0xffffffff) // Font 1536-2047 |
| 1126 | AM_RANGE( 0x0001e000, 0x0001ffff ) AM_READWRITE16(font3_r, font3_w, 0xffffffff) // Font 1536-2047 |
1133 | 1127 | |
1134 | 1128 | AM_RANGE( 0x00020000, 0x0003ffff ) AM_READWRITE16(vboy_bgmap_r,vboy_bgmap_w, 0xffffffff) // VIPC memory |
1135 | 1129 | |
1136 | 1130 | //AM_RANGE( 0x00040000, 0x0005ffff ) AM_RAM // VIPC |
1137 | 1131 | AM_RANGE( 0x0005f800, 0x0005f87f ) AM_READWRITE16(vip_r, vip_w, 0xffffffff) |
1138 | 1132 | |
1139 | | AM_RANGE( 0x00078000, 0x00079fff ) AM_READWRITE16(vboy_font0_r, vboy_font0_w, 0xffffffff) // Font 0-511 mirror |
1140 | | AM_RANGE( 0x0007a000, 0x0007bfff ) AM_READWRITE16(vboy_font1_r, vboy_font1_w, 0xffffffff) // Font 512-1023 mirror |
1141 | | AM_RANGE( 0x0007c000, 0x0007dfff ) AM_READWRITE16(vboy_font2_r, vboy_font2_w, 0xffffffff) // Font 1024-1535 mirror |
1142 | | AM_RANGE( 0x0007e000, 0x0007ffff ) AM_READWRITE16(vboy_font3_r, vboy_font3_w, 0xffffffff) // Font 1536-2047 mirror |
| 1133 | AM_RANGE( 0x00078000, 0x00079fff ) AM_READWRITE16(font0_r, font0_w, 0xffffffff) // Font 0-511 mirror |
| 1134 | AM_RANGE( 0x0007a000, 0x0007bfff ) AM_READWRITE16(font1_r, font1_w, 0xffffffff) // Font 512-1023 mirror |
| 1135 | AM_RANGE( 0x0007c000, 0x0007dfff ) AM_READWRITE16(font2_r, font2_w, 0xffffffff) // Font 1024-1535 mirror |
| 1136 | AM_RANGE( 0x0007e000, 0x0007ffff ) AM_READWRITE16(font3_r, font3_w, 0xffffffff) // Font 1536-2047 mirror |
1143 | 1137 | |
1144 | 1138 | AM_RANGE( 0x01000000, 0x010005ff ) AM_DEVREADWRITE8("vbsnd", vboysnd_device, read, write, 0xffffffff) |
1145 | 1139 | AM_RANGE( 0x02000000, 0x0200002b ) AM_MIRROR(0x0ffff00) AM_READWRITE(io_r, io_w) // Hardware control registers mask 0xff |
1146 | 1140 | // AM_RANGE( 0x04000000, 0x04ffffff ) // Expansion area |
1147 | 1141 | AM_RANGE( 0x05000000, 0x0500ffff ) AM_MIRROR(0x0ff0000) AM_RAM AM_SHARE("wram") // Main RAM - 64K mask 0xffff |
1148 | | AM_RANGE( 0x06000000, 0x06003fff ) AM_RAM AM_SHARE("nvram") // Cart RAM - 8K NVRAM |
1149 | | AM_RANGE( 0x07000000, 0x071fffff ) AM_MIRROR(0x0e00000) AM_ROM AM_REGION("cartridge", 0) /* ROM */ |
| 1142 | AM_RANGE( 0x06000000, 0x06003fff ) AM_NOP // Cart RAM - 8K NVRAM ? |
| 1143 | AM_RANGE( 0x07000000, 0x071fffff ) AM_MIRROR(0x0e00000) AM_DEVREAD("cartslot", vboy_cart_slot_device, read_cart) /* ROM */ |
1150 | 1144 | ADDRESS_MAP_END |
1151 | 1145 | |
1152 | 1146 | /* Input ports */ |
r32469 | r32470 | |
1170 | 1164 | PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_UNUSED ) // Battery low |
1171 | 1165 | INPUT_PORTS_END |
1172 | 1166 | |
1173 | | void vboy_state::vboy_machine_stop() |
1174 | | { |
1175 | | // only do this if the cart loader detected some form of backup |
1176 | | if (m_nvptr != NULL) |
1177 | | { |
1178 | | device_image_interface *image = dynamic_cast<device_image_interface *>(m_nvimage); |
1179 | | image->battery_save(m_nvptr, 0x10000); |
1180 | | } |
1181 | | } |
1182 | 1167 | |
1183 | 1168 | void vboy_state::machine_start() |
1184 | 1169 | { |
1185 | | /* add a hook for battery save */ |
1186 | | machine().add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(vboy_state::vboy_machine_stop),this)); |
1187 | | |
1188 | | // m_vboy_sram = auto_alloc_array(machine(), UINT32, 0x10000/4); |
| 1170 | if (m_cart->exists()) |
| 1171 | m_cart->save_eeprom(); |
1189 | 1172 | } |
1190 | 1173 | |
1191 | 1174 | void vboy_state::machine_reset() |
r32469 | r32470 | |
1339 | 1322 | #endif |
1340 | 1323 | |
1341 | 1324 | |
| 1325 | static SLOT_INTERFACE_START(vboy_cart) |
| 1326 | SLOT_INTERFACE_INTERNAL("vb_rom", VBOY_ROM_STD) |
| 1327 | SLOT_INTERFACE_INTERNAL("vb_eeprom", VBOY_ROM_EEPROM) |
| 1328 | SLOT_INTERFACE_END |
1342 | 1329 | |
1343 | | READ32_MEMBER(vboy_state::sram_r) |
1344 | | { |
1345 | | return m_vboy_sram[offset]; |
1346 | | } |
1347 | | |
1348 | | WRITE32_MEMBER(vboy_state::sram_w) |
1349 | | { |
1350 | | COMBINE_DATA(&m_vboy_sram[offset]); |
1351 | | } |
1352 | | |
1353 | | |
1354 | | DEVICE_IMAGE_LOAD_MEMBER( vboy_state, vboy_cart ) |
1355 | | { |
1356 | | UINT32 chip = 0; |
1357 | | UINT8 *ROM = memregion("cartridge")->base(); |
1358 | | UINT32 cart_size; |
1359 | | |
1360 | | m_nvptr = (UINT8 *)NULL; |
1361 | | if (image.software_entry() == NULL) |
1362 | | { |
1363 | | cart_size = image.length(); |
1364 | | image.fread(ROM, cart_size); |
1365 | | switch (cart_size) |
1366 | | { |
1367 | | case 0x001000: |
1368 | | memcpy(ROM + 0x001000, ROM, 0x001000); |
1369 | | case 0x002000: |
1370 | | memcpy(ROM + 0x002000, ROM, 0x002000); |
1371 | | case 0x004000: |
1372 | | memcpy(ROM + 0x004000, ROM, 0x004000); |
1373 | | case 0x008000: |
1374 | | memcpy(ROM + 0x008000, ROM, 0x008000); |
1375 | | case 0x010000: |
1376 | | memcpy(ROM + 0x010000, ROM, 0x010000); |
1377 | | case 0x020000: |
1378 | | memcpy(ROM + 0x020000, ROM, 0x020000); |
1379 | | case 0x040000: |
1380 | | memcpy(ROM + 0x040000, ROM, 0x040000); |
1381 | | case 0x080000: |
1382 | | memcpy(ROM + 0x080000, ROM, 0x080000); |
1383 | | case 0x100000: |
1384 | | memcpy(ROM + 0x100000, ROM, 0x100000); |
1385 | | default: |
1386 | | break; |
1387 | | } |
1388 | | } |
1389 | | else |
1390 | | { |
1391 | | cart_size = image.get_software_region_length("rom"); |
1392 | | memcpy(ROM, image.get_software_region("rom"), cart_size); |
1393 | | |
1394 | | UINT8 *tmp_eeprom = image.get_software_region("eeprom"); |
1395 | | if (tmp_eeprom) |
1396 | | chip = 1; |
1397 | | } |
1398 | | |
1399 | | if (chip) |
1400 | | { |
1401 | | m_nvptr = (UINT8 *)&m_vboy_sram; |
1402 | | |
1403 | | m_maincpu->space(AS_PROGRAM).install_read_handler(0x06000000, 0x0600ffff, read32_delegate(FUNC(vboy_state::sram_r),this)); |
1404 | | m_maincpu->space(AS_PROGRAM).install_write_handler(0x06000000, 0x0600ffff, write32_delegate(FUNC(vboy_state::sram_w),this)); |
1405 | | |
1406 | | image.battery_load(m_nvptr, 0x10000, 0x00); |
1407 | | m_nvimage = image; |
1408 | | } |
1409 | | else |
1410 | | { |
1411 | | m_nvimage = NULL; |
1412 | | } |
1413 | | |
1414 | | return IMAGE_INIT_PASS; |
1415 | | } |
1416 | | |
1417 | 1330 | static MACHINE_CONFIG_START( vboy, vboy_state ) |
1418 | 1331 | |
1419 | 1332 | /* basic machine hardware */ |
r32469 | r32470 | |
1423 | 1336 | MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer_l", vboy_state, vboy_scanlineL, "3dleft", 0, 1) |
1424 | 1337 | //MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer_r", vboy_state, vboy_scanlineR, "3dright", 0, 1) |
1425 | 1338 | |
1426 | | |
1427 | 1339 | // programmable timer |
1428 | 1340 | MCFG_TIMER_DRIVER_ADD("timer_main", vboy_state, timer_main_tick) |
1429 | 1341 | |
r32469 | r32470 | |
1448 | 1360 | MCFG_SCREEN_PALETTE("palette") |
1449 | 1361 | |
1450 | 1362 | /* cartridge */ |
1451 | | MCFG_CARTSLOT_ADD("cart") |
1452 | | MCFG_CARTSLOT_EXTENSION_LIST("vb,bin") |
1453 | | MCFG_CARTSLOT_MANDATORY |
1454 | | MCFG_CARTSLOT_INTERFACE("vboy_cart") |
1455 | | MCFG_CARTSLOT_LOAD(vboy_state, vboy_cart) |
| 1363 | MCFG_VBOY_CARTRIDGE_ADD("cartslot", vboy_cart, NULL) |
1456 | 1364 | |
1457 | 1365 | /* software lists */ |
1458 | 1366 | MCFG_SOFTWARE_LIST_ADD("cart_list","vboy") |
r32469 | r32470 | |
1466 | 1374 | |
1467 | 1375 | /* ROM definition */ |
1468 | 1376 | ROM_START( vboy ) |
1469 | | ROM_REGION( 0x2000000, "cartridge", ROMREGION_ERASEFF ) |
| 1377 | ROM_REGION( 0x2000000, "maincpu", ROMREGION_ERASEFF ) |
1470 | 1378 | ROM_END |
1471 | 1379 | |
1472 | 1380 | /* Driver */ |
trunk/src/mess/drivers/scv.c
r32469 | r32470 | |
2 | 2 | |
3 | 3 | Driver for Epoch Super Cassette Vision |
4 | 4 | |
5 | | |
6 | 5 | ***************************************************************************/ |
7 | 6 | |
8 | 7 | #include "emu.h" |
9 | 8 | #include "cpu/upd7810/upd7810.h" |
10 | | #include "imagedev/cartslot.h" |
11 | 9 | #include "audio/upd1771.h" |
| 10 | #include "bus/scv/slot.h" |
| 11 | #include "bus/scv/rom.h" |
12 | 12 | |
13 | 13 | |
14 | 14 | class scv_state : public driver_device |
r32469 | r32470 | |
17 | 17 | scv_state(const machine_config &mconfig, device_type type, const char *tag) |
18 | 18 | : driver_device(mconfig, type, tag), |
19 | 19 | m_videoram(*this,"videoram"), |
20 | | m_cart_rom_size(0), |
21 | | m_cart_ram(NULL), |
22 | | m_cart_ram_size(0), |
23 | 20 | m_maincpu(*this, "maincpu"), |
24 | 21 | m_upd1771c(*this, "upd1771c"), |
| 22 | m_cart(*this, "cartslot"), |
| 23 | m_pa(*this, "PA"), |
25 | 24 | m_pc0(*this, "PC0"), |
26 | | m_bank0(*this, "bank0"), |
27 | | m_bank1(*this, "bank1"), |
28 | | m_bank2(*this, "bank2"), |
29 | | m_bank3(*this, "bank3"), |
30 | | m_bank4(*this, "bank4"), |
31 | 25 | m_charrom(*this, "charrom") { } |
32 | 26 | |
33 | | DECLARE_WRITE8_MEMBER(scv_porta_w); |
34 | | DECLARE_READ8_MEMBER(scv_portb_r); |
35 | | DECLARE_READ8_MEMBER(scv_portc_r); |
36 | | DECLARE_WRITE8_MEMBER(scv_portc_w); |
37 | | DECLARE_WRITE8_MEMBER(scv_cart_ram_w); |
38 | | DECLARE_WRITE8_MEMBER(scv_cart_ram2_w); |
39 | | DECLARE_WRITE_LINE_MEMBER(scv_upd1771_ack_w); |
| 27 | DECLARE_WRITE8_MEMBER(porta_w); |
| 28 | DECLARE_READ8_MEMBER(portb_r); |
| 29 | DECLARE_READ8_MEMBER(portc_r); |
| 30 | DECLARE_WRITE8_MEMBER(portc_w); |
| 31 | DECLARE_WRITE_LINE_MEMBER(upd1771_ack_w); |
40 | 32 | required_shared_ptr<UINT8> m_videoram; |
41 | 33 | UINT8 m_porta; |
42 | 34 | UINT8 m_portc; |
43 | 35 | emu_timer *m_vb_timer; |
44 | | UINT8 *m_cart_rom; |
45 | | UINT32 m_cart_rom_size; |
46 | | UINT8 *m_cart_ram; |
47 | | UINT32 m_cart_ram_size; |
48 | | bool m_cart_ram_enabled; |
49 | 36 | virtual void machine_start(); |
50 | 37 | virtual void machine_reset(); |
51 | 38 | DECLARE_PALETTE_INIT(scv); |
52 | | void scv_postload(); |
53 | 39 | UINT32 screen_update_scv(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); |
54 | | DECLARE_DEVICE_IMAGE_LOAD_MEMBER( scv_cart ); |
55 | 40 | |
56 | 41 | protected: |
57 | 42 | enum |
r32469 | r32470 | |
61 | 46 | |
62 | 47 | required_device<cpu_device> m_maincpu; |
63 | 48 | required_device<upd1771c_device> m_upd1771c; |
| 49 | required_device<scv_cart_slot_device> m_cart; |
| 50 | required_ioport_array<8> m_pa; |
64 | 51 | required_ioport m_pc0; |
65 | | required_memory_bank m_bank0; |
66 | | required_memory_bank m_bank1; |
67 | | required_memory_bank m_bank2; |
68 | | required_memory_bank m_bank3; |
69 | | required_memory_bank m_bank4; |
70 | 52 | required_memory_region m_charrom; |
71 | 53 | |
72 | 54 | ioport_port *m_key[8]; |
r32469 | r32470 | |
82 | 64 | |
83 | 65 | |
84 | 66 | static ADDRESS_MAP_START( scv_mem, AS_PROGRAM, 8, scv_state ) |
85 | | AM_RANGE( 0x0000, 0x0fff ) AM_ROM /* BIOS */ |
| 67 | AM_RANGE( 0x0000, 0x0fff ) AM_ROM // BIOS |
86 | 68 | |
87 | | AM_RANGE( 0x2000, 0x3403 ) AM_RAM AM_SHARE("videoram") /* VRAM + 4 registers */ |
88 | | |
| 69 | AM_RANGE( 0x2000, 0x3403 ) AM_RAM AM_SHARE("videoram") // VRAM + 4 registers |
89 | 70 | AM_RANGE( 0x3600, 0x3600 ) AM_DEVWRITE("upd1771c", upd1771c_device, write) |
90 | 71 | |
91 | | AM_RANGE( 0x8000, 0x9fff ) AM_ROMBANK("bank0") |
92 | | AM_RANGE( 0xa000, 0xbfff ) AM_ROMBANK("bank1") |
93 | | AM_RANGE( 0xc000, 0xdfff ) AM_ROMBANK("bank2") |
94 | | AM_RANGE( 0xe000, 0xefff ) AM_READ_BANK("bank3") AM_WRITE( scv_cart_ram_w ) |
95 | | AM_RANGE( 0xf000, 0xff7f ) AM_READ_BANK("bank4") AM_WRITE( scv_cart_ram2_w ) |
96 | | AM_RANGE( 0xff80, 0xffff ) AM_RAM /* upd7801 internal RAM */ |
| 72 | AM_RANGE( 0x8000, 0xff7f ) AM_DEVREADWRITE("cartslot", scv_cart_slot_device, read_cart, write_cart) // cartridge |
| 73 | AM_RANGE( 0xff80, 0xffff ) AM_RAM // upd7801 internal RAM |
97 | 74 | ADDRESS_MAP_END |
98 | 75 | |
99 | 76 | |
100 | 77 | static ADDRESS_MAP_START( scv_io, AS_IO, 8, scv_state ) |
101 | | AM_RANGE( 0x00, 0x00 ) AM_WRITE( scv_porta_w ) |
102 | | AM_RANGE( 0x01, 0x01 ) AM_READ( scv_portb_r ) |
103 | | AM_RANGE( 0x02, 0x02 ) AM_READWRITE( scv_portc_r, scv_portc_w ) |
| 78 | AM_RANGE( 0x00, 0x00 ) AM_WRITE(porta_w) |
| 79 | AM_RANGE( 0x01, 0x01 ) AM_READ(portb_r) |
| 80 | AM_RANGE( 0x02, 0x02 ) AM_READWRITE(portc_r, portc_w) |
104 | 81 | ADDRESS_MAP_END |
105 | 82 | |
106 | 83 | |
107 | 84 | static INPUT_PORTS_START( scv ) |
108 | | PORT_START( "PA0" ) |
| 85 | PORT_START( "PA.0" ) |
109 | 86 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) PORT_8WAY |
110 | 87 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_8WAY |
111 | 88 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) |
r32469 | r32470 | |
115 | 92 | PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) |
116 | 93 | PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) |
117 | 94 | |
118 | | PORT_START( "PA1" ) |
| 95 | PORT_START( "PA.1" ) |
119 | 96 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) PORT_8WAY |
120 | 97 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) PORT_8WAY |
121 | 98 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) |
r32469 | r32470 | |
125 | 102 | PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) |
126 | 103 | PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) |
127 | 104 | |
128 | | PORT_START( "PA2" ) |
| 105 | PORT_START( "PA.2" ) |
129 | 106 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) |
130 | 107 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) |
131 | 108 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) |
r32469 | r32470 | |
135 | 112 | PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("0") PORT_CODE(KEYCODE_0_PAD) |
136 | 113 | PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("1") PORT_CODE(KEYCODE_1_PAD) |
137 | 114 | |
138 | | PORT_START( "PA3" ) |
| 115 | PORT_START( "PA.3" ) |
139 | 116 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) |
140 | 117 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) |
141 | 118 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) |
r32469 | r32470 | |
145 | 122 | PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("2") PORT_CODE(KEYCODE_2_PAD) |
146 | 123 | PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("3") PORT_CODE(KEYCODE_3_PAD) |
147 | 124 | |
148 | | PORT_START( "PA4" ) |
| 125 | PORT_START( "PA.4" ) |
149 | 126 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) |
150 | 127 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) |
151 | 128 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) |
r32469 | r32470 | |
155 | 132 | PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("4") PORT_CODE(KEYCODE_4_PAD) |
156 | 133 | PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("5") PORT_CODE(KEYCODE_5_PAD) |
157 | 134 | |
158 | | PORT_START( "PA5" ) |
| 135 | PORT_START( "PA.5" ) |
159 | 136 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) |
160 | 137 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) |
161 | 138 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) |
r32469 | r32470 | |
165 | 142 | PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("6") PORT_CODE(KEYCODE_6_PAD) |
166 | 143 | PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("7") PORT_CODE(KEYCODE_7_PAD) |
167 | 144 | |
168 | | PORT_START( "PA6" ) |
| 145 | PORT_START( "PA.6" ) |
169 | 146 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) |
170 | 147 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) |
171 | 148 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) |
r32469 | r32470 | |
175 | 152 | PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("8") PORT_CODE(KEYCODE_8_PAD) |
176 | 153 | PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("9") PORT_CODE(KEYCODE_9_PAD) |
177 | 154 | |
178 | | PORT_START( "PA7" ) |
| 155 | PORT_START( "PA.7" ) |
179 | 156 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) |
180 | 157 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) |
181 | 158 | PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) |
r32469 | r32470 | |
190 | 167 | INPUT_PORTS_END |
191 | 168 | |
192 | 169 | |
193 | | WRITE8_MEMBER( scv_state::scv_cart_ram_w ) |
| 170 | WRITE8_MEMBER( scv_state::porta_w ) |
194 | 171 | { |
195 | | /* Check if cartridge ram is enabled */ |
196 | | if ( m_cart_ram_enabled ) |
197 | | { |
198 | | m_cart_ram[offset] = data; |
199 | | } |
200 | | } |
201 | | |
202 | | |
203 | | WRITE8_MEMBER( scv_state::scv_cart_ram2_w ) |
204 | | { |
205 | | /* Check if cartridge ram is enabled */ |
206 | | if ( m_cart_ram_enabled ) |
207 | | { |
208 | | if ( m_cart_ram_size > 0x1000 ) |
209 | | { |
210 | | offset += 0x1000; |
211 | | } |
212 | | |
213 | | m_cart_ram[offset] = data; |
214 | | } |
215 | | } |
216 | | |
217 | | |
218 | | WRITE8_MEMBER( scv_state::scv_porta_w ) |
219 | | { |
220 | 172 | m_porta = data; |
221 | 173 | } |
222 | 174 | |
223 | 175 | |
224 | | READ8_MEMBER( scv_state::scv_portb_r ) |
| 176 | READ8_MEMBER( scv_state::portb_r ) |
225 | 177 | { |
226 | 178 | UINT8 data = 0xff; |
227 | 179 | |
228 | 180 | for (int i = 0; i < 8; i++) |
229 | 181 | { |
230 | 182 | if (!BIT(m_porta, i)) |
231 | | data &= m_key[i]->read(); |
| 183 | data &= m_pa[i]->read(); |
232 | 184 | } |
233 | 185 | |
234 | 186 | return data; |
235 | 187 | } |
236 | 188 | |
237 | 189 | |
238 | | READ8_MEMBER( scv_state::scv_portc_r ) |
| 190 | READ8_MEMBER( scv_state::portc_r ) |
239 | 191 | { |
240 | 192 | UINT8 data = m_portc; |
241 | 193 | |
r32469 | r32470 | |
245 | 197 | } |
246 | 198 | |
247 | 199 | |
248 | | void scv_state::scv_set_banks() |
| 200 | WRITE8_MEMBER( scv_state::portc_w ) |
249 | 201 | { |
250 | | m_cart_ram_enabled = false; |
251 | | |
252 | | switch( m_cart_rom_size ) |
253 | | { |
254 | | case 0: |
255 | | case 0x2000: |
256 | | m_bank0->set_base( m_cart_rom ); |
257 | | m_bank1->set_base( m_cart_rom ); |
258 | | m_bank2->set_base( m_cart_rom ); |
259 | | m_bank3->set_base( m_cart_rom ); |
260 | | m_bank4->set_base( m_cart_rom + 0x1000 ); |
261 | | break; |
262 | | case 0x4000: |
263 | | m_bank0->set_base( m_cart_rom ); |
264 | | m_bank1->set_base( m_cart_rom + 0x2000 ); |
265 | | m_bank2->set_base( m_cart_rom ); |
266 | | m_bank3->set_base( m_cart_rom + 0x2000 ); |
267 | | m_bank4->set_base( m_cart_rom + 0x3000 ); |
268 | | break; |
269 | | case 0x8000: |
270 | | m_bank0->set_base( m_cart_rom ); |
271 | | m_bank1->set_base( m_cart_rom + 0x2000 ); |
272 | | m_bank2->set_base( m_cart_rom + 0x4000 ); |
273 | | m_bank3->set_base( m_cart_rom + 0x6000 ); |
274 | | m_bank4->set_base( m_cart_rom + 0x7000 ); |
275 | | break; |
276 | | case 0x10000: |
277 | | m_bank0->set_base( m_cart_rom + ( ( m_portc & 0x20 ) ? 0x8000 : 0 ) ); |
278 | | m_bank1->set_base( m_cart_rom + ( ( m_portc & 0x20 ) ? 0xa000 : 0x2000 ) ); |
279 | | m_bank2->set_base( m_cart_rom + ( ( m_portc & 0x20 ) ? 0xc000 : 0x4000 ) ); |
280 | | m_bank3->set_base( m_cart_rom + ( ( m_portc & 0x20 ) ? 0xe000 : 0x6000 ) ); |
281 | | m_bank4->set_base( m_cart_rom + ( ( m_portc & 0x20 ) ? 0xf000 : 0x7000 ) ); |
282 | | break; |
283 | | case 0x20000: /* Pole Position 2 */ |
284 | | int base = ( ( m_portc >> 5 ) & 0x03 ) * 0x8000 ; |
285 | | m_bank0->set_base( m_cart_rom + base + 0 ); |
286 | | m_bank1->set_base( m_cart_rom + base + 0x2000 ); |
287 | | m_bank2->set_base( m_cart_rom + base + 0x4000 ); |
288 | | m_bank3->set_base( m_cart_rom + base + 0x6000 ); |
289 | | m_bank4->set_base( m_cart_rom + base + 0x7000 ); |
290 | | /* On-cart RAM is enabled when PC6 is high */ |
291 | | if ( m_cart_ram && m_portc & 0x40 ) |
292 | | { |
293 | | m_cart_ram_enabled = true; |
294 | | m_bank4->set_base( m_cart_ram ); |
295 | | } |
296 | | break; |
297 | | } |
298 | | |
299 | | /* Check if cartridge RAM is available and should be enabled */ |
300 | | if ( m_cart_rom_size < 0x20000 && m_cart_ram && m_cart_ram_size && ( m_portc & 0x20 ) ) |
301 | | { |
302 | | if ( m_cart_ram_size == 0x1000 ) |
303 | | { |
304 | | m_bank4->set_base( m_cart_ram ); |
305 | | } |
306 | | else |
307 | | { |
308 | | m_bank3->set_base( m_cart_ram ); |
309 | | m_bank4->set_base( m_cart_ram + 0x1000 ); |
310 | | } |
311 | | m_cart_ram_enabled = true; |
312 | | } |
313 | | |
314 | | } |
315 | | |
316 | | |
317 | | WRITE8_MEMBER( scv_state::scv_portc_w ) |
318 | | { |
319 | 202 | //logerror("%04x: scv_portc_w: data = 0x%02x\n", m_maincpu->pc(), data ); |
320 | 203 | m_portc = data; |
321 | | |
322 | | scv_set_banks(); |
| 204 | m_cart->write_bank(space, 0, m_portc); |
323 | 205 | m_upd1771c->pcm_write(m_portc & 0x08); |
324 | 206 | } |
325 | 207 | |
326 | 208 | |
327 | | DEVICE_IMAGE_LOAD_MEMBER( scv_state, scv_cart ) |
328 | | { |
329 | | UINT8 *cart = memregion( "cart" )->base(); |
330 | | |
331 | | if ( image.software_entry() == NULL ) |
332 | | { |
333 | | int size = image.length(); |
334 | | |
335 | | if ( size > memregion( "cart" )->bytes() ) |
336 | | { |
337 | | image.seterror( IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size" ); |
338 | | return IMAGE_INIT_FAIL; |
339 | | } |
340 | | |
341 | | if ( image.fread( cart, size ) != size ) |
342 | | { |
343 | | image.seterror( IMAGE_ERROR_UNSPECIFIED, "Unable to fully read from file" ); |
344 | | return IMAGE_INIT_FAIL; |
345 | | } |
346 | | |
347 | | m_cart_rom_size = size; |
348 | | } |
349 | | else |
350 | | { |
351 | | m_cart_rom_size = image.get_software_region_length( "rom" ); |
352 | | memcpy( cart, image.get_software_region( "rom" ), m_cart_rom_size ); |
353 | | m_cart_ram_size = image.get_software_region_length( "ram" ); |
354 | | if ( m_cart_ram_size > 0 ) |
355 | | { |
356 | | m_cart_ram = auto_alloc_array_clear( machine(), UINT8, m_cart_ram_size ); |
357 | | save_pointer(NAME(m_cart_ram), m_cart_ram_size); |
358 | | } |
359 | | } |
360 | | |
361 | | return IMAGE_INIT_PASS; |
362 | | } |
363 | | |
364 | | |
365 | 209 | PALETTE_INIT_MEMBER(scv_state, scv) |
366 | 210 | { |
367 | 211 | /* |
r32469 | r32470 | |
758 | 602 | } |
759 | 603 | |
760 | 604 | |
761 | | WRITE_LINE_MEMBER( scv_state::scv_upd1771_ack_w ) |
| 605 | WRITE_LINE_MEMBER( scv_state::upd1771_ack_w ) |
762 | 606 | { |
763 | 607 | m_maincpu->set_input_line(UPD7810_INTF1, (state) ? ASSERT_LINE : CLEAR_LINE); |
764 | 608 | } |
765 | 609 | |
766 | | void scv_state::scv_postload() |
767 | | { |
768 | | scv_set_banks(); |
769 | | } |
770 | | |
771 | | |
772 | 610 | void scv_state::machine_start() |
773 | 611 | { |
774 | | m_cart_rom = memregion( "cart" )->base(); |
775 | 612 | m_vb_timer = timer_alloc(TIMER_VB); |
776 | 613 | |
777 | | for (int i = 0; i < 8; i++) |
778 | | { |
779 | | char str[4]; |
780 | | sprintf(str, "PA%i", i); |
781 | | m_key[i] = ioport(str); |
782 | | } |
783 | | |
784 | 614 | save_item(NAME(m_porta)); |
785 | 615 | save_item(NAME(m_portc)); |
786 | | save_item(NAME(m_cart_ram_enabled)); |
| 616 | if (m_cart->exists()) |
| 617 | m_cart->save_ram(); |
787 | 618 | |
788 | | machine().save().register_postload(save_prepost_delegate(FUNC(scv_state::scv_postload), this)); |
789 | 619 | } |
790 | 620 | |
791 | 621 | |
792 | 622 | void scv_state::machine_reset() |
793 | 623 | { |
794 | 624 | m_vb_timer->adjust(machine().first_screen()->time_until_pos(0, 0)); |
795 | | scv_set_banks(); |
796 | 625 | } |
797 | 626 | |
798 | 627 | |
r32469 | r32470 | |
815 | 644 | GFXDECODE_END |
816 | 645 | |
817 | 646 | |
| 647 | static SLOT_INTERFACE_START(scv_cart) |
| 648 | SLOT_INTERFACE_INTERNAL("rom8k", SCV_ROM8K) |
| 649 | SLOT_INTERFACE_INTERNAL("rom16k", SCV_ROM16K) |
| 650 | SLOT_INTERFACE_INTERNAL("rom32k", SCV_ROM32K) |
| 651 | SLOT_INTERFACE_INTERNAL("rom32k_ram", SCV_ROM32K_RAM8K) |
| 652 | SLOT_INTERFACE_INTERNAL("rom64k", SCV_ROM64K) |
| 653 | SLOT_INTERFACE_INTERNAL("rom128k", SCV_ROM128K) |
| 654 | SLOT_INTERFACE_INTERNAL("rom128k_ram", SCV_ROM128K_RAM4K) |
| 655 | SLOT_INTERFACE_END |
| 656 | |
818 | 657 | static MACHINE_CONFIG_START( scv, scv_state ) |
819 | 658 | |
820 | 659 | MCFG_CPU_ADD( "maincpu", UPD7801, XTAL_4MHz ) |
821 | 660 | MCFG_CPU_PROGRAM_MAP( scv_mem ) |
822 | 661 | MCFG_CPU_IO_MAP( scv_io ) |
823 | 662 | |
824 | | |
825 | 663 | /* Video chip is EPOCH TV-1 */ |
826 | 664 | MCFG_SCREEN_ADD( "screen", RASTER ) |
827 | 665 | MCFG_SCREEN_RAW_PARAMS( XTAL_14_31818MHz/2, 456, 24, 24+192, 262, 23, 23+222 ) /* TODO: Verify */ |
r32469 | r32470 | |
835 | 673 | /* Sound is generated by UPD1771C clocked at XTAL_6MHz */ |
836 | 674 | MCFG_SPEAKER_STANDARD_MONO("mono") |
837 | 675 | MCFG_SOUND_ADD( "upd1771c", UPD1771C, XTAL_6MHz ) |
838 | | MCFG_UPD1771_ACK_HANDLER(WRITELINE(scv_state, scv_upd1771_ack_w)) |
| 676 | MCFG_UPD1771_ACK_HANDLER(WRITELINE(scv_state, upd1771_ack_w)) |
839 | 677 | MCFG_SOUND_ROUTE( ALL_OUTPUTS, "mono", 1.00 ) |
840 | 678 | |
841 | | MCFG_CARTSLOT_ADD( "cart" ) |
842 | | MCFG_CARTSLOT_EXTENSION_LIST( "bin" ) |
843 | | MCFG_CARTSLOT_NOT_MANDATORY |
844 | | MCFG_CARTSLOT_INTERFACE("scv_cart") |
845 | | MCFG_CARTSLOT_LOAD( scv_state, scv_cart ) |
| 679 | MCFG_SCV_CARTRIDGE_ADD("cartslot", scv_cart, NULL) |
846 | 680 | |
847 | 681 | /* Software lists */ |
848 | 682 | MCFG_SOFTWARE_LIST_ADD("cart_list","scv") |
r32469 | r32470 | |
850 | 684 | |
851 | 685 | |
852 | 686 | static MACHINE_CONFIG_DERIVED( scv_pal, scv ) |
853 | | |
854 | 687 | MCFG_CPU_MODIFY( "maincpu" ) |
855 | 688 | MCFG_CPU_CLOCK( 3780000 ) |
856 | 689 | |
r32469 | r32470 | |
864 | 697 | ROM_START( scv ) |
865 | 698 | ROM_REGION( 0x1000, "maincpu", 0 ) |
866 | 699 | ROM_LOAD( "upd7801g.s01", 0, 0x1000, CRC(7ac06182) SHA1(6e89d1227581c76441a53d605f9e324185f1da33) ) |
| 700 | |
867 | 701 | ROM_REGION( 0x400, "charrom", 0 ) |
868 | 702 | ROM_LOAD( "epochtv.chr", 0, 0x400, BAD_DUMP CRC(db521533) SHA1(40b4e44838c35191f115437a14f200f052e71509) ) |
869 | | |
870 | | ROM_REGION( 0x20000, "cart", ROMREGION_ERASEFF ) |
871 | 703 | ROM_END |
872 | 704 | |
873 | 705 | |
874 | 706 | ROM_START( scv_pal ) |
875 | 707 | ROM_REGION( 0x1000, "maincpu", 0 ) |
876 | 708 | ROM_LOAD( "upd7801g.s01", 0, 0x1000, CRC(7ac06182) SHA1(6e89d1227581c76441a53d605f9e324185f1da33) ) |
| 709 | |
877 | 710 | ROM_REGION( 0x400, "charrom", 0 ) |
878 | 711 | ROM_LOAD( "epochtv.chr", 0, 0x400, BAD_DUMP CRC(db521533) SHA1(40b4e44838c35191f115437a14f200f052e71509) ) |
879 | | |
880 | | ROM_REGION( 0x20000, "cart", ROMREGION_ERASEFF ) |
881 | 712 | ROM_END |
882 | 713 | |
883 | 714 | |