Compare commits

..

11 Commits

Author SHA1 Message Date
Rekai Nyangadzayi Musuka b2ecfd1b6b fix: account for pipeline in obscure bios behaviour 2022-09-19 15:50:05 -03:00
Rekai Nyangadzayi Musuka fbe7d1eaa2 chore: update README.md 2022-09-19 15:50:05 -03:00
Rekai Nyangadzayi Musuka b49543e5f1 fix: advance r15, even when the pipeline is reloaded from the scheduler
The PC would fall behind whenever an IRQ was called because the pipeline
was reloaded (+8 to PC), however that was never actually done by any code

Now, the PC is always incremented when the pipeline is reloaded
2022-09-19 15:50:05 -03:00
Rekai Nyangadzayi Musuka 6ea433dcf1 chore: dump pipeline state on cpu panic 2022-09-19 15:50:05 -03:00
Rekai Nyangadzayi Musuka e9e319209a fix: reimpl THUMB.5 instructions
pipeline branch now passes arm.gba and thumb.gba again

(TODO: Stop rewriting my commits away)
2022-09-19 15:50:05 -03:00
Rekai Nyangadzayi Musuka e0a35ae273 fix: impl workaround for stage2 miscompilation 2022-09-19 15:50:05 -03:00
Rekai Nyangadzayi Musuka 3c1db7ae66 chore: instantly refill the pipeline on flush
I believe this to be necessary in order to get hardware interrupts
working.

thumb.gba test 108 fails but I'm committing anyways (despite the
regression) because this is kind of rebase/merge hell and I have
something that at least sort of works rn
2022-09-19 15:50:05 -03:00
Rekai Nyangadzayi Musuka d38ed7658e fix: reimpl handleInterrupt code 2022-09-19 15:50:05 -03:00
Rekai Nyangadzayi Musuka cd003dcf7a feat: implement basic pipeline
passes arm.gba, thumb.gb and armwrestler, fails in actual games
TODO: run FuzzARM debug specific titles
2022-09-19 15:50:05 -03:00
Rekai Nyangadzayi Musuka 06914983d9 feat: resolve off-by-{word, halfword} errors when printing debug info 2022-09-19 15:50:05 -03:00
Rekai Nyangadzayi Musuka d8d0522b2e feat: reimplement cpu logging 2022-09-19 15:50:05 -03:00
21 changed files with 33 additions and 32 deletions

@ -1 +1 @@
Subproject commit 6a9e37687a4b9ae3c14c9ea148ec51d14e01c7db
Subproject commit 76ec54bf1d13170f1a9998063eecf8087856541a

@ -1 +1 @@
Subproject commit 4f4196fc3bc95c4bd3b12ce2e4a5f1050742cd3c
Subproject commit ee6cb6a17bd8748c3af45467c5dabbe1d56be832

View File

