ת»»Ϊgb2312±àÂë

This commit is contained in:
2025-07-05 19:47:28 +08:00
parent 8c12c1ffc3
commit 079aa9f868
550 changed files with 13358 additions and 17326 deletions

View File

@@ -1,43 +1,43 @@
#include "main.h"
#include "nes_apu.h"
//////////////////////////////////////////////////////////////////////////////////
//本程序移植自网友ye781205NES模拟器工程
//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_RATE22050Hz //采样率
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);