From e9de55dbc2b23e8752c5c109e3d4b997b7bd6273 Mon Sep 17 00:00:00 2001 From: IonutParau Date: Thu, 29 May 2025 14:16:48 +0200 Subject: [PATCH] magic OpenOS boots but can't render it --- src/components/filesystem.c | 5 ++- src/emulator.c | 12 +++++-- src/neonucleus.h | 63 +++++++++++++++++++++++++++++++++++++ src/sandbox.lua | 2 +- 4 files changed, 77 insertions(+), 5 deletions(-) diff --git a/src/components/filesystem.c b/src/components/filesystem.c index da3895b..b7c5b08 100644 --- a/src/components/filesystem.c +++ b/src/components/filesystem.c @@ -51,7 +51,10 @@ void nn_fs_writeCost(nn_filesystem *fs, size_t count, nn_component *component, n void nn_fs_seekCost(nn_filesystem *fs, size_t count, nn_component *component, nn_computer *computer) { nn_filesystemControl control = nn_fs_getControl(component, fs); - double seekLatency = ((double)control.pretendRPM / 60) * control.pretendChunkSize / fs->spaceTotal(component, fs->userdata); + if(control.pretendRPM == 0) return; // disabled, likely SSD + double rps = (double)control.pretendRPM / 60; + double seekLatency = 1.0 / ((double)fs->spaceTotal(component, fs->userdata) / control.pretendChunkSize) / rps; + printf("Seek Latency: %lf\n", seekLatency); nn_randomLatency(control.randomLatencyMin, control.randomLatencyMax); nn_busySleep(seekLatency * count); diff --git a/src/emulator.c b/src/emulator.c index 795addf..b60c39b 100644 --- a/src/emulator.c +++ b/src/emulator.c @@ -81,7 +81,7 @@ typedef struct ne_fs { nn_filesystemControl ne_fs_getControl(nn_component *component, ne_fs *_) { return (nn_filesystemControl) { .pretendChunkSize = 512, - .pretendRPM = 1800, + .pretendRPM = 12, .writeHeatPerChunk = 0.01, .writeCostPerChunk = 3, .writeEnergyCost = 0.015, @@ -197,6 +197,12 @@ bool ne_fs_makeDirectory(nn_component *component, ne_fs *fs, const char *path) { return MakeDirectory(p) == 0; } +bool ne_fs_exists(nn_component *component, ne_fs *fs, const char *path) { + const char *p = ne_fs_diskPath(component, path); + + return FileExists(p) || DirectoryExists(p); +} + int main() { printf("Setting up universe\n"); nn_universe *universe = nn_newUniverse(); @@ -249,9 +255,9 @@ int main() { .remove = NULL, .lastModified = NULL, .rename = NULL, - .exists = NULL, + .exists = (void *)ne_fs_exists, .isDirectory = (void *)ne_fs_isDirectory, - .makeDirectory = NULL, + .makeDirectory = (void *)ne_fs_makeDirectory, .list = (void *)ne_fs_list, .open = (void *)ne_fs_open, .close = (void *)ne_fs_close, diff --git a/src/neonucleus.h b/src/neonucleus.h index 6a9327a..311ca97 100644 --- a/src/neonucleus.h +++ b/src/neonucleus.h @@ -59,6 +59,7 @@ #define NN_MAX_USER_SIZE 128 #define NN_MAX_SIGNAL_SIZE 8192 #define NN_MAX_OPEN_FILES 128 +#define NN_MAX_SCREEN_KEYBOARDS 64 #define NN_OVERHEAT_MIN 100 #define NN_CALL_HEAT 0.05 @@ -526,4 +527,66 @@ typedef struct nn_drive { nn_drive *nn_volatileDrive(size_t capacity, size_t platterCount, nn_driveControl *control); nn_component *nn_addDrive(nn_computer *computer, nn_address address, int slot, nn_drive *drive); +// Screens and GPUs +typedef struct nn_screen nn_screen; + +typedef struct nn_screenChar { + int codepoint; + int fg; + int bg; + bool isFgPalette; + bool isBgPalette; +} nn_screenChar; + +nn_screen *nn_newScreen(int maxWidth, int maxHeight, int maxDepth, int editableColors, int paletteColors); + +void nn_retainScreen(nn_screen *screen); +void nn_destroyScreen(nn_screen *screen); + +void nn_lockScreen(nn_screen *screen); +void nn_unlockScreen(nn_screen *screen); + +void nn_getResolution(nn_screen *screen, int *width, int *height); +void nn_maxResolution(nn_screen *screen, int *width, int *height); +bool nn_setResolution(nn_screen *screen, int width, int height); + +void nn_getViewport(nn_screen *screen, int *width, int *height); +bool nn_setViewport(nn_screen *screen, int width, int height); + +void nn_getAspectRatio(nn_screen *screen, int *width, int *height); +void nn_setAspectRatio(nn_screen *screen, int width, int height); + +void nn_addKeyboard(nn_screen *screen, nn_address address); +void nn_removeKeyboard(nn_screen *screen, nn_address address); +nn_address nn_getKeyboard(nn_screen *screen, size_t idx); +size_t nn_getKeyboardCount(nn_screen *screen); + +void nn_setEditableColors(nn_screen *screen, int count); +int nn_getEditableColors(nn_screen *screen); +void nn_setPaletteColor(nn_screen *screen, int ); + +int nn_maxDepth(nn_screen *screen); +int nn_getDepth(nn_screen *screen); +void nn_setDepth(nn_screen *screen, int depth); + +void nn_set(nn_screen *screen, int x, int y, nn_screenChar pixel); +nn_screenChar nn_get(nn_screen *screen, int x, int y); + +bool nn_isDirty(nn_screen *screen); +void nn_setDirty(nn_screen *screen, bool dirty); +bool nn_isPrecise(nn_screen *screen); +void nn_setPrecise(nn_screen *screen, bool precise); +bool nn_isTouchModeInverted(nn_screen *screen); +void nn_setTouchModeInverted(nn_screen *screen, bool touchModeInverted); +bool nn_isOn(nn_screen *buffer); +void nn_setOn(nn_screen *buffer, bool on); + +// Easy setup shortcuts. 1-4 are valid. +// Basic tiers: +// - Tier 1 has 50x16 max resolution, 1 bit color depth. 1 editable palette color, used as the accent color. +// - Tier 2 has 80x25 max resolution, 4 bit color depth. 16 fixed palette colors. +// - Tier 3 has 160x50 max resolution, 8 bit color depth. 256 palette colors, 16 are editable, 240 are fixed. +// - Tier 4 has 240x80 max resolution, 16 bit color depth. 256 editable palette colors. +void nn_screen_setBasicTier(nn_screen *screen, int tier); + #endif diff --git a/src/sandbox.lua b/src/sandbox.lua index 75b0560..e95e9f0 100644 --- a/src/sandbox.lua +++ b/src/sandbox.lua @@ -390,7 +390,7 @@ sandbox = { }, utf8 = copy(utf8), - unicode = copy(unicode), + unicode = copy(string), checkArg = checkArg, component = libcomponent, computer = libcomputer,