Mercurial > repos > blastem
diff ym2612.h @ 2053:3414a4423de1 segacd
Merge from default
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sat, 15 Jan 2022 13:15:21 -0800 |
parents | 508522f08e4d |
children | 0d1d5dccdd28 |
line wrap: on
line diff
--- a/ym2612.h Sat Jan 05 00:58:08 2019 -0800 +++ b/ym2612.h Sat Jan 15 13:15:21 2022 -0800 @@ -9,17 +9,20 @@ #include <stdint.h> #include <stdio.h> #include "serialize.h" -#include "render.h" +#include "render_audio.h" +#include "vgm.h" #define NUM_PART_REGS (0xB7-0x30) #define NUM_CHANNELS 6 #define NUM_OPERATORS (4*NUM_CHANNELS) #define YM_OPT_WAVE_LOG 1 +#define YM_OPT_3834 2 typedef struct { int16_t *mod_src[2]; uint32_t phase_counter; + uint32_t phase_inc; uint16_t envelope; int16_t output; uint16_t total_level; @@ -39,6 +42,7 @@ uint16_t fnum; int16_t output; int16_t op1_old; + int16_t op2_old; uint8_t block_fnum_latch; uint8_t block; uint8_t keycode; @@ -65,14 +69,20 @@ typedef struct { audio_source *audio; + vgm_writer *vgm; uint32_t clock_inc; uint32_t current_cycle; - //TODO: Condense the next two fields into one uint32_t write_cycle; + uint32_t busy_start; uint32_t busy_cycles; - uint32_t lowpass_alpha; + uint32_t last_status_cycle; + uint32_t invalid_status_decay; + uint32_t status_address_mask; + int32_t volume_mult; + int32_t volume_div; ym_operator operators[NUM_OPERATORS]; ym_channel channels[NUM_CHANNELS]; + int16_t zero_offset; uint16_t timer_a; uint16_t timer_a_load; uint16_t env_counter; @@ -93,6 +103,7 @@ uint8_t lfo_pm_step; uint8_t csm_keyon; uint8_t status; + uint8_t last_status; uint8_t selected_reg; uint8_t selected_part; uint8_t part1_regs[YM_PART1_REGS]; @@ -128,12 +139,15 @@ void ym_init(ym2612_context * context, uint32_t master_clock, uint32_t clock_div, uint32_t options); void ym_reset(ym2612_context *context); void ym_free(ym2612_context *context); +void ym_enable_zero_offset(ym2612_context *context, uint8_t enabled); void ym_adjust_master_clock(ym2612_context * context, uint32_t master_clock); +void ym_adjust_cycles(ym2612_context *context, uint32_t deduction); void ym_run(ym2612_context * context, uint32_t to_cycle); void ym_address_write_part1(ym2612_context * context, uint8_t address); void ym_address_write_part2(ym2612_context * context, uint8_t address); void ym_data_write(ym2612_context * context, uint8_t value); -uint8_t ym_read_status(ym2612_context * context); +void ym_vgm_log(ym2612_context *context, uint32_t master_clock, vgm_writer *vgm); +uint8_t ym_read_status(ym2612_context * context, uint32_t cycle, uint32_t port); uint8_t ym_load_gst(ym2612_context * context, FILE * gstfile); uint8_t ym_save_gst(ym2612_context * context, FILE * gstfile); void ym_print_channel_info(ym2612_context *context, int channel);