71 lines
2.1 KiB
C++
71 lines
2.1 KiB
C++
#ifndef YMF262_HAL_HPP
|
|
#define YMF262_HAL_HPP
|
|
|
|
#include <cstdint>
|
|
#include "GPIO.hpp"
|
|
#include "YMF262-Types.hpp"
|
|
|
|
template <class GPIOPolicy>
|
|
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):_gpio(policy){
|
|
_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);
|
|
};
|
|
|
|
void set_OPL_Mode(OPLMode mode){
|
|
write(Bank::BANK_1, 0x105, (mode == OPLMode::OPL3) ? 0x01 : 0x00);
|
|
};
|
|
|
|
};
|
|
|
|
#endif |