diff options
Diffstat (limited to 'src/mame/includes/turbo.h')
-rw-r--r-- | src/mame/includes/turbo.h | 346 |
1 files changed, 199 insertions, 147 deletions
diff --git a/src/mame/includes/turbo.h b/src/mame/includes/turbo.h index 052ccb19d45..cf1ac46f329 100644 --- a/src/mame/includes/turbo.h +++ b/src/mame/includes/turbo.h @@ -18,31 +18,23 @@ #include "screen.h" #include "tilemap.h" -/* sprites are scaled in the analog domain; to give a better */ -/* rendition of this, we scale in the X direction by this factor */ +// sprites are scaled in the analog domain; to give a better rendition of this, we scale in the X direction by this factor + #define TURBO_X_SCALE 2 -class turbo_state : public driver_device +class turbo_base_state : public driver_device { public: - turbo_state(const machine_config &mconfig, device_type type, const char *tag) + turbo_base_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) , m_maincpu(*this, "maincpu") - , m_subcpu(*this, "subcpu") - , m_i8255_0(*this, "i8255_0") - , m_i8255_1(*this, "i8255_1") - , m_i8255_2(*this, "i8255_2") - , m_i8255_3(*this, "i8255_3") + , m_i8255(*this, "i8255%u", 0U) , m_spriteroms(*this, "sprites") , m_proms(*this, "proms") - , m_roadroms(*this, "road") - , m_bgcolorrom(*this, "bgcolor") , m_videoram(*this, "videoram") - , m_spriteram(*this, "spriteram") , m_sprite_position(*this, "spritepos") - , m_decrypted_opcodes(*this, "decrypted_opcodes") , m_samples(*this, "samples") , m_gfxdecode(*this, "gfxdecode") , m_screen(*this, "screen") @@ -50,36 +42,19 @@ public: , m_lamp(*this, "lamp") { } - void turbo(machine_config &config); - void buckrog(machine_config &config); - void buckroge(machine_config &config); - void buckrogu(machine_config &config); - void subroc3d(machine_config &config); - void turbo_samples(machine_config &config); - void subroc3d_samples(machine_config &config); - void buckrog_samples(machine_config &config); - - void init_turbo_enc(); - void init_turbo_noenc(); +protected: + virtual void machine_start() override; + virtual void video_start() override; -private: - /* device/memory pointers */ + // device / memory pointers required_device<z80_device> m_maincpu; - optional_device<z80_device> m_subcpu; - required_device<i8255_device> m_i8255_0; - required_device<i8255_device> m_i8255_1; - optional_device<i8255_device> m_i8255_2; - optional_device<i8255_device> m_i8255_3; + optional_device_array<i8255_device, 3> m_i8255; required_region_ptr<uint8_t> m_spriteroms; required_region_ptr<uint8_t> m_proms; - optional_region_ptr<uint8_t> m_roadroms; - optional_region_ptr<uint8_t> m_bgcolorrom; required_shared_ptr<uint8_t> m_videoram; - optional_shared_ptr<uint8_t> m_spriteram; required_shared_ptr<uint8_t> m_sprite_position; - optional_shared_ptr<uint8_t> m_decrypted_opcodes; required_device<samples_device> m_samples; @@ -88,136 +63,213 @@ private: output_finder<32> m_digits; output_finder<> m_lamp; - std::unique_ptr<uint8_t[]> m_buckrog_bitmap_ram; - virtual void machine_start() override { m_digits.resolve(); m_lamp.resolve(); } - - /* machine states */ + // machine state uint8_t m_i8279_scanlines; - uint8_t m_alt_spriteram[0x80]; - /* sound state */ - uint8_t m_turbo_osel; - uint8_t m_turbo_bsel; + // sound state uint8_t m_sound_state[3]; - /* video state */ + // video state tilemap_t * m_fg_tilemap; - /* Turbo-specific states */ - uint8_t m_turbo_opa; - uint8_t m_turbo_opb; - uint8_t m_turbo_opc; - uint8_t m_turbo_ipa; - uint8_t m_turbo_ipb; - uint8_t m_turbo_ipc; - uint8_t m_turbo_fbpla; - uint8_t m_turbo_fbcol; - uint8_t m_turbo_speed; - uint8_t m_turbo_collision; - uint8_t m_turbo_last_analog; - uint8_t m_turbo_accel; - - /* Subroc-specific states */ - uint8_t m_subroc3d_col; - uint8_t m_subroc3d_ply; - uint8_t m_subroc3d_flip; - uint8_t m_subroc3d_mdis; - uint8_t m_subroc3d_mdir; - uint8_t m_subroc3d_tdis; - uint8_t m_subroc3d_tdir; - uint8_t m_subroc3d_fdis; - uint8_t m_subroc3d_fdir; - uint8_t m_subroc3d_hdis; - uint8_t m_subroc3d_hdir; - - /* Buck Rogers-specific states */ - uint8_t m_buckrog_fchg; - uint8_t m_buckrog_mov; - uint8_t m_buckrog_obch; - uint8_t m_buckrog_command; - uint8_t m_buckrog_myship; - int m_last_sound_a; - struct sprite_info { - uint16_t ve; /* VE0-15 signals for this row */ - uint8_t lst; /* LST0-7 signals for this row */ - uint32_t latched[8]; /* latched pixel data */ - uint8_t plb[8]; /* latched PLB state */ - uint32_t offset[8]; /* current offset for this row */ - uint32_t frac[8]; /* leftover fraction */ - uint32_t step[8]; /* stepping value */ + uint16_t ve; // VE0-15 signals for this row + uint8_t lst; // LST0-7 signals for this row + uint32_t latched[8]; // latched pixel data + uint8_t plb[8]; // latched PLB state + uint32_t offset[8]; // current offset for this row + uint32_t frac[8]; // leftover fraction + uint32_t step[8]; // stepping value }; + sprite_info m_sprite_info; + void scanlines_w(uint8_t data); void digit_w(uint8_t data); - uint8_t turbo_collision_r(); - void turbo_collision_clear_w(uint8_t data); - void turbo_analog_reset_w(uint8_t data); + void videoram_w(offs_t offset, uint8_t data); + TILE_GET_INFO_MEMBER(get_fg_tile_info); + inline uint32_t sprite_xscale(uint8_t dacinput, double vr1, double vr2, double cext); +}; + +class buckrog_state : public turbo_base_state +{ +public: + buckrog_state(const machine_config &mconfig, device_type type, const char *tag) + : turbo_base_state(mconfig, type, tag) + , m_subcpu(*this, "subcpu") + , m_decrypted_opcodes(*this, "decrypted_opcodes") + , m_spriteram(*this, "spriteram") + , m_bitmap_ram(*this, "bitmap_ram", 0xe000, ENDIANNESS_LITTLE) + , m_bgcolorrom(*this, "bgcolor") + , m_dsw(*this, "DSW%u", 1U) + { } + + void buckrog(machine_config &config); + void buckroge(machine_config &config); + void buckrogu(machine_config &config); + void buckrog_samples(machine_config &config); + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + +private: + required_device<z80_device> m_subcpu; + optional_shared_ptr<uint8_t> m_decrypted_opcodes; + required_shared_ptr<uint8_t> m_spriteram; + memory_share_creator<uint8_t> m_bitmap_ram; + required_region_ptr<uint8_t> m_bgcolorrom; + required_ioport_array<2> m_dsw; + + uint8_t m_fchg; + uint8_t m_mov; + uint8_t m_obch; + uint8_t m_command; + uint8_t m_myship; + uint8_t m_last_sound_a; + + uint8_t subcpu_command_r(); + uint8_t port_2_r(); + uint8_t port_3_r(); + void bitmap_w(offs_t offset, uint8_t data); + void ppi0a_w(uint8_t data); + void ppi0b_w(uint8_t data); + void ppi0c_w(uint8_t data); + void ppi1c_w(uint8_t data); + void palette(palette_device &palette) const; + uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + void i8255_0_w(offs_t offset, uint8_t data); + TIMER_CALLBACK_MEMBER(delayed_i8255_w); + void sound_a_w(uint8_t data); + void sound_b_w(uint8_t data); + void prepare_sprites(uint8_t y); + uint32_t get_sprite_bits(uint8_t *plb); + void update_samples(); + + void decrypted_opcodes_map(address_map &map); + void main_prg_map(address_map &map); + void sub_prg_map(address_map &map); + void sub_portmap(address_map &map); +}; + +class subroc3d_state : public turbo_base_state +{ +public: + subroc3d_state(const machine_config &mconfig, device_type type, const char *tag) + : turbo_base_state(mconfig, type, tag) + , m_spriteram(*this, "spriteram") + { } + + void subroc3d(machine_config &config); + void subroc3d_samples(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + required_shared_ptr<uint8_t> m_spriteram; + + uint8_t m_col; + uint8_t m_ply; + uint8_t m_flip; + uint8_t m_mdis; + uint8_t m_mdir; + uint8_t m_tdis; + uint8_t m_tdir; + uint8_t m_fdis; + uint8_t m_fdir; + uint8_t m_hdis; + uint8_t m_hdir; + + void ppi0a_w(uint8_t data); + void ppi0b_w(uint8_t data); + void ppi0c_w(uint8_t data); + void palette(palette_device &palette) const; + uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + void sound_a_w(uint8_t data); + void sound_b_w(uint8_t data); + void sound_c_w(uint8_t data); + void prepare_sprites(uint8_t y); + uint32_t get_sprite_bits(uint8_t *plb); + inline void update_volume(int leftchan, uint8_t dis, uint8_t dir); + + void prg_map(address_map &map); +}; + +class turbo_state : public turbo_base_state +{ +public: + turbo_state(const machine_config &mconfig, device_type type, const char *tag) + : turbo_base_state(mconfig, type, tag) + , m_roadroms(*this, "road") + , m_alt_spriteram(*this, "alt_spriteram", 0x80, ENDIANNESS_LITTLE) + , m_vr(*this, "VR%u", 1U) + , m_dsw3(*this, "DSW3") + , m_dial(*this, "DIAL") + , m_tachometer(*this, "tachometer") + , m_speed(*this, "speed") + { } + + void turbo(machine_config &config); + void turbo_samples(machine_config &config); + + void init_turbo_enc(); + +protected: + virtual void machine_start() override; + +private: + required_region_ptr<uint8_t> m_roadroms; + memory_share_creator<uint8_t> m_alt_spriteram; + required_ioport_array<2> m_vr; + required_ioport m_dsw3; + required_ioport m_dial; + output_finder<> m_tachometer; + output_finder<> m_speed; + + uint8_t m_osel; + uint8_t m_bsel; + uint8_t m_opa; + uint8_t m_opb; + uint8_t m_opc; + uint8_t m_ipa; + uint8_t m_ipb; + uint8_t m_ipc; + uint8_t m_fbpla; + uint8_t m_fbcol; + uint8_t m_collision; + uint8_t m_last_analog; + uint8_t m_accel; + + uint8_t collision_r(); + void collision_clear_w(uint8_t data); + void analog_reset_w(uint8_t data); DECLARE_WRITE_LINE_MEMBER(coin_meter_1_w); DECLARE_WRITE_LINE_MEMBER(coin_meter_2_w); DECLARE_WRITE_LINE_MEMBER(start_lamp_w); - uint8_t buckrog_cpu2_command_r(); - uint8_t buckrog_port_2_r(); - uint8_t buckrog_port_3_r(); - void turbo_videoram_w(offs_t offset, uint8_t data); - void buckrog_bitmap_w(offs_t offset, uint8_t data); - void turbo_ppi0a_w(uint8_t data); - void turbo_ppi0b_w(uint8_t data); - void turbo_ppi0c_w(uint8_t data); - void turbo_ppi1a_w(uint8_t data); - void turbo_ppi1b_w(uint8_t data); - void turbo_ppi1c_w(uint8_t data); - void turbo_ppi3c_w(uint8_t data); - void subroc3d_ppi0a_w(uint8_t data); - void subroc3d_ppi0c_w(uint8_t data); - void subroc3d_ppi0b_w(uint8_t data); - void buckrog_ppi0a_w(uint8_t data); - void buckrog_ppi0b_w(uint8_t data); - void buckrog_ppi0c_w(uint8_t data); - void buckrog_ppi1c_w(uint8_t data); - uint8_t turbo_analog_r(); - void buckrog_i8255_0_w(offs_t offset, uint8_t data); + void ppi0a_w(uint8_t data); + void ppi0b_w(uint8_t data); + void ppi0c_w(uint8_t data); + void ppi1a_w(uint8_t data); + void ppi1b_w(uint8_t data); + void ppi1c_w(uint8_t data); + void ppi3c_w(uint8_t data); + uint8_t analog_r(); uint8_t spriteram_r(offs_t offset); void spriteram_w(offs_t offset, uint8_t data); + void palette(palette_device &palette) const; + uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + void sound_a_w(uint8_t data); + void sound_b_w(uint8_t data); + void sound_c_w(uint8_t data); + void prepare_sprites(uint8_t y); + uint32_t get_sprite_bits(uint8_t road); + void rom_decode(); + void update_samples(); - TILE_GET_INFO_MEMBER(get_fg_tile_info); - DECLARE_VIDEO_START(turbo); - void turbo_palette(palette_device &palette) const; - void subroc3d_palette(palette_device &palette) const; - DECLARE_MACHINE_RESET(buckrog); - DECLARE_VIDEO_START(buckrog); - void buckrog_palette(palette_device &palette) const; - uint32_t screen_update_turbo(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - uint32_t screen_update_subroc3d(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - uint32_t screen_update_buckrog(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - TIMER_CALLBACK_MEMBER(delayed_i8255_w); - void turbo_sound_a_w(u8 data); - void turbo_sound_b_w(u8 data); - void turbo_sound_c_w(u8 data); - void subroc3d_sound_a_w(u8 data); - void subroc3d_sound_b_w(u8 data); - void subroc3d_sound_c_w(u8 data); - void buckrog_sound_a_w(u8 data); - void buckrog_sound_b_w(u8 data); - inline uint32_t sprite_xscale(uint8_t dacinput, double vr1, double vr2, double cext); - void turbo_prepare_sprites(uint8_t y, sprite_info *info); - uint32_t turbo_get_sprite_bits(uint8_t road, sprite_info *sprinfo); - void subroc3d_prepare_sprites(uint8_t y, sprite_info *info); - uint32_t subroc3d_get_sprite_bits(sprite_info *sprinfo, uint8_t *plb); - void buckrog_prepare_sprites(uint8_t y, sprite_info *info); - uint32_t buckrog_get_sprite_bits(sprite_info *sprinfo, uint8_t *plb); - void turbo_rom_decode(); - void turbo_update_samples(); - inline void subroc3d_update_volume(int leftchan, uint8_t dis, uint8_t dir); - void buckrog_update_samples(); - - void buckrog_cpu2_map(address_map &map); - void buckrog_cpu2_portmap(address_map &map); - void buckrog_map(address_map &map); - void decrypted_opcodes_map(address_map &map); - void subroc3d_map(address_map &map); - void turbo_map(address_map &map); + void prg_map(address_map &map); }; + #endif // MAME_INCLUDES_TURBO_H |