ת»»Ϊgb2312±àÂë
This commit is contained in:
@@ -1,43 +1,43 @@
|
||||
#include "main.h"
|
||||
#include "nes_apu.h"
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
//本程序移植自网友ye781205的NES模拟器工程
|
||||
//ALIENTEK STM32F407开发板
|
||||
//NES APU 驱动代码
|
||||
//正点原子@ALIENTEK
|
||||
//技术论坛:www.openedv.com
|
||||
//创建日期:2014/7/1
|
||||
//版本:V1.0
|
||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ye781205<EFBFBD><EFBFBD>NESģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//ALIENTEK STM32F407<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//NES APU <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD><EFBFBD>@ALIENTEK
|
||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̳:www.openedv.com
|
||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:2014/7/1
|
||||
//<EFBFBD>汾<EFBFBD><EFBFBD>V1.0
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
/* look up table madness */
|
||||
#define APU_OVERSAMPLE
|
||||
#define APU_VOLUME_DECAY(x) ((x) -= ((x) >> 7))
|
||||
//需要用到的汇编的代码及参数
|
||||
//<EFBFBD><EFBFBD>Ҫ<EFBFBD>õ<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><EFBFBD>뼰<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
u8 K6502_Read( u16 wAddr ); //6502.s
|
||||
extern u32 clocks; //6502.s
|
||||
//noise lookups for both modes */
|
||||
//噪音查找两种模式 */
|
||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ */
|
||||
#ifndef REALTIME_NOISE //1
|
||||
static char noise_long_lut[APU_NOISE_32K];//APU_NOISE_32K 0x7FFF
|
||||
static char noise_short_lut[APU_NOISE_93];//APU_NOISE_93 93
|
||||
#endif /* !REALTIME_NOISE */
|
||||
|
||||
/* vblank长度表用于矩形、三角形、噪音 */
|
||||
/* vblank<EFBFBD><EFBFBD><EFBFBD>ȱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ھ<EFBFBD><EFBFBD>Ρ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ρ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
||||
static const u8 vbl_length[32] =
|
||||
{
|
||||
5, 127, 10, 1, 19, 2, 40, 3, 80, 4, 30, 5, 7, 6, 13, 7,
|
||||
6, 8, 12, 9, 24, 10, 48, 11, 96, 12, 36, 13, 8, 14, 16, 15
|
||||
};
|
||||
|
||||
/* 矩形通道的频率限制 */
|
||||
/* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
||||
static const int freq_limit[8] =
|
||||
{
|
||||
0x3FF, 0x555, 0x666, 0x71C, 0x787, 0x7C1, 0x7E0, 0x7F0
|
||||
};
|
||||
|
||||
/* 噪声频率查找表 */
|
||||
/* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD>ʲ<EFBFBD><EFBFBD>ұ<EFBFBD> */
|
||||
static const int noise_freq[16] =
|
||||
{
|
||||
4, 8, 16, 32, 64, 96, 128, 160,
|
||||
@@ -51,11 +51,11 @@ const int dmc_clocks[16] =
|
||||
190, 160, 142, 128, 106, 85, 72, 54
|
||||
};
|
||||
|
||||
/* pos /底片的比率为矩形波脉冲 */
|
||||
/* pos /<EFBFBD><EFBFBD>Ƭ<EFBFBD>ı<EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD>β<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
||||
static const int duty_lut[4] = { 2, 4, 8, 12 };
|
||||
|
||||
|
||||
/*** Simple queue routines简单队列例程*/
|
||||
/*** Simple queue routines<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
#define APU_QEMPTY() (apu->q_head == apu->q_tail)
|
||||
|
||||
void apu_enqueue(apudata_t *d)
|
||||
@@ -83,9 +83,9 @@ void apu_setchan(int chan, u8 enabled)
|
||||
/* emulation of the 15-bit shift register the
|
||||
** NES uses to generate pseudo-random series
|
||||
** for the white noise channel
|
||||
模拟的15位移位寄存器
|
||||
NES用来生成伪随机序列
|
||||
白噪声信道
|
||||
ģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>15λ<EFBFBD><EFBFBD>λ<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD>
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>NES<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>α<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŵ<EFBFBD>
|
||||
*/
|
||||
#ifdef REALTIME_NOISE //1
|
||||
char shift_register15(u8 xor_tap)
|
||||
@@ -180,7 +180,7 @@ int apu_rectangle(rectangle_t *chan)
|
||||
env_phase -= 4; /* 240/60 */
|
||||
while (env_phase < 0)
|
||||
{
|
||||
if(env_delay==0)break;//*******我加的*****************1943这个游戏是0
|
||||
if(env_delay==0)break;//*******<EFBFBD>Ҽӵ<EFBFBD>*****************1943<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD><EFBFBD>0
|
||||
env_phase += env_delay;
|
||||
|
||||
if (holdnote)
|
||||
@@ -394,7 +394,7 @@ int apu_noise(noise_t *chan)
|
||||
while (chan->phaseacc < 0)
|
||||
{
|
||||
|
||||
if(chan->freq==0)break;//*******我加的*****************这个游戏是0/////////////////////////
|
||||
if(chan->freq==0)break;//*******<EFBFBD>Ҽӵ<EFBFBD>*****************<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD><EFBFBD>0/////////////////////////
|
||||
chan->phaseacc += chan->freq;
|
||||
|
||||
#ifdef REALTIME_NOISE
|
||||
@@ -500,8 +500,8 @@ int apu_dmc(dmc_t *chan)
|
||||
if (7 == delta_bit)
|
||||
{
|
||||
chan->cur_byte =K6502_Read(chan->address);//chan->cur_byte = nes6502_getbyte(chan->address);*********************
|
||||
/* steal a cycle from CPU偷从CPU周期*/
|
||||
clocks++; // nes6502_burn(1);//要CPU时钟数加1**********************************************************************
|
||||
/* steal a cycle from CPU͵<EFBFBD><EFBFBD>CPU<EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
clocks++; // nes6502_burn(1);//ҪCPUʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1**********************************************************************
|
||||
|
||||
if (0xFFFF == chan->address)
|
||||
chan->address = 0x8000;
|
||||
@@ -958,7 +958,7 @@ void apu_regwrite(u32 address, u8 value)
|
||||
{
|
||||
apu_memwrite* mw = apu->ext->mem_write;
|
||||
|
||||
while(mw->max_range != -1)//整数转换导致改变的迹象
|
||||
while(mw->max_range != -1)//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¸ı<EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>
|
||||
{
|
||||
if((mw->min_range <= address) && ((mw->max_range >= address)))
|
||||
{
|
||||
@@ -1098,10 +1098,10 @@ void apu_process(u16 *buffer, int num_samples)
|
||||
if (accum > 0x7FFF)accum = 0x7FFF;
|
||||
else if (accum < -0x8000)accum = -0x8000;
|
||||
|
||||
*buffer++=(u16)accum;//音频数据存入缓冲
|
||||
*buffer++=(u16)accum;//<EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><EFBFBD>뻺<EFBFBD><EFBFBD>
|
||||
}
|
||||
}
|
||||
/* resync cycle counter 重新同步循环计数器*/
|
||||
/* resync cycle counter <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><EFBFBD>ѭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
apu->elapsed_cycles =clocks; // apu->elapsed_cycles = nes6502_getcycles(0);//*****************************************************************
|
||||
}
|
||||
|
||||
@@ -1151,7 +1151,7 @@ void apu_setparams(int sample_rate, int refresh_rate, int frag_size, int sample_
|
||||
apu->sample_bits = sample_bits;
|
||||
|
||||
apu->num_samples = sample_rate / refresh_rate;
|
||||
frag_size = frag_size; /* quell warnings 平息警告*/
|
||||
frag_size = frag_size; /* quell warnings ƽϢ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
|
||||
/* turn into fixed point! */
|
||||
apu->cycle_rate = (int) (APU_BASEFREQ * 65536.0 / (float) sample_rate);
|
||||
@@ -1162,7 +1162,7 @@ void apu_setparams(int sample_rate, int refresh_rate, int frag_size, int sample_
|
||||
if (apu->ext)
|
||||
apu->ext->paramschanged();
|
||||
}
|
||||
/*硬件初始化模拟声音,创建波形/声音 */
|
||||
/*Ӳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD> */
|
||||
// _local_sample_rate = 11025; _local_sample_size = 8;
|
||||
// apu_create(_local_sample_rate, 60, 0, _local_sample_size);
|
||||
//void apu_create(int sample_rate, int refresh_rate, int frag_size, int sample_bits)
|
||||
@@ -1175,20 +1175,20 @@ void apu_init(void)
|
||||
apu->rectangle[1].sweep_complement = FALSE;
|
||||
apu->ext = NULL;
|
||||
//apu_setparams(sample_rate, refresh_rate, frag_size, sample_bits);
|
||||
apu_setparams(APU_SAMPLE_RATE,60,0,16);//APU_SAMPLE_RATE为22050Hz //采样率
|
||||
apu_setparams(APU_SAMPLE_RATE,60,0,16);//APU_SAMPLE_RATEΪ22050Hz //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
apu_reset();
|
||||
for(channel=0;channel<6;channel++)apu_setchan(channel,TRUE);
|
||||
apu->filter_type=APU_FILTER_LOWPASS; //设置筛选器类型
|
||||
apu->filter_type=APU_FILTER_LOWPASS; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɸѡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
}
|
||||
//apu声音输出
|
||||
//apu<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
void apu_soundoutput(void)
|
||||
{
|
||||
u16 i;
|
||||
apu_process(wave_buffers,APU_PCMBUF_SIZE);
|
||||
for(i=0;i<30;i++)if(wave_buffers[i]!=wave_buffers[i+1])break;//判断前30个数据,是不是都相等?
|
||||
if(i==30&&wave_buffers[i])//都相等,且不等于0
|
||||
for(i=0;i<30;i++)if(wave_buffers[i]!=wave_buffers[i+1])break;//<EFBFBD>ж<EFBFBD>ǰ30<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C>Dz<EFBFBD><C7B2>Ƕ<EFBFBD><C7B6><EFBFBD><EFBFBD><EFBFBD>?
|
||||
if(i==30&&wave_buffers[i])//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C>Ҳ<EFBFBD><D2B2><EFBFBD><EFBFBD><EFBFBD>0
|
||||
{
|
||||
for(i=0;i<APU_PCMBUF_SIZE;i++)wave_buffers[i]=0;//是暂停状态输出的重复无效数据,直接修改为0.从而不输出杂音.
|
||||
for(i=0;i<APU_PCMBUF_SIZE;i++)wave_buffers[i]=0;//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ״̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD><EFBFBD><EFBFBD>,ֱ<><D6B1><EFBFBD><EFBFBD>Ϊ0.<2E>Ӷ<EFBFBD><D3B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
}
|
||||
clocks=0;
|
||||
nes_apu_fill_buffer(0,wave_buffers);
|
||||
|
Reference in New Issue
Block a user