1 // license:BSD-3-Clause 2 // copyright-holders:Aaron Giles 3 /************************************************************************* 4 5 Driver for early Williams games 6 7 **************************************************************************/ 8 #ifndef MAME_INCLUDES_WILLIAMS_H 9 #define MAME_INCLUDES_WILLIAMS_H 10 11 #pragma once 12 13 #include "audio/williams.h" 14 #include "audio/s11c_bg.h" 15 #include "cpu/m6800/m6800.h" 16 #include "cpu/m6809/m6809.h" 17 #include "machine/6821pia.h" 18 #include "machine/74157.h" 19 #include "machine/bankdev.h" 20 #include "machine/ticket.h" 21 #include "machine/timer.h" 22 #include "machine/watchdog.h" 23 #include "sound/hc55516.h" 24 #include "emupal.h" 25 #include "screen.h" 26 #include "tilemap.h" 27 28 class williams_state : public driver_device 29 { 30 public: williams_state(const machine_config & mconfig,device_type type,const char * tag)31 williams_state(const machine_config &mconfig, device_type type, const char *tag) : 32 driver_device(mconfig, type, tag), 33 m_nvram(*this, "nvram"), 34 m_videoram(*this, "videoram"), 35 m_mainbank(*this, "mainbank"), 36 m_maincpu(*this, "maincpu"), 37 m_soundcpu(*this, "soundcpu"), 38 m_watchdog(*this, "watchdog"), 39 m_screen(*this, "screen"), 40 m_palette(*this, "palette"), 41 m_paletteram(*this, "paletteram"), 42 m_pia(*this, "pia_%u", 0U) 43 { } 44 45 void lottofun(machine_config &config); 46 void williams_base(machine_config &config); 47 48 void init_stargate(); 49 void init_playball(); 50 void init_lottofun(); 51 void init_robotron(); 52 53 u8 port_0_49way_r(); 54 virtual u8 video_counter_r(); 55 virtual void watchdog_reset_w(u8 data); 56 57 virtual TIMER_DEVICE_CALLBACK_MEMBER(va11_callback); 58 TIMER_DEVICE_CALLBACK_MEMBER(count240_callback); 59 60 virtual uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); 61 void palette_init(palette_device &palette) const; 62 63 protected: 64 virtual void machine_start() override; 65 virtual void video_start() override; 66 67 enum 68 { 69 //controlbyte (0xCA00) bit definitions 70 WMS_BLITTER_CONTROLBYTE_NO_EVEN = 0x80, 71 WMS_BLITTER_CONTROLBYTE_NO_ODD = 0x40, 72 WMS_BLITTER_CONTROLBYTE_SHIFT = 0x20, 73 WMS_BLITTER_CONTROLBYTE_SOLID = 0x10, 74 WMS_BLITTER_CONTROLBYTE_FOREGROUND_ONLY = 0x08, 75 WMS_BLITTER_CONTROLBYTE_SLOW = 0x04, //2us blits instead of 1us 76 WMS_BLITTER_CONTROLBYTE_DST_STRIDE_256 = 0x02, 77 WMS_BLITTER_CONTROLBYTE_SRC_STRIDE_256 = 0x01 78 }; 79 80 required_shared_ptr<uint8_t> m_nvram; 81 required_shared_ptr<uint8_t> m_videoram; 82 optional_memory_bank m_mainbank; 83 uint8_t m_blitter_config; 84 uint16_t m_blitter_clip_address; 85 uint8_t m_blitter_window_enable; 86 uint8_t m_cocktail; 87 std::unique_ptr<rgb_t[]> m_palette_lookup; 88 uint8_t m_blitterram[8]; 89 uint8_t m_blitter_xor; 90 uint8_t m_blitter_remap_index; 91 const uint8_t *m_blitter_remap; 92 std::unique_ptr<uint8_t[]> m_blitter_remap_lookup; 93 virtual void vram_select_w(u8 data); 94 virtual void cmos_w(offs_t offset, u8 data); 95 void sinistar_vram_select_w(u8 data); 96 void blitter_w(address_space &space, offs_t offset, u8 data); 97 98 TIMER_CALLBACK_MEMBER(deferred_snd_cmd_w); 99 100 void snd_cmd_w(u8 data); 101 102 DECLARE_WRITE_LINE_MEMBER(lottofun_coin_lock_w); 103 104 void state_save_register(); 105 void blitter_init(int blitter_config, const uint8_t *remap_prom); 106 inline void blit_pixel(address_space &space, int dstaddr, int srcdata, int controlbyte); 107 int blitter_core(address_space &space, int sstart, int dstart, int w, int h, int data); 108 109 required_device<cpu_device> m_maincpu; 110 required_device<cpu_device> m_soundcpu; 111 required_device<watchdog_timer_device> m_watchdog; 112 required_device<screen_device> m_screen; 113 optional_device<palette_device> m_palette; 114 optional_shared_ptr<uint8_t> m_paletteram; 115 optional_device_array<pia6821_device, 4> m_pia; 116 117 virtual void sound_map(address_map &map); 118 void base_map(address_map &map); 119 }; 120 121 class defender_state : public williams_state 122 { 123 public: defender_state(const machine_config & mconfig,device_type type,const char * tag)124 defender_state(const machine_config &mconfig, device_type type, const char *tag) : 125 williams_state(mconfig, type, tag), 126 m_bankc000(*this, "bankc000") 127 { } 128 129 void defender(machine_config &config); 130 void jin(machine_config &config); 131 132 protected: 133 virtual void driver_init() override; 134 135 virtual void main_map(address_map &map); 136 137 void video_control_w(u8 data); 138 139 required_device<address_map_bank_device> m_bankc000; 140 141 private: machine_start()142 virtual void machine_start() override { } 143 virtual void machine_reset() override; 144 145 void bankc000_map(address_map &map); 146 virtual void sound_map(address_map &map) override; 147 148 void bank_select_w(u8 data); 149 }; 150 151 class defndjeu_state : public defender_state 152 { 153 public: defndjeu_state(const machine_config & mconfig,device_type type,const char * tag)154 defndjeu_state(const machine_config &mconfig, device_type type, const char *tag) : 155 defender_state(mconfig, type, tag) 156 { } 157 158 private: 159 virtual void driver_init() override; 160 }; 161 162 class mayday_state : public defender_state 163 { 164 public: mayday_state(const machine_config & mconfig,device_type type,const char * tag)165 mayday_state(const machine_config &mconfig, device_type type, const char *tag) : 166 defender_state(mconfig, type, tag) 167 { } 168 169 private: 170 virtual void driver_init() override; 171 172 virtual void main_map(address_map &map) override; 173 174 uint8_t *m_protection; 175 u8 protection_r(offs_t offset); 176 }; 177 178 class sinistar_state : public williams_state 179 { 180 public: sinistar_state(const machine_config & mconfig,device_type type,const char * tag)181 sinistar_state(const machine_config &mconfig, device_type type, const char *tag) : 182 williams_state(mconfig, type, tag) 183 { } 184 185 void sinistar(machine_config &config); 186 187 private: 188 virtual void driver_init() override; 189 190 virtual void vram_select_w(u8 data) override; 191 192 void main_map(address_map &map); 193 }; 194 195 class bubbles_state : public williams_state 196 { 197 public: bubbles_state(const machine_config & mconfig,device_type type,const char * tag)198 bubbles_state(const machine_config &mconfig, device_type type, const char *tag) : 199 williams_state(mconfig, type, tag) 200 { } 201 202 void bubbles(machine_config &config); 203 204 private: 205 virtual void driver_init() override; 206 207 void main_map(address_map &map); 208 209 virtual void cmos_w(offs_t offset, u8 data) override; 210 }; 211 212 class playball_state : public williams_state 213 { 214 public: playball_state(const machine_config & mconfig,device_type type,const char * tag)215 playball_state(const machine_config &mconfig, device_type type, const char *tag) : 216 williams_state(mconfig, type, tag) 217 { } 218 219 void playball(machine_config &config); 220 221 private: 222 virtual void driver_init() override; 223 224 void snd_cmd_w(u8 data); 225 }; 226 227 class williams_muxed_state : public williams_state 228 { 229 public: williams_muxed_state(const machine_config & mconfig,device_type type,const char * tag)230 williams_muxed_state(const machine_config &mconfig, device_type type, const char *tag) : 231 williams_state(mconfig, type, tag), 232 m_mux0(*this, "mux_0"), 233 m_mux1(*this, "mux_1") 234 { } 235 236 void williams_muxed(machine_config &config); 237 238 void init_splat(); 239 void init_joust(); 240 void init_alienar(); 241 void init_alienaru(); 242 243 private: 244 required_device<ls157_device> m_mux0; 245 required_device<ls157_device> m_mux1; 246 }; 247 248 class spdball_state : public williams_state 249 { 250 public: spdball_state(const machine_config & mconfig,device_type type,const char * tag)251 spdball_state(const machine_config &mconfig, device_type type, const char *tag) : 252 williams_state(mconfig, type, tag) 253 { } 254 255 void spdball(machine_config &config); 256 257 private: 258 virtual void driver_init() override; 259 260 void main_map(address_map &map); 261 }; 262 263 class blaster_state : public williams_state 264 { 265 public: blaster_state(const machine_config & mconfig,device_type type,const char * tag)266 blaster_state(const machine_config &mconfig, device_type type, const char *tag) : 267 williams_state(mconfig, type, tag), 268 m_soundcpu_b(*this, "soundcpu_b"), 269 m_palette_0(*this, "blaster_pal0"), 270 m_scanline_control(*this, "blaster_scan"), 271 m_bankb(*this, "blaster_bankb"), 272 m_muxa(*this, "mux_a"), 273 m_muxb(*this, "mux_b") 274 { } 275 276 void blastkit(machine_config &config); 277 void blaster(machine_config &config); 278 279 private: 280 virtual void machine_start() override; 281 virtual void video_start() override; 282 virtual void driver_init() override; 283 284 optional_device<cpu_device> m_soundcpu_b; 285 required_shared_ptr<uint8_t> m_palette_0; 286 required_shared_ptr<uint8_t> m_scanline_control; 287 optional_memory_bank m_bankb; 288 required_device<ls157_x2_device> m_muxa; 289 optional_device<ls157_device> m_muxb; 290 291 rgb_t m_color0; 292 uint8_t m_video_control; 293 uint8_t m_vram_bank; 294 uint8_t m_rom_bank; 295 296 virtual void vram_select_w(u8 data) override; 297 void bank_select_w(u8 data); 298 void remap_select_w(u8 data); 299 void video_control_w(u8 data); 300 TIMER_CALLBACK_MEMBER(deferred_snd_cmd_w); 301 void snd_cmd_w(u8 data); 302 303 virtual uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) override; 304 305 inline void update_blaster_banking(); 306 307 void main_map(address_map &map); 308 void sound2_map(address_map &map); 309 }; 310 311 class williams2_state : public williams_state 312 { 313 public: williams2_state(const machine_config & mconfig,device_type type,const char * tag)314 williams2_state(const machine_config &mconfig, device_type type, const char *tag) : 315 williams_state(mconfig, type, tag), 316 m_bank8000(*this, "bank8000"), 317 m_gfxdecode(*this, "gfxdecode"), 318 m_tileram(*this, "williams2_tile"), 319 m_gain( { 0.25f, 0.25f, 0.25f }), 320 m_offset({ 0.00f, 0.00f, 0.00f }) 321 { } 322 323 void williams2_base(machine_config &config); 324 INPUT_CHANGED_MEMBER(rgb_gain)325 INPUT_CHANGED_MEMBER(rgb_gain) 326 { 327 if (param < 3) 328 m_gain[param] = float(newval) / 100.0f; 329 else 330 m_offset[param - 3] = (float(newval) / 100.0f) - 1.0f; 331 rebuild_palette(); 332 } 333 334 protected: 335 virtual void machine_start() override; 336 virtual void machine_reset() override; 337 virtual void video_start() override; 338 339 required_device<address_map_bank_device> m_bank8000; 340 required_device<gfxdecode_device> m_gfxdecode; 341 required_shared_ptr<uint8_t> m_tileram; 342 343 tilemap_t *m_bg_tilemap; 344 uint16_t m_tilemap_xscroll; 345 uint8_t m_fg_color; 346 std::array<float, 3> m_gain; 347 std::array<float, 3> m_offset; 348 349 virtual u8 video_counter_r() override; 350 351 virtual TILE_GET_INFO_MEMBER(get_tile_info); 352 void bank_select_w(u8 data); 353 virtual void watchdog_reset_w(u8 data) override; 354 void segments_w(u8 data); 355 356 rgb_t calc_col(uint16_t lo, uint16_t hi); 357 void paletteram_w(offs_t offset, u8 data); 358 void rebuild_palette(); 359 void fg_select_w(u8 data); 360 virtual void bg_select_w(u8 data); 361 void tileram_w(offs_t offset, u8 data); 362 void xscroll_low_w(u8 data); 363 void xscroll_high_w(u8 data); 364 void blit_window_enable_w(u8 data); 365 virtual TIMER_DEVICE_CALLBACK_MEMBER(va11_callback) override; 366 TIMER_DEVICE_CALLBACK_MEMBER(endscreen_callback); 367 TIMER_CALLBACK_MEMBER(deferred_snd_cmd_w); 368 void snd_cmd_w(u8 data); 369 370 virtual uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) override; 371 372 void bank8000_map(address_map &map); 373 void common_map(address_map &map); 374 virtual void sound_map(address_map &map) override; 375 376 void video_control_w(u8 data); 377 }; 378 379 class williams_d000_rom_state : public williams2_state 380 { 381 public: williams_d000_rom_state(const machine_config & mconfig,device_type type,const char * tag)382 williams_d000_rom_state(const machine_config &mconfig, device_type type, const char *tag) : 383 williams2_state(mconfig, type, tag) 384 { } 385 386 protected: 387 void d000_map(address_map &map); 388 }; 389 390 class williams_d000_ram_state : public williams2_state 391 { 392 public: williams_d000_ram_state(const machine_config & mconfig,device_type type,const char * tag)393 williams_d000_ram_state(const machine_config &mconfig, device_type type, const char *tag) : 394 williams2_state(mconfig, type, tag) 395 { } 396 397 protected: 398 void d000_map(address_map &map); 399 }; 400 401 class inferno_state : public williams_d000_ram_state 402 { 403 public: inferno_state(const machine_config & mconfig,device_type type,const char * tag)404 inferno_state(const machine_config &mconfig, device_type type, const char *tag) : 405 williams_d000_ram_state(mconfig, type, tag), 406 m_mux(*this, "mux") 407 { } 408 409 void inferno(machine_config &config); 410 411 private: 412 virtual void driver_init() override; 413 414 required_device<ls157_device> m_mux; 415 }; 416 417 class mysticm_state : public williams_d000_ram_state 418 { 419 public: mysticm_state(const machine_config & mconfig,device_type type,const char * tag)420 mysticm_state(const machine_config &mconfig, device_type type, const char *tag) : 421 williams_d000_ram_state(mconfig, type, tag) 422 { 423 // overwrite defaults for mysticm 424 m_gain = { 0.8f, 0.73f, 0.81f }; 425 m_offset = { -0.27f, 0.00f, -0.22f }; 426 } 427 428 void mysticm(machine_config &config); 429 430 protected: 431 virtual uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) override; 432 433 private: 434 virtual void driver_init() override; 435 436 virtual TILE_GET_INFO_MEMBER(get_tile_info) override; 437 virtual void bg_select_w(u8 data) override; 438 439 int color_decode(uint8_t base_col, int sig_J1, int y); 440 441 uint8_t m_bg_color; 442 443 }; 444 445 class tshoot_state : public williams_d000_rom_state 446 { 447 public: tshoot_state(const machine_config & mconfig,device_type type,const char * tag)448 tshoot_state(const machine_config &mconfig, device_type type, const char *tag) : 449 williams_d000_rom_state(mconfig, type, tag), 450 m_mux(*this, "mux"), 451 m_gun(*this, {"GUNX", "GUNY"}), 452 m_grenade_lamp(*this, "Grenade_lamp"), 453 m_gun_lamp(*this, "Gun_lamp"), 454 m_p1_gun_recoil(*this, "Player1_Gun_Recoil"), 455 m_feather_blower(*this, "Feather_Blower") 456 { } 457 458 void tshoot(machine_config &config); 459 460 template <int P> DECLARE_CUSTOM_INPUT_MEMBER(gun_r); 461 462 private: 463 virtual void machine_start() override; 464 virtual void driver_init() override; 465 466 DECLARE_WRITE_LINE_MEMBER(maxvol_w); 467 void lamp_w(u8 data); 468 469 required_device<ls157_device> m_mux; 470 required_ioport_array<2> m_gun; 471 output_finder<> m_grenade_lamp; 472 output_finder<> m_gun_lamp; 473 output_finder<> m_p1_gun_recoil; 474 output_finder<> m_feather_blower; 475 }; 476 477 class joust2_state : public williams_d000_rom_state 478 { 479 public: joust2_state(const machine_config & mconfig,device_type type,const char * tag)480 joust2_state(const machine_config &mconfig, device_type type, const char *tag) : 481 williams_d000_rom_state(mconfig, type, tag), 482 m_mux(*this, "mux"), 483 m_bg(*this, "bg") 484 { } 485 486 void joust2(machine_config &config); 487 488 private: 489 virtual void machine_start() override; 490 virtual void driver_init() override; 491 492 required_device<ls157_device> m_mux; 493 required_device<s11_obg_device> m_bg; 494 uint16_t m_current_sound_data; 495 496 virtual TILE_GET_INFO_MEMBER(get_tile_info) override; 497 virtual void bg_select_w(u8 data) override; 498 499 TIMER_CALLBACK_MEMBER(deferred_snd_cmd_w); 500 void snd_cmd_w(u8 data); 501 DECLARE_WRITE_LINE_MEMBER(pia_s11_bg_strobe_w); 502 }; 503 504 /*----------- defined in video/williams.cpp -----------*/ 505 506 #define WILLIAMS_BLITTER_NONE 0 /* no blitter */ 507 #define WILLIAMS_BLITTER_SC1 1 /* Special Chip 1 blitter */ 508 #define WILLIAMS_BLITTER_SC2 2 /* Special Chip 2 "bugfixed" blitter */ 509 510 #define WILLIAMS_TILEMAP_MYSTICM 0 /* IC79 is a 74LS85 comparator */ 511 #define WILLIAMS_TILEMAP_TSHOOT 1 /* IC79 is a 74LS157 selector jumpered to be enabled */ 512 #define WILLIAMS_TILEMAP_JOUST2 2 /* IC79 is a 74LS157 selector jumpered to be disabled */ 513 514 #endif // MAME_INCLUDES_WILLIAMS_H 515