Skip to content
Snippets Groups Projects
main.rs 3.19 KiB
Newer Older
  • Learn to ignore specific revisions
  • use boytacean::{gb::GameBoy, ppu::{DISPLAY_WIDTH, DISPLAY_HEIGHT}};
    use sdl2::{video::Window, pixels::PixelFormatEnum, VideoSubsystem, TimerSubsystem, EventPump};
    
    /// The base title to be used in the window.
    static TITLE: &'static str = "Boytacean";
    
    pub struct Graphics {
        window: Window,
        video_subsystem: VideoSubsystem,
        timer_subsystem: TimerSubsystem,
        event_pump: EventPump,
    }
    
    fn start_sdl() -> Graphics {
        // initializes the SDL sub-system, making it ready to be
        // used for display of graphics and audio
        let sdl = sdl2::init().unwrap();
        let video_subsystem = sdl.video().unwrap();
        let timer_subsystem = sdl.timer().unwrap();
        let audio_subsystem = sdl.audio().unwrap();
        let event_pump = sdl.event_pump().unwrap();
    
        // initialized the fonts context to be used
        // in the loading of fonts
        let ttf_context = sdl2::ttf::init().unwrap();
    
        // creates the system window that is going to be used to
        // show the emulator and sets it to the central are o screen
        let mut window = video_subsystem
            .window(
                TITLE,
                2 as u32 * DISPLAY_WIDTH as u32, //@todo check screen scale
                2 as u32 * DISPLAY_HEIGHT as u32, //@todo check screen scale
            )
            .resizable()
            .position_centered()
            .opengl()
            .build()
            .unwrap();
    
        Graphics {
            window: window,
            video_subsystem: video_subsystem,
            timer_subsystem: timer_subsystem,
            event_pump: event_pump
        }
    }
    
        let mut graphics = start_sdl();
    
        let mut canvas = graphics.window.into_canvas().accelerated().build().unwrap();
        canvas.clear();
        canvas.present();
    
        let texture_creator = canvas.texture_creator();
    
        // creates the texture streaming that is going to be used
        // as the target for the pixel buffer
        let mut texture = texture_creator
            .create_texture_streaming(
                PixelFormatEnum::RGB24,
                DISPLAY_WIDTH as u32,
                DISPLAY_HEIGHT as u32,
            )
            .unwrap();
    
    
        let mut game_boy = GameBoy::new();
    
        game_boy.load_boot_default();
    
    
        let mut counter = 0;
    
        'main: loop {
            if counter >= 7000000 {
    
                break;
            }
    
    
            while let Some(event) = graphics.event_pump.poll_event() {
            }
    
            let mut counter_ticks = 0u32;
    
            loop {
                // limits the number of ticks to the typical number
                // of ticks required to do a complete PPU draw
                if counter_ticks >= 70224 {
                    break;
                }
    
                // runs the Game Boy clock, this operations should
                // include the advance of both the CPU and the PPU
                counter_ticks += game_boy.clock() as u32;
            }
    
            counter += counter_ticks;
    
            let frame_buffer = game_boy.frame_buffer().as_ref();
            texture
                .update(None, frame_buffer, DISPLAY_WIDTH as usize * 3)
                .unwrap();
            canvas.copy(&texture, None, None).unwrap();
    
            // presents the canvas effectively updating the screen
            // information presented to the user
            canvas.present();
    
            graphics.timer_subsystem.delay(17);
    
    
        //println!("{:?}", game_boy.frame_buffer().as_ref());