trunk/src/mame/drivers/supdrapo.c
r244977 | r244978 | |
27 | 27 | |
28 | 28 | - Reworked inputs to match the standard poker inputs names/layout. |
29 | 29 | - Hooked the payout switch. |
30 | | - Hooked a watchdog circuitery, that seems intended to reset |
| 30 | - Hooked a watchdog circuitry, that seems intended to reset |
31 | 31 | the game and/or an external device. |
32 | 32 | - Added machine start & reset. |
33 | 33 | - All clocks pre defined. |
34 | | - Added ay8910 interfase as a preliminary attempt to analyze the unknown |
| 34 | - Added ay8910 interface as a preliminary attempt to analyze the unknown |
35 | 35 | port writes when these ports are set as input. |
36 | 36 | - Figured out the following DIP switches: |
37 | 37 | Auto Bet (No, Yes). |
r244977 | r244978 | |
72 | 72 | public: |
73 | 73 | supdrapo_state(const machine_config &mconfig, device_type type, const char *tag) |
74 | 74 | : driver_device(mconfig, type, tag), |
| 75 | m_maincpu(*this, "maincpu"), |
| 76 | m_gfxdecode(*this, "gfxdecode"), |
| 77 | m_palette(*this, "palette"), |
75 | 78 | m_col_line(*this, "col_line"), |
76 | 79 | m_videoram(*this, "videoram"), |
77 | | m_char_bank(*this, "char_bank"), |
78 | | m_maincpu(*this, "maincpu"), |
79 | | m_gfxdecode(*this, "gfxdecode"), |
80 | | m_palette(*this, "palette") { } |
| 80 | m_char_bank(*this, "char_bank") { } |
81 | 81 | |
| 82 | required_device<cpu_device> m_maincpu; |
| 83 | required_device<gfxdecode_device> m_gfxdecode; |
| 84 | required_device<palette_device> m_palette; |
| 85 | |
82 | 86 | required_shared_ptr<UINT8> m_col_line; |
83 | 87 | required_shared_ptr<UINT8> m_videoram; |
84 | 88 | required_shared_ptr<UINT8> m_char_bank; |
| 89 | |
85 | 90 | UINT8 m_wdog; |
86 | | DECLARE_READ8_MEMBER(sdpoker_rng_r); |
| 91 | |
| 92 | DECLARE_READ8_MEMBER(rng_r); |
87 | 93 | DECLARE_WRITE8_MEMBER(wdog8000_w); |
88 | 94 | DECLARE_WRITE8_MEMBER(debug8004_w); |
89 | 95 | DECLARE_WRITE8_MEMBER(debug7c00_w); |
r244977 | r244978 | |
91 | 97 | DECLARE_WRITE8_MEMBER(payout_w); |
92 | 98 | DECLARE_WRITE8_MEMBER(ay8910_outputa_w); |
93 | 99 | DECLARE_WRITE8_MEMBER(ay8910_outputb_w); |
| 100 | |
94 | 101 | virtual void machine_start(); |
95 | 102 | virtual void machine_reset(); |
96 | 103 | virtual void video_start(); |
97 | 104 | DECLARE_PALETTE_INIT(supdrapo); |
98 | | UINT32 screen_update_supdrapo(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); |
99 | | required_device<cpu_device> m_maincpu; |
100 | | required_device<gfxdecode_device> m_gfxdecode; |
101 | | required_device<palette_device> m_palette; |
| 105 | |
| 106 | UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); |
102 | 107 | }; |
103 | 108 | |
104 | 109 | |
r244977 | r244978 | |
111 | 116 | } |
112 | 117 | |
113 | 118 | |
114 | | UINT32 supdrapo_state::screen_update_supdrapo(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) |
| 119 | UINT32 supdrapo_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) |
115 | 120 | { |
116 | 121 | int x, y; |
117 | 122 | int count; |
r244977 | r244978 | |
171 | 176 | R/W Handlers |
172 | 177 | **********************************************************************/ |
173 | 178 | |
174 | | READ8_MEMBER(supdrapo_state::sdpoker_rng_r) |
| 179 | READ8_MEMBER(supdrapo_state::rng_r) |
175 | 180 | { |
176 | 181 | return machine().rand(); |
177 | 182 | } |
r244977 | r244978 | |
251 | 256 | |
252 | 257 | void supdrapo_state::machine_start() |
253 | 258 | { |
| 259 | save_item(NAME(m_wdog)); |
254 | 260 | } |
255 | 261 | |
256 | 262 | |
r244977 | r244978 | |
282 | 288 | AM_RANGE(0x8005, 0x8005) AM_READ_PORT("SW1") |
283 | 289 | AM_RANGE(0x8006, 0x8006) AM_READ_PORT("SW2") |
284 | 290 | AM_RANGE(0x9000, 0x90ff) AM_RAM AM_SHARE("nvram") |
285 | | AM_RANGE(0x9400, 0x9400) AM_READ(sdpoker_rng_r) |
| 291 | AM_RANGE(0x9400, 0x9400) AM_READ(rng_r) |
286 | 292 | AM_RANGE(0x9800, 0x9801) AM_DEVWRITE("aysnd", ay8910_device, data_address_w) |
287 | 293 | ADDRESS_MAP_END |
288 | 294 | |
r244977 | r244978 | |
453 | 459 | MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) |
454 | 460 | MCFG_SCREEN_SIZE(256, 256) |
455 | 461 | MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1) |
456 | | MCFG_SCREEN_UPDATE_DRIVER(supdrapo_state, screen_update_supdrapo) |
| 462 | MCFG_SCREEN_UPDATE_DRIVER(supdrapo_state, screen_update) |
457 | 463 | MCFG_SCREEN_PALETTE("palette") |
458 | 464 | |
459 | 465 | MCFG_GFXDECODE_ADD("gfxdecode", "palette", supdrapo) |
r244977 | r244978 | |
600 | 606 | **********************************************************************/ |
601 | 607 | |
602 | 608 | /* YEAR NAME PARENT MACHINE INPUT INIT ROT COMPANY FULLNAME FLAGS... */ |
603 | | GAME( 1983, supdrapo, 0, supdrapo, supdrapo, driver_device, 0, ROT90, "Valadon Automation (Stern Electronics license)", "Super Draw Poker (set 1)", 0 ) |
604 | | GAME( 1983, supdrapoa, supdrapo, supdrapo, supdrapo, driver_device, 0, ROT90, "Valadon Automation / Jeutel", "Super Draw Poker (set 2)", 0 ) |
605 | | GAME( 1983, supdrapob, supdrapo, supdrapo, supdrapo, driver_device, 0, ROT90, "bootleg", "Super Draw Poker (bootleg)", 0 ) |
| 609 | GAME( 1983, supdrapo, 0, supdrapo, supdrapo, driver_device, 0, ROT90, "Valadon Automation (Stern Electronics license)", "Super Draw Poker (set 1)", GAME_SUPPORTS_SAVE ) |
| 610 | GAME( 1983, supdrapoa, supdrapo, supdrapo, supdrapo, driver_device, 0, ROT90, "Valadon Automation / Jeutel", "Super Draw Poker (set 2)", GAME_SUPPORTS_SAVE ) |
| 611 | GAME( 1983, supdrapob, supdrapo, supdrapo, supdrapo, driver_device, 0, ROT90, "bootleg", "Super Draw Poker (bootleg)", GAME_SUPPORTS_SAVE ) |
trunk/src/mame/drivers/suprgolf.c
r244977 | r244978 | |
33 | 33 | public: |
34 | 34 | suprgolf_state(const machine_config &mconfig, device_type type, const char *tag) |
35 | 35 | : driver_device(mconfig, type, tag), |
36 | | m_videoram(*this, "videoram"), |
37 | 36 | m_maincpu(*this, "maincpu"), |
38 | 37 | m_msm(*this, "msm"), |
39 | 38 | m_gfxdecode(*this, "gfxdecode"), |
40 | | m_palette(*this, "palette") { } |
| 39 | m_palette(*this, "palette"), |
| 40 | m_videoram(*this, "videoram") { } |
41 | 41 | |
| 42 | required_device<cpu_device> m_maincpu; |
| 43 | required_device<msm5205_device> m_msm; |
| 44 | required_device<gfxdecode_device> m_gfxdecode; |
| 45 | required_device<palette_device> m_palette; |
| 46 | |
| 47 | required_shared_ptr<UINT8> m_videoram; |
| 48 | |
42 | 49 | tilemap_t *m_tilemap; |
43 | | required_shared_ptr<UINT8> m_videoram; |
44 | 50 | UINT8 *m_paletteram; |
45 | 51 | UINT8 *m_bg_vram; |
46 | 52 | UINT16 *m_bg_fb; |
r244977 | r244978 | |
54 | 60 | UINT8 m_palette_switch; |
55 | 61 | UINT8 m_bg_vreg_test; |
56 | 62 | UINT8 m_toggle; |
57 | | DECLARE_READ8_MEMBER(suprgolf_videoram_r); |
58 | | DECLARE_WRITE8_MEMBER(suprgolf_videoram_w); |
59 | | DECLARE_READ8_MEMBER(suprgolf_bg_vram_r); |
60 | | DECLARE_WRITE8_MEMBER(suprgolf_bg_vram_w); |
61 | | DECLARE_WRITE8_MEMBER(suprgolf_pen_w); |
| 63 | |
| 64 | DECLARE_READ8_MEMBER(videoram_r); |
| 65 | DECLARE_WRITE8_MEMBER(videoram_w); |
| 66 | DECLARE_READ8_MEMBER(bg_vram_r); |
| 67 | DECLARE_WRITE8_MEMBER(bg_vram_w); |
| 68 | DECLARE_WRITE8_MEMBER(pen_w); |
62 | 69 | DECLARE_WRITE8_MEMBER(adpcm_data_w); |
63 | 70 | DECLARE_WRITE8_MEMBER(rom2_bank_select_w); |
64 | | DECLARE_READ8_MEMBER(suprgolf_vregs_r); |
65 | | DECLARE_WRITE8_MEMBER(suprgolf_vregs_w); |
| 71 | DECLARE_READ8_MEMBER(vregs_r); |
| 72 | DECLARE_WRITE8_MEMBER(vregs_w); |
66 | 73 | DECLARE_READ8_MEMBER(rom_bank_select_r); |
67 | 74 | DECLARE_WRITE8_MEMBER(rom_bank_select_w); |
68 | 75 | DECLARE_READ8_MEMBER(pedal_extra_bits_r); |
69 | 76 | DECLARE_READ8_MEMBER(p1_r); |
70 | 77 | DECLARE_READ8_MEMBER(p2_r); |
71 | | DECLARE_WRITE8_MEMBER(suprgolf_writeA); |
72 | | DECLARE_WRITE8_MEMBER(suprgolf_writeB); |
| 78 | DECLARE_WRITE8_MEMBER(writeA); |
| 79 | DECLARE_WRITE8_MEMBER(writeB); |
| 80 | DECLARE_WRITE_LINE_MEMBER(adpcm_int); |
| 81 | |
| 82 | TILE_GET_INFO_MEMBER(get_tile_info); |
| 83 | |
73 | 84 | DECLARE_DRIVER_INIT(suprgolf); |
74 | | TILE_GET_INFO_MEMBER(get_tile_info); |
75 | 85 | virtual void machine_start(); |
76 | 86 | virtual void machine_reset(); |
77 | 87 | virtual void video_start(); |
78 | | UINT32 screen_update_suprgolf(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); |
79 | | DECLARE_WRITE_LINE_MEMBER(irqhandler); |
80 | | DECLARE_WRITE_LINE_MEMBER(adpcm_int); |
81 | | required_device<cpu_device> m_maincpu; |
82 | | required_device<msm5205_device> m_msm; |
83 | | required_device<gfxdecode_device> m_gfxdecode; |
84 | | required_device<palette_device> m_palette; |
| 88 | |
| 89 | UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); |
85 | 90 | }; |
86 | 91 | |
87 | 92 | TILE_GET_INFO_MEMBER(suprgolf_state::get_tile_info) |
r244977 | r244978 | |
104 | 109 | m_fg_fb = auto_alloc_array(machine(), UINT16, 0x2000*0x20); |
105 | 110 | |
106 | 111 | m_tilemap->set_transparent_pen(15); |
| 112 | |
| 113 | save_item(NAME(m_bg_bank)); |
| 114 | save_item(NAME(m_vreg_bank)); |
| 115 | save_item(NAME(m_vreg_pen)); |
| 116 | save_item(NAME(m_palette_switch)); |
| 117 | save_item(NAME(m_bg_vreg_test)); |
| 118 | save_pointer(NAME(m_paletteram), 0x1000); |
| 119 | save_pointer(NAME(m_bg_vram), 0x2000*0x20); |
| 120 | save_pointer(NAME(m_bg_fb), 0x2000*0x20); |
| 121 | save_pointer(NAME(m_fg_fb), 0x2000*0x20); |
107 | 122 | } |
108 | 123 | |
109 | | UINT32 suprgolf_state::screen_update_suprgolf(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) |
| 124 | UINT32 suprgolf_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) |
110 | 125 | { |
111 | 126 | int x,y,count,color; |
112 | 127 | bitmap.fill(m_palette->black_pen(), cliprect); |
r244977 | r244978 | |
150 | 165 | return 0; |
151 | 166 | } |
152 | 167 | |
153 | | READ8_MEMBER(suprgolf_state::suprgolf_videoram_r) |
| 168 | READ8_MEMBER(suprgolf_state::videoram_r) |
154 | 169 | { |
155 | 170 | if (m_palette_switch) |
156 | 171 | return m_paletteram[offset]; |
r244977 | r244978 | |
158 | 173 | return m_videoram[offset]; |
159 | 174 | } |
160 | 175 | |
161 | | WRITE8_MEMBER(suprgolf_state::suprgolf_videoram_w) |
| 176 | WRITE8_MEMBER(suprgolf_state::videoram_w) |
162 | 177 | { |
163 | 178 | if(m_palette_switch) |
164 | 179 | { |
r244977 | r244978 | |
180 | 195 | } |
181 | 196 | } |
182 | 197 | |
183 | | READ8_MEMBER(suprgolf_state::suprgolf_vregs_r) |
| 198 | READ8_MEMBER(suprgolf_state::vregs_r) |
184 | 199 | { |
185 | 200 | return m_vreg_bank; |
186 | 201 | } |
187 | 202 | |
188 | | WRITE8_MEMBER(suprgolf_state::suprgolf_vregs_w) |
| 203 | WRITE8_MEMBER(suprgolf_state::vregs_w) |
189 | 204 | { |
190 | 205 | //printf("%02x\n",data); |
191 | 206 | |
r244977 | r244978 | |
200 | 215 | // printf("Video regs with data %02x activated\n",data); |
201 | 216 | } |
202 | 217 | |
203 | | READ8_MEMBER(suprgolf_state::suprgolf_bg_vram_r) |
| 218 | READ8_MEMBER(suprgolf_state::bg_vram_r) |
204 | 219 | { |
205 | 220 | return m_bg_vram[offset+m_bg_bank*0x2000]; |
206 | 221 | } |
207 | 222 | |
208 | | WRITE8_MEMBER(suprgolf_state::suprgolf_bg_vram_w) |
| 223 | WRITE8_MEMBER(suprgolf_state::bg_vram_w) |
209 | 224 | { |
210 | 225 | UINT8 hi_nibble,lo_nibble; |
211 | 226 | UINT8 hi_dirty_dot,lo_dirty_dot; // helpers |
r244977 | r244978 | |
254 | 269 | { |
255 | 270 | membank("bank1")->configure_entries(0, 16, memregion("user2")->base(), 0x4000); |
256 | 271 | membank("bank2")->configure_entries(0, 64, memregion("user1")->base(), 0x4000); |
| 272 | |
| 273 | save_item(NAME(m_rom_bank)); |
| 274 | save_item(NAME(m_msm5205next)); |
| 275 | save_item(NAME(m_msm_nmi_mask)); |
| 276 | save_item(NAME(m_toggle)); |
257 | 277 | } |
258 | 278 | |
259 | | WRITE8_MEMBER(suprgolf_state::suprgolf_pen_w) |
| 279 | WRITE8_MEMBER(suprgolf_state::pen_w) |
260 | 280 | { |
261 | 281 | m_vreg_pen = data; |
262 | 282 | } |
r244977 | r244978 | |
317 | 337 | AM_RANGE(0x4000, 0x7fff) AM_ROMBANK("bank1") |
318 | 338 | AM_RANGE(0x4000, 0x4000) AM_WRITE(rom2_bank_select_w ) |
319 | 339 | AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("bank2") |
320 | | AM_RANGE(0xc000, 0xdfff) AM_READWRITE(suprgolf_bg_vram_r, suprgolf_bg_vram_w ) // banked background vram |
321 | | AM_RANGE(0xe000, 0xefff) AM_READWRITE(suprgolf_videoram_r, suprgolf_videoram_w ) AM_SHARE("videoram") //foreground vram + paletteram |
322 | | AM_RANGE(0xf000, 0xf000) AM_WRITE(suprgolf_pen_w ) |
| 340 | AM_RANGE(0xc000, 0xdfff) AM_READWRITE(bg_vram_r, bg_vram_w ) // banked background vram |
| 341 | AM_RANGE(0xe000, 0xefff) AM_READWRITE(videoram_r, videoram_w ) AM_SHARE("videoram") //foreground vram + paletteram |
| 342 | AM_RANGE(0xf000, 0xf000) AM_WRITE(pen_w ) |
323 | 343 | AM_RANGE(0xf800, 0xffff) AM_RAM |
324 | 344 | ADDRESS_MAP_END |
325 | 345 | |
r244977 | r244978 | |
416 | 436 | PORT_DIPUNUSED_DIPLOC( 0x80, 0x00, "SW2:8" ) |
417 | 437 | INPUT_PORTS_END |
418 | 438 | |
419 | | WRITE8_MEMBER(suprgolf_state::suprgolf_writeA) |
| 439 | WRITE8_MEMBER(suprgolf_state::writeA) |
420 | 440 | { |
421 | 441 | osd_printf_debug("ymwA\n"); |
422 | 442 | } |
423 | 443 | |
424 | | WRITE8_MEMBER(suprgolf_state::suprgolf_writeB) |
| 444 | WRITE8_MEMBER(suprgolf_state::writeB) |
425 | 445 | { |
426 | 446 | osd_printf_debug("ymwA\n"); |
427 | 447 | } |
428 | 448 | |
429 | | WRITE_LINE_MEMBER(suprgolf_state::irqhandler) |
430 | | { |
431 | | //m_maincpu->set_input_line(INPUT_LINE_NMI, state ? ASSERT_LINE : CLEAR_LINE); |
432 | | } |
433 | | |
434 | 449 | WRITE_LINE_MEMBER(suprgolf_state::adpcm_int) |
435 | 450 | { |
436 | 451 | m_msm->reset_w(0); |
r244977 | r244978 | |
485 | 500 | MCFG_I8255_IN_PORTA_CB(IOPORT("SYSTEM")) |
486 | 501 | MCFG_I8255_IN_PORTB_CB(READ8(suprgolf_state, rom_bank_select_r)) |
487 | 502 | MCFG_I8255_OUT_PORTB_CB(WRITE8(suprgolf_state, rom_bank_select_w)) |
488 | | MCFG_I8255_IN_PORTC_CB(READ8(suprgolf_state, suprgolf_vregs_r)) |
489 | | MCFG_I8255_OUT_PORTC_CB(WRITE8(suprgolf_state, suprgolf_vregs_w)) |
| 503 | MCFG_I8255_IN_PORTC_CB(READ8(suprgolf_state, vregs_r)) |
| 504 | MCFG_I8255_OUT_PORTC_CB(WRITE8(suprgolf_state, vregs_w)) |
490 | 505 | |
491 | 506 | /* video hardware */ |
492 | 507 | MCFG_SCREEN_ADD("screen", RASTER) |
r244977 | r244978 | |
494 | 509 | MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) |
495 | 510 | MCFG_SCREEN_SIZE(256, 256) |
496 | 511 | MCFG_SCREEN_VISIBLE_AREA(0, 255, 0, 191) |
497 | | MCFG_SCREEN_UPDATE_DRIVER(suprgolf_state, screen_update_suprgolf) |
| 512 | MCFG_SCREEN_UPDATE_DRIVER(suprgolf_state, screen_update) |
498 | 513 | MCFG_SCREEN_PALETTE("palette") |
499 | 514 | |
500 | 515 | MCFG_GFXDECODE_ADD("gfxdecode", "palette", suprgolf) |
r244977 | r244978 | |
504 | 519 | MCFG_SPEAKER_STANDARD_MONO("mono") |
505 | 520 | |
506 | 521 | MCFG_SOUND_ADD("ymsnd", YM2203, MASTER_CLOCK/4) /* guess */ |
507 | | MCFG_YM2203_IRQ_HANDLER(WRITELINE(suprgolf_state, irqhandler)) |
| 522 | //MCFG_YM2203_IRQ_HANDLER(INPUTLINE("maincpu", INPUT_LINE_NMI)) |
508 | 523 | MCFG_AY8910_PORT_A_READ_CB(IOPORT("DSW0")) |
509 | 524 | MCFG_AY8910_PORT_B_READ_CB(IOPORT("DSW1")) |
510 | | MCFG_AY8910_PORT_A_WRITE_CB(WRITE8(suprgolf_state, suprgolf_writeA)) |
511 | | MCFG_AY8910_PORT_B_WRITE_CB(WRITE8(suprgolf_state, suprgolf_writeB)) |
| 525 | MCFG_AY8910_PORT_A_WRITE_CB(WRITE8(suprgolf_state, writeA)) |
| 526 | MCFG_AY8910_PORT_B_WRITE_CB(WRITE8(suprgolf_state, writeB)) |
512 | 527 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.5) |
513 | 528 | |
514 | 529 | MCFG_SOUND_ADD("msm", MSM5205, XTAL_384kHz) /* guess */ |
r244977 | r244978 | |
621 | 636 | ROM[0x6d72+(0x4000*3)-0x4000] = 0x20; //patch ROM check |
622 | 637 | } |
623 | 638 | |
624 | | GAME( 1989, suprgolf, 0, suprgolf, suprgolf, suprgolf_state, suprgolf, ROT0, "Nasco", "Super Crowns Golf (Japan)", GAME_IMPERFECT_GRAPHICS | GAME_NO_COCKTAIL ) |
625 | | GAME( 1989, albatross, suprgolf, suprgolf, suprgolf, driver_device, 0, ROT0, "Nasco", "Albatross (US Prototype?)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_NO_COCKTAIL ) |
| 639 | GAME( 1989, suprgolf, 0, suprgolf, suprgolf, suprgolf_state, suprgolf, ROT0, "Nasco", "Super Crowns Golf (Japan)", GAME_IMPERFECT_GRAPHICS | GAME_NO_COCKTAIL | GAME_SUPPORTS_SAVE ) |
| 640 | GAME( 1989, albatross, suprgolf, suprgolf, suprgolf, driver_device, 0, ROT0, "Nasco", "Albatross (US Prototype?)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_NO_COCKTAIL| GAME_SUPPORTS_SAVE ) |
trunk/src/mame/drivers/suprloco.c
r244977 | r244978 | |
5 | 5 | driver by Zsolt Vasvari |
6 | 6 | |
7 | 7 | TODO: |
8 | | - Bit 5 in suprloco_control_w is pulsed when loco turns "super". This is supposed |
| 8 | - Bit 5 in control_w is pulsed when loco turns "super". This is supposed |
9 | 9 | to make red parts of sprites blink to purple, it's not clear how this is |
10 | 10 | implemented in hardware, there's a hack to support it. |
11 | 11 | |
r244977 | r244978 | |
25 | 25 | #include "sound/sn76496.h" |
26 | 26 | #include "includes/suprloco.h" |
27 | 27 | |
28 | | WRITE8_MEMBER(suprloco_state::suprloco_soundport_w) |
| 28 | WRITE8_MEMBER(suprloco_state::soundport_w) |
29 | 29 | { |
30 | 30 | soundlatch_byte_w(space, 0, data); |
31 | 31 | m_audiocpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE); |
r244977 | r244978 | |
42 | 42 | AM_RANGE(0xd800, 0xd800) AM_READ_PORT("P2") |
43 | 43 | AM_RANGE(0xe000, 0xe000) AM_READ_PORT("DSW1") |
44 | 44 | AM_RANGE(0xe001, 0xe001) AM_READ_PORT("DSW2") |
45 | | AM_RANGE(0xe800, 0xe800) AM_WRITE(suprloco_soundport_w) |
46 | | AM_RANGE(0xe801, 0xe801) AM_READWRITE(suprloco_control_r, suprloco_control_w) |
47 | | AM_RANGE(0xf000, 0xf6ff) AM_RAM_WRITE(suprloco_videoram_w) AM_SHARE("videoram") |
| 45 | AM_RANGE(0xe800, 0xe800) AM_WRITE(soundport_w) |
| 46 | AM_RANGE(0xe801, 0xe801) AM_READWRITE(control_r, control_w) |
| 47 | AM_RANGE(0xf000, 0xf6ff) AM_RAM_WRITE(videoram_w) AM_SHARE("videoram") |
48 | 48 | AM_RANGE(0xf700, 0xf7df) AM_RAM /* unused */ |
49 | | AM_RANGE(0xf7e0, 0xf7ff) AM_RAM_WRITE(suprloco_scrollram_w) AM_SHARE("scrollram") |
| 49 | AM_RANGE(0xf7e0, 0xf7ff) AM_RAM_WRITE(scrollram_w) AM_SHARE("scrollram") |
50 | 50 | AM_RANGE(0xf800, 0xffff) AM_RAM |
51 | 51 | ADDRESS_MAP_END |
52 | 52 | |
r244977 | r244978 | |
175 | 175 | MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(5000)) |
176 | 176 | MCFG_SCREEN_SIZE(32*8, 32*8) |
177 | 177 | MCFG_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 0*8, 28*8-1) |
178 | | MCFG_SCREEN_UPDATE_DRIVER(suprloco_state, screen_update_suprloco) |
| 178 | MCFG_SCREEN_UPDATE_DRIVER(suprloco_state, screen_update) |
179 | 179 | MCFG_SCREEN_PALETTE("palette") |
180 | 180 | |
181 | 181 | MCFG_GFXDECODE_ADD("gfxdecode", "palette", suprloco) |
r244977 | r244978 | |
297 | 297 | |
298 | 298 | |
299 | 299 | |
300 | | GAME( 1982, suprloco, 0, suprloco, suprloco, suprloco_state, suprloco, ROT0, "Sega", "Super Locomotive (Rev.A)", 0 ) |
301 | | GAME( 1982, suprlocoo, suprloco, suprloco, suprloco, suprloco_state, suprloco, ROT0, "Sega", "Super Locomotive", 0 ) |
| 300 | GAME( 1982, suprloco, 0, suprloco, suprloco, suprloco_state, suprloco, ROT0, "Sega", "Super Locomotive (Rev.A)", GAME_SUPPORTS_SAVE ) |
| 301 | GAME( 1982, suprlocoo, suprloco, suprloco, suprloco, suprloco_state, suprloco, ROT0, "Sega", "Super Locomotive", GAME_SUPPORTS_SAVE ) |
trunk/src/mame/drivers/suprridr.c
r244977 | r244978 | |
89 | 89 | #include "sound/ay8910.h" |
90 | 90 | |
91 | 91 | |
| 92 | void suprridr_state::machine_start() |
| 93 | { |
| 94 | save_item(NAME(m_nmi_enable)); |
| 95 | save_item(NAME(m_sound_data)); |
| 96 | } |
| 97 | |
92 | 98 | /************************************* |
93 | 99 | * |
94 | 100 | * Interrupt generation |
r244977 | r244978 | |
164 | 170 | static ADDRESS_MAP_START( main_map, AS_PROGRAM, 8, suprridr_state ) |
165 | 171 | AM_RANGE(0x0000, 0x7fff) AM_ROM |
166 | 172 | AM_RANGE(0x8000, 0x87ff) AM_RAM |
167 | | AM_RANGE(0x8800, 0x8bff) AM_RAM_WRITE(suprridr_bgram_w) AM_SHARE("bgram") |
168 | | AM_RANGE(0x9000, 0x97ff) AM_RAM_WRITE(suprridr_fgram_w) AM_SHARE("fgram") |
| 173 | AM_RANGE(0x8800, 0x8bff) AM_RAM_WRITE(bgram_w) AM_SHARE("bgram") |
| 174 | AM_RANGE(0x9000, 0x97ff) AM_RAM_WRITE(fgram_w) AM_SHARE("fgram") |
169 | 175 | AM_RANGE(0x9800, 0x983f) AM_RAM |
170 | 176 | AM_RANGE(0x9840, 0x987f) AM_RAM AM_SHARE("spriteram") |
171 | 177 | AM_RANGE(0x9880, 0x9bff) AM_RAM |
r244977 | r244978 | |
173 | 179 | AM_RANGE(0xa800, 0xa800) AM_READ_PORT("SYSTEM") |
174 | 180 | AM_RANGE(0xb000, 0xb000) AM_READ_PORT("DSW") AM_WRITE(nmi_enable_w) |
175 | 181 | AM_RANGE(0xb002, 0xb003) AM_WRITE(coin_lock_w) |
176 | | AM_RANGE(0xb006, 0xb006) AM_WRITE(suprridr_flipx_w) |
177 | | AM_RANGE(0xb007, 0xb007) AM_WRITE(suprridr_flipy_w) |
| 182 | AM_RANGE(0xb006, 0xb006) AM_WRITE(flipx_w) |
| 183 | AM_RANGE(0xb007, 0xb007) AM_WRITE(flipy_w) |
178 | 184 | AM_RANGE(0xb800, 0xb800) AM_WRITE(sound_data_w) |
179 | | AM_RANGE(0xc801, 0xc801) AM_WRITE(suprridr_fgdisable_w) |
180 | | AM_RANGE(0xc802, 0xc802) AM_WRITE(suprridr_fgscrolly_w) |
181 | | AM_RANGE(0xc804, 0xc804) AM_WRITE(suprridr_bgscrolly_w) |
| 185 | AM_RANGE(0xc801, 0xc801) AM_WRITE(fgdisable_w) |
| 186 | AM_RANGE(0xc802, 0xc802) AM_WRITE(fgscrolly_w) |
| 187 | AM_RANGE(0xc804, 0xc804) AM_WRITE(bgscrolly_w) |
182 | 188 | AM_RANGE(0xc000, 0xefff) AM_ROM |
183 | 189 | ADDRESS_MAP_END |
184 | 190 | |
r244977 | r244978 | |
223 | 229 | #define SUPRRIDR_P1_CONTROL_PORT_TAG ("CONTP1") |
224 | 230 | #define SUPRRIDR_P2_CONTROL_PORT_TAG ("CONTP2") |
225 | 231 | |
226 | | CUSTOM_INPUT_MEMBER(suprridr_state::suprridr_control_r) |
| 232 | CUSTOM_INPUT_MEMBER(suprridr_state::control_r) |
227 | 233 | { |
228 | 234 | UINT32 ret; |
229 | 235 | |
230 | 236 | /* screen flip multiplexes controls */ |
231 | | if (suprridr_is_screen_flipped()) |
| 237 | if (is_screen_flipped()) |
232 | 238 | ret = ioport(SUPRRIDR_P2_CONTROL_PORT_TAG)->read(); |
233 | 239 | else |
234 | 240 | ret = ioport(SUPRRIDR_P1_CONTROL_PORT_TAG)->read(); |
r244977 | r244978 | |
239 | 245 | |
240 | 246 | static INPUT_PORTS_START( suprridr ) |
241 | 247 | PORT_START("INPUTS") |
242 | | PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, suprridr_state,suprridr_control_r, NULL) |
| 248 | PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, suprridr_state, control_r, NULL) |
243 | 249 | |
244 | 250 | PORT_START("SYSTEM") |
245 | 251 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 ) |
r244977 | r244978 | |
353 | 359 | MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) |
354 | 360 | MCFG_SCREEN_SIZE(32*8, 32*8) |
355 | 361 | MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) |
356 | | MCFG_SCREEN_UPDATE_DRIVER(suprridr_state, screen_update_suprridr) |
| 362 | MCFG_SCREEN_UPDATE_DRIVER(suprridr_state, screen_update) |
357 | 363 | MCFG_SCREEN_PALETTE("palette") |
358 | 364 | |
359 | 365 | MCFG_GFXDECODE_ADD("gfxdecode", "palette", suprridr) |
r244977 | r244978 | |
423 | 429 | * |
424 | 430 | *************************************/ |
425 | 431 | |
426 | | GAME( 1983, suprridr, 0, suprridr, suprridr, driver_device, 0, ROT90, "Taito Corporation (Venture Line license)", "Super Rider", GAME_IMPERFECT_SOUND ) |
| 432 | GAME( 1983, suprridr, 0, suprridr, suprridr, driver_device, 0, ROT90, "Taito Corporation (Venture Line license)", "Super Rider", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) |
trunk/src/mame/includes/suprloco.h
r244977 | r244978 | |
3 | 3 | public: |
4 | 4 | suprloco_state(const machine_config &mconfig, device_type type, const char *tag) |
5 | 5 | : driver_device(mconfig, type, tag), |
| 6 | m_maincpu(*this, "maincpu"), |
| 7 | m_audiocpu(*this, "audiocpu"), |
| 8 | m_gfxdecode(*this, "gfxdecode"), |
6 | 9 | m_spriteram(*this, "spriteram"), |
7 | 10 | m_videoram(*this, "videoram"), |
8 | | m_scrollram(*this, "scrollram"), |
9 | | m_maincpu(*this, "maincpu"), |
10 | | m_audiocpu(*this, "audiocpu"), |
11 | | m_gfxdecode(*this, "gfxdecode") { } |
| 11 | m_scrollram(*this, "scrollram") { } |
| 12 | |
| 13 | required_device<cpu_device> m_maincpu; |
| 14 | required_device<cpu_device> m_audiocpu; |
| 15 | required_device<gfxdecode_device> m_gfxdecode; |
12 | 16 | |
13 | 17 | required_shared_ptr<UINT8> m_spriteram; |
14 | 18 | required_shared_ptr<UINT8> m_videoram; |
15 | 19 | required_shared_ptr<UINT8> m_scrollram; |
| 20 | |
16 | 21 | tilemap_t *m_bg_tilemap; |
17 | 22 | int m_control; |
18 | 23 | |
19 | | DECLARE_WRITE8_MEMBER(suprloco_soundport_w); |
20 | | DECLARE_WRITE8_MEMBER(suprloco_videoram_w); |
21 | | DECLARE_WRITE8_MEMBER(suprloco_scrollram_w); |
22 | | DECLARE_WRITE8_MEMBER(suprloco_control_w); |
23 | | DECLARE_READ8_MEMBER(suprloco_control_r); |
24 | | DECLARE_DRIVER_INIT(suprloco); |
| 24 | DECLARE_WRITE8_MEMBER(soundport_w); |
| 25 | DECLARE_WRITE8_MEMBER(videoram_w); |
| 26 | DECLARE_WRITE8_MEMBER(scrollram_w); |
| 27 | DECLARE_WRITE8_MEMBER(control_w); |
| 28 | DECLARE_READ8_MEMBER(control_r); |
| 29 | |
25 | 30 | TILE_GET_INFO_MEMBER(get_tile_info); |
| 31 | |
26 | 32 | virtual void video_start(); |
27 | 33 | DECLARE_PALETTE_INIT(suprloco); |
28 | | UINT32 screen_update_suprloco(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); |
| 34 | DECLARE_DRIVER_INIT(suprloco); |
| 35 | |
| 36 | UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); |
29 | 37 | inline void draw_pixel(bitmap_ind16 &bitmap,const rectangle &cliprect,int x,int y,int color,int flip); |
30 | 38 | void draw_sprite(bitmap_ind16 &bitmap,const rectangle &cliprect,int spr_number); |
31 | 39 | void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect); |
32 | | required_device<cpu_device> m_maincpu; |
33 | | required_device<cpu_device> m_audiocpu; |
34 | | required_device<gfxdecode_device> m_gfxdecode; |
35 | 40 | }; |
trunk/src/mame/includes/suprridr.h
r244977 | r244978 | |
11 | 11 | public: |
12 | 12 | suprridr_state(const machine_config &mconfig, device_type type, const char *tag) |
13 | 13 | : driver_device(mconfig, type, tag), |
14 | | m_fgram(*this, "fgram"), |
15 | | m_bgram(*this, "bgram"), |
16 | | m_spriteram(*this, "spriteram"), |
17 | 14 | m_maincpu(*this, "maincpu"), |
18 | 15 | m_audiocpu(*this, "audiocpu"), |
19 | 16 | m_gfxdecode(*this, "gfxdecode"), |
20 | | m_palette(*this, "palette") { } |
| 17 | m_palette(*this, "palette"), |
| 18 | m_fgram(*this, "fgram"), |
| 19 | m_bgram(*this, "bgram"), |
| 20 | m_spriteram(*this, "spriteram") { } |
21 | 21 | |
| 22 | required_device<cpu_device> m_maincpu; |
| 23 | required_device<cpu_device> m_audiocpu; |
| 24 | required_device<gfxdecode_device> m_gfxdecode; |
| 25 | required_device<palette_device> m_palette; |
| 26 | |
| 27 | required_shared_ptr<UINT8> m_fgram; |
| 28 | required_shared_ptr<UINT8> m_bgram; |
| 29 | required_shared_ptr<UINT8> m_spriteram; |
| 30 | |
22 | 31 | UINT8 m_nmi_enable; |
23 | 32 | UINT8 m_sound_data; |
24 | | required_shared_ptr<UINT8> m_fgram; |
25 | | required_shared_ptr<UINT8> m_bgram; |
26 | 33 | tilemap_t *m_fg_tilemap; |
27 | 34 | tilemap_t *m_bg_tilemap; |
28 | 35 | tilemap_t *m_bg_tilemap_noscroll; |
29 | 36 | UINT8 m_flipx; |
30 | 37 | UINT8 m_flipy; |
31 | | required_shared_ptr<UINT8> m_spriteram; |
| 38 | |
32 | 39 | DECLARE_WRITE8_MEMBER(nmi_enable_w); |
33 | 40 | DECLARE_WRITE8_MEMBER(sound_data_w); |
34 | 41 | DECLARE_WRITE8_MEMBER(sound_irq_ack_w); |
35 | 42 | DECLARE_WRITE8_MEMBER(coin_lock_w); |
36 | | DECLARE_WRITE8_MEMBER(suprridr_flipx_w); |
37 | | DECLARE_WRITE8_MEMBER(suprridr_flipy_w); |
38 | | DECLARE_WRITE8_MEMBER(suprridr_fgdisable_w); |
39 | | DECLARE_WRITE8_MEMBER(suprridr_fgscrolly_w); |
40 | | DECLARE_WRITE8_MEMBER(suprridr_bgscrolly_w); |
41 | | DECLARE_WRITE8_MEMBER(suprridr_bgram_w); |
42 | | DECLARE_WRITE8_MEMBER(suprridr_fgram_w); |
43 | | DECLARE_CUSTOM_INPUT_MEMBER(suprridr_control_r); |
| 43 | DECLARE_WRITE8_MEMBER(flipx_w); |
| 44 | DECLARE_WRITE8_MEMBER(flipy_w); |
| 45 | DECLARE_WRITE8_MEMBER(fgdisable_w); |
| 46 | DECLARE_WRITE8_MEMBER(fgscrolly_w); |
| 47 | DECLARE_WRITE8_MEMBER(bgscrolly_w); |
| 48 | DECLARE_WRITE8_MEMBER(bgram_w); |
| 49 | DECLARE_WRITE8_MEMBER(fgram_w); |
44 | 50 | DECLARE_READ8_MEMBER(sound_data_r); |
| 51 | |
| 52 | DECLARE_CUSTOM_INPUT_MEMBER(control_r); |
| 53 | |
45 | 54 | TILE_GET_INFO_MEMBER(get_tile_info); |
46 | 55 | TILE_GET_INFO_MEMBER(get_tile_info2); |
| 56 | |
| 57 | INTERRUPT_GEN_MEMBER(main_nmi_gen); |
| 58 | TIMER_CALLBACK_MEMBER(delayed_sound_w); |
| 59 | |
| 60 | virtual void machine_start(); |
47 | 61 | virtual void video_start(); |
48 | 62 | DECLARE_PALETTE_INIT(suprridr); |
49 | | UINT32 screen_update_suprridr(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); |
50 | | INTERRUPT_GEN_MEMBER(main_nmi_gen); |
51 | | TIMER_CALLBACK_MEMBER(delayed_sound_w); |
52 | | int suprridr_is_screen_flipped(); |
53 | | required_device<cpu_device> m_maincpu; |
54 | | required_device<cpu_device> m_audiocpu; |
55 | | required_device<gfxdecode_device> m_gfxdecode; |
56 | | required_device<palette_device> m_palette; |
| 63 | |
| 64 | UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); |
| 65 | int is_screen_flipped(); |
57 | 66 | }; |
trunk/src/mame/video/suprridr.c
r244977 | r244978 | |
44 | 44 | m_bg_tilemap_noscroll = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(suprridr_state::get_tile_info),this), TILEMAP_SCAN_ROWS, 8,8, 32,32); |
45 | 45 | |
46 | 46 | m_fg_tilemap->set_transparent_pen(0); |
| 47 | |
| 48 | save_item(NAME(m_flipx)); |
| 49 | save_item(NAME(m_flipy)); |
47 | 50 | } |
48 | 51 | |
49 | 52 | |
r244977 | r244978 | |
91 | 94 | * |
92 | 95 | *************************************/ |
93 | 96 | |
94 | | WRITE8_MEMBER(suprridr_state::suprridr_flipx_w) |
| 97 | WRITE8_MEMBER(suprridr_state::flipx_w) |
95 | 98 | { |
96 | 99 | m_flipx = data & 1; |
97 | 100 | machine().tilemap().set_flip_all((m_flipx ? TILEMAP_FLIPX : 0) | (m_flipy ? TILEMAP_FLIPY : 0)); |
98 | 101 | } |
99 | 102 | |
100 | 103 | |
101 | | WRITE8_MEMBER(suprridr_state::suprridr_flipy_w) |
| 104 | WRITE8_MEMBER(suprridr_state::flipy_w) |
102 | 105 | { |
103 | 106 | m_flipy = data & 1; |
104 | 107 | machine().tilemap().set_flip_all((m_flipx ? TILEMAP_FLIPX : 0) | (m_flipy ? TILEMAP_FLIPY : 0)); |
105 | 108 | } |
106 | 109 | |
107 | 110 | |
108 | | WRITE8_MEMBER(suprridr_state::suprridr_fgdisable_w) |
| 111 | WRITE8_MEMBER(suprridr_state::fgdisable_w) |
109 | 112 | { |
110 | 113 | m_fg_tilemap->enable(~data & 1); |
111 | 114 | } |
112 | 115 | |
113 | 116 | |
114 | | WRITE8_MEMBER(suprridr_state::suprridr_fgscrolly_w) |
| 117 | WRITE8_MEMBER(suprridr_state::fgscrolly_w) |
115 | 118 | { |
116 | 119 | m_fg_tilemap->set_scrolly(0, data); |
117 | 120 | } |
118 | 121 | |
119 | 122 | |
120 | | WRITE8_MEMBER(suprridr_state::suprridr_bgscrolly_w) |
| 123 | WRITE8_MEMBER(suprridr_state::bgscrolly_w) |
121 | 124 | { |
122 | 125 | m_bg_tilemap->set_scrolly(0, data); |
123 | 126 | } |
124 | 127 | |
125 | 128 | |
126 | | int suprridr_state::suprridr_is_screen_flipped() |
| 129 | int suprridr_state::is_screen_flipped() |
127 | 130 | { |
128 | 131 | return m_flipx; /* or is it flipy? */ |
129 | 132 | } |
r244977 | r244978 | |
136 | 139 | * |
137 | 140 | *************************************/ |
138 | 141 | |
139 | | WRITE8_MEMBER(suprridr_state::suprridr_bgram_w) |
| 142 | WRITE8_MEMBER(suprridr_state::bgram_w) |
140 | 143 | { |
141 | 144 | m_bgram[offset] = data; |
142 | 145 | m_bg_tilemap->mark_tile_dirty(offset); |
r244977 | r244978 | |
144 | 147 | } |
145 | 148 | |
146 | 149 | |
147 | | WRITE8_MEMBER(suprridr_state::suprridr_fgram_w) |
| 150 | WRITE8_MEMBER(suprridr_state::fgram_w) |
148 | 151 | { |
149 | 152 | m_fgram[offset] = data; |
150 | 153 | m_fg_tilemap->mark_tile_dirty(offset); |
r244977 | r244978 | |
158 | 161 | * |
159 | 162 | *************************************/ |
160 | 163 | |
161 | | UINT32 suprridr_state::screen_update_suprridr(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) |
| 164 | UINT32 suprridr_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) |
162 | 165 | { |
163 | | UINT8 *spriteram = m_spriteram; |
164 | 166 | rectangle subclip; |
165 | | int i; |
166 | 167 | const rectangle &visarea = screen.visible_area(); |
167 | 168 | |
168 | 169 | /* render left 4 columns with no scroll */ |
r244977 | r244978 | |
188 | 189 | m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 0); |
189 | 190 | |
190 | 191 | /* draw the sprites */ |
191 | | for (i = 0; i < 48; i++) |
| 192 | for (int i = 0; i < 48; i++) |
192 | 193 | { |
193 | | int code = (spriteram[i*4+1] & 0x3f) | ((spriteram[i*4+2] >> 1) & 0x40); |
194 | | int color = spriteram[i*4+2] & 0x7f; |
195 | | int fx = spriteram[i*4+1] & 0x40; |
196 | | int fy = spriteram[i*4+1] & 0x80; |
197 | | int x = spriteram[i*4+3]; |
198 | | int y = 240 - spriteram[i*4+0]; |
| 194 | int code = (m_spriteram[i*4+1] & 0x3f) | ((m_spriteram[i*4+2] >> 1) & 0x40); |
| 195 | int color = m_spriteram[i*4+2] & 0x7f; |
| 196 | int fx = m_spriteram[i*4+1] & 0x40; |
| 197 | int fy = m_spriteram[i*4+1] & 0x80; |
| 198 | int x = m_spriteram[i*4+3]; |
| 199 | int y = 240 - m_spriteram[i*4+0]; |
199 | 200 | |
200 | 201 | if (m_flipx) |
201 | 202 | { |