1 // license:BSD-3-Clause 2 // copyright-holders:Aaron Giles 3 /*************************************************************************** 4 5 Sega X-Board hardware 6 7 ***************************************************************************/ 8 #ifndef MAME_INCLUDES_SEGAXBD_H 9 #define MAME_INCLUDES_SEGAXBD_H 10 11 #pragma once 12 13 #include "video/segaic16.h" 14 #include "video/segaic16_road.h" 15 #include "video/sega16sp.h" 16 17 #include "cpu/m68000/m68000.h" 18 #include "cpu/mcs51/mcs51.h" 19 #include "cpu/z80/z80.h" 20 #include "machine/cxd1095.h" 21 #include "machine/i8251.h" 22 #include "machine/mb3773.h" 23 #include "machine/mb8421.h" 24 #include "machine/segaic16.h" 25 #include "video/resnet.h" 26 #include "emupal.h" 27 #include "screen.h" 28 29 // ======================> segaxbd_state 30 31 32 class segaxbd_state : public device_t 33 { 34 public: 35 // construction/destruction 36 segaxbd_state(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); 37 38 void xboard_base_mconfig(machine_config &config); 39 40 void install_aburner2(void); 41 void install_loffire(void); 42 void install_smgp(void); 43 void install_gprider(void); 44 45 // devices 46 required_device<m68000_device> m_maincpu; 47 48 // custom I/O 49 uint8_t aburner2_motor_r(); 50 void aburner2_motor_w(uint8_t data); 51 uint8_t smgp_motor_r(); 52 void smgp_motor_w(uint8_t data); 53 uint8_t lastsurv_port_r(); 54 void lastsurv_muxer_w(uint8_t data); 55 56 // game-specific main CPU read/write handlers 57 void loffire_sync0_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); 58 uint16_t smgp_excs_r(offs_t offset); 59 void smgp_excs_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); 60 61 protected: 62 // main CPU read/write handlers 63 uint8_t analog_r(); 64 void iocontrol_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); 65 66 // video updates 67 uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); 68 69 // palette helpers 70 void paletteram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); 71 72 void decrypted_opcodes_map(address_map &map); 73 void main_map(address_map &map); 74 void smgp_airdrive_map(address_map &map); 75 void smgp_airdrive_portmap(address_map &map); 76 void smgp_comm_map(address_map &map); 77 void smgp_comm_portmap(address_map &map); 78 void smgp_sound2_map(address_map &map); 79 void smgp_sound2_portmap(address_map &map); 80 void sound_map(address_map &map); 81 void sound_portmap(address_map &map); 82 void sub_map(address_map &map); 83 84 // timer IDs 85 enum 86 { 87 TID_SCANLINE, 88 TID_IRQ2_GEN 89 }; 90 91 segaxbd_state(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); 92 93 // device overrides 94 // virtual void machine_reset(); 95 virtual void video_start(); 96 virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; 97 98 // internal helpers 99 void update_main_irqs(); 100 DECLARE_WRITE_LINE_MEMBER(m68k_reset_callback); 101 void generic_iochip0_lamps_w(uint8_t data); 102 103 // compare/timer chip callbacks 104 DECLARE_WRITE_LINE_MEMBER(timer_irq_w); 105 106 void pc_0_w(uint8_t data); 107 void pd_0_w(uint8_t data); 108 109 // devices 110 required_device<m68000_device> m_subcpu; 111 optional_device<z80_device> m_soundcpu; 112 optional_device<z80_device> m_soundcpu2; 113 optional_device<i8751_device> m_mcu; 114 required_device<mb3773_device> m_watchdog; 115 required_device_array<cxd1095_device, 2> m_iochip; 116 required_device<sega_315_5250_compare_timer_device> m_cmptimer_1; 117 required_device<sega_xboard_sprite_device> m_sprites; 118 required_device<segaic16_video_device> m_segaic16vid; 119 required_device<segaic16_road_device> m_segaic16road; 120 required_shared_ptr<uint16_t> m_subram0; 121 122 // configuration 123 bool m_adc_reverse[8]; 124 uint8_t m_road_priority; 125 126 // internal state 127 emu_timer * m_scanline_timer; 128 uint8_t m_timer_irq_state; 129 uint8_t m_vblank_irq_state; 130 uint8_t m_pc_0; 131 132 // game-specific state 133 uint16_t * m_loffire_sync; 134 uint8_t m_lastsurv_mux; 135 136 // memory pointers 137 required_shared_ptr<uint16_t> m_paletteram; 138 bool m_gprider_hack; 139 140 void palette_init(); 141 uint32_t m_palette_entries; // number of palette entries 142 uint8_t m_palette_normal[32]; // RGB translations for normal pixels 143 uint8_t m_palette_shadow[32]; // RGB translations for shadowed pixels 144 uint8_t m_palette_hilight[32]; // RGB translations for hilighted pixels 145 required_device<screen_device> m_screen; 146 required_device<palette_device> m_palette; 147 required_ioport m_io0_porta; 148 optional_ioport_array<8> m_adc_ports; 149 optional_ioport_array<4> m_mux_ports; 150 output_finder<4> m_lamps; 151 152 virtual void device_start() override; 153 virtual void device_reset() override; 154 }; 155 156 157 class segaxbd_regular_state : public segaxbd_state 158 { 159 public: 160 segaxbd_regular_state(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); 161 162 protected: 163 virtual void device_add_mconfig(machine_config &config) override; 164 }; 165 166 167 168 class segaxbd_fd1094_state : public segaxbd_state 169 { 170 public: 171 segaxbd_fd1094_state(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); 172 173 protected: 174 virtual void device_add_mconfig(machine_config &config) override; 175 }; 176 177 class segaxbd_aburner2_state : public segaxbd_state 178 { 179 public: 180 segaxbd_aburner2_state(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); 181 182 protected: 183 virtual void device_add_mconfig(machine_config &config) override; 184 // virtual void device_start(); 185 // virtual void device_reset(); 186 }; 187 188 class segaxbd_lastsurv_fd1094_state : public segaxbd_state 189 { 190 public: 191 segaxbd_lastsurv_fd1094_state(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); 192 193 protected: 194 virtual void device_add_mconfig(machine_config &config) override; 195 }; 196 197 class segaxbd_lastsurv_state : public segaxbd_state 198 { 199 public: 200 segaxbd_lastsurv_state(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); 201 202 protected: 203 virtual void device_add_mconfig(machine_config &config) override; 204 }; 205 206 207 class segaxbd_smgp_fd1094_state : public segaxbd_state 208 { 209 public: 210 segaxbd_smgp_fd1094_state(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); 211 212 protected: 213 virtual void device_add_mconfig(machine_config &config) override; 214 }; 215 216 217 class segaxbd_smgp_state : public segaxbd_state 218 { 219 public: 220 segaxbd_smgp_state(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); 221 222 protected: 223 virtual void device_add_mconfig(machine_config &config) override; 224 }; 225 226 227 class segaxbd_rascot_state : public segaxbd_state 228 { 229 public: 230 segaxbd_rascot_state(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); 231 232 protected: 233 virtual void device_add_mconfig(machine_config &config) override; 234 virtual void device_start() override; 235 236 private: 237 uint8_t commram_r(offs_t offset); 238 void commram_w(offs_t offset, uint8_t data); 239 void commram_bank_w(uint8_t data); 240 241 void sub_map(address_map &map); 242 void comm_map(address_map &map); 243 244 required_device<mb8421_device> m_commram; 245 required_device<i8251_device> m_usart; 246 247 uint8_t m_commram_bank; 248 }; 249 250 #endif // MAME_INCLUDES_SEGAXBD_H 251