Annotation of qemu/hw/fmopl.h, revision 1.1
1.1 ! root 1: #ifndef __FMOPL_H_
! 2: #define __FMOPL_H_
! 3:
! 4: /* --- select emulation chips --- */
! 5: #define BUILD_YM3812 (HAS_YM3812)
! 6: //#define BUILD_YM3526 (HAS_YM3526)
! 7: //#define BUILD_Y8950 (HAS_Y8950)
! 8:
! 9: /* --- system optimize --- */
! 10: /* select bit size of output : 8 or 16 */
! 11: #define OPL_OUTPUT_BIT 16
! 12:
! 13: /* compiler dependence */
! 14: #ifndef OSD_CPU_H
! 15: #define OSD_CPU_H
! 16: typedef unsigned char UINT8; /* unsigned 8bit */
! 17: typedef unsigned short UINT16; /* unsigned 16bit */
! 18: typedef unsigned int UINT32; /* unsigned 32bit */
! 19: typedef signed char INT8; /* signed 8bit */
! 20: typedef signed short INT16; /* signed 16bit */
! 21: typedef signed int INT32; /* signed 32bit */
! 22: #endif
! 23:
! 24: #if (OPL_OUTPUT_BIT==16)
! 25: typedef INT16 OPLSAMPLE;
! 26: #endif
! 27: #if (OPL_OUTPUT_BIT==8)
! 28: typedef unsigned char OPLSAMPLE;
! 29: #endif
! 30:
! 31:
! 32: #if BUILD_Y8950
! 33: #include "ymdeltat.h"
! 34: #endif
! 35:
! 36: typedef void (*OPL_TIMERHANDLER)(int channel,double interval_Sec);
! 37: typedef void (*OPL_IRQHANDLER)(int param,int irq);
! 38: typedef void (*OPL_UPDATEHANDLER)(int param,int min_interval_us);
! 39: typedef void (*OPL_PORTHANDLER_W)(int param,unsigned char data);
! 40: typedef unsigned char (*OPL_PORTHANDLER_R)(int param);
! 41:
! 42: /* !!!!! here is private section , do not access there member direct !!!!! */
! 43:
! 44: #define OPL_TYPE_WAVESEL 0x01 /* waveform select */
! 45: #define OPL_TYPE_ADPCM 0x02 /* DELTA-T ADPCM unit */
! 46: #define OPL_TYPE_KEYBOARD 0x04 /* keyboard interface */
! 47: #define OPL_TYPE_IO 0x08 /* I/O port */
! 48:
! 49: /* Saving is necessary for member of the 'R' mark for suspend/resume */
! 50: /* ---------- OPL one of slot ---------- */
! 51: typedef struct fm_opl_slot {
! 52: INT32 TL; /* total level :TL << 8 */
! 53: INT32 TLL; /* adjusted now TL */
! 54: UINT8 KSR; /* key scale rate :(shift down bit) */
! 55: INT32 *AR; /* attack rate :&AR_TABLE[AR<<2] */
! 56: INT32 *DR; /* decay rate :&DR_TALBE[DR<<2] */
! 57: INT32 SL; /* sustin level :SL_TALBE[SL] */
! 58: INT32 *RR; /* release rate :&DR_TABLE[RR<<2] */
! 59: UINT8 ksl; /* keyscale level :(shift down bits) */
! 60: UINT8 ksr; /* key scale rate :kcode>>KSR */
! 61: UINT32 mul; /* multiple :ML_TABLE[ML] */
! 62: UINT32 Cnt; /* frequency count : */
! 63: UINT32 Incr; /* frequency step : */
! 64: /* envelope generator state */
! 65: UINT8 eg_typ; /* envelope type flag */
! 66: UINT8 evm; /* envelope phase */
! 67: INT32 evc; /* envelope counter */
! 68: INT32 eve; /* envelope counter end point */
! 69: INT32 evs; /* envelope counter step */
! 70: INT32 evsa; /* envelope step for AR :AR[ksr] */
! 71: INT32 evsd; /* envelope step for DR :DR[ksr] */
! 72: INT32 evsr; /* envelope step for RR :RR[ksr] */
! 73: /* LFO */
! 74: UINT8 ams; /* ams flag */
! 75: UINT8 vib; /* vibrate flag */
! 76: /* wave selector */
! 77: INT32 **wavetable;
! 78: }OPL_SLOT;
! 79:
! 80: /* ---------- OPL one of channel ---------- */
! 81: typedef struct fm_opl_channel {
! 82: OPL_SLOT SLOT[2];
! 83: UINT8 CON; /* connection type */
! 84: UINT8 FB; /* feed back :(shift down bit) */
! 85: INT32 *connect1; /* slot1 output pointer */
! 86: INT32 *connect2; /* slot2 output pointer */
! 87: INT32 op1_out[2]; /* slot1 output for selfeedback */
! 88: /* phase generator state */
! 89: UINT32 block_fnum; /* block+fnum : */
! 90: UINT8 kcode; /* key code : KeyScaleCode */
! 91: UINT32 fc; /* Freq. Increment base */
! 92: UINT32 ksl_base; /* KeyScaleLevel Base step */
! 93: UINT8 keyon; /* key on/off flag */
! 94: } OPL_CH;
! 95:
! 96: /* OPL state */
! 97: typedef struct fm_opl_f {
! 98: UINT8 type; /* chip type */
! 99: int clock; /* master clock (Hz) */
! 100: int rate; /* sampling rate (Hz) */
! 101: double freqbase; /* frequency base */
! 102: double TimerBase; /* Timer base time (==sampling time) */
! 103: UINT8 address; /* address register */
! 104: UINT8 status; /* status flag */
! 105: UINT8 statusmask; /* status mask */
! 106: UINT32 mode; /* Reg.08 : CSM , notesel,etc. */
! 107: /* Timer */
! 108: int T[2]; /* timer counter */
! 109: UINT8 st[2]; /* timer enable */
! 110: /* FM channel slots */
! 111: OPL_CH *P_CH; /* pointer of CH */
! 112: int max_ch; /* maximum channel */
! 113: /* Rythm sention */
! 114: UINT8 rythm; /* Rythm mode , key flag */
! 115: #if BUILD_Y8950
! 116: /* Delta-T ADPCM unit (Y8950) */
! 117: YM_DELTAT *deltat; /* DELTA-T ADPCM */
! 118: #endif
! 119: /* Keyboard / I/O interface unit (Y8950) */
! 120: UINT8 portDirection;
! 121: UINT8 portLatch;
! 122: OPL_PORTHANDLER_R porthandler_r;
! 123: OPL_PORTHANDLER_W porthandler_w;
! 124: int port_param;
! 125: OPL_PORTHANDLER_R keyboardhandler_r;
! 126: OPL_PORTHANDLER_W keyboardhandler_w;
! 127: int keyboard_param;
! 128: /* time tables */
! 129: INT32 AR_TABLE[75]; /* atttack rate tables */
! 130: INT32 DR_TABLE[75]; /* decay rate tables */
! 131: UINT32 FN_TABLE[1024]; /* fnumber -> increment counter */
! 132: /* LFO */
! 133: INT32 *ams_table;
! 134: INT32 *vib_table;
! 135: INT32 amsCnt;
! 136: INT32 amsIncr;
! 137: INT32 vibCnt;
! 138: INT32 vibIncr;
! 139: /* wave selector enable flag */
! 140: UINT8 wavesel;
! 141: /* external event callback handler */
! 142: OPL_TIMERHANDLER TimerHandler; /* TIMER handler */
! 143: int TimerParam; /* TIMER parameter */
! 144: OPL_IRQHANDLER IRQHandler; /* IRQ handler */
! 145: int IRQParam; /* IRQ parameter */
! 146: OPL_UPDATEHANDLER UpdateHandler; /* stream update handler */
! 147: int UpdateParam; /* stream update parameter */
! 148: } FM_OPL;
! 149:
! 150: /* ---------- Generic interface section ---------- */
! 151: #define OPL_TYPE_YM3526 (0)
! 152: #define OPL_TYPE_YM3812 (OPL_TYPE_WAVESEL)
! 153: #define OPL_TYPE_Y8950 (OPL_TYPE_ADPCM|OPL_TYPE_KEYBOARD|OPL_TYPE_IO)
! 154:
! 155: FM_OPL *OPLCreate(int type, int clock, int rate);
! 156: void OPLDestroy(FM_OPL *OPL);
! 157: void OPLSetTimerHandler(FM_OPL *OPL,OPL_TIMERHANDLER TimerHandler,int channelOffset);
! 158: void OPLSetIRQHandler(FM_OPL *OPL,OPL_IRQHANDLER IRQHandler,int param);
! 159: void OPLSetUpdateHandler(FM_OPL *OPL,OPL_UPDATEHANDLER UpdateHandler,int param);
! 160: /* Y8950 port handlers */
! 161: void OPLSetPortHandler(FM_OPL *OPL,OPL_PORTHANDLER_W PortHandler_w,OPL_PORTHANDLER_R PortHandler_r,int param);
! 162: void OPLSetKeyboardHandler(FM_OPL *OPL,OPL_PORTHANDLER_W KeyboardHandler_w,OPL_PORTHANDLER_R KeyboardHandler_r,int param);
! 163:
! 164: void OPLResetChip(FM_OPL *OPL);
! 165: int OPLWrite(FM_OPL *OPL,int a,int v);
! 166: unsigned char OPLRead(FM_OPL *OPL,int a);
! 167: int OPLTimerOver(FM_OPL *OPL,int c);
! 168:
! 169: /* YM3626/YM3812 local section */
! 170: void YM3812UpdateOne(FM_OPL *OPL, INT16 *buffer, int length);
! 171:
! 172: void Y8950UpdateOne(FM_OPL *OPL, INT16 *buffer, int length);
! 173:
! 174: #endif
unix.superglobalmegacorp.com