chore: comment ARM MSR code + Audio issues

This commit is contained in:
Rekai Nyangadzayi Musuka 2022-04-30 22:17:34 -05:00
parent 640b1f7c5d
commit 68012f84d3
3 changed files with 10 additions and 2 deletions

View File

@ -30,6 +30,8 @@ pub const Apu = struct {
cnt: io.SoundControl, cnt: io.SoundControl,
sampling_cycle: u2, sampling_cycle: u2,
// TODO: Research whether we can have Atomic Pointers
stream: *SDL.SDL_AudioStream, stream: *SDL.SDL_AudioStream,
sched: *Scheduler, sched: *Scheduler,

View File

@ -24,12 +24,15 @@ pub fn psrTransfer(comptime I: bool, comptime R: bool, comptime kind: u2) InstrF
// MSR // MSR
const field_mask = @truncate(u4, opcode >> 16 & 0xF); const field_mask = @truncate(u4, opcode >> 16 & 0xF);
const rm_idx = opcode & 0xF; const rm_idx = opcode & 0xF;
const right = if (I) rotr(u32, opcode & 0xFF, (opcode >> 8 & 0xF) << 1) else cpu.r[rm_idx]; const right = if (I) rotr(u32, opcode & 0xFF, (opcode >> 8 & 0xF) * 2) else cpu.r[rm_idx];
if (R and !cpu.hasSPSR()) log.err("Tried to write to SPSR in User/System Mode", .{}); if (R and !cpu.hasSPSR()) log.err("Tried to write to SPSR in User/System Mode", .{});
if (R) { if (R) {
if (cpu.isPrivileged()) cpu.spsr.raw = fieldMask(&cpu.spsr, field_mask, right); // arm.gba seems to expect the SPSR to do somethign in SYS mode,
// so we just assume that despite writing to the SPSR in USR or SYS mode
// being UNPREDICTABLE, it just magically has a working SPSR somehow
cpu.spsr.raw = fieldMask(&cpu.spsr, field_mask, right);
} else { } else {
if (cpu.isPrivileged()) cpu.setCpsr(fieldMask(&cpu.cpsr, field_mask, right)); if (cpu.isPrivileged()) cpu.setCpsr(fieldMask(&cpu.cpsr, field_mask, right));
} }
@ -41,6 +44,8 @@ pub fn psrTransfer(comptime I: bool, comptime R: bool, comptime kind: u2) InstrF
} }
fn fieldMask(psr: *const PSR, field_mask: u4, right: u32) u32 { fn fieldMask(psr: *const PSR, field_mask: u4, right: u32) u32 {
// This bitwise ORs bits 3 and 0 of the field mask into a u2
// We do this because we only care about bits 7:0 and 31:28 of the CPSR
const bits = @truncate(u2, (field_mask >> 2 & 0x2) | (field_mask & 1)); const bits = @truncate(u2, (field_mask >> 2 & 0x2) | (field_mask & 1));
const mask: u32 = switch (bits) { const mask: u32 = switch (bits) {

View File

@ -266,6 +266,7 @@ fn initAudio(apu: *Apu) SDL.SDL_AudioDeviceID {
return dev; return dev;
} }
// FIXME: Sometimes, we hear garbage upon program start. Why?
export fn audioCallback(userdata: ?*anyopaque, stream: [*c]u8, len: c_int) void { export fn audioCallback(userdata: ?*anyopaque, stream: [*c]u8, len: c_int) void {
const apu = @ptrCast(*Apu, @alignCast(8, userdata)); const apu = @ptrCast(*Apu, @alignCast(8, userdata));
_ = SDL.SDL_AudioStreamGet(apu.stream, stream, len); _ = SDL.SDL_AudioStreamGet(apu.stream, stream, len);