chore: make use of comptime control flow when working with tuples

This commit is contained in:
Rekai Nyangadzayi Musuka 2022-10-31 03:22:08 -03:00
parent 2ef4bb7dcc
commit 472457b9f3
4 changed files with 19 additions and 43 deletions

View File

@ -335,10 +335,10 @@ fn DmaController(comptime id: u2) type {
} }
pub fn pollDmaOnBlank(bus: *Bus, comptime kind: DmaKind) void { pub fn pollDmaOnBlank(bus: *Bus, comptime kind: DmaKind) void {
bus.dma[0].poll(kind); comptime var i: usize = 0;
bus.dma[1].poll(kind); inline while (i < 4) : (i += 1) {
bus.dma[2].poll(kind); bus.dma[i].poll(kind);
bus.dma[3].poll(kind); }
} }
const Adjustment = enum(u2) { const Adjustment = enum(u2) {

View File

@ -190,19 +190,15 @@ fn Timer(comptime id: u2) type {
// Perform Cascade Behaviour // Perform Cascade Behaviour
switch (id) { switch (id) {
0 => if (cpu.bus.tim[1].cnt.cascade.read()) { inline 0, 1, 2 => |idx| {
cpu.bus.tim[1]._counter +%= 1; const next = idx + 1;
if (cpu.bus.tim[1]._counter == 0) cpu.bus.tim[1].onTimerExpire(cpu, late);
if (cpu.bus.tim[next].cnt.cascade.read()) {
cpu.bus.tim[next]._counter +%= 1;
if (cpu.bus.tim[next]._counter == 0) cpu.bus.tim[next].onTimerExpire(cpu, late);
}
}, },
1 => if (cpu.bus.tim[2].cnt.cascade.read()) { 3 => {}, // THere is no timer for TIM3 to cascade to
cpu.bus.tim[2]._counter +%= 1;
if (cpu.bus.tim[2]._counter == 0) cpu.bus.tim[2].onTimerExpire(cpu, late);
},
2 => if (cpu.bus.tim[3].cnt.cascade.read()) {
cpu.bus.tim[3]._counter +%= 1;
if (cpu.bus.tim[3]._counter == 0) cpu.bus.tim[3].onTimerExpire(cpu, late);
},
3 => {}, // There is no Timer for TIM3 to "cascade" to,
} }
// Reschedule Timer if we're not cascading // Reschedule Timer if we're not cascading

View File

@ -455,29 +455,12 @@ pub const Arm7tdmi = struct {
} }
pub fn stepDmaTransfer(self: *Self) bool { pub fn stepDmaTransfer(self: *Self) bool {
const dma0 = &self.bus.dma[0]; comptime var i: usize = 0;
const dma1 = &self.bus.dma[1]; inline while (i < 4) : (i += 1) {
const dma2 = &self.bus.dma[2]; if (self.bus.dma[i].in_progress) {
const dma3 = &self.bus.dma[3]; self.bus.dma[i].step(self);
if (dma0.in_progress) {
dma0.step(self);
return true; return true;
} }
if (dma1.in_progress) {
dma1.step(self);
return true;
}
if (dma2.in_progress) {
dma2.step(self);
return true;
}
if (dma3.in_progress) {
dma3.step(self);
return true;
} }
return false; return false;

View File

@ -46,10 +46,7 @@ pub const Scheduler = struct {
}, },
.TimerOverflow => |id| { .TimerOverflow => |id| {
switch (id) { switch (id) {
0 => cpu.bus.tim[0].onTimerExpire(cpu, late), inline 0...3 => |idx| cpu.bus.tim[idx].onTimerExpire(cpu, late),
1 => cpu.bus.tim[1].onTimerExpire(cpu, late),
2 => cpu.bus.tim[2].onTimerExpire(cpu, late),
3 => cpu.bus.tim[3].onTimerExpire(cpu, late),
} }
}, },
.ApuChannel => |id| { .ApuChannel => |id| {