ym2612 full saves wip
[picodrive.git] / Pico / sound / ym2612.h
index a1124de..07f4198 100644 (file)
@@ -22,15 +22,15 @@ typedef signed int          INT32;   /* signed 32bit   */
 typedef struct\r
 {\r
        INT32   *DT;            /* #0x00 detune          :dt_tab[DT] */\r
-       UINT8   ar;                     /* #0x04 attack rate  */\r
+       UINT8   ar;             /* #0x04 attack rate  */\r
        UINT8   d1r;            /* #0x05 decay rate   */\r
        UINT8   d2r;            /* #0x06 sustain rate */\r
-       UINT8   rr;                     /* #0x07 release rate */\r
+       UINT8   rr;             /* #0x07 release rate */\r
        UINT32  mul;            /* #0x08 multiple        :ML_TABLE[ML] */\r
 \r
        /* Phase Generator */\r
-       UINT32  phase;          /* #0x0c phase counter */\r
-       UINT32  Incr;           /* #0x10 phase step */\r
+       UINT32  phase;          /* #0x0c phase counter | need_save */\r
+       UINT32  Incr;           /* #0x10 phase step | need_save */\r
 \r
        UINT8   KSR;            /* #0x14 key scale rate  :3-KSR */\r
        UINT8   ksr;            /* #0x15 key scale rate  :kcode>>(3-KSR) */\r
@@ -38,15 +38,15 @@ typedef struct
        UINT8   key;            /* #0x16 0=last key was KEY OFF, 1=KEY ON */\r
 \r
        /* Envelope Generator */\r
-       UINT8   state;          /* #0x17 phase type: EG_OFF=0, EG_REL, EG_SUS, EG_DEC, EG_ATT */\r
-       UINT16  tl;                     /* #0x18 total level: TL << 3 */\r
-       INT16   volume;         /* #0x1a envelope counter */\r
-       UINT32  sl;                     /* #0x1c sustain level:sl_table[SL] */\r
+       UINT8   state;          /* #0x17 phase type: EG_OFF=0, EG_REL, EG_SUS, EG_DEC, EG_ATT | need_save */\r
+       UINT16  tl;             /* #0x18 total level: TL << 3 */\r
+       INT16   volume;         /* #0x1a envelope counter | need_save */\r
+       UINT32  sl;             /* #0x1c sustain level:sl_table[SL] */\r
 \r
-       UINT32  eg_pack_ar;             /* #0x20 (attack state) */\r
+       UINT32  eg_pack_ar;     /* #0x20 (attack state) */\r
        UINT32  eg_pack_d1r;    /* #0x24 (decay state) */\r
        UINT32  eg_pack_d2r;    /* #0x28 (sustain state) */\r
-       UINT32  eg_pack_rr;             /* #0x2c (release state) */\r
+       UINT32  eg_pack_rr;     /* #0x2c (release state) */\r
 } FM_SLOT;\r
 \r
 \r
@@ -55,7 +55,7 @@ typedef struct
        FM_SLOT SLOT[4];        /* four SLOTs (operators) */\r
 \r
        UINT8   ALGO;           /* algorithm */\r
-       UINT8   FB;                     /* feedback shift */\r
+       UINT8   FB;             /* feedback shift */\r
        INT32   op1_out;        /* op1 output for feedback */\r
 \r
        INT32   mem_value;      /* delayed sample (MEM) value */\r
@@ -64,7 +64,7 @@ typedef struct
        UINT8   ams;            /* channel AMS */\r
 \r
        UINT8   kcode;          /* key code:                        */\r
-       UINT32  fc;                     /* fnum,blk:adjusted to sample rate */\r
+       UINT32  fc;             /* fnum,blk:adjusted to sample rate */\r
        UINT32  block_fnum;     /* current blk/fnum value for this slot (can be different betweeen slots of one channel in 3slot mode) */\r
 \r
        /* LFO */\r
@@ -77,17 +77,17 @@ typedef struct
        int             clock;          /* master clock  (Hz)   */\r
        int             rate;           /* sampling rate (Hz)   */\r
        double  freqbase;       /* 08 frequency base       */\r
-       UINT8   address;        /* 10 address register     */\r
-       UINT8   status;         /* 11 status flag          */\r
+       UINT8   address;        /* 10 address register | need_save     */\r
+       UINT8   status;         /* 11 status flag | need_save          */\r
        UINT8   mode;           /* mode  CSM / 3SLOT    */\r
        UINT8   fn_h;           /* freq latch           */\r
        int             TA;                     /* timer a              */\r
        int             TAC;            /* timer a maxval       */\r
-       int             TAT;            /* timer a ticker       */\r
+       int             TAT;            /* timer a ticker | need_save */\r
        UINT8   TB;                     /* timer b              */\r
        UINT8   pad[3];\r
        int             TBC;            /* timer b maxval       */\r
-       int             TBT;            /* timer b ticker       */\r
+       int             TBT;            /* timer b ticker | need_save */\r
        /* local time tables */\r
        INT32   dt_tab[8][32];/* DeTune table       */\r
 } FM_ST;\r
@@ -112,12 +112,12 @@ typedef struct
        FM_3SLOT SL3;                   /* 3 slot mode state */\r
        UINT32  pan;                    /* fm channels output mask (bit 1 = enable) */\r
 \r
-       UINT32  eg_cnt;                 /* #0xb38 global envelope generator counter */\r
-       UINT32  eg_timer;               /* #0xb3c global envelope generator counter works at frequency = chipclock/64/3 */\r
-       UINT32  eg_timer_add;   /* #0xb40 step of eg_timer */\r
+       UINT32  eg_cnt;                 /* #0xb38 global envelope generator counter | need_save */\r
+       UINT32  eg_timer;               /* #0xb3c global envelope generator counter works at frequency = chipclock/64/3 | need_save */\r
+       UINT32  eg_timer_add;           /* #0xb40 step of eg_timer */\r
 \r
        /* LFO */\r
-       UINT32  lfo_cnt;\r
+       UINT32  lfo_cnt;                /* need_save */\r
        UINT32  lfo_inc;\r
 \r
        UINT32  lfo_freq[8];    /* LFO FREQ table */\r
@@ -126,13 +126,13 @@ typedef struct
 /* here's the virtual YM2612 */\r
 typedef struct\r
 {\r
-       UINT8           REGS[0x200];            /* registers (for save states)       */\r
-       INT32           addr_A1;                        /* address line A1      */\r
+       UINT8           REGS[0x200];                    /* registers (for save states)       */\r
+       INT32           addr_A1;                        /* address line A1 | need_save       */\r
 \r
        FM_CH           CH[6];                          /* channel state (0x168 bytes each)? */\r
 \r
        /* dac output (YM2612) */\r
-       int                     dacen;\r
+       int             dacen;\r
        INT32           dacout;\r
 \r
        FM_OPN          OPN;                            /* OPN state            */\r
@@ -156,6 +156,8 @@ int  YM2612PicoTick_(int n);
 void YM2612PicoStateLoad_(void);\r
 \r
 void *YM2612GetRegs(void);\r
+void YM2612PicoStateSave2(int tat, int tbt);\r
+int  YM2612PicoStateLoad2(int *tat, int *tbt);\r
 \r
 #ifndef __GP2X__\r
 #define YM2612Init          YM2612Init_\r