Skip to content

Commit

Permalink
Improved the way timers for direct sound are handled
Browse files Browse the repository at this point in the history
  • Loading branch information
Gericom committed Aug 16, 2019
1 parent 916020e commit c5a2384
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 16 deletions.
10 changes: 6 additions & 4 deletions arm7/source/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -175,10 +175,10 @@ int main()
if (reg == 0x82)
{
gbs_setMixVolume(val & 3);
gbas_updateVolume(val);
gbas_updateVolume(val & 0xFF);
}
else if (reg == 0x83)
gbas_updateMixConfig(val);
gbas_updateMixConfig(val & 0xFF);
else
gbs_writeReg(reg, val & 0xFF);
reg++;
Expand All @@ -195,27 +195,29 @@ int main()
{
while (REG_FIFO_CNT & FIFO_CNT_EMPTY);
val = REG_RECV_FIFO;
gbas_soundTimerUpdated(0, val & 0xFFFF);
gbas_soundTimerUpdated(0, val >> 16, val & 0xFFFF);
break;
}
case 0x04000102:
{
while (REG_FIFO_CNT & FIFO_CNT_EMPTY);
val = REG_RECV_FIFO;
gbas_soundTimerControlUpdated(0, val & 0xFFFF);
break;
}
case 0x04000104:
{
while (REG_FIFO_CNT & FIFO_CNT_EMPTY);
val = REG_RECV_FIFO;
gbas_soundTimerUpdated(1, val & 0xFFFF);
gbas_soundTimerUpdated(1, val >> 16, val & 0xFFFF);
break;
}
case 0x04000106:

{
while (REG_FIFO_CNT & FIFO_CNT_EMPTY);
val = REG_RECV_FIFO;
gbas_soundTimerControlUpdated(1, val & 0xFFFF);
break;
}
case 0x04000108:
Expand Down
46 changes: 37 additions & 9 deletions arm7/source/sound.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@ u8 sChannelATimer = 0;
u8 sChannelAVolume = 1;

u16 sTimerReloadVals[4];
u16 sTimerControlVals[4];

static int sampcnter = 0;

