83 lines
2.8 KiB
Rust
83 lines
2.8 KiB
Rust
#![no_std]
|
|
#![no_main]
|
|
|
|
use liblbos::fs::{DirectoryReader, FileSystem};
|
|
|
|
#[panic_handler]
|
|
fn panic(info: &core::panic::PanicInfo) -> ! {
|
|
liblbos::syscalls::write_terminal(b"abort\n");
|
|
loop {}
|
|
}
|
|
mod arch;
|
|
|
|
#[unsafe(no_mangle)]
|
|
extern "C" fn main() {
|
|
loop {
|
|
const TURNTBL: &str = "TURNTBL.DDI";
|
|
let mut fs = FileSystem::empty();
|
|
if liblbos::ktask::ktask_fsopen(&mut fs) != 0 {
|
|
liblbos::syscalls::write_terminal(b"failed to open fs\n");
|
|
continue;
|
|
}
|
|
let mut dir = DirectoryReader::empty();
|
|
if liblbos::ktask::ktask_fsopendir(&fs, &mut dir, b"/") != 0 {
|
|
liblbos::syscalls::write_terminal(b"failed to open dir\n");
|
|
continue;
|
|
}
|
|
let mut record = liblbos::fs::Record {
|
|
name: [0; 12],
|
|
record_type: 0,
|
|
target: 0,
|
|
total_size_bytes: 0,
|
|
};
|
|
fn namecmp(record: &liblbos::fs::Record, name: &[u8]) -> bool {
|
|
for (i, &x) in record.name.iter().enumerate() {
|
|
if x == 0 {
|
|
return &record.name[..i] == name;
|
|
}
|
|
}
|
|
false
|
|
}
|
|
while !namecmp(&record, TURNTBL.as_bytes()) {
|
|
if liblbos::ktask::ktask_fsreaddir(&fs, &mut dir, &mut record) != 0 {
|
|
liblbos::syscalls::write_terminal(b"failed to read dir\n");
|
|
continue;
|
|
}
|
|
if record.record_type == 0 {
|
|
liblbos::syscalls::write_terminal(b"unexpected eod\n");
|
|
}
|
|
}
|
|
// found turntable, load it
|
|
let mut reader = liblbos::fs::FileReader::empty();
|
|
if liblbos::ktask::ktask_fsopenfile(&fs, &record, &mut reader) != 0 {
|
|
liblbos::syscalls::write_terminal(b"failed to open file\n");
|
|
continue;
|
|
}
|
|
let size = record.total_size_bytes as usize;
|
|
let buf = liblbos::syscalls::alloc_blocks(size.div_ceil(512));
|
|
if liblbos::ktask::ktask_fsreadfile(&fs, &mut reader, unsafe { core::slice::from_raw_parts_mut(buf as *mut _, size) }) != 0 {
|
|
liblbos::syscalls::write_terminal(b"failed to read file\n");
|
|
}
|
|
|
|
let mut task_setup = liblbos::TaskSetup {
|
|
epc: 0,
|
|
stack_block_count: 2,
|
|
ddi_first_addr: 0,
|
|
ddi_size: 0,
|
|
environment: 0,
|
|
wait_for_task_exit: false,
|
|
};
|
|
|
|
if liblbos::ktask::ktask_loadddifile(buf, size, &mut task_setup as *mut _ as usize) != 0 {
|
|
liblbos::syscalls::write_terminal(b"failed to load ddi\n");
|
|
liblbos::syscalls::free_blocks(buf, size.div_ceil(512));
|
|
continue;
|
|
}
|
|
|
|
liblbos::syscalls::free_blocks(buf, size.div_ceil(512));
|
|
|
|
liblbos::syscalls::create_task(task_setup);
|
|
|
|
liblbos::syscalls::wait_until_alone();
|
|
}
|
|
}
|