195 lines
3.6 KiB
Rust
195 lines
3.6 KiB
Rust
#[macro_use]
|
|
extern crate lazy_static;
|
|
extern crate dmd_core;
|
|
extern crate libc;
|
|
|
|
use libc::*;
|
|
use std::sync::Mutex;
|
|
use std::ptr;
|
|
use dmd_core::dmd::Dmd;
|
|
|
|
lazy_static! {
|
|
static ref DMD: Mutex<Dmd> = Mutex::new(Dmd::new());
|
|
}
|
|
|
|
const SUCCESS: c_int = 0;
|
|
const ERROR: c_int = 1;
|
|
const BUSY: c_int = 2;
|
|
|
|
#[no_mangle]
|
|
fn dmd_reset() -> c_int {
|
|
match DMD.lock() {
|
|
Ok(mut dmd) => {
|
|
match dmd.reset() {
|
|
Ok(()) => SUCCESS,
|
|
Err(_) => ERROR
|
|
}
|
|
}
|
|
Err(_) => ERROR
|
|
}
|
|
}
|
|
|
|
#[no_mangle]
|
|
fn dmd_video_ram() -> *const u8 {
|
|
match DMD.lock() {
|
|
Ok(dmd) => {
|
|
match dmd.video_ram() {
|
|
Ok(video_ram) => video_ram.as_ptr(),
|
|
Err(_) => ptr::null()
|
|
}
|
|
}
|
|
Err(_) => ptr::null()
|
|
}
|
|
}
|
|
|
|
#[no_mangle]
|
|
fn dmd_step() -> c_int {
|
|
match DMD.lock() {
|
|
Ok(mut dmd) => {
|
|
dmd.step();
|
|
SUCCESS
|
|
}
|
|
Err(_) => ERROR
|
|
}
|
|
}
|
|
|
|
#[no_mangle]
|
|
fn dmd_step_loop(steps: usize) -> c_int {
|
|
match DMD.lock() {
|
|
Ok(mut dmd) => {
|
|
dmd.run(steps);
|
|
SUCCESS
|
|
},
|
|
Err(_) => ERROR
|
|
}
|
|
}
|
|
|
|
#[no_mangle]
|
|
fn dmd_get_pc(pc: &mut uint32_t) -> c_int {
|
|
match DMD.lock() {
|
|
Ok(dmd) => {
|
|
*pc = dmd.get_pc();
|
|
SUCCESS
|
|
},
|
|
Err(_) => ERROR
|
|
}
|
|
}
|
|
|
|
#[no_mangle]
|
|
fn dmd_get_register(reg: uint8_t, val: &mut uint32_t) -> c_int {
|
|
match DMD.lock() {
|
|
Ok(dmd) => {
|
|
*val = dmd.get_register(reg);
|
|
SUCCESS
|
|
},
|
|
Err(_) => ERROR
|
|
}
|
|
}
|
|
|
|
#[no_mangle]
|
|
fn dmd_get_duart_output_port(oport: &mut uint8_t) -> c_int {
|
|
match DMD.lock() {
|
|
Ok(dmd) => {
|
|
*oport = dmd.duart_output();
|
|
SUCCESS
|
|
}
|
|
Err(_) => ERROR
|
|
}
|
|
}
|
|
|
|
#[no_mangle]
|
|
fn dmd_rx_char(c: uint8_t) -> c_int {
|
|
match DMD.lock() {
|
|
Ok(mut dmd) => {
|
|
dmd.rx_char(c as u8);
|
|
SUCCESS
|
|
}
|
|
Err(_) => ERROR
|
|
}
|
|
}
|
|
|
|
#[no_mangle]
|
|
fn dmd_rx_keyboard(c: uint8_t) -> c_int {
|
|
match DMD.lock() {
|
|
Ok(mut dmd) => {
|
|
dmd.rx_keyboard(c);
|
|
SUCCESS
|
|
}
|
|
Err(_) => ERROR
|
|
}
|
|
}
|
|
|
|
#[no_mangle]
|
|
fn dmd_mouse_move(x: uint16_t, y: uint16_t) -> c_int {
|
|
match DMD.lock() {
|
|
Ok(mut dmd) => {
|
|
dmd.mouse_move(x, y);
|
|
SUCCESS
|
|
}
|
|
Err(_) => ERROR
|
|
}
|
|
}
|
|
|
|
#[no_mangle]
|
|
fn dmd_mouse_down(button: uint8_t) -> c_int {
|
|
match DMD.lock() {
|
|
Ok(mut dmd) => {
|
|
dmd.mouse_down(button);
|
|
SUCCESS
|
|
}
|
|
Err(_) => ERROR
|
|
}
|
|
}
|
|
|
|
#[no_mangle]
|
|
fn dmd_mouse_up(button: uint8_t) -> c_int {
|
|
match DMD.lock() {
|
|
Ok(mut dmd) => {
|
|
dmd.mouse_up(button);
|
|
SUCCESS
|
|
}
|
|
Err(_) => ERROR
|
|
}
|
|
}
|
|
|
|
#[no_mangle]
|
|
fn dmd_tx_poll(tx_char: &mut uint8_t) -> c_int {
|
|
match DMD.lock() {
|
|
Ok(mut dmd) => {
|
|
match dmd.tx_poll() {
|
|
Some(c) => {
|
|
*tx_char = c;
|
|
SUCCESS
|
|
}
|
|
None => BUSY
|
|
}
|
|
}
|
|
Err(_) => ERROR
|
|
}
|
|
}
|
|
|
|
#[no_mangle]
|
|
fn dmd_set_nvram(nvram: &[u8; 8192]) -> c_int {
|
|
match DMD.lock() {
|
|
Ok(mut dmd) => {
|
|
dmd.set_nvram(nvram);
|
|
SUCCESS
|
|
}
|
|
Err(_) => ERROR
|
|
}
|
|
}
|
|
|
|
#[no_mangle]
|
|
fn dmd_get_nvram(nvram: &mut [u8; 8192]) -> c_int {
|
|
match DMD.lock() {
|
|
Ok(dmd) => {
|
|
let buf = dmd.get_nvram();
|
|
for i in 0..8192 {
|
|
nvram[i] = buf[i];
|
|
}
|
|
SUCCESS
|
|
}
|
|
Err(_) => ERROR
|
|
}
|
|
}
|