1 // license:BSD-3-Clause 2 // copyright-holders:Aaron Giles 3 /************************************************************************* 4 5 Atari System 2 hardware 6 7 *************************************************************************/ 8 9 #include "cpu/m6502/m6502.h" 10 #include "cpu/t11/t11.h" 11 #include "machine/bankdev.h" 12 #include "machine/gen_latch.h" 13 #include "machine/slapstic.h" 14 #include "machine/timer.h" 15 #include "machine/watchdog.h" 16 #include "sound/ym2151.h" 17 #include "sound/pokey.h" 18 #include "sound/tms5220.h" 19 #include "video/atarimo.h" 20 #include "emupal.h" 21 #include "screen.h" 22 #include "tilemap.h" 23 24 class atarisy2_state : public driver_device 25 { 26 public: atarisy2_state(const machine_config & mconfig,device_type type,const char * tag)27 atarisy2_state(const machine_config &mconfig, device_type type, const char *tag) 28 : driver_device(mconfig, type, tag) 29 , m_maincpu(*this, "maincpu") 30 , m_audiocpu(*this, "audiocpu") 31 , m_gfxdecode(*this, "gfxdecode") 32 , m_screen(*this, "screen") 33 , m_mob(*this, "mob") 34 , m_slapstic_base(*this, "slapstic_base") 35 , m_vrambank(*this, "vrambank") 36 , m_playfield_tilemap(*this, "playfield") 37 , m_alpha_tilemap(*this, "alpha") 38 , m_xscroll(*this, "xscroll") 39 , m_yscroll(*this, "yscroll") 40 , m_soundlatch(*this, "soundlatch") 41 , m_mainlatch(*this, "mainlatch") 42 , m_ym2151(*this, "ymsnd") 43 , m_pokey(*this, "pokey%u", 1U) 44 , m_tms5220(*this, "tms") 45 , m_rombank(*this, "rombank%u", 1U) 46 , m_slapstic(*this, "slapstic") 47 , m_leds(*this, "led%u", 0U) 48 { } 49 50 void init_ssprint(); 51 void init_apb(); 52 void init_csprint(); 53 void init_paperboy(); 54 void init_720(); 55 56 void atarisy2(machine_config &config); 57 void apb(machine_config &config); 58 void paperboy(machine_config &config); 59 void ssprint(machine_config &config); 60 void _720(machine_config &config); 61 void csprint(machine_config &config); 62 63 protected: 64 virtual void machine_start() override; 65 virtual void machine_reset() override; 66 virtual void device_post_load() override; 67 virtual void video_start() override; 68 69 private: 70 void update_interrupts(); 71 72 required_device<t11_device> m_maincpu; 73 required_device<m6502_device> m_audiocpu; 74 required_device<gfxdecode_device> m_gfxdecode; 75 required_device<screen_device> m_screen; 76 required_device<atari_motion_objects_device> m_mob; 77 required_shared_ptr<uint16_t> m_slapstic_base; 78 required_device<address_map_bank_device> m_vrambank; 79 80 uint8_t m_interrupt_enable; 81 82 required_device<tilemap_device> m_playfield_tilemap; 83 required_device<tilemap_device> m_alpha_tilemap; 84 required_shared_ptr<uint16_t> m_xscroll; 85 required_shared_ptr<uint16_t> m_yscroll; 86 87 int8_t m_pedal_count; 88 89 required_device<generic_latch_8_device> m_soundlatch; 90 required_device<generic_latch_8_device> m_mainlatch; 91 required_device<ym2151_device> m_ym2151; 92 required_device_array<pokey_device, 2> m_pokey; 93 optional_device<tms5220_device> m_tms5220; 94 95 bool m_scanline_int_state; 96 bool m_video_int_state; 97 bool m_p2portwr_state; 98 bool m_p2portrd_state; 99 100 required_memory_bank_array<2> m_rombank; 101 required_device<atari_slapstic_device> m_slapstic; 102 103 uint8_t m_sound_reset_state; 104 105 emu_timer * m_yscroll_reset_timer; 106 uint32_t m_playfield_tile_bank[2]; 107 108 // 720 fake joystick 109 double m_joy_last_angle; 110 int m_joy_rotations; 111 112 // 720 fake spinner 113 uint32_t m_spin_last_rotate_count; 114 int32_t m_spin_pos; /* track fake position of spinner */ 115 uint32_t m_spin_center_count; 116 117 output_finder<2> m_leds; 118 119 void scanline_int_ack_w(uint8_t data); 120 void video_int_ack_w(uint8_t data); 121 void int0_ack_w(uint8_t data); 122 void sound_reset_w(uint8_t data); 123 void int_enable_w(uint8_t data); 124 INTERRUPT_GEN_MEMBER(sound_irq_gen); 125 void sound_irq_ack_w(uint8_t data); 126 DECLARE_WRITE_LINE_MEMBER(boost_interleave_hack); 127 void bankselect_w(offs_t offset, uint16_t data); 128 uint16_t switch_r(); 129 uint8_t switch_6502_r(); 130 void switch_6502_w(uint8_t data); 131 uint8_t leta_r(offs_t offset); 132 void mixer_w(uint8_t data); 133 void sndrst_6502_w(uint8_t data); 134 uint16_t sound_r(); 135 void sound_6502_w(uint8_t data); 136 uint8_t sound_6502_r(); 137 void tms5220_w(uint8_t data); 138 void tms5220_strobe_w(offs_t offset, uint8_t data); 139 void coincount_w(uint8_t data); 140 141 TIMER_DEVICE_CALLBACK_MEMBER(scanline_update); 142 143 TILE_GET_INFO_MEMBER(get_alpha_tile_info); 144 TILE_GET_INFO_MEMBER(get_playfield_tile_info); 145 uint32_t screen_update_atarisy2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); 146 DECLARE_WRITE_LINE_MEMBER(vblank_int); 147 TIMER_CALLBACK_MEMBER(delayed_int_enable_w); 148 TIMER_CALLBACK_MEMBER(reset_yscroll_callback); 149 uint16_t slapstic_r(address_space &space, offs_t offset); 150 void slapstic_w(address_space &space, offs_t offset, uint16_t data); 151 void yscroll_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); 152 void xscroll_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); 153 void spriteram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); 154 static rgb_t RRRRGGGGBBBBIIII(uint32_t raw); 155 156 static const atari_motion_objects_config s_mob_config; 157 void main_map(address_map &map); 158 void sound_map(address_map &map); 159 void vrambank_map(address_map &map); 160 }; 161