trunk/src/mame/drivers/mgolf.c
| r244702 | r244703 | |
| 17 | 17 | |
| 18 | 18 | mgolf_state(const machine_config &mconfig, device_type type, const char *tag) |
| 19 | 19 | : driver_device(mconfig, type, tag), |
| 20 | | m_video_ram(*this, "video_ram"), |
| 21 | 20 | m_maincpu(*this, "maincpu"), |
| 22 | 21 | m_gfxdecode(*this, "gfxdecode"), |
| 23 | 22 | m_screen(*this, "screen"), |
| 24 | | m_palette(*this, "palette") { } |
| 23 | m_palette(*this, "palette"), |
| 24 | m_video_ram(*this, "video_ram") { } |
| 25 | 25 | |
| 26 | /* devices */ |
| 27 | required_device<cpu_device> m_maincpu; |
| 28 | required_device<gfxdecode_device> m_gfxdecode; |
| 29 | required_device<screen_device> m_screen; |
| 30 | required_device<palette_device> m_palette; |
| 31 | |
| 26 | 32 | /* memory pointers */ |
| 27 | 33 | required_shared_ptr<UINT8> m_video_ram; |
| 28 | 34 | |
| r244702 | r244703 | |
| 34 | 40 | UINT8 m_mask; |
| 35 | 41 | attotime m_time_pushed; |
| 36 | 42 | attotime m_time_released; |
| 43 | emu_timer *m_interrupt_timer; |
| 37 | 44 | |
| 38 | | /* devices */ |
| 39 | | required_device<cpu_device> m_maincpu; |
| 40 | | required_device<gfxdecode_device> m_gfxdecode; |
| 41 | | required_device<screen_device> m_screen; |
| 42 | | required_device<palette_device> m_palette; |
| 43 | | |
| 44 | | DECLARE_WRITE8_MEMBER(mgolf_vram_w); |
| 45 | | DECLARE_READ8_MEMBER(mgolf_wram_r); |
| 46 | | DECLARE_READ8_MEMBER(mgolf_dial_r); |
| 47 | | DECLARE_READ8_MEMBER(mgolf_misc_r); |
| 48 | | DECLARE_WRITE8_MEMBER(mgolf_wram_w); |
| 45 | DECLARE_WRITE8_MEMBER(vram_w); |
| 46 | DECLARE_READ8_MEMBER(wram_r); |
| 47 | DECLARE_READ8_MEMBER(dial_r); |
| 48 | DECLARE_READ8_MEMBER(misc_r); |
| 49 | DECLARE_WRITE8_MEMBER(wram_w); |
| 50 | |
| 49 | 51 | TILE_GET_INFO_MEMBER(get_tile_info); |
| 52 | |
| 50 | 53 | virtual void machine_start(); |
| 51 | 54 | virtual void machine_reset(); |
| 52 | 55 | virtual void video_start(); |
| 53 | 56 | DECLARE_PALETTE_INIT(mgolf); |
| 54 | | UINT32 screen_update_mgolf(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); |
| 57 | |
| 58 | UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); |
| 59 | |
| 55 | 60 | TIMER_CALLBACK_MEMBER(interrupt_callback); |
| 61 | |
| 56 | 62 | void update_plunger( ); |
| 57 | 63 | double calc_plunger_pos(); |
| 58 | 64 | |
| r244702 | r244703 | |
| 69 | 75 | } |
| 70 | 76 | |
| 71 | 77 | |
| 72 | | WRITE8_MEMBER(mgolf_state::mgolf_vram_w) |
| 78 | WRITE8_MEMBER(mgolf_state::vram_w) |
| 73 | 79 | { |
| 74 | 80 | m_video_ram[offset] = data; |
| 75 | 81 | m_bg_tilemap->mark_tile_dirty(offset); |
| r244702 | r244703 | |
| 82 | 88 | } |
| 83 | 89 | |
| 84 | 90 | |
| 85 | | UINT32 mgolf_state::screen_update_mgolf(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) |
| 91 | UINT32 mgolf_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) |
| 86 | 92 | { |
| 87 | 93 | int i; |
| 88 | 94 | |
| r244702 | r244703 | |
| 157 | 163 | if (scanline >= 262) |
| 158 | 164 | scanline = 16; |
| 159 | 165 | |
| 160 | | timer_set(m_screen->time_until_pos(scanline), TIMER_INTERRUPT, scanline); |
| 166 | m_interrupt_timer->adjust(m_screen->time_until_pos(scanline), scanline); |
| 161 | 167 | } |
| 162 | 168 | |
| 163 | 169 | |
| r244702 | r244703 | |
| 167 | 173 | } |
| 168 | 174 | |
| 169 | 175 | |
| 170 | | READ8_MEMBER(mgolf_state::mgolf_wram_r) |
| 176 | READ8_MEMBER(mgolf_state::wram_r) |
| 171 | 177 | { |
| 172 | 178 | return m_video_ram[0x380 + offset]; |
| 173 | 179 | } |
| 174 | 180 | |
| 175 | 181 | |
| 176 | | READ8_MEMBER(mgolf_state::mgolf_dial_r) |
| 182 | READ8_MEMBER(mgolf_state::dial_r) |
| 177 | 183 | { |
| 178 | 184 | UINT8 val = ioport("41")->read(); |
| 179 | 185 | |
| r244702 | r244703 | |
| 190 | 196 | } |
| 191 | 197 | |
| 192 | 198 | |
| 193 | | READ8_MEMBER(mgolf_state::mgolf_misc_r) |
| 199 | READ8_MEMBER(mgolf_state::misc_r) |
| 194 | 200 | { |
| 195 | 201 | double plunger = calc_plunger_pos(); /* see Video Pinball */ |
| 196 | 202 | |
| r244702 | r244703 | |
| 209 | 215 | } |
| 210 | 216 | |
| 211 | 217 | |
| 212 | | WRITE8_MEMBER(mgolf_state::mgolf_wram_w) |
| 218 | WRITE8_MEMBER(mgolf_state::wram_w) |
| 213 | 219 | { |
| 214 | 220 | m_video_ram[0x380 + offset] = data; |
| 215 | 221 | } |
| r244702 | r244703 | |
| 220 | 226 | ADDRESS_MAP_GLOBAL_MASK(0x3fff) |
| 221 | 227 | |
| 222 | 228 | AM_RANGE(0x0040, 0x0040) AM_READ_PORT("40") |
| 223 | | AM_RANGE(0x0041, 0x0041) AM_READ(mgolf_dial_r) |
| 229 | AM_RANGE(0x0041, 0x0041) AM_READ(dial_r) |
| 224 | 230 | AM_RANGE(0x0060, 0x0060) AM_READ_PORT("60") |
| 225 | | AM_RANGE(0x0061, 0x0061) AM_READ(mgolf_misc_r) |
| 226 | | AM_RANGE(0x0080, 0x00ff) AM_READ(mgolf_wram_r) |
| 227 | | AM_RANGE(0x0180, 0x01ff) AM_READ(mgolf_wram_r) |
| 231 | AM_RANGE(0x0061, 0x0061) AM_READ(misc_r) |
| 232 | AM_RANGE(0x0080, 0x00ff) AM_READ(wram_r) |
| 233 | AM_RANGE(0x0180, 0x01ff) AM_READ(wram_r) |
| 228 | 234 | AM_RANGE(0x0800, 0x0bff) AM_READONLY |
| 229 | 235 | |
| 230 | 236 | AM_RANGE(0x0000, 0x0009) AM_WRITENOP |
| r244702 | r244703 | |
| 238 | 244 | AM_RANGE(0x006a, 0x006a) AM_WRITENOP |
| 239 | 245 | AM_RANGE(0x006c, 0x006c) AM_WRITENOP |
| 240 | 246 | AM_RANGE(0x006d, 0x006d) AM_WRITENOP |
| 241 | | AM_RANGE(0x0080, 0x00ff) AM_WRITE(mgolf_wram_w) |
| 242 | | AM_RANGE(0x0180, 0x01ff) AM_WRITE(mgolf_wram_w) |
| 243 | | AM_RANGE(0x0800, 0x0bff) AM_WRITE(mgolf_vram_w) AM_SHARE("video_ram") |
| 247 | AM_RANGE(0x0080, 0x00ff) AM_WRITE(wram_w) |
| 248 | AM_RANGE(0x0180, 0x01ff) AM_WRITE(wram_w) |
| 249 | AM_RANGE(0x0800, 0x0bff) AM_WRITE(vram_w) AM_SHARE("video_ram") |
| 244 | 250 | |
| 245 | 251 | AM_RANGE(0x2000, 0x3fff) AM_ROM |
| 246 | 252 | ADDRESS_MAP_END |
| r244702 | r244703 | |
| 336 | 342 | |
| 337 | 343 | void mgolf_state::machine_start() |
| 338 | 344 | { |
| 345 | m_interrupt_timer = timer_alloc(TIMER_INTERRUPT); |
| 346 | |
| 339 | 347 | save_item(NAME(m_prev)); |
| 340 | 348 | save_item(NAME(m_mask)); |
| 349 | save_item(NAME(m_time_pushed)); |
| 350 | save_item(NAME(m_time_released)); |
| 341 | 351 | } |
| 342 | 352 | |
| 343 | 353 | void mgolf_state::machine_reset() |
| 344 | 354 | { |
| 345 | | timer_set(m_screen->time_until_pos(16), TIMER_INTERRUPT, 16); |
| 355 | m_interrupt_timer->adjust(m_screen->time_until_pos(16), 16); |
| 346 | 356 | |
| 347 | 357 | m_mask = 0; |
| 348 | 358 | m_prev = 0; |
| r244702 | r244703 | |
| 361 | 371 | MCFG_SCREEN_REFRESH_RATE(60) |
| 362 | 372 | MCFG_SCREEN_SIZE(256, 262) |
| 363 | 373 | MCFG_SCREEN_VISIBLE_AREA(0, 255, 0, 223) |
| 364 | | MCFG_SCREEN_UPDATE_DRIVER(mgolf_state, screen_update_mgolf) |
| 374 | MCFG_SCREEN_UPDATE_DRIVER(mgolf_state, screen_update) |
| 365 | 375 | MCFG_SCREEN_PALETTE("palette") |
| 366 | 376 | |
| 367 | 377 | MCFG_GFXDECODE_ADD("gfxdecode", "palette", mgolf) |
| r244702 | r244703 | |
| 396 | 406 | ROM_END |
| 397 | 407 | |
| 398 | 408 | |
| 399 | | GAME( 1978, mgolf, 0, mgolf, mgolf, driver_device, 0, ROT270, "Atari", "Atari Mini Golf (prototype)", GAME_NO_SOUND ) |
| 409 | GAME( 1978, mgolf, 0, mgolf, mgolf, driver_device, 0, ROT270, "Atari", "Atari Mini Golf (prototype)", GAME_NO_SOUND | GAME_SUPPORTS_SAVE ) |