97 lines
1.8 KiB
Rust
97 lines
1.8 KiB
Rust
|
#![feature(llvm_asm, asm, lang_items, abi_avr_interrupt)]
|
||
|
#![no_std]
|
||
|
|
||
|
extern crate arduino;
|
||
|
|
||
|
use core::ptr::write_volatile;
|
||
|
use arduino::TCNT0;
|
||
|
|
||
|
const HSYNCPIN: u8 = 3;
|
||
|
|
||
|
const COLORPIN0: u8 = 6;
|
||
|
const COLORPIN1: u8 = 7;
|
||
|
|
||
|
const VSYNCPIN: u8 = 9;
|
||
|
|
||
|
const SKIPLINES: u8 = 90;
|
||
|
|
||
|
const VGAX_HEIGHT: usize = 60;
|
||
|
const VGAX_BWIDTH: usize = 30;
|
||
|
const VGAX_WIDTH: usize = VGAX_BWIDTH * 4;
|
||
|
const VGAX_BSIZE: usize = VGAX_BWIDTH * VGAX_HEIGHT;
|
||
|
const VGAX_SIZE: usize = VGAX_WIDTH * VGAX_HEIGHT;
|
||
|
|
||
|
static mut afreq: u8 = 0;
|
||
|
static mut afreq0: u8 = 0;
|
||
|
static mut vtimer: u16 = 0;
|
||
|
static mut aline: u8 = 0;
|
||
|
static mut rlinecnt: u8 = 0;
|
||
|
static mut vskip: u8 = 0;
|
||
|
static vgaxfb: [u8; VGAX_HEIGHT * VGAX_BWIDTH] = [0; VGAX_HEIGHT * VGAX_BWIDTH];
|
||
|
|
||
|
pub unsafe fn begin() {}
|
||
|
|
||
|
#[no_mangle]
|
||
|
pub unsafe extern "avr-interrupt" fn _ivr_timer0_compare_a() {
|
||
|
aline -= 1;
|
||
|
vskip = SKIPLINES;
|
||
|
vtimer += 1;
|
||
|
rlinecnt = 0;
|
||
|
}
|
||
|
|
||
|
#[no_mangle]
|
||
|
pub unsafe extern "avr-interrupt" fn _ivr_timer1_compare_a() {
|
||
|
if vskip != 0 {
|
||
|
vskip -= 1;
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if rlinecnt < VGAX_HEIGHT as u8 {
|
||
|
const DEJITTER_OFFSET: u8 = 1;
|
||
|
const DEJITTER_SYNC: i8 = -2;
|
||
|
|
||
|
llvm_asm!(
|
||
|
r" lds r16, ${timer0}
|
||
|
subi r16, ${tsync}
|
||
|
andi r16, 7
|
||
|
call TL
|
||
|
TL:
|
||
|
pop r31
|
||
|
pop r30
|
||
|
adiw r30, (LW-TL-5)
|
||
|
add r30, r16
|
||
|
ijmp
|
||
|
LW:
|
||
|
nop
|
||
|
nop
|
||
|
nop
|
||
|
nop
|
||
|
nop
|
||
|
nop
|
||
|
nop
|
||
|
LBEND:
|
||
|
"
|
||
|
:
|
||
|
: "{timer0}"(&TCNT0),
|
||
|
"{offset}"(DEJITTER_OFFSET),
|
||
|
"{tsync}"(DEJITTER_SYNC)
|
||
|
: "r30", "r31", "r16"
|
||
|
: "volatile");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
pub mod std {
|
||
|
#[lang = "eh_personality"]
|
||
|
pub unsafe extern "C" fn rust_eh_personality(
|
||
|
_state: (),
|
||
|
_exception_object: *mut (),
|
||
|
_context: *mut (),
|
||
|
) -> () {
|
||
|
}
|
||
|
|
||
|
#[panic_handler]
|
||
|
fn panic(_info: &::core::panic::PanicInfo) -> ! {
|
||
|
loop {}
|
||
|
}
|
||
|
}
|