From 21eca5db927675853ab63bb96586814959b22b07 Mon Sep 17 00:00:00 2001 From: ionut Date: Mon, 27 Apr 2026 20:14:34 +0300 Subject: [PATCH] allowing emulators to change method flags --- TODO.md | 4 ++-- src/main.c | 7 ++++++- src/neonucleus.c | 35 ++++++++++++++++++++++++++++------- src/neonucleus.h | 7 +++++++ 4 files changed, 43 insertions(+), 10 deletions(-) diff --git a/TODO.md b/TODO.md index 24eb4e8..f12378a 100644 --- a/TODO.md +++ b/TODO.md @@ -19,10 +19,10 @@ to be made more portable. Not everything OC has (as a few of them are really MC-centered) but most of it. -- `data` component (note: maybe add hamming code support?) +- `data` component (note: deflate, sha256 and aes impl are callbacks, to keep NN small and simple) - `modem` component - `tunnel` component -- `internet` component +- `internet` component (note: NN does not handle internet requests, those are up to the emulator) - `relay` component (note: OCDoc still refers to it as `access_point`) - `computer` component - `geolyzer` component diff --git a/src/main.c b/src/main.c index ae328c2..66c9b87 100644 --- a/src/main.c +++ b/src/main.c @@ -480,7 +480,7 @@ int main(int argc, char **argv) { nn_mountComponent(c, screen, -1, false); nn_mountComponent(c, ocelotCard, -1, false); //nn_mountComponent(c, tmpfs, -1, false); - nn_mountComponent(c, keyboard, -1, false); + nn_mountComponent(c, keyboard, -1, false); nn_mountComponent(c, eepromCard, 0, false); nn_mountComponent(c, managedfs, 1, false); nn_mountComponent(c, gpuCard, 2, false); @@ -619,6 +619,11 @@ skipDrawScreen:; printf("error: %s\n", nn_getError(c)); goto cleanup; } + e = nn_tickSynchronized(c); + if(e != NN_OK) { + printf("sync method error: %s\n", nn_getError(c)); + goto cleanup; + } nn_ComputerState state = nn_getComputerState(c); if(state == NN_POWEROFF) break; diff --git a/src/neonucleus.c b/src/neonucleus.c index 092f4a9..fe01773 100644 --- a/src/neonucleus.c +++ b/src/neonucleus.c @@ -1779,6 +1779,34 @@ nn_Exit nn_setComponentTypeID(nn_Component *c, const char *internalTypeID) { return NN_OK; } +static nn_MethodEntry *nn_getComponentMethodEntry(nn_Component *c, const char *method) { + nn_MethodEntry ent = { + .name = method, + }; + return nn_hashGet(&c->methodsMap, &ent); +} + +// Sets the method flags +void nn_setComponentMethodFlags(nn_Component *c, const char *method, nn_MethodFlags flags) { + nn_MethodEntry *ent = nn_getComponentMethodEntry(c, method); + if(ent == NULL) return; + ent->flags = flags; +} + +// combines method flags +void nn_addComponentMethodFlags(nn_Component *c, const char *method, nn_MethodFlags flags) { + nn_MethodEntry *ent = nn_getComponentMethodEntry(c, method); + if(ent == NULL) return; + ent->flags |= flags; +} + +// removes method flags +void nn_removeComponentMethodFlags(nn_Component *c, const char *method, nn_MethodFlags flags) { + nn_MethodEntry *ent = nn_getComponentMethodEntry(c, method); + if(ent == NULL) return; + ent->flags &= ~flags; +} + void *nn_getComponentState(nn_Component *c) { return c->state; } @@ -1792,13 +1820,6 @@ size_t nn_countComponentMethods(nn_Component *c) { return c->methodCount; } -static nn_MethodEntry *nn_getComponentMethodEntry(nn_Component *c, const char *method) { - nn_MethodEntry ent = { - .name = method, - }; - return nn_hashGet(&c->methodsMap, &ent); -} - // will fill the methodnames array with the names of the *enabled* methods. // Will set *len to the amount of methods. void nn_getComponentMethods(nn_Component *c, const char **methodnames, size_t *len) { diff --git a/src/neonucleus.h b/src/neonucleus.h index 673106e..ddefdde 100644 --- a/src/neonucleus.h +++ b/src/neonucleus.h @@ -678,6 +678,13 @@ nn_Exit nn_setComponentMethodsArray(nn_Component *c, const nn_Method *methods, s // so the GPU can confirm it is being bound to a screen it knows how to use. nn_Exit nn_setComponentTypeID(nn_Component *c, const char *internalTypeID); +// Sets the method flags +void nn_setComponentMethodFlags(nn_Component *c, const char *method, nn_MethodFlags flags); +// combines method flags +void nn_addComponentMethodFlags(nn_Component *c, const char *method, nn_MethodFlags flags); +// removes method flags +void nn_removeComponentMethodFlags(nn_Component *c, const char *method, nn_MethodFlags flags); + // get component state void *nn_getComponentState(nn_Component *c); // get component class state