#include <string.h>
#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;
}