Skip to content

Commit

Permalink
Implement internal PPU registers (#28)
Browse files Browse the repository at this point in the history
  • Loading branch information
sophiajt authored Sep 29, 2022
1 parent cf35274 commit 4b102ab
Show file tree
Hide file tree
Showing 4 changed files with 210 additions and 115 deletions.
2 changes: 2 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ add_jakt_executable(jakt_nes
src/apu.jakt
src/cart.jakt
src/cpu.jakt
src/debugger.jakt
src/joypad.jakt
src/ppu.jakt
src/sdl.jakt
src/system.jakt
Expand Down
83 changes: 42 additions & 41 deletions src/cpu.jakt
Original file line number Diff line number Diff line change
Expand Up @@ -218,6 +218,7 @@ class CPU {
public function nmi(mut this) {
let nmi_vector = .system.read_word(address: 0xfffa)

.clock += 7
.push_word(value: .pc)
.push_status()

Expand Down Expand Up @@ -1087,57 +1088,57 @@ class CPU {
let intermediate: u8 = match opcode {
0xa9 => {
let tmp = .immediate()
.clock += 2
.pc += 2
.clock += 2

yield tmp
}
0xa5 => {
let tmp = .zero_page()
.clock += 3
.pc += 2
.clock += 3

yield tmp
}
0xb5 => {
let tmp = .zero_page_x()
.clock += 4
.pc += 2
.clock += 4

yield tmp
}
0xad => {
let tmp = .absolute()
.clock += 4
.pc += 3
.clock += 4

yield tmp
}
0xbd => {
let tmp = .absolute_x(check_extra_clock: true)
.clock += 4
.pc += 3
.clock += 4

yield tmp
}
0xb9 => {
let tmp = .absolute_y(check_extra_clock: true)
.clock += 4
.pc += 3
.clock += 4

yield tmp
}
0xa1 => {
let tmp = .indirect_zero_page_x()
.clock += 6
.pc += 2
.clock += 6

yield tmp
}
0xb1 => {
let tmp = .indirect_zero_page_y(check_extra_clock: true)
.clock += 6
.pc += 2
.clock += 5

yield tmp
}
Expand All @@ -1164,29 +1165,29 @@ class CPU {
}
0xa6 => {
let tmp = .zero_page()
.clock += 3
.pc += 2
.clock += 3

yield tmp
}
0xb6 => {
let tmp = .zero_page_y()
.clock += 4
.pc += 2
.clock += 4

yield tmp
}
0xae => {
let tmp = .absolute()
.clock += 4
.pc += 3
.clock += 4

yield tmp
}
0xbe => {
let tmp = .absolute_y(check_extra_clock: true)
.clock += 4
.pc += 3
.clock += 4

yield tmp
}
Expand All @@ -1208,36 +1209,36 @@ class CPU {
let intermediate: u8 = match opcode {
0xa0 => {
let tmp = .immediate()
.clock += 2
.pc += 2
.clock += 2

yield tmp
}
0xa4 => {
let tmp = .zero_page()
.clock += 3
.pc += 2
.clock += 3

yield tmp
}
0xb4 => {
let tmp = .zero_page_x()
.clock += 4
.pc += 2
.clock += 4

yield tmp
}
0xac => {
let tmp = .absolute()
.clock += 4
.pc += 3
.clock += 4

yield tmp
}
0xbc => {
let tmp = .absolute_x(check_extra_clock: true)
.clock += 4
.pc += 3
.clock += 4

yield tmp
}
Expand All @@ -1259,58 +1260,58 @@ class CPU {
match opcode {
0x85 => {
// Zero page
.clock += 3
.pc += 2
.clock += 3

let address = .system.read_byte(address: arg_address)
.system.write_byte(address: address as! u16, value: .a)
}
0x95 => {
// Zero page, x
.clock += 4
.pc += 2
.clock += 4

let address = .system.read_byte(address: arg_address)
// TODO: does this wrap around the zero page?
.system.write_byte(address: unchecked_add<u8>(address, .x) as! u16, value: .a)
}
0x8d => {
// Absolute
.clock += 4
.pc += 3
.clock += 4

let address = .system.read_word(address: arg_address)
.system.write_byte(address, value: .a)
}
0x9d => {
// Absolute, X
.clock += 5
.pc += 3
.clock += 5

let address = .system.read_word(address: arg_address)
.system.write_byte(address: address + .x as! u16, value: .a)
}
0x99 => {
// Absolute, Y
.clock += 5
.pc += 3
.clock += 5

let address = .system.read_word(address: arg_address)
.system.write_byte(address: address + .y as! u16, value: .a)
}
0x81 => {
// Indirect, X
.clock += 6
.pc += 2
.clock += 6

let address = unchecked_add<u8>(.system.read_byte(address: arg_address), .x) as! u16
let new_address = .system.read_word_wrapped(address)
.system.write_byte(address: new_address, value: .a)
}
0x91 => {
// Indirect, Y
.clock += 6
.pc += 2
.clock += 6

let address = (.system.read_byte(address: arg_address)) as! u16

Expand All @@ -1332,25 +1333,25 @@ class CPU {
match opcode {
0x86 => {
// Zero page
.clock += 3
.pc += 2
.clock += 3

let address = .system.read_byte(address: arg_address)
.system.write_byte(address: address as! u16, value: .x)
}
0x96 => {
// Zero page, Y
.clock += 4
.pc += 2
.clock += 4

let address = .system.read_byte(address: arg_address)
// TODO: does this wrap around the zero page?
.system.write_byte(address: unchecked_add<u8>(address, .y) as! u16, value: .x)
}
0x8e => {
// Absolute
.clock += 4
.pc += 3
.clock += 4

let address = .system.read_word(address: arg_address)
.system.write_byte(address, value: .x)
Expand All @@ -1367,25 +1368,25 @@ class CPU {
match opcode {
0x84 => {
// Zero page
.clock += 3
.pc += 2
.clock += 3

let address = .system.read_byte(address: arg_address)
.system.write_byte(address: address as! u16, value: .y)
}
0x94 => {
// Zero page, X
.clock += 4
.pc += 2
.clock += 4

let address = .system.read_byte(address: arg_address)
// TODO: does this wrap around the zero page?
.system.write_byte(address: unchecked_add<u8>(address, .x) as! u16, value: .y)
}
0x8c => {
// Absolute
.clock += 4
.pc += 3
.clock += 4

let address = .system.read_word(address: arg_address)
.system.write_byte(address, value: .y)
Expand Down Expand Up @@ -1544,7 +1545,7 @@ class CPU {

function php(mut this) {
.pc += 1
.clock += 4
.clock += 3

.push_status()
}
Expand Down Expand Up @@ -1572,71 +1573,71 @@ class CPU {
if not .negative {
.branch()
} else {
.clock += 2
.pc += 2
.clock += 2
}
}

function bmi(mut this) {
if .negative {
.branch()
} else {
.clock += 2
.pc += 2
.clock += 2
}
}

function bvc(mut this) {
if not .overflow {
.branch()
} else {
.clock += 2
.pc += 2
.clock += 2
}
}

function bvs(mut this) {
if .overflow {
.branch()
} else {
.clock += 2
.pc += 2
.clock += 2
}
}

function bcc(mut this) {
if not .carry {
.branch()
} else {
.clock += 2
.pc += 2
.clock += 2
}
}

function bcs(mut this) {
if .carry {
.branch()
} else {
.clock += 2
.pc += 2
.clock += 2
}
}

function bne(mut this) {
if not .zero {
.branch()
} else {
.clock += 2
.pc += 2
.clock += 2
}
}

function beq(mut this) {
if .zero {
.branch()
} else {
.clock += 2
.pc += 2
.clock += 2
}
}

Expand Down Expand Up @@ -1701,16 +1702,16 @@ class CPU {

let value = match opcode {
0x24 => {
.clock += 3
.pc += 2
.clock += 3

let address = .system.read_byte(address: arg_address)
let value = .system.read_byte(address: address as! u16)
yield value
}
0x2c => {
.clock += 4
.pc += 3
.clock += 4

let address = .system.read_word(address: arg_address)
let value = .system.read_byte(address: address)
Expand Down
1 change: 0 additions & 1 deletion src/main.jakt
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@ function main(args: [String]) {
mut joypad = system.joypad

loop {
// for x in 1..100000 {
let in_vblank_before = system.ppu.in_vblank

let cpu_clocks_before = cpu.clock
Expand Down
Loading

0 comments on commit 4b102ab

Please sign in to comment.