1
1
use rusticnes_core:: nes:: NesState ;
2
2
use crate :: { labels, score, util} ;
3
3
4
+ pub fn set ( emu : & mut NesState , score : u32 ) {
5
+ let score_addr = labels:: get ( "score" ) ;
6
+ let binscore_addr = labels:: get ( "binScore" ) ;
7
+ let bcd_str = format ! ( "{:08}" , score) ;
8
+ let bcd_a = i64:: from_str_radix ( & bcd_str[ 0 ..2 ] , 16 ) . unwrap ( ) ;
9
+ let bcd_b = i64:: from_str_radix ( & bcd_str[ 2 ..4 ] , 16 ) . unwrap ( ) ;
10
+ let bcd_c = i64:: from_str_radix ( & bcd_str[ 4 ..6 ] , 16 ) . unwrap ( ) ;
11
+ let bcd_d = i64:: from_str_radix ( & bcd_str[ 6 ..8 ] , 16 ) . unwrap ( ) ;
12
+
13
+ emu. memory . iram_raw [ ( score_addr + 3 ) as usize ] = bcd_a as u8 ;
14
+ emu. memory . iram_raw [ ( score_addr + 2 ) as usize ] = bcd_b as u8 ;
15
+ emu. memory . iram_raw [ ( score_addr + 1 ) as usize ] = bcd_c as u8 ;
16
+ emu. memory . iram_raw [ score_addr as usize ] = bcd_d as u8 ;
17
+ emu. memory . iram_raw [ binscore_addr as usize ] = score as u8 ;
18
+ emu. memory . iram_raw [ ( binscore_addr + 1 ) as usize ] = ( score >> 8 ) as u8 ;
19
+ emu. memory . iram_raw [ ( binscore_addr + 2 ) as usize ] = ( score >> 16 ) as u8 ;
20
+ emu. memory . iram_raw [ ( binscore_addr + 3 ) as usize ] = ( score >> 24 ) as u8 ;
21
+ }
22
+
23
+ pub fn get ( emu : & mut NesState ) -> u32 {
24
+ let binscore_addr = labels:: get ( "binScore" ) ;
25
+ emu. memory . iram_raw [ binscore_addr as usize ] as u32
26
+ + ( ( emu. memory . iram_raw [ ( binscore_addr + 1 ) as usize ] as u32 ) << 8 )
27
+ + ( ( emu. memory . iram_raw [ ( binscore_addr + 2 ) as usize ] as u32 ) << 16 )
28
+ }
29
+
30
+ pub fn test ( ) {
31
+ let mut emu = util:: emulator ( None ) ;
32
+
33
+ let completed_lines = labels:: get ( "completedLines" ) as usize ;
34
+ let add_points = labels:: get ( "addPointsRaw" ) ;
35
+ let level_number = labels:: get ( "levelNumber" ) as usize ;
36
+
37
+ let mut score = move |score : u32 , lines : u8 , level : u8 | {
38
+ score:: set ( & mut emu, score) ;
39
+ emu. registers . pc = add_points;
40
+ emu. memory . iram_raw [ completed_lines] = lines;
41
+ emu. memory . iram_raw [ level_number] = level;
42
+ util:: run_to_return ( & mut emu, false ) ;
43
+ score:: get ( & mut emu)
44
+ } ;
45
+
46
+ // check every linecount on every level
47
+ for level in 0 ..=255 {
48
+ for lines in 0 ..=4 {
49
+ assert_eq ! ( score( 0 , lines, level) , score_impl( lines, level) ) ;
50
+ }
51
+ }
52
+
53
+ // check tetris value from lots of scores
54
+ for initial_score in 999000 ..=1001000 {
55
+ assert_eq ! ( score( initial_score, 4 , 18 ) , initial_score + score_impl( 4 , 18 ) ) ;
56
+ }
57
+ }
58
+
59
+ pub fn score_impl ( lines : u8 , level : u8 ) -> u32 {
60
+ [ 0 , 40 , 100 , 300 , 1200 ] [ lines as usize ] * ( level as u32 + 1 )
61
+ }
62
+
4
63
pub fn test_render ( ) {
5
64
let mut emu = util:: emulator ( None ) ;
6
65
@@ -26,16 +85,15 @@ pub fn test_render() {
26
85
27
86
// check letter score rendering works
28
87
29
- // for i in 250..262 {
30
- // let score = i * 100000;
88
+ for i in 0 .. 256 { // TODO: fix breaking at 25.5m
89
+ let score = i * 100000 ;
31
90
32
- // score::set(&mut emu, score);
33
- // emu.registers.pc = labels::get("renderLettersScore");
34
- // util::run_to_return(&mut emu, false);
91
+ score:: set ( & mut emu, score) ;
92
+ emu. registers . pc = labels:: get ( "renderLettersScore" ) ;
93
+ util:: run_to_return ( & mut emu, false ) ;
35
94
36
- // // TODO: fix breaking at 25.5m
37
- // println!("{} {} {}", i, (i % 36) as u8, rendered_score(&mut emu)[0]);
38
- // }
95
+ assert_eq ! ( ( i % 36 ) as u8 , rendered_score( & mut emu) [ 0 ] ) ;
96
+ }
39
97
40
98
// check score cap works
41
99
@@ -53,29 +111,3 @@ pub fn test_render() {
53
111
assert_ne ! ( vec![ 9 , 9 , 9 , 9 , 9 , 9 ] , rendered_score( & mut emu) ) ;
54
112
}
55
113
}
56
-
57
- pub fn set ( emu : & mut NesState , score : u32 ) {
58
- let score_addr = labels:: get ( "score" ) ;
59
- let binscore_addr = labels:: get ( "binScore" ) ;
60
- let bcd_str = format ! ( "{:08}" , score) ;
61
- let bcd_a = i64:: from_str_radix ( & bcd_str[ 0 ..2 ] , 16 ) . unwrap ( ) ;
62
- let bcd_b = i64:: from_str_radix ( & bcd_str[ 2 ..4 ] , 16 ) . unwrap ( ) ;
63
- let bcd_c = i64:: from_str_radix ( & bcd_str[ 4 ..6 ] , 16 ) . unwrap ( ) ;
64
- let bcd_d = i64:: from_str_radix ( & bcd_str[ 6 ..8 ] , 16 ) . unwrap ( ) ;
65
-
66
- emu. memory . iram_raw [ ( score_addr + 3 ) as usize ] = bcd_a as u8 ;
67
- emu. memory . iram_raw [ ( score_addr + 2 ) as usize ] = bcd_b as u8 ;
68
- emu. memory . iram_raw [ ( score_addr + 1 ) as usize ] = bcd_c as u8 ;
69
- emu. memory . iram_raw [ score_addr as usize ] = bcd_d as u8 ;
70
- emu. memory . iram_raw [ binscore_addr as usize ] = score as u8 ;
71
- emu. memory . iram_raw [ ( binscore_addr + 1 ) as usize ] = ( score >> 8 ) as u8 ;
72
- emu. memory . iram_raw [ ( binscore_addr + 2 ) as usize ] = ( score >> 16 ) as u8 ;
73
- emu. memory . iram_raw [ ( binscore_addr + 3 ) as usize ] = ( score >> 24 ) as u8 ;
74
- }
75
-
76
- pub fn get ( emu : & mut NesState ) -> u32 {
77
- let binscore_addr = labels:: get ( "binScore" ) ;
78
- emu. memory . iram_raw [ binscore_addr as usize ] as u32
79
- + ( ( emu. memory . iram_raw [ ( binscore_addr + 1 ) as usize ] as u32 ) << 8 )
80
- + ( ( emu. memory . iram_raw [ ( binscore_addr + 2 ) as usize ] as u32 ) << 16 )
81
- }
0 commit comments