Mercurial > repos > blastem
diff ymf262.h @ 2558:3f58fec775df
Initial work on YMF262 (aka OPL3) emulation
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 19 Jan 2025 00:31:16 -0800 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ymf262.h Sun Jan 19 00:31:16 2025 -0800 @@ -0,0 +1,51 @@ +#ifndef YMF262_H_ +#define YMF262_H_ + +#include "ym_common.h" +#include "render_audio.h" +#include "vgm.h" +#include "oscilloscope.h" + +#define OPL3_NUM_CHANNELS 18 +#define OPL3_NUM_OPERATORS (2*OPL3_NUM_CHANNELS) +#define OPL3_PARAM_START 0x20 +#define OPL3_PARAM_END 0xF6 +#define OPL3_PARAM_REGS (OPL3_PARAM_END - OPL3_PARAM_START) + +typedef struct { + audio_source *audio; + vgm_writer *vgm; + oscilloscope *scope; + uint32_t clock_inc; + uint32_t cycle; + int32_t volume_mult; + int32_t volume_div; + ym_operator operators[OPL3_NUM_OPERATORS]; + ym_channel channels[OPL3_NUM_CHANNELS]; + uint8_t part1_regs[OPL3_PARAM_REGS]; + uint8_t part2_regs[OPL3_PARAM_REGS]; + uint8_t timer_test[4]; + uint8_t nts; + uint8_t connection_sel; + uint8_t opl3_mode; + uint8_t part2_test; + uint8_t status; + uint8_t current_op; + uint8_t selected_reg; + uint8_t selected_part; +} ymf262_context; + +void ymf262_init(ymf262_context *context, uint32_t master_clock, uint32_t clock_div, uint32_t options); +void ymf262_reset(ymf262_context *context); +void ymf262_free(ymf262_context *context); +void ymf262_adjust_master_clock(ymf262_context *context, uint32_t master_clock); +void ymf262_adjust_cycles(ymf262_context *context, uint32_t deduction); +void ymf262_run(ymf262_context *context, uint32_t to_cycle); +void ymf262_address_write_part1(ymf262_context *context, uint8_t address); +void ymf262_address_write_part2(ymf262_context *context, uint8_t address); +void ymf262_data_write(ymf262_context *context, uint8_t value); +void ymf262_vgm_log(ymf262_context *context, uint32_t master_clock, vgm_writer *vgm); +uint8_t ymf262_read_status(ymf262_context *context, uint32_t cycle, uint32_t port); + + +#endif // YMF262_H_