// Scenery loader. Reads one of the FS2 region .dsk-equivalent files // (extracted from the san-inc-pack ProDOS image, see // downloads/scenery/extracted/) into memory and exposes the raw // bytestream so `sceneryVm` can interpret it. #ifndef SCENERY_DATA_H #define SCENERY_DATA_H #include #include typedef enum SceneryRegionE { SCENERY_NONE = 0, SCENERY_FS2_1, // Built-in WW1 Ace training field (FS2 base disk default) SCENERY_FS2_1_CHICAGO, // FS2 base disk - Chicago / Meigs Field (LoadSceneryFile1) SCENERY_FS2_1_LA, // FS2 base disk - Los Angeles (LoadSceneryFile2) SCENERY_FS2_1_SEATTLE, // FS2 base disk - Seattle (LoadSceneryFile3) SCENERY_FS2_1_NY, // FS2 base disk - New York / Kennedy (LoadSceneryFile4) SCENERY_SD1, // Dallas-Ft.Worth, Houston, San Antonio, Brownsville SCENERY_SD2, // Phoenix, Albuquerque, El Paso SCENERY_SD3, // San Francisco, Los Angeles, Las Vegas SCENERY_SD4, // Klamath Falls, Seattle, Great Falls SCENERY_SD5, // Salt Lake City, Cheyenne, Denver SCENERY_SD6, // Omaha, Wichita, Kansas City SCENERY_SD7A, // Washington, Charlotte SCENERY_SD7B, // Jacksonville, Miami SCENERY_SD11, // Lake Huron, Detroit SCENERY_SD13, // Japan - Tokyo, Osaka SCENERY_SD14A, // Western European Tour - S. UK, N. France SCENERY_SD14B, // Western European Tour - N. France, S. West Germany SCENERY_SDS1, // STAR San Francisco & The Bay Area SCENERY_REGION_COUNT } SceneryRegionE; typedef struct SceneryDataT { SceneryRegionE region; const uint8_t *bytes; // points into a 64K RAM image (the result of running fs2trace's boot mode); whole image is memory-addressable uint32_t length; // 65536 for RAM images; smaller for the legacy .SD payload path uint16_t entryOffset; // bytecode entry pointer for ProcessScenery; for RAM images this is `bytes[0xA7E0] | (bytes[0xA7E1] << 8)` (LA7E0); falls back to the legacy 0x7000 for raw .SD loads const char *name; // human-readable region label // Raw .SD scenery file (143KB-ish). Used by sceneryVm's HEADER // demand-load to copy section-specific bytecode over the $79 // padding at $A848+. Indexed in 256-byte sectors per the chunk5 // descriptor format: sector N = file offset N*256. const uint8_t *sceneryFile; uint32_t sceneryFileSize; } SceneryDataT; // Load the named region's bytes into memory. Returns true on success // and populates `*out`. The first scenery payload byte starts at the // returned `bytes` pointer; the caller should call `sceneryDataFree` // when done. Searches for the .dsk file in: // - downloads/scenery/extracted/A2.SD // - ../downloads/scenery/extracted/A2.SD // - ../../downloads/scenery/extracted/A2.SD // - /home/scott/claude/flight/downloads/scenery/extracted/A2.SD bool sceneryDataLoad(SceneryRegionE region, SceneryDataT *out); // Release the buffer allocated by `sceneryDataLoad`. void sceneryDataFree(SceneryDataT *out); // Human-readable name for a region. Always returns a non-NULL string. const char *sceneryDataRegionName(SceneryRegionE region); // Reverse-lookup: map the basename string used by SCENERY_REGION // (e.g. "FS2.1", "FS2.1_chicago", "SD3", "SD14B") back to its enum. // Accepts the bare SD form ("SD3") as well as the "A2.SD3" full form. // Returns SCENERY_NONE if unrecognised. SceneryRegionE sceneryDataRegionFromName(const char *name); #endif