1 // license:BSD-3-Clause 2 // copyright-holders:Alex Pasadyn, Howie Cohen, Frank Palazzolo, Ernesto Corvi, Aaron Giles 3 /************************************************************************* 4 5 Sega Z80-3D system 6 7 *************************************************************************/ 8 #ifndef MAME_INCLUDES_TURBO_H 9 #define MAME_INCLUDES_TURBO_H 10 11 #pragma once 12 13 #include "cpu/z80/z80.h" 14 #include "machine/i8255.h" 15 #include "sound/discrete.h" 16 #include "sound/samples.h" 17 #include "emupal.h" 18 #include "screen.h" 19 #include "tilemap.h" 20 21 /* sprites are scaled in the analog domain; to give a better */ 22 /* rendition of this, we scale in the X direction by this factor */ 23 #define TURBO_X_SCALE 2 24 25 26 27 class turbo_state : public driver_device 28 { 29 public: turbo_state(const machine_config & mconfig,device_type type,const char * tag)30 turbo_state(const machine_config &mconfig, device_type type, const char *tag) 31 : driver_device(mconfig, type, tag) 32 , m_maincpu(*this, "maincpu") 33 , m_subcpu(*this, "subcpu") 34 , m_i8255_0(*this, "i8255_0") 35 , m_i8255_1(*this, "i8255_1") 36 , m_i8255_2(*this, "i8255_2") 37 , m_i8255_3(*this, "i8255_3") 38 , m_spriteroms(*this, "sprites") 39 , m_proms(*this, "proms") 40 , m_roadroms(*this, "road") 41 , m_bgcolorrom(*this, "bgcolor") 42 , m_videoram(*this, "videoram") 43 , m_spriteram(*this, "spriteram") 44 , m_sprite_position(*this, "spritepos") 45 , m_decrypted_opcodes(*this, "decrypted_opcodes") 46 , m_samples(*this, "samples") 47 , m_gfxdecode(*this, "gfxdecode") 48 , m_screen(*this, "screen") 49 , m_digits(*this, "digit%u", 0U) 50 , m_lamp(*this, "lamp") 51 { } 52 53 void turbo(machine_config &config); 54 void buckrog(machine_config &config); 55 void buckroge(machine_config &config); 56 void buckrogu(machine_config &config); 57 void subroc3d(machine_config &config); 58 void turbo_samples(machine_config &config); 59 void subroc3d_samples(machine_config &config); 60 void buckrog_samples(machine_config &config); 61 62 void init_turbo_enc(); 63 void init_turbo_noenc(); 64 65 private: 66 /* device/memory pointers */ 67 required_device<z80_device> m_maincpu; 68 optional_device<z80_device> m_subcpu; 69 required_device<i8255_device> m_i8255_0; 70 required_device<i8255_device> m_i8255_1; 71 optional_device<i8255_device> m_i8255_2; 72 optional_device<i8255_device> m_i8255_3; 73 74 required_region_ptr<uint8_t> m_spriteroms; 75 required_region_ptr<uint8_t> m_proms; 76 optional_region_ptr<uint8_t> m_roadroms; 77 optional_region_ptr<uint8_t> m_bgcolorrom; 78 79 required_shared_ptr<uint8_t> m_videoram; 80 optional_shared_ptr<uint8_t> m_spriteram; 81 required_shared_ptr<uint8_t> m_sprite_position; 82 optional_shared_ptr<uint8_t> m_decrypted_opcodes; 83 84 required_device<samples_device> m_samples; 85 86 required_device<gfxdecode_device> m_gfxdecode; 87 required_device<screen_device> m_screen; 88 output_finder<32> m_digits; 89 output_finder<> m_lamp; 90 91 std::unique_ptr<uint8_t[]> m_buckrog_bitmap_ram; machine_start()92 virtual void machine_start() override { m_digits.resolve(); m_lamp.resolve(); } 93 94 /* machine states */ 95 uint8_t m_i8279_scanlines; 96 uint8_t m_alt_spriteram[0x80]; 97 98 /* sound state */ 99 uint8_t m_turbo_osel; 100 uint8_t m_turbo_bsel; 101 uint8_t m_sound_state[3]; 102 103 /* video state */ 104 tilemap_t * m_fg_tilemap; 105 106 /* Turbo-specific states */ 107 uint8_t m_turbo_opa; 108 uint8_t m_turbo_opb; 109 uint8_t m_turbo_opc; 110 uint8_t m_turbo_ipa; 111 uint8_t m_turbo_ipb; 112 uint8_t m_turbo_ipc; 113 uint8_t m_turbo_fbpla; 114 uint8_t m_turbo_fbcol; 115 uint8_t m_turbo_speed; 116 uint8_t m_turbo_collision; 117 uint8_t m_turbo_last_analog; 118 uint8_t m_turbo_accel; 119 120 /* Subroc-specific states */ 121 uint8_t m_subroc3d_col; 122 uint8_t m_subroc3d_ply; 123 uint8_t m_subroc3d_flip; 124 uint8_t m_subroc3d_mdis; 125 uint8_t m_subroc3d_mdir; 126 uint8_t m_subroc3d_tdis; 127 uint8_t m_subroc3d_tdir; 128 uint8_t m_subroc3d_fdis; 129 uint8_t m_subroc3d_fdir; 130 uint8_t m_subroc3d_hdis; 131 uint8_t m_subroc3d_hdir; 132 133 /* Buck Rogers-specific states */ 134 uint8_t m_buckrog_fchg; 135 uint8_t m_buckrog_mov; 136 uint8_t m_buckrog_obch; 137 uint8_t m_buckrog_command; 138 uint8_t m_buckrog_myship; 139 int m_last_sound_a; 140 141 struct sprite_info 142 { 143 uint16_t ve; /* VE0-15 signals for this row */ 144 uint8_t lst; /* LST0-7 signals for this row */ 145 uint32_t latched[8]; /* latched pixel data */ 146 uint8_t plb[8]; /* latched PLB state */ 147 uint32_t offset[8]; /* current offset for this row */ 148 uint32_t frac[8]; /* leftover fraction */ 149 uint32_t step[8]; /* stepping value */ 150 }; 151 152 void scanlines_w(uint8_t data); 153 void digit_w(uint8_t data); 154 uint8_t turbo_collision_r(); 155 void turbo_collision_clear_w(uint8_t data); 156 void turbo_analog_reset_w(uint8_t data); 157 DECLARE_WRITE_LINE_MEMBER(coin_meter_1_w); 158 DECLARE_WRITE_LINE_MEMBER(coin_meter_2_w); 159 DECLARE_WRITE_LINE_MEMBER(start_lamp_w); 160 uint8_t buckrog_cpu2_command_r(); 161 uint8_t buckrog_port_2_r(); 162 uint8_t buckrog_port_3_r(); 163 void turbo_videoram_w(offs_t offset, uint8_t data); 164 void buckrog_bitmap_w(offs_t offset, uint8_t data); 165 void turbo_ppi0a_w(uint8_t data); 166 void turbo_ppi0b_w(uint8_t data); 167 void turbo_ppi0c_w(uint8_t data); 168 void turbo_ppi1a_w(uint8_t data); 169 void turbo_ppi1b_w(uint8_t data); 170 void turbo_ppi1c_w(uint8_t data); 171 void turbo_ppi3c_w(uint8_t data); 172 void subroc3d_ppi0a_w(uint8_t data); 173 void subroc3d_ppi0c_w(uint8_t data); 174 void subroc3d_ppi0b_w(uint8_t data); 175 void buckrog_ppi0a_w(uint8_t data); 176 void buckrog_ppi0b_w(uint8_t data); 177 void buckrog_ppi0c_w(uint8_t data); 178 void buckrog_ppi1c_w(uint8_t data); 179 uint8_t turbo_analog_r(); 180 void buckrog_i8255_0_w(offs_t offset, uint8_t data); 181 uint8_t spriteram_r(offs_t offset); 182 void spriteram_w(offs_t offset, uint8_t data); 183 184 TILE_GET_INFO_MEMBER(get_fg_tile_info); 185 DECLARE_VIDEO_START(turbo); 186 void turbo_palette(palette_device &palette) const; 187 void subroc3d_palette(palette_device &palette) const; 188 DECLARE_MACHINE_RESET(buckrog); 189 DECLARE_VIDEO_START(buckrog); 190 void buckrog_palette(palette_device &palette) const; 191 uint32_t screen_update_turbo(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); 192 uint32_t screen_update_subroc3d(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); 193 uint32_t screen_update_buckrog(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); 194 TIMER_CALLBACK_MEMBER(delayed_i8255_w); 195 void turbo_sound_a_w(u8 data); 196 void turbo_sound_b_w(u8 data); 197 void turbo_sound_c_w(u8 data); 198 void subroc3d_sound_a_w(u8 data); 199 void subroc3d_sound_b_w(u8 data); 200 void subroc3d_sound_c_w(u8 data); 201 void buckrog_sound_a_w(u8 data); 202 void buckrog_sound_b_w(u8 data); 203 inline uint32_t sprite_xscale(uint8_t dacinput, double vr1, double vr2, double cext); 204 void turbo_prepare_sprites(uint8_t y, sprite_info *info); 205 uint32_t turbo_get_sprite_bits(uint8_t road, sprite_info *sprinfo); 206 void subroc3d_prepare_sprites(uint8_t y, sprite_info *info); 207 uint32_t subroc3d_get_sprite_bits(sprite_info *sprinfo, uint8_t *plb); 208 void buckrog_prepare_sprites(uint8_t y, sprite_info *info); 209 uint32_t buckrog_get_sprite_bits(sprite_info *sprinfo, uint8_t *plb); 210 void turbo_rom_decode(); 211 void turbo_update_samples(); 212 inline void subroc3d_update_volume(int leftchan, uint8_t dis, uint8_t dir); 213 void buckrog_update_samples(); 214 215 void buckrog_cpu2_map(address_map &map); 216 void buckrog_cpu2_portmap(address_map &map); 217 void buckrog_map(address_map &map); 218 void decrypted_opcodes_map(address_map &map); 219 void subroc3d_map(address_map &map); 220 void turbo_map(address_map &map); 221 }; 222 223 #endif // MAME_INCLUDES_TURBO_H 224