Skip to content

Commit d2aafc0

Browse files
committed
test core score logic
1 parent c226811 commit d2aafc0

File tree

5 files changed

+32837
-37
lines changed

5 files changed

+32837
-37
lines changed

tests/src/main.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ fn main() {
3636

3737
// run tests
3838
if options.test {
39+
score::test();
40+
println!("score works!");
3941
score::test_render();
4042
println!("score rendering works!");
4143
pushdown::test();

tests/src/pushdown.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ pub fn test() {
55

66
for pushdown in 2..15 {
77
[0..1000, 24500..25500, 60000..65536].into_iter().for_each(|range| {
8-
// [0..65535].into_iter().for_each(|range| {
98
for score in range {
109
score::set(&mut emu, score);
1110

tests/src/rng.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ pub fn test() {
55
assert_eq!(
66
seeds(),
77
include_str!("./rng_seeds.txt")
8-
.split(',')
8+
.trim()
9+
.split('\n')
910
.map(|s| s.trim().parse::<u16>().expect(s))
1011
.collect::<HashSet<_>>()
1112
);

tests/src/rng_seeds.txt

Lines changed: 32767 additions & 1 deletion
Large diffs are not rendered by default.

tests/src/score.rs

Lines changed: 66 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,65 @@
11
use rusticnes_core::nes::NesState;
22
use crate::{labels, score, util};
33

4+
pub fn set(emu: &mut NesState, score: u32) {
5+
let score_addr = labels::get("score");
6+
let binscore_addr = labels::get("binScore");
7+
let bcd_str = format!("{:08}", score);
8+
let bcd_a = i64::from_str_radix(&bcd_str[0..2], 16).unwrap();
9+
let bcd_b = i64::from_str_radix(&bcd_str[2..4], 16).unwrap();
10+
let bcd_c = i64::from_str_radix(&bcd_str[4..6], 16).unwrap();
11+
let bcd_d = i64::from_str_radix(&bcd_str[6..8], 16).unwrap();
12+
13+
emu.memory.iram_raw[(score_addr + 3) as usize] = bcd_a as u8;
14+
emu.memory.iram_raw[(score_addr + 2) as usize] = bcd_b as u8;
15+
emu.memory.iram_raw[(score_addr + 1) as usize] = bcd_c as u8;
16+
emu.memory.iram_raw[score_addr as usize] = bcd_d as u8;
17+
emu.memory.iram_raw[binscore_addr as usize] = score as u8;
18+
emu.memory.iram_raw[(binscore_addr + 1) as usize] = (score >> 8) as u8;
19+
emu.memory.iram_raw[(binscore_addr + 2) as usize] = (score >> 16) as u8;
20+
emu.memory.iram_raw[(binscore_addr + 3) as usize] = (score >> 24) as u8;
21+
}
22+
23+
pub fn get(emu: &mut NesState) -> u32 {
24+
let binscore_addr = labels::get("binScore");
25+
emu.memory.iram_raw[binscore_addr as usize] as u32
26+
+ ((emu.memory.iram_raw[(binscore_addr + 1) as usize] as u32) << 8)
27+
+ ((emu.memory.iram_raw[(binscore_addr + 2) as usize] as u32) << 16)
28+
}
29+
30+
pub fn test() {
31+
let mut emu = util::emulator(None);
32+
33+
let completed_lines = labels::get("completedLines") as usize;
34+
let add_points = labels::get("addPointsRaw");
35+
let level_number = labels::get("levelNumber") as usize;
36+
37+
let mut score = move |score: u32, lines: u8, level: u8| {
38+
score::set(&mut emu, score);
39+
emu.registers.pc = add_points;
40+
emu.memory.iram_raw[completed_lines] = lines;
41+
emu.memory.iram_raw[level_number] = level;
42+
util::run_to_return(&mut emu, false);
43+
score::get(&mut emu)
44+
};
45+
46+
// check every linecount on every level
47+
for level in 0..=255 {
48+
for lines in 0..=4 {
49+
assert_eq!(score(0, lines, level), score_impl(lines, level));
50+
}
51+
}
52+
53+
// check tetris value from lots of scores
54+
for initial_score in 999000..=1001000 {
55+
assert_eq!(score(initial_score, 4, 18), initial_score + score_impl(4, 18));
56+
}
57+
}
58+
59+
pub fn score_impl(lines: u8, level: u8) -> u32 {
60+
[0, 40, 100, 300, 1200][lines as usize] * (level as u32 + 1)
61+
}
62+
463
pub fn test_render() {
564
let mut emu = util::emulator(None);
665

@@ -26,16 +85,15 @@ pub fn test_render() {
2685

2786
// check letter score rendering works
2887

29-
// for i in 250..262 {
30-
// let score = i * 100000;
88+
for i in 0..256 { // TODO: fix breaking at 25.5m
89+
let score = i * 100000;
3190

32-
// score::set(&mut emu, score);
33-
// emu.registers.pc = labels::get("renderLettersScore");
34-
// util::run_to_return(&mut emu, false);
91+
score::set(&mut emu, score);
92+
emu.registers.pc = labels::get("renderLettersScore");
93+
util::run_to_return(&mut emu, false);
3594

36-
// // TODO: fix breaking at 25.5m
37-
// println!("{} {} {}", i, (i % 36) as u8, rendered_score(&mut emu)[0]);
38-
// }
95+
assert_eq!((i % 36) as u8, rendered_score(&mut emu)[0]);
96+
}
3997

4098
// check score cap works
4199

@@ -53,29 +111,3 @@ pub fn test_render() {
53111
assert_ne!(vec![9, 9, 9, 9, 9, 9], rendered_score(&mut emu));
54112
}
55113
}
56-
57-
pub fn set(emu: &mut NesState, score: u32) {
58-
let score_addr = labels::get("score");
59-
let binscore_addr = labels::get("binScore");
60-
let bcd_str = format!("{:08}", score);
61-
let bcd_a = i64::from_str_radix(&bcd_str[0..2], 16).unwrap();
62-
let bcd_b = i64::from_str_radix(&bcd_str[2..4], 16).unwrap();
63-
let bcd_c = i64::from_str_radix(&bcd_str[4..6], 16).unwrap();
64-
let bcd_d = i64::from_str_radix(&bcd_str[6..8], 16).unwrap();
65-
66-
emu.memory.iram_raw[(score_addr + 3) as usize] = bcd_a as u8;
67-
emu.memory.iram_raw[(score_addr + 2) as usize] = bcd_b as u8;
68-
emu.memory.iram_raw[(score_addr + 1) as usize] = bcd_c as u8;
69-
emu.memory.iram_raw[score_addr as usize] = bcd_d as u8;
70-
emu.memory.iram_raw[binscore_addr as usize] = score as u8;
71-
emu.memory.iram_raw[(binscore_addr + 1) as usize] = (score >> 8) as u8;
72-
emu.memory.iram_raw[(binscore_addr + 2) as usize] = (score >> 16) as u8;
73-
emu.memory.iram_raw[(binscore_addr + 3) as usize] = (score >> 24) as u8;
74-
}
75-
76-
pub fn get(emu: &mut NesState) -> u32 {
77-
let binscore_addr = labels::get("binScore");
78-
emu.memory.iram_raw[binscore_addr as usize] as u32
79-
+ ((emu.memory.iram_raw[(binscore_addr + 1) as usize] as u32) << 8)
80-
+ ((emu.memory.iram_raw[(binscore_addr + 2) as usize] as u32) << 16)
81-
}

0 commit comments

Comments
 (0)