summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/sega/turbo.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/sega/turbo.h')
-rw-r--r--src/mame/sega/turbo.h281
1 files changed, 281 insertions, 0 deletions
diff --git a/src/mame/sega/turbo.h b/src/mame/sega/turbo.h
new file mode 100644
index 00000000000..e6026206096
--- /dev/null
+++ b/src/mame/sega/turbo.h
@@ -0,0 +1,281 @@
+// license:BSD-3-Clause
+// copyright-holders:Alex Pasadyn, Howie Cohen, Frank Palazzolo, Ernesto Corvi, Aaron Giles
+/*************************************************************************
+
+ Sega Z80-3D system
+
+*************************************************************************/
+#ifndef MAME_SEGA_TURBO_H
+#define MAME_SEGA_TURBO_H
+
+#pragma once
+
+#include "cpu/z80/z80.h"
+#include "machine/i8255.h"
+#include "sound/discrete.h"
+#include "sound/samples.h"
+#include "emupal.h"
+#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
+
+#define TURBO_X_SCALE 2
+
+
+class turbo_base_state : public driver_device
+{
+public:
+ turbo_base_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_maincpu(*this, "maincpu")
+ , m_i8255(*this, "i8255%u", 0U)
+ , m_spriteroms(*this, "sprites")
+ , m_proms(*this, "proms")
+ , m_videoram(*this, "videoram")
+ , m_sprite_position(*this, "spritepos")
+ , m_samples(*this, "samples")
+ , m_discrete(*this, "discrete")
+ , m_gfxdecode(*this, "gfxdecode")
+ , m_screen(*this, "screen")
+ , m_pedal(*this, "PEDAL")
+ , m_dsw(*this, "DSW%u", 1U)
+ , m_digits(*this, "digit%u", 0U)
+ , m_lamp(*this, "lamp")
+ { }
+
+ ioport_value pedal_r();
+
+protected:
+ virtual void machine_start() override ATTR_COLD;
+ virtual void video_start() override ATTR_COLD;
+
+ // device / memory pointers
+ required_device<z80_device> m_maincpu;
+ optional_device_array<i8255_device, 4> m_i8255;
+
+ required_region_ptr<uint8_t> m_spriteroms;
+ required_region_ptr<uint8_t> m_proms;
+ required_shared_ptr<uint8_t> m_videoram;
+ required_shared_ptr<uint8_t> m_sprite_position;
+
+ required_device<samples_device> m_samples;
+ optional_device<discrete_device> m_discrete;
+
+ required_device<gfxdecode_device> m_gfxdecode;
+ required_device<screen_device> m_screen;
+
+ optional_ioport m_pedal;
+ optional_ioport_array<3> m_dsw;
+ output_finder<32> m_digits;
+ output_finder<> m_lamp;
+
+ // machine state
+ uint8_t m_i8279_scanlines = 0;
+
+ // sound state
+ uint8_t m_sound_state[3]{};
+
+ // video state
+ tilemap_t *m_fg_tilemap = nullptr;
+
+ struct sprite_info
+ {
+ uint16_t ve = 0; // VE0-15 signals for this row
+ uint8_t lst = 0; // 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);
+ 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")
+ { }
+
+ 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 ATTR_COLD;
+ virtual void machine_reset() override ATTR_COLD;
+
+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;
+
+ 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) ATTR_COLD;
+ void main_prg_map(address_map &map) ATTR_COLD;
+ void sub_prg_map(address_map &map) ATTR_COLD;
+ void sub_portmap(address_map &map) ATTR_COLD;
+};
+
+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")
+ , m_shutter(*this, "shutter")
+ { }
+
+ void subroc3d(machine_config &config);
+ void subroc3d_samples(machine_config &config);
+
+protected:
+ virtual void machine_start() override ATTR_COLD;
+
+private:
+ required_shared_ptr<uint8_t> m_spriteram;
+ output_finder<> m_shutter;
+
+ uint8_t m_col = 0;
+ uint8_t m_ply = 0;
+ uint8_t m_flip = 0;
+ uint8_t m_mdis = 0;
+ uint8_t m_mdir = 0;
+ uint8_t m_tdis = 0;
+ uint8_t m_tdir = 0;
+ uint8_t m_fdis = 0;
+ uint8_t m_fdir = 0;
+ uint8_t m_hdis = 0;
+ uint8_t m_hdir = 0;
+
+ 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) ATTR_COLD;
+};
+
+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_spriteram(*this, "spriteram", 0x80, ENDIANNESS_LITTLE)
+ , m_vr(*this, "VR%u", 1U)
+ , 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 ATTR_COLD;
+
+private:
+ required_region_ptr<uint8_t> m_roadroms;
+ memory_share_creator<uint8_t> m_spriteram;
+ required_ioport_array<2> m_vr;
+ 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);
+ void coin_meter_1_w(int state);
+ void coin_meter_2_w(int state);
+ void start_lamp_w(int state);
+ 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();
+ TIMER_CALLBACK_MEMBER(update_sound_a);
+
+ void prg_map(address_map &map) ATTR_COLD;
+};
+
+
+#endif // MAME_SEGA_TURBO_H