#![no_std]
#![feature(start)]
#![forbid(unsafe_code)]

use gba::{
  fatal,
  io::display::{DisplayControlSetting, DisplayMode, DISPCNT},
  vram::bitmap::{Mode3, Mode4, Mode5, Page},
  warn, Color,
};

#[panic_handler]
fn panic(info: &core::panic::PanicInfo) -> ! {
  fatal!("{}", info);
  loop {}
}

#[start]
fn main(_argc: isize, _argv: *const *const u8) -> isize {
  const SETTING: DisplayControlSetting =
    DisplayControlSetting::new().with_mode(DisplayMode::Mode5).with_bg2(true);
  DISPCNT.write(SETTING);

  use gba::io::timers::*;
  let tcs0 = TimerControlSetting::new().with_enabled(true);
  let tcs1 = TimerControlSetting::new().with_tick_rate(TimerTickRate::Cascade).with_enabled(true);

  TM1CNT_H.write(tcs1);
  TM0CNT_H.write(tcs0);
  let start = TM0CNT_L.read();
  Mode5::clear_to(Page::Zero, Color(0));
  let end0 = TM0CNT_L.read();
  let end1 = TM1CNT_L.read();
  warn!("CLEAR_TO: start:{}, end0:{}, end1:{}", start, end0, end1);

  // reset
  TM1CNT_H.write(TimerControlSetting::new());
  TM0CNT_H.write(TimerControlSetting::new());

  TM1CNT_H.write(tcs1);
  TM0CNT_H.write(tcs0);
  let start = TM0CNT_L.read();
  Mode5::dma_clear_to(Page::Zero, Color(0));
  let end0 = TM0CNT_L.read();
  let end1 = TM1CNT_L.read();
  warn!("DMA_CLEAR_TO: start:{}, end0:{}, end1:{}", start, end0, end1);

  DISPCNT.write(DisplayControlSetting::new().with_mode(DisplayMode::Mode3).with_bg2(true));
  loop {
    let this_frame_keys = gba::io::keypad::read_key_input();
    gba::io::display::spin_until_vblank();
    Mode3::dma_clear_to(Color(111));
    Mode3::draw_line(5, 5, 240, 160, Color(0b0_11111_11111_11111));
    gba::io::display::spin_until_vdraw();
  }
}