#include #include "pico/multicore.h" #include "pico/bootrom.h" #pragma GCC diagnostic error "-Wpedantic" #pragma GCC diagnostic error "-Wall" #include "pico-uxn.h" #include "uxn-boot.h" UXN_INIT_DEFINITIONS static int nil_talk(Device *d, Uint8 b0, Uint8 w) { return 1; } static void sleep_callback(Uxn *u) { __wfi(); } static callback_t *callbacks[33]; static int n_callbacks = 0; static volatile uint32_t waiting_callbacks; int add_main_loop_callback(callback_t *cb) { callbacks[n_callbacks] = cb; return n_callbacks++; } void trigger_main_loop_callback(int b) { waiting_callbacks |= 0x80000000 >> b; } int uxn_halt(Uxn *u, Uint8 error, char *name, int id) { return 0; } int main(void) { for(int i = 0; i < 33; ++i) callbacks[i] = sleep_callback; Uxn u; uxn_boot(&u); memcpy(u.ram.dat + 0x100, uxn_boot_rom, sizeof(uxn_boot_rom)); UXN_INIT_CALLS; for(int i = 0; i < 16; ++i) if(u.dev[i].talk == NULL) uxn_port(&u, i, nil_talk); if(!uxn_eval(&u, 0x100)) reset_usb_boot(0, 0); for(;;) { int b = __builtin_clz(waiting_callbacks); if(b < 32) { waiting_callbacks &= ~(0x80000000 >> b); } else { UXN_TASKS; } callbacks[b](&u); } return 0; }