Skip to content

Commit 1bbff11

Browse files
committed
add test for classic byte rendering
1 parent 910b49e commit 1bbff11

File tree

3 files changed

+66
-7
lines changed

3 files changed

+66
-7
lines changed

tests/src/main.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,14 @@ fn main() {
3434

3535
// run tests
3636
if options.test {
37+
score::test_render();
38+
println!("score rendering works!");
39+
pushdown::test();
40+
println!("pushdown works!");
3741
rng::test();
3842
println!("rng seeds are the same!");
3943
sps::test();
4044
println!("sps is the same!");
41-
pushdown::test();
42-
println!("pushdown works!");
4345
}
4446

4547
// print SPS sequences

tests/src/score.rs

Lines changed: 40 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,55 @@
11
use rusticnes_core::nes::NesState;
2-
use crate::labels;
2+
use crate::{labels, score, util};
3+
4+
pub fn test_render() {
5+
let mut emu = util::emulator(None);
6+
7+
let rendered_score = |emu: &mut NesState| {
8+
let vram_offset = emu.ppu.current_vram_address - 6;
9+
10+
(vram_offset..vram_offset + 6)
11+
.map(|i| emu.ppu.read_byte(&mut *emu.mapper, i))
12+
.collect::<Vec<u8>>()
13+
};
14+
15+
// check classic score rendering works
16+
17+
for i in 0..1000 {
18+
let score = i * 100000;
19+
20+
score::set(&mut emu, score);
21+
emu.registers.pc = labels::get("renderClassicScore");
22+
util::run_to_return(&mut emu, false);
23+
24+
assert_eq!((i % 16) as u8, rendered_score(&mut emu)[0]);
25+
}
26+
27+
// check score cap works
28+
29+
let score = 8952432;
30+
score::set(&mut emu, score);
31+
emu.registers.pc = labels::get("renderScoreCap");
32+
util::run_to_return(&mut emu, false);
33+
assert_eq!(vec![9, 9, 9, 9, 9, 9], rendered_score(&mut emu));
34+
}
335

436
pub fn set(emu: &mut NesState, score: u32) {
537
let score_addr = labels::get("score");
638
let binscore_addr = labels::get("binScore");
7-
let bcd_str = format!("{:06}", score);
39+
let bcd_str = format!("{:08}", score);
840
let bcd_a = i64::from_str_radix(&bcd_str[0..2], 16).unwrap();
941
let bcd_b = i64::from_str_radix(&bcd_str[2..4], 16).unwrap();
1042
let bcd_c = i64::from_str_radix(&bcd_str[4..6], 16).unwrap();
43+
let bcd_d = i64::from_str_radix(&bcd_str[6..8], 16).unwrap();
1144

12-
emu.memory.iram_raw[(score_addr + 2) as usize] = bcd_a as u8;
13-
emu.memory.iram_raw[(score_addr + 1) as usize] = bcd_b as u8;
14-
emu.memory.iram_raw[score_addr as usize] = bcd_c as u8;
45+
emu.memory.iram_raw[(score_addr + 3) as usize] = bcd_a as u8;
46+
emu.memory.iram_raw[(score_addr + 2) as usize] = bcd_b as u8;
47+
emu.memory.iram_raw[(score_addr + 1) as usize] = bcd_c as u8;
48+
emu.memory.iram_raw[score_addr as usize] = bcd_d as u8;
1549
emu.memory.iram_raw[binscore_addr as usize] = score as u8;
1650
emu.memory.iram_raw[(binscore_addr + 1) as usize] = (score >> 8) as u8;
1751
emu.memory.iram_raw[(binscore_addr + 2) as usize] = (score >> 16) as u8;
52+
emu.memory.iram_raw[(binscore_addr + 3) as usize] = (score >> 24) as u8;
1853
}
1954

2055
pub fn get(emu: &mut NesState) -> u32 {

tests/src/util.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,3 +42,25 @@ pub fn print_step(emu: &mut NesState) {
4242

4343
println!("{}", opcode_info::disassemble_instruction(emu.cpu.opcode, 0, 0).0);
4444
}
45+
46+
pub const fn _ppu_addr_to_xy(ppu_addr: u16) -> (u8, u8) {
47+
const SCREEN_WIDTH: u16 = 256 / 8;
48+
const SCREEN_HEIGHT: u16 = 240 / 8;
49+
50+
let base_address = ppu_addr & 0x2C00;
51+
52+
let (base_x, base_y) = match base_address {
53+
0x2000 => (0, 0),
54+
0x2400 => (1, 0),
55+
0x2800 => (0, 1),
56+
0x2C00 => (1, 1),
57+
_ => panic!("Invalid PPU address"),
58+
};
59+
60+
let offset = ppu_addr - base_address;
61+
62+
let x = base_x * SCREEN_WIDTH + (offset % 32);
63+
let y = base_y * SCREEN_HEIGHT + (offset / 32);
64+
65+
(x as _, y as _)
66+
}

0 commit comments

Comments
 (0)