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; }; };