@@ -31,37 +31,34 @@ pub fn count_cycles() {
31
31
32
32
println ! ( "scoring routine most cycles: {}" , highest) ;
33
33
34
- use crate :: video;
34
+ // use crate::video;
35
35
36
36
// check clock cycles frames in each mode
37
37
38
38
let mut emu = util:: emulator ( None ) ;
39
- let mut view = video:: Video :: new ( ) ;
40
39
41
- for _ in 0 ..3 { emu . run_until_vblank ( ) ; }
40
+ for mode in 0 ..labels :: get ( "MODE_GAME_QUANTITY" ) {
42
41
43
- let practise_type = labels:: get ( "practiseType" ) as usize ;
44
- let game_mode = labels:: get ( "gameMode" ) as usize ;
45
- let main_loop = labels:: get ( "mainLoop" ) ;
46
- let level_number = labels:: get ( "levelNumber" ) as usize ;
42
+ emu. reset ( ) ;
43
+
44
+ for _ in 0 ..3 { emu. run_until_vblank ( ) ; }
47
45
46
+ let practise_type = labels:: get ( "practiseType" ) as usize ;
47
+ let game_mode = labels:: get ( "gameMode" ) as usize ;
48
+ let main_loop = labels:: get ( "mainLoop" ) ;
49
+ let level_number = labels:: get ( "levelNumber" ) as usize ;
48
50
49
- emu. memory . iram_raw [ practise_type] = labels:: get ( "MODE_TRANSITION" ) as _ ;
50
- emu. memory . iram_raw [ level_number] = 18 ;
51
- emu. memory . iram_raw [ game_mode] = 4 ;
52
- emu. registers . pc = main_loop;
53
51
54
- for _ in 0 ..5 { emu. run_until_vblank ( ) ; }
52
+ emu. memory . iram_raw [ practise_type] = mode as _ ;
53
+ emu. memory . iram_raw [ level_number] = 235 ;
54
+ emu. memory . iram_raw [ game_mode] = 4 ;
55
+ emu. registers . pc = main_loop;
55
56
56
- let ( mut highest , mut level , mut lines ) = ( 0 , 0 , 0 ) ;
57
+ for _ in 0 .. 5 { emu . run_until_vblank ( ) ; }
57
58
58
- for _ in 0 .. 10 {
59
+ let ( mut highest , mut _level , mut lines ) = ( 0 , 0 , 0 ) ;
59
60
60
61
for line in 0 ..5 {
61
- emu. memory . iram_raw [ labels:: get ( "currentPiece" ) as usize ] = 0x11 ;
62
- emu. memory . iram_raw [ labels:: get ( "tetriminoX" ) as usize ] = 0x5 ;
63
- emu. memory . iram_raw [ labels:: get ( "tetriminoY" ) as usize ] = 0x11 ;
64
- emu. memory . iram_raw [ labels:: get ( "autorepeatY" ) as usize ] = 0 ;
65
62
emu. memory . iram_raw [ labels:: get ( "vramRow" ) as usize ] = 0 ;
66
63
67
64
playfield:: clear ( & mut emu) ;
@@ -75,58 +72,47 @@ pub fn count_cycles() {
75
72
_ => unreachable ! ( "line" ) ,
76
73
} ) ;
77
74
78
- emu. run_until_vblank ( ) ;
79
-
80
- for _ in 0 ..[ 44 , 47 , 47 , 46 , 45 ] [ line] {
75
+ emu. memory . iram_raw [ labels:: get ( "currentPiece" ) as usize ] = 0x11 ;
76
+ emu. memory . iram_raw [ labels:: get ( "tetriminoX" ) as usize ] = 0x5 ;
77
+ emu. memory . iram_raw [ labels:: get ( "tetriminoY" ) as usize ] = 0x12 ;
78
+ emu. memory . iram_raw [ labels:: get ( "autorepeatY" ) as usize ] = 0 ;
81
79
80
+ for _ in 0 ..45 {
82
81
let cycles = cycles_to_hblank ( & mut emu) ;
83
82
84
83
if cycles > highest {
85
84
highest = cycles;
86
- level = emu. memory . iram_raw [ level_number] ;
85
+ _level = emu. memory . iram_raw [ level_number] ;
87
86
lines = line;
88
87
}
89
-
90
- println ! ( "{}/{} ({} {})" , highest, cycles, lines, level) ;
91
-
92
- // std::thread::sleep(std::time::Duration::from_millis(50));
93
-
94
88
}
95
-
96
- emu. ppu . render_ntsc ( video:: WIDTH ) ;
97
- view. update ( & emu. ppu . filtered_screen ) ;
98
-
99
89
}
100
- }
101
-
102
- // println!("{:#?}", (highest, level, lines));
103
90
104
-
105
- loop { }
91
+ println ! ( "cycles {} lines {} mode {}" , highest , lines , mode ) ;
92
+ }
106
93
107
94
}
108
95
109
96
fn cycles_to_hblank ( emu : & mut NesState ) -> u32 {
110
- let nmi_wait_start = labels:: get ( "nmiWaitStart" ) ;
111
- let nmi_wait_end = labels:: get ( "nmiWaitEnd" ) ;
97
+ let vblank = labels:: get ( "verticalBlankingInterval" ) as usize ;
112
98
let mut cycles = 0 ;
113
99
let mut done = false ;
114
100
115
101
while emu. ppu . current_scanline == 242 {
116
102
emu. cycle ( ) ;
117
103
if !done {
118
104
cycles += 1 ;
119
- if emu. registers . pc >= nmi_wait_start && emu . registers . pc <= nmi_wait_end {
120
- done = true
105
+ if emu. memory . iram_raw [ vblank ] == 1 {
106
+ done = true ;
121
107
}
122
108
}
123
109
let mut i = 0 ;
124
110
while emu. cpu . tick >= 1 && i < 10 {
125
111
emu. cycle ( ) ;
126
112
if !done {
127
113
cycles += 1 ;
128
- if emu. registers . pc >= nmi_wait_start && emu . registers . pc <= nmi_wait_end {
129
- done = true
114
+ if emu. memory . iram_raw [ vblank ] == 1 {
115
+ done = true ;
130
116
}
131
117
}
132
118
i += 1 ;
@@ -136,21 +122,23 @@ fn cycles_to_hblank(emu: &mut NesState) -> u32 {
136
122
emu. last_frame = emu. ppu . current_frame ;
137
123
}
138
124
}
125
+ emu. memory . iram_raw [ vblank] = 1 ;
126
+ done = false ;
139
127
while emu. ppu . current_scanline != 242 {
140
128
emu. cycle ( ) ;
141
129
if !done {
142
130
cycles += 1 ;
143
- if emu. registers . pc >= nmi_wait_start && emu . registers . pc <= nmi_wait_end {
144
- done = true
131
+ if emu. memory . iram_raw [ vblank ] == 0 {
132
+ done = true ;
145
133
}
146
134
}
147
135
let mut i = 0 ;
148
136
while emu. cpu . tick >= 1 && i < 10 {
149
137
emu. cycle ( ) ;
150
138
if !done {
151
139
cycles += 1 ;
152
- if emu. registers . pc >= nmi_wait_start && emu . registers . pc <= nmi_wait_end {
153
- done = true
140
+ if emu. memory . iram_raw [ vblank ] == 0 {
141
+ done = true ;
154
142
}
155
143
}
156
144
i += 1 ;
0 commit comments