@@ -13,6 +13,7 @@ mod ppu;
1313mod rom;
1414mod utility;
1515
16+ use ppu:: Frame ;
1617use rand:: random;
1718use rom:: Rom ;
1819use sdl2:: event:: Event ;
@@ -27,45 +28,74 @@ fn main() -> Result<(), Box<dyn Error>> {
2728 let sdl_context = sdl2:: init ( ) ?;
2829 let video_subsystem = sdl_context. video ( ) ?;
2930 let window = video_subsystem
30- . window ( "" , 320 , 320 )
31+ . window ( "Tile Viewer " , ( 256.0 * 3.0 ) as u32 , ( 240.0 * 3.0 ) as u32 )
3132 . position_centered ( )
3233 . build ( ) ?;
3334
3435 let mut canvas = window. into_canvas ( ) . present_vsync ( ) . build ( ) ?;
3536 let mut event_pump = sdl_context. event_pump ( ) ?;
36- canvas. set_scale ( 10 ., 10 .) ?;
37+ canvas. set_scale ( 3 ., 3 .) ?;
3738
3839 let creator = canvas. texture_creator ( ) ;
39- let mut texture = creator. create_texture_target ( PixelFormatEnum :: RGB24 , 32 , 32 ) ?;
40+ let mut texture = creator. create_texture_target ( PixelFormatEnum :: RGB24 , 256 , 240 ) ?;
4041
41- let mut screen_state = [ 0_u8 ; 32 * 3 * 32 ] ;
42+ // let mut screen_state = [0_u8; 32 * 3 * 32];
4243
43- // snake game, for basic testing
44- // let program = fs::read("roms/snake.nes").unwrap();
45- let program = fs:: read ( "roms/nestest.nes" ) . unwrap ( ) ;
44+ // TODO: get program name from args at CLI
45+ let program = fs:: read ( "roms/Alter_Ego.nes" ) . unwrap ( ) ;
46+ // let program = fs::read("roms/pacman.nes").unwrap();
47+ // let program = fs::read("roms/Ms_pacman.nes").unwrap();
4648
4749 let mut cpu = Cpu :: new ( ) ;
48- cpu. load_rom ( Rom :: new ( & program) ) ;
49- cpu. reset ( ) ;
50- cpu. run_with_callback ( move |cpu| {
51- println ! ( "{}" , cpu. trace( ) ) ;
52-
53- // read user input and write it to mem[0xFF]
54- handle_user_input ( cpu, & mut event_pump) ;
55-
56- // update mem[0xFE] with a new random number
57- cpu. mem_write ( 0xFE , random :: < u8 > ( ) ) ;
58-
59- // read mem mapped screen state
60- if read_screen_state ( cpu, & mut screen_state) {
61- // redraw the screen
62- texture. update ( None , & screen_state, 32 * 3 ) . unwrap ( ) ;
63- canvas. copy ( & texture, None , None ) . unwrap ( ) ;
64- canvas. present ( ) ;
50+ let rom = Rom :: new ( & program) ;
51+
52+ let mut frame = Frame :: new ( ) ;
53+
54+ let tiles_per_row = 24 ;
55+ let tile_size = 8 + 1 ;
56+ for bank in 0 ..=1 {
57+ for tile_n in 0 ..256 {
58+ let x = tile_n % tiles_per_row;
59+ let y = tile_n / tiles_per_row + bank * 12 ;
60+
61+ frame. draw_tile ( & rom. chr_rom , bank, tile_n, ( x * tile_size, y * tile_size) ) ;
6562 }
63+ }
64+
65+ // if read_screen_state(cpu, &mut screen_state.data) {
66+ // // redraw the screen
67+ // texture.update(None, &screen_state.d, 32 * 3).unwrap();
68+ // canvas.copy(&texture, None, None).unwrap();
69+ // canvas.present();
70+ // }
71+ texture. update ( None , & frame. data , 256 * 3 ) . unwrap ( ) ;
72+ canvas. copy ( & texture, None , None ) . unwrap ( ) ;
73+ canvas. present ( ) ;
74+
75+ loop {
76+ handle_user_input ( & mut cpu, & mut event_pump) ;
77+ }
78+ // cpu.load_rom(rom);
79+ // cpu.reset();
80+ // cpu.run_with_callback(move |cpu| {
81+ // println!("{}", cpu.trace());
82+
83+ // // read user input and write it to mem[0xFF]
84+ // handle_user_input(cpu, &mut event_pump);
6685
67- sleep ( Duration :: new ( 0 , 70_000 ) ) ;
68- } ) ;
86+ // // update mem[0xFE] with a new random number
87+ // cpu.mem_write(0xFE, random::<u8>());
88+
89+ // // read mem mapped screen state
90+ // if read_screen_state(cpu, &mut screen_state) {
91+ // // redraw the screen
92+ // texture.update(None, &screen_state, 32 * 3).unwrap();
93+ // canvas.copy(&texture, None, None).unwrap();
94+ // canvas.present();
95+ // }
96+
97+ // sleep(Duration::new(0, 70_000));
98+ // });
6999
70100 Ok ( ( ) )
71101}
@@ -106,21 +136,21 @@ fn color(byte: u8) -> Color {
106136 }
107137}
108138
109- fn read_screen_state ( cpu : & mut Cpu , screen : & mut [ u8 ; 32 * 3 * 32 ] ) -> bool {
110- let mut screen_idx = 0 ;
111- let mut updated = false ;
112- for i in 0x0200 ..0x0600 {
113- let color_idx = cpu. mem_read ( i as u16 ) ;
114- let ( b1, b2, b3) = color ( color_idx) . rgb ( ) ;
115- if screen[ screen_idx] != b1 || screen[ screen_idx + 1 ] != b2 || screen[ screen_idx + 2 ] != b3
116- {
117- screen[ screen_idx] = b1;
118- screen[ screen_idx + 1 ] = b2;
119- screen[ screen_idx + 2 ] = b3;
120- updated = true
121- }
122- screen_idx += 3 ;
123- }
124-
125- updated
126- }
139+ // fn read_screen_state(cpu: &mut Cpu, screen: &mut [u8; 32 * 3 * 32]) -> bool {
140+ // let mut screen_idx = 0;
141+ // let mut updated = false;
142+ // for i in 0x0200..0x0600 {
143+ // let color_idx = cpu.mem_read(i as u16);
144+ // let (b1, b2, b3) = color(color_idx).rgb();
145+ // if screen[screen_idx] != b1 || screen[screen_idx + 1] != b2 || screen[screen_idx + 2] != b3
146+ // {
147+ // screen[screen_idx] = b1;
148+ // screen[screen_idx + 1] = b2;
149+ // screen[screen_idx + 2] = b3;
150+ // updated = true
151+ // }
152+ // screen_idx += 3;
153+ // }
154+
155+ // updated
156+ // }
0 commit comments