Demacro-ize main.c

This commit is contained in:
twinaphex 2014-12-11 02:29:51 +01:00
parent c78a0dd39b
commit 0bc2a111d7
1 changed files with 47 additions and 52 deletions

99
main.c
View File

@ -51,50 +51,45 @@ char save_path[512];
void trigger_ext_event(void); void trigger_ext_event(void);
#define check_count(count_var) \ static void update_timers(irq_type *irq_raised)
if(count_var < execute_cycles) \ {
execute_cycles = count_var; \ unsigned i;
for (i = 0; i < 4; i++)
{
if(timer[i].status == TIMER_INACTIVE)
continue;
#define check_timer(timer_number) \ if(timer[i].status != TIMER_CASCADE)
if(timer[timer_number].status == TIMER_PRESCALE) \ {
check_count(timer[timer_number].count); \ timer[i].count -= execute_cycles;
//io_registers[REG_TM##timer_number##D] = -(timer[i].count >> timer[i].prescale);
io_registers[128 + (i * 2)] = -(timer[i].count > timer[i].prescale);
}
#define update_timer(timer_number) \ if(timer[i].count > 0)
if(timer[timer_number].status != TIMER_INACTIVE) \ continue;
{ \
if(timer[timer_number].status != TIMER_CASCADE) \ if(timer[i].irq == TIMER_TRIGGER_IRQ)
{ \ *irq_raised |= (8 << i); /*IRQ_TIMER##timer_number */
timer[timer_number].count -= execute_cycles; \
io_registers[REG_TM##timer_number##D] = \ if((i != 3) && (timer[i + 1].status == TIMER_CASCADE))
-(timer[timer_number].count >> timer[timer_number].prescale); \ {
} \ timer[i + 1].count--;
\ io_registers[REG_TM0D + (i + 1) * 2] = -(timer[i + 1].count);
if(timer[timer_number].count <= 0) \ }
{ \
if(timer[timer_number].irq == TIMER_TRIGGER_IRQ) \ if(i < 2)
irq_raised |= IRQ_TIMER##timer_number; \ {
\ if(timer[i].direct_sound_channels & 0x01)
if((timer_number != 3) && \ sound_timer(timer[i].frequency_step, 0);
(timer[timer_number + 1].status == TIMER_CASCADE)) \
{ \ if(timer[i].direct_sound_channels & 0x02)
timer[timer_number + 1].count--; \ sound_timer(timer[i].frequency_step, 1);
io_registers[REG_TM0D + (timer_number + 1) * 2] = \ }
-(timer[timer_number + 1].count); \
} \ timer[i].count += (timer[i].reload << timer[i].prescale);
\ }
if(timer_number < 2) \ }
{ \
if(timer[timer_number].direct_sound_channels & 0x01) \
sound_timer(timer[timer_number].frequency_step, 0); \
\
if(timer[timer_number].direct_sound_channels & 0x02) \
sound_timer(timer[timer_number].frequency_step, 1); \
} \
\
timer[timer_number].count += \
(timer[timer_number].reload << timer[timer_number].prescale); \
} \
} \
void init_main(void) void init_main(void)
{ {
@ -132,6 +127,7 @@ u32 update_gba(void)
do do
{ {
unsigned i;
cpu_ticks += execute_cycles; cpu_ticks += execute_cycles;
reg[CHANGED_PC_STATUS] = 0; reg[CHANGED_PC_STATUS] = 0;
@ -143,10 +139,7 @@ u32 update_gba(void)
gbc_sound_update = 0; gbc_sound_update = 0;
} }
update_timer(0); update_timers(&irq_raised);
update_timer(1);
update_timer(2);
update_timer(3);
video_count -= execute_cycles; video_count -= execute_cycles;
@ -253,9 +246,7 @@ u32 update_gba(void)
} }
} }
else else
{
dispstat &= ~0x04; dispstat &= ~0x04;
}
io_registers[REG_VCOUNT] = vcount; io_registers[REG_VCOUNT] = vcount;
} }
@ -267,10 +258,14 @@ u32 update_gba(void)
execute_cycles = video_count; execute_cycles = video_count;
check_timer(0); for (i = 0; i < 4; i++)
check_timer(1); {
check_timer(2); if(timer[i].status != TIMER_PRESCALE)
check_timer(3); continue;
if(timer[i].count < execute_cycles)
execute_cycles = timer[i].count;
}
} while(reg[CPU_HALT_STATE] != CPU_ACTIVE); } while(reg[CPU_HALT_STATE] != CPU_ACTIVE);
return execute_cycles; return execute_cycles;