/*static void gba_sound_timer2_handler()
{
Expand Down Expand Up @@ -59,6 +62,7 @@ void gba_sound_resync()
{
soundStarted = 0;
soundBufferWriteOffset = 0;
//REG_SOUND[0].CNT = 0;
}

static void gba_sound_update_ds_channels()
Expand Down Expand Up @@ -160,8 +164,6 @@ void gba_sound_fifo_update()
}
}

static int sampcnter = 0;

extern "C" void timer3_overflow_irq()
{
if(srcAddress == 0)
Expand Down Expand Up @@ -212,21 +214,44 @@ extern "C" void timer3_overflow_irq()

void gbas_updateChannelATimer()
{
int freq = (-16 * 1024 * 1024) / ((int16_t)sTimerReloadVals[sChannelATimer]);
int freq = 0;
if(sTimerControlVals[sChannelATimer] & 0x80)
freq = (-16 * 1024 * 1024) / ((int16_t)sTimerReloadVals[sChannelATimer]);
if(sampleFreq != freq)
{
sampleFreq = freq;
gba_sound_resync();
REG_TM[3].CNT_H = 0;
if(sampleFreq != 0)
{
REG_TM[3].CNT_L = TIMER_FREQ(sampleFreq);
REG_TM[3].CNT_H = REG_TMXCNT_H_E | REG_TMXCNT_H_I;
REG_IE |= (1 << 6);
REG_SOUND[0].TMR = (u16)(-(33513982/2)/sampleFreq);
REG_SOUND[0].CNT = REG_SOUNDXCNT_E | REG_SOUNDXCNT_FORMAT(REG_SOUNDXCNT_FORMAT_PCM8) | REG_SOUNDXCNT_REPEAT(REG_SOUNDXCNT_REPEAT_LOOP) | REG_SOUNDXCNT_PAN(64) | REG_SOUNDXCNT_VOLUME(0x7F);
}
else
{
REG_SOUND[0].TMR = 0;
REG_SOUND[0].CNT = REG_SOUNDXCNT_E | REG_SOUNDXCNT_FORMAT(REG_SOUNDXCNT_FORMAT_PCM8) | REG_SOUNDXCNT_REPEAT(REG_SOUNDXCNT_REPEAT_LOOP) | REG_SOUNDXCNT_PAN(64) | REG_SOUNDXCNT_VOLUME(0);
}
}
}

void gbas_soundTimerUpdated(int timer, uint16_t reloadVal)
void gbas_soundTimerUpdated(int timer, u16 controlVal, u16 reloadVal)
{
sTimerControlVals[timer] = controlVal;
sTimerReloadVals[timer] = reloadVal;
if(sChannelATimer == timer)
gbas_updateChannelATimer();
}

void gbas_soundTimerControlUpdated(int timer, u16 controlVal)
{
sTimerControlVals[timer] = controlVal;
if(sChannelATimer == timer)
gbas_updateChannelATimer();
}

void gba_sound_fifo_write(uint32_t samps)
{
soundBuffer[(soundBufferWriteOffset) % SOUND_BUFFER_SIZE] = samps & 0xFF;
Expand All @@ -245,9 +270,12 @@ void gba_sound_set_src(uint32_t address)
REG_TM[3].CNT_H = 0;
sampcnter = 0;
//timer3_overflow_irq();
REG_TM[3].CNT_L = TIMER_FREQ(sampleFreq);// * FIFO_BLOCK_SIZE;//* 64 / FIFO_BLOCK_SIZE);//16);
REG_TM[3].CNT_H = REG_TMXCNT_H_E | REG_TMXCNT_H_I;// | REG_TMXCNT_H_PS_64;
REG_IE |= (1 << 6);
if(sampleFreq != 0)
{
REG_TM[3].CNT_L = TIMER_FREQ(sampleFreq);// * FIFO_BLOCK_SIZE;//* 64 / FIFO_BLOCK_SIZE);//16);
REG_TM[3].CNT_H = REG_TMXCNT_H_E | REG_TMXCNT_H_I;// | REG_TMXCNT_H_PS_64;
REG_IE |= (1 << 6);
}
}

void gba_sound_fifo_write16(uint8_t* samps)
Expand All @@ -267,7 +295,7 @@ void gbas_updateVolume(u8 vol)

void gbas_updateMixConfig(u8 mixConfig)
{
int newATimer = (mixConfig >> 10) & 1;
int newATimer = (mixConfig >> 2) & 1;
if(sChannelATimer != newATimer)
{
sChannelATimer = newATimer;
Expand Down
3 changes: 2 additions & 1 deletion arm7/source/sound.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,8 @@ typedef volatile struct
void gba_sound_init();
void gba_sound_notify_reset();
void gba_sound_vblank();
void gbas_soundTimerUpdated(int timer, uint16_t reloadVal);
void gbas_soundTimerUpdated(int timer, u16 controlVal, u16 reloadVal);
void gbas_soundTimerControlUpdated(int timer, u16 controlVal);
void gba_sound_fifo_write(uint32_t samps);
void gba_sound_set_src(uint32_t address);
void gba_sound_fifo_write16(uint8_t* samps);
Expand Down
15 changes: 13 additions & 2 deletions arm9/source/emu/timer.s
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ write_address_timer_counter:
strh r11, [r13]

ldrh r12, [r9, #2]
orr r11, r12, lsl #16
tst r12, #4 //if slave mode, we don't have to fix the reload value
moveq r12, r11, lsl #17
moveq r12, r12, lsr #16
Expand All @@ -62,12 +63,12 @@ write_address_timer_counter:
write_address_timer_control:
tst r11, #0x80
streqh r11, [r9] //if the timer is not set to run, we don't have to fix anything
bxeq lr
beq 1f

ldrh r12, [r9]
tst r12, #0x80
strneh r11, [r9] //if the timer was already running, we don't have to fix anything
bxne lr
bne 1f

ldr r13,= timer_shadow_regs_dtcm
ldr r12,= (ADDRESS_TIMER_BASE + 2)
Expand All @@ -80,6 +81,16 @@ write_address_timer_control:
moveq r12, r12, lsr #16
strh r12, [r9, #-2]
strh r11, [r9]

1:
ldr r13,= 0x04000188
2:
ldr r10, [r13, #-4]
tst r10, #1
beq 2b
ldr r12,= 0x04000188
str r9, [r12]
str r11, [r12]
bx lr

.global write_address_timer
Expand Down

0 comments on commit c5a2384

Please sign in to comment.