⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tchnosnd.c

📁 十七种模拟器源代码 非常有用的作课程设计不可缺少的
💻 C
字号:
/******************************************************************************//*                                                                            *//*             TECHNOS SOUND SYSTEMS (C) 1990-1992 TECHNOS JAPAN              *//*                                                                            *//******************************************************************************/#include "gameinc.h"#include "tchnosnd.h"#include "taitosnd.h"#ifdef RAINE_DEBUG#include "debug.h"#endif#include "sasound.h"		// sample support routinesstatic UINT8 SoundByte[32];static int SoundW;static int SoundR;UINT8 TechnosSoundReadZ80(UINT16 offset){   int ta;   if( SoundW != SoundR ){      ta = SoundByte[SoundR];      SoundR = (SoundR+1) & 31;   }   else{      ta = 0x00;   }#ifdef RAINE_DEBUG   print_debug("Z80 Receives:%02x\n",ta);#endif   return ta;}void TechnosSoundWrite68k(UINT32 address, UINT16 data){   data&=0xFF;   SoundByte[SoundW]=data;   SoundW = (SoundW+1) & 31;   cpu_int_nmi(CPU_Z80_0);   #ifdef RAINE_DEBUG   print_debug("68000 Sends:%02x\n",data);   #endif}static struct OKIM6295interface m6295_interface ={   1,					// 1 chip   { 8000 },				// rate   { 0 },		// rom list   { 250 },};static struct YM2151interface ym2151_interface ={  1,                    // 1 chip  3500000,              // 3.5 MHz  { YM3012_VOL(127,MIXER_PAN_LEFT,127,MIXER_PAN_RIGHT) },  { NULL, },};struct SOUND_INFO technos_ym2151_m6295_sound[] ={   { SOUND_YM2151J, &ym2151_interface,    },   { SOUND_M6295,   &m6295_interface,     },   { 0,             NULL,                 },};static void YM2151_Init(int volume){    ym2151_interface.volume[0] = YM3012_VOL(volume,MIXER_PAN_LEFT,volume,MIXER_PAN_RIGHT);}DEF_INLINE void TechnosSound_Frame(void){   cpu_execute_cycles(CPU_Z80_0, 4000000/60);        // Sound Z80 xMhz   cpu_execute_cycles(CPU_Z80_0, 4000000/60);        // Sound Z80 xMhz}static void my_bankswitch(UINT16 offset,UINT8 data){	OKIM6295_set_bank_base(0,ALL_VOICES,(data & 1) * 0x40000);}void AddTechnosSound(UINT32 p1, UINT32 p2, UINT32 romsize, UINT8 *adpcmA, UINT8 *adpcmB, int volume){  int bank_size = adpcmB - adpcmA;    // Apply Speed Patch   // -----------------   Z80ROM[p1+0]=0xD3;   // OUTA (AAh)   Z80ROM[p1+1]=0xAA;   //   SetStopZ80Mode2( (UINT16) p2);   // Setup Z80 memory map   // --------------------   AddZ80AROMBase(Z80ROM, 0x0038, 0x0066);   AddZ80AReadByte(0xC000, 0xC7FF, NULL,                        Z80ROM+0xC000); // Z80 RAM   AddZ80AReadByte(0xC800, 0xC801, YM2151ReadZ80,               NULL);          // YM2151   AddZ80AReadByte(0xD800, 0xD800, M6295_A_Read_Z80,            NULL);          // OKI M6295   AddZ80AReadByte(0xE000, 0xE000, TechnosSoundReadZ80,         NULL);          // 68000 COMM   AddZ80AReadByte(0x0000, 0xFFFF, NULL,                        Z80ROM+0x0000); // <test>   AddZ80AReadByte(0x0000, 0xFFFF, DefBadReadZ80,               NULL);          // <bad reads>   AddZ80AReadByte(-1, -1, NULL, NULL);   AddZ80AWriteByte(0xC000, 0xC7FF, NULL,                       Z80ROM+0xC000); // Z80 RAM   AddZ80AWriteByte(0xC800, 0xC801, YM2151WriteZ80,             NULL);          // YM2151   AddZ80AWriteByte(0xD800, 0xD800, M6295_A_Write_Z80,          NULL);          // OKI M6295   AddZ80AWriteByte(0xE800, 0xE800, my_bankswitch,      NULL);          // OKI BANKING   //AddZ80AWriteByte(0xE800, 0xE800, M6295_A_WriteBank_Z80,      NULL);          // OKI BANKING   AddZ80AWriteByte(0x0000, 0xFFFF, NULL,                       Z80ROM+0x0000); // <test>   AddZ80AWriteByte(0x0000, 0xFFFF, DefBadWriteZ80,             NULL);          // <bad writes>   AddZ80AWriteByte(-1, -1, NULL, NULL);   AddZ80AReadPort(0x00, 0xFF, DefBadReadZ80,           NULL);   AddZ80AReadPort(  -1,   -1, NULL,                    NULL);   AddZ80AWritePort(0xAA, 0xAA, StopZ80Mode2,           NULL);   AddZ80AWritePort(0x00, 0xFF, DefBadWriteZ80,         NULL);   AddZ80AWritePort(  -1,   -1, NULL,                   NULL);   AddZ80AInit();   // Setup YM2151   // ------------   YM2151_Init(volume);   // Setup M6295   // -----------   ADPCMSetBuffers(((struct ADPCMinterface*)&m6295_interface),adpcmA,bank_size);   ExecuteSoundFrame=&TechnosSound_Frame;   SoundW = 0;   SoundR = 0;}DEF_INLINE void TechnosSoundOld_Frame(void){   cpu_execute_cycles(CPU_Z80_0, 4000000/60);        // Sound Z80 xMhz   cpu_interrupt(CPU_Z80_0, 0x38);   cpu_execute_cycles(CPU_Z80_0, 4000000/60);        // Sound Z80 xMhz   cpu_interrupt(CPU_Z80_0, 0x38);}// AddTechnosSoundOld()://// Older version seen in WWF SuperStars and Comba Tribes. Memory map is $4000// bytes earlier, single adpcm bank and int#38 is used.void AddTechnosSoundOld(UINT32 p1, UINT32 p2, UINT32 romsize, UINT8 *adpcmA, int volume){   int ta;   ADPCMSetBuffers(((struct ADPCMinterface*)&m6295_interface),adpcmA,0x40000);   for(ta=0;ta<0x8000;ta++){      Z80ROM[ta+0x8000]=0;   }   // Apply Speed Patch   // -----------------   Z80ROM[p1+0]=0xD3;   // OUTA (AAh)   Z80ROM[p1+1]=0xAA;   //   SetStopZ80Mode2( (UINT16) p2);   // Setup Z80 memory map   // --------------------   AddZ80AROMBase(Z80ROM, 0x0038, 0x0066);   AddZ80AReadByte(0x8000, 0x87FF, NULL,                        Z80ROM+0x8000); // Z80 RAM   AddZ80AReadByte(0x8800, 0x8801, YM2151ReadZ80,               NULL);          // YM2151   AddZ80AReadByte(0x9800, 0x9800, M6295_A_Read_Z80,            NULL);          // OKI ADPCM   AddZ80AReadByte(0xA000, 0xA000, TechnosSoundReadZ80,         NULL);          // 68000 COMM   AddZ80AReadByte(0x0000, 0xFFFF, NULL,                        Z80ROM+0x0000); // <test>   AddZ80AReadByte(0x0000, 0xFFFF, DefBadReadZ80,               NULL);          // <bad reads>   AddZ80AReadByte(-1, -1, NULL, NULL);   AddZ80AWriteByte(0x8000, 0x87FF, NULL,                       Z80ROM+0x8000); // Z80 RAM   AddZ80AWriteByte(0x8800, 0x8801, YM2151WriteZ80,             NULL);          // YM2151   AddZ80AWriteByte(0x9800, 0x9800, M6295_A_Write_Z80,          NULL);          // OKI ADPCM   AddZ80AWriteByte(0x0000, 0xFFFF, NULL,                       Z80ROM+0x0000); // <test>   AddZ80AWriteByte(0x0000, 0xFFFF, DefBadWriteZ80,             NULL);          // <bad writes>   AddZ80AWriteByte(-1, -1, NULL, NULL);   AddZ80AReadPort(0x00, 0xFF, DefBadReadZ80,           NULL);   AddZ80AReadPort(  -1,   -1, NULL,                    NULL);   AddZ80AWritePort(0xAA, 0xAA, StopZ80Mode2,           NULL);   AddZ80AWritePort(0x00, 0xFF, DefBadWriteZ80,         NULL);   AddZ80AWritePort(  -1,   -1, NULL,                   NULL);   AddZ80AInit();   // Setup YM2151   // ------------   YM2151_Init(volume);   // Setup M6295   // -----------   ExecuteSoundFrame=&TechnosSoundOld_Frame;   SoundW = 0;   SoundR = 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -