1 // license:BSD-3-Clause 2 // copyright-holders:Aaron Giles 3 /*************************************************************************** 4 5 Sega System Hang On hardware 6 7 ***************************************************************************/ 8 9 #include "cpu/m68000/m68000.h" 10 #include "cpu/mcs51/mcs51.h" 11 #include "cpu/z80/z80.h" 12 #include "machine/adc0804.h" 13 #include "machine/i8255.h" 14 #include "machine/gen_latch.h" 15 #include "video/segaic16.h" 16 #include "video/segaic16_road.h" 17 #include "video/sega16sp.h" 18 #include "screen.h" 19 20 21 // ======================> segahang_state 22 23 class segahang_state : public sega_16bit_common_base 24 { 25 public: 26 // construction/destruction segahang_state(const machine_config & mconfig,device_type type,const char * tag)27 segahang_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_subcpu(*this, "subcpu") 31 , m_soundcpu(*this, "soundcpu") 32 , m_mcu(*this, "mcu") 33 , m_i8255_1(*this, "i8255_1") 34 , m_i8255_2(*this, "i8255_2") 35 , m_adc(*this, "adc") 36 , m_screen(*this, "screen") 37 , m_sprites(*this, "sprites") 38 , m_segaic16vid(*this, "segaic16vid") 39 , m_segaic16road(*this, "segaic16road") 40 , m_soundlatch(*this, "soundlatch") 41 , m_workram(*this, "workram") 42 , m_sharrier_video(false) 43 , m_adc_select(0) 44 , m_adc_ports(*this, "ADC%u", 0U) 45 , m_decrypted_opcodes(*this, "decrypted_opcodes") 46 , m_lamps(*this, "lamp%u", 0U) 47 { } 48 49 void sound_board_2203(machine_config &config); 50 void sound_board_2203x2(machine_config &config); 51 void sound_board_2151(machine_config &config); 52 void shared_base(machine_config &config); 53 void hangon_base(machine_config &config); 54 void sharrier_base(machine_config &config); 55 void enduror_base(machine_config &config); 56 void endurord_base(machine_config &config); 57 void endurob2(machine_config &config); 58 void shangupb(machine_config &config); 59 void enduror(machine_config &config); 60 void shangonro(machine_config &config); 61 void enduror1d(machine_config &config); 62 void endurord(machine_config &config); 63 void sharrier(machine_config &config); 64 void endurobl(machine_config &config); 65 void enduror1(machine_config &config); 66 void hangon(machine_config &config); 67 68 // game-specific driver init 69 void init_generic(); 70 void init_sharrier(); 71 void init_enduror(); 72 void init_endurobl(); 73 void init_endurob2(); 74 75 private: 76 // PPI read/write callbacks 77 void video_lamps_w(uint8_t data); 78 void tilemap_sound_w(uint8_t data); 79 void sub_control_adc_w(uint8_t data); 80 uint8_t adc_status_r(); 81 82 // main CPU read/write handlers 83 uint8_t hangon_inputs_r(offs_t offset); 84 uint8_t sharrier_inputs_r(offs_t offset); 85 void sync_ppi_w(offs_t offset, uint8_t data); 86 87 // ADC0804 read handler 88 uint8_t analog_r(); 89 90 // Z80 sound CPU read/write handlers 91 uint8_t sound_data_r(); 92 93 // I8751-related VBLANK interrupt handlers 94 INTERRUPT_GEN_MEMBER( i8751_main_cpu_vblank ); 95 96 // video updates 97 uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); 98 99 void decrypted_opcodes_map(address_map &map); 100 void fd1094_decrypted_opcodes_map(address_map &map); 101 void hangon_map(address_map &map); 102 void mcu_io_map(address_map &map); 103 void sharrier_map(address_map &map); 104 void sound_map_2151(address_map &map); 105 void sound_map_2203(address_map &map); 106 void sound_portmap_2151(address_map &map); 107 void sound_portmap_2203(address_map &map); 108 void sound_portmap_2203x2(address_map &map); 109 void sub_map(address_map &map); 110 111 // internal types 112 typedef delegate<void ()> i8751_sim_delegate; 113 114 // timer IDs 115 enum 116 { 117 TID_INIT_I8751, 118 TID_PPI_WRITE 119 }; 120 121 // driver overrides 122 virtual void video_start() override; machine_start()123 virtual void machine_start() override { m_lamps.resolve(); } 124 virtual void machine_reset() override; 125 virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; 126 127 // I8751 simulations 128 void sharrier_i8751_sim(); 129 130 // devices 131 required_device<m68000_device> m_maincpu; 132 required_device<m68000_device> m_subcpu; 133 required_device<z80_device> m_soundcpu; 134 optional_device<i8751_device> m_mcu; 135 required_device<i8255_device> m_i8255_1; 136 required_device<i8255_device> m_i8255_2; 137 required_device<adc0804_device> m_adc; 138 required_device<screen_device> m_screen; 139 required_device<sega_16bit_sprite_device> m_sprites; 140 required_device<segaic16_video_device> m_segaic16vid; 141 required_device<segaic16_road_device> m_segaic16road; 142 required_device<generic_latch_8_device> m_soundlatch; 143 144 // memory pointers 145 required_shared_ptr<uint16_t> m_workram; 146 147 // configuration 148 bool m_sharrier_video; 149 i8751_sim_delegate m_i8751_vblank_hook; 150 151 // internal state 152 uint8_t m_adc_select; 153 optional_ioport_array<4> m_adc_ports; 154 bool m_shadow; 155 optional_shared_ptr<uint16_t> m_decrypted_opcodes; 156 output_finder<2> m_lamps; 157 }; 158