Skip to content

Commit f4f55dd

Browse files
committed
Encapsulate cpu debugging functionality in its own structure. Makes CPU less aware of logging.
Moved cpu concepts to cpu package.
1 parent d3d50f4 commit f4f55dd

19 files changed

+735
-697
lines changed

src/debugger/controller.go

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import (
1111

1212
const DEBUG_X_OFFSET = 300
1313

14-
type Debugger struct {
14+
type GuiDebugger struct {
1515
chrPaletteSelector uint8
1616
overlayTileIdx bool
1717
overlayAttributeTable bool
@@ -26,11 +26,11 @@ type Panel interface {
2626
Draw()
2727
}
2828

29-
func NewDebugger(emulator *nes.Nes) Debugger {
29+
func NewDebugger(emulator *nes.Nes) GuiDebugger {
3030
font := raylib.LoadFont("./assets/Pixel_NES.otf")
3131
raylib.GuiLoadStyle("./assets/style.rgs")
3232

33-
return Debugger{
33+
return GuiDebugger{
3434
chrPaletteSelector: 0,
3535
overlayTileIdx: false,
3636
overlayAttributeTable: false,
@@ -41,19 +41,20 @@ func NewDebugger(emulator *nes.Nes) Debugger {
4141
}
4242
}
4343

44-
func (dbg *Debugger) Close() {
44+
func (dbg *GuiDebugger) Close() {
4545
defer raylib.UnloadFont(dbg.font)
4646
}
4747

48-
func (dbg *Debugger) Tick() {
48+
func (dbg *GuiDebugger) Tick() {
4949
dbg.listenKeyboard()
5050
raylib.DrawFPS(0, 0)
51+
5152
dbg.ppuDebugger.Draw()
5253
dbg.breakpointDebugger.Draw()
5354
//dbg.DrawDebugger(dbg.emulator)
5455
}
5556

56-
func (dbg *Debugger) DrawDebugger(emulator *nes.Nes) {
57+
func (dbg *GuiDebugger) DrawDebugger(emulator *nes.Nes) {
5758
x := DEBUG_X_OFFSET
5859
y := 10
5960

@@ -106,7 +107,7 @@ func (dbg *Debugger) DrawDebugger(emulator *nes.Nes) {
106107
//drawObjectAttributeEntries(emulator)
107108
}
108109

109-
func (dbg *Debugger) listenKeyboard() {
110+
func (dbg *GuiDebugger) listenKeyboard() {
110111
if raylib.IsKeyPressed(raylib.KeyP) {
111112
//dbg.chrPaletteSelector += 1
112113
//if dbg.chrPaletteSelector > (8 - 1) {
@@ -151,7 +152,7 @@ func drawASM(console *nes.Nes) {
151152
}
152153
}
153154

154-
func drawPalettes(console *nes.Nes, scale int, xOffset int, yOffset int, debuggerGUI *Debugger) {
155+
func drawPalettes(console *nes.Nes, scale int, xOffset int, yOffset int, debuggerGUI *GuiDebugger) {
155156
// Draw defined palettes (8)
156157
x := xOffset
157158
y := yOffset
@@ -193,7 +194,7 @@ func drawColorWatch(coordX int, coordY int, width int, height int, color color.C
193194
raylib.DrawRectangle(coordX, coordY, width, height, pixelColor2RaylibColor(color))
194195
}
195196

196-
func drawCHR(console *nes.Nes, scale int, xOffset int, yOffset int, font *raylib.Font, debuggerGUI *Debugger) {
197+
func drawCHR(console *nes.Nes, scale int, xOffset int, yOffset int, font *raylib.Font, debuggerGUI *GuiDebugger) {
197198
drawIndexes := false
198199

199200
if raylib.IsKeyDown(raylib.KeyZero) {

src/main.go

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"github.com/raulferras/nes-golang/src/nes/gamePak"
1111
"github.com/raulferras/nes-golang/src/nes/types"
1212
"github.com/raulferras/nes-golang/src/utils"
13+
"image"
1314
"log"
1415
"math/rand"
1516
_ "net/http/pprof"
@@ -97,15 +98,14 @@ func loop(console *nes.Nes) {
9798
console.TickForTime(dt)
9899
}
99100

100-
// Draw
101+
// Draw --------------------
101102
r.BeginDrawing()
102103
r.ClearBackground(r.Black)
103-
drawEmulation(console)
104+
drawEmulation(console.Frame())
104105
//drawBackgroundTileIDs(console)
105106
debuggerGUI.Tick()
106-
//
107-
//r.GuiWindowBox(r.Rectangle{0, 0, 100, 100}, "??")
108107
r.EndDrawing()
108+
// End Draw --------------------
109109

110110
cpuAdvance = true
111111
}
@@ -114,20 +114,10 @@ func loop(console *nes.Nes) {
114114
console.Stop()
115115
}
116116

117-
func drawEmulation(console *nes.Nes) {
118-
frame := console.Frame()
119-
117+
func drawEmulation(frame *image.RGBA) {
120118
padding := 20
121119
paddingY := 20
122-
r.DrawRectangle(padding-1, paddingY-1, types.SCREEN_WIDTH+2, types.SCREEN_HEIGHT+2, r.RayWhite) /*
123-
for i := 0; i < types.SCREEN_WIDTH*types.SCREEN_HEIGHT; i++ {
124-
pixel := frame.Pixels[i]
125-
color := utils.RGBA2raylibColor(pixel)
126-
x := i % types.SCREEN_WIDTH
127-
y := i / types.SCREEN_WIDTH
128-
129-
r.DrawPixel(padding+x, paddingY+y, color)
130-
}*/
120+
r.DrawRectangle(padding-1, paddingY-1, types.SCREEN_WIDTH+2, types.SCREEN_HEIGHT+2, r.RayWhite)
131121
for x := 0; x < types.SCREEN_WIDTH; x++ {
132122
for y := 0; y < types.SCREEN_HEIGHT; y++ {
133123
pixel := frame.At(x, y)

src/nes/NesDebugger.go renamed to src/nes/Debugger.go

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ import (
77
"image/color"
88
)
99

10-
// NesDebugger offers an api to interact externally with
11-
// stuff from Nes
12-
type NesDebugger struct {
10+
// Debugger offers an api to interact externally with
11+
// NES components
12+
type Debugger struct {
1313
debug bool
1414
cpu *Cpu6502
1515
ppu *ppu.Ppu2c02
@@ -20,8 +20,8 @@ type NesDebugger struct {
2020
DebugPPU bool
2121
}
2222

23-
func CreateNesDebugger(logPath string, debug bool, debugPPU bool, maxCPUCycle int64) *NesDebugger {
24-
return &NesDebugger{
23+
func CreateNesDebugger(logPath string, debug bool, debugPPU bool, maxCPUCycle int64) *Debugger {
24+
return &Debugger{
2525
debug: debug,
2626
cpu: nil,
2727
ppu: nil,
@@ -32,15 +32,15 @@ func CreateNesDebugger(logPath string, debug bool, debugPPU bool, maxCPUCycle in
3232
}
3333
}
3434

35-
func (debugger *NesDebugger) Disassembled() map[types.Address]string {
35+
func (debugger *Debugger) Disassembled() map[types.Address]string {
3636
return debugger.disassembled
3737
}
3838

39-
func (debugger *NesDebugger) ProgramCounter() types.Address {
39+
func (debugger *Debugger) ProgramCounter() types.Address {
4040
return debugger.cpu.ProgramCounter()
4141
}
4242

43-
func (debugger *NesDebugger) N() bool {
43+
func (debugger *Debugger) N() bool {
4444
bit := debugger.cpu.Registers().NegativeFlag()
4545
if bit == 1 {
4646
return true
@@ -49,7 +49,7 @@ func (debugger *NesDebugger) N() bool {
4949
return false
5050
}
5151

52-
func (debugger *NesDebugger) O() bool {
52+
func (debugger *Debugger) O() bool {
5353
bit := debugger.cpu.Registers().OverflowFlag()
5454
if bit == 1 {
5555
return true
@@ -58,7 +58,7 @@ func (debugger *NesDebugger) O() bool {
5858
return false
5959
}
6060

61-
func (debugger *NesDebugger) B() bool {
61+
func (debugger *Debugger) B() bool {
6262
bit := debugger.cpu.Registers().BreakFlag()
6363
if bit == 1 {
6464
return true
@@ -67,7 +67,7 @@ func (debugger *NesDebugger) B() bool {
6767
return false
6868
}
6969

70-
func (debugger *NesDebugger) D() bool {
70+
func (debugger *Debugger) D() bool {
7171
bit := debugger.cpu.Registers().DecimalFlag()
7272
if bit == 1 {
7373
return true
@@ -76,7 +76,7 @@ func (debugger *NesDebugger) D() bool {
7676
return false
7777
}
7878

79-
func (debugger *NesDebugger) I() bool {
79+
func (debugger *Debugger) I() bool {
8080
bit := debugger.cpu.Registers().InterruptFlag()
8181
if bit == 1 {
8282
return true
@@ -85,7 +85,7 @@ func (debugger *NesDebugger) I() bool {
8585
return false
8686
}
8787

88-
func (debugger *NesDebugger) Z() bool {
88+
func (debugger *Debugger) Z() bool {
8989
bit := debugger.cpu.Registers().ZeroFlag()
9090
if bit == 1 {
9191
return true
@@ -94,7 +94,7 @@ func (debugger *NesDebugger) Z() bool {
9494
return false
9595
}
9696

97-
func (debugger *NesDebugger) C() bool {
97+
func (debugger *Debugger) C() bool {
9898
bit := debugger.cpu.Registers().CarryFlag()
9999
if bit == 1 {
100100
return true
@@ -103,24 +103,24 @@ func (debugger *NesDebugger) C() bool {
103103
return false
104104
}
105105

106-
func (debugger *NesDebugger) ARegister() byte {
106+
func (debugger *Debugger) ARegister() byte {
107107
return debugger.cpu.registers.A
108108
}
109109

110-
func (debugger *NesDebugger) XRegister() byte {
110+
func (debugger *Debugger) XRegister() byte {
111111
return debugger.cpu.registers.X
112112
}
113113

114-
func (debugger *NesDebugger) YRegister() byte {
114+
func (debugger *Debugger) YRegister() byte {
115115
return debugger.cpu.registers.Y
116116
}
117117

118118
// PPU Related
119-
func (debugger *NesDebugger) PatternTable(patternTable byte, palette uint8) image.RGBA {
119+
func (debugger *Debugger) PatternTable(patternTable byte, palette uint8) image.RGBA {
120120
return debugger.ppu.PatternTable(patternTable, palette)
121121
}
122122

123-
func (debugger *NesDebugger) GetPaletteFromRam(paletteIndex uint8) [4]color.Color {
123+
func (debugger *Debugger) GetPaletteFromRam(paletteIndex uint8) [4]color.Color {
124124
var colors [4]color.Color
125125

126126
colors[0] = debugger.ppu.GetRGBColor(paletteIndex, 0)
@@ -131,10 +131,10 @@ func (debugger *NesDebugger) GetPaletteFromRam(paletteIndex uint8) [4]color.Colo
131131
return colors
132132
}
133133

134-
func (debugger *NesDebugger) GetPaletteColorFromPaletteRam(paletteIndex byte, colorIndex byte) byte {
134+
func (debugger *Debugger) GetPaletteColorFromPaletteRam(paletteIndex byte, colorIndex byte) byte {
135135
return debugger.ppu.GetPaletteColor(paletteIndex, colorIndex)
136136
}
137137

138-
func (debugger *NesDebugger) OAM(index byte) []byte {
138+
func (debugger *Debugger) OAM(index byte) []byte {
139139
return debugger.ppu.Oam(index)
140140
}

src/nes/Nes.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package nes
22

33
import (
44
"github.com/FMNSSun/hexit"
5+
cpu2 "github.com/raulferras/nes-golang/src/nes/cpu"
56
"github.com/raulferras/nes-golang/src/nes/gamePak"
67
"github.com/raulferras/nes-golang/src/nes/ppu"
78
"github.com/raulferras/nes-golang/src/nes/types"
@@ -13,19 +14,19 @@ type Nes struct {
1314
ppu *ppu.Ppu2c02
1415

1516
systemClockCounter byte // Controls how many times to call each processor
16-
debug *NesDebugger
17+
debug *Debugger
1718
vBlankCount byte
1819
stopped bool
1920
}
2021

21-
func CreateNes(gamePak *gamePak.GamePak, debugger *NesDebugger) *Nes {
22+
func CreateNes(gamePak *gamePak.GamePak, debugger *Debugger) *Nes {
2223
hexit.BuildTable()
2324
thePPU := ppu.CreatePPU(gamePak, debugger.DebugPPU, debugger.logPath+"/ppu.log")
2425

2526
cpuBus := newNESCPUMemory(thePPU, gamePak)
2627
cpu := CreateCPU(
2728
cpuBus,
28-
Cpu6502DebugOptions{debugger.debug, debugger.logPath + "/cpu.log"},
29+
cpu2.NewDebugger(debugger.debug, debugger.logPath+"/cpu.log"),
2930
)
3031
debugger.cpu = cpu
3132
debugger.ppu = thePPU
@@ -122,7 +123,7 @@ func (nes *Nes) Stopped() bool {
122123
return nes.stopped
123124
}
124125

125-
func (nes *Nes) Debugger() *NesDebugger {
126+
func (nes *Nes) Debugger() *Debugger {
126127
return nes.debug
127128
}
128129

src/nes/TestsRoms_test.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package nes
33
import (
44
"bufio"
55
"fmt"
6+
"github.com/raulferras/nes-golang/src/nes/cpu"
67
gamePak2 "github.com/raulferras/nes-golang/src/nes/gamePak"
78
"os"
89
"testing"
@@ -33,12 +34,12 @@ func TestNestest(t *testing.T) {
3334
}
3435
}
3536

36-
nes.cpu.Logger.Close()
37+
nes.cpu.debugger.Stop()
3738
// Compare logs
38-
compareLogs(t, nes.cpu.Logger.Snapshots())
39+
compareLogs(t, nes.cpu.debugger.Logger.Snapshots())
3940
}
4041

41-
func compareLogs(t *testing.T, snapshots []CpuState) {
42+
func compareLogs(t *testing.T, snapshots []cpu.CpuState) {
4243
fmt.Println("Comparing state")
4344

4445
file, err := os.Open("./../../assets/roms/nestest/nestest.log")
@@ -53,7 +54,7 @@ func compareLogs(t *testing.T, snapshots []CpuState) {
5354
for i, state := range snapshots {
5455
scanner.Scan()
5556
nesTestLine := scanner.Text()
56-
nesTestState := CreateStateFromNesTestLine(nesTestLine)
57+
nesTestState := cpu.CreateStateFromNesTestLine(nesTestLine)
5758
if !state.RegistersEquals(nesTestState) {
5859
msg := fmt.Sprintf("Error in iteration %d\n", i+1)
5960
msg += fmt.Sprintf("Expected: %s\n", nesTestState.ToString())
@@ -69,6 +70,6 @@ func TestCPUDummyReads(t *testing.T) {
6970
t.Skip()
7071
gamePak := gamePak2.CreateGamePakFromROMFile("./../../tests/roms/cpu_dummy_reads.nes")
7172

72-
nes := CreateNes(&gamePak, &NesDebugger{})
73+
nes := CreateNes(&gamePak, &Debugger{})
7374
nes.Start()
7475
}

src/nes/cpu/addressMode.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package cpu
2+
3+
// AddressMode is an enum of the available Addressing Modes in this cpu
4+
type AddressMode int
5+
6+
const (
7+
Implicit AddressMode = iota
8+
Immediate
9+
ZeroPage
10+
ZeroPageX
11+
ZeroPageY
12+
Absolute
13+
AbsoluteXIndexed
14+
AbsoluteYIndexed
15+
Indirect
16+
IndirectX
17+
IndirectY
18+
Relative
19+
)

0 commit comments

Comments
 (0)