1 // license:BSD-3-Clause 2 // copyright-holders:Dan Boris, Olivier Galibert, Aaron Giles 3 /*************************************************************************** 4 5 Star Fire/Fire One system 6 7 ***************************************************************************/ 8 #ifndef MAME_INCLUDES_STARFIRE_H 9 #define MAME_INCLUDES_STARFIRE_H 10 11 #pragma once 12 13 #include "machine/netlist.h" 14 #include "machine/pit8253.h" 15 #include "netlist/nl_setup.h" 16 #include "audio/nl_fireone.h" 17 #include "audio/nl_starfire.h" 18 #include "sound/dac.h" 19 #include "screen.h" 20 21 22 #define STARFIRE_MASTER_CLOCK (XTAL(20'000'000)) 23 #define STARFIRE_CPU_CLOCK (STARFIRE_MASTER_CLOCK / 8) 24 #define STARFIRE_PIXEL_CLOCK (STARFIRE_MASTER_CLOCK / 4) 25 #define STARFIRE_HTOTAL (0x13f) /* could be 0x140, but I think this is right */ 26 #define STARFIRE_HBEND (0x000) 27 #define STARFIRE_HBSTART (0x100) 28 #define STARFIRE_VTOTAL (0x106) 29 #define STARFIRE_VBEND (0x020) 30 #define STARFIRE_VBSTART (0x100) 31 #define STARFIRE_NUM_PENS (0x40) 32 33 34 class starfire_base_state : public driver_device 35 { 36 public: starfire_base_state(const machine_config & mconfig,device_type type,const char * tag)37 starfire_base_state(const machine_config &mconfig, device_type type, const char *tag) 38 : driver_device(mconfig, type, tag) 39 , m_maincpu(*this, "maincpu") 40 , m_screen(*this, "screen") 41 , m_colorram(*this, "colorram") 42 , m_videoram(*this, "videoram") 43 , m_dsw(*this, "DSW") 44 , m_system(*this, "SYSTEM") 45 { } 46 47 protected: 48 virtual void video_start() override; 49 50 void base_config(machine_config &config); 51 void main_map(address_map &map); 52 53 required_device<cpu_device> m_maincpu; 54 required_device<screen_device> m_screen; 55 required_shared_ptr<uint8_t> m_colorram; 56 required_shared_ptr<uint8_t> m_videoram; 57 required_ioport m_dsw; 58 required_ioport m_system; 59 60 uint8_t m_vidctrl; 61 uint8_t m_vidctrl1; 62 uint8_t m_color; 63 uint16_t m_colors[STARFIRE_NUM_PENS]; 64 65 emu_timer* m_scanline_timer; 66 bitmap_rgb32 m_screen_bitmap; 67 68 virtual uint8_t input_r(offs_t offset) = 0; 69 virtual void sound_w(offs_t offset, uint8_t data) = 0; music_w(offs_t offset,uint8_t data)70 virtual void music_w(offs_t offset, uint8_t data) { }; 71 72 void scratch_w(offs_t offset, uint8_t data); 73 uint8_t scratch_r(offs_t offset); 74 void colorram_w(offs_t offset, uint8_t data); 75 uint8_t colorram_r(offs_t offset); 76 void videoram_w(offs_t offset, uint8_t data); 77 uint8_t videoram_r(offs_t offset); 78 uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); 79 TIMER_CALLBACK_MEMBER(scanline_callback); 80 void get_pens(pen_t *pens); 81 void scanline_callback(uint32_t data); 82 }; 83 84 class starfire_state : public starfire_base_state 85 { 86 public: starfire_state(const machine_config & mconfig,device_type type,const char * tag)87 starfire_state(const machine_config &mconfig, device_type type, const char *tag) 88 : starfire_base_state(mconfig, type, tag) 89 , m_dac(*this, "dac") // just to have a sound device 90 , m_nmi(*this, "NMI") 91 , m_stickz(*this, "STICKZ") 92 , m_stickx(*this, "STICKX") 93 , m_sticky(*this, "STICKY") 94 , m_sound_size(*this, "sound_nl:size") 95 , m_sound_explosion(*this, "sound_nl:sexplo") 96 , m_sound_tie(*this, "sound_nl:stie") 97 , m_sound_laser(*this, "sound_nl:slaser") 98 , m_sound_track(*this, "sound_nl:track") 99 , m_sound_lock(*this, "sound_nl:lock") 100 , m_sound_scanner(*this, "sound_nl:scanner") 101 , m_sound_overheat(*this, "sound_nl:oheat") 102 { } 103 104 void starfire(machine_config &config); 105 106 private: 107 virtual void machine_start() override; 108 virtual void machine_reset() override; 109 110 required_device<dac_word_interface> m_dac; 111 112 required_ioport m_nmi; 113 required_ioport m_stickz; 114 required_ioport m_stickx; 115 required_ioport m_sticky; 116 117 virtual uint8_t input_r(offs_t offset) override; 118 virtual void sound_w(offs_t offset, uint8_t data) override; 119 120 INTERRUPT_GEN_MEMBER(vblank_int); 121 122 NETDEV_ANALOG_CALLBACK_MEMBER(tieon1_cb); 123 NETDEV_ANALOG_CALLBACK_MEMBER(laseron1_cb); 124 NETDEV_ANALOG_CALLBACK_MEMBER(sound_out_cb); 125 126 uint8_t m_sound_tie_on; 127 uint8_t m_sound_laser_on; 128 129 required_device<netlist_mame_logic_input_device> m_sound_size; 130 required_device<netlist_mame_logic_input_device> m_sound_explosion; 131 required_device<netlist_mame_logic_input_device> m_sound_tie; 132 required_device<netlist_mame_logic_input_device> m_sound_laser; 133 required_device<netlist_mame_logic_input_device> m_sound_track; 134 required_device<netlist_mame_logic_input_device> m_sound_lock; 135 required_device<netlist_mame_logic_input_device> m_sound_scanner; 136 required_device<netlist_mame_logic_input_device> m_sound_overheat; 137 }; 138 139 class fireone_state : public starfire_base_state 140 { 141 public: fireone_state(const machine_config & mconfig,device_type type,const char * tag)142 fireone_state(const machine_config &mconfig, device_type type, const char *tag) 143 : starfire_base_state(mconfig, type, tag) 144 , m_pit(*this, "pit") 145 , m_controls(*this, "P%u", 1U) 146 , m_sound_left_partial_hit(*this, "sound_nl:lshpht") 147 , m_sound_right_partial_hit(*this, "sound_nl:rshpht") 148 , m_sound_left_torpedo(*this, "sound_nl:ltorp") 149 , m_sound_right_torpedo(*this, "sound_nl:rtorp") 150 , m_sound_left_boom(*this, "sound_nl:lboom") 151 , m_sound_right_boom(*this, "sound_nl:rboom") 152 , m_sound_torpedo_collision(*this, "sound_nl:torpcoll") 153 , m_sound_submarine_engine(*this, "sound_nl:subeng") 154 , m_sound_alert(*this, "sound_nl:alert") 155 , m_sound_sonar_enable(*this, "sound_nl:sonar_enable") 156 , m_sound_sonar_sync(*this, "sound_nl:sonar_sync") 157 , m_sound_off_left(*this, "sound_nl:lsound_off") 158 , m_sound_off_right(*this, "sound_nl:rsound_off") 159 , m_music_a(*this, "sound_nl:music_a") 160 , m_music_b(*this, "sound_nl:music_b") 161 , m_music_c(*this, "sound_nl:music_c") 162 { } 163 164 void fireone(machine_config &config); 165 166 private: 167 virtual void machine_start() override; 168 virtual void machine_reset() override; 169 170 required_device<pit8253_device> m_pit; 171 required_ioport_array<2> m_controls; 172 173 DECLARE_WRITE_LINE_MEMBER(music_a_out_cb); 174 DECLARE_WRITE_LINE_MEMBER(music_b_out_cb); 175 DECLARE_WRITE_LINE_MEMBER(music_c_out_cb); 176 177 virtual uint8_t input_r(offs_t offset) override; 178 virtual void sound_w(offs_t offset, uint8_t data) override; 179 virtual void music_w(offs_t offset, uint8_t data) override; 180 181 uint8_t m_player_select; 182 183 INTERRUPT_GEN_MEMBER(vblank_int); 184 185 required_device<netlist_mame_logic_input_device> m_sound_left_partial_hit; 186 required_device<netlist_mame_logic_input_device> m_sound_right_partial_hit; 187 required_device<netlist_mame_logic_input_device> m_sound_left_torpedo; 188 required_device<netlist_mame_logic_input_device> m_sound_right_torpedo; 189 required_device<netlist_mame_logic_input_device> m_sound_left_boom; 190 required_device<netlist_mame_logic_input_device> m_sound_right_boom; 191 required_device<netlist_mame_logic_input_device> m_sound_torpedo_collision; 192 required_device<netlist_mame_logic_input_device> m_sound_submarine_engine; 193 required_device<netlist_mame_logic_input_device> m_sound_alert; 194 required_device<netlist_mame_logic_input_device> m_sound_sonar_enable; 195 required_device<netlist_mame_logic_input_device> m_sound_sonar_sync; 196 required_device<netlist_mame_logic_input_device> m_sound_off_left; 197 required_device<netlist_mame_logic_input_device> m_sound_off_right; 198 required_device<netlist_mame_logic_input_device> m_music_a; 199 required_device<netlist_mame_logic_input_device> m_music_b; 200 required_device<netlist_mame_logic_input_device> m_music_c; 201 }; 202 203 #endif // MAME_INCLUDES_STARFIRE_H 204