@ -12,7 +12,7 @@ const Apu = @import("apu.zig").Apu;
const DmaTuple = @import("bus/dma.zig").DmaTuple;
const TimerTuple = @import("bus/timer.zig").TimerTuple;
const Scheduler = @import("scheduler.zig").Scheduler;
const FilePaths = @import("../util.zig").FilePaths;
const FilePaths = @import("util.zig").FilePaths;
const io = @import("bus/io.zig");
const Allocator = std.mem.Allocator;
@ -20,7 +20,7 @@ const log = std.log.scoped(.Bus);
const createDmaTuple = @import("bus/dma.zig").create;
const createTimerTuple = @import("bus/timer.zig").create;
const rotr = @import("../util.zig").rotr;
const rotr = @import("util.zig").rotr;
const timings: [2][0x10]u8 = [_][0x10]u8{
// BIOS, Unused, EWRAM, IWRAM, I/0, PALRAM, VRAM, OAM, ROM0, ROM0, ROM1, ROM1, ROM2, ROM2, SRAM, Unused

View File

@ -1,7 +1,7 @@
const std = @import("std");
const SDL = @import("sdl2");
const io = @import("bus/io.zig");
const util = @import("../util.zig");
const util = @import("util.zig");
const Arm7tdmi = @import("cpu.zig").Arm7tdmi;
const Scheduler = @import("scheduler.zig").Scheduler;
@ -9,7 +9,7 @@ const Scheduler = @import("scheduler.zig").Scheduler;
const SoundFifo = std.fifo.LinearFifo(u8, .{ .Static = 0x20 });
const AudioDeviceId = SDL.SDL_AudioDeviceID;
const intToBytes = @import("../util.zig").intToBytes;
const intToBytes = @import("util.zig").intToBytes;
const log = std.log.scoped(.APU);
pub const host_sample_rate = 1 << 15;

View File

@ -2,8 +2,8 @@ const std = @import("std");
const Allocator = std.mem.Allocator;
const log = std.log.scoped(.Backup);
const escape = @import("../../util.zig").escape;
const span = @import("../../util.zig").span;
const escape = @import("../util.zig").escape;
const span = @import("../util.zig").span;
const backup_kinds = [6]Needle{
.{ .str = "EEPROM_V", .kind = .Eeprom },

View File

@ -1,5 +1,5 @@
const std = @import("std");
const util = @import("../../util.zig");
const util = @import("../util.zig");
const DmaControl = @import("io.zig").DmaControl;
const Bus = @import("../Bus.zig");

View File

@ -3,7 +3,7 @@ const builtin = @import("builtin");
const timer = @import("timer.zig");
const dma = @import("dma.zig");
const apu = @import("../apu.zig");
const util = @import("../../util.zig");
const util = @import("../util.zig");
const Bit = @import("bitfield").Bit;
const Bitfield = @import("bitfield").Bitfield;

View File

@ -1,5 +1,5 @@
const std = @import("std");
const util = @import("../../util.zig");
const util = @import("../util.zig");
const TimerControl = @import("io.zig").TimerControl;
const Io = @import("io.zig").Io;

View File

@ -1,12 +1,12 @@
const std = @import("std");
const util = @import("../util.zig");
const util = @import("util.zig");
const Bus = @import("Bus.zig");
const Bit = @import("bitfield").Bit;
const Bitfield = @import("bitfield").Bitfield;
const Scheduler = @import("scheduler.zig").Scheduler;
const FilePaths = @import("../util.zig").FilePaths;
const Logger = @import("../util.zig").Logger;
const FilePaths = @import("util.zig").FilePaths;
const Logger = @import("util.zig").Logger;
const File = std.fs.File;

View File

@ -4,7 +4,7 @@ const Bus = @import("../../Bus.zig");
const Arm7tdmi = @import("../../cpu.zig").Arm7tdmi;
const InstrFn = @import("../../cpu.zig").arm.InstrFn;
const sext = @import("../../../util.zig").sext;
const sext = @import("../../util.zig").sext;
pub fn branch(comptime L: bool) InstrFn {
return struct {

View File

@ -4,8 +4,8 @@ const Bus = @import("../../Bus.zig");
const Arm7tdmi = @import("../../cpu.zig").Arm7tdmi;
const InstrFn = @import("../../cpu.zig").arm.InstrFn;
const sext = @import("../../../util.zig").sext;
const rotr = @import("../../../util.zig").rotr;
const sext = @import("../../util.zig").sext;
const rotr = @import("../../util.zig").rotr;
pub fn halfAndSignedDataTransfer(comptime P: bool, comptime U: bool, comptime I: bool, comptime W: bool, comptime L: bool) InstrFn {
return struct {

View File

@ -7,7 +7,7 @@ const PSR = @import("../../cpu.zig").PSR;
const log = std.log.scoped(.PsrTransfer);
const rotr = @import("../../../util.zig").rotr;
const rotr = @import("../../util.zig").rotr;
pub fn psrTransfer(comptime I: bool, comptime R: bool, comptime kind: u2) InstrFn {
return struct {

View File

@ -4,7 +4,7 @@ const Bus = @import("../../Bus.zig");
const Arm7tdmi = @import("../../cpu.zig").Arm7tdmi;
const InstrFn = @import("../../cpu.zig").arm.InstrFn;
const rotr = @import("../../../util.zig").rotr;
const rotr = @import("../../util.zig").rotr;
pub fn singleDataSwap(comptime B: bool) InstrFn {
return struct {

View File

@ -1,12 +1,12 @@
const std = @import("std");
const util = @import("../../../util.zig");
const util = @import("../../util.zig");
const shifter = @import("../barrel_shifter.zig");
const Bus = @import("../../Bus.zig");
const Arm7tdmi = @import("../../cpu.zig").Arm7tdmi;
const InstrFn = @import("../../cpu.zig").arm.InstrFn;
const rotr = @import("../../../util.zig").rotr;
const rotr = @import("../../util.zig").rotr;
pub fn singleDataTransfer(comptime I: bool, comptime P: bool, comptime U: bool, comptime B: bool, comptime W: bool, comptime L: bool) InstrFn {
return struct {

View File

@ -3,7 +3,7 @@ const std = @import("std");
const Arm7tdmi = @import("../cpu.zig").Arm7tdmi;
const CPSR = @import("../cpu.zig").PSR;
const rotr = @import("../../util.zig").rotr;
const rotr = @import("../util.zig").rotr;
pub fn execute(comptime S: bool, cpu: *Arm7tdmi, opcode: u32) u32 {
var result: u32 = undefined;

View File

@ -3,7 +3,7 @@ const Arm7tdmi = @import("../../cpu.zig").Arm7tdmi;
const InstrFn = @import("../../cpu.zig").thumb.InstrFn;
const checkCond = @import("../../cpu.zig").checkCond;
const sext = @import("../../../util.zig").sext;
const sext = @import("../../util.zig").sext;
pub fn fmt16(comptime cond: u4) InstrFn {
return struct {

View File

@ -4,8 +4,7 @@ const Bus = @import("../../Bus.zig");
const Arm7tdmi = @import("../../cpu.zig").Arm7tdmi;
const InstrFn = @import("../../cpu.zig").thumb.InstrFn;
const rotr = @import("../../../util.zig").rotr;
const sext = @import("../../../util.zig").sext;
const rotr = @import("../../util.zig").rotr;
pub fn fmt6(comptime rd: u3) InstrFn {
return struct {
@ -19,6 +18,8 @@ pub fn fmt6(comptime rd: u3) InstrFn {
}.inner;
}
const sext = @import("../../util.zig").sext;
pub fn fmt78(comptime op: u2, comptime T: bool) InstrFn {
return struct {
fn inner(cpu: *Arm7tdmi, bus: *Bus, opcode: u16) void {

View File

@ -4,8 +4,8 @@ const SDL = @import("sdl2");
const Bus = @import("Bus.zig");
const Scheduler = @import("scheduler.zig").Scheduler;
const Arm7tdmi = @import("cpu.zig").Arm7tdmi;
const FpsTracker = @import("../util.zig").FpsTracker;
const FilePaths = @import("../util.zig").FilePaths;
const FpsTracker = @import("util.zig").FpsTracker;
const FilePaths = @import("util.zig").FilePaths;
const Timer = std.time.Timer;
const Thread = std.Thread;

View File

@ -1,9 +1,9 @@
const std = @import("std");
const builtin = @import("builtin");
const Log2Int = std.math.Log2Int;
const Arm7tdmi = @import("core/cpu.zig").Arm7tdmi;
const Arm7tdmi = @import("cpu.zig").Arm7tdmi;
const allow_unhandled_io = @import("core/emu.zig").allow_unhandled_io;
const allow_unhandled_io = @import("emu.zig").allow_unhandled_io;
// Sign-Extend value of type `T` to type `U`
pub fn sext(comptime T: type, comptime U: type, value: T) T {

View File

@ -8,7 +8,7 @@ const Gui = @import("platform.zig").Gui;
const Bus = @import("core/Bus.zig");
const Arm7tdmi = @import("core/cpu.zig").Arm7tdmi;
const Scheduler = @import("core/scheduler.zig").Scheduler;
const FilePaths = @import("util.zig").FilePaths;
const FilePaths = @import("core/util.zig").FilePaths;
const Allocator = std.mem.Allocator;
const log = std.log.scoped(.Cli);

View File

@ -5,9 +5,9 @@ const emu = @import("core/emu.zig");
const Apu = @import("core/apu.zig").Apu;
const Arm7tdmi = @import("core/cpu.zig").Arm7tdmi;
const Scheduler = @import("core/scheduler.zig").Scheduler;
const FpsTracker = @import("util.zig").FpsTracker;
const FpsTracker = @import("core/util.zig").FpsTracker;
const span = @import("util.zig").span;
const span = @import("core/util.zig").span;
const pitch = @import("core/ppu.zig").framebuf_pitch;
const scale = @import("core/emu.zig").win_scale;