1
1
use crate :: { util, labels, playfield, video} ;
2
+ use rusticnes_core:: memory:: read_byte;
2
3
3
4
pub fn test_garbage4_crash ( ) {
4
5
let mut emu = util:: emulator ( None ) ;
@@ -10,6 +11,9 @@ pub fn test_garbage4_crash() {
10
11
let level_number = labels:: get ( "levelNumber" ) as usize ;
11
12
let gmod = labels:: get ( "garbageModifier" ) as usize ;
12
13
let mode = labels:: get ( "MODE_GARBAGE" ) as u8 ;
14
+ let nmi_label = labels:: get ( "nmi" ) as u16 ;
15
+ let wait_loop_start: u16 = labels:: get ( "updateAudioWaitForNmiAndResetOamStaging" ) + 7 as u16 ;
16
+ let wait_loop_end: u16 = labels:: get ( "resetOAMStaging" ) as u16 ;
13
17
14
18
// spend a few frames bootstrapping
15
19
for _ in 0 ..3 {
@@ -56,10 +60,18 @@ pub fn test_garbage4_crash() {
56
60
##########
57
61
##########"## ) ;
58
62
59
- for _ in 0 ..40 {
60
- emu. run_until_vblank ( ) ;
61
- view. render ( & mut emu) ;
62
- }
63
+ for _ in 0 ..40 {
64
+ loop {
65
+ emu. cycle ( ) ;
66
+ if emu. registers . pc == nmi_label { break } ;
67
+ }
68
+ let stack_pointer = emu. registers . s ;
69
+ let return_lo = read_byte ( & mut emu, 0x0100 + stack_pointer as u16 + 2 ) as u16 ;
70
+ let return_hi = read_byte ( & mut emu, 0x0100 + stack_pointer as u16 + 3 ) as u16 ;
71
+ let return_addr = return_hi << 8 | return_lo;
72
+ assert ! ( return_addr >= wait_loop_start && return_addr <= wait_loop_end) ;
73
+ // view.render(&mut emu);
74
+ }
63
75
64
- assert_ne ! ( emu. cpu. opcode, 18 ) ;
76
+ assert_ne ! ( emu. cpu. opcode, 18 ) ;
65
77
}
0 commit comments