|
1 | 1 | use rusticnes_core::nes::NesState;
|
2 |
| -use crate::labels; |
| 2 | +use crate::{labels, score, util}; |
| 3 | + |
| 4 | +pub fn test_render() { |
| 5 | + let mut emu = util::emulator(None); |
| 6 | + |
| 7 | + let rendered_score = |emu: &mut NesState| { |
| 8 | + let vram_offset = emu.ppu.current_vram_address - 6; |
| 9 | + |
| 10 | + (vram_offset..vram_offset + 6) |
| 11 | + .map(|i| emu.ppu.read_byte(&mut *emu.mapper, i)) |
| 12 | + .collect::<Vec<u8>>() |
| 13 | + }; |
| 14 | + |
| 15 | + // check classic score rendering works |
| 16 | + |
| 17 | + for i in 0..1000 { |
| 18 | + let score = i * 100000; |
| 19 | + |
| 20 | + score::set(&mut emu, score); |
| 21 | + emu.registers.pc = labels::get("renderClassicScore"); |
| 22 | + util::run_to_return(&mut emu, false); |
| 23 | + |
| 24 | + assert_eq!((i % 16) as u8, rendered_score(&mut emu)[0]); |
| 25 | + } |
| 26 | + |
| 27 | + // check score cap works |
| 28 | + |
| 29 | + let score = 8952432; |
| 30 | + score::set(&mut emu, score); |
| 31 | + emu.registers.pc = labels::get("renderScoreCap"); |
| 32 | + util::run_to_return(&mut emu, false); |
| 33 | + assert_eq!(vec![9, 9, 9, 9, 9, 9], rendered_score(&mut emu)); |
| 34 | +} |
3 | 35 |
|
4 | 36 | pub fn set(emu: &mut NesState, score: u32) {
|
5 | 37 | let score_addr = labels::get("score");
|
6 | 38 | let binscore_addr = labels::get("binScore");
|
7 |
| - let bcd_str = format!("{:06}", score); |
| 39 | + let bcd_str = format!("{:08}", score); |
8 | 40 | let bcd_a = i64::from_str_radix(&bcd_str[0..2], 16).unwrap();
|
9 | 41 | let bcd_b = i64::from_str_radix(&bcd_str[2..4], 16).unwrap();
|
10 | 42 | let bcd_c = i64::from_str_radix(&bcd_str[4..6], 16).unwrap();
|
| 43 | + let bcd_d = i64::from_str_radix(&bcd_str[6..8], 16).unwrap(); |
11 | 44 |
|
12 |
| - emu.memory.iram_raw[(score_addr + 2) as usize] = bcd_a as u8; |
13 |
| - emu.memory.iram_raw[(score_addr + 1) as usize] = bcd_b as u8; |
14 |
| - emu.memory.iram_raw[score_addr as usize] = bcd_c as u8; |
| 45 | + emu.memory.iram_raw[(score_addr + 3) as usize] = bcd_a as u8; |
| 46 | + emu.memory.iram_raw[(score_addr + 2) as usize] = bcd_b as u8; |
| 47 | + emu.memory.iram_raw[(score_addr + 1) as usize] = bcd_c as u8; |
| 48 | + emu.memory.iram_raw[score_addr as usize] = bcd_d as u8; |
15 | 49 | emu.memory.iram_raw[binscore_addr as usize] = score as u8;
|
16 | 50 | emu.memory.iram_raw[(binscore_addr + 1) as usize] = (score >> 8) as u8;
|
17 | 51 | emu.memory.iram_raw[(binscore_addr + 2) as usize] = (score >> 16) as u8;
|
| 52 | + emu.memory.iram_raw[(binscore_addr + 3) as usize] = (score >> 24) as u8; |
18 | 53 | }
|
19 | 54 |
|
20 | 55 | pub fn get(emu: &mut NesState) -> u32 {
|
|
0 commit comments