diff --git a/src/silicon8/cpu.go b/src/silicon8/cpu.go index bdc5ff1..6c86ec5 100644 --- a/src/silicon8/cpu.go +++ b/src/silicon8/cpu.go @@ -1,5 +1,9 @@ package silicon8 +import ( + "fmt" +) + func (cpu *CPU) Start() { cpu.running = true } @@ -15,7 +19,11 @@ func (cpu *CPU) SetCyclesPerFrame(cycles int) { cyclesPerFrame = cycles } -func (cpu *CPU) ClockTick() { +func (cpu *CPU) SetBreakpoints(breakpoints map[int]string) { + cpu.breakpoints = breakpoints +} + +func (cpu *CPU) ClockTick() error { // Tick timers if cpu.dt > 0 { cpu.dt-- @@ -37,8 +45,19 @@ func (cpu *CPU) ClockTick() { } // Run cycles - for i := 0; i < cpu.cyclesPerFrame; i++ { - cpu.Cycle() + if cpu.breakpoints != nil { + for i := 0; i < cpu.cyclesPerFrame; i++ { + cpu.Cycle() + for b, m := range cpu.breakpoints { + if cpu.pc == uint16(b) { + return fmt.Errorf("breakpoint: %s", m) + } + } + } + } else { + for i := 0; i < cpu.cyclesPerFrame; i++ { + cpu.Cycle() + } } // Trigger audio updates if dirty @@ -58,6 +77,8 @@ func (cpu *CPU) ClockTick() { if cpu.WaitForInt == 1 { cpu.WaitForInt = 2 } + + return nil } func (cpu *CPU) Reset(interpreter int) { diff --git a/src/silicon8/types.go b/src/silicon8/types.go index dd01cda..da12107 100644 --- a/src/silicon8/types.go +++ b/src/silicon8/types.go @@ -55,6 +55,7 @@ type CPU struct { typeFixed bool cyclesPerFrame int running bool + breakpoints map[int]string // Quirks flags shiftQuirk bool // Shift result to source register instead of target register