// JoeyLib lifecycle: init, shutdown, error reporting. // // joeyInit stores configuration, allocates the library-owned screen // surface, and asks the port HAL to set up the display mode. // joeyShutdown tears those down in reverse order. #include #include #include "joey/core.h" #include "codegenArenaInternal.h" #include "hal.h" #include "surfaceInternal.h" // 8 KB fits the largest typical sprite working set (~3-4 KB per // 32x32 sprite at all opaque) and keeps malloc requests small enough // for IIgs ORCA-C's small-memory-model heap to satisfy them. #define DEFAULT_CODEGEN_BYTES (8u * 1024u) // ----- Prototypes ----- static void clearError(void); static void setError(const char *message); // ----- Module state ----- static JoeyConfigT gConfig; static bool gInitialized = false; static const char *gLastError = NULL; // ----- Internal helpers (alphabetical) ----- static void clearError(void) { gLastError = NULL; } static void setError(const char *message) { gLastError = message; } // ----- Public API (alphabetical) ----- bool joeyInit(const JoeyConfigT *config) { clearError(); if (gInitialized) { setError("joeyInit called while already initialized"); return false; } if (config == NULL) { setError("joeyInit called with NULL config"); return false; } memcpy(&gConfig, config, sizeof(gConfig)); // halInit must run before stageAlloc: on IIgs the stage's pixel // buffer comes from halStageAllocPixels, which depends on shadow / // SHR setup that halInit performs. if (!halInit(&gConfig)) { const char *halMsg = halLastError(); setError(halMsg != NULL ? halMsg : "halInit failed"); return false; } if (!stageAlloc()) { setError("failed to allocate stage surface"); halShutdown(); return false; } if (!codegenArenaInit(gConfig.codegenBytes != 0 ? gConfig.codegenBytes : DEFAULT_CODEGEN_BYTES)) { setError("failed to allocate codegen arena"); stageFree(); halShutdown(); return false; } halInputInit(); gInitialized = true; return true; } const char *joeyLastError(void) { return gLastError; } const char *joeyPlatformName(void) { return JOEYLIB_PLATFORM_NAME; } void joeyShutdown(void) { if (!gInitialized) { return; } halInputShutdown(); codegenArenaShutdown(); stageFree(); halShutdown(); gInitialized = false; clearError(); } const char *joeyVersionString(void) { return JOEYLIB_VERSION_STRING; } void joeyWaitVBL(void) { halWaitVBL(); }