Skip to content

Commit 5ccb1db

Browse files
committed
crash fuzz base func
1 parent 753409a commit 5ccb1db

File tree

1 file changed

+51
-19
lines changed

1 file changed

+51
-19
lines changed

tests/src/crash.rs

Lines changed: 51 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,62 @@
1-
use crate::{util, video, playfield};
1+
use crate::{util, playfield};
22

33
// enum for crash type
44
// struct for crash params
55

66
#[derive(Debug)]
77
struct Params {
8-
lines: u8,
8+
cleared_lines: u8,
99
pushdown: u8,
10+
lines: (u8, u8),
11+
level: u8,
12+
cycles: u8,
13+
clear_count: u8,
1014
}
1115

12-
1316
pub fn fuzz() {
1417
let mut emu = util::emulator(Some(util::OG_ROM));
1518

16-
for lines in 0..=4 {
19+
for cleared_lines in 0..=4 {
20+
for pushdown in 0..1 {
1721
let params = Params {
18-
lines,
19-
pushdown: 0, // 0 / 8
22+
cleared_lines,
23+
pushdown: if pushdown == 0 { 0 } else { 8 }, // 0 / 8
24+
level: 155,
25+
lines: get_lines(155),
26+
clear_count: 0,
27+
cycles: 0,
2028
};
2129
let result = check(&mut emu, &params);
2230

2331
if result.is_some() {
2432
println!("crash @ {:?} {:?}", result.unwrap(), params);
2533
}
34+
35+
}
36+
}
2637
}
38+
}
39+
40+
fn get_lines(level: u8) -> (u8, u8) {
41+
let base_lines = 120;
42+
let extra_lines = (level as u16 - 18) * 10;
43+
let lines = base_lines + extra_lines;
44+
45+
let hi = lines / 100;
46+
let lo = lines % 100;
47+
48+
(hi as u8, to_bcd(lo as u8))
49+
}
2750

51+
fn to_bcd(byte: u8) -> u8 {
52+
let high_nibble = (byte / 10) << 4;
53+
let low_nibble = byte % 10;
54+
high_nibble | low_nibble
2855
}
2956

3057
fn check(emu: &mut util::NesState, params: &Params) -> Option<u16> {
3158
emu.reset();
3259

33-
util::run_n_vblanks(emu, 8);
34-
3560
let p1_score = 0x73;
3661
let score = 0x53;
3762
let game_mode = 0xC0;
@@ -56,18 +81,21 @@ fn check(emu: &mut util::NesState, params: &Params) -> Option<u16> {
5681
let render_flags = 0xA3;
5782
let clear_count = 0xD8;
5883
let p1_play_state = 0x68;
84+
let nnb = 0xDF;
85+
86+
util::run_n_vblanks(emu, 8);
5987

6088
emu.memory.iram_raw[game_mode] = 4;
6189
emu.registers.pc = main_loop;
6290

6391
util::run_n_vblanks(emu, 7);
6492

65-
emu.memory.iram_raw[level_number] = 154;
66-
emu.memory.iram_raw[p1_level_number] = 154;
67-
emu.memory.iram_raw[lines] = 0x89;
68-
emu.memory.iram_raw[lines+1] = 0xE;
69-
emu.memory.iram_raw[p1_lines] = 0x89;
70-
emu.memory.iram_raw[p1_lines+1] = 0xE;
93+
emu.memory.iram_raw[level_number] = params.level;
94+
emu.memory.iram_raw[p1_level_number] = params.level;
95+
emu.memory.iram_raw[lines] = params.lines.1;
96+
emu.memory.iram_raw[lines+1] = params.lines.0;
97+
emu.memory.iram_raw[p1_lines] = params.lines.1;
98+
emu.memory.iram_raw[p1_lines+1] = params.lines.0;
7199
emu.memory.iram_raw[p1_score] = 0x99;
72100
emu.memory.iram_raw[p1_score+1] = 0x99;
73101
emu.memory.iram_raw[p1_score+2] = 0x99;
@@ -81,7 +109,7 @@ fn check(emu: &mut util::NesState, params: &Params) -> Option<u16> {
81109

82110
// playfield::clear(&mut emu);
83111

84-
playfield::set_str_addr(emu, 0x400, match params.lines {
112+
playfield::set_str_addr(emu, 0x400, match params.cleared_lines {
85113
0 => "",
86114
1 => "##### ####",
87115
2 => "##### ####\n##### ####",
@@ -103,10 +131,14 @@ fn check(emu: &mut util::NesState, params: &Params) -> Option<u16> {
103131
emu.memory.iram_raw[p1_vrow] = 0;
104132
emu.memory.iram_raw[push_down] = params.pushdown;
105133
emu.memory.iram_raw[p1_push_down] = params.pushdown;
106-
// emu.memory.iram_raw[clear_count] = 9;
107-
// emu.memory.iram_raw[clear_count+1] = 5;
108-
// emu.memory.iram_raw[clear_count+2] = 5;
109-
// emu.memory.iram_raw[clear_count+3] = 5;
134+
emu.memory.iram_raw[clear_count] = params.clear_count;
135+
emu.memory.iram_raw[clear_count+1] = params.clear_count;
136+
emu.memory.iram_raw[clear_count+2] = params.clear_count;
137+
emu.memory.iram_raw[clear_count+3] = params.clear_count;
138+
139+
for _ in 0..params.cycles {
140+
emu.cycle();
141+
}
110142

111143
util::run_n_vblanks(emu, 28);
112144

0 commit comments

Comments
 (0)