1 // license:BSD-3-Clause 2 // copyright-holders:Aaron Giles 3 /************************************************************************* 4 5 Incredible Technologies/Strata system 6 (8-bit blitter variant) 7 8 **************************************************************************/ 9 10 #include "machine/gen_latch.h" 11 #include "machine/ticket.h" 12 #include "machine/timer.h" 13 #include "video/tlc34076.h" 14 #include "video/tms34061.h" 15 #include "screen.h" 16 17 18 class itech8_state : public driver_device 19 { 20 public: itech8_state(const machine_config & mconfig,device_type type,const char * tag)21 itech8_state(const machine_config &mconfig, device_type type, const char *tag) : 22 driver_device(mconfig, type, tag), 23 m_maincpu(*this, "maincpu"), 24 m_soundcpu(*this, "soundcpu"), 25 m_subcpu(*this, "sub"), 26 m_soundlatch(*this, "soundlatch"), 27 m_tms34061(*this, "tms34061"), 28 m_tlc34076(*this, "tlc34076"), 29 m_screen(*this, "screen"), 30 m_ticket(*this, "ticket"), 31 m_grom(*this, "grom"), 32 m_mainbank(*this, "mainbank"), 33 m_fixed(*this, "fixed"), 34 m_an(*this, { { "AN_C", "AN_D", "AN_E", "AN_F" } }), 35 m_fakex(*this, "FAKEX"), 36 m_fakey(*this, "FAKEY"), 37 m_p1(*this, "P1"), 38 m_p2(*this, "P2"), 39 m_visarea(0, 0, 0, 0), 40 m_bankxor(0) 41 {} 42 43 void rimrockn(machine_config &config); 44 void gtg2(machine_config &config); 45 void slikshot_lo(machine_config &config); 46 void slikshot_lo_noz80(machine_config &config); 47 void ninclown(machine_config &config); 48 void sstrike(machine_config &config); 49 void stratab_hi(machine_config &config); 50 void hstennis_lo(machine_config &config); 51 void wfortune(machine_config &config); 52 void stratab_lo(machine_config &config); 53 void slikshot_hi(machine_config &config); 54 void hstennis_hi(machine_config &config); 55 56 void init_invbank(); 57 void init_peggle(); 58 void init_slikshot(); 59 void init_neckneck(); 60 void init_arligntn(); 61 void init_hstennis(); 62 63 DECLARE_READ_LINE_MEMBER(special_r); 64 DECLARE_CUSTOM_INPUT_MEMBER(gtg_mux); 65 66 protected: 67 static constexpr uint32_t YBUFFER_COUNT = 15; 68 static constexpr uint32_t VRAM_SIZE = 0x40000; 69 static constexpr uint32_t VRAM_MASK = VRAM_SIZE - 1; 70 71 enum 72 { 73 TIMER_IRQ_OFF, 74 TIMER_BEHIND_BEAM_UPDATE, 75 TIMER_BLITTER_DONE, 76 TIMER_DELAYED_Z80_CONTROL, 77 TIMER_BASE_LAST = TIMER_DELAYED_Z80_CONTROL 78 }; 79 80 required_device<cpu_device> m_maincpu; 81 required_device<cpu_device> m_soundcpu; 82 optional_device<cpu_device> m_subcpu; 83 required_device<generic_latch_8_device> m_soundlatch; 84 required_device<tms34061_device> m_tms34061; 85 required_device<tlc34076_device> m_tlc34076; 86 required_device<screen_device> m_screen; 87 required_device<ticket_dispenser_device> m_ticket; 88 required_region_ptr<uint8_t> m_grom; 89 optional_memory_bank m_mainbank; 90 optional_memory_bank m_fixed; 91 optional_ioport_array<4> m_an; 92 optional_ioport m_fakex; 93 optional_ioport m_fakey; 94 optional_ioport m_p1; 95 optional_ioport m_p2; 96 97 rectangle m_visarea; 98 99 uint8_t m_grom_bank; 100 uint8_t m_blitter_int; 101 uint8_t m_tms34061_int; 102 uint8_t m_periodic_int; 103 uint8_t m_pia_porta_data; 104 uint8_t m_pia_portb_data; 105 uint8_t m_z80_ctrl; 106 uint8_t m_z80_port_val; 107 uint8_t m_z80_clear_to_send; 108 uint16_t m_sensor0; 109 uint16_t m_sensor1; 110 uint16_t m_sensor2; 111 uint16_t m_sensor3; 112 uint8_t m_curvx; 113 uint8_t m_curvy; 114 uint8_t m_curx; 115 int8_t m_xbuffer[YBUFFER_COUNT]; 116 int8_t m_ybuffer[YBUFFER_COUNT]; 117 int m_ybuffer_next; 118 int m_curxpos; 119 int m_last_ytotal; 120 uint8_t m_crosshair_vis; 121 uint8_t m_blitter_data[16]; 122 uint8_t m_blit_in_progress; 123 uint8_t m_page_select; 124 offs_t m_fetch_offset; 125 uint8_t m_fetch_rle_count; 126 uint8_t m_fetch_rle_value; 127 uint8_t m_fetch_rle_literal; 128 emu_timer *m_irq_off_timer; 129 emu_timer *m_behind_beam_update_timer; 130 emu_timer *m_blitter_done_timer; 131 emu_timer *m_delayed_z80_control_timer; 132 int m_bankxor; 133 134 // common 135 DECLARE_WRITE_LINE_MEMBER(generate_tms34061_interrupt); 136 void nmi_ack_w(uint8_t data); 137 void blitter_bank_w(offs_t offset, uint8_t data); 138 void rimrockn_bank_w(uint8_t data); 139 void pia_portb_out(uint8_t data); 140 void gtg2_sound_data_w(uint8_t data); 141 void grom_bank_w(uint8_t data); 142 void palette_w(offs_t offset, uint8_t data); 143 void page_w(u8 data); 144 uint8_t blitter_r(offs_t offset); 145 void blitter_w(offs_t offset, uint8_t data); 146 void tms34061_w(offs_t offset, uint8_t data); 147 uint8_t tms34061_r(offs_t offset); 148 void pia_porta_out(uint8_t data); 149 void ym2203_portb_out(uint8_t data); 150 151 virtual void machine_start() override; 152 virtual void machine_reset() override; 153 virtual void video_start() override; 154 DECLARE_VIDEO_START(slikshot); 155 DECLARE_MACHINE_START(sstrike); 156 157 uint32_t screen_update_2layer(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); 158 uint32_t screen_update_slikshot(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); 159 uint32_t screen_update_2page(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); 160 uint32_t screen_update_2page_large(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); 161 162 DECLARE_WRITE_LINE_MEMBER(generate_nmi); 163 DECLARE_WRITE_LINE_MEMBER(ninclown_irq); 164 TIMER_CALLBACK_MEMBER(irq_off); 165 TIMER_CALLBACK_MEMBER(behind_the_beam_update); 166 TIMER_CALLBACK_MEMBER(blitter_done); 167 168 inline uint8_t fetch_next_raw(); 169 inline void consume_raw(int count); 170 inline uint8_t fetch_next_rle(); 171 inline void consume_rle(int count); 172 void perform_blit(); 173 void update_interrupts(int periodic, int tms34061, int blitter); 174 175 /*----------- defined in machine/itech8.cpp -----------*/ 176 177 uint8_t slikz80_port_r(); 178 void slikz80_port_w(uint8_t data); 179 180 uint8_t slikshot_z80_r(); 181 uint8_t slikshot_z80_control_r(); 182 void slikshot_z80_control_w(uint8_t data); 183 184 void inters_to_vels(uint16_t inter1, uint16_t inter2, uint16_t inter3, uint8_t beams, 185 uint8_t *xres, uint8_t *vxres, uint8_t *vyres); 186 void vels_to_inters(uint8_t x, uint8_t vx, uint8_t vy, 187 uint16_t *inter1, uint16_t *inter2, uint16_t *inter3, uint8_t *beams); 188 void inters_to_words(uint16_t inter1, uint16_t inter2, uint16_t inter3, uint8_t *beams, 189 uint16_t *word1, uint16_t *word2, uint16_t *word3); 190 191 void words_to_sensors(uint16_t word1, uint16_t word2, uint16_t word3, uint8_t beams, 192 uint16_t *sens0, uint16_t *sens1, uint16_t *sens2, uint16_t *sens3); 193 void compute_sensors(); 194 TIMER_CALLBACK_MEMBER( delayed_z80_control_w ); 195 196 // ninja clowns 197 uint16_t rom_constant_r(offs_t offset); 198 uint8_t ninclown_palette_r(offs_t offset); 199 void ninclown_palette_w(offs_t offset, uint8_t data); 200 201 void itech8_sound_ym2203(machine_config &config); 202 void itech8_sound_ym2608b(machine_config &config); 203 void itech8_sound_ym3812(machine_config &config); 204 void itech8_sound_ym3812_external(machine_config &config); 205 void itech8_core_devices(machine_config &config); 206 void itech8_core_lo(machine_config &config); 207 void itech8_core_hi(machine_config &config); 208 void common_hi_map(address_map &map); 209 void common_lo_map(address_map &map); 210 void gtg2_map(address_map &map); 211 void ninclown_map(address_map &map); 212 void rimrockn_map(address_map &map); 213 void slikshot_map(address_map &map); 214 void slikz80_io_map(address_map &map); 215 void slikz80_mem_map(address_map &map); 216 void sound2203_map(address_map &map); 217 void sound2608b_map(address_map &map); 218 void sound3812_external_map(address_map &map); 219 void sound3812_map(address_map &map); 220 void sstrike_map(address_map &map); 221 222 virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; 223 }; 224 225 class grmatch_state : public itech8_state 226 { 227 public: grmatch_state(const machine_config & mconfig,device_type type,const char * tag)228 grmatch_state(const machine_config &mconfig, device_type type, const char *tag) : 229 itech8_state(mconfig, type, tag), 230 m_palette_timer(nullptr) 231 { 232 } 233 234 void grmatch(machine_config &config); 235 236 void driver_init() override; 237 238 protected: 239 void machine_start() override; 240 void machine_reset() override; 241 242 enum 243 { 244 TIMER_PALETTE = TIMER_BASE_LAST+1, 245 }; 246 247 virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; 248 249 void palette_w(uint8_t data); 250 void xscroll_w(uint8_t data); 251 252 uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); 253 254 void palette_update(); 255 256 emu_timer *m_palette_timer; 257 uint8_t m_palcontrol; 258 uint8_t m_xscroll; 259 rgb_t m_palette[2][16]; 260 261 void grmatch_map(address_map &map); 262 }; 263