90 lines
2.1 KiB
Hare
90 lines
2.1 KiB
Hare
use fmt;
|
|
use os;
|
|
use fs;
|
|
use io;
|
|
use strings;
|
|
use unix;
|
|
use unix::poll;
|
|
use uxn;
|
|
|
|
def MAX_CONSOLE_INPUT = 0x1000;
|
|
|
|
export fn main() void = {
|
|
let run = true;
|
|
if(len(os::args) < 2){
|
|
fmt::printf("usage: %s file.rom [args..]\n")!;
|
|
return;
|
|
};
|
|
let path = os::args[1];
|
|
|
|
//Setting up pollfds for unix::poll
|
|
const consolefd: []unix::poll::pollfd = [unix::poll::pollfd {
|
|
fd = os::stdin_file,
|
|
events = unix::poll::event::POLLIN,
|
|
revents = 0,
|
|
} ];
|
|
let state: *uxn::uxn = uxn::uxn_init(path)!;
|
|
uxn::uxn_reset(state);
|
|
|
|
|
|
for (run) {
|
|
if(state.running){
|
|
// fmt::printf("Next Step!\n")!;
|
|
uxn::uxn_step(state)!;
|
|
yield;
|
|
}else{
|
|
if(state.console_vector != 0){
|
|
// fmt::printf("Console!\n")!;
|
|
let args = os::args[2..];
|
|
let i: u8 = 0;
|
|
let argcount = len(args): u8;
|
|
for (let arg .. args){
|
|
// fmt::println("Console input args")!;
|
|
for(let char: u8 .. strings::toutf8(arg)){
|
|
// fmt::printfln("Console input arg char: {:x}", char)!;
|
|
match (uxn::console_input(char,2,state)) {
|
|
case done =>
|
|
yield done;
|
|
case let val: u8 =>
|
|
fmt::fatalf("Unhandled Opcode: {:x}", val);
|
|
};
|
|
};
|
|
let ctype: u8 = if(i == (argcount - 1)){
|
|
yield 4;
|
|
} else {
|
|
yield 3;
|
|
};
|
|
match (uxn::console_input('\n',ctype,state)) {
|
|
case done =>
|
|
yield done;
|
|
case let val: u8 =>
|
|
fmt::fatalf("Unhandled Opcode: {:x}", val);
|
|
};
|
|
i+=1; //TODO using i here seems inelegant
|
|
};
|
|
const pollr = unix::poll::poll(consolefd, unix::poll::NONBLOCK);
|
|
if(pollr > 0){
|
|
// fmt::println("Input!")!;
|
|
let buf: [MAX_CONSOLE_INPUT]u8 = [0...];
|
|
io::read(os::stdin_file, buf)!;
|
|
for( let b .. buf ){
|
|
// fmt::printfln("Input: {}",buf[0])!;
|
|
match (uxn::console_input(b,1,state)) {
|
|
case done =>
|
|
yield done;
|
|
case let val: u8 =>
|
|
fmt::fatalf("Unhandled Opcode: {:x}", val);
|
|
};
|
|
// uxn::console_input(b,1,state);
|
|
};
|
|
};
|
|
|
|
};
|
|
};
|
|
|
|
if(state.dev[0x0f] != 0) run = false;
|
|
|
|
|
|
};
|
|
};
|