diff --git a/AGENTS.md b/AGENTS.md index c3bf9495..d06474ca 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -45,7 +45,7 @@ Run `/linkcheck` for this sweep. Record new findings in `docs/PCPortResearch.md` - **Phase 0 (scaffolding):** done, committed. - **Compile+link milestone:** all ~235 TUs compile and `ge007.x86_64.exe` links clean (`ninja ge007 -k 0`, 236/236). Findings D7–D17 in `docs/PCPortResearch.md` §11; asset stubs in `port/src/assetstubs.c`, fast3d no-ops in `port/src/gfxstub.c` (delete when real fast3d lands). -- **Phase 1 (boot to window):** remaining — ROM loading in `romdata.c` (currently a TODO), run the binary, wire gfx stubs to a real window. +- **Phase 1 (boot to window):** done — ROM loads/validates/maps at cart base 0x10000000 (`romdata.c`), SDL2 window + GL clear loop (`video.c`), absolute asset symbols from `scripts/gen_romassets.py` → `port/src/romassets_.s` (findings D18–D23). - **Phase 2 (rendering):** bring in PD fast3d (replaces `port/src/gfxstub.c`), verify custom CC/RM modes against `gmain.s`, port the scheduler; replace asset stubs with ROM-backed data (D16). - **Phase 2 (rendering):** bring in PD fast3d, verify custom CC/RM modes against `gmain.s`, port the scheduler. - **Phase 3 (audio + input):** libaudio → SDL; decide the ASP strategy (C2: `aspMain*` dummies in `ucode.c`). diff --git a/CMakeLists.txt b/CMakeLists.txt index be74f7a3..cf712532 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -44,7 +44,9 @@ if(APPLE) endif() endif() -project(ge007 C CXX) +# ASM is needed for the generated absolute ROM asset symbols +# (port/src/romassets_.s, see scripts/gen_romassets.py). +project(ge007 C CXX ASM) include(TargetArch) include(FindPkgConfig) @@ -99,18 +101,21 @@ message(STATUS "Target platform: ${TARGET_PLATFORM}") if(ROMID STREQUAL "ntsc-final") set(VERSION_IS_PAL 0) set(BIN_REGION "") + set(ASSET_REGION "u") set(REGION_DEFS -DVERSION_US -DLANG_US -DREFRESH_NTSC -DLEFTOVERDEBUG -DLEFTOVERSPECTRUM -DBUGFIX_R0 -DBYTEMATCH) elseif(ROMID STREQUAL "pal-final") set(VERSION_IS_PAL 1) set(BIN_REGION ".pal") + set(ASSET_REGION "e") set(REGION_DEFS -DVERSION_EU -DLANG_EU -DREFRESH_PAL -DBUGFIX_R1 -DBUGFIX_R2 -DBYTEMATCH) elseif(ROMID STREQUAL "jpn-final") set(VERSION_IS_PAL 0) set(BIN_REGION ".jpn") + set(ASSET_REGION "j") set(REGION_DEFS -DVERSION_JP -DLANG_JP -DREFRESH_NTSC -DBUGFIX_R1 -DLEFTOVERDEBUG -DLEFTOVERSPECTRUM -DBYTEMATCH) @@ -255,6 +260,15 @@ file(GLOB_RECURSE SRC_PORT "${CMAKE_SOURCE_DIR}/port/src/*.c") file(GLOB_RECURSE SRC_PORT_CXX "${CMAKE_SOURCE_DIR}/port/src/*.cpp") file(GLOB_RECURSE SRC_FAST3D "${CMAKE_SOURCE_DIR}/port/fast3d/*.cpp") +# Generated absolute ROM asset symbols for this region (see +# scripts/gen_romassets.py). Defines every obseg/ramrom/music label and the +# ge007.ld segment markers as 0x10000000 + rom_offset, so `&symbol` / romCopy() +# work once romdata.c maps the .z64 at 0x10000000. +set(SRC_ROMASSETS "${CMAKE_SOURCE_DIR}/port/src/romassets_${ASSET_REGION}.s") +if(NOT EXISTS ${SRC_ROMASSETS}) + message(FATAL_ERROR "Missing ${SRC_ROMASSETS} — run: python3 scripts/gen_romassets.py ${ASSET_REGION}") +endif() + # Game code — compiled unmodified. file(GLOB_RECURSE SRC_GAME "${CMAKE_SOURCE_DIR}/src/game/*.c") @@ -296,10 +310,11 @@ list(PREPEND SRC_LIBULTRARE_LIBC "${CMAKE_SOURCE_DIR}") # `intro`, ...) that the N64 build keeps apart by linking every file into its # own ELF (see assets/obseg/Makefile.*). In a single host link they collide. # The game loads those blobs from ROM at runtime anyway; their top-level -# symbols (C*Z, G*Z, P*Z, Tbg_*Z, U*Z, L*E/L*J, bg_*_all_p_seg, ...) are -# stubbed in port/src/assetstubs.c until Phase 2 ROM loading. The per-model -# data itself (chr/*/Model.c etc.) is gitignored ROM-derived and absent from -# this checkout. See docs/PCPortResearch.md §11. +# symbols (C*Z, G*Z, P*Z, Tbg_*Z, U*Z, L*E/L*J, bg_*_all_p_seg, ...) are now +# absolute cart addresses in the generated romassets_.s (see +# scripts/gen_romassets.py), backed by the ROM image that romdata.c maps at +# 0x10000000. The per-model data itself (chr/*/Model.c etc.) is gitignored +# ROM-derived and absent from this checkout. See docs/PCPortResearch.md §11. set(SRC_ASSETS assets/animationtable_data.c assets/animationtable_entries.c @@ -361,6 +376,7 @@ list(PREPEND SRC_ENGINE "${CMAKE_SOURCE_DIR}") set(SRC ${SRC_GAME} ${SRC_PORT} + ${SRC_ROMASSETS} ${SRC_PORT_CXX} ${SRC_FAST3D} ${SRC_LIBAUDIO} diff --git a/docs/PCPortResearch.md b/docs/PCPortResearch.md index ec28dca7..8b2185e1 100644 --- a/docs/PCPortResearch.md +++ b/docs/PCPortResearch.md @@ -665,13 +665,71 @@ in the same change. Where a fix could not be made purely in `port/`, the minimal implementations of every entry point (plus `gfx_current_dimensions`) so video.c links. **Delete it when the real fast3d sources are added** (same symbols → duplicate-definition error if both remain). +* **D18 — GE ROM header offsets.** The N64 header is GE-specific + (`src/rom_header.s`): magic `0x80371240` @0x00, ROM name "GOLDENEYE" @0x20, + cartridge ID "GE" **@0x3C**, country byte **@0x3E** ('E' US / 'P' EU / + 'J' JP), version @0x3F. The standard-N64 offsets (ID @0x38, country @0x3A) + are wrong for GE — verified against `baserom.u.z64` (hexdump: `... 47 45 + 45 00` at 0x3C–0x3F). romdata.c validates all four fields. +* **D19 — music table is big-endian in the ROM.** The `.music` section of + `assets/music/music.s` (the `RareALSeqBankFile` header + 63 × 8-byte + `music_table_entry` records) is stored in the ROM in **big-endian** word + order: at 0x419790 the bytes are `00 3f 00 00 | 00 00 01 fc` = BE u16 + seqCount=63 (= NUM_MUSIC_TRACKS), BE u16 unk=0, then BE u32 offset 508 for + the first track. The N64 build evidently assembles that section with + big-endian output; the PC port never reassembles it — the CSV offsets are + unaffected and `musicSeqPlayerInit()`'s romCopy + `musicSeqFileNew()` + patching work on the raw bytes unchanged. +* **D20 — US music tracks are RLE-compressed in ROM.** The `music_file` + macro incbins `build/u/assets/music/.rz` under `.ifdef VERSION_US`, so + every M* track lives in the ROM 1172/RLE-compressed; the filelist sizes are + the compressed lengths and per-track `end_` symbols = start + csv_size are + correct boundaries. Decompression happens at playback (Phase 3 audio), not + at load — no Phase-1/2 action needed. +* **D21 — scanner-prefixed manifest names.** `filelist..csv` contains + entries whose file column is prefixed with the scan origin, e.g. + `assets/ge007.u.117880.jfont_dl.bin` (real name `jfont_dl.bin`). + gen_romassets.py aliases such names to their suffix after the + `ge007...` prefix, so font/image/oddtexture segments resolve. +* **D22 — CMake silently skips `.s` files without ASM enabled.** The first + assembly source in the PC build (`romassets_u.s`) was added to the target + but never compiled: `project(ge007 C CXX)` had no ASM language, and CMake + does not error on unknown extensions — it just drops them, surfacing only as + a wall of undefined asset symbols at link. Fixed with + `project(ge007 C CXX ASM)`. Lesson: when adding a new source *extension*, + verify the object file actually appears in the build graph. +* **D23 — absolute cart-address asset symbols (Phase 1 approach).** Instead of + zeroed stubs (D16), every ROM asset symbol is now an ABSOLUTE cart address: + `scripts/gen_romassets.py` emits `port/src/romassets_.s` defining all + obseg labels (in `file_resource_table.inc.c` order — ob.c computes file + sizes as `table[i+1].hw_address - table[i].hw_address`, so order matters), + ramrom files, music tracks/markers, and the ge007.ld segment markers as + `0x10000000 + rom_offset` from `filelist..csv`. romdata.c maps the .z64 + at exactly 0x10000000 (VirtualAlloc preferred address), so `&symbol` is a + live host pointer and the PI shims (`osPiStartDma`/`osPiRawStartDma` in + libultra.c) service reads as bounds-checked memcpys. This makes both DMA'd + assets (models, banks) and direct-read assets (fonts, image display lists) + work with unmodified game code. `assetstubs.c` is deleted; n64stubs.c keeps + only the pure-RAM segment symbols (`_bssSegmentEnd`, `_csegment*`, + `_inflate/_gameSegmentVaddr*`). US-only for now: EU/JPN manifests have + naming inconsistencies (trailing-Z add/drop, region subdirs) that need the + same treatment before those regions build. ### E. Compile + link milestone (status) -All ~235 translation units now compile and the target **links**: clean build -from scratch is `236/236` steps, zero errors (`ninja ge007 -k 0`), producing +All ~235 translation units compile and the target **links**: clean build from +scratch is `236/236` steps, zero errors (`ninja ge007 -k 0`), producing `ge007.x86_64.exe`. Remaining warnings (~4.5k) are expected IDO-leniency noise (int-conversion, implicit declarations, etc.), demoted via the CMake warning -flags. The binary is not yet runnable end-to-end: gfx is stubbed (D17), asset -model/level data is zeroed (D16), and ROM loading is still a Phase-2 TODO in -romdata.c. +flags. + +**Phase 1 (boot to window) is done:** `romdata.c` loads and validates the ROM +(`baserom.u.z64` at the repo root, or a final .z64 in `data/` / next to the +exe), maps it at cart base 0x10000000 (D23); `video.c` opens an SDL2 640×480 +window with a GL context and clears/presents every frame; `main.c` runs a +demo loop (ESC quits) in place of `mainproc()`, which is deferred until the +software RSP + scheduler can service real frames. Verified: ROM header passes +validation, 12 MB mapped at 0x10000000, window renders for the full test +duration. Asset symbol spot-checks against the ROM confirm correct offsets +(e.g. music bank BE seqCount=63 @0x419790, first track offset 508 → Mno_music +@0x41998C; sfx/instrument banks start with GE's `B1` header). diff --git a/port/include/romdata.h b/port/include/romdata.h index 9822a8fb..d72f7eae 100644 --- a/port/include/romdata.h +++ b/port/include/romdata.h @@ -24,11 +24,18 @@ extern "C" { int romdataInit(void); void romdataDestroy(void); -/* Pointer to the loaded ROM image (start of the .z64). */ +/* Pointer to the loaded ROM image (start of the .z64). When the image is + * mapped at the N64 cart base this is 0x10000000 itself. */ const u8 *romdataGetRom(void); /* Size of the loaded ROM in bytes. */ u32 romdataGetRomSize(void); +/* + * True if [addr, addr+size) is a valid cart address (0x10000000+) inside the + * mapped image. The PI shims call this before servicing DMA. + */ +int romdataCartAddrValid(u32 addr, u32 size); + /* * Map an N64 virtual address (0xA0000000 RDRAM space) to the corresponding * pointer in the loaded image. Used to resolve asset/segment references. diff --git a/port/include/video.h b/port/include/video.h index fbbca45d..be5d458c 100644 --- a/port/include/video.h +++ b/port/include/video.h @@ -26,6 +26,10 @@ void videoStartFrame(void); void videoSubmitCommands(Gfx *cmds); /* runs the software RSP on the list */ void videoEndFrame(void); +/* Pump window events; returns 1 when the app should quit. Used by the + * Phase 1 demo loop until the scheduler owns the frame boundary. */ +int videoHandleEvents(void); + /* VSync / framerate control. */ void videoSetVsync(int enabled); void videoSetFramerateLimit(int fps); /* 0 = unlimited */ diff --git a/port/src/assetstubs.c b/port/src/assetstubs.c deleted file mode 100644 index 26c63e9a..00000000 --- a/port/src/assetstubs.c +++ /dev/null @@ -1,816 +0,0 @@ -/* - * Link stubs for ROM asset data that is NOT present in this checkout. - * - * The N64 build gets these symbols from assets/obseg/ob_seg.s and the per- - * category .s files: each model/level file is compressed to a .rz blob and - * .incbin'ed into the ROM at link time (the blobs are gitignored, ROM- - * derived). The decompiled C sources for them (chr//Model.c etc.) - * are also absent. ob.c's file_resource_table references every one of these symbols - * by address, so they must exist to link. - * - * Each is a single zero word: just enough to satisfy the linker and any - * &symbol reference. The game never meaningfully reads them in Phase 1; - * real data arrives with ROM loading in Phase 2 (romdata.c), which will also - * replace file_resource_table's address arithmetic. See - * docs/PCPortResearch.md section 11. - */ - -#include - -/* --- Character models (C*Z) --------------------------------------------- */ -u32 CarmourguardZ[1] = {0}; -u32 CbaronsamediZ[1] = {0}; -u32 CbluecamguardZ[1] = {0}; -u32 CbluemanZ[1] = {0}; -u32 CbluewomanZ[1] = {0}; -u32 CboilerbondZ[1] = {0}; -u32 CboilertrevZ[1] = {0}; -u32 CborisZ[1] = {0}; -u32 CcamguardZ[1] = {0}; -u32 CcardimanZ[1] = {0}; -u32 CcheckmanZ[1] = {0}; -u32 CcommguardZ[1] = {0}; -u32 CdjbondZ[1] = {0}; -u32 CfattechwomanZ[1] = {0}; -u32 Cgreatguard2Z[1] = {0}; -u32 CgreatguardZ[1] = {0}; -u32 CgreyguardZ[1] = {0}; -u32 CgreymanZ[1] = {0}; -u32 CheadalanZ[1] = {0}; -u32 CheadbZ[1] = {0}; -u32 CheadbalaclavaZ[1] = {0}; -u32 CheadbikeZ[1] = {0}; -u32 CheadbrosnanZ[1] = {0}; -u32 CheadbrosnanboilerZ[1] = {0}; -u32 CheadbrosnansnowZ[1] = {0}; -u32 CheadbrosnansuitZ[1] = {0}; -u32 CheadbrosnantimberZ[1] = {0}; -u32 CheadchrisZ[1] = {0}; -u32 CheaddaveZ[1] = {0}; -u32 CheaddesZ[1] = {0}; -u32 CheadduncanZ[1] = {0}; -u32 CheaddwayneZ[1] = {0}; -u32 CheadgrahamZ[1] = {0}; -u32 CheadgrantZ[1] = {0}; -u32 CheadjimZ[1] = {0}; -u32 Cheadjoe2Z[1] = {0}; -u32 CheadjoeZ[1] = {0}; -u32 CheadjoelZ[1] = {0}; -u32 CheadkarlZ[1] = {0}; -u32 CheadkenZ[1] = {0}; -u32 CheadleeZ[1] = {0}; -u32 CheadmandyZ[1] = {0}; -u32 CheadmarionZ[1] = {0}; -u32 CheadmarkZ[1] = {0}; -u32 CheadmartinZ[1] = {0}; -u32 CheadmishkinZ[1] = {0}; -u32 CheadneilZ[1] = {0}; -u32 CheadpeteZ[1] = {0}; -u32 CheadrobinZ[1] = {0}; -u32 CheadsallyZ[1] = {0}; -u32 CheadscottZ[1] = {0}; -u32 CheadshaunZ[1] = {0}; -u32 CheadsteveeZ[1] = {0}; -u32 CheadstevehZ[1] = {0}; -u32 CheadvivienZ[1] = {0}; -u32 CjawsZ[1] = {0}; -u32 CjeanwomanZ[1] = {0}; -u32 CmaydayZ[1] = {0}; -u32 CmoonfemaleZ[1] = {0}; -u32 CmoonguardZ[1] = {0}; -u32 CnatalyaZ[1] = {0}; -u32 CnavyguardZ[1] = {0}; -u32 CoddjobZ[1] = {0}; -u32 ColiveguardZ[1] = {0}; -u32 CorumovZ[1] = {0}; -u32 CpilotZ[1] = {0}; -u32 CredmanZ[1] = {0}; -u32 CrusguardZ[1] = {0}; -u32 CsnowbondZ[1] = {0}; -u32 CsnowguardZ[1] = {0}; -u32 CspicebondZ[1] = {0}; -u32 Csuit_lf_handZ[1] = {0}; -u32 CsuitbondZ[1] = {0}; -u32 CtechmanZ[1] = {0}; -u32 CtechwomanZ[1] = {0}; -u32 CtimberbondZ[1] = {0}; -u32 CtrevelyanZ[1] = {0}; -u32 CtrevguardZ[1] = {0}; -u32 CvalentinZ[1] = {0}; -u32 CxeniaZ[1] = {0}; - -/* --- Gun / prop-object models (G*Z) ---------------------------------- */ -u32 Gak47Z[1] = {0}; -u32 GaudiotapeZ[1] = {0}; -u32 GautoshotZ[1] = {0}; -u32 GblackboxZ[1] = {0}; -u32 GblueprintsZ[1] = {0}; -u32 GbombcaseZ[1] = {0}; -u32 GbombdefuserZ[1] = {0}; -u32 GbriefcaseZ[1] = {0}; -u32 GbugZ[1] = {0}; -u32 GbugdetectorZ[1] = {0}; -u32 GbungeeZ[1] = {0}; -u32 GcameraZ[1] = {0}; -u32 GcartblueZ[1] = {0}; -u32 GcartridgeZ[1] = {0}; -u32 GcartrifleZ[1] = {0}; -u32 GcartshellZ[1] = {0}; -u32 GcircuitboardZ[1] = {0}; -u32 GclipboardZ[1] = {0}; -u32 GcreditcardZ[1] = {0}; -u32 GdarkglassesZ[1] = {0}; -u32 GdatathiefZ[1] = {0}; -u32 GdattapeZ[1] = {0}; -u32 GdoordecoderZ[1] = {0}; -u32 GdoorexploderZ[1] = {0}; -u32 GdossierredZ[1] = {0}; -u32 GdynamiteZ[1] = {0}; -u32 GexplosivefloppyZ[1] = {0}; -u32 GexplosivepenZ[1] = {0}; -u32 GextinguisherZ[1] = {0}; -u32 GfingergunZ[1] = {0}; -u32 GfistZ[1] = {0}; -u32 GflarepistolZ[1] = {0}; -u32 Gfnp90Z[1] = {0}; -u32 GgaskeyringZ[1] = {0}; -u32 GgoldbarZ[1] = {0}; -u32 GgoldeneyekeyZ[1] = {0}; -u32 GgoldengunZ[1] = {0}; -u32 GgoldwppkZ[1] = {0}; -u32 GgrenadeZ[1] = {0}; -u32 GgrenadelaunchZ[1] = {0}; -u32 GheroinZ[1] = {0}; -u32 GjoypadZ[1] = {0}; -u32 GkeyanalysercaseZ[1] = {0}; -u32 GkeyboltZ[1] = {0}; -u32 GkeycardZ[1] = {0}; -u32 GkeyyaleZ[1] = {0}; -u32 GknifeZ[1] = {0}; -u32 GlaserZ[1] = {0}; -u32 GlectreZ[1] = {0}; -u32 GlockexploderZ[1] = {0}; -u32 Gm16Z[1] = {0}; -u32 GmapZ[1] = {0}; -u32 GmicrocameraZ[1] = {0}; -u32 GmicrocodeZ[1] = {0}; -u32 GmicrofilmZ[1] = {0}; -u32 GmoneyZ[1] = {0}; -u32 Gmp5kZ[1] = {0}; -u32 Gmp5ksilZ[1] = {0}; -u32 GpitongunZ[1] = {0}; -u32 GplansZ[1] = {0}; -u32 GplastiqueZ[1] = {0}; -u32 GpolarizedglassesZ[1] = {0}; -u32 GproximitymineZ[1] = {0}; -u32 GremotemineZ[1] = {0}; -u32 GrocketlaunchZ[1] = {0}; -u32 GrugerZ[1] = {0}; -u32 GsafecrackercaseZ[1] = {0}; -u32 GshotgunZ[1] = {0}; -u32 GsilverwppkZ[1] = {0}; -u32 GskorpionZ[1] = {0}; -u32 GsniperrifleZ[1] = {0}; -u32 GspectreZ[1] = {0}; -u32 GspooltapeZ[1] = {0}; -u32 GspyfileZ[1] = {0}; -u32 GstafflistZ[1] = {0}; -u32 GtaserZ[1] = {0}; -u32 GthrowknifeZ[1] = {0}; -u32 GtimedmineZ[1] = {0}; -u32 GtriggerZ[1] = {0}; -u32 Gtt33Z[1] = {0}; -u32 GuziZ[1] = {0}; -u32 GvideotapeZ[1] = {0}; -u32 GwatchcommunicatorZ[1] = {0}; -u32 GwatchgeigercounterZ[1] = {0}; -u32 GwatchidentifierZ[1] = {0}; -u32 GwatchlaserZ[1] = {0}; -u32 GwatchmagnetattractZ[1] = {0}; -u32 GwatchmagnetrepelZ[1] = {0}; -u32 GweaponcaseZ[1] = {0}; -u32 GwppkZ[1] = {0}; -u32 GwppksilZ[1] = {0}; -u32 GwristdartZ[1] = {0}; - -/* --- Prop models (P*Z) ------------------------------------------------- */ -u32 PICBMZ[1] = {0}; -u32 PICBM_noseZ[1] = {0}; -u32 Pak47magZ[1] = {0}; -u32 Palarm1Z[1] = {0}; -u32 Palarm2Z[1] = {0}; -u32 Pammo_crate1Z[1] = {0}; -u32 Pammo_crate2Z[1] = {0}; -u32 Pammo_crate3Z[1] = {0}; -u32 Pammo_crate4Z[1] = {0}; -u32 Pammo_crate5Z[1] = {0}; -u32 PapcZ[1] = {0}; -u32 Parchsecdoor1Z[1] = {0}; -u32 Parchsecdoor2Z[1] = {0}; -u32 ParticZ[1] = {0}; -u32 PartictrailerZ[1] = {0}; -u32 PbarricadeZ[1] = {0}; -u32 Pbin1Z[1] = {0}; -u32 Pblotter1Z[1] = {0}; -u32 PbodyarmourZ[1] = {0}; -u32 PbodyarmourvestZ[1] = {0}; -u32 PbollardZ[1] = {0}; -u32 PbombZ[1] = {0}; -u32 Pbook1Z[1] = {0}; -u32 Pbookshelf1Z[1] = {0}; -u32 Pborg_crateZ[1] = {0}; -u32 PboxcartridgesZ[1] = {0}; -u32 Pboxes2x4Z[1] = {0}; -u32 Pboxes3x4Z[1] = {0}; -u32 Pboxes4x4Z[1] = {0}; -u32 PbrakeunitZ[1] = {0}; -u32 Pbridge_console1aZ[1] = {0}; -u32 Pbridge_console1bZ[1] = {0}; -u32 Pbridge_console2aZ[1] = {0}; -u32 Pbridge_console2bZ[1] = {0}; -u32 Pbridge_console3aZ[1] = {0}; -u32 Pbridge_console3bZ[1] = {0}; -u32 PcarbmwZ[1] = {0}; -u32 Pcard_box1Z[1] = {0}; -u32 Pcard_box2Z[1] = {0}; -u32 Pcard_box3Z[1] = {0}; -u32 Pcard_box4_lgZ[1] = {0}; -u32 Pcard_box5_lgZ[1] = {0}; -u32 Pcard_box6_lgZ[1] = {0}; -u32 PcarescortZ[1] = {0}; -u32 PcargolfZ[1] = {0}; -u32 PcarweirdZ[1] = {0}; -u32 PcarzilZ[1] = {0}; -u32 PcctvZ[1] = {0}; -u32 PchraudiotapeZ[1] = {0}; -u32 PchrautoshotZ[1] = {0}; -u32 PchrblackboxZ[1] = {0}; -u32 PchrblueprintsZ[1] = {0}; -u32 PchrbombcaseZ[1] = {0}; -u32 PchrbombdefuserZ[1] = {0}; -u32 PchrbriefcaseZ[1] = {0}; -u32 PchrbugZ[1] = {0}; -u32 PchrbugdetectorZ[1] = {0}; -u32 PchrbungeeZ[1] = {0}; -u32 PchrcameraZ[1] = {0}; -u32 PchrcircuitboardZ[1] = {0}; -u32 PchrclipboardZ[1] = {0}; -u32 PchrcreditcardZ[1] = {0}; -u32 PchrdarkglassesZ[1] = {0}; -u32 PchrdatathiefZ[1] = {0}; -u32 PchrdattapeZ[1] = {0}; -u32 PchrdoordecoderZ[1] = {0}; -u32 PchrdoorexploderZ[1] = {0}; -u32 PchrdossierredZ[1] = {0}; -u32 PchrdynamiteZ[1] = {0}; -u32 PchrexplosivepenZ[1] = {0}; -u32 PchrextinguisherZ[1] = {0}; -u32 PchrfingergunZ[1] = {0}; -u32 PchrflarepistolZ[1] = {0}; -u32 Pchrfnp90Z[1] = {0}; -u32 PchrgaskeyringZ[1] = {0}; -u32 PchrgoldbarZ[1] = {0}; -u32 PchrgoldenZ[1] = {0}; -u32 PchrgoldeneyekeyZ[1] = {0}; -u32 PchrgoldwppkZ[1] = {0}; -u32 PchrgrenadeZ[1] = {0}; -u32 PchrgrenadelaunchZ[1] = {0}; -u32 PchrgrenaderoundZ[1] = {0}; -u32 PchrheroinZ[1] = {0}; -u32 PchrkalashZ[1] = {0}; -u32 PchrkeyanalysercaseZ[1] = {0}; -u32 PchrkeyboltZ[1] = {0}; -u32 PchrkeyyaleZ[1] = {0}; -u32 PchrknifeZ[1] = {0}; -u32 PchrlaserZ[1] = {0}; -u32 PchrlectreZ[1] = {0}; -u32 PchrlockexploderZ[1] = {0}; -u32 Pchrm16Z[1] = {0}; -u32 PchrmapZ[1] = {0}; -u32 PchrmicrocameraZ[1] = {0}; -u32 PchrmicrocodeZ[1] = {0}; -u32 PchrmicrofilmZ[1] = {0}; -u32 PchrmoneyZ[1] = {0}; -u32 Pchrmp5kZ[1] = {0}; -u32 Pchrmp5ksilZ[1] = {0}; -u32 PchrpitongunZ[1] = {0}; -u32 PchrplansZ[1] = {0}; -u32 PchrplastiqueZ[1] = {0}; -u32 PchrpolarizedglassesZ[1] = {0}; -u32 PchrproximitymineZ[1] = {0}; -u32 PchrremotemineZ[1] = {0}; -u32 PchrrocketZ[1] = {0}; -u32 PchrrocketlaunchZ[1] = {0}; -u32 PchrrugerZ[1] = {0}; -u32 PchrsafecrackercaseZ[1] = {0}; -u32 PchrshotgunZ[1] = {0}; -u32 PchrsilverwppkZ[1] = {0}; -u32 PchrskorpionZ[1] = {0}; -u32 PchrsniperrifleZ[1] = {0}; -u32 PchrspectreZ[1] = {0}; -u32 PchrspooltapeZ[1] = {0}; -u32 PchrspyfileZ[1] = {0}; -u32 PchrstafflistZ[1] = {0}; -u32 PchrtesttubeZ[1] = {0}; -u32 PchrthrowknifeZ[1] = {0}; -u32 PchrtimedmineZ[1] = {0}; -u32 Pchrtt33Z[1] = {0}; -u32 PchruziZ[1] = {0}; -u32 PchrvideotapeZ[1] = {0}; -u32 PchrweaponcaseZ[1] = {0}; -u32 PchrwppkZ[1] = {0}; -u32 PchrwppksilZ[1] = {0}; -u32 PchrwristdartZ[1] = {0}; -u32 Pconsole1Z[1] = {0}; -u32 Pconsole2Z[1] = {0}; -u32 Pconsole3Z[1] = {0}; -u32 Pconsole_sev2aZ[1] = {0}; -u32 Pconsole_sev2bZ[1] = {0}; -u32 Pconsole_sev2cZ[1] = {0}; -u32 Pconsole_sev2dZ[1] = {0}; -u32 Pconsole_sev_GEaZ[1] = {0}; -u32 Pconsole_sev_GEbZ[1] = {0}; -u32 Pconsole_sevaZ[1] = {0}; -u32 Pconsole_sevbZ[1] = {0}; -u32 Pconsole_sevcZ[1] = {0}; -u32 Pconsole_sevdZ[1] = {0}; -u32 Pcryptdoor1aZ[1] = {0}; -u32 Pcryptdoor1bZ[1] = {0}; -u32 Pcryptdoor2aZ[1] = {0}; -u32 Pcryptdoor2bZ[1] = {0}; -u32 Pcryptdoor3Z[1] = {0}; -u32 Pcryptdoor4Z[1] = {0}; -u32 PdamchaindoorZ[1] = {0}; -u32 PdamgatedoorZ[1] = {0}; -u32 PdamtundoorZ[1] = {0}; -u32 Pdepot_door_steelZ[1] = {0}; -u32 Pdepot_gate_entryZ[1] = {0}; -u32 Pdesk1Z[1] = {0}; -u32 Pdesk2Z[1] = {0}; -u32 Pdesk_arecibo1Z[1] = {0}; -u32 Pdesk_lamp2Z[1] = {0}; -u32 Pdest_engineZ[1] = {0}; -u32 Pdest_exocetZ[1] = {0}; -u32 Pdest_gunZ[1] = {0}; -u32 Pdest_harpoonZ[1] = {0}; -u32 Pdest_seawolfZ[1] = {0}; -u32 Pdisc_readerZ[1] = {0}; -u32 Pdisk_drive1Z[1] = {0}; -u32 Pdoor_azt_chairZ[1] = {0}; -u32 Pdoor_azt_deskZ[1] = {0}; -u32 Pdoor_azt_desk_topZ[1] = {0}; -u32 Pdoor_aztecZ[1] = {0}; -u32 Pdoor_dest1Z[1] = {0}; -u32 Pdoor_dest2Z[1] = {0}; -u32 Pdoor_eyelidZ[1] = {0}; -u32 Pdoor_irisZ[1] = {0}; -u32 Pdoor_mfZ[1] = {0}; -u32 Pdoor_roller1Z[1] = {0}; -u32 Pdoor_roller2Z[1] = {0}; -u32 Pdoor_roller3Z[1] = {0}; -u32 Pdoor_roller4Z[1] = {0}; -u32 Pdoor_rollertrainZ[1] = {0}; -u32 Pdoor_st_arec1Z[1] = {0}; -u32 Pdoor_st_arec2Z[1] = {0}; -u32 Pdoor_winZ[1] = {0}; -u32 PdoorconsoleZ[1] = {0}; -u32 PdoorpanelZ[1] = {0}; -u32 Pdoorprison1Z[1] = {0}; -u32 PdoorstatgateZ[1] = {0}; -u32 PexplosionbitZ[1] = {0}; -u32 Pfiling_cabinet1Z[1] = {0}; -u32 PflagZ[1] = {0}; -u32 PfloppyZ[1] = {0}; -u32 Pfnp90magZ[1] = {0}; -u32 Pgas_plant_met1_do1Z[1] = {0}; -u32 Pgas_plant_sw2_do1Z[1] = {0}; -u32 Pgas_plant_sw3_do1Z[1] = {0}; -u32 Pgas_plant_sw4_do1Z[1] = {0}; -u32 Pgas_plant_sw_do1Z[1] = {0}; -u32 Pgas_plant_wc_cub1Z[1] = {0}; -u32 PgasbarrelZ[1] = {0}; -u32 PgasbarrelsZ[1] = {0}; -u32 Pgasplant_clear_doorZ[1] = {0}; -u32 PgastankZ[1] = {0}; -u32 Pglassware1Z[1] = {0}; -u32 Pglassware2Z[1] = {0}; -u32 Pglassware3Z[1] = {0}; -u32 Pglassware4Z[1] = {0}; -u32 PgoldeneyelogoZ[1] = {0}; -u32 PgoldenshellsZ[1] = {0}; -u32 PgroundgunZ[1] = {0}; -u32 Pgun_runway1Z[1] = {0}; -u32 PhatberetZ[1] = {0}; -u32 PhatberetblueZ[1] = {0}; -u32 PhatberetredZ[1] = {0}; -u32 PhatchboltZ[1] = {0}; -u32 PhatchdoorZ[1] = {0}; -u32 PhatchsevxZ[1] = {0}; -u32 PhatfurryZ[1] = {0}; -u32 PhatfurryblackZ[1] = {0}; -u32 PhatfurrybrownZ[1] = {0}; -u32 PhathelmetZ[1] = {0}; -u32 PhathelmetgreyZ[1] = {0}; -u32 PhatmoonZ[1] = {0}; -u32 PhatpeakedZ[1] = {0}; -u32 PhattbirdZ[1] = {0}; -u32 PhattbirdbrownZ[1] = {0}; -u32 PhelicopterZ[1] = {0}; -u32 PhindZ[1] = {0}; -u32 PjeepZ[1] = {0}; -u32 Pjerry_can1Z[1] = {0}; -u32 Pjungle3_treeZ[1] = {0}; -u32 Pjungle5_treeZ[1] = {0}; -u32 Pkey_holderZ[1] = {0}; -u32 Pkeyboard1Z[1] = {0}; -u32 Pkit_units1Z[1] = {0}; -u32 PlabbenchZ[1] = {0}; -u32 PlandmineZ[1] = {0}; -u32 PlegalpageZ[1] = {0}; -u32 Pletter_tray1Z[1] = {0}; -u32 Plocker3Z[1] = {0}; -u32 Plocker4Z[1] = {0}; -u32 Pm16magZ[1] = {0}; -u32 PmagnumshellsZ[1] = {0}; -u32 Pmainframe1Z[1] = {0}; -u32 Pmainframe2Z[1] = {0}; -u32 Pmetal_chair1Z[1] = {0}; -u32 Pmetal_crate1Z[1] = {0}; -u32 Pmetal_crate2Z[1] = {0}; -u32 Pmetal_crate3Z[1] = {0}; -u32 Pmetal_crate4Z[1] = {0}; -u32 PmilcopterZ[1] = {0}; -u32 PmiltruckZ[1] = {0}; -u32 Pmissile_rack2Z[1] = {0}; -u32 Pmissile_rackZ[1] = {0}; -u32 PmodemboxZ[1] = {0}; -u32 PmotorbikeZ[1] = {0}; -u32 Pmp5kmagZ[1] = {0}; -u32 PnintendologoZ[1] = {0}; -u32 Poil_drum1Z[1] = {0}; -u32 Poil_drum2Z[1] = {0}; -u32 Poil_drum3Z[1] = {0}; -u32 Poil_drum5Z[1] = {0}; -u32 Poil_drum6Z[1] = {0}; -u32 Poil_drum7Z[1] = {0}; -u32 PpadlockZ[1] = {0}; -u32 PpalmZ[1] = {0}; -u32 PpalmtreeZ[1] = {0}; -u32 Pphone1Z[1] = {0}; -u32 PplaneZ[1] = {0}; -u32 Pplant11Z[1] = {0}; -u32 Pplant1Z[1] = {0}; -u32 Pplant2Z[1] = {0}; -u32 Pplant2bZ[1] = {0}; -u32 Pplant3Z[1] = {0}; -u32 Pradio_unit1Z[1] = {0}; -u32 Pradio_unit2Z[1] = {0}; -u32 Pradio_unit3Z[1] = {0}; -u32 Pradio_unit4Z[1] = {0}; -u32 ProofgunZ[1] = {0}; -u32 PsafeZ[1] = {0}; -u32 PsafedoorZ[1] = {0}; -u32 Psat1_reflectZ[1] = {0}; -u32 PsatboxZ[1] = {0}; -u32 PsatdishZ[1] = {0}; -u32 Psec_panelZ[1] = {0}; -u32 Psev_door3Z[1] = {0}; -u32 Psev_door3_windZ[1] = {0}; -u32 Psev_door4_windZ[1] = {0}; -u32 Psev_doorZ[1] = {0}; -u32 Psev_door_v1Z[1] = {0}; -u32 Psev_trislideZ[1] = {0}; -u32 PsevdishZ[1] = {0}; -u32 PsevdoormetslideZ[1] = {0}; -u32 PsevdoornowindZ[1] = {0}; -u32 PsevdoorwindZ[1] = {0}; -u32 PsevdoorwoodZ[1] = {0}; -u32 PshuttleZ[1] = {0}; -u32 Pshuttle_door_lZ[1] = {0}; -u32 Pshuttle_door_rZ[1] = {0}; -u32 PsilencerZ[1] = {0}; -u32 Psilo_lift_doorZ[1] = {0}; -u32 PsilotopdoorZ[1] = {0}; -u32 PskorpionmagZ[1] = {0}; -u32 PspectremagZ[1] = {0}; -u32 PspeedboatZ[1] = {0}; -u32 Pst_pete_room_1iZ[1] = {0}; -u32 Pst_pete_room_2iZ[1] = {0}; -u32 Pst_pete_room_3tZ[1] = {0}; -u32 Pst_pete_room_5cZ[1] = {0}; -u32 Pst_pete_room_6cZ[1] = {0}; -u32 Psteel_door1Z[1] = {0}; -u32 Psteel_door2Z[1] = {0}; -u32 Psteel_door2bZ[1] = {0}; -u32 Psteel_door3Z[1] = {0}; -u32 Pstool1Z[1] = {0}; -u32 Pswipe_card2Z[1] = {0}; -u32 Pswivel_chair1Z[1] = {0}; -u32 PtankZ[1] = {0}; -u32 PtigerZ[1] = {0}; -u32 Ptorpedo_rackZ[1] = {0}; -u32 Ptrain_door2Z[1] = {0}; -u32 Ptrain_door3Z[1] = {0}; -u32 Ptrain_doorZ[1] = {0}; -u32 PtrainextdoorZ[1] = {0}; -u32 Ptt33magZ[1] = {0}; -u32 Ptuning_console1Z[1] = {0}; -u32 Ptv1Z[1] = {0}; -u32 Ptv4screenZ[1] = {0}; -u32 Ptv_holderZ[1] = {0}; -u32 PtvscreenZ[1] = {0}; -u32 PuzimagZ[1] = {0}; -u32 PvertdoorZ[1] = {0}; -u32 PwalletbondZ[1] = {0}; -u32 PwindowZ[1] = {0}; -u32 Pwindow_cor11Z[1] = {0}; -u32 Pwindow_lib_lg1Z[1] = {0}; -u32 Pwindow_lib_sm1Z[1] = {0}; -u32 Pwood_lg_crate1Z[1] = {0}; -u32 Pwood_lg_crate2Z[1] = {0}; -u32 Pwood_md_crate3Z[1] = {0}; -u32 Pwood_sm_crate4Z[1] = {0}; -u32 Pwood_sm_crate5Z[1] = {0}; -u32 Pwood_sm_crate6Z[1] = {0}; -u32 Pwooden_table1Z[1] = {0}; -u32 PwppkmagZ[1] = {0}; - -/* --- Background texture sets (Tbg_*Z) -------------------------------- */ -u32 Tbg_ame_all_p_stanZ[1] = {0}; -u32 Tbg_arch_all_p_stanZ[1] = {0}; -u32 Tbg_arec_all_p_stanZ[1] = {0}; -u32 Tbg_ark_all_p_stanZ[1] = {0}; -u32 Tbg_ash_all_p_stanZ[1] = {0}; -u32 Tbg_azt_all_p_stanZ[1] = {0}; -u32 Tbg_cat_all_p_stanZ[1] = {0}; -u32 Tbg_cave_all_p_stanZ[1] = {0}; -u32 Tbg_crad_all_p_stanZ[1] = {0}; -u32 Tbg_cryp_all_p_stanZ[1] = {0}; -u32 Tbg_dam_all_p_stanZ[1] = {0}; -u32 Tbg_depo_all_p_stanZ[1] = {0}; -u32 Tbg_dest_all_p_stanZ[1] = {0}; -u32 Tbg_dish_all_p_stanZ[1] = {0}; -u32 Tbg_imp_all_p_stanZ[1] = {0}; -u32 Tbg_jun_all_p_stanZ[1] = {0}; -u32 Tbg_len_all_p_stanZ[1] = {0}; -u32 Tbg_oat_all_p_stanZ[1] = {0}; -u32 Tbg_pete_all_p_stanZ[1] = {0}; -u32 Tbg_ref_all_p_stanZ[1] = {0}; -u32 Tbg_run_all_p_stanZ[1] = {0}; -u32 Tbg_sev_all_p_stanZ[1] = {0}; -u32 Tbg_sevb_all_p_stanZ[1] = {0}; -u32 Tbg_sevx_all_p_stanZ[1] = {0}; -u32 Tbg_silo_all_p_stanZ[1] = {0}; -u32 Tbg_stat_all_p_stanZ[1] = {0}; -u32 Tbg_tra_all_p_stanZ[1] = {0}; - -/* --- Stage / MP setup data (U*Z, Ump_*Z, Ubrief*Z) ------------------ */ -u32 UbriefarchZ[1] = {0}; -u32 UbriefarkZ[1] = {0}; -u32 UbriefaztZ[1] = {0}; -u32 UbriefcaveZ[1] = {0}; -u32 UbriefcontrolZ[1] = {0}; -u32 UbriefcradZ[1] = {0}; -u32 UbriefcrypZ[1] = {0}; -u32 UbriefdamZ[1] = {0}; -u32 UbriefdepoZ[1] = {0}; -u32 UbriefdestZ[1] = {0}; -u32 UbriefjunZ[1] = {0}; -u32 UbriefpeteZ[1] = {0}; -u32 UbriefrunZ[1] = {0}; -u32 UbriefsevbZ[1] = {0}; -u32 UbriefsevbunkerZ[1] = {0}; -u32 UbriefsevxZ[1] = {0}; -u32 UbriefsevxbZ[1] = {0}; -u32 UbriefsiloZ[1] = {0}; -u32 UbriefstatueZ[1] = {0}; -u32 UbrieftraZ[1] = {0}; -u32 Ump_setupameZ[1] = {0}; -u32 Ump_setuparchZ[1] = {0}; -u32 Ump_setuparkZ[1] = {0}; -u32 Ump_setupashZ[1] = {0}; -u32 Ump_setupcaveZ[1] = {0}; -u32 Ump_setupcradZ[1] = {0}; -u32 Ump_setupcrypZ[1] = {0}; -u32 Ump_setupdishZ[1] = {0}; -u32 Ump_setupimpZ[1] = {0}; -u32 Ump_setupoatZ[1] = {0}; -u32 Ump_setuprefZ[1] = {0}; -u32 Ump_setupsevbZ[1] = {0}; -u32 Ump_setupstatueZ[1] = {0}; -u32 UsetuparchZ[1] = {0}; -u32 UsetuparkZ[1] = {0}; -u32 UsetupaztZ[1] = {0}; -u32 UsetupcaveZ[1] = {0}; -u32 UsetupcontrolZ[1] = {0}; -u32 UsetupcradZ[1] = {0}; -u32 UsetupcrypZ[1] = {0}; -u32 UsetupdamZ[1] = {0}; -u32 UsetupdepoZ[1] = {0}; -u32 UsetupdestZ[1] = {0}; -u32 UsetupjunZ[1] = {0}; -u32 UsetuplenZ[1] = {0}; -u32 UsetuppeteZ[1] = {0}; -u32 UsetuprunZ[1] = {0}; -u32 UsetupsevbZ[1] = {0}; -u32 UsetupsevbunkerZ[1] = {0}; -u32 UsetupsevxZ[1] = {0}; -u32 UsetupsevxbZ[1] = {0}; -u32 UsetupsiloZ[1] = {0}; -u32 UsetupstatueZ[1] = {0}; -u32 UsetuptraZ[1] = {0}; - -/* --- Text tables (L*E / L*J) -------------------------------------------- */ -u32 LameE[1] = {0}; -u32 LameJ[1] = {0}; -u32 LameP[1] = {0}; -u32 LarchE[1] = {0}; -u32 LarchJ[1] = {0}; -u32 LarchP[1] = {0}; -u32 LarecE[1] = {0}; -u32 LarecJ[1] = {0}; -u32 LarecP[1] = {0}; -u32 LarkE[1] = {0}; -u32 LarkJ[1] = {0}; -u32 LarkP[1] = {0}; -u32 LashE[1] = {0}; -u32 LashJ[1] = {0}; -u32 LashP[1] = {0}; -u32 LaztE[1] = {0}; -u32 LaztJ[1] = {0}; -u32 LaztP[1] = {0}; -u32 LcatE[1] = {0}; -u32 LcatJ[1] = {0}; -u32 LcatP[1] = {0}; -u32 LcaveE[1] = {0}; -u32 LcaveJ[1] = {0}; -u32 LcaveP[1] = {0}; -u32 LcradE[1] = {0}; -u32 LcradJ[1] = {0}; -u32 LcradP[1] = {0}; -u32 LcrypE[1] = {0}; -u32 LcrypJ[1] = {0}; -u32 LcrypP[1] = {0}; -u32 LdamE[1] = {0}; -u32 LdamJ[1] = {0}; -u32 LdamP[1] = {0}; -u32 LdepoE[1] = {0}; -u32 LdepoJ[1] = {0}; -u32 LdepoP[1] = {0}; -u32 LdestE[1] = {0}; -u32 LdestJ[1] = {0}; -u32 LdestP[1] = {0}; -u32 LdishE[1] = {0}; -u32 LdishJ[1] = {0}; -u32 LdishP[1] = {0}; -u32 LearE[1] = {0}; -u32 LearJ[1] = {0}; -u32 LearP[1] = {0}; -u32 LeldE[1] = {0}; -u32 LeldJ[1] = {0}; -u32 LeldP[1] = {0}; -u32 LgunE[1] = {0}; -u32 LgunJ[1] = {0}; -u32 LgunP[1] = {0}; -u32 LimpE[1] = {0}; -u32 LimpJ[1] = {0}; -u32 LimpP[1] = {0}; -u32 LjunE[1] = {0}; -u32 LjunJ[1] = {0}; -u32 LjunP[1] = {0}; -u32 LleeE[1] = {0}; -u32 LleeJ[1] = {0}; -u32 LleeP[1] = {0}; -u32 LlenE[1] = {0}; -u32 LlenJ[1] = {0}; -u32 LlenP[1] = {0}; -u32 LlipE[1] = {0}; -u32 LlipJ[1] = {0}; -u32 LlipP[1] = {0}; -u32 LlueE[1] = {0}; -u32 LlueJ[1] = {0}; -u32 LlueP[1] = {0}; -u32 LmiscE[1] = {0}; -u32 LmiscJ[1] = {0}; -u32 LmiscP[1] = {0}; -u32 LmpmenuE[1] = {0}; -u32 LmpmenuJ[1] = {0}; -u32 LmpmenuP[1] = {0}; -u32 LmpweaponsE[1] = {0}; -u32 LmpweaponsJ[1] = {0}; -u32 LmpweaponsP[1] = {0}; -u32 LoatE[1] = {0}; -u32 LoatJ[1] = {0}; -u32 LoatP[1] = {0}; -u32 LoptionsE[1] = {0}; -u32 LoptionsJ[1] = {0}; -u32 LoptionsP[1] = {0}; -u32 LpamE[1] = {0}; -u32 LpamJ[1] = {0}; -u32 LpamP[1] = {0}; -u32 LpeteE[1] = {0}; -u32 LpeteJ[1] = {0}; -u32 LpeteP[1] = {0}; -u32 LpropobjE[1] = {0}; -u32 LpropobjJ[1] = {0}; -u32 LpropobjP[1] = {0}; -u32 LrefE[1] = {0}; -u32 LrefJ[1] = {0}; -u32 LrefP[1] = {0}; -u32 LritE[1] = {0}; -u32 LritJ[1] = {0}; -u32 LritP[1] = {0}; -u32 LrunE[1] = {0}; -u32 LrunJ[1] = {0}; -u32 LrunP[1] = {0}; -u32 LsevE[1] = {0}; -u32 LsevJ[1] = {0}; -u32 LsevP[1] = {0}; -u32 LsevbE[1] = {0}; -u32 LsevbJ[1] = {0}; -u32 LsevbP[1] = {0}; -u32 LsevxE[1] = {0}; -u32 LsevxJ[1] = {0}; -u32 LsevxP[1] = {0}; -u32 LsevxbE[1] = {0}; -u32 LsevxbJ[1] = {0}; -u32 LsevxbP[1] = {0}; -u32 LshoE[1] = {0}; -u32 LshoJ[1] = {0}; -u32 LshoP[1] = {0}; -u32 LsiloE[1] = {0}; -u32 LsiloJ[1] = {0}; -u32 LsiloP[1] = {0}; -u32 LstatE[1] = {0}; -u32 LstatJ[1] = {0}; -u32 LstatP[1] = {0}; -u32 LtitleE[1] = {0}; -u32 LtitleJ[1] = {0}; -u32 LtitleP[1] = {0}; -u32 LtraE[1] = {0}; -u32 LtraJ[1] = {0}; -u32 LtraP[1] = {0}; -u32 LwaxE[1] = {0}; -u32 LwaxJ[1] = {0}; -u32 LwaxP[1] = {0}; - -/* --- Background level data segment bases (bg_*_all_p_seg) ------------ */ -u32 bg_arch_all_p_seg[1] = {0}; -u32 bg_arec_all_p_seg[1] = {0}; -u32 bg_ark_all_p_seg[1] = {0}; -u32 bg_azt_all_p_seg[1] = {0}; -u32 bg_cat_all_p_seg[1] = {0}; -u32 bg_cave_all_p_seg[1] = {0}; -u32 bg_crad_all_p_seg[1] = {0}; -u32 bg_cryp_all_p_seg[1] = {0}; -u32 bg_dam_all_p_seg[1] = {0}; -u32 bg_depo_all_p_seg[1] = {0}; -u32 bg_dest_all_p_seg[1] = {0}; -u32 bg_dish_all_p_seg[1] = {0}; -u32 bg_ear_all_p_seg[1] = {0}; -u32 bg_imp_all_p_seg[1] = {0}; -u32 bg_jun_all_p_seg[1] = {0}; -u32 bg_lee_all_p_seg[1] = {0}; -u32 bg_len_all_p_seg[1] = {0}; -u32 bg_lip_all_p_seg[1] = {0}; -u32 bg_oat_all_p_seg[1] = {0}; -u32 bg_pam_all_p_seg[1] = {0}; -u32 bg_pete_all_p_seg[1] = {0}; -u32 bg_ref_all_p_seg[1] = {0}; -u32 bg_rit_all_p_seg[1] = {0}; -u32 bg_run_all_p_seg[1] = {0}; -u32 bg_sev_all_p_seg[1] = {0}; -u32 bg_sevb_all_p_seg[1] = {0}; -u32 bg_sevx_all_p_seg[1] = {0}; -u32 bg_sho_all_p_seg[1] = {0}; -u32 bg_silo_all_p_seg[1] = {0}; -u32 bg_stat_all_p_seg[1] = {0}; -u32 bg_tra_all_p_seg[1] = {0}; -u32 bg_wax_all_p_seg[1] = {0}; - -/* --- Other --------------------------------------------------------------- */ -u32 ob__ob_end_seg[1] = {0}; - -/* --- RAM-rom demo replays (assets/ramrom/ramrom.s, .incbin) -------------- */ -/* ramromreplay.c declares these `extern u32 *` and stores &symbol in its */ -/* table; NULL pointers link and keep the entries inert. */ -u32 *ramrom_BunkerI_1 = NULL; -u32 *ramrom_BunkerI_2 = NULL; -u32 *ramrom_Dam_1 = NULL; -u32 *ramrom_Dam_2 = NULL; -u32 *ramrom_Facility_1 = NULL; -u32 *ramrom_Facility_2 = NULL; -u32 *ramrom_Facility_3 = NULL; -u32 *ramrom_Frigate_1 = NULL; -u32 *ramrom_Frigate_2 = NULL; -u32 *ramrom_Runway_1 = NULL; -u32 *ramrom_Runway_2 = NULL; -u32 *ramrom_Silo_1 = NULL; -u32 *ramrom_Silo_2 = NULL; -u32 *ramrom_Train = NULL; - -/* --- assets/romfiles2.s (.incbin blob) ----------------------------------- */ -/* title.c romCopies (unknown2_end - unknown2) bytes; as a pointer pair that */ -/* is zero, so the copy is a no-op. */ -void *unknown2 = NULL; -void *unknown2_end = NULL; diff --git a/port/src/libultra.c b/port/src/libultra.c index 6dace626..291b7e6a 100644 --- a/port/src/libultra.c +++ b/port/src/libultra.c @@ -202,20 +202,47 @@ void osAiSetConvert(u32 convert) { (void)convert; } /* PI (peripheral) — ROM/cart reads come from the loaded ROM image. */ /* ------------------------------------------------------------------------ */ +/* + * PI DMA is synchronous on the PC: romdata.c maps the .z64 at the N64 cart + * base (0x10000000), so an OS_READ from a cart address is a plain memcpy and + * the "completion" is already delivered by the time we return. The game's + * romReceiveMesg()/osRecvMesg() after every romCopy() is therefore satisfied + * trivially (see the message-queue shims below). + */ +static void piServiceDma(s32 direction, u32 srcPA, void *dstVA, u32 size) +{ + if (size == 0) + return; + if (direction == OS_READ) { + if (!romdataCartAddrValid(srcPA, size)) { + sysLogPrintf(LOG_WARNING, + "osPiStartDma: ROM read out of range " + "(src=0x%08X size=0x%X); skipped", + srcPA, size); + return; + } + memcpy(dstVA, (const void *)(uintptr_t)srcPA, size); + } else { + /* OS_WRITE: the game never writes the cart (saves go to EEPROM via + * osEeprom*, shimmed separately). Log once-style and drop. */ + sysLogPrintf(LOG_WARNING, + "osPiStartDma: cart write dropped (src=0x%08X size=0x%X)", + srcPA, size); + } +} + void osPiCreateManager(OSMesgQueue *mq, int prio) { (void)mq; (void)prio; } s32 osPiStartDma(OSIoMesg *mesg, s32 prio, s32 direction, u32 addr, void *buf, u32 size, OSMesgQueue *mq) { - /* TODO(Phase 1): service a read from romdata (cart -> host memory). */ - (void)mesg; (void)prio; (void)direction; (void)addr; (void)buf; - (void)size; (void)mq; - return 1; + piServiceDma(direction, addr, buf, size); + (void)mesg; (void)prio; (void)mq; + return 1; /* done */ } s32 osPiRawStartDma(s32 direction, u32 srcPA, void *dstVA, u32 size) { - /* TODO(Phase 1): copy between ROM image and host memory. */ - (void)direction; (void)srcPA; (void)dstVA; (void)size; - return 1; + piServiceDma(direction, srcPA, dstVA, size); + return 1; /* done */ } u32 osPiGetStatus(void) { return 0; } /* not busy */ diff --git a/port/src/main.c b/port/src/main.c index 4f2bf0c2..80b58bf6 100644 --- a/port/src/main.c +++ b/port/src/main.c @@ -4,13 +4,16 @@ * Replaces the N64 boot path (boot.s -> init() -> mainproc() -> bossEntry()). * On the PC we: * 1. set up system / config / fs / rom - * 2. load the ROM and map its segments + * 2. load the ROM and map it at the cart base (0x10000000) * 3. init video (SDL2 + GL), audio, input * 4. hand control to the game's mainproc() / bossEntry() * * Modelled on the PD port's port/src/main.c. * - * STATUS: scaffolding stub — fill in during Phase 1. + * STATUS: Phase 1 — ROM loads and maps, a window opens and clears each frame. + * Step 4 (mainproc) is deferred until the software RSP (fast3d) and the + * scheduler can service the game's rendering/audio threads; see + * docs/PCPortResearch.md. */ #include @@ -58,18 +61,27 @@ int main(int argc, char **argv) mixerInit(); inputInit(); - /* 4. Hand control to the game. + /* 4. Phase 1 demo loop: clear colour until the RSP/scheduler can drive + * real frames (Phase 2). Press ESC or close the window to quit. * - * mainproc() is defined in src/init.c, which IS compiled for the PC (see - * A3 in docs/PCPortResearch.md). init.c's N64-only init() is compiled but - * NOT called — its hardware deps (segment starts, decompress, TLB, FPU - * CSR) are stubbed in port/src/n64stubs.c, and the libultra OS calls are - * shimmed in port/src/libultra.c. mainproc() itself just sets up the - * threads and calls schedulerInitThread() + bossEntry(). + * When fast3d lands, replace this with mainproc(NULL) — defined in + * src/init.c (compiled for the PC; see A3 in docs/PCPortResearch.md). + * init.c's N64-only init() is never called; its hardware deps are + * stubbed in port/src/n64stubs.c and the libultra OS calls are shimmed + * in port/src/libultra.c. */ - mainproc(NULL); + sysLogPrintf(LOG_INFO, "Phase 1: ROM mapped at 0x%08X (%u bytes); " + "demo loop running — ESC to quit", + (unsigned)0x10000000, romdataGetRomSize()); + for (;;) { + if (videoHandleEvents()) + break; + videoStartFrame(); + videoSubmitCommands(NULL); /* no-op until fast3d lands */ + videoEndFrame(); + } - /* mainproc() normally does not return; clean up if it does. */ + /* Clean up. */ inputDestroy(); mixerDestroy(); audioDestroy(); diff --git a/port/src/n64stubs.c b/port/src/n64stubs.c index 196ece0b..9f8fba2f 100644 --- a/port/src/n64stubs.c +++ b/port/src/n64stubs.c @@ -33,69 +33,25 @@ u32 get_inflateSegmentRomStart(void) { return 0; } u32 get_inflateSegmentRomEnd(void) { return 0; } /* - * Linker segment boundary pointers (normally linker-script symbols, declared - * `extern u32 *` in bondgame.h and assorted game headers). Game code takes - * their ADDRESSES for size calcs + PI DMA / romCopy; on the PC the values are - * meaningless until Phase 2 ROM loading remaps them (romdata.c). All defined - * NULL: address-of gives a valid host pointer, and pairs of NULLs compute to - * zero-length copies. Complete set = every `*Segment*` symbol referenced by - * the compiled game sources. + * Linker segment boundary symbols. + * + * The ROM-backed ones (every _XSegment{Start,RomStart,RomEnd,End} from + * ge007.ld, plus all obseg/ramrom/music asset labels) are now ABSOLUTE cart + * addresses in the generated port/src/romassets_u.s — see + * scripts/gen_romassets.py. romdata.c maps the .z64 at 0x10000000 so `&sym` + * yields a live address and romCopy() works. + * + * What remains here are pure-RAM segment symbols that have no ROM presence: + * the host's own .bss/.csegment ends and the N64 vaddr markers (only used by + * the never-run N64 boot path on the PC). */ u32 *_bssSegmentEnd = NULL; - -u32 *_codeSegmentStart = NULL; -u32 *_codeSegmentEnd = NULL; -u32 *_codeSegmentRomStart = NULL; -u32 *_codeSegmentRomEnd = NULL; - u32 *_csegmentSegmentStart = NULL; u32 *_csegmentSegmentEnd = NULL; -u32 *_cdataSegmentRomStart = NULL; -u32 *_cdataSegmentRomEnd = NULL; - u32 *_inflateSegmentVaddrStart = NULL; u32 *_inflateSegmentVaddrEnd = NULL; -u32 *_inflateSegmentRomStart = NULL; -u32 *_inflateSegmentRomEnd = NULL; - u32 *_gameSegmentVaddrStart = NULL; u32 *_gameSegmentVaddrEnd = NULL; -u32 *_gameSegmentRomStart = NULL; -u32 *_gameSegmentRomEnd = NULL; - -u32 *_animation_dataSegmentRomStart = NULL; -u32 *_animation_dataSegmentStart = NULL; -u32 *_animation_dataSegmentEnd = NULL; -u32 *_animation_entriesSegmentRomStart = NULL; - -u32 *_alt_startSegmentRomStart = NULL; -u32 *_alt_startSegmentStart = NULL; - -/* Font / image / music segment bases (referenced by textrelated.c, - * image_bank.c, music.c — data for the font/image ones is compiled from - * assets/; the ROM-base markers themselves come from ge007.ld on N64). */ -u32 *_efontchardataSegmentRomStart = NULL; -u32 *_jfontchardataSegmentRomStart = NULL; -u32 *_fontbankgothicSegmentStart = NULL; -u32 *_fontbankgothicSegmentEnd = NULL; -u32 *_fontbankgothicSegmentRomStart = NULL; -u32 *_fontzurichboldSegmentStart = NULL; -u32 *_fontzurichboldSegmentEnd = NULL; -u32 *_fontzurichboldSegmentRomStart = NULL; -u32 *_fontdlSegmentRomStart = NULL; -u32 *_fontdlSegmentRomEnd = NULL; -u32 *_imagesSegmentRomStart = NULL; -u32 *_GlobalimagetableSegmentStart = NULL; -u32 *_GlobalimagetableSegmentEnd = NULL; -u32 *_GlobalimagetableSegmentRomStart = NULL; -u32 *_instrumentsctlSegmentRomStart = NULL; -u32 *_instrumentstblSegmentRomStart = NULL; -u32 *_musicsampletblSegmentRomStart = NULL; -u32 *_sfxctlSegmentRomStart = NULL; -u32 *_sfxtblSegmentRomStart = NULL; -u32 *_rarewarelogoSegmentStart = NULL; -u32 *_rarewarelogoSegmentEnd = NULL; -u32 *_rarewarelogoSegmentRomStart = NULL; /* --- Decompressor (src/inflate, not built for PC) ----------------------- */ /* init() calls this to unpack the data segment. Unused on the PC. */ diff --git a/port/src/romassets_u.s b/port/src/romassets_u.s new file mode 100644 index 00000000..c6ba1f9b --- /dev/null +++ b/port/src/romassets_u.s @@ -0,0 +1,3393 @@ +/* + * AUTO-GENERATED by scripts/gen_romassets.py (U) -- do not edit. + * + * Absolute ROM asset symbols for the PC port. Each symbol is the N64 + * cart address (0x10000000 + rom_offset) of the corresponding asset in + * scripts/filelist.u.csv, so `&symbol` / romCopy() work exactly as + * on hardware once romdata.c has mapped the .z64 at 0x10000000. + * Regenerate: python3 scripts/gen_romassets.py u + */ +.section .data + +/* --- assets/obseg (file_resource_table.inc.c order) ------------- */ +.global bg_sev_all_p_seg +.set bg_sev_all_p_seg, 0x10438660 +.global end_bg_sev_all_p_seg +.set end_bg_sev_all_p_seg, 0x10449450 +.global bg_silo_all_p_seg +.set bg_silo_all_p_seg, 0x10449450 +.global end_bg_silo_all_p_seg +.set end_bg_silo_all_p_seg, 0x1049A390 +.global bg_stat_all_p_seg +.set bg_stat_all_p_seg, 0x1049A390 +.global end_bg_stat_all_p_seg +.set end_bg_stat_all_p_seg, 0x104BC460 +.global bg_arec_all_p_seg +.set bg_arec_all_p_seg, 0x104BC460 +.global end_bg_arec_all_p_seg +.set end_bg_arec_all_p_seg, 0x104EA7E0 +.global bg_arch_all_p_seg +.set bg_arch_all_p_seg, 0x104EA7E0 +.global end_bg_arch_all_p_seg +.set end_bg_arch_all_p_seg, 0x105102D0 +.global bg_tra_all_p_seg +.set bg_tra_all_p_seg, 0x105102D0 +.global end_bg_tra_all_p_seg +.set end_bg_tra_all_p_seg, 0x10530840 +.global bg_dest_all_p_seg +.set bg_dest_all_p_seg, 0x10530840 +.global end_bg_dest_all_p_seg +.set end_bg_dest_all_p_seg, 0x1055E200 +.global bg_sevb_all_p_seg +.set bg_sevb_all_p_seg, 0x1055E200 +.global end_bg_sevb_all_p_seg +.set end_bg_sevb_all_p_seg, 0x10578FA0 +.global bg_azt_all_p_seg +.set bg_azt_all_p_seg, 0x10578FA0 +.global end_bg_azt_all_p_seg +.set end_bg_azt_all_p_seg, 0x1059A9F0 +.global bg_pete_all_p_seg +.set bg_pete_all_p_seg, 0x1059A9F0 +.global end_bg_pete_all_p_seg +.set end_bg_pete_all_p_seg, 0x105B4620 +.global bg_depo_all_p_seg +.set bg_depo_all_p_seg, 0x105B4620 +.global end_bg_depo_all_p_seg +.set end_bg_depo_all_p_seg, 0x105E0F90 +.global bg_ref_all_p_seg +.set bg_ref_all_p_seg, 0x105E0F90 +.global end_bg_ref_all_p_seg +.set end_bg_ref_all_p_seg, 0x105EA5A0 +.global bg_cryp_all_p_seg +.set bg_cryp_all_p_seg, 0x105EA5A0 +.global end_bg_cryp_all_p_seg +.set end_bg_cryp_all_p_seg, 0x105FFC50 +.global bg_dam_all_p_seg +.set bg_dam_all_p_seg, 0x105FFC50 +.global end_bg_dam_all_p_seg +.set end_bg_dam_all_p_seg, 0x1062FDF0 +.global bg_ark_all_p_seg +.set bg_ark_all_p_seg, 0x1062FDF0 +.global end_bg_ark_all_p_seg +.set end_bg_ark_all_p_seg, 0x10660D70 +.global bg_run_all_p_seg +.set bg_run_all_p_seg, 0x10660D70 +.global end_bg_run_all_p_seg +.set end_bg_run_all_p_seg, 0x1066B140 +.global bg_sevx_all_p_seg +.set bg_sevx_all_p_seg, 0x1066B140 +.global end_bg_sevx_all_p_seg +.set end_bg_sevx_all_p_seg, 0x10687710 +.global bg_jun_all_p_seg +.set bg_jun_all_p_seg, 0x10687710 +.global end_bg_jun_all_p_seg +.set end_bg_jun_all_p_seg, 0x1069C860 +.global bg_dish_all_p_seg +.set bg_dish_all_p_seg, 0x1069C860 +.global end_bg_dish_all_p_seg +.set end_bg_dish_all_p_seg, 0x106A10D0 +.global bg_cave_all_p_seg +.set bg_cave_all_p_seg, 0x106A10D0 +.global end_bg_cave_all_p_seg +.set end_bg_cave_all_p_seg, 0x106C55C0 +.global bg_cat_all_p_seg +.set bg_cat_all_p_seg, 0x106C55C0 +.global end_bg_cat_all_p_seg +.set end_bg_cat_all_p_seg, 0x106CAAF0 +.global bg_crad_all_p_seg +.set bg_crad_all_p_seg, 0x106CAAF0 +.global end_bg_crad_all_p_seg +.set end_bg_crad_all_p_seg, 0x106DAE40 +.global bg_sho_all_p_seg +.set bg_sho_all_p_seg, 0x106DAE40 +.global end_bg_sho_all_p_seg +.set end_bg_sho_all_p_seg, 0x106DAE40 +.global bg_imp_all_p_seg +.set bg_imp_all_p_seg, 0x106DAE40 +.global end_bg_imp_all_p_seg +.set end_bg_imp_all_p_seg, 0x106DAE40 +.global bg_rit_all_p_seg +.set bg_rit_all_p_seg, 0x106E4DA0 +.global end_bg_rit_all_p_seg +.set end_bg_rit_all_p_seg, 0x106E4DA0 +.global bg_oat_all_p_seg +.set bg_oat_all_p_seg, 0x106E4DA0 +.global end_bg_oat_all_p_seg +.set end_bg_oat_all_p_seg, 0x106EBBF0 +.global bg_ear_all_p_seg +.set bg_ear_all_p_seg, 0x106EBBF0 +.global end_bg_ear_all_p_seg +.set end_bg_ear_all_p_seg, 0x106EBBF0 +.global bg_lee_all_p_seg +.set bg_lee_all_p_seg, 0x106EBBF0 +.global end_bg_lee_all_p_seg +.set end_bg_lee_all_p_seg, 0x106EBBF0 +.global bg_lip_all_p_seg +.set bg_lip_all_p_seg, 0x106EBBF0 +.global end_bg_lip_all_p_seg +.set end_bg_lip_all_p_seg, 0x106EBBF0 +.global bg_len_all_p_seg +.set bg_len_all_p_seg, 0x106EBBF0 +.global end_bg_len_all_p_seg +.set end_bg_len_all_p_seg, 0x106ECB90 +.global bg_wax_all_p_seg +.set bg_wax_all_p_seg, 0x106ECB90 +.global end_bg_wax_all_p_seg +.set end_bg_wax_all_p_seg, 0x106ECB90 +.global bg_pam_all_p_seg +.set bg_pam_all_p_seg, 0x106ECB90 +.global end_bg_pam_all_p_seg +.set end_bg_pam_all_p_seg, 0x106ECB90 +.global CarmourguardZ +.set CarmourguardZ, 0x106ECB90 +.global end_CarmourguardZ +.set end_CarmourguardZ, 0x106EF010 +.global CbaronsamediZ +.set CbaronsamediZ, 0x106EF010 +.global end_CbaronsamediZ +.set end_CbaronsamediZ, 0x106F2700 +.global CbluecamguardZ +.set CbluecamguardZ, 0x106F2700 +.global end_CbluecamguardZ +.set end_CbluecamguardZ, 0x106F4DF0 +.global CbluemanZ +.set CbluemanZ, 0x106F4DF0 +.global end_CbluemanZ +.set end_CbluemanZ, 0x106F6C00 +.global CbluewomanZ +.set CbluewomanZ, 0x106F6C00 +.global end_CbluewomanZ +.set end_CbluewomanZ, 0x106F8AC0 +.global CboilerbondZ +.set CboilerbondZ, 0x106F8AC0 +.global end_CboilerbondZ +.set end_CboilerbondZ, 0x106FB6D0 +.global CboilertrevZ +.set CboilertrevZ, 0x106FB6D0 +.global end_CboilertrevZ +.set end_CboilertrevZ, 0x106FED50 +.global CborisZ +.set CborisZ, 0x106FED50 +.global end_CborisZ +.set end_CborisZ, 0x10701E70 +.global CcamguardZ +.set CcamguardZ, 0x10701E70 +.global end_CcamguardZ +.set end_CcamguardZ, 0x10704550 +.global CcardimanZ +.set CcardimanZ, 0x10704550 +.global end_CcardimanZ +.set end_CcardimanZ, 0x10706350 +.global CcheckmanZ +.set CcheckmanZ, 0x10706350 +.global end_CcheckmanZ +.set end_CcheckmanZ, 0x107081D0 +.global CcommguardZ +.set CcommguardZ, 0x107081D0 +.global end_CcommguardZ +.set end_CcommguardZ, 0x1070A7D0 +.global CdjbondZ +.set CdjbondZ, 0x1070A7D0 +.global end_CdjbondZ +.set end_CdjbondZ, 0x1070D660 +.global CfattechwomanZ +.set CfattechwomanZ, 0x1070D660 +.global end_CfattechwomanZ +.set end_CfattechwomanZ, 0x1070F580 +.global Cgreatguard2Z +.set Cgreatguard2Z, 0x1070F580 +.global end_Cgreatguard2Z +.set end_Cgreatguard2Z, 0x10711CA0 +.global CgreatguardZ +.set CgreatguardZ, 0x10711CA0 +.global end_CgreatguardZ +.set end_CgreatguardZ, 0x10714320 +.global CgreyguardZ +.set CgreyguardZ, 0x10714320 +.global end_CgreyguardZ +.set end_CgreyguardZ, 0x107169F0 +.global CgreymanZ +.set CgreymanZ, 0x107169F0 +.global end_CgreymanZ +.set end_CgreymanZ, 0x107187B0 +.global CheadalanZ +.set CheadalanZ, 0x107187B0 +.global end_CheadalanZ +.set end_CheadalanZ, 0x10718D80 +.global CheadbZ +.set CheadbZ, 0x10718D80 +.global end_CheadbZ +.set end_CheadbZ, 0x107192F0 +.global CheadbalaclavaZ +.set CheadbalaclavaZ, 0x107192F0 +.global end_CheadbalaclavaZ +.set end_CheadbalaclavaZ, 0x107196C0 +.global CheadbikeZ +.set CheadbikeZ, 0x107196C0 +.global end_CheadbikeZ +.set end_CheadbikeZ, 0x10719D60 +.global CheadbrosnanZ +.set CheadbrosnanZ, 0x10719D60 +.global end_CheadbrosnanZ +.set end_CheadbrosnanZ, 0x1071AAB0 +.global CheadbrosnanboilerZ +.set CheadbrosnanboilerZ, 0x1071AAB0 +.global end_CheadbrosnanboilerZ +.set end_CheadbrosnanboilerZ, 0x1071B650 +.global CheadbrosnansnowZ +.set CheadbrosnansnowZ, 0x1071B650 +.global end_CheadbrosnansnowZ +.set end_CheadbrosnansnowZ, 0x1071C4D0 +.global CheadbrosnansuitZ +.set CheadbrosnansuitZ, 0x1071C4D0 +.global end_CheadbrosnansuitZ +.set end_CheadbrosnansuitZ, 0x1071D250 +.global CheadbrosnantimberZ +.set CheadbrosnantimberZ, 0x1071D250 +.global end_CheadbrosnantimberZ +.set end_CheadbrosnantimberZ, 0x1071DE10 +.global CheadchrisZ +.set CheadchrisZ, 0x1071DE10 +.global end_CheadchrisZ +.set end_CheadchrisZ, 0x1071E350 +.global CheaddaveZ +.set CheaddaveZ, 0x1071E350 +.global end_CheaddaveZ +.set end_CheaddaveZ, 0x1071E8D0 +.global CheaddesZ +.set CheaddesZ, 0x1071E8D0 +.global end_CheaddesZ +.set end_CheaddesZ, 0x1071EE00 +.global CheadduncanZ +.set CheadduncanZ, 0x1071EE00 +.global end_CheadduncanZ +.set end_CheadduncanZ, 0x1071F320 +.global CheaddwayneZ +.set CheaddwayneZ, 0x1071F320 +.global end_CheaddwayneZ +.set end_CheaddwayneZ, 0x1071F8A0 +.global CheadgrahamZ +.set CheadgrahamZ, 0x1071F8A0 +.global end_CheadgrahamZ +.set end_CheadgrahamZ, 0x1071FE10 +.global CheadgrantZ +.set CheadgrantZ, 0x1071FE10 +.global end_CheadgrantZ +.set end_CheadgrantZ, 0x10720340 +.global CheadjimZ +.set CheadjimZ, 0x10720340 +.global end_CheadjimZ +.set end_CheadjimZ, 0x10720870 +.global Cheadjoe2Z +.set Cheadjoe2Z, 0x10720870 +.global end_Cheadjoe2Z +.set end_Cheadjoe2Z, 0x10720C90 +.global CheadjoeZ +.set CheadjoeZ, 0x10720C90 +.global end_CheadjoeZ +.set end_CheadjoeZ, 0x10721200 +.global CheadjoelZ +.set CheadjoelZ, 0x10721200 +.global end_CheadjoelZ +.set end_CheadjoelZ, 0x10721710 +.global CheadkarlZ +.set CheadkarlZ, 0x10721710 +.global end_CheadkarlZ +.set end_CheadkarlZ, 0x10721C70 +.global CheadkenZ +.set CheadkenZ, 0x10721C70 +.global end_CheadkenZ +.set end_CheadkenZ, 0x107221C0 +.global CheadleeZ +.set CheadleeZ, 0x107221C0 +.global end_CheadleeZ +.set end_CheadleeZ, 0x10722740 +.global CheadmandyZ +.set CheadmandyZ, 0x10722740 +.global end_CheadmandyZ +.set end_CheadmandyZ, 0x10722B30 +.global CheadmarionZ +.set CheadmarionZ, 0x10722B30 +.global end_CheadmarionZ +.set end_CheadmarionZ, 0x10722F40 +.global CheadmarkZ +.set CheadmarkZ, 0x10722F40 +.global end_CheadmarkZ +.set end_CheadmarkZ, 0x10723470 +.global CheadmartinZ +.set CheadmartinZ, 0x10723470 +.global end_CheadmartinZ +.set end_CheadmartinZ, 0x107239D0 +.global CheadmishkinZ +.set CheadmishkinZ, 0x107239D0 +.global end_CheadmishkinZ +.set end_CheadmishkinZ, 0x10723F30 +.global CheadneilZ +.set CheadneilZ, 0x10723F30 +.global end_CheadneilZ +.set end_CheadneilZ, 0x10724450 +.global CheadpeteZ +.set CheadpeteZ, 0x10724450 +.global end_CheadpeteZ +.set end_CheadpeteZ, 0x107249E0 +.global CheadrobinZ +.set CheadrobinZ, 0x107249E0 +.global end_CheadrobinZ +.set end_CheadrobinZ, 0x10724EF0 +.global CheadsallyZ +.set CheadsallyZ, 0x10724EF0 +.global end_CheadsallyZ +.set end_CheadsallyZ, 0x107252F0 +.global CheadscottZ +.set CheadscottZ, 0x107252F0 +.global end_CheadscottZ +.set end_CheadscottZ, 0x10725870 +.global CheadshaunZ +.set CheadshaunZ, 0x10725870 +.global end_CheadshaunZ +.set end_CheadshaunZ, 0x10725E50 +.global CheadsteveeZ +.set CheadsteveeZ, 0x10725E50 +.global end_CheadsteveeZ +.set end_CheadsteveeZ, 0x107263A0 +.global CheadstevehZ +.set CheadstevehZ, 0x107263A0 +.global end_CheadstevehZ +.set end_CheadstevehZ, 0x107268F0 +.global CheadvivienZ +.set CheadvivienZ, 0x107268F0 +.global end_CheadvivienZ +.set end_CheadvivienZ, 0x10726D80 +.global CjawsZ +.set CjawsZ, 0x10726D80 +.global end_CjawsZ +.set end_CjawsZ, 0x107299C0 +.global CjeanwomanZ +.set CjeanwomanZ, 0x107299C0 +.global end_CjeanwomanZ +.set end_CjeanwomanZ, 0x1072B9D0 +.global CmaydayZ +.set CmaydayZ, 0x1072B9D0 +.global end_CmaydayZ +.set end_CmaydayZ, 0x1072E570 +.global CmoonfemaleZ +.set CmoonfemaleZ, 0x1072E570 +.global end_CmoonfemaleZ +.set end_CmoonfemaleZ, 0x107306C0 +.global CmoonguardZ +.set CmoonguardZ, 0x107306C0 +.global end_CmoonguardZ +.set end_CmoonguardZ, 0x10732CB0 +.global CnatalyaZ +.set CnatalyaZ, 0x10732CB0 +.global end_CnatalyaZ +.set end_CnatalyaZ, 0x10736570 +.global CnavyguardZ +.set CnavyguardZ, 0x10736570 +.global end_CnavyguardZ +.set end_CnavyguardZ, 0x10738C50 +.global CoddjobZ +.set CoddjobZ, 0x10738C50 +.global end_CoddjobZ +.set end_CoddjobZ, 0x1073BD80 +.global ColiveguardZ +.set ColiveguardZ, 0x1073BD80 +.global end_ColiveguardZ +.set end_ColiveguardZ, 0x1073E3D0 +.global CorumovZ +.set CorumovZ, 0x1073E3D0 +.global end_CorumovZ +.set end_CorumovZ, 0x10741800 +.global CpilotZ +.set CpilotZ, 0x10741800 +.global end_CpilotZ +.set end_CpilotZ, 0x10744880 +.global CredmanZ +.set CredmanZ, 0x10744880 +.global end_CredmanZ +.set end_CredmanZ, 0x10746FB0 +.global CrusguardZ +.set CrusguardZ, 0x10746FB0 +.global end_CrusguardZ +.set end_CrusguardZ, 0x10748BE0 +.global CsnowbondZ +.set CsnowbondZ, 0x10748BE0 +.global end_CsnowbondZ +.set end_CsnowbondZ, 0x1074BF10 +.global CsnowguardZ +.set CsnowguardZ, 0x1074BF10 +.global end_CsnowguardZ +.set end_CsnowguardZ, 0x1074EB90 +.global CspicebondZ +.set CspicebondZ, 0x1074EB90 +.global end_CspicebondZ +.set end_CspicebondZ, 0x107524B0 +.global Csuit_lf_handZ +.set Csuit_lf_handZ, 0x107524B0 +.global end_Csuit_lf_handZ +.set end_Csuit_lf_handZ, 0x107556D0 +.global CsuitbondZ +.set CsuitbondZ, 0x107556D0 +.global end_CsuitbondZ +.set end_CsuitbondZ, 0x10758460 +.global CtechmanZ +.set CtechmanZ, 0x10758460 +.global end_CtechmanZ +.set end_CtechmanZ, 0x1075AB10 +.global CtechwomanZ +.set CtechwomanZ, 0x1075AB10 +.global end_CtechwomanZ +.set end_CtechwomanZ, 0x1075CB00 +.global CtimberbondZ +.set CtimberbondZ, 0x1075CB00 +.global end_CtimberbondZ +.set end_CtimberbondZ, 0x1075F830 +.global CtrevelyanZ +.set CtrevelyanZ, 0x1075F830 +.global end_CtrevelyanZ +.set end_CtrevelyanZ, 0x10763000 +.global CtrevguardZ +.set CtrevguardZ, 0x10763000 +.global end_CtrevguardZ +.set end_CtrevguardZ, 0x10765610 +.global CvalentinZ +.set CvalentinZ, 0x10765610 +.global end_CvalentinZ +.set end_CvalentinZ, 0x10768580 +.global CxeniaZ +.set CxeniaZ, 0x10768580 +.global end_CxeniaZ +.set end_CxeniaZ, 0x1076BF70 +.global Gak47Z +.set Gak47Z, 0x1076BF70 +.global end_Gak47Z +.set end_Gak47Z, 0x1076C980 +.global GaudiotapeZ +.set GaudiotapeZ, 0x1076C980 +.global end_GaudiotapeZ +.set end_GaudiotapeZ, 0x1076CD10 +.global GautoshotZ +.set GautoshotZ, 0x1076CD10 +.global end_GautoshotZ +.set end_GautoshotZ, 0x1076E520 +.global GblackboxZ +.set GblackboxZ, 0x1076E520 +.global end_GblackboxZ +.set end_GblackboxZ, 0x1076EB20 +.global GblueprintsZ +.set GblueprintsZ, 0x1076EB20 +.global end_GblueprintsZ +.set end_GblueprintsZ, 0x1076EC20 +.global GbombcaseZ +.set GbombcaseZ, 0x1076EC20 +.global end_GbombcaseZ +.set end_GbombcaseZ, 0x1076F3B0 +.global GbombdefuserZ +.set GbombdefuserZ, 0x1076F3B0 +.global end_GbombdefuserZ +.set end_GbombdefuserZ, 0x1076F9A0 +.global GbriefcaseZ +.set GbriefcaseZ, 0x1076F9A0 +.global end_GbriefcaseZ +.set end_GbriefcaseZ, 0x10770130 +.global GbugZ +.set GbugZ, 0x10770130 +.global end_GbugZ +.set end_GbugZ, 0x10770AA0 +.global GbugdetectorZ +.set GbugdetectorZ, 0x10770AA0 +.global end_GbugdetectorZ +.set end_GbugdetectorZ, 0x10770DF0 +.global GbungeeZ +.set GbungeeZ, 0x10770DF0 +.global end_GbungeeZ +.set end_GbungeeZ, 0x10771140 +.global GcameraZ +.set GcameraZ, 0x10771140 +.global end_GcameraZ +.set end_GcameraZ, 0x107715C0 +.global GcartblueZ +.set GcartblueZ, 0x107715C0 +.global end_GcartblueZ +.set end_GcartblueZ, 0x10771820 +.global GcartridgeZ +.set GcartridgeZ, 0x10771820 +.global end_GcartridgeZ +.set end_GcartridgeZ, 0x10771950 +.global GcartrifleZ +.set GcartrifleZ, 0x10771950 +.global end_GcartrifleZ +.set end_GcartrifleZ, 0x10771B60 +.global GcartshellZ +.set GcartshellZ, 0x10771B60 +.global end_GcartshellZ +.set end_GcartshellZ, 0x10771D60 +.global GcircuitboardZ +.set GcircuitboardZ, 0x10771D60 +.global end_GcircuitboardZ +.set end_GcircuitboardZ, 0x10771EA0 +.global GclipboardZ +.set GclipboardZ, 0x10771EA0 +.global end_GclipboardZ +.set end_GclipboardZ, 0x10772090 +.global GcreditcardZ +.set GcreditcardZ, 0x10772090 +.global end_GcreditcardZ +.set end_GcreditcardZ, 0x107723E0 +.global GdarkglassesZ +.set GdarkglassesZ, 0x107723E0 +.global end_GdarkglassesZ +.set end_GdarkglassesZ, 0x10772730 +.global GdatathiefZ +.set GdatathiefZ, 0x10772730 +.global end_GdatathiefZ +.set end_GdatathiefZ, 0x10772870 +.global GdattapeZ +.set GdattapeZ, 0x10772870 +.global end_GdattapeZ +.set end_GdattapeZ, 0x107729E0 +.global GdoordecoderZ +.set GdoordecoderZ, 0x107729E0 +.global end_GdoordecoderZ +.set end_GdoordecoderZ, 0x10772F60 +.global GdoorexploderZ +.set GdoorexploderZ, 0x10772F60 +.global end_GdoorexploderZ +.set end_GdoorexploderZ, 0x107732B0 +.global GdossierredZ +.set GdossierredZ, 0x107732B0 +.global end_GdossierredZ +.set end_GdossierredZ, 0x10773610 +.global GdynamiteZ +.set GdynamiteZ, 0x10773610 +.global end_GdynamiteZ +.set end_GdynamiteZ, 0x10773960 +.global GexplosivefloppyZ +.set GexplosivefloppyZ, 0x10773960 +.global end_GexplosivefloppyZ +.set end_GexplosivefloppyZ, 0x10773BB0 +.global GexplosivepenZ +.set GexplosivepenZ, 0x10773BB0 +.global end_GexplosivepenZ +.set end_GexplosivepenZ, 0x10773F00 +.global GextinguisherZ +.set GextinguisherZ, 0x10773F00 +.global end_GextinguisherZ +.set end_GextinguisherZ, 0x107746F0 +.global GfingergunZ +.set GfingergunZ, 0x107746F0 +.global end_GfingergunZ +.set end_GfingergunZ, 0x10774A40 +.global GfistZ +.set GfistZ, 0x10774A40 +.global end_GfistZ +.set end_GfistZ, 0x10776140 +.global GflarepistolZ +.set GflarepistolZ, 0x10776140 +.global end_GflarepistolZ +.set end_GflarepistolZ, 0x10776490 +.global Gfnp90Z +.set Gfnp90Z, 0x10776490 +.global end_Gfnp90Z +.set end_Gfnp90Z, 0x10777130 +.global GgaskeyringZ +.set GgaskeyringZ, 0x10777130 +.global end_GgaskeyringZ +.set end_GgaskeyringZ, 0x10777B60 +.global GgoldbarZ +.set GgoldbarZ, 0x10777B60 +.global end_GgoldbarZ +.set end_GgoldbarZ, 0x10777EB0 +.global GgoldeneyekeyZ +.set GgoldeneyekeyZ, 0x10777EB0 +.global end_GgoldeneyekeyZ +.set end_GgoldeneyekeyZ, 0x10778860 +.global GgoldengunZ +.set GgoldengunZ, 0x10778860 +.global end_GgoldengunZ +.set end_GgoldengunZ, 0x1077A040 +.global GgoldwppkZ +.set GgoldwppkZ, 0x1077A040 +.global end_GgoldwppkZ +.set end_GgoldwppkZ, 0x1077B9A0 +.global GgrenadeZ +.set GgrenadeZ, 0x1077B9A0 +.global end_GgrenadeZ +.set end_GgrenadeZ, 0x1077C3D0 +.global GgrenadelaunchZ +.set GgrenadelaunchZ, 0x1077C3D0 +.global end_GgrenadelaunchZ +.set end_GgrenadelaunchZ, 0x1077D450 +.global GheroinZ +.set GheroinZ, 0x1077D450 +.global end_GheroinZ +.set end_GheroinZ, 0x1077D7A0 +.global GjoypadZ +.set GjoypadZ, 0x1077D7A0 +.global end_GjoypadZ +.set end_GjoypadZ, 0x1077F650 +.global GkeyanalysercaseZ +.set GkeyanalysercaseZ, 0x1077F650 +.global end_GkeyanalysercaseZ +.set end_GkeyanalysercaseZ, 0x1077FDE0 +.global GkeyboltZ +.set GkeyboltZ, 0x1077FDE0 +.global end_GkeyboltZ +.set end_GkeyboltZ, 0x107807D0 +.global GkeycardZ +.set GkeycardZ, 0x107807D0 +.global end_GkeycardZ +.set end_GkeycardZ, 0x10780900 +.global GkeyyaleZ +.set GkeyyaleZ, 0x10780900 +.global end_GkeyyaleZ +.set end_GkeyyaleZ, 0x10781650 +.global GknifeZ +.set GknifeZ, 0x10781650 +.global end_GknifeZ +.set end_GknifeZ, 0x10783120 +.global GlaserZ +.set GlaserZ, 0x10783120 +.global end_GlaserZ +.set end_GlaserZ, 0x10783F10 +.global GlectreZ +.set GlectreZ, 0x10783F10 +.global end_GlectreZ +.set end_GlectreZ, 0x10784260 +.global GlockexploderZ +.set GlockexploderZ, 0x10784260 +.global end_GlockexploderZ +.set end_GlockexploderZ, 0x107845B0 +.global Gm16Z +.set Gm16Z, 0x107845B0 +.global end_Gm16Z +.set end_Gm16Z, 0x10784FD0 +.global GmapZ +.set GmapZ, 0x10784FD0 +.global end_GmapZ +.set end_GmapZ, 0x107850C0 +.global GmicrocameraZ +.set GmicrocameraZ, 0x107850C0 +.global end_GmicrocameraZ +.set end_GmicrocameraZ, 0x10785700 +.global GmicrocodeZ +.set GmicrocodeZ, 0x10785700 +.global end_GmicrocodeZ +.set end_GmicrocodeZ, 0x10785A50 +.global GmicrofilmZ +.set GmicrofilmZ, 0x10785A50 +.global end_GmicrofilmZ +.set end_GmicrofilmZ, 0x10785DA0 +.global GmoneyZ +.set GmoneyZ, 0x10785DA0 +.global end_GmoneyZ +.set end_GmoneyZ, 0x107860F0 +.global Gmp5kZ +.set Gmp5kZ, 0x107860F0 +.global end_Gmp5kZ +.set end_Gmp5kZ, 0x10786CD0 +.global Gmp5ksilZ +.set Gmp5ksilZ, 0x10786CD0 +.global end_Gmp5ksilZ +.set end_Gmp5ksilZ, 0x107879D0 +.global GpitongunZ +.set GpitongunZ, 0x107879D0 +.global end_GpitongunZ +.set end_GpitongunZ, 0x10787D20 +.global GplansZ +.set GplansZ, 0x10787D20 +.global end_GplansZ +.set end_GplansZ, 0x10787EF0 +.global GplastiqueZ +.set GplastiqueZ, 0x10787EF0 +.global end_GplastiqueZ +.set end_GplastiqueZ, 0x10788240 +.global GpolarizedglassesZ +.set GpolarizedglassesZ, 0x10788240 +.global end_GpolarizedglassesZ +.set end_GpolarizedglassesZ, 0x107887A0 +.global GproximitymineZ +.set GproximitymineZ, 0x107887A0 +.global end_GproximitymineZ +.set end_GproximitymineZ, 0x10788F90 +.global GremotemineZ +.set GremotemineZ, 0x10788F90 +.global end_GremotemineZ +.set end_GremotemineZ, 0x10789950 +.global GrocketlaunchZ +.set GrocketlaunchZ, 0x10789950 +.global end_GrocketlaunchZ +.set end_GrocketlaunchZ, 0x1078AB70 +.global GrugerZ +.set GrugerZ, 0x1078AB70 +.global end_GrugerZ +.set end_GrugerZ, 0x1078C900 +.global GsafecrackercaseZ +.set GsafecrackercaseZ, 0x1078C900 +.global end_GsafecrackercaseZ +.set end_GsafecrackercaseZ, 0x1078D090 +.global GshotgunZ +.set GshotgunZ, 0x1078D090 +.global end_GshotgunZ +.set end_GshotgunZ, 0x1078DF70 +.global GsilverwppkZ +.set GsilverwppkZ, 0x1078DF70 +.global end_GsilverwppkZ +.set end_GsilverwppkZ, 0x1078F8D0 +.global GskorpionZ +.set GskorpionZ, 0x1078F8D0 +.global end_GskorpionZ +.set end_GskorpionZ, 0x10790AD0 +.global GsniperrifleZ +.set GsniperrifleZ, 0x10790AD0 +.global end_GsniperrifleZ +.set end_GsniperrifleZ, 0x10791B40 +.global GspectreZ +.set GspectreZ, 0x10791B40 +.global end_GspectreZ +.set end_GspectreZ, 0x107927C0 +.global GspooltapeZ +.set GspooltapeZ, 0x107927C0 +.global end_GspooltapeZ +.set end_GspooltapeZ, 0x10792B10 +.global GspyfileZ +.set GspyfileZ, 0x10792B10 +.global end_GspyfileZ +.set end_GspyfileZ, 0x10792E60 +.global GstafflistZ +.set GstafflistZ, 0x10792E60 +.global end_GstafflistZ +.set end_GstafflistZ, 0x10793000 +.global GtaserZ +.set GtaserZ, 0x10793000 +.global end_GtaserZ +.set end_GtaserZ, 0x10794E60 +.global GthrowknifeZ +.set GthrowknifeZ, 0x10794E60 +.global end_GthrowknifeZ +.set end_GthrowknifeZ, 0x10796950 +.global GtimedmineZ +.set GtimedmineZ, 0x10796950 +.global end_GtimedmineZ +.set end_GtimedmineZ, 0x10797410 +.global GtriggerZ +.set GtriggerZ, 0x10797410 +.global end_GtriggerZ +.set end_GtriggerZ, 0x1079A810 +.global Gtt33Z +.set Gtt33Z, 0x1079A810 +.global end_Gtt33Z +.set end_Gtt33Z, 0x1079C330 +.global GuziZ +.set GuziZ, 0x1079C330 +.global end_GuziZ +.set end_GuziZ, 0x1079CC40 +.global GvideotapeZ +.set GvideotapeZ, 0x1079CC40 +.global end_GvideotapeZ +.set end_GvideotapeZ, 0x1079CE50 +.global GwatchcommunicatorZ +.set GwatchcommunicatorZ, 0x1079CE50 +.global end_GwatchcommunicatorZ +.set end_GwatchcommunicatorZ, 0x1079E2B0 +.global GwatchgeigercounterZ +.set GwatchgeigercounterZ, 0x1079E2B0 +.global end_GwatchgeigercounterZ +.set end_GwatchgeigercounterZ, 0x1079F710 +.global GwatchidentifierZ +.set GwatchidentifierZ, 0x1079F710 +.global end_GwatchidentifierZ +.set end_GwatchidentifierZ, 0x107A0B70 +.global GwatchlaserZ +.set GwatchlaserZ, 0x107A0B70 +.global end_GwatchlaserZ +.set end_GwatchlaserZ, 0x107A3F70 +.global GwatchmagnetattractZ +.set GwatchmagnetattractZ, 0x107A3F70 +.global end_GwatchmagnetattractZ +.set end_GwatchmagnetattractZ, 0x107A53C0 +.global GwatchmagnetrepelZ +.set GwatchmagnetrepelZ, 0x107A53C0 +.global end_GwatchmagnetrepelZ +.set end_GwatchmagnetrepelZ, 0x107A6820 +.global GweaponcaseZ +.set GweaponcaseZ, 0x107A6820 +.global end_GweaponcaseZ +.set end_GweaponcaseZ, 0x107A6FB0 +.global GwppkZ +.set GwppkZ, 0x107A6FB0 +.global end_GwppkZ +.set end_GwppkZ, 0x107A8C40 +.global GwppksilZ +.set GwppksilZ, 0x107A8C40 +.global end_GwppksilZ +.set end_GwppksilZ, 0x107AA980 +.global GwristdartZ +.set GwristdartZ, 0x107AA980 +.global end_GwristdartZ +.set end_GwristdartZ, 0x107AACD0 +.global PICBMZ +.set PICBMZ, 0x107AACD0 +.global end_PICBMZ +.set end_PICBMZ, 0x107AD250 +.global PICBM_noseZ +.set PICBM_noseZ, 0x107AD250 +.global end_PICBM_noseZ +.set end_PICBM_noseZ, 0x107ADA00 +.global Pak47magZ +.set Pak47magZ, 0x107ADA00 +.global end_Pak47magZ +.set end_Pak47magZ, 0x107ADBE0 +.global Palarm1Z +.set Palarm1Z, 0x107ADBE0 +.global end_Palarm1Z +.set end_Palarm1Z, 0x107ADD40 +.global Palarm2Z +.set Palarm2Z, 0x107ADD40 +.global end_Palarm2Z +.set end_Palarm2Z, 0x107ADEE0 +.global Pammo_crate1Z +.set Pammo_crate1Z, 0x107ADEE0 +.global end_Pammo_crate1Z +.set end_Pammo_crate1Z, 0x107AE120 +.global Pammo_crate2Z +.set Pammo_crate2Z, 0x107AE120 +.global end_Pammo_crate2Z +.set end_Pammo_crate2Z, 0x107AE360 +.global Pammo_crate3Z +.set Pammo_crate3Z, 0x107AE360 +.global end_Pammo_crate3Z +.set end_Pammo_crate3Z, 0x107AE5B0 +.global Pammo_crate4Z +.set Pammo_crate4Z, 0x107AE5B0 +.global end_Pammo_crate4Z +.set end_Pammo_crate4Z, 0x107AE820 +.global Pammo_crate5Z +.set Pammo_crate5Z, 0x107AE820 +.global end_Pammo_crate5Z +.set end_Pammo_crate5Z, 0x107AEAE0 +.global PapcZ +.set PapcZ, 0x107AEAE0 +.global end_PapcZ +.set end_PapcZ, 0x107B0740 +.global Parchsecdoor1Z +.set Parchsecdoor1Z, 0x107B0740 +.global end_Parchsecdoor1Z +.set end_Parchsecdoor1Z, 0x107B0920 +.global Parchsecdoor2Z +.set Parchsecdoor2Z, 0x107B0920 +.global end_Parchsecdoor2Z +.set end_Parchsecdoor2Z, 0x107B0AF0 +.global ParticZ +.set ParticZ, 0x107B0AF0 +.global end_ParticZ +.set end_ParticZ, 0x107B18F0 +.global PartictrailerZ +.set PartictrailerZ, 0x107B18F0 +.global end_PartictrailerZ +.set end_PartictrailerZ, 0x107B2200 +.global PbarricadeZ +.set PbarricadeZ, 0x107B2200 +.global end_PbarricadeZ +.set end_PbarricadeZ, 0x107B2440 +.global Pbin1Z +.set Pbin1Z, 0x107B2440 +.global end_Pbin1Z +.set end_Pbin1Z, 0x107B2790 +.global Pblotter1Z +.set Pblotter1Z, 0x107B2790 +.global end_Pblotter1Z +.set end_Pblotter1Z, 0x107B2870 +.global PbodyarmourZ +.set PbodyarmourZ, 0x107B2870 +.global end_PbodyarmourZ +.set end_PbodyarmourZ, 0x107B2D10 +.global PbodyarmourvestZ +.set PbodyarmourvestZ, 0x107B2D10 +.global end_PbodyarmourvestZ +.set end_PbodyarmourvestZ, 0x107B3130 +.global PbollardZ +.set PbollardZ, 0x107B3130 +.global end_PbollardZ +.set end_PbollardZ, 0x107B3330 +.global PbombZ +.set PbombZ, 0x107B3330 +.global end_PbombZ +.set end_PbombZ, 0x107B34A0 +.global Pbook1Z +.set Pbook1Z, 0x107B34A0 +.global end_Pbook1Z +.set end_Pbook1Z, 0x107B3630 +.global Pbookshelf1Z +.set Pbookshelf1Z, 0x107B3630 +.global end_Pbookshelf1Z +.set end_Pbookshelf1Z, 0x107B3D20 +.global Pborg_crateZ +.set Pborg_crateZ, 0x107B3D20 +.global end_Pborg_crateZ +.set end_Pborg_crateZ, 0x107B3E90 +.global PboxcartridgesZ +.set PboxcartridgesZ, 0x107B3E90 +.global end_PboxcartridgesZ +.set end_PboxcartridgesZ, 0x107B4090 +.global Pboxes2x4Z +.set Pboxes2x4Z, 0x107B4090 +.global end_Pboxes2x4Z +.set end_Pboxes2x4Z, 0x107B44C0 +.global Pboxes3x4Z +.set Pboxes3x4Z, 0x107B44C0 +.global end_Pboxes3x4Z +.set end_Pboxes3x4Z, 0x107B4900 +.global Pboxes4x4Z +.set Pboxes4x4Z, 0x107B4900 +.global end_Pboxes4x4Z +.set end_Pboxes4x4Z, 0x107B4F60 +.global PbrakeunitZ +.set PbrakeunitZ, 0x107B4F60 +.global end_PbrakeunitZ +.set end_PbrakeunitZ, 0x107B52D0 +.global Pbridge_console1aZ +.set Pbridge_console1aZ, 0x107B52D0 +.global end_Pbridge_console1aZ +.set end_Pbridge_console1aZ, 0x107B5850 +.global Pbridge_console1bZ +.set Pbridge_console1bZ, 0x107B5850 +.global end_Pbridge_console1bZ +.set end_Pbridge_console1bZ, 0x107B5DB0 +.global Pbridge_console2aZ +.set Pbridge_console2aZ, 0x107B5DB0 +.global end_Pbridge_console2aZ +.set end_Pbridge_console2aZ, 0x107B6330 +.global Pbridge_console2bZ +.set Pbridge_console2bZ, 0x107B6330 +.global end_Pbridge_console2bZ +.set end_Pbridge_console2bZ, 0x107B6820 +.global Pbridge_console3aZ +.set Pbridge_console3aZ, 0x107B6820 +.global end_Pbridge_console3aZ +.set end_Pbridge_console3aZ, 0x107B6D70 +.global Pbridge_console3bZ +.set Pbridge_console3bZ, 0x107B6D70 +.global end_Pbridge_console3bZ +.set end_Pbridge_console3bZ, 0x107B7300 +.global PcarbmwZ +.set PcarbmwZ, 0x107B7300 +.global end_PcarbmwZ +.set end_PcarbmwZ, 0x107B7FE0 +.global Pcard_box1Z +.set Pcard_box1Z, 0x107B7FE0 +.global end_Pcard_box1Z +.set end_Pcard_box1Z, 0x107B81E0 +.global Pcard_box2Z +.set Pcard_box2Z, 0x107B81E0 +.global end_Pcard_box2Z +.set end_Pcard_box2Z, 0x107B8420 +.global Pcard_box3Z +.set Pcard_box3Z, 0x107B8420 +.global end_Pcard_box3Z +.set end_Pcard_box3Z, 0x107B8610 +.global Pcard_box4_lgZ +.set Pcard_box4_lgZ, 0x107B8610 +.global end_Pcard_box4_lgZ +.set end_Pcard_box4_lgZ, 0x107B87C0 +.global Pcard_box5_lgZ +.set Pcard_box5_lgZ, 0x107B87C0 +.global end_Pcard_box5_lgZ +.set end_Pcard_box5_lgZ, 0x107B89C0 +.global Pcard_box6_lgZ +.set Pcard_box6_lgZ, 0x107B89C0 +.global end_Pcard_box6_lgZ +.set end_Pcard_box6_lgZ, 0x107B8BB0 +.global PcarescortZ +.set PcarescortZ, 0x107B8BB0 +.global end_PcarescortZ +.set end_PcarescortZ, 0x107B97B0 +.global PcargolfZ +.set PcargolfZ, 0x107B97B0 +.global end_PcargolfZ +.set end_PcargolfZ, 0x107BA3E0 +.global PcarweirdZ +.set PcarweirdZ, 0x107BA3E0 +.global end_PcarweirdZ +.set end_PcarweirdZ, 0x107BB520 +.global PcarzilZ +.set PcarzilZ, 0x107BB520 +.global end_PcarzilZ +.set end_PcarzilZ, 0x107BCB20 +.global PcctvZ +.set PcctvZ, 0x107BCB20 +.global end_PcctvZ +.set end_PcctvZ, 0x107BCEA0 +.global PchraudiotapeZ +.set PchraudiotapeZ, 0x107BCEA0 +.global end_PchraudiotapeZ +.set end_PchraudiotapeZ, 0x107BD400 +.global PchrautoshotZ +.set PchrautoshotZ, 0x107BD400 +.global end_PchrautoshotZ +.set end_PchrautoshotZ, 0x107BD760 +.global PchrblackboxZ +.set PchrblackboxZ, 0x107BD760 +.global end_PchrblackboxZ +.set end_PchrblackboxZ, 0x107BDFE0 +.global PchrblueprintsZ +.set PchrblueprintsZ, 0x107BDFE0 +.global end_PchrblueprintsZ +.set end_PchrblueprintsZ, 0x107BE130 +.global PchrbombcaseZ +.set PchrbombcaseZ, 0x107BE130 +.global end_PchrbombcaseZ +.set end_PchrbombcaseZ, 0x107BE320 +.global PchrbombdefuserZ +.set PchrbombdefuserZ, 0x107BE320 +.global end_PchrbombdefuserZ +.set end_PchrbombdefuserZ, 0x107BEC00 +.global PchrbriefcaseZ +.set PchrbriefcaseZ, 0x107BEC00 +.global end_PchrbriefcaseZ +.set end_PchrbriefcaseZ, 0x107BED90 +.global PchrbugZ +.set PchrbugZ, 0x107BED90 +.global end_PchrbugZ +.set end_PchrbugZ, 0x107BFB40 +.global PchrbugdetectorZ +.set PchrbugdetectorZ, 0x107BFB40 +.global end_PchrbugdetectorZ +.set end_PchrbugdetectorZ, 0x107BFCB0 +.global PchrbungeeZ +.set PchrbungeeZ, 0x107BFCB0 +.global end_PchrbungeeZ +.set end_PchrbungeeZ, 0x107BFE20 +.global PchrcameraZ +.set PchrcameraZ, 0x107BFE20 +.global end_PchrcameraZ +.set end_PchrcameraZ, 0x107C04B0 +.global PchrcircuitboardZ +.set PchrcircuitboardZ, 0x107C04B0 +.global end_PchrcircuitboardZ +.set end_PchrcircuitboardZ, 0x107C0650 +.global PchrclipboardZ +.set PchrclipboardZ, 0x107C0650 +.global end_PchrclipboardZ +.set end_PchrclipboardZ, 0x107C08D0 +.global PchrcreditcardZ +.set PchrcreditcardZ, 0x107C08D0 +.global end_PchrcreditcardZ +.set end_PchrcreditcardZ, 0x107C0A40 +.global PchrdarkglassesZ +.set PchrdarkglassesZ, 0x107C0A40 +.global end_PchrdarkglassesZ +.set end_PchrdarkglassesZ, 0x107C0BB0 +.global PchrdatathiefZ +.set PchrdatathiefZ, 0x107C0BB0 +.global end_PchrdatathiefZ +.set end_PchrdatathiefZ, 0x107C0D50 +.global PchrdattapeZ +.set PchrdattapeZ, 0x107C0D50 +.global end_PchrdattapeZ +.set end_PchrdattapeZ, 0x107C0F40 +.global PchrdoordecoderZ +.set PchrdoordecoderZ, 0x107C0F40 +.global end_PchrdoordecoderZ +.set end_PchrdoordecoderZ, 0x107C17A0 +.global PchrdoorexploderZ +.set PchrdoorexploderZ, 0x107C17A0 +.global end_PchrdoorexploderZ +.set end_PchrdoorexploderZ, 0x107C1910 +.global PchrdossierredZ +.set PchrdossierredZ, 0x107C1910 +.global end_PchrdossierredZ +.set end_PchrdossierredZ, 0x107C1DE0 +.global PchrdynamiteZ +.set PchrdynamiteZ, 0x107C1DE0 +.global end_PchrdynamiteZ +.set end_PchrdynamiteZ, 0x107C1F50 +.global PchrexplosivepenZ +.set PchrexplosivepenZ, 0x107C1F50 +.global end_PchrexplosivepenZ +.set end_PchrexplosivepenZ, 0x107C20C0 +.global PchrextinguisherZ +.set PchrextinguisherZ, 0x107C20C0 +.global end_PchrextinguisherZ +.set end_PchrextinguisherZ, 0x107C25C0 +.global PchrfingergunZ +.set PchrfingergunZ, 0x107C25C0 +.global end_PchrfingergunZ +.set end_PchrfingergunZ, 0x107C2730 +.global PchrflarepistolZ +.set PchrflarepistolZ, 0x107C2730 +.global end_PchrflarepistolZ +.set end_PchrflarepistolZ, 0x107C28A0 +.global Pchrfnp90Z +.set Pchrfnp90Z, 0x107C28A0 +.global end_Pchrfnp90Z +.set end_Pchrfnp90Z, 0x107C2D00 +.global PchrgaskeyringZ +.set PchrgaskeyringZ, 0x107C2D00 +.global end_PchrgaskeyringZ +.set end_PchrgaskeyringZ, 0x107C3C10 +.global PchrgoldbarZ +.set PchrgoldbarZ, 0x107C3C10 +.global end_PchrgoldbarZ +.set end_PchrgoldbarZ, 0x107C3D80 +.global PchrgoldenZ +.set PchrgoldenZ, 0x107C3D80 +.global end_PchrgoldenZ +.set end_PchrgoldenZ, 0x107C3FF0 +.global PchrgoldeneyekeyZ +.set PchrgoldeneyekeyZ, 0x107C3FF0 +.global end_PchrgoldeneyekeyZ +.set end_PchrgoldeneyekeyZ, 0x107C4E90 +.global PchrgoldwppkZ +.set PchrgoldwppkZ, 0x107C4E90 +.global end_PchrgoldwppkZ +.set end_PchrgoldwppkZ, 0x107C5000 +.global PchrgrenadeZ +.set PchrgrenadeZ, 0x107C5000 +.global end_PchrgrenadeZ +.set end_PchrgrenadeZ, 0x107C5370 +.global PchrgrenadelaunchZ +.set PchrgrenadelaunchZ, 0x107C5370 +.global end_PchrgrenadelaunchZ +.set end_PchrgrenadelaunchZ, 0x107C5700 +.global PchrgrenaderoundZ +.set PchrgrenaderoundZ, 0x107C5700 +.global end_PchrgrenaderoundZ +.set end_PchrgrenaderoundZ, 0x107C5970 +.global PchrheroinZ +.set PchrheroinZ, 0x107C5970 +.global end_PchrheroinZ +.set end_PchrheroinZ, 0x107C5AE0 +.global PchrkalashZ +.set PchrkalashZ, 0x107C5AE0 +.global end_PchrkalashZ +.set end_PchrkalashZ, 0x107C5ED0 +.global PchrkeyanalysercaseZ +.set PchrkeyanalysercaseZ, 0x107C5ED0 +.global end_PchrkeyanalysercaseZ +.set end_PchrkeyanalysercaseZ, 0x107C60C0 +.global PchrkeyboltZ +.set PchrkeyboltZ, 0x107C60C0 +.global end_PchrkeyboltZ +.set end_PchrkeyboltZ, 0x107C6F60 +.global PchrkeyyaleZ +.set PchrkeyyaleZ, 0x107C6F60 +.global end_PchrkeyyaleZ +.set end_PchrkeyyaleZ, 0x107C83C0 +.global PchrknifeZ +.set PchrknifeZ, 0x107C83C0 +.global end_PchrknifeZ +.set end_PchrknifeZ, 0x107C85C0 +.global PchrlaserZ +.set PchrlaserZ, 0x107C85C0 +.global end_PchrlaserZ +.set end_PchrlaserZ, 0x107C8980 +.global PchrlectreZ +.set PchrlectreZ, 0x107C8980 +.global end_PchrlectreZ +.set end_PchrlectreZ, 0x107C8AF0 +.global PchrlockexploderZ +.set PchrlockexploderZ, 0x107C8AF0 +.global end_PchrlockexploderZ +.set end_PchrlockexploderZ, 0x107C8C60 +.global Pchrm16Z +.set Pchrm16Z, 0x107C8C60 +.global end_Pchrm16Z +.set end_Pchrm16Z, 0x107C9030 +.global PchrmapZ +.set PchrmapZ, 0x107C9030 +.global end_PchrmapZ +.set end_PchrmapZ, 0x107C9180 +.global PchrmicrocameraZ +.set PchrmicrocameraZ, 0x107C9180 +.global end_PchrmicrocameraZ +.set end_PchrmicrocameraZ, 0x107C9A70 +.global PchrmicrocodeZ +.set PchrmicrocodeZ, 0x107C9A70 +.global end_PchrmicrocodeZ +.set end_PchrmicrocodeZ, 0x107C9BE0 +.global PchrmicrofilmZ +.set PchrmicrofilmZ, 0x107C9BE0 +.global end_PchrmicrofilmZ +.set end_PchrmicrofilmZ, 0x107C9D50 +.global PchrmoneyZ +.set PchrmoneyZ, 0x107C9D50 +.global end_PchrmoneyZ +.set end_PchrmoneyZ, 0x107C9EC0 +.global Pchrmp5kZ +.set Pchrmp5kZ, 0x107C9EC0 +.global end_Pchrmp5kZ +.set end_Pchrmp5kZ, 0x107CA240 +.global Pchrmp5ksilZ +.set Pchrmp5ksilZ, 0x107CA240 +.global end_Pchrmp5ksilZ +.set end_Pchrmp5ksilZ, 0x107CA650 +.global PchrpitongunZ +.set PchrpitongunZ, 0x107CA650 +.global end_PchrpitongunZ +.set end_PchrpitongunZ, 0x107CA7C0 +.global PchrplansZ +.set PchrplansZ, 0x107CA7C0 +.global end_PchrplansZ +.set end_PchrplansZ, 0x107CAA50 +.global PchrplastiqueZ +.set PchrplastiqueZ, 0x107CAA50 +.global end_PchrplastiqueZ +.set end_PchrplastiqueZ, 0x107CAEB0 +.global PchrpolarizedglassesZ +.set PchrpolarizedglassesZ, 0x107CAEB0 +.global end_PchrpolarizedglassesZ +.set end_PchrpolarizedglassesZ, 0x107CB770 +.global PchrproximitymineZ +.set PchrproximitymineZ, 0x107CB770 +.global end_PchrproximitymineZ +.set end_PchrproximitymineZ, 0x107CBBD0 +.global PchrremotemineZ +.set PchrremotemineZ, 0x107CBBD0 +.global end_PchrremotemineZ +.set end_PchrremotemineZ, 0x107CC030 +.global PchrrocketZ +.set PchrrocketZ, 0x107CC030 +.global end_PchrrocketZ +.set end_PchrrocketZ, 0x107CC5E0 +.global PchrrocketlaunchZ +.set PchrrocketlaunchZ, 0x107CC5E0 +.global end_PchrrocketlaunchZ +.set end_PchrrocketlaunchZ, 0x107CC9C0 +.global PchrrugerZ +.set PchrrugerZ, 0x107CC9C0 +.global end_PchrrugerZ +.set end_PchrrugerZ, 0x107CCDA0 +.global PchrsafecrackercaseZ +.set PchrsafecrackercaseZ, 0x107CCDA0 +.global end_PchrsafecrackercaseZ +.set end_PchrsafecrackercaseZ, 0x107CCF90 +.global PchrshotgunZ +.set PchrshotgunZ, 0x107CCF90 +.global end_PchrshotgunZ +.set end_PchrshotgunZ, 0x107CD2E0 +.global PchrsilverwppkZ +.set PchrsilverwppkZ, 0x107CD2E0 +.global end_PchrsilverwppkZ +.set end_PchrsilverwppkZ, 0x107CD450 +.global PchrskorpionZ +.set PchrskorpionZ, 0x107CD450 +.global end_PchrskorpionZ +.set end_PchrskorpionZ, 0x107CD7D0 +.global PchrsniperrifleZ +.set PchrsniperrifleZ, 0x107CD7D0 +.global end_PchrsniperrifleZ +.set end_PchrsniperrifleZ, 0x107CDB60 +.global PchrspectreZ +.set PchrspectreZ, 0x107CDB60 +.global end_PchrspectreZ +.set end_PchrspectreZ, 0x107CDED0 +.global PchrspooltapeZ +.set PchrspooltapeZ, 0x107CDED0 +.global end_PchrspooltapeZ +.set end_PchrspooltapeZ, 0x107CE040 +.global PchrspyfileZ +.set PchrspyfileZ, 0x107CE040 +.global end_PchrspyfileZ +.set end_PchrspyfileZ, 0x107CE1B0 +.global PchrstafflistZ +.set PchrstafflistZ, 0x107CE1B0 +.global end_PchrstafflistZ +.set end_PchrstafflistZ, 0x107CE3D0 +.global PchrtesttubeZ +.set PchrtesttubeZ, 0x107CE3D0 +.global end_PchrtesttubeZ +.set end_PchrtesttubeZ, 0x107CE590 +.global PchrthrowknifeZ +.set PchrthrowknifeZ, 0x107CE590 +.global end_PchrthrowknifeZ +.set end_PchrthrowknifeZ, 0x107CE7B0 +.global PchrtimedmineZ +.set PchrtimedmineZ, 0x107CE7B0 +.global end_PchrtimedmineZ +.set end_PchrtimedmineZ, 0x107CECE0 +.global Pchrtt33Z +.set Pchrtt33Z, 0x107CECE0 +.global end_Pchrtt33Z +.set end_Pchrtt33Z, 0x107CEF70 +.global PchruziZ +.set PchruziZ, 0x107CEF70 +.global end_PchruziZ +.set end_PchruziZ, 0x107CF240 +.global PchrvideotapeZ +.set PchrvideotapeZ, 0x107CF240 +.global end_PchrvideotapeZ +.set end_PchrvideotapeZ, 0x107CF510 +.global PchrweaponcaseZ +.set PchrweaponcaseZ, 0x107CF510 +.global end_PchrweaponcaseZ +.set end_PchrweaponcaseZ, 0x107CF710 +.global PchrwppkZ +.set PchrwppkZ, 0x107CF710 +.global end_PchrwppkZ +.set end_PchrwppkZ, 0x107CF950 +.global PchrwppksilZ +.set PchrwppksilZ, 0x107CF950 +.global end_PchrwppksilZ +.set end_PchrwppksilZ, 0x107CFC30 +.global PchrwristdartZ +.set PchrwristdartZ, 0x107CFC30 +.global end_PchrwristdartZ +.set end_PchrwristdartZ, 0x107CFDA0 +.global Pconsole1Z +.set Pconsole1Z, 0x107CFDA0 +.global end_Pconsole1Z +.set end_Pconsole1Z, 0x107D0420 +.global Pconsole2Z +.set Pconsole2Z, 0x107D0420 +.global end_Pconsole2Z +.set end_Pconsole2Z, 0x107D0AA0 +.global Pconsole3Z +.set Pconsole3Z, 0x107D0AA0 +.global end_Pconsole3Z +.set end_Pconsole3Z, 0x107D1130 +.global Pconsole_sev2aZ +.set Pconsole_sev2aZ, 0x107D1130 +.global end_Pconsole_sev2aZ +.set end_Pconsole_sev2aZ, 0x107D1550 +.global Pconsole_sev2bZ +.set Pconsole_sev2bZ, 0x107D1550 +.global end_Pconsole_sev2bZ +.set end_Pconsole_sev2bZ, 0x107D1A10 +.global Pconsole_sev2cZ +.set Pconsole_sev2cZ, 0x107D1A10 +.global end_Pconsole_sev2cZ +.set end_Pconsole_sev2cZ, 0x107D1E50 +.global Pconsole_sev2dZ +.set Pconsole_sev2dZ, 0x107D1E50 +.global end_Pconsole_sev2dZ +.set end_Pconsole_sev2dZ, 0x107D2280 +.global Pconsole_sev_GEaZ +.set Pconsole_sev_GEaZ, 0x107D2280 +.global end_Pconsole_sev_GEaZ +.set end_Pconsole_sev_GEaZ, 0x107D26B0 +.global Pconsole_sev_GEbZ +.set Pconsole_sev_GEbZ, 0x107D26B0 +.global end_Pconsole_sev_GEbZ +.set end_Pconsole_sev_GEbZ, 0x107D2AE0 +.global Pconsole_sevaZ +.set Pconsole_sevaZ, 0x107D2AE0 +.global end_Pconsole_sevaZ +.set end_Pconsole_sevaZ, 0x107D2F60 +.global Pconsole_sevbZ +.set Pconsole_sevbZ, 0x107D2F60 +.global end_Pconsole_sevbZ +.set end_Pconsole_sevbZ, 0x107D33D0 +.global Pconsole_sevcZ +.set Pconsole_sevcZ, 0x107D33D0 +.global end_Pconsole_sevcZ +.set end_Pconsole_sevcZ, 0x107D3800 +.global Pconsole_sevdZ +.set Pconsole_sevdZ, 0x107D3800 +.global end_Pconsole_sevdZ +.set end_Pconsole_sevdZ, 0x107D3C30 +.global Pcryptdoor1aZ +.set Pcryptdoor1aZ, 0x107D3C30 +.global end_Pcryptdoor1aZ +.set end_Pcryptdoor1aZ, 0x107D3DC0 +.global Pcryptdoor1bZ +.set Pcryptdoor1bZ, 0x107D3DC0 +.global end_Pcryptdoor1bZ +.set end_Pcryptdoor1bZ, 0x107D3F50 +.global Pcryptdoor2aZ +.set Pcryptdoor2aZ, 0x107D3F50 +.global end_Pcryptdoor2aZ +.set end_Pcryptdoor2aZ, 0x107D40E0 +.global Pcryptdoor2bZ +.set Pcryptdoor2bZ, 0x107D40E0 +.global end_Pcryptdoor2bZ +.set end_Pcryptdoor2bZ, 0x107D4270 +.global Pcryptdoor3Z +.set Pcryptdoor3Z, 0x107D4270 +.global end_Pcryptdoor3Z +.set end_Pcryptdoor3Z, 0x107D44E0 +.global Pcryptdoor4Z +.set Pcryptdoor4Z, 0x107D44E0 +.global end_Pcryptdoor4Z +.set end_Pcryptdoor4Z, 0x107D4660 +.global PdamchaindoorZ +.set PdamchaindoorZ, 0x107D4660 +.global end_PdamchaindoorZ +.set end_PdamchaindoorZ, 0x107D48E0 +.global PdamgatedoorZ +.set PdamgatedoorZ, 0x107D48E0 +.global end_PdamgatedoorZ +.set end_PdamgatedoorZ, 0x107D4B00 +.global PdamtundoorZ +.set PdamtundoorZ, 0x107D4B00 +.global end_PdamtundoorZ +.set end_PdamtundoorZ, 0x107D4E70 +.global Pdepot_door_steelZ +.set Pdepot_door_steelZ, 0x107D4E70 +.global end_Pdepot_door_steelZ +.set end_Pdepot_door_steelZ, 0x107D5010 +.global Pdepot_gate_entryZ +.set Pdepot_gate_entryZ, 0x107D5010 +.global end_Pdepot_gate_entryZ +.set end_Pdepot_gate_entryZ, 0x107D5250 +.global Pdesk1Z +.set Pdesk1Z, 0x107D5250 +.global end_Pdesk1Z +.set end_Pdesk1Z, 0x107D53D0 +.global Pdesk2Z +.set Pdesk2Z, 0x107D53D0 +.global end_Pdesk2Z +.set end_Pdesk2Z, 0x107D5550 +.global Pdesk_arecibo1Z +.set Pdesk_arecibo1Z, 0x107D5550 +.global end_Pdesk_arecibo1Z +.set end_Pdesk_arecibo1Z, 0x107D5790 +.global Pdesk_lamp2Z +.set Pdesk_lamp2Z, 0x107D5790 +.global end_Pdesk_lamp2Z +.set end_Pdesk_lamp2Z, 0x107D5A90 +.global Pdest_engineZ +.set Pdest_engineZ, 0x107D5A90 +.global end_Pdest_engineZ +.set end_Pdest_engineZ, 0x107D7380 +.global Pdest_exocetZ +.set Pdest_exocetZ, 0x107D7380 +.global end_Pdest_exocetZ +.set end_Pdest_exocetZ, 0x107D79E0 +.global Pdest_gunZ +.set Pdest_gunZ, 0x107D79E0 +.global end_Pdest_gunZ +.set end_Pdest_gunZ, 0x107D8050 +.global Pdest_harpoonZ +.set Pdest_harpoonZ, 0x107D8050 +.global end_Pdest_harpoonZ +.set end_Pdest_harpoonZ, 0x107D88F0 +.global Pdest_seawolfZ +.set Pdest_seawolfZ, 0x107D88F0 +.global end_Pdest_seawolfZ +.set end_Pdest_seawolfZ, 0x107D98A0 +.global Pdisc_readerZ +.set Pdisc_readerZ, 0x107D98A0 +.global end_Pdisc_readerZ +.set end_Pdisc_readerZ, 0x107D9A60 +.global Pdisk_drive1Z +.set Pdisk_drive1Z, 0x107D9A60 +.global end_Pdisk_drive1Z +.set end_Pdisk_drive1Z, 0x107D9BF0 +.global Pdoor_azt_chairZ +.set Pdoor_azt_chairZ, 0x107D9BF0 +.global end_Pdoor_azt_chairZ +.set end_Pdoor_azt_chairZ, 0x107D9D70 +.global Pdoor_azt_deskZ +.set Pdoor_azt_deskZ, 0x107D9D70 +.global end_Pdoor_azt_deskZ +.set end_Pdoor_azt_deskZ, 0x107DA1B0 +.global Pdoor_azt_desk_topZ +.set Pdoor_azt_desk_topZ, 0x107DA1B0 +.global end_Pdoor_azt_desk_topZ +.set end_Pdoor_azt_desk_topZ, 0x107DA540 +.global Pdoor_aztecZ +.set Pdoor_aztecZ, 0x107DA540 +.global end_Pdoor_aztecZ +.set end_Pdoor_aztecZ, 0x107DA770 +.global Pdoor_dest1Z +.set Pdoor_dest1Z, 0x107DA770 +.global end_Pdoor_dest1Z +.set end_Pdoor_dest1Z, 0x107DAA70 +.global Pdoor_dest2Z +.set Pdoor_dest2Z, 0x107DAA70 +.global end_Pdoor_dest2Z +.set end_Pdoor_dest2Z, 0x107DAE30 +.global Pdoor_eyelidZ +.set Pdoor_eyelidZ, 0x107DAE30 +.global end_Pdoor_eyelidZ +.set end_Pdoor_eyelidZ, 0x107DB390 +.global Pdoor_irisZ +.set Pdoor_irisZ, 0x107DB390 +.global end_Pdoor_irisZ +.set end_Pdoor_irisZ, 0x107DBDE0 +.global Pdoor_mfZ +.set Pdoor_mfZ, 0x107DBDE0 +.global end_Pdoor_mfZ +.set end_Pdoor_mfZ, 0x107DC0D0 +.global Pdoor_roller1Z +.set Pdoor_roller1Z, 0x107DC0D0 +.global end_Pdoor_roller1Z +.set end_Pdoor_roller1Z, 0x107DC440 +.global Pdoor_roller2Z +.set Pdoor_roller2Z, 0x107DC440 +.global end_Pdoor_roller2Z +.set end_Pdoor_roller2Z, 0x107DC680 +.global Pdoor_roller3Z +.set Pdoor_roller3Z, 0x107DC680 +.global end_Pdoor_roller3Z +.set end_Pdoor_roller3Z, 0x107DC8C0 +.global Pdoor_roller4Z +.set Pdoor_roller4Z, 0x107DC8C0 +.global end_Pdoor_roller4Z +.set end_Pdoor_roller4Z, 0x107DCB20 +.global Pdoor_rollertrainZ +.set Pdoor_rollertrainZ, 0x107DCB20 +.global end_Pdoor_rollertrainZ +.set end_Pdoor_rollertrainZ, 0x107DCC50 +.global Pdoor_st_arec1Z +.set Pdoor_st_arec1Z, 0x107DCC50 +.global end_Pdoor_st_arec1Z +.set end_Pdoor_st_arec1Z, 0x107DCEB0 +.global Pdoor_st_arec2Z +.set Pdoor_st_arec2Z, 0x107DCEB0 +.global end_Pdoor_st_arec2Z +.set end_Pdoor_st_arec2Z, 0x107DD190 +.global Pdoor_winZ +.set Pdoor_winZ, 0x107DD190 +.global end_Pdoor_winZ +.set end_Pdoor_winZ, 0x107DD330 +.global PdoorconsoleZ +.set PdoorconsoleZ, 0x107DD330 +.global end_PdoorconsoleZ +.set end_PdoorconsoleZ, 0x107DD7A0 +.global PdoorpanelZ +.set PdoorpanelZ, 0x107DD7A0 +.global end_PdoorpanelZ +.set end_PdoorpanelZ, 0x107DDB10 +.global Pdoorprison1Z +.set Pdoorprison1Z, 0x107DDB10 +.global end_Pdoorprison1Z +.set end_Pdoorprison1Z, 0x107DDC60 +.global PdoorstatgateZ +.set PdoorstatgateZ, 0x107DDC60 +.global end_PdoorstatgateZ +.set end_PdoorstatgateZ, 0x107DDE60 +.global PexplosionbitZ +.set PexplosionbitZ, 0x107DDE60 +.global end_PexplosionbitZ +.set end_PexplosionbitZ, 0x107DDF80 +.global Pfiling_cabinet1Z +.set Pfiling_cabinet1Z, 0x107DDF80 +.global end_Pfiling_cabinet1Z +.set end_Pfiling_cabinet1Z, 0x107DE100 +.global PflagZ +.set PflagZ, 0x107DE100 +.global end_PflagZ +.set end_PflagZ, 0x107DE230 +.global PfloppyZ +.set PfloppyZ, 0x107DE230 +.global end_PfloppyZ +.set end_PfloppyZ, 0x107DE550 +.global Pfnp90magZ +.set Pfnp90magZ, 0x107DE550 +.global end_Pfnp90magZ +.set end_Pfnp90magZ, 0x107DE6F0 +.global Pgas_plant_met1_do1Z +.set Pgas_plant_met1_do1Z, 0x107DE6F0 +.global end_Pgas_plant_met1_do1Z +.set end_Pgas_plant_met1_do1Z, 0x107DEA70 +.global Pgas_plant_sw2_do1Z +.set Pgas_plant_sw2_do1Z, 0x107DEA70 +.global end_Pgas_plant_sw2_do1Z +.set end_Pgas_plant_sw2_do1Z, 0x107DEC50 +.global Pgas_plant_sw3_do1Z +.set Pgas_plant_sw3_do1Z, 0x107DEC50 +.global end_Pgas_plant_sw3_do1Z +.set end_Pgas_plant_sw3_do1Z, 0x107DEE50 +.global Pgas_plant_sw4_do1Z +.set Pgas_plant_sw4_do1Z, 0x107DEE50 +.global end_Pgas_plant_sw4_do1Z +.set end_Pgas_plant_sw4_do1Z, 0x107DEFB0 +.global Pgas_plant_sw_do1Z +.set Pgas_plant_sw_do1Z, 0x107DEFB0 +.global end_Pgas_plant_sw_do1Z +.set end_Pgas_plant_sw_do1Z, 0x107DF240 +.global Pgas_plant_wc_cub1Z +.set Pgas_plant_wc_cub1Z, 0x107DF240 +.global end_Pgas_plant_wc_cub1Z +.set end_Pgas_plant_wc_cub1Z, 0x107DF450 +.global PgasbarrelZ +.set PgasbarrelZ, 0x107DF450 +.global end_PgasbarrelZ +.set end_PgasbarrelZ, 0x107DF660 +.global PgasbarrelsZ +.set PgasbarrelsZ, 0x107DF660 +.global end_PgasbarrelsZ +.set end_PgasbarrelsZ, 0x107DFBA0 +.global Pgasplant_clear_doorZ +.set Pgasplant_clear_doorZ, 0x107DFBA0 +.global end_Pgasplant_clear_doorZ +.set end_Pgasplant_clear_doorZ, 0x107E0100 +.global PgastankZ +.set PgastankZ, 0x107E0100 +.global end_PgastankZ +.set end_PgastankZ, 0x107E06B0 +.global Pglassware1Z +.set Pglassware1Z, 0x107E06B0 +.global end_Pglassware1Z +.set end_Pglassware1Z, 0x107E0810 +.global Pglassware2Z +.set Pglassware2Z, 0x107E0810 +.global end_Pglassware2Z +.set end_Pglassware2Z, 0x107E0AA0 +.global Pglassware3Z +.set Pglassware3Z, 0x107E0AA0 +.global end_Pglassware3Z +.set end_Pglassware3Z, 0x107E0CB0 +.global Pglassware4Z +.set Pglassware4Z, 0x107E0CB0 +.global end_Pglassware4Z +.set end_Pglassware4Z, 0x107E1230 +.global PgoldeneyelogoZ +.set PgoldeneyelogoZ, 0x107E1230 +.global end_PgoldeneyelogoZ +.set end_PgoldeneyelogoZ, 0x107E20E0 +.global PgoldenshellsZ +.set PgoldenshellsZ, 0x107E20E0 +.global end_PgoldenshellsZ +.set end_PgoldenshellsZ, 0x107E22E0 +.global PgroundgunZ +.set PgroundgunZ, 0x107E22E0 +.global end_PgroundgunZ +.set end_PgroundgunZ, 0x107E2AB0 +.global Pgun_runway1Z +.set Pgun_runway1Z, 0x107E2AB0 +.global end_Pgun_runway1Z +.set end_Pgun_runway1Z, 0x107E31F0 +.global PhatberetZ +.set PhatberetZ, 0x107E31F0 +.global end_PhatberetZ +.set end_PhatberetZ, 0x107E3490 +.global PhatberetblueZ +.set PhatberetblueZ, 0x107E3490 +.global end_PhatberetblueZ +.set end_PhatberetblueZ, 0x107E3760 +.global PhatberetredZ +.set PhatberetredZ, 0x107E3760 +.global end_PhatberetredZ +.set end_PhatberetredZ, 0x107E3A40 +.global PhatchboltZ +.set PhatchboltZ, 0x107E3A40 +.global end_PhatchboltZ +.set end_PhatchboltZ, 0x107E3B10 +.global PhatchdoorZ +.set PhatchdoorZ, 0x107E3B10 +.global end_PhatchdoorZ +.set end_PhatchdoorZ, 0x107E3D30 +.global PhatchsevxZ +.set PhatchsevxZ, 0x107E3D30 +.global end_PhatchsevxZ +.set end_PhatchsevxZ, 0x107E3EA0 +.global PhatfurryZ +.set PhatfurryZ, 0x107E3EA0 +.global end_PhatfurryZ +.set end_PhatfurryZ, 0x107E40D0 +.global PhatfurryblackZ +.set PhatfurryblackZ, 0x107E40D0 +.global end_PhatfurryblackZ +.set end_PhatfurryblackZ, 0x107E42F0 +.global PhatfurrybrownZ +.set PhatfurrybrownZ, 0x107E42F0 +.global end_PhatfurrybrownZ +.set end_PhatfurrybrownZ, 0x107E4500 +.global PhathelmetZ +.set PhathelmetZ, 0x107E4500 +.global end_PhathelmetZ +.set end_PhathelmetZ, 0x107E4730 +.global PhathelmetgreyZ +.set PhathelmetgreyZ, 0x107E4730 +.global end_PhathelmetgreyZ +.set end_PhathelmetgreyZ, 0x107E4960 +.global PhatmoonZ +.set PhatmoonZ, 0x107E4960 +.global end_PhatmoonZ +.set end_PhatmoonZ, 0x107E4D40 +.global PhatpeakedZ +.set PhatpeakedZ, 0x107E4D40 +.global end_PhatpeakedZ +.set end_PhatpeakedZ, 0x107E5050 +.global PhattbirdZ +.set PhattbirdZ, 0x107E5050 +.global end_PhattbirdZ +.set end_PhattbirdZ, 0x107E52A0 +.global PhattbirdbrownZ +.set PhattbirdbrownZ, 0x107E52A0 +.global end_PhattbirdbrownZ +.set end_PhattbirdbrownZ, 0x107E5510 +.global PhelicopterZ +.set PhelicopterZ, 0x107E5510 +.global end_PhelicopterZ +.set end_PhelicopterZ, 0x107E9730 +.global PhindZ +.set PhindZ, 0x107E9730 +.global end_PhindZ +.set end_PhindZ, 0x107EAEA0 +.global PjeepZ +.set PjeepZ, 0x107EAEA0 +.global end_PjeepZ +.set end_PjeepZ, 0x107EC000 +.global Pjerry_can1Z +.set Pjerry_can1Z, 0x107EC000 +.global end_Pjerry_can1Z +.set end_Pjerry_can1Z, 0x107EC260 +.global Pjungle3_treeZ +.set Pjungle3_treeZ, 0x107EC260 +.global end_Pjungle3_treeZ +.set end_Pjungle3_treeZ, 0x107EC9E0 +.global Pjungle5_treeZ +.set Pjungle5_treeZ, 0x107EC9E0 +.global end_Pjungle5_treeZ +.set end_Pjungle5_treeZ, 0x107ECF10 +.global Pkey_holderZ +.set Pkey_holderZ, 0x107ECF10 +.global end_Pkey_holderZ +.set end_Pkey_holderZ, 0x107ED260 +.global Pkeyboard1Z +.set Pkeyboard1Z, 0x107ED260 +.global end_Pkeyboard1Z +.set end_Pkeyboard1Z, 0x107ED3D0 +.global Pkit_units1Z +.set Pkit_units1Z, 0x107ED3D0 +.global end_Pkit_units1Z +.set end_Pkit_units1Z, 0x107ED670 +.global PlabbenchZ +.set PlabbenchZ, 0x107ED670 +.global end_PlabbenchZ +.set end_PlabbenchZ, 0x107EDA40 +.global PlandmineZ +.set PlandmineZ, 0x107EDA40 +.global end_PlandmineZ +.set end_PlandmineZ, 0x107EDCB0 +.global PlegalpageZ +.set PlegalpageZ, 0x107EDCB0 +.global end_PlegalpageZ +.set end_PlegalpageZ, 0x107EEC70 +.global Pletter_tray1Z +.set Pletter_tray1Z, 0x107EEC70 +.global end_Pletter_tray1Z +.set end_Pletter_tray1Z, 0x107EEDD0 +.global Plocker3Z +.set Plocker3Z, 0x107EEDD0 +.global end_Plocker3Z +.set end_Plocker3Z, 0x107EEF60 +.global Plocker4Z +.set Plocker4Z, 0x107EEF60 +.global end_Plocker4Z +.set end_Plocker4Z, 0x107EF0F0 +.global Pm16magZ +.set Pm16magZ, 0x107EF0F0 +.global end_Pm16magZ +.set end_Pm16magZ, 0x107EF230 +.global PmagnumshellsZ +.set PmagnumshellsZ, 0x107EF230 +.global end_PmagnumshellsZ +.set end_PmagnumshellsZ, 0x107EF430 +.global Pmainframe1Z +.set Pmainframe1Z, 0x107EF430 +.global end_Pmainframe1Z +.set end_Pmainframe1Z, 0x107EF730 +.global Pmainframe2Z +.set Pmainframe2Z, 0x107EF730 +.global end_Pmainframe2Z +.set end_Pmainframe2Z, 0x107EFA00 +.global Pmetal_chair1Z +.set Pmetal_chair1Z, 0x107EFA00 +.global end_Pmetal_chair1Z +.set end_Pmetal_chair1Z, 0x107EFD40 +.global Pmetal_crate1Z +.set Pmetal_crate1Z, 0x107EFD40 +.global end_Pmetal_crate1Z +.set end_Pmetal_crate1Z, 0x107EFF00 +.global Pmetal_crate2Z +.set Pmetal_crate2Z, 0x107EFF00 +.global end_Pmetal_crate2Z +.set end_Pmetal_crate2Z, 0x107F00C0 +.global Pmetal_crate3Z +.set Pmetal_crate3Z, 0x107F00C0 +.global end_Pmetal_crate3Z +.set end_Pmetal_crate3Z, 0x107F0280 +.global Pmetal_crate4Z +.set Pmetal_crate4Z, 0x107F0280 +.global end_Pmetal_crate4Z +.set end_Pmetal_crate4Z, 0x107F0440 +.global PmilcopterZ +.set PmilcopterZ, 0x107F0440 +.global end_PmilcopterZ +.set end_PmilcopterZ, 0x107F1D20 +.global PmiltruckZ +.set PmiltruckZ, 0x107F1D20 +.global end_PmiltruckZ +.set end_PmiltruckZ, 0x107F4020 +.global Pmissile_rack2Z +.set Pmissile_rack2Z, 0x107F4020 +.global end_Pmissile_rack2Z +.set end_Pmissile_rack2Z, 0x107F4A30 +.global Pmissile_rackZ +.set Pmissile_rackZ, 0x107F4A30 +.global end_Pmissile_rackZ +.set end_Pmissile_rackZ, 0x107F4E10 +.global PmodemboxZ +.set PmodemboxZ, 0x107F4E10 +.global end_PmodemboxZ +.set end_PmodemboxZ, 0x107F5150 +.global PmotorbikeZ +.set PmotorbikeZ, 0x107F5150 +.global end_PmotorbikeZ +.set end_PmotorbikeZ, 0x107F6010 +.global Pmp5kmagZ +.set Pmp5kmagZ, 0x107F6010 +.global end_Pmp5kmagZ +.set end_Pmp5kmagZ, 0x107F6160 +.global PnintendologoZ +.set PnintendologoZ, 0x107F6160 +.global end_PnintendologoZ +.set end_PnintendologoZ, 0x107F8C40 +.global Poil_drum1Z +.set Poil_drum1Z, 0x107F8C40 +.global end_Poil_drum1Z +.set end_Poil_drum1Z, 0x107F8EB0 +.global Poil_drum2Z +.set Poil_drum2Z, 0x107F8EB0 +.global end_Poil_drum2Z +.set end_Poil_drum2Z, 0x107F91A0 +.global Poil_drum3Z +.set Poil_drum3Z, 0x107F91A0 +.global end_Poil_drum3Z +.set end_Poil_drum3Z, 0x107F9490 +.global Poil_drum5Z +.set Poil_drum5Z, 0x107F9490 +.global end_Poil_drum5Z +.set end_Poil_drum5Z, 0x107F9780 +.global Poil_drum6Z +.set Poil_drum6Z, 0x107F9780 +.global end_Poil_drum6Z +.set end_Poil_drum6Z, 0x107F9A90 +.global Poil_drum7Z +.set Poil_drum7Z, 0x107F9A90 +.global end_Poil_drum7Z +.set end_Poil_drum7Z, 0x107F9D90 +.global PpadlockZ +.set PpadlockZ, 0x107F9D90 +.global end_PpadlockZ +.set end_PpadlockZ, 0x107FA7E0 +.global PpalmZ +.set PpalmZ, 0x107FA7E0 +.global end_PpalmZ +.set end_PpalmZ, 0x107FAC30 +.global PpalmtreeZ +.set PpalmtreeZ, 0x107FAC30 +.global end_PpalmtreeZ +.set end_PpalmtreeZ, 0x107FB100 +.global Pphone1Z +.set Pphone1Z, 0x107FB100 +.global end_Pphone1Z +.set end_Pphone1Z, 0x107FB240 +.global PplaneZ +.set PplaneZ, 0x107FB240 +.global end_PplaneZ +.set end_PplaneZ, 0x107FD820 +.global Pplant11Z +.set Pplant11Z, 0x107FD820 +.global end_Pplant11Z +.set end_Pplant11Z, 0x107FDBE0 +.global Pplant1Z +.set Pplant1Z, 0x107FDBE0 +.global end_Pplant1Z +.set end_Pplant1Z, 0x107FDF70 +.global Pplant2Z +.set Pplant2Z, 0x107FDF70 +.global end_Pplant2Z +.set end_Pplant2Z, 0x107FE2D0 +.global Pplant2bZ +.set Pplant2bZ, 0x107FE2D0 +.global end_Pplant2bZ +.set end_Pplant2bZ, 0x107FE6E0 +.global Pplant3Z +.set Pplant3Z, 0x107FE6E0 +.global end_Pplant3Z +.set end_Pplant3Z, 0x107FEB30 +.global Pradio_unit1Z +.set Pradio_unit1Z, 0x107FEB30 +.global end_Pradio_unit1Z +.set end_Pradio_unit1Z, 0x107FECE0 +.global Pradio_unit2Z +.set Pradio_unit2Z, 0x107FECE0 +.global end_Pradio_unit2Z +.set end_Pradio_unit2Z, 0x107FEEA0 +.global Pradio_unit3Z +.set Pradio_unit3Z, 0x107FEEA0 +.global end_Pradio_unit3Z +.set end_Pradio_unit3Z, 0x107FF060 +.global Pradio_unit4Z +.set Pradio_unit4Z, 0x107FF060 +.global end_Pradio_unit4Z +.set end_Pradio_unit4Z, 0x107FF220 +.global ProofgunZ +.set ProofgunZ, 0x107FF220 +.global end_ProofgunZ +.set end_ProofgunZ, 0x107FF880 +.global PsafeZ +.set PsafeZ, 0x107FF880 +.global end_PsafeZ +.set end_PsafeZ, 0x107FFBD0 +.global PsafedoorZ +.set PsafedoorZ, 0x107FFBD0 +.global end_PsafedoorZ +.set end_PsafedoorZ, 0x108000C0 +.global Psat1_reflectZ +.set Psat1_reflectZ, 0x108000C0 +.global end_Psat1_reflectZ +.set end_Psat1_reflectZ, 0x10801630 +.global PsatboxZ +.set PsatboxZ, 0x10801630 +.global end_PsatboxZ +.set end_PsatboxZ, 0x10801750 +.global PsatdishZ +.set PsatdishZ, 0x10801750 +.global end_PsatdishZ +.set end_PsatdishZ, 0x10801BB0 +.global Psec_panelZ +.set Psec_panelZ, 0x10801BB0 +.global end_Psec_panelZ +.set end_Psec_panelZ, 0x10801D50 +.global Psev_door3Z +.set Psev_door3Z, 0x10801D50 +.global end_Psev_door3Z +.set end_Psev_door3Z, 0x10801FE0 +.global Psev_door3_windZ +.set Psev_door3_windZ, 0x10801FE0 +.global end_Psev_door3_windZ +.set end_Psev_door3_windZ, 0x10802370 +.global Psev_door4_windZ +.set Psev_door4_windZ, 0x10802370 +.global end_Psev_door4_windZ +.set end_Psev_door4_windZ, 0x10802750 +.global Psev_doorZ +.set Psev_doorZ, 0x10802750 +.global end_Psev_doorZ +.set end_Psev_doorZ, 0x10802AA0 +.global Psev_door_v1Z +.set Psev_door_v1Z, 0x10802AA0 +.global end_Psev_door_v1Z +.set end_Psev_door_v1Z, 0x10802DD0 +.global Psev_trislideZ +.set Psev_trislideZ, 0x10802DD0 +.global end_Psev_trislideZ +.set end_Psev_trislideZ, 0x10803180 +.global PsevdishZ +.set PsevdishZ, 0x10803180 +.global end_PsevdishZ +.set end_PsevdishZ, 0x108040A0 +.global PsevdoormetslideZ +.set PsevdoormetslideZ, 0x108040A0 +.global end_PsevdoormetslideZ +.set end_PsevdoormetslideZ, 0x10804380 +.global PsevdoornowindZ +.set PsevdoornowindZ, 0x10804380 +.global end_PsevdoornowindZ +.set end_PsevdoornowindZ, 0x108044F0 +.global PsevdoorwindZ +.set PsevdoorwindZ, 0x108044F0 +.global end_PsevdoorwindZ +.set end_PsevdoorwindZ, 0x10804920 +.global PsevdoorwoodZ +.set PsevdoorwoodZ, 0x10804920 +.global end_PsevdoorwoodZ +.set end_PsevdoorwoodZ, 0x10804CD0 +.global PshuttleZ +.set PshuttleZ, 0x10804CD0 +.global end_PshuttleZ +.set end_PshuttleZ, 0x108076D0 +.global Pshuttle_door_lZ +.set Pshuttle_door_lZ, 0x108076D0 +.global end_Pshuttle_door_lZ +.set end_Pshuttle_door_lZ, 0x10808300 +.global Pshuttle_door_rZ +.set Pshuttle_door_rZ, 0x10808300 +.global end_Pshuttle_door_rZ +.set end_Pshuttle_door_rZ, 0x10809000 +.global PsilencerZ +.set PsilencerZ, 0x10809000 +.global end_PsilencerZ +.set end_PsilencerZ, 0x108091A0 +.global Psilo_lift_doorZ +.set Psilo_lift_doorZ, 0x108091A0 +.global end_Psilo_lift_doorZ +.set end_Psilo_lift_doorZ, 0x108093E0 +.global PsilotopdoorZ +.set PsilotopdoorZ, 0x108093E0 +.global end_PsilotopdoorZ +.set end_PsilotopdoorZ, 0x108096D0 +.global PskorpionmagZ +.set PskorpionmagZ, 0x108096D0 +.global end_PskorpionmagZ +.set end_PskorpionmagZ, 0x10809830 +.global PspectremagZ +.set PspectremagZ, 0x10809830 +.global end_PspectremagZ +.set end_PspectremagZ, 0x108099A0 +.global PspeedboatZ +.set PspeedboatZ, 0x108099A0 +.global end_PspeedboatZ +.set end_PspeedboatZ, 0x1080A6E0 +.global Pst_pete_room_1iZ +.set Pst_pete_room_1iZ, 0x1080A6E0 +.global end_Pst_pete_room_1iZ +.set end_Pst_pete_room_1iZ, 0x1080D820 +.global Pst_pete_room_2iZ +.set Pst_pete_room_2iZ, 0x1080D820 +.global end_Pst_pete_room_2iZ +.set end_Pst_pete_room_2iZ, 0x10810A00 +.global Pst_pete_room_3tZ +.set Pst_pete_room_3tZ, 0x10810A00 +.global end_Pst_pete_room_3tZ +.set end_Pst_pete_room_3tZ, 0x10813940 +.global Pst_pete_room_5cZ +.set Pst_pete_room_5cZ, 0x10813940 +.global end_Pst_pete_room_5cZ +.set end_Pst_pete_room_5cZ, 0x10816ED0 +.global Pst_pete_room_6cZ +.set Pst_pete_room_6cZ, 0x10816ED0 +.global end_Pst_pete_room_6cZ +.set end_Pst_pete_room_6cZ, 0x1081A2E0 +.global Psteel_door1Z +.set Psteel_door1Z, 0x1081A2E0 +.global end_Psteel_door1Z +.set end_Psteel_door1Z, 0x1081A550 +.global Psteel_door2Z +.set Psteel_door2Z, 0x1081A550 +.global end_Psteel_door2Z +.set end_Psteel_door2Z, 0x1081A800 +.global Psteel_door2bZ +.set Psteel_door2bZ, 0x1081A800 +.global end_Psteel_door2bZ +.set end_Psteel_door2bZ, 0x1081AAD0 +.global Psteel_door3Z +.set Psteel_door3Z, 0x1081AAD0 +.global end_Psteel_door3Z +.set end_Psteel_door3Z, 0x1081ADA0 +.global Pstool1Z +.set Pstool1Z, 0x1081ADA0 +.global end_Pstool1Z +.set end_Pstool1Z, 0x1081B060 +.global Pswipe_card2Z +.set Pswipe_card2Z, 0x1081B060 +.global end_Pswipe_card2Z +.set end_Pswipe_card2Z, 0x1081B1F0 +.global Pswivel_chair1Z +.set Pswivel_chair1Z, 0x1081B1F0 +.global end_Pswivel_chair1Z +.set end_Pswivel_chair1Z, 0x1081B480 +.global PtankZ +.set PtankZ, 0x1081B480 +.global end_PtankZ +.set end_PtankZ, 0x1081CF20 +.global PtigerZ +.set PtigerZ, 0x1081CF20 +.global end_PtigerZ +.set end_PtigerZ, 0x1081EDB0 +.global Ptorpedo_rackZ +.set Ptorpedo_rackZ, 0x1081EDB0 +.global end_Ptorpedo_rackZ +.set end_Ptorpedo_rackZ, 0x1081F630 +.global Ptrain_door2Z +.set Ptrain_door2Z, 0x1081F630 +.global end_Ptrain_door2Z +.set end_Ptrain_door2Z, 0x1081FA00 +.global Ptrain_door3Z +.set Ptrain_door3Z, 0x1081FA00 +.global end_Ptrain_door3Z +.set end_Ptrain_door3Z, 0x1081FE20 +.global Ptrain_doorZ +.set Ptrain_doorZ, 0x1081FE20 +.global end_Ptrain_doorZ +.set end_Ptrain_doorZ, 0x10820090 +.global PtrainextdoorZ +.set PtrainextdoorZ, 0x10820090 +.global end_PtrainextdoorZ +.set end_PtrainextdoorZ, 0x108203D0 +.global Ptt33magZ +.set Ptt33magZ, 0x108203D0 +.global end_Ptt33magZ +.set end_Ptt33magZ, 0x10820510 +.global Ptuning_console1Z +.set Ptuning_console1Z, 0x10820510 +.global end_Ptuning_console1Z +.set end_Ptuning_console1Z, 0x10820A30 +.global Ptv1Z +.set Ptv1Z, 0x10820A30 +.global end_Ptv1Z +.set end_Ptv1Z, 0x10820C00 +.global Ptv4screenZ +.set Ptv4screenZ, 0x10820C00 +.global end_Ptv4screenZ +.set end_Ptv4screenZ, 0x10820DA0 +.global Ptv_holderZ +.set Ptv_holderZ, 0x10820DA0 +.global end_Ptv_holderZ +.set end_Ptv_holderZ, 0x10821470 +.global PtvscreenZ +.set PtvscreenZ, 0x10821470 +.global end_PtvscreenZ +.set end_PtvscreenZ, 0x10821540 +.global PuzimagZ +.set PuzimagZ, 0x10821540 +.global end_PuzimagZ +.set end_PuzimagZ, 0x10821680 +.global PvertdoorZ +.set PvertdoorZ, 0x10821680 +.global end_PvertdoorZ +.set end_PvertdoorZ, 0x10821C90 +.global PwalletbondZ +.set PwalletbondZ, 0x10821C90 +.global end_PwalletbondZ +.set end_PwalletbondZ, 0x10823240 +.global PwindowZ +.set PwindowZ, 0x10823240 +.global end_PwindowZ +.set end_PwindowZ, 0x10823330 +.global Pwindow_cor11Z +.set Pwindow_cor11Z, 0x10823330 +.global end_Pwindow_cor11Z +.set end_Pwindow_cor11Z, 0x10823410 +.global Pwindow_lib_lg1Z +.set Pwindow_lib_lg1Z, 0x10823410 +.global end_Pwindow_lib_lg1Z +.set end_Pwindow_lib_lg1Z, 0x108234F0 +.global Pwindow_lib_sm1Z +.set Pwindow_lib_sm1Z, 0x108234F0 +.global end_Pwindow_lib_sm1Z +.set end_Pwindow_lib_sm1Z, 0x108235E0 +.global Pwood_lg_crate1Z +.set Pwood_lg_crate1Z, 0x108235E0 +.global end_Pwood_lg_crate1Z +.set end_Pwood_lg_crate1Z, 0x10823860 +.global Pwood_lg_crate2Z +.set Pwood_lg_crate2Z, 0x10823860 +.global end_Pwood_lg_crate2Z +.set end_Pwood_lg_crate2Z, 0x10823A80 +.global Pwood_md_crate3Z +.set Pwood_md_crate3Z, 0x10823A80 +.global end_Pwood_md_crate3Z +.set end_Pwood_md_crate3Z, 0x10823CA0 +.global Pwood_sm_crate4Z +.set Pwood_sm_crate4Z, 0x10823CA0 +.global end_Pwood_sm_crate4Z +.set end_Pwood_sm_crate4Z, 0x10823F00 +.global Pwood_sm_crate5Z +.set Pwood_sm_crate5Z, 0x10823F00 +.global end_Pwood_sm_crate5Z +.set end_Pwood_sm_crate5Z, 0x10824160 +.global Pwood_sm_crate6Z +.set Pwood_sm_crate6Z, 0x10824160 +.global end_Pwood_sm_crate6Z +.set end_Pwood_sm_crate6Z, 0x10824380 +.global Pwooden_table1Z +.set Pwooden_table1Z, 0x10824380 +.global end_Pwooden_table1Z +.set end_Pwooden_table1Z, 0x108246F0 +.global PwppkmagZ +.set PwppkmagZ, 0x108246F0 +.global end_PwppkmagZ +.set end_PwppkmagZ, 0x10824830 +.global Tbg_ame_all_p_stanZ +.set Tbg_ame_all_p_stanZ, 0x10824830 +.global end_Tbg_ame_all_p_stanZ +.set end_Tbg_ame_all_p_stanZ, 0x10826160 +.global Tbg_arch_all_p_stanZ +.set Tbg_arch_all_p_stanZ, 0x10826160 +.global end_Tbg_arch_all_p_stanZ +.set end_Tbg_arch_all_p_stanZ, 0x1082BE50 +.global Tbg_arec_all_p_stanZ +.set Tbg_arec_all_p_stanZ, 0x1082BE50 +.global end_Tbg_arec_all_p_stanZ +.set end_Tbg_arec_all_p_stanZ, 0x108341A0 +.global Tbg_ark_all_p_stanZ +.set Tbg_ark_all_p_stanZ, 0x108341A0 +.global end_Tbg_ark_all_p_stanZ +.set end_Tbg_ark_all_p_stanZ, 0x1083D160 +.global Tbg_ash_all_p_stanZ +.set Tbg_ash_all_p_stanZ, 0x1083D160 +.global end_Tbg_ash_all_p_stanZ +.set end_Tbg_ash_all_p_stanZ, 0x1083EA90 +.global Tbg_azt_all_p_stanZ +.set Tbg_azt_all_p_stanZ, 0x1083EA90 +.global end_Tbg_azt_all_p_stanZ +.set end_Tbg_azt_all_p_stanZ, 0x10844010 +.global Tbg_cat_all_p_stanZ +.set Tbg_cat_all_p_stanZ, 0x10844010 +.global end_Tbg_cat_all_p_stanZ +.set end_Tbg_cat_all_p_stanZ, 0x10846740 +.global Tbg_cave_all_p_stanZ +.set Tbg_cave_all_p_stanZ, 0x10846740 +.global end_Tbg_cave_all_p_stanZ +.set end_Tbg_cave_all_p_stanZ, 0x1084B630 +.global Tbg_crad_all_p_stanZ +.set Tbg_crad_all_p_stanZ, 0x1084B630 +.global end_Tbg_crad_all_p_stanZ +.set end_Tbg_crad_all_p_stanZ, 0x1084DF40 +.global Tbg_cryp_all_p_stanZ +.set Tbg_cryp_all_p_stanZ, 0x1084DF40 +.global end_Tbg_cryp_all_p_stanZ +.set end_Tbg_cryp_all_p_stanZ, 0x10850FB0 +.global Tbg_dam_all_p_stanZ +.set Tbg_dam_all_p_stanZ, 0x10850FB0 +.global end_Tbg_dam_all_p_stanZ +.set end_Tbg_dam_all_p_stanZ, 0x1085B390 +.global Tbg_depo_all_p_stanZ +.set Tbg_depo_all_p_stanZ, 0x1085B390 +.global end_Tbg_depo_all_p_stanZ +.set end_Tbg_depo_all_p_stanZ, 0x108622D0 +.global Tbg_dest_all_p_stanZ +.set Tbg_dest_all_p_stanZ, 0x108622D0 +.global end_Tbg_dest_all_p_stanZ +.set end_Tbg_dest_all_p_stanZ, 0x10868BC0 +.global Tbg_dish_all_p_stanZ +.set Tbg_dish_all_p_stanZ, 0x10868BC0 +.global end_Tbg_dish_all_p_stanZ +.set end_Tbg_dish_all_p_stanZ, 0x108696D0 +.global Tbg_imp_all_p_stanZ +.set Tbg_imp_all_p_stanZ, 0x108696D0 +.global end_Tbg_imp_all_p_stanZ +.set end_Tbg_imp_all_p_stanZ, 0x1086B000 +.global Tbg_jun_all_p_stanZ +.set Tbg_jun_all_p_stanZ, 0x1086B000 +.global end_Tbg_jun_all_p_stanZ +.set end_Tbg_jun_all_p_stanZ, 0x10872150 +.global Tbg_len_all_p_stanZ +.set Tbg_len_all_p_stanZ, 0x10872150 +.global end_Tbg_len_all_p_stanZ +.set end_Tbg_len_all_p_stanZ, 0x10872C10 +.global Tbg_oat_all_p_stanZ +.set Tbg_oat_all_p_stanZ, 0x10872C10 +.global end_Tbg_oat_all_p_stanZ +.set end_Tbg_oat_all_p_stanZ, 0x10874510 +.global Tbg_pete_all_p_stanZ +.set Tbg_pete_all_p_stanZ, 0x10874510 +.global end_Tbg_pete_all_p_stanZ +.set end_Tbg_pete_all_p_stanZ, 0x10878BA0 +.global Tbg_ref_all_p_stanZ +.set Tbg_ref_all_p_stanZ, 0x10878BA0 +.global end_Tbg_ref_all_p_stanZ +.set end_Tbg_ref_all_p_stanZ, 0x1087A970 +.global Tbg_run_all_p_stanZ +.set Tbg_run_all_p_stanZ, 0x1087A970 +.global end_Tbg_run_all_p_stanZ +.set end_Tbg_run_all_p_stanZ, 0x1087C3F0 +.global Tbg_sev_all_p_stanZ +.set Tbg_sev_all_p_stanZ, 0x1087C3F0 +.global end_Tbg_sev_all_p_stanZ +.set end_Tbg_sev_all_p_stanZ, 0x108801C0 +.global Tbg_sevb_all_p_stanZ +.set Tbg_sevb_all_p_stanZ, 0x108801C0 +.global end_Tbg_sevb_all_p_stanZ +.set end_Tbg_sevb_all_p_stanZ, 0x10885100 +.global Tbg_sevx_all_p_stanZ +.set Tbg_sevx_all_p_stanZ, 0x10885100 +.global end_Tbg_sevx_all_p_stanZ +.set end_Tbg_sevx_all_p_stanZ, 0x1088E430 +.global Tbg_silo_all_p_stanZ +.set Tbg_silo_all_p_stanZ, 0x1088E430 +.global end_Tbg_silo_all_p_stanZ +.set end_Tbg_silo_all_p_stanZ, 0x108974D0 +.global Tbg_stat_all_p_stanZ +.set Tbg_stat_all_p_stanZ, 0x108974D0 +.global end_Tbg_stat_all_p_stanZ +.set end_Tbg_stat_all_p_stanZ, 0x1089C390 +.global Tbg_tra_all_p_stanZ +.set Tbg_tra_all_p_stanZ, 0x1089C390 +.global end_Tbg_tra_all_p_stanZ +.set end_Tbg_tra_all_p_stanZ, 0x1089E760 +.global UbriefarchZ +.set UbriefarchZ, 0x1089E760 +.global end_UbriefarchZ +.set end_UbriefarchZ, 0x1089E780 +.global UbriefarkZ +.set UbriefarkZ, 0x1089E780 +.global end_UbriefarkZ +.set end_UbriefarkZ, 0x1089E7A0 +.global UbriefaztZ +.set UbriefaztZ, 0x1089E7A0 +.global end_UbriefaztZ +.set end_UbriefaztZ, 0x1089E7C0 +.global UbriefcaveZ +.set UbriefcaveZ, 0x1089E7C0 +.global end_UbriefcaveZ +.set end_UbriefcaveZ, 0x1089E7E0 +.global UbriefcontrolZ +.set UbriefcontrolZ, 0x1089E7E0 +.global end_UbriefcontrolZ +.set end_UbriefcontrolZ, 0x1089E800 +.global UbriefcradZ +.set UbriefcradZ, 0x1089E800 +.global end_UbriefcradZ +.set end_UbriefcradZ, 0x1089E820 +.global UbriefcrypZ +.set UbriefcrypZ, 0x1089E820 +.global end_UbriefcrypZ +.set end_UbriefcrypZ, 0x1089E840 +.global UbriefdamZ +.set UbriefdamZ, 0x1089E840 +.global end_UbriefdamZ +.set end_UbriefdamZ, 0x1089E860 +.global UbriefdepoZ +.set UbriefdepoZ, 0x1089E860 +.global end_UbriefdepoZ +.set end_UbriefdepoZ, 0x1089E880 +.global UbriefdestZ +.set UbriefdestZ, 0x1089E880 +.global end_UbriefdestZ +.set end_UbriefdestZ, 0x1089E8A0 +.global UbriefjunZ +.set UbriefjunZ, 0x1089E8A0 +.global end_UbriefjunZ +.set end_UbriefjunZ, 0x1089E8C0 +.global UbriefpeteZ +.set UbriefpeteZ, 0x1089E8C0 +.global end_UbriefpeteZ +.set end_UbriefpeteZ, 0x1089E8E0 +.global UbriefrunZ +.set UbriefrunZ, 0x1089E8E0 +.global end_UbriefrunZ +.set end_UbriefrunZ, 0x1089E900 +.global UbriefsevbZ +.set UbriefsevbZ, 0x1089E900 +.global end_UbriefsevbZ +.set end_UbriefsevbZ, 0x1089E920 +.global UbriefsevbunkerZ +.set UbriefsevbunkerZ, 0x1089E920 +.global end_UbriefsevbunkerZ +.set end_UbriefsevbunkerZ, 0x1089E940 +.global UbriefsevxZ +.set UbriefsevxZ, 0x1089E940 +.global end_UbriefsevxZ +.set end_UbriefsevxZ, 0x1089E960 +.global UbriefsevxbZ +.set UbriefsevxbZ, 0x1089E960 +.global end_UbriefsevxbZ +.set end_UbriefsevxbZ, 0x1089E980 +.global UbriefsiloZ +.set UbriefsiloZ, 0x1089E980 +.global end_UbriefsiloZ +.set end_UbriefsiloZ, 0x1089E9A0 +.global UbriefstatueZ +.set UbriefstatueZ, 0x1089E9A0 +.global end_UbriefstatueZ +.set end_UbriefstatueZ, 0x1089E9C0 +.global UbrieftraZ +.set UbrieftraZ, 0x1089E9C0 +.global end_UbrieftraZ +.set end_UbrieftraZ, 0x1089E9E0 +.global Ump_setupameZ +.set Ump_setupameZ, 0x1089E9E0 +.global end_Ump_setupameZ +.set end_Ump_setupameZ, 0x1089F100 +.global Ump_setuparchZ +.set Ump_setuparchZ, 0x1089F100 +.global end_Ump_setuparchZ +.set end_Ump_setuparchZ, 0x108A1EA0 +.global Ump_setuparkZ +.set Ump_setuparkZ, 0x108A1EA0 +.global end_Ump_setuparkZ +.set end_Ump_setuparkZ, 0x108A3BE0 +.global Ump_setupashZ +.set Ump_setupashZ, 0x108A3BE0 +.global end_Ump_setupashZ +.set end_Ump_setupashZ, 0x108A42D0 +.global Ump_setupcaveZ +.set Ump_setupcaveZ, 0x108A42D0 +.global end_Ump_setupcaveZ +.set end_Ump_setupcaveZ, 0x108A6830 +.global Ump_setupcradZ +.set Ump_setupcradZ, 0x108A6830 +.global end_Ump_setupcradZ +.set end_Ump_setupcradZ, 0x108A7190 +.global Ump_setupcrypZ +.set Ump_setupcrypZ, 0x108A7190 +.global end_Ump_setupcrypZ +.set end_Ump_setupcrypZ, 0x108A7EF0 +.global Ump_setupdishZ +.set Ump_setupdishZ, 0x108A7EF0 +.global end_Ump_setupdishZ +.set end_Ump_setupdishZ, 0x108A82E0 +.global Ump_setupimpZ +.set Ump_setupimpZ, 0x108A82E0 +.global end_Ump_setupimpZ +.set end_Ump_setupimpZ, 0x108A8920 +.global Ump_setupoatZ +.set Ump_setupoatZ, 0x108A8920 +.global end_Ump_setupoatZ +.set end_Ump_setupoatZ, 0x108A8C70 +.global Ump_setuprefZ +.set Ump_setuprefZ, 0x108A8C70 +.global end_Ump_setuprefZ +.set end_Ump_setuprefZ, 0x108A9080 +.global Ump_setupsevbZ +.set Ump_setupsevbZ, 0x108A9080 +.global end_Ump_setupsevbZ +.set end_Ump_setupsevbZ, 0x108AA390 +.global Ump_setupstatueZ +.set Ump_setupstatueZ, 0x108AA390 +.global end_Ump_setupstatueZ +.set end_Ump_setupstatueZ, 0x108AB210 +.global UsetuparchZ +.set UsetuparchZ, 0x108AB210 +.global end_UsetuparchZ +.set end_UsetuparchZ, 0x108AF820 +.global UsetuparkZ +.set UsetuparkZ, 0x108AF820 +.global end_UsetuparkZ +.set end_UsetuparkZ, 0x108B33B0 +.global UsetupaztZ +.set UsetupaztZ, 0x108B33B0 +.global end_UsetupaztZ +.set end_UsetupaztZ, 0x108B5CB0 +.global UsetupcaveZ +.set UsetupcaveZ, 0x108B5CB0 +.global end_UsetupcaveZ +.set end_UsetupcaveZ, 0x108B9B10 +.global UsetupcontrolZ +.set UsetupcontrolZ, 0x108B9B10 +.global end_UsetupcontrolZ +.set end_UsetupcontrolZ, 0x108BD610 +.global UsetupcradZ +.set UsetupcradZ, 0x108BD610 +.global end_UsetupcradZ +.set end_UsetupcradZ, 0x108BF240 +.global UsetupcrypZ +.set UsetupcrypZ, 0x108BF240 +.global end_UsetupcrypZ +.set end_UsetupcrypZ, 0x108C10D0 +.global UsetupdamZ +.set UsetupdamZ, 0x108C10D0 +.global end_UsetupdamZ +.set end_UsetupdamZ, 0x108C53A0 +.global UsetupdepoZ +.set UsetupdepoZ, 0x108C53A0 +.global end_UsetupdepoZ +.set end_UsetupdepoZ, 0x108C8330 +.global UsetupdestZ +.set UsetupdestZ, 0x108C8330 +.global end_UsetupdestZ +.set end_UsetupdestZ, 0x108CA680 +.global UsetupjunZ +.set UsetupjunZ, 0x108CA680 +.global end_UsetupjunZ +.set end_UsetupjunZ, 0x108CDD80 +.global UsetuplenZ +.set UsetuplenZ, 0x108CDD80 +.global end_UsetuplenZ +.set end_UsetuplenZ, 0x108CE350 +.global UsetuppeteZ +.set UsetuppeteZ, 0x108CE350 +.global end_UsetuppeteZ +.set end_UsetuppeteZ, 0x108D12D0 +.global UsetuprunZ +.set UsetuprunZ, 0x108D12D0 +.global end_UsetuprunZ +.set end_UsetuprunZ, 0x108D2B30 +.global UsetupsevbZ +.set UsetupsevbZ, 0x108D2B30 +.global end_UsetupsevbZ +.set end_UsetupsevbZ, 0x108D5190 +.global UsetupsevbunkerZ +.set UsetupsevbunkerZ, 0x108D5190 +.global end_UsetupsevbunkerZ +.set end_UsetupsevbunkerZ, 0x108D6BC0 +.global UsetupsevxZ +.set UsetupsevxZ, 0x108D6BC0 +.global end_UsetupsevxZ +.set end_UsetupsevxZ, 0x108DAED0 +.global UsetupsevxbZ +.set UsetupsevxbZ, 0x108DAED0 +.global end_UsetupsevxbZ +.set end_UsetupsevxbZ, 0x108DEFC0 +.global UsetupsiloZ +.set UsetupsiloZ, 0x108DEFC0 +.global end_UsetupsiloZ +.set end_UsetupsiloZ, 0x108E1A10 +.global UsetupstatueZ +.set UsetupstatueZ, 0x108E1A10 +.global end_UsetupstatueZ +.set end_UsetupstatueZ, 0x108E41E0 +.global UsetuptraZ +.set UsetuptraZ, 0x108E41E0 +.global end_UsetuptraZ +.set end_UsetuptraZ, 0x108E7410 +.global LameE +.set LameE, 0x108E7410 +.global end_LameE +.set end_LameE, 0x108E7420 +.global LameJ +.set LameJ, 0x108E7420 +.global end_LameJ +.set end_LameJ, 0x108E7430 +.global LarchE +.set LarchE, 0x108E7430 +.global end_LarchE +.set end_LarchE, 0x108E7A60 +.global LarchJ +.set LarchJ, 0x108E7A60 +.global end_LarchJ +.set end_LarchJ, 0x108E80C0 +.global LarecE +.set LarecE, 0x108E80C0 +.global end_LarecE +.set end_LarecE, 0x108E8690 +.global LarecJ +.set LarecJ, 0x108E8690 +.global end_LarecJ +.set end_LarecJ, 0x108E8C20 +.global LarkE +.set LarkE, 0x108E8C20 +.global end_LarkE +.set end_LarkE, 0x108E92C0 +.global LarkJ +.set LarkJ, 0x108E92C0 +.global end_LarkJ +.set end_LarkJ, 0x108E9970 +.global LashE +.set LashE, 0x108E9970 +.global end_LashE +.set end_LashE, 0x108E9980 +.global LashJ +.set LashJ, 0x108E9980 +.global end_LashJ +.set end_LashJ, 0x108E9990 +.global LaztE +.set LaztE, 0x108E9990 +.global end_LaztE +.set end_LaztE, 0x108E9DD0 +.global LaztJ +.set LaztJ, 0x108E9DD0 +.global end_LaztJ +.set end_LaztJ, 0x108EA280 +.global LcatE +.set LcatE, 0x108EA280 +.global end_LcatE +.set end_LcatE, 0x108EA290 +.global LcatJ +.set LcatJ, 0x108EA290 +.global end_LcatJ +.set end_LcatJ, 0x108EA2A0 +.global LcaveE +.set LcaveE, 0x108EA2A0 +.global end_LcaveE +.set end_LcaveE, 0x108EA6A0 +.global LcaveJ +.set LcaveJ, 0x108EA6A0 +.global end_LcaveJ +.set end_LcaveJ, 0x108EAB00 +.global LcradE +.set LcradE, 0x108EAB00 +.global end_LcradE +.set end_LcradE, 0x108EAFD0 +.global LcradJ +.set LcradJ, 0x108EAFD0 +.global end_LcradJ +.set end_LcradJ, 0x108EB480 +.global LcrypE +.set LcrypE, 0x108EB480 +.global end_LcrypE +.set end_LcrypE, 0x108EB6D0 +.global LcrypJ +.set LcrypJ, 0x108EB6D0 +.global end_LcrypJ +.set end_LcrypJ, 0x108EB990 +.global LdamE +.set LdamE, 0x108EB990 +.global end_LdamE +.set end_LdamE, 0x108EBDE0 +.global LdamJ +.set LdamJ, 0x108EBDE0 +.global end_LdamJ +.set end_LdamJ, 0x108EC250 +.global LdepoE +.set LdepoE, 0x108EC250 +.global end_LdepoE +.set end_LdepoE, 0x108EC5C0 +.global LdepoJ +.set LdepoJ, 0x108EC5C0 +.global end_LdepoJ +.set end_LdepoJ, 0x108EC900 +.global LdestE +.set LdestE, 0x108EC900 +.global end_LdestE +.set end_LdestE, 0x108ECD90 +.global LdestJ +.set LdestJ, 0x108ECD90 +.global end_LdestJ +.set end_LdestJ, 0x108ED1F0 +.global LdishE +.set LdishE, 0x108ED1F0 +.global end_LdishE +.set end_LdishE, 0x108ED200 +.global LdishJ +.set LdishJ, 0x108ED200 +.global end_LdishJ +.set end_LdishJ, 0x108ED210 +.global LearE +.set LearE, 0x108ED210 +.global end_LearE +.set end_LearE, 0x108ED220 +.global LearJ +.set LearJ, 0x108ED220 +.global end_LearJ +.set end_LearJ, 0x108ED230 +.global LeldE +.set LeldE, 0x108ED230 +.global end_LeldE +.set end_LeldE, 0x108ED240 +.global LeldJ +.set LeldJ, 0x108ED240 +.global end_LeldJ +.set end_LeldJ, 0x108ED250 +.global LgunE +.set LgunE, 0x108ED250 +.global end_LgunE +.set end_LgunE, 0x108ED970 +.global LgunJ +.set LgunJ, 0x108ED970 +.global end_LgunJ +.set end_LgunJ, 0x108EE0C0 +.global LimpE +.set LimpE, 0x108EE0C0 +.global end_LimpE +.set end_LimpE, 0x108EE0D0 +.global LimpJ +.set LimpJ, 0x108EE0D0 +.global end_LimpJ +.set end_LimpJ, 0x108EE0E0 +.global LjunE +.set LjunE, 0x108EE0E0 +.global end_LjunE +.set end_LjunE, 0x108EE600 +.global LjunJ +.set LjunJ, 0x108EE600 +.global end_LjunJ +.set end_LjunJ, 0x108EEB40 +.global LleeE +.set LleeE, 0x108EEB40 +.global end_LleeE +.set end_LleeE, 0x108EEB50 +.global LleeJ +.set LleeJ, 0x108EEB50 +.global end_LleeJ +.set end_LleeJ, 0x108EEB60 +.global LlenE +.set LlenE, 0x108EEB60 +.global end_LlenE +.set end_LlenE, 0x108EF1A0 +.global LlenJ +.set LlenJ, 0x108EF1A0 +.global end_LlenJ +.set end_LlenJ, 0x108EF450 +.global LlipE +.set LlipE, 0x108EF450 +.global end_LlipE +.set end_LlipE, 0x108EF460 +.global LlipJ +.set LlipJ, 0x108EF460 +.global end_LlipJ +.set end_LlipJ, 0x108EF470 +.global LlueE +.set LlueE, 0x108EF470 +.global end_LlueE +.set end_LlueE, 0x108EF480 +.global LlueJ +.set LlueJ, 0x108EF480 +.global end_LlueJ +.set end_LlueJ, 0x108EF490 +.global LmiscE +.set LmiscE, 0x108EF490 +.global end_LmiscE +.set end_LmiscE, 0x108EF730 +.global LmiscJ +.set LmiscJ, 0x108EF730 +.global end_LmiscJ +.set end_LmiscJ, 0x108EFA10 +.global LmpmenuE +.set LmpmenuE, 0x108EFA10 +.global end_LmpmenuE +.set end_LmpmenuE, 0x108EFBB0 +.global LmpmenuJ +.set LmpmenuJ, 0x108EFBB0 +.global end_LmpmenuJ +.set end_LmpmenuJ, 0x108EFD40 +.global LmpweaponsE +.set LmpweaponsE, 0x108EFD40 +.global end_LmpweaponsE +.set end_LmpweaponsE, 0x108EFE00 +.global LmpweaponsJ +.set LmpweaponsJ, 0x108EFE00 +.global end_LmpweaponsJ +.set end_LmpweaponsJ, 0x108EFEE0 +.global LoatE +.set LoatE, 0x108EFEE0 +.global end_LoatE +.set end_LoatE, 0x108EFEF0 +.global LoatJ +.set LoatJ, 0x108EFEF0 +.global end_LoatJ +.set end_LoatJ, 0x108EFF00 +.global LoptionsE +.set LoptionsE, 0x108EFF00 +.global end_LoptionsE +.set end_LoptionsE, 0x108F0130 +.global LoptionsJ +.set LoptionsJ, 0x108F0130 +.global end_LoptionsJ +.set end_LoptionsJ, 0x108F0380 +.global LpamE +.set LpamE, 0x108F0380 +.global end_LpamE +.set end_LpamE, 0x108F0390 +.global LpamJ +.set LpamJ, 0x108F0390 +.global end_LpamJ +.set end_LpamJ, 0x108F03A0 +.global LpeteE +.set LpeteE, 0x108F03A0 +.global end_LpeteE +.set end_LpeteE, 0x108F0820 +.global LpeteJ +.set LpeteJ, 0x108F0820 +.global end_LpeteJ +.set end_LpeteJ, 0x108F0C90 +.global LpropobjE +.set LpropobjE, 0x108F0C90 +.global end_LpropobjE +.set end_LpropobjE, 0x108F0F30 +.global LpropobjJ +.set LpropobjJ, 0x108F0F30 +.global end_LpropobjJ +.set end_LpropobjJ, 0x108F11F0 +.global LrefE +.set LrefE, 0x108F11F0 +.global end_LrefE +.set end_LrefE, 0x108F1200 +.global LrefJ +.set LrefJ, 0x108F1200 +.global end_LrefJ +.set end_LrefJ, 0x108F1210 +.global LritE +.set LritE, 0x108F1210 +.global end_LritE +.set end_LritE, 0x108F1220 +.global LritJ +.set LritJ, 0x108F1220 +.global end_LritJ +.set end_LritJ, 0x108F1230 +.global LrunE +.set LrunE, 0x108F1230 +.global end_LrunE +.set end_LrunE, 0x108F14A0 +.global LrunJ +.set LrunJ, 0x108F14A0 +.global end_LrunJ +.set end_LrunJ, 0x108F1730 +.global LsevE +.set LsevE, 0x108F1730 +.global end_LsevE +.set end_LsevE, 0x108F1C90 +.global LsevJ +.set LsevJ, 0x108F1C90 +.global end_LsevJ +.set end_LsevJ, 0x108F21A0 +.global LsevbE +.set LsevbE, 0x108F21A0 +.global end_LsevbE +.set end_LsevbE, 0x108F28F0 +.global LsevbJ +.set LsevbJ, 0x108F28F0 +.global end_LsevbJ +.set end_LsevbJ, 0x108F30E0 +.global LsevxE +.set LsevxE, 0x108F30E0 +.global end_LsevxE +.set end_LsevxE, 0x108F3540 +.global LsevxJ +.set LsevxJ, 0x108F3540 +.global end_LsevxJ +.set end_LsevxJ, 0x108F3900 +.global LsevxbE +.set LsevxbE, 0x108F3900 +.global end_LsevxbE +.set end_LsevxbE, 0x108F3D90 +.global LsevxbJ +.set LsevxbJ, 0x108F3D90 +.global end_LsevxbJ +.set end_LsevxbJ, 0x108F41E0 +.global LshoE +.set LshoE, 0x108F41E0 +.global end_LshoE +.set end_LshoE, 0x108F41F0 +.global LshoJ +.set LshoJ, 0x108F41F0 +.global end_LshoJ +.set end_LshoJ, 0x108F4200 +.global LsiloE +.set LsiloE, 0x108F4200 +.global end_LsiloE +.set end_LsiloE, 0x108F47B0 +.global LsiloJ +.set LsiloJ, 0x108F47B0 +.global end_LsiloJ +.set end_LsiloJ, 0x108F4D90 +.global LstatE +.set LstatE, 0x108F4D90 +.global end_LstatE +.set end_LstatE, 0x108F56B0 +.global LstatJ +.set LstatJ, 0x108F56B0 +.global end_LstatJ +.set end_LstatJ, 0x108F5F20 +.global LtitleE +.set LtitleE, 0x108F5F20 +.global end_LtitleE +.set end_LtitleE, 0x108F69E0 +.global LtitleJ +.set LtitleJ, 0x108F69E0 +.global end_LtitleJ +.set end_LtitleJ, 0x108F7570 +.global LtraE +.set LtraE, 0x108F7570 +.global end_LtraE +.set end_LtraE, 0x108F79A0 +.global LtraJ +.set LtraJ, 0x108F79A0 +.global end_LtraJ +.set end_LtraJ, 0x108F7DC0 +.global LwaxE +.set LwaxE, 0x108F7DC0 +.global end_LwaxE +.set end_LwaxE, 0x108F7DD0 +.global LwaxJ +.set LwaxJ, 0x108F7DD0 +.global end_LwaxJ +.set end_LwaxJ, 0x108F7DE0 +.global ob__ob_end_seg +.set ob__ob_end_seg, 0x108F7DE0 +.global end_ob__ob_end_seg +.set end_ob__ob_end_seg, 0x108F7DF0 + +/* --- assets/ramrom (demo replays) ---------------------------- */ +.global ramrom_Dam_1 +.set ramrom_Dam_1, 0x102BF2D0 +.global ramrom_Dam_1_end +.set ramrom_Dam_1_end, 0x102C44D0 +.global ramrom_Dam_2 +.set ramrom_Dam_2, 0x102C44D0 +.global ramrom_Dam_2_end +.set ramrom_Dam_2_end, 0x102C64A0 +.global ramrom_Facility_1 +.set ramrom_Facility_1, 0x102C64A0 +.global ramrom_Facility_1_end +.set ramrom_Facility_1_end, 0x102C7F50 +.global ramrom_Facility_2 +.set ramrom_Facility_2, 0x102C7F50 +.global ramrom_Facility_2_end +.set ramrom_Facility_2_end, 0x102CA330 +.global ramrom_Facility_3 +.set ramrom_Facility_3, 0x102CA330 +.global ramrom_Facility_3_end +.set ramrom_Facility_3_end, 0x102CBFA0 +.global ramrom_Runway_1 +.set ramrom_Runway_1, 0x102CBFA0 +.global ramrom_Runway_1_end +.set ramrom_Runway_1_end, 0x102CE6F0 +.global ramrom_Runway_2 +.set ramrom_Runway_2, 0x102CE6F0 +.global ramrom_Runway_2_end +.set ramrom_Runway_2_end, 0x102D1000 +.global ramrom_BunkerI_1 +.set ramrom_BunkerI_1, 0x102D1000 +.global ramrom_BunkerI_1_end +.set ramrom_BunkerI_1_end, 0x102D4390 +.global ramrom_BunkerI_2 +.set ramrom_BunkerI_2, 0x102D4390 +.global ramrom_BunkerI_2_end +.set ramrom_BunkerI_2_end, 0x102D9610 +.global ramrom_Silo_1 +.set ramrom_Silo_1, 0x102D9610 +.global ramrom_Silo_1_end +.set ramrom_Silo_1_end, 0x102DB7A0 +.global ramrom_Silo_2 +.set ramrom_Silo_2, 0x102DB7A0 +.global ramrom_Silo_2_end +.set ramrom_Silo_2_end, 0x102DD770 +.global ramrom_Frigate_1 +.set ramrom_Frigate_1, 0x102DD770 +.global ramrom_Frigate_1_end +.set ramrom_Frigate_1_end, 0x102DF120 +.global ramrom_Frigate_2 +.set ramrom_Frigate_2, 0x102DF120 +.global ramrom_Frigate_2_end +.set ramrom_Frigate_2_end, 0x102E2600 +.global ramrom_Train +.set ramrom_Train, 0x102E2600 +.global ramrom_Train_end +.set ramrom_Train_end, 0x102E63F0 +.global _ramromDam1SegmentRomStart +.set _ramromDam1SegmentRomStart, 0x102BF2D0 + +/* --- assets/music ------------------------------------------------ */ +.global _musicsampletblSegmentRomStart +.set _musicsampletblSegmentRomStart, 0x10419790 +.global number_music_samples +.set number_music_samples, 0x10419790 +.global number_music_samples_end +.set number_music_samples_end, 0x10419794 +.global table_music_data +.set table_music_data, 0x10419794 +.global _musicsampletblSegmentRomEnd +.set _musicsampletblSegmentRomEnd, 0x1041998C +.global table_music_data_end +.set table_music_data_end, 0x1041998C +.global _sfxctlSegmentRomStart +.set _sfxctlSegmentRomStart, 0x102EBDE0 +.global _sfxctlSegmentRomEnd +.set _sfxctlSegmentRomEnd, 0x102F19A0 +.global _sfxtblSegmentRomStart +.set _sfxtblSegmentRomStart, 0x102F19A0 +.global _sfxtblSegmentRomEnd +.set _sfxtblSegmentRomEnd, 0x103B4450 +.global _instrumentsctlSegmentRomStart +.set _instrumentsctlSegmentRomStart, 0x103B4450 +.global _instrumentsctlSegmentRomEnd +.set _instrumentsctlSegmentRomEnd, 0x103B87F0 +.global _instrumentstblSegmentRomStart +.set _instrumentstblSegmentRomStart, 0x103B87F0 +.global _instrumentstblSegmentRomEnd +.set _instrumentstblSegmentRomEnd, 0x10419790 +.global Mno_music +.set Mno_music, 0x1041998C +.global end_Mno_music +.set end_Mno_music, 0x104199B6 +.global Msolo_death_abrev +.set Msolo_death_abrev, 0x104199B6 +.global end_Msolo_death_abrev +.set end_Msolo_death_abrev, 0x10419B8C +.global Mintro_eye +.set Mintro_eye, 0x10419B8C +.global end_Mintro_eye +.set end_Mintro_eye, 0x1041A43A +.global Mtrain +.set Mtrain, 0x1041A43A +.global end_Mtrain +.set end_Mtrain, 0x1041B024 +.global Mdepot +.set Mdepot, 0x1041B024 +.global end_Mdepot +.set end_Mdepot, 0x1041BDC4 +.global Mjungle_unused +.set Mjungle_unused, 0x1041BDC4 +.global end_Mjungle_unused +.set end_Mjungle_unused, 0x1041CB5C +.global Mcitadel +.set Mcitadel, 0x1041CB5C +.global end_Mcitadel +.set end_Mcitadel, 0x1041D91C +.global Mfacility +.set Mfacility, 0x1041D91C +.global end_Mfacility +.set end_Mfacility, 0x1041E3EA +.global Mcontrol +.set Mcontrol, 0x1041E3EA +.global end_Mcontrol +.set end_Mcontrol, 0x1041EF48 +.global Mdam +.set Mdam, 0x1041EF48 +.global end_Mdam +.set end_Mdam, 0x1041FD4C +.global Mfrigate +.set Mfrigate, 0x1041FD4C +.global end_Mfrigate +.set end_Mfrigate, 0x10420B2C +.global Marchives +.set Marchives, 0x10420B2C +.global end_Marchives +.set end_Marchives, 0x10421480 +.global Msilo +.set Msilo, 0x10421480 +.global end_Msilo +.set end_Msilo, 0x104222F0 +.global Mjungle_perimeter_unused +.set Mjungle_perimeter_unused, 0x104222F0 +.global end_Mjungle_perimeter_unused +.set end_Mjungle_perimeter_unused, 0x1042325C +.global Mstreets +.set Mstreets, 0x1042325C +.global end_Mstreets +.set end_Mstreets, 0x10423F5E +.global Mbunker1 +.set Mbunker1, 0x10423F5E +.global end_Mbunker1 +.set end_Mbunker1, 0x104245D0 +.global Mbunker2 +.set Mbunker2, 0x104245D0 +.global end_Mbunker2 +.set end_Mbunker2, 0x10424C50 +.global Mstatue +.set Mstatue, 0x10424C50 +.global end_Mstatue +.set end_Mstatue, 0x104255E8 +.global Melevator_control +.set Melevator_control, 0x104255E8 +.global end_Melevator_control +.set end_Melevator_control, 0x10425FC2 +.global Mcradle +.set Mcradle, 0x10425FC2 +.global end_Mcradle +.set end_Mcradle, 0x10426D22 +.global Mnull1 +.set Mnull1, 0x10426D22 +.global end_Mnull1 +.set end_Mnull1, 0x10426D4C +.global Melevator_wc +.set Melevator_wc, 0x10426D4C +.global end_Melevator_wc +.set end_Melevator_wc, 0x10427392 +.global Megyptian +.set Megyptian, 0x10427392 +.global end_Megyptian +.set end_Megyptian, 0x1042812C +.global Mfolders +.set Mfolders, 0x1042812C +.global end_Mfolders +.set end_Mfolders, 0x1042850E +.global Mwatchmusic +.set Mwatchmusic, 0x1042850E +.global end_Mwatchmusic +.set end_Mwatchmusic, 0x10428700 +.global Maztec +.set Maztec, 0x10428700 +.global end_Maztec +.set end_Maztec, 0x10429372 +.global Mwatercaverns +.set Mwatercaverns, 0x10429372 +.global end_Mwatercaverns +.set end_Mwatercaverns, 0x1042A19E +.global Mdeathsolo +.set Mdeathsolo, 0x1042A19E +.global end_Mdeathsolo +.set end_Mdeathsolo, 0x1042A504 +.global Msurface2 +.set Msurface2, 0x1042A504 +.global end_Msurface2 +.set end_Msurface2, 0x1042B2BA +.global Mtrainx +.set Mtrainx, 0x1042B2BA +.global end_Mtrainx +.set end_Mtrainx, 0x1042BB5A +.global Mnull2 +.set Mnull2, 0x1042BB5A +.global end_Mnull2 +.set end_Mnull2, 0x1042BB84 +.global Mfacilityx +.set Mfacilityx, 0x1042BB84 +.global end_Mfacilityx +.set end_Mfacilityx, 0x1042C4DC +.global Mdepotx +.set Mdepotx, 0x1042C4DC +.global end_Mdepotx +.set end_Mdepotx, 0x1042CC98 +.global Mcontrolx +.set Mcontrolx, 0x1042CC98 +.global end_Mcontrolx +.set end_Mcontrolx, 0x1042D1E0 +.global Mwatercavernsx +.set Mwatercavernsx, 0x1042D1E0 +.global end_Mwatercavernsx +.set end_Mwatercavernsx, 0x1042D934 +.global Mdamx +.set Mdamx, 0x1042D934 +.global end_Mdamx +.set end_Mdamx, 0x1042DE54 +.global Mfrigatex +.set Mfrigatex, 0x1042DE54 +.global end_Mfrigatex +.set end_Mfrigatex, 0x1042E416 +.global Marchivesx +.set Marchivesx, 0x1042E416 +.global end_Marchivesx +.set end_Marchivesx, 0x1042EB3A +.global Msilox +.set Msilox, 0x1042EB3A +.global end_Msilox +.set end_Msilox, 0x1042F42E +.global Mnull3 +.set Mnull3, 0x1042F42E +.global end_Mnull3 +.set end_Mnull3, 0x1042F458 +.global Mstreetsx +.set Mstreetsx, 0x1042F458 +.global end_Mstreetsx +.set end_Mstreetsx, 0x1042FAC4 +.global Mbunker1x +.set Mbunker1x, 0x1042FAC4 +.global end_Mbunker1x +.set end_Mbunker1x, 0x1043026A +.global Mbunker2x +.set Mbunker2x, 0x1043026A +.global end_Mbunker2x +.set end_Mbunker2x, 0x104308B8 +.global Mjunglex +.set Mjunglex, 0x104308B8 +.global end_Mjunglex +.set end_Mjunglex, 0x104310CE +.global Mnint_rare_logo +.set Mnint_rare_logo, 0x104310CE +.global end_Mnint_rare_logo +.set end_Mnint_rare_logo, 0x10431500 +.global Mstatuex +.set Mstatuex, 0x10431500 +.global end_Mstatuex +.set end_Mstatuex, 0x10431BB8 +.global Maztecx +.set Maztecx, 0x10431BB8 +.global end_Maztecx +.set end_Maztecx, 0x1043248E +.global Megyptianx +.set Megyptianx, 0x1043248E +.global end_Megyptianx +.set end_Megyptianx, 0x10432D3E +.global Mcradlex +.set Mcradlex, 0x10432D3E +.global end_Mcradlex +.set end_Mcradlex, 0x10433408 +.global Mcuba +.set Mcuba, 0x10433408 +.global end_Mcuba +.set end_Mcuba, 0x10433C52 +.global Mrunway +.set Mrunway, 0x10433C52 +.global end_Mrunway +.set end_Mrunway, 0x10434970 +.global Mrunway_plane +.set Mrunway_plane, 0x10434970 +.global end_Mrunway_plane +.set end_Mrunway_plane, 0x10434C4A +.global Msurface2x +.set Msurface2x, 0x10434C4A +.global end_Msurface2x +.set end_Msurface2x, 0x10435372 +.global Mwindblowing +.set Mwindblowing, 0x10435372 +.global end_Mwindblowing +.set end_Mwindblowing, 0x10435894 +.global Mmultideath_alt +.set Mmultideath_alt, 0x10435894 +.global end_Mmultideath_alt +.set end_Mmultideath_alt, 0x10435AA0 +.global Mjungle +.set Mjungle, 0x10435AA0 +.global end_Mjungle +.set end_Mjungle, 0x10436228 +.global Mrunwayx +.set Mrunwayx, 0x10436228 +.global end_Mrunwayx +.set end_Mrunwayx, 0x1043684A +.global Msurface1 +.set Msurface1, 0x1043684A +.global end_Msurface1 +.set end_Msurface1, 0x104375B2 +.global Mmultiplayerdeath +.set Mmultiplayerdeath, 0x104375B2 +.global end_Mmultiplayerdeath +.set end_Mmultiplayerdeath, 0x1043787A +.global Msurface1x +.set Msurface1x, 0x1043787A +.global end_Msurface1x +.set end_Msurface1x, 0x10437FA2 +.global Msurface2_ending +.set Msurface2_ending, 0x10437FA2 +.global end_Msurface2_ending +.set end_Msurface2_ending, 0x1043823E +.global Mstatue_ending +.set Mstatue_ending, 0x1043823E +.global end_Mstatue_ending +.set end_Mstatue_ending, 0x104383A4 +.global Mfrigate_outro +.set Mfrigate_outro, 0x104383A4 +.global end_Mfrigate_outro +.set end_Mfrigate_outro, 0x10438660 + +/* --- assets/romfiles2.s -------------------------------------- */ +.global unknown2 +.set unknown2, 0x102A4D50 +.global unknown2_end +.set unknown2_end, 0x102BF2D0 + +/* --- ge007.ld segment markers ------------------------------------ */ +/* RomStart/RomEnd are exact for asset segments; Start/End mirror them +/* (game code only ever uses End-Start size differences for these). +/* Code segments are approximate (see generator header comment). */ +.global _headerSegmentRomStart +.set _headerSegmentRomStart, 0x10000000 +.global _headerSegmentRomEnd +.set _headerSegmentRomEnd, 0x10000040 +.global _headerSegmentStart +.set _headerSegmentStart, 0x10000000 +.global _headerSegmentEnd +.set _headerSegmentEnd, 0x10000040 /* approximate */ +.global _bootSegmentRomStart +.set _bootSegmentRomStart, 0x10000040 +.global _bootSegmentRomEnd +.set _bootSegmentRomEnd, 0x10001000 +.global _bootSegmentStart +.set _bootSegmentStart, 0x10000040 +.global _bootSegmentEnd +.set _bootSegmentEnd, 0x10001000 /* approximate */ +.global _startSegmentRomStart +.set _startSegmentRomStart, 0x10001000 +.global _startSegmentRomEnd +.set _startSegmentRomEnd, 0x10001050 +.global _startSegmentStart +.set _startSegmentStart, 0x10001000 +.global _startSegmentEnd +.set _startSegmentEnd, 0x10001050 /* approximate */ +.global _codeSegmentRomStart +.set _codeSegmentRomStart, 0x10001050 +.global _codeSegmentRomEnd +.set _codeSegmentRomEnd, 0x10021990 +.global _codeSegmentStart +.set _codeSegmentStart, 0x10001050 +.global _codeSegmentEnd +.set _codeSegmentEnd, 0x10021990 /* approximate */ +.global _cdataSegmentRomStart +.set _cdataSegmentRomStart, 0x10021990 +.global _cdataSegmentRomEnd +.set _cdataSegmentRomEnd, 0x10032172 +.global _cdataSegmentStart +.set _cdataSegmentStart, 0x10021990 +.global _cdataSegmentEnd +.set _cdataSegmentEnd, 0x10032172 /* approximate */ +.global _inflateSegmentRomStart +.set _inflateSegmentRomStart, 0x10032172 +.global _inflateSegmentRomEnd +.set _inflateSegmentRomEnd, 0x10034B2F +.global _inflateSegmentStart +.set _inflateSegmentStart, 0x10032172 +.global _inflateSegmentEnd +.set _inflateSegmentEnd, 0x10034B2F /* approximate */ +.global _gameSegmentRomStart +.set _gameSegmentRomStart, 0x10034B2F +.global _gameSegmentRomEnd +.set _gameSegmentRomEnd, 0x10117880 +.global _gameSegmentStart +.set _gameSegmentStart, 0x10034B2F +.global _gameSegmentEnd +.set _gameSegmentEnd, 0x10117880 /* approximate */ +.global _fontdlSegmentRomStart +.set _fontdlSegmentRomStart, 0x10117880 +.global _fontdlSegmentRomEnd +.set _fontdlSegmentRomEnd, 0x10117940 +.global _fontdlSegmentStart +.set _fontdlSegmentStart, 0x10117880 +.global _fontdlSegmentEnd +.set _fontdlSegmentEnd, 0x10117940 +.global _jfontchardataSegmentRomStart +.set _jfontchardataSegmentRomStart, 0x10117940 +.global _jfontchardataSegmentRomEnd +.set _jfontchardataSegmentRomEnd, 0x10123040 +.global _jfontchardataSegmentStart +.set _jfontchardataSegmentStart, 0x10117940 +.global _jfontchardataSegmentEnd +.set _jfontchardataSegmentEnd, 0x10123040 +.global _efontchardataSegmentRomStart +.set _efontchardataSegmentRomStart, 0x10123040 +.global _efontchardataSegmentRomEnd +.set _efontchardataSegmentRomEnd, 0x10124AC0 +.global _efontchardataSegmentStart +.set _efontchardataSegmentStart, 0x10123040 +.global _efontchardataSegmentEnd +.set _efontchardataSegmentEnd, 0x10124AC0 +.global _animation_entriesSegmentRomStart +.set _animation_entriesSegmentRomStart, 0x10124AC0 +.global _animation_entriesSegmentRomEnd +.set _animation_entriesSegmentRomEnd, 0x1028E980 +.global _animation_entriesSegmentStart +.set _animation_entriesSegmentStart, 0x10124AC0 +.global _animation_entriesSegmentEnd +.set _animation_entriesSegmentEnd, 0x1028E980 +.global _animation_dataSegmentRomStart +.set _animation_dataSegmentRomStart, 0x1028E980 +.global _animation_dataSegmentRomEnd +.set _animation_dataSegmentRomEnd, 0x1029D160 +.global _animation_dataSegmentStart +.set _animation_dataSegmentStart, 0x1028E980 +.global _animation_dataSegmentEnd +.set _animation_dataSegmentEnd, 0x1029D160 +.global _GlobalimagetableSegmentRomStart +.set _GlobalimagetableSegmentRomStart, 0x1029D160 +.global _GlobalimagetableSegmentRomEnd +.set _GlobalimagetableSegmentRomEnd, 0x1029DC28 +.global _GlobalimagetableSegmentStart +.set _GlobalimagetableSegmentStart, 0x1029D160 +.global _GlobalimagetableSegmentEnd +.set _GlobalimagetableSegmentEnd, 0x1029DC28 +.global _rarewarelogoSegmentRomStart +.set _rarewarelogoSegmentRomStart, 0x1029E560 +.global _rarewarelogoSegmentRomEnd +.set _rarewarelogoSegmentRomEnd, 0x102A4D50 +.global _rarewarelogoSegmentStart +.set _rarewarelogoSegmentStart, 0x1029E560 +.global _rarewarelogoSegmentEnd +.set _rarewarelogoSegmentEnd, 0x102A4D50 +.global _romfiles2SegmentRomStart +.set _romfiles2SegmentRomStart, 0x102A4D50 +.global _romfiles2SegmentRomEnd +.set _romfiles2SegmentRomEnd, 0x102BF2D0 +.global _romfiles2SegmentStart +.set _romfiles2SegmentStart, 0x102A4D50 +.global _romfiles2SegmentEnd +.set _romfiles2SegmentEnd, 0x102BF2D0 +.global _ramromfilesSegmentRomStart +.set _ramromfilesSegmentRomStart, 0x102BF2D0 +.global _ramromfilesSegmentRomEnd +.set _ramromfilesSegmentRomEnd, 0x102E63F0 +.global _ramromfilesSegmentStart +.set _ramromfilesSegmentStart, 0x102BF2D0 +.global _ramromfilesSegmentEnd +.set _ramromfilesSegmentEnd, 0x102E63F0 +.global _fontbankgothicSegmentRomStart +.set _fontbankgothicSegmentRomStart, 0x102E63F0 +.global _fontbankgothicSegmentRomEnd +.set _fontbankgothicSegmentRomEnd, 0x102E88A0 +.global _fontbankgothicSegmentStart +.set _fontbankgothicSegmentStart, 0x102E63F0 +.global _fontbankgothicSegmentEnd +.set _fontbankgothicSegmentEnd, 0x102E88A0 +.global _fontzurichboldSegmentRomStart +.set _fontzurichboldSegmentRomStart, 0x102E88A0 +.global _fontzurichboldSegmentRomEnd +.set _fontzurichboldSegmentRomEnd, 0x102EBDE0 +.global _fontzurichboldSegmentStart +.set _fontzurichboldSegmentStart, 0x102E88A0 +.global _fontzurichboldSegmentEnd +.set _fontzurichboldSegmentEnd, 0x102EBDE0 +.global _musicfilesSegmentRomStart +.set _musicfilesSegmentRomStart, 0x102EBDE0 +.global _musicfilesSegmentRomEnd +.set _musicfilesSegmentRomEnd, 0x10438660 +.global _musicfilesSegmentStart +.set _musicfilesSegmentStart, 0x102EBDE0 +.global _musicfilesSegmentEnd +.set _musicfilesSegmentEnd, 0x10438660 +.global _obsegSegmentRomStart +.set _obsegSegmentRomStart, 0x10438660 +.global _obsegSegmentRomEnd +.set _obsegSegmentRomEnd, 0x108F7DF0 +.global _obsegSegmentStart +.set _obsegSegmentStart, 0x10438660 +.global _obsegSegmentEnd +.set _obsegSegmentEnd, 0x108F7DF0 +.global _imagesSegmentRomStart +.set _imagesSegmentRomStart, 0x108F7DF0 +.global _imagesSegmentRomEnd +.set _imagesSegmentRomEnd, 0x10C00000 +.global _imagesSegmentStart +.set _imagesSegmentStart, 0x108F7DF0 +.global _imagesSegmentEnd +.set _imagesSegmentEnd, 0x10C00000 +.global _alt_startSegmentRomStart +.set _alt_startSegmentRomStart, 0x10101000 +.global _alt_startSegmentStart +.set _alt_startSegmentStart, 0x10101000 diff --git a/port/src/romdata.c b/port/src/romdata.c index 89aef52f..eb169a06 100644 --- a/port/src/romdata.c +++ b/port/src/romdata.c @@ -1,89 +1,197 @@ /* - * ROM loading: reads the .z64 ROM from the data dir and exposes its segments. + * ROM loading: reads the .z64 and maps it at the N64 cart address 0x10000000. * - * The N64 build links assets in from the ROM at fixed addresses. The PC port - * loads the ROM file into a heap image and maps the game's data segments into - * it, then patches the segment table so asset references resolve. + * Why the fixed address: every ROM asset symbol in the PC build is an ABSOLUTE + * cart address (port/src/romassets_.s, generated by + * scripts/gen_romassets.py from ge007.ld + scripts/filelist..csv). Game + * code takes `&symbol` and DMAs via romCopy()/osPiStartDma() exactly as on + * hardware. If the ROM image is mapped at 0x10000000, those addresses are + * live host pointers: PI reads become plain memcpys (see libultra.c) and + * direct-read assets (fonts, image display lists) work unmodified. * - * Modelled on the PD port's port/src/romdata.c (~605 lines). + * The N64 ROM header is GE-specific (src/rom_header.s): magic 0x80371240 at + * 0x00, ROM name "GOLDENEYE" at 0x20, cartridge ID "GE" at 0x3C, country byte + * at 0x3E ('E' US / 'P' EU / 'J' JP). * - * STATUS: scaffolding stub — implement during Phase 1. - * - * NOTE: GE's ROM layout (segments, asset offsets) differs from PD's. The - * segment table and asset map must be derived from this decomp's - * ge007.ld / imagelist.u.csv / assets/ layout. See docs/PCPortResearch.md. + * STATUS: Phase 1 — load + validate + map. No segment patching needed: the + * generated symbols already carry the layout. */ #include #include #include "platform.h" + +#if defined(PLATFORM_WINDOWS) + #ifndef WIN32_LEAN_AND_MEAN + #define WIN32_LEAN_AND_MEAN + #endif + #include +#endif + #include "system.h" #include "fs.h" #include "romdata.h" -static u8 *rom = NULL; -static u32 romSize = 0; +#define CART_BASE 0x10000000u -/* Expected ROM file names per region (place one in the data/ dir). */ -static const char *romFileName(void) +static u8 *rom = NULL; /* heap copy (fallback path) */ +static u32 romSize = 0; +static int mappedAtCartBase = 0; + +/* Candidate ROM file names, in priority order. The decomp repo ships the + * base ROM at the repo root (baserom..z64); a user-supplied final ROM in + * data/ takes precedence. */ +static const char *romFileCandidates(void) { #if GE007_IS_PAL - return "ge007.pal-final.z64"; + return "ge007.pal-final.z64|baserom.e.z64"; #else - return "ge007.ntsc-final.z64"; + return "ge007.ntsc-final.z64|baserom.u.z64"; #endif } +static int romHeaderValid(const u8 *h, char *err, size_t errsz) +{ + static const u8 magic[4] = { 0x80, 0x37, 0x12, 0x40 }; +#if GE007_IS_PAL + const char country = 'P'; +#else + const char country = 'E'; +#endif + + if (memcmp(h, magic, 4) != 0) { + snprintf(err, errsz, "bad N64 magic at 0x00 (got %02x%02x%02x%02x)", + h[0], h[1], h[2], h[3]); + return 0; + } + if (memcmp(h + 0x20, "GOLDENEYE", 9) != 0) { + snprintf(err, errsz, "ROM name at 0x20 is not GOLDENEYE"); + return 0; + } + if (h[0x3C] != 'G' || h[0x3D] != 'E') { + snprintf(err, errsz, "cartridge ID at 0x3C is not GE"); + return 0; + } + if (h[0x3E] != country) { + snprintf(err, errsz, "country byte at 0x3E is %c, expected %c", + h[0x3E], country); + return 0; + } + return 1; +} + int romdataInit(void) { - static char pathBuf[1024 + 64]; - snprintf(pathBuf, sizeof(pathBuf), "$S/%s", romFileName()); - const char *path = sysResolvePath(pathBuf); + char err[128] = ""; + const char *list = romFileCandidates(); + char listBuf[512]; + strcpy(listBuf, list); - /* TODO(Phase 1): - * - open + read the whole ROM into `rom` - * - validate the N64 magic ("Nintendo" @ 0x100) + region - * - build the segment map (code/data/assets) from the decomp's layout - * - patch the game's segment table so IMAGESEG / asset refs resolve - */ - sysLogPrintf(LOG_INFO, "romdataInit: loading %s (TODO Phase 1)", path); + /* Try each candidate in the data dir, next to the exe, and in the CWD + * (the decomp repo ships baserom..z64 at the repo root). */ + for (char *tok = strtok(listBuf, "|"); tok; + tok = strtok(NULL, "|")) { + static const char *locs[3] = { "$S/", "$E/", "./" }; + int li; + FSFile *f = NULL; - FSFile *f = fsOpen(path, "rb"); - if (!f) { - sysLogPrintf(LOG_ERROR, "romdataInit: cannot open %s", path); - return -1; - } - romSize = (u32)fsSize(f); - rom = (u8 *)malloc(romSize); - if (!rom || fsRead(f, rom, romSize) != (int32_t)romSize) { - sysLogPrintf(LOG_ERROR, "romdataInit: failed to read ROM"); + for (li = 0; li < 3 && !f; li++) { + char pathbuf[1024]; + snprintf(pathbuf, sizeof(pathbuf), "%s%s", locs[li], tok); + f = fsOpen(sysResolvePath(pathbuf), "rb"); + } + if (!f) + continue; + + romSize = (u32)fsSize(f); + u8 *img = (u8 *)malloc(romSize ? romSize : 1); + int ok = img && fsRead(f, img, romSize) == (int32_t)romSize; fsClose(f); - return -1; - } - fsClose(f); + if (!ok) { + free(img); + continue; + } - if (romSize < 0x104 || memcmp(rom + 0x100, "Nintendo", 8) != 0) { - sysLogPrintf(LOG_ERROR, "romdataInit: bad N64 ROM magic"); - return -1; + if (romSize < 0x40 || !romHeaderValid(img, err, sizeof(err))) { + sysLogPrintf(LOG_WARNING, "romdataInit: %s rejected: %s", + tok, err); + free(img); + continue; + } + + /* Map at the cart address so absolute asset symbols are live. */ +#if defined(PLATFORM_WINDOWS) + void *at = VirtualAlloc((LPVOID)CART_BASE, romSize, + MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); + if (at == (void *)(uintptr_t)CART_BASE) { + memcpy(at, img, romSize); + free(img); + mappedAtCartBase = 1; + sysLogPrintf(LOG_INFO, "romdataInit: %s (%u bytes) mapped at " + "0x%08X (cart base)", tok, romSize, CART_BASE); + return 0; + } + if (at) + VirtualFree(at, 0, MEM_RELEASE); + sysLogPrintf(LOG_WARNING, "romdataInit: could not reserve 0x%08X; " + "using heap copy — direct ROM reads will fail", + CART_BASE); +#else + /* Best effort: fixed-hint mmap. If the hint is refused we fall back + * to a heap copy (same limitation as above). */ + sysLogPrintf(LOG_WARNING, "romdataInit: fixed-address mapping not " + "implemented on this platform; using heap copy"); +#endif + + rom = img; + return 0; } - return 0; + sysLogPrintf(LOG_ERROR, "romdataInit: no ROM found (tried %s in data/ " + "and exe dir)", list); + return -1; } void romdataDestroy(void) { +#if defined(PLATFORM_WINDOWS) + if (mappedAtCartBase) { + VirtualFree((LPVOID)CART_BASE, 0, MEM_RELEASE); + mappedAtCartBase = 0; + } +#endif free(rom); rom = NULL; romSize = 0; } -const u8 *romdataGetRom(void) { return rom; } +const u8 *romdataGetRom(void) +{ + if (mappedAtCartBase) + return (const u8 *)(uintptr_t)CART_BASE; + return rom; +} u32 romdataGetRomSize(void) { return romSize; } +/* + * Is this cart address inside the mapped ROM? Used by the PI shims to bounds- + * check DMA before touching host memory. + */ +int romdataCartAddrValid(u32 addr, u32 size) +{ + if (!mappedAtCartBase || !romSize) + return 0; + if (addr < CART_BASE) + return 0; + u32 off = addr - CART_BASE; + return off + size <= romSize; +} + const void *romdataMapVa(u32 va) { - /* TODO(Phase 1): map an N64 RDRAM VA (0xA0000000+) into the image. */ + /* N64 RDRAM VAs (0x80000000+/0xA0000000+) have no PC meaning; only cart + * addresses are mapped. Kept for API parity with the PD port. */ (void)va; return NULL; } diff --git a/port/src/system.c b/port/src/system.c index 32b44f89..0534104c 100644 --- a/port/src/system.c +++ b/port/src/system.c @@ -12,6 +12,17 @@ #include #include "platform.h" + +#if defined(PLATFORM_WINDOWS) + #ifndef WIN32_LEAN_AND_MEAN + #define WIN32_LEAN_AND_MEAN + #endif + #include + #include +#else + #include +#endif + #include "system.h" /* --- Time --------------------------------------------------------------- */ @@ -64,10 +75,55 @@ const char *sysGetExeDir(void) return exeDir; } +/* + * Expand the "$S/" (data dir) and "$E/" (exe dir) prefixes used throughout + * the port. Anything else is returned unchanged (relative to the CWD). + * + * $E: directory containing the executable. + * $S: "data/" next to the CWD if it exists there, else "data/" next to the + * executable (so running build-pc/ge007.*.exe from anywhere finds + * ./data/ when run from the repo root). + */ const char *sysResolvePath(const char *path) { static char out[1024]; - /* TODO(Phase 1): expand "$S/" (data dir) and "$E/" (exe dir) prefixes. */ +#if defined(PLATFORM_WINDOWS) + static char exedir[1024] = ""; + if (!exedir[0]) { + DWORD n = GetModuleFileNameA(NULL, exedir, sizeof(exedir) - 1); + if (n) { + char *slash = strrchr(exedir, '\\'); + if (slash) + *slash = 0; + } else { + exedir[0] = 0; + } + } +#endif + + if (!strncmp(path, "$E/", 3)) { +#if defined(PLATFORM_WINDOWS) + snprintf(out, sizeof(out), "%s\\%s", exedir, path + 3); +#else + snprintf(out, sizeof(out), "./%s", path + 3); +#endif + return out; + } + if (!strncmp(path, "$S/", 3)) { +#if defined(PLATFORM_WINDOWS) + if (_access("data", 0) == 0) + snprintf(out, sizeof(out), "data\\%s", path + 3); + else + snprintf(out, sizeof(out), "%s\\data\\%s", exedir, path + 3); +#else + if (access("data", F_OK) == 0) + snprintf(out, sizeof(out), "data/%s", path + 3); + else + snprintf(out, sizeof(out), "./data/%s", path + 3); +#endif + return out; + } + strncpy(out, path, sizeof(out) - 1); out[sizeof(out) - 1] = 0; return out; diff --git a/port/src/video.c b/port/src/video.c index 5490a266..b7db91ce 100644 --- a/port/src/video.c +++ b/port/src/video.c @@ -4,13 +4,14 @@ * Owns the GL context that the software RSP (fast3d) renders into. Drives the * frame boundary hooks called by the port scheduler (gesched.c). * - * Modelled on the PD port's port/src/video.c (~590 lines). - * - * STATUS: scaffolding stub — implement during Phase 1 (window + clear) and - * Phase 2 (frame pacing, options). + * Phase 1: real window + GL context + clear colour, driven by the demo loop + * in main.c. gfx_* entry points are still the no-ops in gfxstub.c until the + * PD-derived fast3d lands (Phase 2); videoStartFrame/EndFrame do the GL work + * directly so a visible frame exists before that. */ #include +#include #include "platform.h" #include "system.h" @@ -30,53 +31,163 @@ static int vidFpsLimit = 0; static int vidFullscreen = 0; static int vidMaximize = 0; +static SDL_Window *vidWindow = NULL; +static SDL_GLContext vidGL = NULL; + +/* FPS accounting. */ +static uint64_t fpsLastTick = 0; +static int fpsFrames = 0; +static float fpsValue = 0.0f; + int videoInit(void) { - /* TODO(Phase 1): - * - SDL_Init(VIDEO) - * - create window (title "GoldenEye 007", default 640x480 or config) - * - create GL 3.0+ context - * - build the GfxInitSettings (window-manager API = SDL2, rendering API - * = OpenGL) and call gfx_init() - * - apply config: vsync, fps limit, fullscreen, maximize - */ - sysLogPrintf(LOG_INFO, "videoInit: TODO (Phase 1)"); + if (initDone) + return 0; + + if (SDL_Init(SDL_INIT_VIDEO) != 0) { + sysLogPrintf(LOG_ERROR, "videoInit: SDL_Init failed: %s", + SDL_GetError()); + return -1; + } + + SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); + SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); + /* fast3d will want a modern context once it lands; 3.0 core is the floor + * the PD port targets. */ + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0); + + int w = 640, h = 480; /* GE's internal resolution (NTSC) */ + Uint32 flags = SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE; + if (vidFullscreen) + flags |= SDL_WINDOW_FULLSCREEN_DESKTOP; + + vidWindow = SDL_CreateWindow("GoldenEye 007 (PC port)", + SDL_WINDOWPOS_CENTERED, + SDL_WINDOWPOS_CENTERED, w, h, flags); + if (!vidWindow) { + sysLogPrintf(LOG_ERROR, "videoInit: SDL_CreateWindow failed: %s", + SDL_GetError()); + return -1; + } + if (vidMaximize) + SDL_MaximizeWindow(vidWindow); + + vidGL = SDL_GL_CreateContext(vidWindow); + if (!vidGL) { + sysLogPrintf(LOG_ERROR, "videoInit: SDL_GL_CreateContext failed: %s", + SDL_GetError()); + return -1; + } + SDL_GL_MakeCurrent(vidWindow, vidGL); + SDL_GL_SetSwapInterval(vidVsync ? 1 : 0); + + /* Phase 1 clear colour: dark blue-grey so the window is visibly alive. */ + glClearColor(0.10f, 0.12f, 0.16f, 1.0f); + glViewport(0, 0, w, h); + + /* fast3d hooks (no-ops until Phase 2). */ + gfx_init(NULL); + + fpsLastTick = sysGetMicroseconds(); initDone = 1; + sysLogPrintf(LOG_INFO, "videoInit: %dx%d window + GL context up", w, h); return 0; } void videoDestroy(void) { - if (initDone) { - gfx_destroy(); - initDone = 0; + if (!initDone) + return; + gfx_destroy(); + if (vidGL) { + SDL_GL_DeleteContext(vidGL); + vidGL = NULL; } + if (vidWindow) { + SDL_DestroyWindow(vidWindow); + vidWindow = NULL; + } + SDL_Quit(); + initDone = 0; +} + +/* + * Pump window events. Returns 1 when the app should quit (window close or + * ESC). Called by the demo loop until the port scheduler owns the frame + * boundary (Phase 2). + */ +int videoHandleEvents(void) +{ + SDL_Event e; + while (SDL_PollEvent(&e)) { + if (e.type == SDL_QUIT) + return 1; + if (e.type == SDL_KEYDOWN && e.key.keysym.sym == SDLK_ESCAPE) + return 1; + } + return 0; } void videoStartFrame(void) { - if (initDone) gfx_start_frame(); + if (!initDone) + return; + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + gfx_start_frame(); } void videoSubmitCommands(Gfx *cmds) { - if (initDone) gfx_run(cmds); + if (initDone) + gfx_run(cmds); } void videoEndFrame(void) { - if (!initDone) return; + if (!initDone) + return; gfx_end_frame(); - /* TODO(Phase 2): FPS accounting + framerate limiting. */ + if (vidWindow) + SDL_GL_SwapWindow(vidWindow); + + /* FPS accounting. */ + fpsFrames++; + uint64_t now = sysGetMicroseconds(); + if (now - fpsLastTick >= 1000000) { + fpsValue = (float)fpsFrames * 1000000.0f / (float)(now - fpsLastTick); + fpsFrames = 0; + fpsLastTick = now; + } } -void videoSetVsync(int enabled) { vidVsync = enabled; /* TODO: SDL_GL_SetSwapInterval */ } -void videoSetFramerateLimit(int fps) { vidFpsLimit = fps; /* TODO */ } +void videoSetVsync(int enabled) +{ + vidVsync = enabled; + if (initDone && vidWindow) + SDL_GL_SetSwapInterval(vidVsync ? 1 : 0); +} +void videoSetFramerateLimit(int fps) { vidFpsLimit = fps; /* TODO Phase 2 */ } int videoGetFullscreen(void) { return vidFullscreen; } -void videoSetFullscreen(int enabled) { vidFullscreen = enabled; /* TODO */ } +void videoSetFullscreen(int enabled) +{ + vidFullscreen = enabled; + if (initDone && vidWindow) + SDL_SetWindowFullscreen(vidWindow, + enabled ? SDL_WINDOW_FULLSCREEN_DESKTOP : 0); +} int videoGetMaximize(void) { return vidMaximize; } -void videoSetMaximize(int enabled) { vidMaximize = enabled; /* TODO */ } -float videoGetFPS(void) { return 0.0f; /* TODO */ } +void videoSetMaximize(int enabled) +{ + vidMaximize = enabled; + if (initDone && vidWindow) { + if (enabled) + SDL_MaximizeWindow(vidWindow); + else + SDL_RestoreWindow(vidWindow); + } +} +float videoGetFPS(void) { return fpsValue; } PD_CONSTRUCTOR static void videoConfigInit(void) { diff --git a/scripts/gen_romassets.py b/scripts/gen_romassets.py new file mode 100644 index 00000000..51438e20 --- /dev/null +++ b/scripts/gen_romassets.py @@ -0,0 +1,559 @@ +#!/usr/bin/env python3 +""" +gen_romassets.py — generate absolute ROM asset symbols for the PC port. + +For a given region this emits a GAS file (port/src/romassets_.s) defining +every ROM asset symbol as an ABSOLUTE cart address (0x10000000 + rom_offset), +matching the N64 linker layout (ge007.ld). The PC port maps the loaded .z64 +into host memory at exactly 0x10000000 (see port/src/romdata.c), so: + + * `&symbol` in game code yields the cart address, and romCopy()/ + osPiStartDma(OS_READ, ...) shims memcpy from that address (Phase 1). + * file_resource_table.inc.c entries stay in ROM order, so ob.c's + `table[i+1].hw_address - table[i].hw_address` size math is correct. + +Sources of truth (all in-repo, N64 build untouched): + scripts/filelist..csv rom offset + size per asset file + assets/obseg/file_resource_table.inc.c ordered obseg symbol list + assets/ramrom/ramrom.s region-aware (.ifdef/.else/.endif) + assets/music/{music,sfx.ctl,sfx.tbl,instruments.ctl,instruments.tbl}.s + ge007.ld segment markers (BEGIN_SEG/END_SEG) + +Code segments (header/boot/start/code/cdata/inflate/game) have no CSV entry; +their offsets are best-effort values derived from the disassembly comments in +ge007.ld and are marked as such. They are only consumed by the N64 boot path, +which the PC port does not run. + +Usage: + python3 scripts/gen_romassets.py u # -> port/src/romassets_u.s + python3 scripts/gen_romassets.py e # (EU manifest quirks: see docs) +""" + +import os +import re +import sys + +CART_BASE = 0x10000000 +ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + + +def die(msg): + print(f"gen_romassets: ERROR: {msg}", file=sys.stderr) + sys.exit(1) + + +# -------------------------------------------------------------------------- +# CSV manifest +# -------------------------------------------------------------------------- + +class Csv: + def __init__(self, region): + path = os.path.join(ROOT, "scripts", f"filelist.{region}.csv") + self.by_name = {} # basename -> (offset, size, fullpath) + self.by_path = {} # fullpath -> (offset, size) + with open(path, encoding="utf-8", errors="replace") as f: + for line in f: + parts = line.strip().split(",") + if len(parts) < 3: + continue + try: + off, size = int(parts[0]), int(parts[1]) + except ValueError: + continue + full = parts[2] + name = full.rsplit("/", 1)[-1] + self.by_name[name] = (off, size, full) + self.by_path[full] = (off, size) + # Scanner-prefixed names: ge007... + m = re.match(r"^ge007\.[uje]\.[0-9a-fA-F]+\.(.+)$", name) + if m: + self.by_name.setdefault(m.group(1), (off, size, full)) + + def lookup(self, candidates): + """Try candidate basenames in order; return (offset, size, matched).""" + for cand in candidates: + if cand in self.by_name: + off, size, full = self.by_name[cand] + return off, size, cand + # also allow an exact full-path hit (dir-qualified lookups) + if cand.startswith("assets/") and cand in self.by_path: + off, size = self.by_path[cand] + return off, size, cand + return None + + @staticmethod + def name_candidates(basename): + """Manifest names are inconsistent across regions: with/without .bin, + trailing Z added/dropped. Try the plain name first, then variants.""" + cands = [basename] + stem = re.sub(r"\.(bin|seg)$", "", basename) + if stem != basename: + cands.append(stem) + else: + cands.append(basename + ".bin") # CSV names carry .bin + for s in (stem, stem[:-1] if stem.endswith("Z") else stem + "Z"): + cands.append(s) # trailing Z added/dropped + cands.append(s + ".bin") + cands.append(s + ".seg") # ob__ob_end.seg style + return cands + + +# -------------------------------------------------------------------------- +# Region-aware .s parsing (ob_seg.s / ramrom.s) +# -------------------------------------------------------------------------- + +class RegionParser: + """Parses asset .s files, honouring .ifdef VERSION_XX / .else / .endif. + + Yields, in file order, either: + ("file", symbol, incbin_path) — a .global label + .incbin pair + ("label", symbol) — a bare label (segment marker etc.) + for the requested target region. + """ + + COND_RE = re.compile(r"^\s*\.ifdef\s+(VERSION_\w+)") + GLOBAL_RE = re.compile(r"^\s*\.global\s+(\w+)") + LABEL_RE = re.compile(r"^(\w+):") + INCBIN_RE = re.compile(r'^\s*\.incbin\s+"([^"]+)"') + + def __init__(self, target_region): # "u" | "e" | "j" + self.target = {"u": "VERSION_US", "e": "VERSION_EU", + "j": "VERSION_JP"}[target_region] + self.stack = [] # entries: (cond, in_else) + + def _active(self): + for cond, in_else in self.stack: + if (cond == self.target) != (not in_else): + return False + return True + + def parse(self, path): + """State: a `.global X` arms `pending`; the following `X:` label moves + it to `expecting` (its own label line); an `.incbin` then makes it a + file entry, otherwise the next `.global` flushes it as a bare marker.""" + out = [] + pending = None # symbol from .global, label line not yet seen + expecting = None # label seen; waiting for .incbin (file) or next + # .global (bare marker) + with open(path, encoding="utf-8", errors="replace") as f: + for raw in f: + line = raw.rstrip("\n") + m = re.match(r"^\s*\.ifdef\s+(\w+)", line) + if m: + self.stack.append((m.group(1), False)) + continue + if re.match(r"^\s*\.else\b", line): + if self.stack: + cond, _ = self.stack[-1] + self.stack[-1] = (cond, True) + continue + if re.match(r"^\s*\.endif\b", line): + if self.stack: + self.stack.pop() + continue + if not self._active(): + continue + m = self.GLOBAL_RE.match(line) + if m: + if expecting is not None: + out.append(("label", expecting)) + expecting = None + pending = m.group(1) + continue + m = self.INCBIN_RE.match(line) + if m and expecting is not None: + out.append(("file", expecting, m.group(1))) + expecting = None + continue + m = self.LABEL_RE.match(line) + if m: + sym = m.group(1) + if sym == pending: + expecting = sym + pending = None + else: + out.append(("label", sym)) + if expecting is not None: + out.append(("label", expecting)) + return out + + +# -------------------------------------------------------------------------- +# Per-source extraction +# -------------------------------------------------------------------------- + +def parse_resource_table(region): + """assets/obseg/file_resource_table.inc.c -> ordered [(symbol, pathstr)]. + + The table is C: entries for other regions are wrapped in + `#ifdef VERSION_XX` (e.g. all L*P text rows under VERSION_EU). Honour + those conditionals for the target region.""" + path = os.path.join(ROOT, "assets", "obseg", "file_resource_table.inc.c") + cond_region = {"VERSION_US": "u", "VERSION_EU": "e", "VERSION_JP": "j"} + entries = [] + seen = set() + stack = [] # condition names (only VERSION_* occur in this file) + rx = re.compile(r'\{\s*(\w+)\s*,\s*"([^"]*)"\s*,\s*&(\w+)\s*\}') + with open(path, encoding="utf-8") as f: + for line in f: + m = re.match(r"^\s*#ifdef\s+(\w+)", line) + if m: + stack.append(m.group(1)) + continue + if re.match(r"^\s*#endif\b", line): + if stack: + stack.pop() + continue + active = all(cond_region.get(c, "?") == region for c in stack) + if not active: + continue + m = rx.search(line) + if not m: + continue + sym = m.group(3) + if sym in seen: + continue + seen.add(sym) + entries.append((sym, m.group(2))) + return entries + + +def resolve_obseg(entries, csv): + """Map each resource-table symbol to (offset, size).""" + resolved = [] # (symbol, offset, size, matched_name) + missing = [] + for sym, pathstr in entries: + base = pathstr.rsplit("/", 1)[-1] + hit = csv.lookup(Csv.name_candidates(base)) + if hit is None: + # fall back to the symbol name itself (pathstr may be stale, + # e.g. BG_ELD -> bg_imp_all_p_seg; strip a trailing _seg) + cands = Csv.name_candidates(sym) + if sym.endswith("_seg"): + cands += Csv.name_candidates(sym[:-4]) + hit = csv.lookup(cands) + if hit is None: + missing.append((sym, pathstr)) + continue + off, size, matched = hit + resolved.append((sym, off, size, matched)) + return resolved, missing + + +def parse_ramrom_region(region, csv): + rp = RegionParser(region) + path = os.path.join(ROOT, "assets", "ramrom", "ramrom.s") + items = rp.parse(path) + files = [] # (symbol, offset, size) + markers = {} # bare label -> index of next file symbol (resolved later) + pending_marker = None + for kind, a, *rest in items: + if kind == "file": + sym, incbin = a, rest[0] + base = incbin.rsplit("/", 1)[-1] + hit = csv.lookup(Csv.name_candidates(base)) + if hit is None: + die(f"ramrom: no CSV entry for {sym} ({incbin})") + off, size, _ = hit + files.append((sym, off, size)) + pending_marker = None + else: # bare label + if a.endswith("_end"): + continue # handled via start+size below + markers[a] = len(files) # value = offset of next file + return files, markers + + +def parse_music_tracks(region, csv): + """music.s: music_file lines (region blocks inside the macro).""" + path = os.path.join(ROOT, "assets", "music", "music.s") + tracks = [] + with open(path, encoding="utf-8") as f: + for line in f: + m = re.match(r"^\s*music_file\s+(\w+)", line) + if m: + tracks.append(m.group(1)) + resolved = [] + for name in tracks: + hit = csv.lookup(Csv.name_candidates(f"{name}.bin")) + if hit is None: + die(f"music: no CSV entry for track {name}") + off, size, _ = hit + resolved.append((name, off, size)) + return resolved + + +def parse_music_sections(csv): + """sfx.ctl.s / sfx.tbl.s / instruments.ctl.s / instruments.tbl.s: + each defines _SegmentRomStart + incbin + _SegmentRomEnd.""" + out = [] + for stem in ("sfx.ctl", "sfx.tbl", "instruments.ctl", "instruments.tbl"): + path = os.path.join(ROOT, "assets", "music", f"{stem}.s") + start_sym = end_sym = incbin = None + with open(path, encoding="utf-8") as f: + for line in f: + m = re.match(r"^\s*\.global\s+(\w+)", line) + if m: + sym = m.group(1) + if sym.endswith("SegmentRomStart"): + start_sym = sym + elif sym.endswith("SegmentRomEnd"): + end_sym = sym + continue + m = re.match(r'^\s*\.incbin\s+"([^"]+)"', line) + if m: + incbin = m.group(1) + if not (start_sym and end_sym and incbin): + die(f"music section {stem}: expected start/end/incbin, got " + f"{start_sym}/{end_sym}/{incbin}") + base = incbin.rsplit("/", 1)[-1] + hit = csv.lookup(Csv.name_candidates(base)) + if hit is None: + die(f"music section {stem}: no CSV entry for {incbin}") + off, size, _ = hit + out.append((start_sym, end_sym, off, size)) + return out + + +# -------------------------------------------------------------------------- +# Linker-script segments (ge007.ld) +# -------------------------------------------------------------------------- + +def build_segments(region, csv, obseg_resolved, ramrom_files, music_tracks, + music_sections, rom_size): + """Assign (offset, size) to every BEGIN_SEG segment in ge007.ld. + + Asset-backed segments come from the CSV (exact). Code segments use + best-effort values from the disassembly comments in ge007.ld. + """ + seg = {} # name -> (offset, size, exact?) + + def csv1(basename): + hit = csv.lookup(Csv.name_candidates(basename)) + if hit is None: + die(f"segment lookup failed for {basename}") + return hit[0], hit[1] + + # --- code segments (approximate; N64 boot path only) ----------------- + seg["header"] = (0x0, 0x40, False) + seg["boot"] = (0x40, 0x1000 - 0x40, False) # start @0x1000 assumed + seg["start"] = (0x1000, 0x50, False) # RAM size 0x50 (ld cmt) + seg["code"] = (0x1050, 0x21990 - 0x1050, False) # ld comment 001050-021990 + # inflate size 0x29BD (ld comment [29BD]); game ends at fontdl start. + fontdl_off, _ = csv1("jfont_dl.bin") + game_end = fontdl_off # ld: fontdl @ game end + game_size = 0xE2D51 # ld comment [E2D51] + seg["game"] = (game_end - game_size, game_size, False) + inflate_size = 0x29BD + seg["inflate"] = (seg["game"][0] - inflate_size, inflate_size, False) + seg["cdata"] = (seg["code"][0] + seg["code"][1], + seg["inflate"][0] - (seg["code"][0] + seg["code"][1]), + False) + + # --- asset segments (exact, from CSV) -------------------------------- + off, size = csv1("jfont_dl.bin") + seg["fontdl"] = (off, size, True) + off, size = csv1("jfont_chardata.bin") + seg["jfontchardata"] = (off, size, True) + off, size = csv1("efont_chardata.bin") + seg["efontchardata"] = (off, size, True) + off, size = csv1("animationtable_entries.bin") + seg["animation_entries"] = (off, size, True) + off, size = csv1("animationtable_data.bin") + seg["animation_data"] = (off, size, True) + off, size = csv1("Globalimagetable.bin") + seg["Globalimagetable"] = (off, size, True) + off, size = csv1("rarewarelogo.bin") + seg["rarewarelogo"] = (off, size, True) + off, size = csv1("usedby7F008DE4.bin") # assets/romfiles2.s blob + seg["romfiles2"] = (off, size, True) + + if ramrom_files: + first = min(o for _, o, _ in ramrom_files) + last_end = max(o + s for _, o, s in ramrom_files) + seg["ramromfiles"] = (first, last_end - first, True) + + # font objects = kerning + chartable, contiguous in ROM (verified). + k_off, k_size = csv1("fontBankGothic_kerning.bin") + c_off, c_size = csv1("fontBankGothic_fontchartable.bin") + if k_off + k_size != c_off: + die("fontBankGothic kerning/chartable not contiguous in CSV") + seg["fontbankgothic"] = (k_off, k_size + c_size, True) + k_off, k_size = csv1("fontZurichBold_kerning.bin") + c_off, c_size = csv1("fontZurichBold_fontchartable.bin") + if k_off + k_size != c_off: + die("fontZurichBold kerning/chartable not contiguous in CSV") + seg["fontzurichbold"] = (k_off, k_size + c_size, True) + + # musicfiles = sfx.ctl .. last M* track end. + m_off = min(o for _, _, o, _ in music_sections) + m_end = max(o + s for _, o, s in music_tracks) + seg["musicfiles"] = (m_off, m_end - m_off, True) + + # obseg = first resource-table symbol .. end of ob__ob_end_seg. + if obseg_resolved: + first = min(o for _, o, _, _ in obseg_resolved) + last_end = max(o + s for _, o, s, _ in obseg_resolved) + seg["obseg"] = (first, last_end - first, True) + + # images = everything after obseg to the end of the ROM. + if "obseg" in seg: + img_off = seg["obseg"][0] + seg["obseg"][1] + seg["images"] = (img_off, rom_size - img_off, True) + + return seg + + +# -------------------------------------------------------------------------- +# Emission +# -------------------------------------------------------------------------- + +def emit(region, csv, rom_size): + lines = [] + ap = lines.append + ap("/*") + ap(f" * AUTO-GENERATED by scripts/gen_romassets.py ({region.upper()}) -- do not edit.") + ap(" *") + ap(" * Absolute ROM asset symbols for the PC port. Each symbol is the N64") + ap(" * cart address (0x10000000 + rom_offset) of the corresponding asset in") + ap(f" * scripts/filelist.{region}.csv, so `&symbol` / romCopy() work exactly as") + ap(" * on hardware once romdata.c has mapped the .z64 at 0x10000000.") + ap(" * Regenerate: python3 scripts/gen_romassets.py " + region) + ap(" */") + ap(".section .data") + ap("") + + def sym(name, value): + ap(f".global {name}") + ap(f".set {name}, 0x{value:X}") + + # --- obseg (file_resource_table order = ROM order) ------------------- + entries = parse_resource_table(region) + resolved, missing = resolve_obseg(entries, csv) + if missing: + for s, p in missing: + print(f"gen_romassets: MISSING {s} ({p})", file=sys.stderr) + die(f"{len(missing)} obseg symbols unresolved") + + # Invariants the game relies on (ob.c size math = table[i+1]-table[i]). + # Offsets must be non-decreasing; zero-size placeholder files may share + # an offset (bg_ash/bg_imp/bg_sho all sit at one address in the US ROM). + for i in range(1, len(resolved)): + prev_sym, prev_off, prev_size, _ = resolved[i - 1] + sym2, off2, _, _ = resolved[i] + if off2 < prev_off: + die(f"resource table not in ROM order: {prev_sym} ({prev_off:#x}) " + f"> {sym2} ({off2:#x})") + if prev_off + prev_size > off2: + print(f"gen_romassets: WARNING overlap {prev_sym}+{prev_size} " + f"> {sym2}", file=sys.stderr) + + ap("/* --- assets/obseg (file_resource_table.inc.c order) ------------- */") + for symname, off, size, matched in resolved: + sym(symname, CART_BASE + off) + sym(f"end_{symname}", CART_BASE + off + size) + ap("") + + # --- ramrom ----------------------------------------------------------- + ramrom_files, ramrom_markers = parse_ramrom_region(region, csv) + if ramrom_files: + ap("/* --- assets/ramrom (demo replays) ---------------------------- */") + for i, (symname, off, size) in enumerate(ramrom_files): + sym(symname, CART_BASE + off) + sym(f"{symname}_end", CART_BASE + off + size) + for marker, idx in ramrom_markers.items(): + if idx < len(ramrom_files): + sym(marker, CART_BASE + ramrom_files[idx][1]) + ap("") + + # --- music ------------------------------------------------------------ + tracks = parse_music_tracks(region, csv) + sections = parse_music_sections(csv) + hit = csv.lookup(Csv.name_candidates("number_music_samples")) + if hit is None: + die("music: no CSV entry for number_music_samples") + sample_tbl_off = hit[0] + first_track_off = min(o for _, o, _ in tracks) + + ap("/* --- assets/music ------------------------------------------------ */") + sym("_musicsampletblSegmentRomStart", CART_BASE + sample_tbl_off) + sym("number_music_samples", CART_BASE + sample_tbl_off) + sym("number_music_samples_end", CART_BASE + sample_tbl_off + 4) + sym("table_music_data", CART_BASE + sample_tbl_off + 4) + sym("_musicsampletblSegmentRomEnd", CART_BASE + first_track_off) + sym("table_music_data_end", CART_BASE + first_track_off) + for start_sym, end_sym, off, size in sections: + sym(start_sym, CART_BASE + off) + sym(end_sym, CART_BASE + off + size) + for name, off, size in tracks: + sym(name, CART_BASE + off) + sym(f"end_{name}", CART_BASE + off + size) + ap("") + + # --- romfiles2 --------------------------------------------------------- + hit = csv.lookup(Csv.name_candidates("usedby7F008DE4.bin")) + if hit is not None: + unknown2_off, unknown2_size = hit[0], hit[1] + ap("/* --- assets/romfiles2.s -------------------------------------- */") + sym("unknown2", CART_BASE + unknown2_off) + sym("unknown2_end", CART_BASE + unknown2_off + unknown2_size) + ap("") + + # --- linker-script segment markers ------------------------------------- + segs = build_segments(region, csv, resolved, ramrom_files, tracks, + sections, rom_size) + ap("/* --- ge007.ld segment markers ------------------------------------ */") + ap("/* RomStart/RomEnd are exact for asset segments; Start/End mirror them") + ap("/* (game code only ever uses End-Start size differences for these).") + ap("/* Code segments are approximate (see generator header comment). */") + for name in ("header", "boot", "start", "code", "cdata", "inflate", + "game", "fontdl", "jfontchardata", "efontchardata", + "animation_entries", "animation_data", "Globalimagetable", + "rarewarelogo", "romfiles2", "ramromfiles", "fontbankgothic", + "fontzurichbold", "musicfiles", "obseg", "images"): + if name not in segs: + continue + off, size, exact = segs[name] + note = "" if exact else " /* approximate */" + sym(f"_{name}SegmentRomStart", CART_BASE + off) + sym(f"_{name}SegmentRomEnd", CART_BASE + off + size) + sym(f"_{name}SegmentStart", CART_BASE + off) + sym(f"_{name}SegmentEnd", CART_BASE + off + size) + if note: + lines[-1] += note + # alt-start (ld: _startSegmentRomStart + 0x100000) + s_off = segs["start"][0] + sym("_alt_startSegmentRomStart", CART_BASE + s_off + 0x100000) + sym("_alt_startSegmentStart", CART_BASE + s_off + 0x100000) + + out = os.path.join(ROOT, "port", "src", f"romassets_{region}.s") + with open(out, "w", encoding="utf-8", newline="\n") as f: + f.write("\n".join(lines) + "\n") + + n_syms = sum(1 for l in lines if l.startswith(".set ")) + print(f"gen_romassets: wrote {os.path.relpath(out, ROOT)} " + f"({n_syms} symbols, obseg={len(resolved)}, ramrom={len(ramrom_files)}, " + f"tracks={len(tracks)}, segments={len(segs)})") + + +def main(): + if len(sys.argv) != 2 or sys.argv[1] not in ("u", "e", "j"): + die("usage: gen_romassets.py ") + region = sys.argv[1] + csv = Csv(region) + + rom_size = None + rom_name = {"u": "baserom.u.z64", "e": "baserom.e.z64", + "j": "baserom.j.z64"}[region] + rom_path = os.path.join(ROOT, rom_name) + if os.path.exists(rom_path): + rom_size = os.path.getsize(rom_path) + else: + print(f"gen_romassets: note: {rom_name} not found; " + f"images segment sized from CSV max", file=sys.stderr) + rom_size = max(o + s for o, s in csv.by_path.values()) + emit(region, csv, rom_size) + + +if __name__ == "__main__": + main()