platform ps2, handle audio similar to psp
[picodrive.git] / pico / sound / ym2612.h
index f5e98a0..56ec5ef 100644 (file)
@@ -6,15 +6,16 @@
 #define _H_FM_FM_\r
 \r
 /* compiler dependence */\r
+#include "../pico_types.h"\r
 #ifndef UINT8\r
-typedef unsigned char  UINT8;   /* unsigned  8bit */\r
-typedef unsigned short UINT16;  /* unsigned 16bit */\r
-typedef unsigned int   UINT32;  /* unsigned 32bit */\r
+typedef u8             UINT8;   /* unsigned  8bit */\r
+typedef u16            UINT16;  /* unsigned 16bit */\r
+typedef u32            UINT32;  /* unsigned 32bit */\r
 #endif\r
 #ifndef INT8\r
-typedef signed char            INT8;    /* signed  8bit   */\r
-typedef signed short   INT16;   /* signed 16bit   */\r
-typedef signed int             INT32;   /* signed 32bit   */\r
+typedef s            INT8;    /* signed  8bit   */\r
+typedef s16            INT16;   /* signed 16bit   */\r
+typedef s32            INT32;   /* signed 32bit   */\r
 #endif\r
 \r
 #if 1\r
@@ -43,10 +44,22 @@ typedef struct
        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_d1r;    /* #0x24 (decay state) */\r
-       UINT32  eg_pack_d2r;    /* #0x28 (sustain state) */\r
-       UINT32  eg_pack_rr;     /* #0x2c (release state) */\r
+       /* asm relies on this order: */\r
+       union {\r
+               struct {\r
+                       UINT32 eg_pack_rr;  /* #0x20 1 (release state) */\r
+                       UINT32 eg_pack_d2r; /* #0x24 2 (sustain state) */\r
+                       UINT32 eg_pack_d1r; /* #0x28 3 (decay state) */\r
+                       UINT32 eg_pack_ar;  /* #0x2c 4 (attack state) */\r
+               };\r
+               UINT32 eg_pack[4];\r
+       };\r
+\r
+       UINT8   ssg;            /* 0x30 SSG-EG waveform */\r
+       UINT8   ssgn;\r
+       UINT16  ar_ksr;         /* 0x32 ar+ksr */\r
+       UINT16  vol_out;        /* 0x34 current output from EG (without LFO) */\r
+       UINT16  pad;\r
 } FM_SLOT;\r
 \r
 \r
@@ -65,8 +78,8 @@ typedef struct
        UINT8   ams;            /* channel AMS */\r
 \r
        UINT8   kcode;          /* +11 key code:                        */\r
-       UINT8   fn_h;           /* freq latch           */\r
        UINT8   pad2;\r
+       UINT8   upd_cnt;        /* eg update counter */\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
@@ -83,18 +96,22 @@ typedef struct
        UINT8   address;        /* 10 address register | need_save     */\r
        UINT8   status;         /* 11 status flag | need_save          */\r
        UINT8   mode;           /* mode  CSM / 3SLOT    */\r
-       UINT8   pad;\r
+       UINT8   flags;          /* operational flags    */\r
        int             TA;                     /* timer a              */\r
        int             TAC;            /* timer a maxval       */\r
        int             TAT;            /* timer a ticker | need_save */\r
        UINT8   TB;                     /* timer b              */\r
-       UINT8   pad2[3];\r
+       UINT8   fn_h;           /* freq latch           */\r
+       UINT8   pad2[2];\r
        int             TBC;            /* timer b maxval       */\r
        int             TBT;            /* timer b ticker | need_save */\r
        /* local time tables */\r
        INT32   dt_tab[8][32];/* DeTune table       */\r
 } FM_ST;\r
 \r
+#define ST_SSG         1\r
+#define ST_DAC         2\r
+\r
 /***********************************************************/\r
 /* OPN unit                                                */\r
 /***********************************************************/\r
@@ -141,6 +158,7 @@ typedef struct
        FM_OPN          OPN;                            /* OPN state            */\r
 \r
        UINT32          slot_mask;                      /* active slot mask (performance hack) */\r
+       UINT32          ssg_mask;                       /* active ssg mask (performance hack) */\r
 } YM2612;\r
 #endif\r
 \r
@@ -148,9 +166,9 @@ typedef struct
 extern YM2612 ym2612;\r
 #endif\r
 \r
-void YM2612Init_(int baseclock, int rate);\r
+void YM2612Init_(int baseclock, int rate, int flags);\r
 void YM2612ResetChip_(void);\r
-int  YM2612UpdateOne_(int *buffer, int length, int stereo, int is_buf_empty);\r
+int  YM2612UpdateOne_(s32 *buffer, int length, int stereo, int is_buf_empty);\r
 \r
 int  YM2612Write_(unsigned int a, unsigned int v);\r
 //unsigned char YM2612Read_(void);\r
@@ -159,9 +177,10 @@ 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
+void YM2612PicoStateSave2(int tat, int tbt, int busy);\r
+int  YM2612PicoStateLoad2(int *tat, int *tbt, int *busy);\r
 \r
+/* NB must be macros for compiling GP2X 940 code */\r
 #ifndef __GP2X__\r
 #define YM2612Init          YM2612Init_\r
 #define YM2612ResetChip     YM2612ResetChip_\r
@@ -169,23 +188,15 @@ int  YM2612PicoStateLoad2(int *tat, int *tbt);
 #define YM2612PicoStateLoad YM2612PicoStateLoad_\r
 #else\r
 /* GP2X specific */\r
-#include "../../platform/gp2x/940ctl.h"\r
-extern int PicoOpt;\r
-#define YM2612Init(baseclock,rate) { \\r
-       if (PicoOpt&0x200) YM2612Init_940(baseclock, rate); \\r
-       else               YM2612Init_(baseclock, rate); \\r
-}\r
-#define YM2612ResetChip() { \\r
-       if (PicoOpt&0x200) YM2612ResetChip_940(); \\r
-       else               YM2612ResetChip_(); \\r
-}\r
-#define YM2612UpdateOne(buffer,length,stereo,is_buf_empty) \\r
-       (PicoOpt&0x200) ? YM2612UpdateOne_940(buffer, length, stereo, is_buf_empty) : \\r
-                               YM2612UpdateOne_(buffer, length, stereo, is_buf_empty);\r
-#define YM2612PicoStateLoad() { \\r
-       if (PicoOpt&0x200) YM2612PicoStateLoad_940(); \\r
-       else               YM2612PicoStateLoad_(); \\r
-}\r
+#include <platform/gp2x/940ctl.h>\r
+#define YM2612Init(baseclock, rate, flags) \\r
+       (PicoIn.opt & POPT_EXT_FM ? YM2612Init_940 : YM2612Init_)(baseclock, rate, flags)\r
+#define YM2612ResetChip() \\r
+       (PicoIn.opt & POPT_EXT_FM ? YM2612ResetChip_940 : YM2612ResetChip_)()\r
+#define YM2612PicoStateLoad() \\r
+       (PicoIn.opt & POPT_EXT_FM ? YM2612PicoStateLoad_940 : YM2612PicoStateLoad_)()\r
+#define YM2612UpdateOne(buffer, length, sterao, isempty) \\r
+       (PicoIn.opt & POPT_EXT_FM ? YM2612UpdateOne_940 : YM2612UpdateOne_)(buffer, length, stereo, isempty)\r
 #endif /* __GP2X__ */\r
 \r
 \r