1 // license:BSD-3-Clause 2 // copyright-holders:Aaron Giles 3 /*************************************************************************** 4 5 Sega Y-Board hardware 6 7 ***************************************************************************/ 8 #ifndef MAME_INCLUDES_SEGAYBD_H 9 #define MAME_INCLUDES_SEGAYBD_H 10 11 #pragma once 12 13 #include "cpu/m68000/m68000.h" 14 #include "cpu/z80/z80.h" 15 #include "machine/mb3773.h" 16 #include "video/segaic16.h" 17 #include "video/sega16sp.h" 18 #include "screen.h" 19 20 21 // ======================> segaybd_state 22 23 class segaybd_state : public sega_16bit_common_base 24 { 25 public: 26 // construction/destruction segaybd_state(const machine_config & mconfig,device_type type,const char * tag)27 segaybd_state(const machine_config &mconfig, device_type type, const char *tag) 28 : sega_16bit_common_base(mconfig, type, tag) 29 , m_maincpu(*this, "maincpu") 30 , m_subx(*this, "subx") 31 , m_suby(*this, "suby") 32 , m_soundcpu(*this, "soundcpu") 33 , m_linkcpu(*this, "linkcpu") 34 , m_watchdog(*this, "watchdog") 35 , m_screen(*this, "screen") 36 , m_bsprites(*this, "bsprites") 37 , m_ysprites(*this, "ysprites") 38 , m_segaic16vid(*this, "segaic16vid") 39 , m_adc_ports(*this, "ADC.%u", 0) 40 , m_pdrift_bank(0) 41 , m_scanline_timer(nullptr) 42 , m_irq2_scanline(0) 43 , m_timer_irq_state(0) 44 , m_vblank_irq_state(0) 45 , m_misc_io_data(0) 46 { 47 } 48 49 void yboard_deluxe(machine_config &config); 50 void yboard_link(machine_config &config); 51 void yboard(machine_config &config); 52 53 // game-specific driver init 54 void init_generic(); 55 void init_pdrift(); 56 void init_r360(); 57 void init_gforce2(); 58 void init_rchase(); 59 void init_gloc(); 60 61 private: 62 // main CPU read/write handlers 63 void output1_w(uint8_t data); 64 void misc_output_w(uint8_t data); 65 void output2_w(uint8_t data); 66 67 // linked cabinet specific handlers 68 DECLARE_WRITE_LINE_MEMBER(mb8421_intl); 69 DECLARE_WRITE_LINE_MEMBER(mb8421_intr); 70 uint16_t link_r(); 71 uint16_t link2_r(); 72 void link2_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); 73 // uint8_t link_portc0_r(); 74 75 // input helpers 76 ioport_value analog_mux(); 77 78 // game-specific output handlers 79 void gforce2_output_cb1(uint16_t data); 80 void gforce2_output_cb2(uint16_t data); 81 void gloc_output_cb1(uint16_t data); 82 void gloc_output_cb2(uint16_t data); 83 void r360_output_cb2(uint16_t data); 84 void pdrift_output_cb1(uint16_t data); 85 void pdrift_output_cb2(uint16_t data); 86 void rchase_output_cb2(uint16_t data); 87 88 // video updates 89 uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); 90 91 void link_map(address_map &map); 92 void link_portmap(address_map &map); 93 void main_map(address_map &map); 94 void main_map_link(address_map &map); 95 void motor_map(address_map &map); 96 void sound_map(address_map &map); 97 void sound_portmap(address_map &map); 98 void subx_map(address_map &map); 99 void suby_map(address_map &map); 100 101 // internal types 102 typedef delegate<void (uint16_t)> output_delegate; 103 104 // timer IDs 105 enum 106 { 107 TID_IRQ2_GEN 108 }; 109 110 // device overrides 111 virtual void machine_reset() override; 112 virtual void video_start() override; 113 virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; 114 115 // internal helpers 116 void update_irqs(); 117 118 // devices 119 required_device<m68000_device> m_maincpu; 120 required_device<m68000_device> m_subx; 121 required_device<m68000_device> m_suby; 122 required_device<z80_device> m_soundcpu; 123 optional_device<z80_device> m_linkcpu; 124 required_device<mb3773_device> m_watchdog; 125 required_device<screen_device> m_screen; 126 required_device<sega_sys16b_sprite_device> m_bsprites; 127 required_device<sega_yboard_sprite_device> m_ysprites; 128 required_device<segaic16_video_device> m_segaic16vid; 129 130 // input ports 131 optional_ioport_array<6> m_adc_ports; 132 133 // configuration 134 output_delegate m_output_cb1; 135 output_delegate m_output_cb2; 136 137 // internal state 138 uint16_t m_pdrift_bank; 139 emu_timer * m_scanline_timer; 140 int m_irq2_scanline; 141 uint8_t m_timer_irq_state; 142 uint8_t m_vblank_irq_state; 143 uint8_t m_misc_io_data; 144 }; 145 146 #endif // MAME_INCLUDES_SEGAYBD_H 147