?? 2151intf.c
字號(hào):
/*************************************************************************** 2151intf.c Support interface YM2151(OPM)***************************************************************************/#include "driver.h"#include "sasound.h"#include "ym2151.h"#include "fm.h"/* for stream system */static int stream[MAX_2151];static const struct YM2151interface *intf;static int FMMode;#define CHIP_YM2151_DAC 4 /* use Tatsuyuki's FM.C */#define CHIP_YM2151_ALT 5 /* use Jarek's YM2151.C */#if (HAS_YM2151)#define YM2151_NUMBUF 2static void *Timer[MAX_2151][2];/* IRQ Handler */static void IRQHandler(int n,int irq){ if(intf->irqhandler[n]) intf->irqhandler[n](irq);}#ifndef __RAINE__static void timer_callback_2151(int param){ int n=param&0x7f; int c=param>>7; Timer[n][c] = 0; YM2151TimerOver(n,c);}/* TimerHandler from fm.c */static void TimerHandler(int n,int c,int count,double stepTime){ if( count == 0 ) { /* Reset FM Timer */ if( Timer[n][c] ) { timer_remove (Timer[n][c]); Timer[n][c] = 0; } } else { /* Start FM Timer */ double timeSec = (double)count * stepTime; if( Timer[n][c] == 0 ) { Timer[n][c] = timer_set (timeSec, (c<<7)|n, timer_callback_2151 ); } }}#endif#endif/* update request from fm.c */void YM2151UpdateRequest(int chip){ stream_update(stream[chip],0);}static int my_YM2151_sh_start(const struct YM2151interface *msound,int mode){ int i,j; int rate = audio_sample_rate; char buf[YM2151_NUMBUF][40]; const char *name[YM2151_NUMBUF]; int mixed_vol,vol[YM2151_NUMBUF],pan[YM2151_NUMBUF]; if( rate == 0 ) rate = 1000; /* kludge to prevent nasty crashes */ intf = msound; if( mode ) FMMode = CHIP_YM2151_ALT; else FMMode = CHIP_YM2151_DAC; switch(FMMode) {#if (HAS_YM2151) case CHIP_YM2151_DAC: /* Tatsuyuki's */ /* stream system initialize */ for (i = 0;i < intf->num;i++) { mixed_vol = intf->volume[i]; /* stream setup */ for (j = 0 ; j < YM2151_NUMBUF ; j++) { name[j]=buf[j]; vol[j] = mixed_vol & 0xff; pan[j] = (mixed_vol>>8) & 0xff; mixed_vol>>=16; sprintf(buf[j],"%s #%d Ch%d","YM2151",i,j+1); } stream[i] = stream_init_multi(YM2151_NUMBUF, name,rate,16,i,OPMUpdateOne); /* volume setup */ for (j = 0 ; j < YM2151_NUMBUF ; j++) { stream_set_volume(stream[i]+j,vol[j]); stream_set_pan(stream[i]+j,pan[j]); } } /* Set Timer handler */ for (i = 0; i < intf->num; i++) Timer[i][0] =Timer[i][1] = 0; if (OPMInit(intf->num,intf->baseclock,audio_sample_rate,0,IRQHandler) == 0) { /* set port handler */ for (i = 0; i < intf->num; i++) OPMSetPortHander(i,intf->portwritehandler[i]); return 0; } /* error */ return 1;#endif#if (HAS_YM2151_ALT) case CHIP_YM2151_ALT: /* Jarek's */ /* stream system initialize */ for (i = 0;i < intf->num;i++) { /* stream setup */ mixed_vol = intf->volume[i]; for (j = 0 ; j < YM2151_NUMBUF ; j++) { name[j]=buf[j]; vol[j] = mixed_vol & 0xff; pan[j] = (mixed_vol>>8) & 0xff; mixed_vol>>=16; sprintf(buf[j],"%s #%d Ch%d","YM2151",i,j+1); } stream[i] = stream_init_multi(YM2151_NUMBUF, name,rate,16,i,YM2151UpdateOne); /* volume setup */ for (j = 0 ; j < YM2151_NUMBUF ; j++) { stream_set_volume(stream[i]+j,vol[j]); stream_set_pan(stream[i]+j,vol[j]); } } if (YM2151Init(intf->num,intf->baseclock,audio_sample_rate) == 0) { for (i = 0; i < intf->num; i++) { YM2151SetIrqHandler(i,intf->irqhandler[i]); YM2151SetPortWriteHandler(i,intf->portwritehandler[i]); } return 0; } return 1;#endif } return 1;}#if (HAS_YM2151)int YM2151_sh_start(const struct YM2151interface *msound){ return my_YM2151_sh_start(msound,0);}#endif#if (HAS_YM2151_ALT)int YM2151_ALT_sh_start(const struct YM2151interface *msound){ return my_YM2151_sh_start(msound,1);}#endifvoid YM2151_sh_stop(void){ switch(FMMode) {#if (HAS_YM2151) case CHIP_YM2151_DAC: OPMShutdown(); break;#endif#if (HAS_YM2151_ALT) case CHIP_YM2151_ALT: YM2151Shutdown(); break;#endif }}void YM2151_sh_reset(void){ int i; for (i = 0;i < intf->num;i++) switch(FMMode) {#if (HAS_YM2151) case CHIP_YM2151_DAC: OPMResetChip(i); break;#endif#if (HAS_YM2151_ALT) case CHIP_YM2151_ALT: YM2151ResetChip(i); break;#endif }}static int lastreg0,lastreg1,lastreg2;READ_HANDLER( YM2151_status_port_0_r ){ static int ta; if(RaineSoundCard>0){ switch(FMMode) {#if (HAS_YM2151) case CHIP_YM2151_DAC: return YM2151Read(0,1);#endif#if (HAS_YM2151_ALT) case CHIP_YM2151_ALT: return YM2151ReadStatus(0);#endif } return 0; } else{ ta = (ta+1)&3; return ta; } }READ_HANDLER( YM2151_status_port_1_r ){ switch(FMMode) {#if (HAS_YM2151) case CHIP_YM2151_DAC: return YM2151Read(1,1);#endif#if (HAS_YM2151_ALT) case CHIP_YM2151_ALT: return YM2151ReadStatus(1);#endif } return 0;}READ_HANDLER( YM2151_status_port_2_r ){ switch(FMMode) {#if (HAS_YM2151) case CHIP_YM2151_DAC: return YM2151Read(2,1);#endif#if (HAS_YM2151_ALT) case CHIP_YM2151_ALT: return YM2151ReadStatus(2);#endif } return 0;}WRITE_HANDLER( YM2151_register_port_0_w ){ lastreg0 = data;}WRITE_HANDLER( YM2151_register_port_1_w ){ lastreg1 = data;}WRITE_HANDLER( YM2151_register_port_2_w ){ lastreg2 = data;}WRITE_HANDLER( YM2151_data_port_0_w ){ if(RaineSoundCard>0){ switch(FMMode) {#if (HAS_YM2151) case CHIP_YM2151_DAC: YM2151Write(0,0,(UINT8)(lastreg0&0xFF)); YM2151Write(0,1,data); break;#endif#if (HAS_YM2151_ALT) case CHIP_YM2151_ALT: YM2151UpdateRequest(0); YM2151WriteReg(0,lastreg0,data); break;#endif } }}WRITE_HANDLER( YM2151_data_port_1_w ){ if(RaineSoundCard>0){ switch(FMMode) {#if (HAS_YM2151) case CHIP_YM2151_DAC: YM2151Write(1,0,(UINT8)(lastreg1&0xFF)); YM2151Write(1,1,data); break;#endif#if (HAS_YM2151_ALT) case CHIP_YM2151_ALT: YM2151UpdateRequest(1); YM2151WriteReg(1,lastreg1,data); break;#endif } }}WRITE_HANDLER( YM2151_data_port_2_w ){ if(RaineSoundCard>0){ switch(FMMode) {#if (HAS_YM2151) case CHIP_YM2151_DAC: YM2151Write(2,0,(UINT8)(lastreg2&0xFF)); YM2151Write(2,1,data); break;#endif#if (HAS_YM2151_ALT) case CHIP_YM2151_ALT: YM2151UpdateRequest(2); YM2151WriteReg(2,lastreg2,data); break;#endif } }}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -