#ifndef YMF262_HAL_HPP #define YMF262_HAL_HPP #include #include "GPIO.hpp" template class YMF262_HAL{ private: GPIOPolicy _gpio; uint32_t _t_icw_ticks; uint32_t _t_as_ticks; uint32_t _t_ah_ticks; uint32_t _t_csw_ticks; uint32_t _t_csr_ticks; uint32_t _t_ww_ticks; uint32_t _t_wds_ticks; uint32_t _t_wdh_ticks; uint32_t _t_rw_ticks; uint32_t _t_acc_ticks; uint32_t _t_rdh_ticks; uint32_t _t_recovery_ticks; void write_bus(Bank bank, Port port, uint8_t data){ _gpio.set_a0(port); _gpio.set_a1(bank); _gpio.delay_ticks(_t_as_ticks); _gpio.set_cs(State::ACTIVE); _gpio.set_wr(State::ACTIVE); _gpio.set_data_bus(data); _gpio.delay_ticks(_t_wds_ticks); _gpio.set_wr(State::INACTIVE); _gpio.set_cs(State::INACTIVE); _gpio.delay_ticks(_t_wdh_ticks); _gpio.delay_ticks(_t_recovery_ticks); }; public: YMF262_HAL(GPIOPolicy policy, uint32_t opl_clock, uint32_t cpu_clock){ _t_icw_ticks = (400 * cpu_clock) / opl_clock; _t_recovery_ticks = (32 * cpu_clock) / opl_clock; double ticks_per_ns = (double)cpu_clock / 1.0e9; _t_as_ticks = (uint32_t)(10 * ticks_per_ns); _t_ah_ticks = (uint32_t)(10 * ticks_per_ns); _t_csw_ticks = (uint32_t)(100 * ticks_per_ns); _t_ww_ticks = (uint32_t)(100 * ticks_per_ns); _t_wds_ticks = (uint32_t)(10 * ticks_per_ns); _t_wdh_ticks = (uint32_t)(20 * ticks_per_ns); _t_csr_ticks = (uint32_t)(150 * ticks_per_ns); _t_rw_ticks = (uint32_t)(150 * ticks_per_ns); _t_acc_ticks = (uint32_t)(150 * ticks_per_ns); _t_rdh_ticks = (uint32_t)(10 * ticks_per_ns); }; void write(Bank bank, uint8_t reg, uint8_t data){ write_bus(bank,Port::ADDRESS,reg); write_bus(bank,Port::DATA,data); }; }; #endif