1 // license:BSD-3-Clause 2 // copyright-holders:Peter Trauner, Mathis Rosenhauer 3 /********************************************************************** 4 5 Rockwell 6522 VIA interface and emulation 6 7 This function emulates all the functionality of 6522 8 versatile interface adapters. 9 10 This is based on the pre-existing 6821 emulation. 11 12 Written by Mathis Rosenhauer 13 14 **********************************************************************/ 15 16 #ifndef MAME_MACHINE_6522VIA_H 17 #define MAME_MACHINE_6522VIA_H 18 19 #pragma once 20 21 /*************************************************************************** 22 TYPE DEFINITIONS 23 ***************************************************************************/ 24 25 26 // ======================> via6522_device 27 28 class via6522_device : public device_t 29 { 30 public: 31 enum 32 { 33 VIA_PB = 0, 34 VIA_PA = 1, 35 VIA_DDRB = 2, 36 VIA_DDRA = 3, 37 VIA_T1CL = 4, 38 VIA_T1CH = 5, 39 VIA_T1LL = 6, 40 VIA_T1LH = 7, 41 VIA_T2CL = 8, 42 VIA_T2CH = 9, 43 VIA_SR = 10, 44 VIA_ACR = 11, 45 VIA_PCR = 12, 46 VIA_IFR = 13, 47 VIA_IER = 14, 48 VIA_PANH = 15 49 }; 50 51 // construction/destruction 52 via6522_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); 53 54 // TODO: REMOVE THESE readpa_handler()55 auto readpa_handler() { return m_in_a_handler.bind(); } readpb_handler()56 auto readpb_handler() { return m_in_b_handler.bind(); } 57 58 // TODO: CONVERT THESE TO WRITE LINE writepa_handler()59 auto writepa_handler() { return m_out_a_handler.bind(); } writepb_handler()60 auto writepb_handler() { return m_out_b_handler.bind(); } 61 ca2_handler()62 auto ca2_handler() { return m_ca2_handler.bind(); } cb1_handler()63 auto cb1_handler() { return m_cb1_handler.bind(); } cb2_handler()64 auto cb2_handler() { return m_cb2_handler.bind(); } irq_handler()65 auto irq_handler() { return m_irq_handler.bind(); } 66 67 void map(address_map &map); 68 69 u8 read(offs_t offset); 70 void write(offs_t offset, u8 data); 71 write_pa0(int state)72 void write_pa0(int state) { set_pa_line(0, state); } write_pa1(int state)73 void write_pa1(int state) { set_pa_line(1, state); } write_pa2(int state)74 void write_pa2(int state) { set_pa_line(2, state); } write_pa3(int state)75 void write_pa3(int state) { set_pa_line(3, state); } write_pa4(int state)76 void write_pa4(int state) { set_pa_line(4, state); } write_pa5(int state)77 void write_pa5(int state) { set_pa_line(5, state); } write_pa6(int state)78 void write_pa6(int state) { set_pa_line(6, state); } write_pa7(int state)79 void write_pa7(int state) { set_pa_line(7, state); } 80 void write_pa( u8 data ); 81 void write_ca1(int state); 82 void write_ca2(int state); 83 write_pb0(int state)84 void write_pb0(int state) { set_pb_line(0, state); } write_pb1(int state)85 void write_pb1(int state) { set_pb_line(1, state); } write_pb2(int state)86 void write_pb2(int state) { set_pb_line(2, state); } write_pb3(int state)87 void write_pb3(int state) { set_pb_line(3, state); } write_pb4(int state)88 void write_pb4(int state) { set_pb_line(4, state); } write_pb5(int state)89 void write_pb5(int state) { set_pb_line(5, state); } write_pb6(int state)90 void write_pb6(int state) { set_pb_line(6, state); } write_pb7(int state)91 void write_pb7(int state) { set_pb_line(7, state); } 92 void write_pb( u8 data ); 93 void write_cb1(int state); 94 void write_cb2(int state); 95 96 protected: 97 // device-level overrides 98 virtual void device_start() override; 99 virtual void device_reset() override; 100 virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; 101 102 private: 103 static constexpr device_timer_id TIMER_SHIFT = 0; 104 static constexpr device_timer_id TIMER_T1 = 1; 105 static constexpr device_timer_id TIMER_T2 = 2; 106 static constexpr device_timer_id TIMER_CA2 = 3; 107 static constexpr device_timer_id TIMER_SHIFT_IRQ = 4; 108 static constexpr device_timer_id TIMER_CB2 = 5; 109 110 111 uint16_t get_counter1_value(); 112 void counter2_decrement(); 113 114 void set_int(int data); 115 void clear_int(int data); 116 void shift_out(); 117 void shift_in(); 118 void set_pa_line(int line, int state); 119 void set_pb_line(int line, int state); 120 121 uint8_t input_pa(); 122 void output_pa(); 123 uint8_t input_pb(); 124 void output_pb(); 125 void output_irq(); 126 127 // TODO: REMOVE THESE 128 devcb_read8 m_in_a_handler; 129 devcb_read8 m_in_b_handler; 130 131 // TODO: CONVERT THESE TO WRITE LINE 132 devcb_write8 m_out_a_handler; 133 devcb_write8 m_out_b_handler; 134 135 devcb_write_line m_ca2_handler; 136 devcb_write_line m_cb1_handler; 137 devcb_write_line m_cb2_handler; 138 devcb_write_line m_irq_handler; 139 140 uint8_t m_in_a; 141 int m_in_ca1; 142 int m_in_ca2; 143 uint8_t m_out_a; 144 int m_out_ca2; 145 uint8_t m_ddr_a; 146 uint8_t m_latch_a; 147 148 uint8_t m_in_b; 149 int m_in_cb1; 150 int m_in_cb2; 151 uint8_t m_out_b; 152 int m_out_cb1; 153 int m_out_cb2; 154 uint8_t m_ddr_b; 155 uint8_t m_latch_b; 156 157 uint8_t m_t1cl; 158 uint8_t m_t1ch; 159 uint8_t m_t1ll; 160 uint8_t m_t1lh; 161 uint8_t m_t2cl; 162 uint8_t m_t2ch; 163 uint8_t m_t2ll; 164 uint8_t m_t2lh; 165 166 uint8_t m_sr; 167 uint8_t m_pcr; 168 uint8_t m_acr; 169 uint8_t m_ier; 170 uint8_t m_ifr; 171 172 emu_timer *m_t1; 173 attotime m_time1; 174 uint8_t m_t1_active; 175 int m_t1_pb7; 176 emu_timer *m_t2; 177 attotime m_time2; 178 uint8_t m_t2_active; 179 emu_timer *m_ca2_timer; 180 emu_timer *m_cb2_timer; 181 182 emu_timer *m_shift_timer; 183 emu_timer *m_shift_irq_timer; 184 uint8_t m_shift_counter; 185 }; 186 187 188 // device type definition 189 DECLARE_DEVICE_TYPE(VIA6522, via6522_device) 190 191 192 #endif // MAME_MACHINE_6522VIA_H 193