Skip to content

Commit 6433839

Browse files
committed
cycle counting ingame
1 parent aea4e32 commit 6433839

File tree

3 files changed

+36
-52
lines changed

3 files changed

+36
-52
lines changed

src/nmi/nmi.asm

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,13 @@ nmi: pha
2424
ldy #$02
2525
jsr generateNextPseudorandomNumber
2626
jsr copyCurrentScrollAndCtrlToPPU
27-
lda #$01
28-
sta verticalBlankingInterval
2927
jsr pollControllerButtons
3028
.if KEYBOARD
3129
; Read Family BASIC Keyboard
3230
jsr pollKeyboard
3331
.endif
32+
lda #$01
33+
sta verticalBlankingInterval
3434
pla
3535
tay
3636
pla

src/util/core.asm

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,6 @@ random10:
5050
bpl random10
5151
rts
5252

53-
nmiWaitStart: ; used in tests
54-
5553
; canon is waitForVerticalBlankingInterval
5654
updateAudioWaitForNmiAndResetOamStaging:
5755
jsr updateAudio_jmp
@@ -88,8 +86,6 @@ updateAudioAndWaitForNmi:
8886
beq @checkForNmi
8987
rts
9088

91-
nmiWaitEnd:
92-
9389
updateAudioWaitForNmiAndDisablePpuRendering:
9490
jsr updateAudioAndWaitForNmi
9591
lda currentPpuMask

tests/src/cycle_count.rs

Lines changed: 34 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -31,37 +31,34 @@ pub fn count_cycles() {
3131

3232
println!("scoring routine most cycles: {}", highest);
3333

34-
use crate::video;
34+
// use crate::video;
3535

3636
// check clock cycles frames in each mode
3737

3838
let mut emu = util::emulator(None);
39-
let mut view = video::Video::new();
4039

41-
for _ in 0..3 { emu.run_until_vblank(); }
40+
for mode in 0..labels::get("MODE_GAME_QUANTITY") {
4241

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(); }
4745

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;
4850

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;
5351

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;
5556

56-
let (mut highest, mut level, mut lines) = (0, 0, 0);
57+
for _ in 0..5 { emu.run_until_vblank(); }
5758

58-
for _ in 0..10 {
59+
let (mut highest, mut _level, mut lines) = (0, 0, 0);
5960

6061
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;
6562
emu.memory.iram_raw[labels::get("vramRow") as usize] = 0;
6663

6764
playfield::clear(&mut emu);
@@ -75,58 +72,47 @@ pub fn count_cycles() {
7572
_ => unreachable!("line"),
7673
});
7774

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;
8179

80+
for _ in 0..45 {
8281
let cycles = cycles_to_hblank(&mut emu);
8382

8483
if cycles > highest {
8584
highest = cycles;
86-
level = emu.memory.iram_raw[level_number];
85+
_level = emu.memory.iram_raw[level_number];
8786
lines = line;
8887
}
89-
90-
println!("{}/{} ({} {})", highest, cycles, lines, level);
91-
92-
// std::thread::sleep(std::time::Duration::from_millis(50));
93-
9488
}
95-
96-
emu.ppu.render_ntsc(video::WIDTH);
97-
view.update(&emu.ppu.filtered_screen);
98-
9989
}
100-
}
101-
102-
// println!("{:#?}", (highest, level, lines));
10390

104-
105-
loop {}
91+
println!("cycles {} lines {} mode {}", highest, lines, mode);
92+
}
10693

10794
}
10895

10996
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;
11298
let mut cycles = 0;
11399
let mut done = false;
114100

115101
while emu.ppu.current_scanline == 242 {
116102
emu.cycle();
117103
if !done {
118104
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;
121107
}
122108
}
123109
let mut i = 0;
124110
while emu.cpu.tick >= 1 && i < 10 {
125111
emu.cycle();
126112
if !done {
127113
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;
130116
}
131117
}
132118
i += 1;
@@ -136,21 +122,23 @@ fn cycles_to_hblank(emu: &mut NesState) -> u32 {
136122
emu.last_frame = emu.ppu.current_frame;
137123
}
138124
}
125+
emu.memory.iram_raw[vblank] = 1;
126+
done = false;
139127
while emu.ppu.current_scanline != 242 {
140128
emu.cycle();
141129
if !done {
142130
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;
145133
}
146134
}
147135
let mut i = 0;
148136
while emu.cpu.tick >= 1 && i < 10 {
149137
emu.cycle();
150138
if !done {
151139
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;
154142
}
155143
}
156144
i += 1;

0 commit comments

Comments
 (0)