1
- use crate :: { util, video , playfield} ;
1
+ use crate :: { util, playfield} ;
2
2
3
3
// enum for crash type
4
4
// struct for crash params
5
5
6
6
#[ derive( Debug ) ]
7
7
struct Params {
8
- lines : u8 ,
8
+ cleared_lines : u8 ,
9
9
pushdown : u8 ,
10
+ lines : ( u8 , u8 ) ,
11
+ level : u8 ,
12
+ cycles : u8 ,
13
+ clear_count : u8 ,
10
14
}
11
15
12
-
13
16
pub fn fuzz ( ) {
14
17
let mut emu = util:: emulator ( Some ( util:: OG_ROM ) ) ;
15
18
16
- for lines in 0 ..=4 {
19
+ for cleared_lines in 0 ..=4 {
20
+ for pushdown in 0 ..1 {
17
21
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 ,
20
28
} ;
21
29
let result = check ( & mut emu, & params) ;
22
30
23
31
if result. is_some ( ) {
24
32
println ! ( "crash @ {:?} {:?}" , result. unwrap( ) , params) ;
25
33
}
34
+
35
+ }
36
+ }
26
37
}
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
+ }
27
50
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
28
55
}
29
56
30
57
fn check ( emu : & mut util:: NesState , params : & Params ) -> Option < u16 > {
31
58
emu. reset ( ) ;
32
59
33
- util:: run_n_vblanks ( emu, 8 ) ;
34
-
35
60
let p1_score = 0x73 ;
36
61
let score = 0x53 ;
37
62
let game_mode = 0xC0 ;
@@ -56,18 +81,21 @@ fn check(emu: &mut util::NesState, params: &Params) -> Option<u16> {
56
81
let render_flags = 0xA3 ;
57
82
let clear_count = 0xD8 ;
58
83
let p1_play_state = 0x68 ;
84
+ let nnb = 0xDF ;
85
+
86
+ util:: run_n_vblanks ( emu, 8 ) ;
59
87
60
88
emu. memory . iram_raw [ game_mode] = 4 ;
61
89
emu. registers . pc = main_loop;
62
90
63
91
util:: run_n_vblanks ( emu, 7 ) ;
64
92
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 ;
71
99
emu. memory . iram_raw [ p1_score] = 0x99 ;
72
100
emu. memory . iram_raw [ p1_score+1 ] = 0x99 ;
73
101
emu. memory . iram_raw [ p1_score+2 ] = 0x99 ;
@@ -81,7 +109,7 @@ fn check(emu: &mut util::NesState, params: &Params) -> Option<u16> {
81
109
82
110
// playfield::clear(&mut emu);
83
111
84
- playfield:: set_str_addr ( emu, 0x400 , match params. lines {
112
+ playfield:: set_str_addr ( emu, 0x400 , match params. cleared_lines {
85
113
0 => "" ,
86
114
1 => "##### ####" ,
87
115
2 => "##### ####\n ##### ####" ,
@@ -103,10 +131,14 @@ fn check(emu: &mut util::NesState, params: &Params) -> Option<u16> {
103
131
emu. memory . iram_raw [ p1_vrow] = 0 ;
104
132
emu. memory . iram_raw [ push_down] = params. pushdown ;
105
133
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
+ }
110
142
111
143
util:: run_n_vblanks ( emu, 28 ) ;
112
144
0 commit comments