use core::ptr;

// mod panic;
pub mod drivers;
pub mod init;

use crate::arch::drivers::nrf52::{Level, Pins};
use core::ptr::write_volatile;
global_asm!(include_str!("boot.s"));

fn delay(ticks: usize) {
    static mut DUMMY: usize = 0;

    // Reduce the number of iterations when in debug mode
    #[cfg(debug_assertions)]
    let ticks = ticks / 128;

    for t in 0..ticks {
        // Prevent the optimizer from removing this loop
        unsafe {
            write_volatile(&mut DUMMY, t);
        }
    }
}
use crate::print;

#[no_mangle]
pub extern "C" fn not_main() {
    const UART0: *mut u8 = 0x0900_0000 as *mut u8;
    for byte in b"ableOS Arm 64" {
        unsafe {
            ptr::write_volatile(UART0, *byte);
        }
    }

    //
    // let gpios = Pins::take();
    // let mut led = gpios.p0_31;
    //
    // loop {
    //     led.set_high();
    //     delay(2_000_000);
    //
    //     led.set_low();
    //     delay(6_000_000);
    // }
    //
    // led.set_push_pull_output(Level::Low);
    crate::kmain::kernel_main();

    sloop();
}

pub fn sloop() -> ! {
    loop {}
}
pub fn print() {
    for byte in b"ableOS Arm 64" {
        const UART0: *mut u8 = 0x0900_0000 as *mut u8;

        unsafe {
            ptr::write_volatile(UART0, *byte);
        }
    }
}

pub fn shutdown() {}