Skip to content

Commit 753409a

Browse files
committed
crash detection
1 parent 204822a commit 753409a

File tree

2 files changed

+55
-57
lines changed

2 files changed

+55
-57
lines changed

tests/src/crash.rs

Lines changed: 54 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,36 @@
11
use crate::{util, video, playfield};
22

3+
// enum for crash type
4+
// struct for crash params
5+
6+
#[derive(Debug)]
7+
struct Params {
8+
lines: u8,
9+
pushdown: u8,
10+
}
11+
12+
313
pub fn fuzz() {
414
let mut emu = util::emulator(Some(util::OG_ROM));
515

16+
for lines in 0..=4 {
17+
let params = Params {
18+
lines,
19+
pushdown: 0, // 0 / 8
20+
};
21+
let result = check(&mut emu, &params);
22+
23+
if result.is_some() {
24+
println!("crash @ {:?} {:?}", result.unwrap(), params);
25+
}
26+
}
27+
28+
}
29+
30+
fn check(emu: &mut util::NesState, params: &Params) -> Option<u16> {
631
emu.reset();
732

8-
util::run_n_vblanks(&mut emu, 8);
33+
util::run_n_vblanks(emu, 8);
934

1035
let p1_score = 0x73;
1136
let score = 0x53;
@@ -23,19 +48,19 @@ pub fn fuzz() {
2348
let p1_current_piece = 0x62;
2449
let auto_repeat_y = 0x4E;
2550
let p1_auto_repeat_y = 0x6E;
51+
let frame_counter = 0xB1;
52+
let vrow = 0x49;
53+
let p1_vrow = 0x69;
2654
let push_down = 0x4F;
2755
let p1_push_down = 0x6F;
2856
let render_flags = 0xA3;
2957
let clear_count = 0xD8;
30-
let play_state = 0x48;
3158
let p1_play_state = 0x68;
3259

33-
let nmi_label = 0x8005;
34-
let switch_label = 0xAC82;
3560
emu.memory.iram_raw[game_mode] = 4;
3661
emu.registers.pc = main_loop;
3762

38-
util::run_n_vblanks(&mut emu, 7);
63+
util::run_n_vblanks(emu, 7);
3964

4065
emu.memory.iram_raw[level_number] = 154;
4166
emu.memory.iram_raw[p1_level_number] = 154;
@@ -52,11 +77,11 @@ pub fn fuzz() {
5277

5378
emu.memory.iram_raw[render_flags] = 7;
5479

55-
util::run_n_vblanks(&mut emu, 1);
80+
util::run_n_vblanks(emu, 1);
5681

5782
// playfield::clear(&mut emu);
5883

59-
playfield::set_str_addr(&mut emu, 0x400, match 1 {
84+
playfield::set_str_addr(emu, 0x400, match params.lines {
6085
0 => "",
6186
1 => "##### ####",
6287
2 => "##### ####\n##### ####",
@@ -73,64 +98,37 @@ pub fn fuzz() {
7398
emu.memory.iram_raw[p1_y] = 0x12;
7499
emu.memory.iram_raw[auto_repeat_y] = 0;
75100
emu.memory.iram_raw[p1_auto_repeat_y] = 0;
76-
// emu.memory.iram_raw[push_down] = 8;
77-
// emu.memory.iram_raw[p1_push_down] = 8;
101+
emu.memory.iram_raw[frame_counter] = 0;
102+
emu.memory.iram_raw[vrow] = 0;
103+
emu.memory.iram_raw[p1_vrow] = 0;
104+
emu.memory.iram_raw[push_down] = params.pushdown;
105+
emu.memory.iram_raw[p1_push_down] = params.pushdown;
78106
// emu.memory.iram_raw[clear_count] = 9;
79107
// emu.memory.iram_raw[clear_count+1] = 5;
80108
// emu.memory.iram_raw[clear_count+2] = 5;
81109
// emu.memory.iram_raw[clear_count+3] = 5;
82110

83-
// set framecounter, vramrow
111+
util::run_n_vblanks(emu, 28);
84112

85-
'outer: for _ in 0..30 {
86-
if emu.memory.iram_raw[play_state] == 5 || emu.memory.iram_raw[p1_play_state] == 5 {
87-
break;
88-
}
89-
90-
let address = ((emu.registers.s) as u16) + 0x0102;
91-
let address1 = ((emu.registers.s) as u16) + 0x0103;
113+
let result = loop {
114+
emu.cycle();
92115

93-
loop {
94-
emu.cycle();
95-
if emu.registers.pc < 0x800 { println!("1"); break 'outer };
96-
if emu.registers.pc == nmi_label { println!("2"); break };
97-
}
116+
if emu.registers.pc == 0xAc95 {
117+
// read 00-01 and see if it's a corrupted value (you can catch orange-blue by checking if $01 is $00 and reds by checking if $00-01 are (and these are in the order you would see in memory, not the actual jump destination) : 20 82, AA A9(not a crash), 2C 20, 82 AA(satan, not crash), A9 EF
98118

99-
println!("-----------------");
100-
loop {
101-
emu.cycle();
102-
println!("0");
103-
if emu.registers.pc < 0x800 { println!("1"); break 'outer };
104-
if emu.registers.pc == 0xAc95 { println!("2");
105-
106-
println!("PC: {:04x}", emu.registers.pc);
107-
emu.memory.iram_raw[0x100..0x200].iter().enumerate().for_each(|(i,b)| {
108-
if (i % 16) == 0 {print!("\n{:04x}: ", i + 0x100);}
109-
print!("{:02x} ", b);
110-
});
111-
println!("");
112-
print!("{:02x} ", emu.memory.iram_raw[address as usize]);
113-
println!("{:02x}", emu.memory.iram_raw[address1 as usize]);
114-
115-
print!("{:02x} ", emu.memory.iram_raw[0]);
116-
println!("{:02x}", emu.memory.iram_raw[1]);
117-
println!("SP: {:02x}", emu.registers.s);
118-
println!("SL: {:02x}", emu.ppu.current_scanline);
119-
120-
break };
121-
}
122-
}
123-
println!("-----------------");
119+
let tmp0 = emu.memory.iram_raw[0];
120+
let tmp1 = emu.memory.iram_raw[1];
121+
let tmp = ((tmp0 as u16) << 8) + tmp1 as u16;
124122

125-
print!("{:02x} ", emu.memory.iram_raw[0]);
126-
println!("{:02x}", emu.memory.iram_raw[1]);
123+
if tmp1 == 0 || tmp == 0x2082 || tmp == 0x2C20 || tmp == 0x82AA || tmp == 0xa9ef {
124+
break Some(tmp);
125+
}
126+
};
127127

128-
println!("PC: {:04x}", emu.registers.pc);
129-
130-
video::preview(&mut emu);
131-
132-
133-
println!("PD: {:02x}", emu.memory.iram_raw[p1_push_down]);
128+
if emu.memory.iram_raw[p1_play_state] == 1 {
129+
break None;
130+
}
131+
};
134132

135-
// uncrash by replacing the PC
133+
return result;
136134
}

tests/src/util.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use rusticnes_core::nes::NesState;
1+
pub use rusticnes_core::nes::NesState;
22
use rusticnes_core::{ cartridge, opcodes, opcode_info };
33
use crate::{input, labels};
44

0 commit comments

Comments
 (0)