Skip to content

Commit a63b92c

Browse files
committed
Merge branch 'Crash-Detection' of https://github.com/HydrantDude/TetrisGYM into Crash-Detection
2 parents 5aff303 + 54559f9 commit a63b92c

File tree

7 files changed

+106
-43
lines changed

7 files changed

+106
-43
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
* Floor 0 has original no-burns behaviour again
1515
* Fixed CNROM legal screen CHR bank
1616
* Fixed CNROM legal to title flicker
17+
* Fixed ingame score display at 8 million with Classic Scoring
1718
* Block Tool pieces wrap around
1819
* Always Next Box removed
1920
* 0001 seeds are ignored

src/nmi/render_score.asm

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,7 @@ getScoreDiv100k:
196196
lsr
197197
lsr
198198
lsr
199+
clc
199200
tax
200201
lda multBy100Table, x
201202
adc tmpZ

tests/src/main.rs

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ mod input;
33
mod labels;
44
mod pushdown;
55
mod rng;
6+
mod score;
67
mod sps;
78
mod util;
89
mod video;
@@ -33,12 +34,14 @@ fn main() {
3334

3435
// run tests
3536
if options.test {
37+
score::test_render();
38+
println!("score rendering works!");
39+
pushdown::test();
40+
println!("pushdown works!");
3641
rng::test();
3742
println!("rng seeds are the same!");
3843
sps::test();
3944
println!("sps is the same!");
40-
pushdown::test();
41-
println!("pushdown works!");
4245
}
4346

4447
// print SPS sequences
@@ -63,18 +66,17 @@ fn main() {
6366

6467
// other stuff
6568

66-
let rng_seed = labels::get("rng_seed") as usize;
67-
let main_loop = labels::get("mainLoop");
68-
let practise_type = labels::get("practiseType") as usize;
69-
let game_mode = labels::get("gameMode") as usize;
70-
let level_number = labels::get("levelNumber") as usize;
71-
let b_modifier = labels::get("typeBModifier") as usize;
72-
let mode_typeb = labels::get("MODE_TYPEB") as u8;
73-
7469
if options.foo {
7570
let mut emu = util::emulator(None);
7671
let mut view = video::Video::new();
7772

73+
let rng_seed = labels::get("rng_seed") as usize;
74+
let main_loop = labels::get("mainLoop");
75+
let practise_type = labels::get("practiseType") as usize;
76+
let game_mode = labels::get("gameMode") as usize;
77+
let level_number = labels::get("levelNumber") as usize;
78+
let b_modifier = labels::get("typeBModifier") as usize;
79+
let mode_typeb = labels::get("MODE_TYPEB") as u8;
7880

7981
rng::seeds().iter().for_each(|seed| {
8082

tests/src/pushdown.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
use crate::{labels, util};
1+
use crate::{labels, util, score};
22

33
pub fn test() {
44
let mut emu = util::emulator(None);
55

66
for pushdown in 2..15 {
77
[0..1000, 24500..25500].into_iter().for_each(|range| {
88
for score in range {
9-
util::set_score(&mut emu, score);
9+
score::set(&mut emu, score);
1010

1111
emu.registers.pc = labels::get("addPushDownPoints");
1212
emu.memory.iram_raw[labels::get("holdDownPoints") as usize] = pushdown;
@@ -15,7 +15,7 @@ pub fn test() {
1515

1616
let reference = pushdown_impl(pushdown, score as u16) as u32;
1717

18-
assert_eq!(reference, util::get_score(&mut emu) - score);
18+
assert_eq!(reference, score::get(&mut emu) - score);
1919
}
2020
});
2121
}

tests/src/rng.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,16 @@
11
use crate::{util, labels};
22
use std::collections::HashSet;
33

4+
pub fn test() {
5+
assert_eq!(
6+
seeds(),
7+
include_str!("./rng_seeds.txt")
8+
.split(',')
9+
.map(|s| s.trim().parse::<u16>().expect(s))
10+
.collect::<HashSet<_>>()
11+
);
12+
}
13+
414
pub fn seeds() -> HashSet<u16> {
515
let mut emu = util::emulator(None);
616
let rng_seed = labels::get("rng_seed");
@@ -33,13 +43,3 @@ pub fn seeds() -> HashSet<u16> {
3343

3444
seeds
3545
}
36-
37-
pub fn test() {
38-
assert_eq!(
39-
seeds(),
40-
include_str!("./rng_seeds.txt")
41-
.split(',')
42-
.map(|s| s.trim().parse::<u16>().expect(s))
43-
.collect::<HashSet<_>>()
44-
);
45-
}

tests/src/score.rs

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
use rusticnes_core::nes::NesState;
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+
}
35+
36+
pub fn set(emu: &mut NesState, score: u32) {
37+
let score_addr = labels::get("score");
38+
let binscore_addr = labels::get("binScore");
39+
let bcd_str = format!("{:08}", score);
40+
let bcd_a = i64::from_str_radix(&bcd_str[0..2], 16).unwrap();
41+
let bcd_b = i64::from_str_radix(&bcd_str[2..4], 16).unwrap();
42+
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();
44+
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;
49+
emu.memory.iram_raw[binscore_addr as usize] = score as u8;
50+
emu.memory.iram_raw[(binscore_addr + 1) as usize] = (score >> 8) as u8;
51+
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;
53+
}
54+
55+
pub fn get(emu: &mut NesState) -> u32 {
56+
let binscore_addr = labels::get("binScore");
57+
emu.memory.iram_raw[binscore_addr as usize] as u32
58+
+ ((emu.memory.iram_raw[(binscore_addr + 1) as usize] as u32) << 8)
59+
+ ((emu.memory.iram_raw[(binscore_addr + 2) as usize] as u32) << 16)
60+
}

tests/src/util.rs

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -43,25 +43,24 @@ pub fn print_step(emu: &mut NesState) {
4343
println!("{}", opcode_info::disassemble_instruction(emu.cpu.opcode, 0, 0).0);
4444
}
4545

46-
pub fn set_score(emu: &mut NesState, score: u32) {
47-
let score_addr = labels::get("score");
48-
let binscore_addr = labels::get("binScore");
49-
let bcd_str = format!("{:06}", score);
50-
let bcd_a = i64::from_str_radix(&bcd_str[0..2], 16).unwrap();
51-
let bcd_b = i64::from_str_radix(&bcd_str[2..4], 16).unwrap();
52-
let bcd_c = i64::from_str_radix(&bcd_str[4..6], 16).unwrap();
53-
54-
emu.memory.iram_raw[(score_addr + 2) as usize] = bcd_a as u8;
55-
emu.memory.iram_raw[(score_addr + 1) as usize] = bcd_b as u8;
56-
emu.memory.iram_raw[score_addr as usize] = bcd_c as u8;
57-
emu.memory.iram_raw[binscore_addr as usize] = score as u8;
58-
emu.memory.iram_raw[(binscore_addr + 1) as usize] = (score >> 8) as u8;
59-
emu.memory.iram_raw[(binscore_addr + 2) as usize] = (score >> 16) as u8;
60-
}
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);
6164

62-
pub fn get_score(emu: &mut NesState) -> u32 {
63-
let binscore_addr = labels::get("binScore");
64-
emu.memory.iram_raw[binscore_addr as usize] as u32
65-
+ ((emu.memory.iram_raw[(binscore_addr + 1) as usize] as u32) << 8)
66-
+ ((emu.memory.iram_raw[(binscore_addr + 2) as usize] as u32) << 16)
65+
(x as _, y as _)
6766
}

0 commit comments

Comments
 (0)