X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=pico%2Fsound%2Fym2612.h;h=a2921b2222f82bc64ebf7daaa0a59a5eac94f050;hb=refs%2Fremotes%2Fgithub%2Fmaster;hp=73a36a842eb854c7abaff796a2a256ddd129c641;hpb=6d28fb5023d53282209ade40fdd30f46905aacbf;p=picodrive.git diff --git a/pico/sound/ym2612.h b/pico/sound/ym2612.h index 73a36a84..b270cae7 100644 --- a/pico/sound/ym2612.h +++ b/pico/sound/ym2612.h @@ -5,16 +5,21 @@ #ifndef _H_FM_FM_ #define _H_FM_FM_ +#include + +#define DAC_SHIFT 6 + /* compiler dependence */ +#include "../pico_types.h" #ifndef UINT8 -typedef unsigned char UINT8; /* unsigned 8bit */ -typedef unsigned short UINT16; /* unsigned 16bit */ -typedef unsigned int UINT32; /* unsigned 32bit */ +typedef u8 UINT8; /* unsigned 8bit */ +typedef u16 UINT16; /* unsigned 16bit */ +typedef u32 UINT32; /* unsigned 32bit */ #endif #ifndef INT8 -typedef signed char INT8; /* signed 8bit */ -typedef signed short INT16; /* signed 16bit */ -typedef signed int INT32; /* signed 32bit */ +typedef s8 INT8; /* signed 8bit */ +typedef s16 INT16; /* signed 16bit */ +typedef s32 INT32; /* signed 32bit */ #endif #if 1 @@ -53,6 +58,12 @@ typedef struct }; UINT32 eg_pack[4]; }; + + UINT8 ssg; /* 0x30 SSG-EG waveform */ + UINT8 ssgn; + UINT16 ar_ksr; /* 0x32 ar+ksr */ + UINT16 vol_out; /* 0x34 current output from EG (without LFO) */ + UINT16 pad; } FM_SLOT; @@ -71,8 +82,8 @@ typedef struct UINT8 ams; /* channel AMS */ UINT8 kcode; /* +11 key code: */ - UINT8 fn_h; /* freq latch */ UINT8 pad2; + UINT8 upd_cnt; /* eg update counter */ UINT32 fc; /* fnum,blk:adjusted to sample rate */ UINT32 block_fnum; /* current blk/fnum value for this slot (can be different betweeen slots of one channel in 3slot mode) */ @@ -89,18 +100,22 @@ typedef struct UINT8 address; /* 10 address register | need_save */ UINT8 status; /* 11 status flag | need_save */ UINT8 mode; /* mode CSM / 3SLOT */ - UINT8 pad; + UINT8 flags; /* operational flags */ int TA; /* timer a */ - int TAC; /* timer a maxval */ - int TAT; /* timer a ticker | need_save */ + //int TAC; /* timer a maxval */ + //int TAT; /* timer a ticker | need_save */ UINT8 TB; /* timer b */ - UINT8 pad2[3]; - int TBC; /* timer b maxval */ - int TBT; /* timer b ticker | need_save */ + UINT8 fn_h; /* freq latch */ + UINT8 pad2[2]; + //int TBC; /* timer b maxval */ + //int TBT; /* timer b ticker | need_save */ /* local time tables */ INT32 dt_tab[8][32];/* DeTune table */ } FM_ST; +#define ST_SSG 1 +#define ST_DAC 2 + /***********************************************************/ /* OPN unit */ /***********************************************************/ @@ -128,6 +143,7 @@ typedef struct /* LFO */ UINT32 lfo_cnt; /* need_save */ UINT32 lfo_inc; + UINT32 lfo_ampm; UINT32 lfo_freq[8]; /* LFO FREQ table */ } FM_OPN; @@ -135,7 +151,7 @@ typedef struct /* here's the virtual YM2612 */ typedef struct { - UINT8 REGS[0x200]; /* registers (for save states) */ + UINT8 REGS[0x200]; /* registers (for old save states) */ INT32 addr_A1; /* address line A1 | need_save */ FM_CH CH[6]; /* channel state */ @@ -147,6 +163,7 @@ typedef struct FM_OPN OPN; /* OPN state */ UINT32 slot_mask; /* active slot mask (performance hack) */ + UINT32 ssg_mask; /* active ssg mask (performance hack) */ } YM2612; #endif @@ -154,9 +171,9 @@ typedef struct extern YM2612 ym2612; #endif -void YM2612Init_(int baseclock, int rate); +void YM2612Init_(int baseclock, int rate, int flags); void YM2612ResetChip_(void); -int YM2612UpdateOne_(int *buffer, int length, int stereo, int is_buf_empty); +int YM2612UpdateOne_(s32 *buffer, int length, int stereo, int is_buf_empty); int YM2612Write_(unsigned int a, unsigned int v); //unsigned char YM2612Read_(void); @@ -165,9 +182,12 @@ int YM2612PicoTick_(int n); void YM2612PicoStateLoad_(void); void *YM2612GetRegs(void); -void YM2612PicoStateSave2(int tat, int tbt); -int YM2612PicoStateLoad2(int *tat, int *tbt); +int YM2612PicoStateLoad2(int *tat, int *tbt, int *busy); +void YM2612PicoStateSave2(int tat, int tbt, int busy); +size_t YM2612PicoStateSave3(void *buf_, size_t size); +void YM2612PicoStateLoad3(const void *buf_, size_t size); +/* NB must be macros for compiling GP2X 940 code */ #ifndef __GP2X__ #define YM2612Init YM2612Init_ #define YM2612ResetChip YM2612ResetChip_ @@ -175,23 +195,15 @@ int YM2612PicoStateLoad2(int *tat, int *tbt); #define YM2612PicoStateLoad YM2612PicoStateLoad_ #else /* GP2X specific */ -#include "../../platform/gp2x/940ctl.h" -extern int PicoOpt; -#define YM2612Init(baseclock,rate) { \ - if (PicoOpt&0x200) YM2612Init_940(baseclock, rate); \ - else YM2612Init_(baseclock, rate); \ -} -#define YM2612ResetChip() { \ - if (PicoOpt&0x200) YM2612ResetChip_940(); \ - else YM2612ResetChip_(); \ -} -#define YM2612UpdateOne(buffer,length,stereo,is_buf_empty) \ - (PicoOpt&0x200) ? YM2612UpdateOne_940(buffer, length, stereo, is_buf_empty) : \ - YM2612UpdateOne_(buffer, length, stereo, is_buf_empty); -#define YM2612PicoStateLoad() { \ - if (PicoOpt&0x200) YM2612PicoStateLoad_940(); \ - else YM2612PicoStateLoad_(); \ -} +#include +#define YM2612Init(baseclock, rate, flags) \ + (PicoIn.opt & POPT_EXT_FM ? YM2612Init_940 : YM2612Init_)(baseclock, rate, flags) +#define YM2612ResetChip() \ + (PicoIn.opt & POPT_EXT_FM ? YM2612ResetChip_940 : YM2612ResetChip_)() +#define YM2612PicoStateLoad() \ + (PicoIn.opt & POPT_EXT_FM ? YM2612PicoStateLoad_940 : YM2612PicoStateLoad_)() +#define YM2612UpdateOne(buffer, length, sterao, isempty) \ + (PicoIn.opt & POPT_EXT_FM ? YM2612UpdateOne_940 : YM2612UpdateOne_)(buffer, length, stereo, isempty) #endif /* __GP2X__ */