scall 0.2.5

Friendlier raw system calls for Rust.
Documentation
use core::arch::asm;

#[inline(always)]
pub unsafe fn syscall0(n: usize) -> usize {
    let ret: usize;
    asm!(
        "mov {r7_tmp}, r7",
        "mov r7, {n}",
        "swi #0",
        "mov r7, {r7_tmp}",
        r7_tmp = out(reg) _,
        n = in(reg) n,
        lateout("r0") ret,
        lateout("lr") _,
    );
    ret
}

#[inline(always)]
pub unsafe fn syscall1(n: usize, a1: usize) -> usize {
    let ret: usize;
    asm!(
        "mov {r7_tmp}, r7",
        "mov r7, {n}",
        "swi #0",
        "mov r7, {r7_tmp}",
        r7_tmp = out(reg) _,
        n = in(reg) n,
        inlateout("r0") a1 => ret,
        lateout("lr") _,
    );
    ret
}

#[inline(always)]
pub unsafe fn syscall2(n: usize, a1: usize, a2: usize) -> usize {
    let ret: usize;
    asm!(
        "mov {r7_tmp}, r7",
        "mov r7, {n}",
        "swi #0",
        "mov r7, {r7_tmp}",
        r7_tmp = out(reg) _,
        n = in(reg) n,
        inlateout("r0") a1 => ret,
        in("r1") a2,
        lateout("lr") _,
    );
    ret
}

#[inline(always)]
pub unsafe fn syscall3(n: usize, a1: usize, a2: usize, a3: usize) -> usize {
    let ret: usize;
    asm!(
        "mov {r7_tmp}, r7",
        "mov r7, {n}",
        "swi #0",
        "mov r7, {r7_tmp}",
        r7_tmp = out(reg) _,
        n = in(reg) n,
        inlateout("r0") a1 => ret,
        in("r1") a2,
        in("r2") a3,
        lateout("lr") _,
    );
    ret
}

#[inline(always)]
pub unsafe fn syscall4(n: usize, a1: usize, a2: usize, a3: usize, a4: usize) -> usize {
    let ret: usize;
    asm!(
        "mov {r7_tmp}, r7",
        "mov r7, {n}",
        "swi #0",
        "mov r7, {r7_tmp}",
        r7_tmp = out(reg) _,
        n = in(reg) n,
        inlateout("r0") a1 => ret,
        in("r1") a2,
        in("r2") a3,
        in("r3") a4,
        lateout("lr") _,
    );
    ret
}

#[inline(always)]
pub unsafe fn syscall5(n: usize, a1: usize, a2: usize, a3: usize, a4: usize, a5: usize) -> usize {
    let ret: usize;
    asm!(
        "mov {r7_tmp}, r7",
        "mov r7, {n}",
        "swi #0",
        "mov r7, {r7_tmp}",
        r7_tmp = out(reg) _,
        n = in(reg) n,
        inlateout("r0") a1 => ret,
        in("r1") a2,
        in("r2") a3,
        in("r3") a4,
        in("r4") a5,
        lateout("lr") _,
    );
    ret
}

#[inline(always)]
pub unsafe fn syscall6(
    n: usize,
    a1: usize,
    a2: usize,
    a3: usize,
    a4: usize,
    a5: usize,
    a6: usize,
) -> usize {
    let ret: usize;
    asm!(
        "mov {r7_tmp}, r7",
        "mov r7, {n}",
        "swi #0",
        "mov r7, {r7_tmp}",
        r7_tmp = out(reg) _,
        n = in(reg) n,
        inlateout("r0") a1 => ret,
        in("r1") a2,
        in("r2") a3,
        in("r3") a4,
        in("r4") a5,
        in("r5") a6,
        lateout("lr") _,
    );
    ret
}

#[inline(always)]
pub unsafe fn syscall7(
    n: usize,
    a1: usize,
    a2: usize,
    a3: usize,
    a4: usize,
    a5: usize,
    a6: usize,
    a7: usize,
) -> usize {
    let ret: usize;
    asm!(
        "push {{r6}}",
        "mov r6, {a7}",
        "mov {r7_tmp}, r7",
        "mov r7, {n}",
        "swi #0",
        "mov r7, {r7_tmp}",
        "pop {{r6}}",
        a7 = in(reg) a7,
        r7_tmp = out(reg) _,
        n = in(reg) n,
        inlateout("r0") a1 => ret,
        in("r1") a2,
        in("r2") a3,
        in("r3") a4,
        in("r4") a5,
        in("r5") a6,
        lateout("lr") _,
    );
    ret
}

pub use syscall0 as syscall0_nofail;
pub use syscall1 as syscall1_nofail;
pub use syscall2 as syscall2_nofail;
pub use syscall3 as syscall3_nofail;
pub use syscall4 as syscall4_nofail;
pub use syscall5 as syscall5_nofail;
pub use syscall6 as syscall6_nofail;
pub use syscall7 as syscall7_nofail;