summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/includes/turbo.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/includes/turbo.h')
-rw-r--r--src/mame/includes/turbo.h346
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