// Our names for the functions and globals of the debug build, one per line: name = address; // where the name comes from.
// See docs/reference-rig.md#the-symbol-map-roadmap-08 for the naming rules.
MakeHealerMenu = 0x800041c0; // string 0x800d74f8
InitGfx = 0x80008200; // string 0x800d7cb4
SetGfxMode = 0x8000852c; // string 0x800d7ce0
StartGfxList = 0x800087a4; // string 0x800d98a8
GetGfxLastFrame = 0x800096f4; // string 0x800d7d70
DisplaySystemMonitor = 0x8000a864; // string 0x800d7e24
Memory.CanLoad = 0x8000ce00; // coined; docs/systems/audio.md
AttachPhysicsProperties = 0x8000d188; // string 0x800d834c
GetCollisionZone = 0x8000d338; // string 0x800d837c
CheckToggleZoneScene = 0x8000dba4; // string 0x800d83c0
MakeGameZoneNames = 0x8000dc2c; // string 0x800d8424
FreeZoneEngineMemory = 0x8000e07c; // string 0x800d84dc
LoadGameBorgScenes = 0x8000e284; // string 0x800d85ac
FindReferencePointName = 0x8000ea18; // string 0x800d85e8
TeleportPlayer = 0x8000edac; // string 0x800d8638
ConfirmPlayerWithinZone = 0x8000f300; // string 0x800d8bb4
Zones.SetSceneColors = 0x8000f520; // 1.0 0x8000c298
RenderVoxelScenes = 0x8000f9a4; // string; 1.0 0x8000c67c
Zones.DrawChunkScene = 0x80010354; // 1.0 0x8000d02c
Zones.DrawChunkTransScene = 0x800103b0; // 1.0 0x8000d088
RenderZones = 0x8001089c; // string 0x800d8c80
Zones.DrawDeferredScenes = 0x80010fd0; // 1.0 0x8000dc98
RenderTransZones = 0x8001107c; // string; 1.0 0x8000dd44
InitZoneEngine = 0x800112bc; // string 0x800d88fc
SaveZoneEngine = 0x80011724; // string 0x800d895c
Bgm.Stop = 0x80011818; // coined; docs/systems/audio.md
Bgm.StopIfNoPak = 0x8001187c; // coined; docs/systems/audio.md
Bgm.Update = 0x800118c4; // coined; docs/systems/audio.md
FreeZoneEngine = 0x80011a1c; // string 0x800d8984
HandleZoneEngineFrame = 0x80011e54; // string 0x800d8b9c
FindWandererFromPlayerName = 0x80012408; // string 0x800d8d4c
AllocWanderer = 0x80012750; // string 0x800d8d7c
InitPlayerHandler = 0x800158b8; // string 0x800d8f04
FreePlayerHandler = 0x80015a4c; // string 0x800d8f88
Shadows.Draw = 0x80015af0; // 1.0 0x80012044
Shadows.Render = 0x80015e04; // 1.0 0x80012358
Player.FreeAudioSlot = 0x80016004; // coined; docs/systems/audio.md
AllocPlayerAudio = 0x800160bc; // string 0x800d9000
ProcessPlayers = 0x8001623c; // string 0x800d8bcc
RenderPlayers = 0x80017a54; // string 0x800d8c8c
AllocPlayer = 0x80018268; // string 0x800d92ac
FreePlayer = 0x800183bc; // string 0x800d92cc
FreePlayerActor = 0x80018660; // string 0x800d92e8
AttachItemToPlayer = 0x80018890; // string 0x800d930c
FreeAttachmentFromPlayer = 0x80018944; // string 0x800d9344
ChangeAttachmentNode = 0x800189b4; // string 0x800d9360
SetCombatCameraMode = 0x80018d60; // string 0x800d93b4
SetPlayerMoveToQueue = 0x8001969c; // string 0x800d94d4
GiveCameraToPlayer = 0x80019d10; // string 0x800d9500
ProcessVoxelCamera = 0x80019fc0; // string 0x800d954c
InitScriptCameras = 0x8001a6b4; // string 0x800d95a8
FreeScriptCameras = 0x8001a790; // string 0x800d95ec
AllocScriptCamera = 0x8001a838; // string 0x800d9618
ProcessScriptCameras = 0x8001a99c; // string 0x800d9644
AppProc = 0x8001ecd8; // string 0x800d990c
HandleAppFrame = 0x8001f23c; // string 0x800d98b8
Title.StartMusic = 0x8001f4f0; // coined; docs/systems/audio.md
LoadDay = 0x800206ac; // string 0x800d9ac4
GenerateSky = 0x8002126c; // string 0x800d9b40
RenderSky = 0x80021f00; // string 0x800d9c30
SetBackgroundType = 0x800225f8; // string 0x800d9cb0
ProcessWeather = 0x80022f70; // string 0x800d9d1c
Credits.Frame = 0x80023e50; // coined; matched by tools/builds.py from 1.0 0x8001f648
FlagNetwork.Get = 0x800245a0; // coined; matched by tools/builds.py from 1.0 0x8001fd5c
FlagNetwork.Set = 0x80024634; // coined; matched by tools/builds.py from 1.0 0x8001fda8
GetSnapShot = 0x80025744; // string 0x800d9fbc
InitGameTrek = 0x80025e30; // string 0x800da00c
GetMapTerrain = 0x8002c470; // string 0x800da630
GetMapData = 0x8002c730; // string 0x800da6b0
Zones.RequestBgm = 0x8002c9fc; // coined; docs/systems/audio.md
Zones.SetMapSet = 0x8002ca5c; // coined; docs/systems/audio.md: sets the music for the map set
TrekHud.Free = 0x8002d798; // coined; matched by tools/builds.py from 1.0 0x80026c78
TrekHud.Make = 0x8002d828; // coined; matched by tools/builds.py from 1.0 0x80026d08
Credits.Start = 0x80033650; // coined; docs/systems/audio.md
Credits.Destroy = 0x80033b44; // coined; matched from 1.0 0x8002c5a0
Credits.Step = 0x80033c7c; // coined; matched from 1.0 0x8002c6d8
Credits.StepWait = 0x80033d4c; // coined; matched from 1.0 0x8002c7a8
Credits.StepCards = 0x80033d5c; // coined; matched from 1.0 0x8002c7b8
Credits.StepScroll = 0x80034028; // coined; matched from 1.0 0x8002ca64
Credits.StepEnd = 0x80034114; // coined; matched from 1.0 0x8002cb50
Credits.Skip = 0x80034374; // coined; matched from 1.0 0x8002cd90
Credits.OnA = 0x80034398; // coined; matched from 1.0 0x8002cdb4
Credits.OnStart = 0x800343c0; // coined; matched from 1.0 0x8002cddc
BigAssMenu = 0x80035b38; // string 0x800db790
DollMenu::InitMenu = 0x800376d0; // string 0x800db920
SMI::AddItem = 0x8003d378; // string 0x800dc240
DollEquipmentMenu::GetEntityItemId = 0x80045ec8; // string 0x800dcfc0
OptionsMenu.ShowTheatre = 0x800476a4; // coined; matched by tools/builds.py from 1.0 0x8003fe34
pauseMenuSelectCallBack = 0x80047c1c; // string 0x800dd300
IntroMenu::ProcessIntroMenu = 0x8004b544; // string 0x800dd644
Theatre.Create = 0x8004bd10; // coined, in ./menus/theatermenu.cpp; matched by tools/builds.py from 1.0 0x800443b0
Theatre.Destroy = 0x8004bd4c; // coined, in ./menus/theatermenu.cpp; matched by tools/builds.py from 1.0 0x800443ec
Theatre.Build = 0x8004bda4; // coined, in ./menus/theatermenu.cpp; matched by tools/builds.py from 1.0 0x80044444
Theatre.Draw = 0x8004bfe0; // coined, in ./menus/theatermenu.cpp; matched by tools/builds.py from 1.0 0x80044680
Theatre.Step = 0x8004c030; // coined, in ./menus/theatermenu.cpp; matched by tools/builds.py from 1.0 0x800446d0
Theatre.AddRow = 0x8004c064; // coined, in ./menus/theatermenu.cpp; matched by tools/builds.py from 1.0 0x80044704
Theatre.AddRows = 0x8004c148; // coined, cites ./menus/theatermenu.cpp line 192; matched by tools/builds.py from 1.0 0x800447e8
Theatre.Class = 0x8004c2b8; // coined, in ./menus/theatermenu.cpp; matched by tools/builds.py from 1.0 0x8004495c
Theatre.OnLeft = 0x8004c2c0; // coined, in ./menus/theatermenu.cpp; matched by tools/builds.py from 1.0 0x80044970
Theatre.OnRight = 0x8004c2f0; // coined, in ./menus/theatermenu.cpp; matched by tools/builds.py from 1.0 0x800449a0
Theatre.OnUp = 0x8004c320; // coined, in ./menus/theatermenu.cpp; matched by tools/builds.py from 1.0 0x800449d0
Theatre.OnDown = 0x8004c350; // coined, in ./menus/theatermenu.cpp; matched by tools/builds.py from 1.0 0x80044a00
Theatre.OnA = 0x8004c38c; // coined, in ./menus/theatermenu.cpp; matched by tools/builds.py from 1.0 0x80044a3c
Theatre.Play = 0x8004c3f4; // coined, in ./menus/theatermenu.cpp; matched by tools/builds.py from 1.0 0x80044aa4
Theatre.OnStart = 0x8004c4a0; // coined, in ./menus/theatermenu.cpp; matched by tools/builds.py from 1.0 0x80044b50
GetItemImage = 0x8004c860; // string 0x800dd8bc
StartDialog = 0x8004e9ac; // string 0x800ddaa8
Plane.SetDrawState = 0x80053da0; // 1.0 0x8004c350
Plane.Draw = 0x80053ef4; // 1.0 0x8004c4a4
AllocDynamicLight = 0x80055580; // string 0x800de68c
FreeDynamicLight = 0x80055654; // string 0x800de6b8
Audio.PlaceSound = 0x800557d0; // coined; docs/systems/audio.md
Audio.ShiftSounds = 0x80055828; // coined; docs/systems/audio.md
Audio.LoadSound = 0x800558d8; // coined; docs/systems/audio.md
Audio.StopSound = 0x80055914; // coined; docs/systems/audio.md
Audio.Init = 0x80055988; // coined; docs/systems/audio.md: the 80 sounds and 16 bubbles
Audio.FreeSoundSlot = 0x80055a84; // coined; docs/systems/audio.md
Audio.AddSound = 0x80055af8; // coined; docs/systems/audio.md
Audio.PlaySound = 0x80055bd0; // coined; docs/systems/audio.md: a one-shot (Borg12, pan, gain, lifetime, delay)
FreeAudioSound = 0x80055d14; // string 0x800de704
Audio.FreeBubbles = 0x80055da0; // coined; docs/systems/audio.md
Audio.PersistMusic = 0x80055e68; // coined; docs/systems/audio.md
Audio.FindPersistentMusic = 0x80055f54; // coined; docs/systems/audio.md
Audio.StartChunk = 0x80056018; // coined; docs/systems/audio.md
Audio.ClearSounds = 0x800561c4; // coined; docs/systems/audio.md
Audio.Free = 0x80056278; // coined; docs/systems/audio.md
Audio.FreeOwner = 0x800562f0; // coined; docs/systems/audio.md
Audio.UpdateSound = 0x8005638c; // coined; docs/systems/audio.md
Audio.Attenuation = 0x80056570; // coined; docs/systems/audio.md
Audio.Pan = 0x800565a8; // coined; docs/systems/audio.md
Audio.VolumeAndPan = 0x8005661c; // coined; docs/systems/audio.md: a body's, radius 15
ProcessAudioBubbles = 0x8005672c; // string 0x800de770
CreateScriptCamera = 0x80056a80; // string 0x800de7b0
DialoguePreCallback = 0x80056c84; // string 0x800de838
Script.Start = 0x80057b40; // coined; matched by tools/builds.py from 1.0 0x8004ff80
CreateNewDialogue = 0x80057dd0; // string 0x800deb58
ApplyStimulus = 0x80058c2c; // string 0x800deba8
DialogueModeInitPrescripted = 0x800592c0; // string 0x800debbc
Journal::Load = 0x8005b3ec; // string 0x800dee88
AudioKeys.Load = 0x8005be30; // coined after ./src/audiokey.cpp, which it cites
AudioKeys.Free = 0x8005bee8; // coined after ./src/audiokey.cpp, which it cites
AudioKeys.PlaySurfaceSteps = 0x8005bf10; // coined; docs/systems/audio.md
AudioKeys.PlayEntityKey = 0x8005c0f0; // coined; docs/systems/audio.md
AudioKeys.PlaySpellCast = 0x8005c2f0; // coined; docs/systems/audio.md
AudioKeys.ProcessPlayer = 0x8005c394; // coined; docs/systems/audio.md
Cinematic.Load = 0x8005c6b0; // coined; matched by tools/builds.py from 1.0 0x80053880
Cinematic.Tick = 0x8005c764; // coined; matched by tools/builds.py from 1.0 0x80053934
Cinematic.FreeShot = 0x8005c908; // coined; matched by tools/builds.py from 1.0 0x80053ad8
Cinematic.Begin = 0x8005c9a4; // coined; matched by tools/builds.py from 1.0 0x80053b74
Cinematic.EndCase = 0x8005ca50; // coined; matched by tools/builds.py from 1.0 0x80053c20
Cinematic.ReadInput = 0x8005cb48; // coined; matched by tools/builds.py from 1.0 0x80053d18
Cinematic.DrawShot = 0x8005cbe4; // coined; matched by tools/builds.py from 1.0 0x80053d94
Cinematic.StartShot = 0x8005cc9c; // coined; docs/systems/audio.md
Cinematic.EndOpening = 0x8005ce8c; // coined; matched by tools/builds.py from 1.0 0x8005403c
Cinematic.EndEnding = 0x8005cf40; // coined; matched by tools/builds.py from 1.0 0x800540f0
Cinematic.EndRoog = 0x8005cf54; // coined; matched by tools/builds.py from 1.0 0x80054104
Cinematic.EndShadow = 0x8005cfa0; // coined; matched by tools/builds.py from 1.0 0x80054150
Cinematic.EndTheatre = 0x8005cfb4; // coined; matched by tools/builds.py from 1.0 0x80054164
Cinematic.InitFades = 0x8005cfc0; // coined; matched by tools/builds.py from 1.0 0x80054170
Cinematic.StartShotFades = 0x8005d024; // coined; matched by tools/builds.py from 1.0 0x800541d4
Cinematic.StepFades = 0x8005d040; // coined; matched by tools/builds.py from 1.0 0x800541f0
Cinematic.CaptionsCreate = 0x8005d420; // coined, in ./src/cinematictext.cpp (cites line 86); matched by tools/builds.py from 1.0 0x800545d0
Cinematic.CaptionsFree = 0x8005d504; // coined, in ./src/cinematictext.cpp (cites line 113); matched by tools/builds.py from 1.0 0x800546b4
Cinematic.ShowCaption = 0x8005d570; // coined, in ./src/cinematictext.cpp; matched by tools/builds.py from 1.0 0x80054720
Cinematic.DrawCaption = 0x8005d5d4; // coined, in ./src/cinematictext.cpp; matched by tools/builds.py from 1.0 0x80054784
Text.StartsWith = 0x8005d70c; // coined; matched by tools/builds.py from 1.0 0x800548bc
Text.ReplaceAll = 0x8005d740; // coined; matched by tools/builds.py from 1.0 0x800548f0
Cinematic.ShowDueCaption = 0x8005d7fc; // coined, in ./src/cinematictext.cpp; matched by tools/builds.py from 1.0 0x800549ac
Cinematic.AdvanceCaptionClock = 0x8005d8cc; // coined, in ./src/cinematictext.cpp; matched by tools/builds.py from 1.0 0x80054a7c
Cinematic.ReadCaption = 0x8005d8e0; // coined, in ./src/cinematictext.cpp (cites line 263); matched by tools/builds.py from 1.0 0x80054a90
Cinematic.LoadCaptionIndex = 0x8005da0c; // coined, in ./src/cinematictext.cpp (cites line 287); matched by tools/builds.py from 1.0 0x80054bbc
Cinematic.FreeCaptionIndex = 0x8005dab4; // coined, in ./src/cinematictext.cpp (cites line 297); matched by tools/builds.py from 1.0 0x80054c60
Cinematic.SelectCaptions = 0x8005daf4; // coined, in ./src/cinematictext.cpp; matched by tools/builds.py from 1.0 0x80054ca0
TextBand.Create = 0x8005e670; // coined; matched by tools/builds.py from 1.0 0x80055800
TextBand.Destroy = 0x8005e89c; // coined; matched by tools/builds.py from 1.0 0x80055a2c
TextBand.SetText = 0x8005e8f0; // coined; matched by tools/builds.py from 1.0 0x80055a80
Player.SetCastSound = 0x8006edc4; // coined; docs/systems/audio.md
GetEntityName = 0x80075694; // string 0x800dfe6c
GetIdIndex = 0x80075de8; // string 0x800e004c
Entity::GetSpell = 0x80079ed4; // string 0x800e067c
Party.FindMember = 0x8007e08c; // coined; matched by tools/builds.py from 1.0 0x80074c5c
World::SetTerrain = 0x80084d68; // string 0x800e0f18
GetVoxelObjectFromLink = 0x8008ce40; // string 0x800e1838
ProcessVoxelObjects = 0x8008cee0; // string 0x800d8b88
AudioKeys.WeaponSound = 0x80090e68; // coined; docs/systems/audio.md
ProcessSpellVisuals = 0x80095460; // string 0x800e223c
strcpy = 0x800989b0; // library: copies to NUL including terminator, returns dst (game-side libc)
strncpy = 0x800989d8; // library: copies up to n bytes then zero-pads, returns dst (game-side libc)
strcat = 0x80098a34; // library: seeks the end of dst then copies (game-side libc)
strncat = 0x80098a80; // library: seeks the end of dst then copies at most n (game-side libc)
strcmp = 0x80098af8; // library: returns -1/0/1 (game-side libc)
strncmp = 0x80098b94; // library: returns -1/0/1, at most n bytes (game-side libc)
stricmp = 0x80098c4c; // library: case-insensitive strcmp, folds A-Z by +0x20 (game-side libc)
strnicmp = 0x80098d18; // library: case-insensitive strncmp (game-side libc)
memset = 0x80098e00; // library: (dst, byte, n): 8x unrolled byte fill (game-side libc)
memmove = 0x80098e84; // library: overlap-aware byte copy, backwards when dst > src (game-side libc)
memcmp = 0x80099030; // library: byte compare of n bytes, returns difference (game-side libc)
strupr = 0x80099088; // library: upper-cases a-z in place (game-side libc)
strlwr = 0x800990c4; // library: lower-cases A-Z in place (game-side libc)
Audio.Start = 0x80099100; // coined; docs/systems/audio.md: starts the audio thread at 44100 Hz
Audio.RemovePlayers = 0x80099194; // coined; docs/systems/audio.md
Audio.AddPlayer = 0x800991d4; // coined; docs/systems/audio.md: alSynAddPlayer for the sequencer
AudioEngine.StartVoice = 0x800991f8; // AudioEngine.cs
AudioEngine.SetVoicePitch = 0x800993e8; // AudioEngine.cs
AudioEngine.SetVoiceVolume = 0x80099450; // AudioEngine.cs
AudioEngine.SetVoicePan = 0x800994c0; // AudioEngine.cs
AudioEngine.StopVoice = 0x80099530; // AudioEngine.cs
Audio.VoiceState = 0x800995b8; // coined; docs/systems/audio.md
Audio.VoiceStamp = 0x800995e4; // coined; docs/systems/audio.md
Audio.VoicePosition = 0x80099610; // coined; docs/systems/audio.md
Audio.Thread = 0x8009963c; // coined; docs/systems/audio.md
AudioProcInit = 0x80099750; // string 0x800e2b60
dmaProc = 0x80099aa8; // string 0x800e2b90
AudioEngine.UpdateVoices = 0x80099b7c; // AudioEngine.cs: the voice manager, a synthesizer player called every 1000 us
CreateAudioList = 0x80099f54; // string 0x800e2bcc
Audio.BuildTask = 0x8009a068; // coined; docs/systems/audio.md
Dcm.Init = 0x8009a150; // coined after ./src/dcm.cpp, which it cites; docs/formats/audio.md
AudioEngine.Play = 0x8009a254; // AudioEngine.cs
AudioEngine.SetVolume = 0x8009a348; // AudioEngine.cs
AudioEngine.SetPan = 0x8009a408; // AudioEngine.cs
AudioEngine.SetDuration = 0x8009a52c; // AudioEngine.cs
AudioEngine.IsPlaying = 0x8009a59c; // AudioEngine.cs: returns the player state, 2 playing
AudioEngine.Stop = 0x8009a5c8; // AudioEngine.cs
AudioEngine.StopAll = 0x8009a688; // AudioEngine.cs
AudioEngine.StepPlayers = 0x8009a744; // AudioEngine.cs: the sequencer, a synthesizer player called every 1000 us
Dcm.ReadU8 = 0x8009ad10; // coined; docs/formats/audio.md
Dcm.ReadU16LE = 0x8009ad18; // coined; docs/formats/audio.md
Dcm.ReadU32LE = 0x8009ad2c; // coined; unused
Pak.Init = 0x8009b968; // coined; docs/systems/saves.md: (controller): osPfsInitPak under the pak lock (0x800E4508), through the pfs record at the pointer 0x800E4314 + controller * 0x78 + 4
Pak.InitMotor = 0x8009b9e4; // coined; docs/systems/saves.md: (controller): osMotorInit under the lock
Pak.Open = 0x8009badc; // coined; docs/systems/saves.md: (controller): Pak.Init; on error 0xB (not a Controller Pak) tries the motor and another device probe (0x800B8680): 0xB if either finds a device, else 10
Pak.FreePages = 0x8009bc6c; // coined; docs/systems/saves.md: (&pages, controller): osPfsFreeBlocks, as a byte of 256-byte pages
Pak.AllocateFile = 0x8009bd0c; // coined; docs/systems/saves.md: (&file number, name, extension, company, game code, size, controller): osPfsAllocateFile, the name and extension turned into the pak's character codes
Pak.FindFile = 0x8009be20; // coined; docs/systems/saves.md: (&file number, name, extension, company, game code, controller): osPfsFindFile
Pak.FileState = 0x8009bf24; // coined; docs/systems/saves.md: (&state, file number, controller): osPfsFileState, with the name and extension turned back to ASCII; zeroed on error
Pak.WriteFile = 0x8009c014; // coined; docs/systems/saves.md: (buffer, file number, offset, size, controller): osPfsReadWriteFile with the write flag
Pak.ReadFile = 0x8009c0cc; // coined; docs/systems/saves.md: (buffer, file number, offset, size, controller): osPfsReadWriteFile with the read flag
Pak.DeleteFile = 0x8009c184; // coined; docs/systems/saves.md: (file number, controller): osPfsFileState, then osPfsDeleteFile
Pak.FromText = 0x8009c5c8; // coined; docs/systems/saves.md: (ASCII out, pak codes, count): a string from the pak's character codes (Pak.CharCodes, * for a code past its 0x42)
Pak.ToText = 0x8009c620; // coined; docs/systems/saves.md: (codes out, ASCII, count): the pak's character codes for a string, 0xF for a character it hasn't, 0 past the string's end
RomCopy = 0x8009c9a4; // string 0x800e2cbc
GetN64ImageDimension = 0x8009d268; // string 0x800e2e10
Scene.LoadTextureOp = 0x8009d3dc; // 1.0 0x800938b0
LoadTextureImage = 0x8009d7d8; // string 0x800e2e64
Scene.SetTextureTiles = 0x8009dc3c; // 1.0 0x80094104
Borg5Scene.PivotRotate = 0x8009e4c4; // Borg5Scene.cs
BorgAnimLoadScene = 0x8009f9e8; // string 0x800e2f80
TakeBranch = 0x8009fe08; // string 0x800e2fb4
Scene.DrawActor = 0x800a0644; // 1.0 0x80096ae4
Scene.Draw = 0x800a0da4; // 1.0 0x80097244
Scene.InitDrawState = 0x800a0e60; // 1.0 0x80097300
SetStaticMode = 0x800a0f18; // string 0x800e2fd8
Scene.SetRenderMode = 0x800a1184; // 1.0 0x80097618
BorgAnimDrawSceneRaw = 0x800a15fc; // string 0x800e3034
GetBorgItemInfo = 0x800a27a4; // string 0x800e3134
GetBorgItem = 0x800a2888; // string 0x800e319c
InitBorgTexture = 0x800a2fc0; // string 0x800e31b8
InitBorgScene = 0x800a3704; // string 0x800e321c
N64BorgImageDraw = 0x800a4620; // string 0x800e3290
Borg12Sequence.Parse = 0x800a6de0; // Borg12Sequence.cs: the Borg12 fixup, which loads its Borg11s
BorgDCMModule.Free = 0x800a6e9c; // coined after ./src/n64BorgDCMModule.cpp, which it cites
BorgDCMModule.Get = 0x800a6ff0; // coined; docs/formats/audio.md
BorgDCMModule.Release = 0x800a701c; // coined; docs/formats/audio.md
BorgSample.Free = 0x800a714c; // coined; docs/formats/audio.md
BorgSample.Get = 0x800a71f8; // coined; docs/formats/audio.md
BorgSample.Release = 0x800a7224; // coined; docs/formats/audio.md
SceneSetCameraLookAt = 0x800a7d64; // string 0x800d8c48
SceneSetMaxDynamicDirLights = 0x800a8380; // string 0x800e349c
SceneGetLocatorMtx = 0x800a86cc; // string 0x800e352c
SceneGetLocatorPos = 0x800a88bc; // string 0x800e357c
SceneGetLocatorNorm = 0x800a8a00; // string 0x800e35b0
SceneGetLocatorAlign = 0x800a8c2c; // string 0x800e35e8
ProcessCollisionSphere = 0x800ae45c; // string 0x800e36fc
GetVoxelOffset = 0x800af2b4; // string 0x800e3768
PerformCallback = 0x800af6dc; // string 0x800e37bc
CollideCollisionSphereWithVoxelPolys = 0x800af818; // string 0x800e37e0
ProcessGameCamera = 0x800b1380; // string 0x800e38d8
InitParticleHead = 0x800b1b4c; // string 0x800e39ac
ProcessAndRenderParticleHead = 0x800b216c; // string 0x800e3a54
AllocParticleEmitter = 0x800b28e0; // string 0x800e3ab4
FreeParticleEmitter = 0x800b2a38; // string 0x800e3acc
BorgParticleEmitterCalback = 0x800b36b8; // string 0x800e3bb0
FontEngine.Init = 0x800b410c; // coined; matched from 1.0 0x800aa2ec
FontEngine.AddFont = 0x800b4294; // coined; matched from 1.0 0x800aa474
Font.Select = 0x800b43f4; // coined; matched from 1.0 0x800aa5d4
Font.DrawString = 0x800b4848; // coined; matched from 1.0 0x800aaa28
Widget.SetPosition = 0x800b74fc; // coined; matched from 1.0 0x800ad61c
Widget.SetColor = 0x800b7528; // coined; matched from 1.0 0x800ad648
Widget.SetClip = 0x800b75a8; // coined; matched from 1.0 0x800ad6c8
WidgetClipText.Create = 0x800b7f20; // coined; matched from 1.0 0x800ae040
WidgetClipText.Destroy = 0x800b8048; // coined; matched from 1.0 0x800ae168
WidgetClipText.Draw = 0x800b80c0; // coined; matched from 1.0 0x800ae1e0
WidgetClipText.Width = 0x800b83b0; // coined; matched from 1.0 0x800ae4d0
WidgetClipText.Height = 0x800b8428; // coined; matched from 1.0 0x800ae548
WidgetClipText::SetText = 0x800b8498; // string 0x800e40d4
Widget.Move = 0x800bc8a8; // coined; matched from 1.0 0x800b2978
qsort = 0x800bda94; // library: (base, n, size, cmp): game-side quicksort with a temporary swap buffer, swaps when cmp returns 1
__udivdi3 = 0x800bdb60; // library: unsigned 64-bit divide on 32-bit halves with a leading-zero table (libgcc-style copy used by game code)
osAiGetLength = 0x800be120; // library: returns AI_LEN_REG (0xA4500004)
osAiSetFrequency = 0x800be130; // library: writes AI_DACRATE/AI_BITRATE (0xA4500010/14) from the video clock, rejects dacRate < 132
osAiSetNextBuffer = 0x800be250; // library: writes AI_DRAM_ADDR/AI_LEN, 0x2000 end-of-buffer workaround, checks AI busy
__osAiDeviceBusy = 0x800be2f0; // library: AI_STATUS (0xA450000C) full bit
guAlignF = 0x800be310; // library: a float matrix turning +Z to face away along a direction, rolled by an angle (its third row is the direction negated)
guAlign = 0x800be4dc; // library: guAlignF converted with guMtxF2L
bzero = 0x800be6b0; // library: zeroes n bytes, word/32-byte unrolled loop
osContStartQuery = 0x800be750; // library: packs a controller-status request (__osPackRequestData(0)), SI DMA write then read
osContGetQuery = 0x800be7d0; // library: calls __osContGetInitData(&pattern, status)
osContStartReadData = 0x800be7f0; // library: packs a read-buttons request (__osPackReadData), SI DMA
osContGetReadData = 0x800be878; // library: unpacks button/stick bytes from the SI buffer (0x800e6bb0) into the pad array
__osPackReadData = 0x800be914; // library: fills the SI buffer with 0xff010401 command blocks (read buttons)
osContInit = 0x800be9d0; // library: osGetTime vs 0.5 s, osSetTimer, __osPackRequestData, SI DMA, __osContGetInitData
__osContGetInitData = 0x800beb6c; // library: unpacks status/pattern from the SI buffer
__osPackRequestData = 0x800bec20; // library: fills the SI buffer with 0xff0103<cmd> command blocks
osContSetCh = 0x800bece0; // library: clamps the channel count to 4
cosf = 0x800bed40; // library: libm cosf: range reduction by 2/pi, polynomial
osCreateMesgQueue = 0x800bee90; // library: sets mtqueue/fullqueue to the empty-thread list, msgCount, msg buffer
osCreateThread = 0x800beec0; // library: fills OSThread (id, priority, fp, entry, stack top, context), links into active queue
__osExceptionPreamble = 0x800bef90; // library: 4-word stub (lui/addiu/jr k0) copied to 0x80000000/80/100/180 by __osInitialize_common
__osException = 0x800bf064; // library: exception entry the preamble jumps to (reads Cause, saves k0/k1, tests PI, dispatches)
__osEnqueueAndYield = 0x800bfa94; // library: saves Status/regs/FPCSR into the running thread's context, enqueues, falls into dispatch
__osEnqueueThread = 0x800bfb9c; // library: priority-ordered insert into a thread queue
__osPopThread = 0x800bfbe4; // library: pops the head of a thread queue
__osDispatchThread = 0x800bfbf4; // library: loads next thread context, sets Status/EPC/MI mask
__osCleanupThread = 0x800bfd70; // library: calls osDestroyThread(NULL)
osPiRawWriteIo = 0x800bfe20; // library: waits PI_STATUS (0xA4600010) idle, stores word
osPiRawReadIo = 0x800bfe54; // library: waits PI_STATUS idle, loads word
osDestroyThread = 0x800c24d0; // library: unlinks thread from the active list, removes from its queue, redispatches if running
__osContRamRead = 0x800c27b0; // library: SI request cmd 3 (read) with address CRC and data CRC, retries on error
bcopy = 0x800c29a0; // library: overlap-safe byte/word copy (src, dst, len)
__osContRamWrite = 0x800c2cc0; // library: SI request cmd 2 (write) with address CRC and data CRC
__osContAddressCrc = 0x800c2ed0; // library: 5-bit CRC, polynomial 0x15, of an 11-bit pak address
__osContDataCrc = 0x800c2f3c; // library: 8-bit CRC, polynomial 0x85, of 32 data bytes
osGetTime = 0x800c3070; // library: reads the 64-bit time base with interrupts off plus Count since last tick
osGetCount = 0x800c3100; // library: mfc0 Count
alHeapDBAlloc = 0x800c3110; // library: (file, line, heap, num, size) 16-byte aligned bump allocator on an audio heap
alHeapInit = 0x800c3160; // library: aligns base to 16, sets length, cur pointer
__osInitialize_common = 0x800c31a0; // library: copies exception stubs, sets cache/TLB, reads osTvType (0x80000300) to pick the video clock, AI init
__osGetCause = 0x800c35a0; // library: mfc0 Cause
__osGetSR = 0x800c35b0; // library: mfc0 Status
__osDisableInt = 0x800c3640; // library: clears Status.IE, returns old IE
__osRestoreInt = 0x800c36b0; // library: ORs the saved IE back into Status
osInvalDCache = 0x800c36d0; // library: cache ops 0x15/0x11 over the range, whole D-cache index invalidate when >= 0x2000
osInvalICache = 0x800c3780; // library: cache op 0x10 over the range, index invalidate when >= 0x4000
guLookAtReflectF = 0x800c3ac0; // library: float lookat matrix plus 8-bit LookAt right/up vectors
guLookAtReflect = 0x800c4038; // library: guLookAtReflectF then guMtxF2L
osMapTLBRdb = 0x800c40b0; // library: writes TLB entry 31 for 0xC0000000
__osMotorAccess = 0x800c4110; // library: writes 32 bytes of 0x80 or 0 to the pak motor block over SI
osMotorInit = 0x800c4254; // library: selects pak banks 0xFE/0x80, probes, sets status 8 (motor initialised)
guMtxCatF = 0x800c44a0; // library: 4x4 float matrix multiply
guMtxXFMF = 0x800c457c; // library: transforms a point by a float matrix
guMtxF2L = 0x800c4630; // library: float matrix to fixed-point Mtx (int part / frac part halves, *65536)
guMtxL2F = 0x800c46c8; // library: fixed-point Mtx to float, *1/65536
guMtxIdentF = 0x800c4770; // library: float identity matrix
guMtxIdent = 0x800c47c0; // library: identity, converted with the guMtxF2L loop
guNormalize = 0x800c48b0; // library: divides (x,y,z) by sqrt of the sum of squares
guPerspectiveF = 0x800c49c0; // library: float perspective matrix (fovy in degrees, aspect, near, far, scale) plus perspNorm
guPerspective = 0x800c4b70; // library: guPerspectiveF then guMtxF2L
osPfsAllocateFile = 0x800c4d40; // library: (pfs, company, game, name, ext, nbytes, &file_no): inode page allocation
__osPfsDeclearPage = 0x800c504c; // library: links free inode pages for a new file
__osSumcalc = 0x800c5170; // library: 16-bit sum of bytes
__osIdCheckSum = 0x800c51a4; // library: sum and inverted sum over 14 u16 words
__osRepairId = 0x800c51e8; // library: rebuilds the pak id block, tests every bank
__osCheckId = 0x800c54d4; // library: reads id copies 1/3/4/6, verifies checksums
__osGetId = 0x800c5638; // library: reads and validates the id block, fills pfs fields
__osCheckPackId = 0x800c5804; // library: compares stored id with pfs id (bcmp)
__osPfsRWInode = 0x800c58bc; // library: read/write one inode page with sum and backup copy, cached
bcmp = 0x800c5c00; // library: word/byte compare of two buffers
osPfsDeleteFile = 0x800c5d10; // library: (pfs, company, game, name, ext): frees inode chain, clears directory entry
__osPfsReleasePages = 0x800c5ebc; // library: walks an inode chain marking pages free
osPfsFileState = 0x800c5f30; // library: (pfs, file_no, state*): reads a directory entry
osPfsFreeBlocks = 0x800c60d0; // library: counts free inode pages * 256
__osPfsGetStatus = 0x800c61e0; // library: requests controller status, decodes pak/error bits into a PFS error
__osPfsRequestData = 0x800c62d0; // library: fills the SI buffer with a 0xff0103<cmd> request
__osPfsGetInitData = 0x800c6364; // library: decodes the status reply
osPfsInitPak = 0x800c63f0; // library: (mq, pfs, channel): status, id, inode and directory geometry, calls osPfsChecker
__osPfsCheckRamArea = 0x800c65e8; // library: writes 0..31 to bank 0, reads back, bcmp
osPfsChecker = 0x800c66c0; // library: rebuilds and repairs inode tables (uses corrupted_init, corrupted)
corrupted_init = 0x800c6b20; // library: builds the page-use bitmap for osPfsChecker
corrupted = 0x800c6c78; // library: tests a directory entry's pages for a double claim
osPfsIsPlug = 0x800c6de0; // library: request status for all channels, returns the pak-present bit pattern
osPfsReadWriteFile = 0x800c70c0; // library: (pfs, file_no, flag, offset, size, buf): 32-byte-block inode chain read/write
osPfsFindFile = 0x800c7560; // library: (pfs, company, game, name, ext, &file_no): scans directory
__osPfsSelectBank = 0x800c7720; // library: writes the bank byte over 32 bytes at pak address 0x400
osPiStartDma = 0x800c7790; // library: (mb, priority, dir, devAddr, dramAddr, size, mq): queues an OSIoMesg to the PI manager
osJamMesg = 0x800c7840; // library: (mq, msg, flag): inserts at the head of the queue
osPiGetCmdQueue = 0x800c7980; // library: returns the PI manager's command queue if started
osCreatePiManager = 0x800c79a0; // library: creates the PI manager threads, sets up the access queue and DMA handlers
__osDevMgrMain = 0x800c7c50; // library: PI manager thread: dispatches OSIoMesg types 0xb/0xc (DMA), 0xf/0x10 (EPi DMA)
__osEPiRawStartDma = 0x800c8010; // library: waits PI idle, programs domain latency/pulse regs, PI_DRAM_ADDR/CART_ADDR/RD_LEN or WR_LEN
__osEPiRawReadIo = 0x800c8200; // library: programs domain regs, reads a word at devAddr|0xA0000000
__osEPiRawWriteIo = 0x800c8370; // library: programs domain regs, writes a word at devAddr|0xA0000000
osGetThreadPri = 0x800c84e0; // library: returns thread priority, 0 means the running thread
__osPiCreateAccessQueue = 0x800c8500; // library: 1-slot queue primed with one message
__osPiGetAccess = 0x800c8554; // library: creates the queue if needed then osRecvMesg
__osPiRelAccess = 0x800c85c0; // library: osSendMesg back to the access queue
__osPiRawStartDma = 0x800c85f0; // library: PI_DRAM_ADDR/PI_CART_ADDR from osRomBase (0x80000308), RD_LEN or WR_LEN
osRecvMesg = 0x800c8790; // library: (mq, msg, flags): dequeues, blocks via __osEnqueueAndYield, wakes a sender
__osResetGlobalIntMask = 0x800c88c0; // library: clears bits in the global interrupt mask with interrupts off
__osGetActiveQueue = 0x800c94f0; // library: returns the active thread list head
guRotateRPYF = 0x800cb590; // library: roll/pitch/heading (degrees to radians) rotation matrix
guRotateRPY = 0x800cb718; // library: guRotateRPYF then guMtxF2L
guScaleF = 0x800cb8b0; // library: float scale matrix
guScale = 0x800cb910; // library: scale matrix then guMtxF2L
osScCreateScheduler = 0x800cb990; // library: sched.c sample code: creates the scheduler thread and VI/RSP/RDP event queues
osScAddClient = 0x800cbad8; // library: sched.c sample code: pushes a client on the scheduler's list with interrupts off
osScRemoveClient = 0x800cbb30; // library: sched.c sample code: unlinks a client from the scheduler's list
osScGetCmdQ = 0x800cbbc0; // library: sched.c sample code: returns the scheduler's command queue
osSendMesg = 0x800cc4f0; // library: (mq, msg, flags): enqueues, blocks when full, wakes a receiver
osSetEventMesg = 0x800cc620; // library: stores (queue, msg) per event slot in the event table
__osSetFpcCsr = 0x800cc6d0; // library: cfc1/ctc1 $31, returns old
__osSetGlobalIntMask = 0x800cc6e0; // library: ORs bits into the global interrupt mask with interrupts off
osSetIntMask = 0x800cc720; // library: updates Status IM bits and MI_INTR_MASK, returns the old mask
__osSetSR = 0x800cc7c0; // library: mtc0 Status
osSetThreadPri = 0x800cc7d0; // library: changes priority, requeues, may yield
osSetTimer = 0x800cc8a0; // library: (timer, countdown, interval, mq, msg): inits OSTimer, __osInsertTimer
__osSiCreateAccessQueue = 0x800cc940; // library: 1-slot queue primed with one message
__osSiGetAccess = 0x800cc994; // library: creates the queue if needed then osRecvMesg
__osSiRelAccess = 0x800cca00; // library: osSendMesg back to the access queue
sinf = 0x800cca30; // library: libm sinf: exponent test, polynomial
__osSiRawStartDma = 0x800ccbd0; // library: SI_DRAM_ADDR then SI_PIF_ADDR_WR64B/RD64B (0xA4800000/04/10), writes back cache first
__osSiRawReadIo = 0x800ccc80; // library: reads a word at addr|0xA0000000 when SI is idle
__osSiDeviceBusy = 0x800cccd0; // library: SI_STATUS (0xA4800018) & 3
__osSiRawWriteIo = 0x800cccf0; // library: writes a word at addr|0xA0000000 when SI is idle
alInit = 0x800ccd40; // library
alClose = 0x800ccd6c; // library
alLink = 0x800ccd9c; // library: inserts an ALLink after another
alUnlink = 0x800ccdbc; // library: removes an ALLink from its list
__osSpRawReadIo = 0x800ccdf0; // library: reads a word at addr|0xA0000000 when SP is idle
__osSpDeviceBusy = 0x800cce40; // library: SP_STATUS (0xA4040010) & 0x1c
__osSpRawWriteIo = 0x800cce60; // library: writes a word at addr|0xA0000000 when SP is idle
sprintf = 0x800cceb0; // library: calls _Printf with proutSprintf, writes the terminating NUL
proutSprintf = 0x800ccf08; // library: _Printf's sprintf output callback: copies the chunk, returns dst + n
__osSpSetPc = 0x800ccf40; // library: writes SP_PC (0xA4080000) if the RSP is halted
osSpTaskLoad = 0x800ccf70; // library: copies the OSTask to a local buffer, converts pointers to physical
osSpTaskStartGo = 0x800cd17c; // library: waits SP idle then SP_STATUS = 0x125 (clear halt/broke/intr)
__osSpRawStartDma = 0x800cd1b0; // library: SP_MEM_ADDR/SP_DRAM_ADDR/RD_LEN or WR_LEN (0xA4040000..0C)
__osSpSetStatus = 0x800cd240; // library: writes SP_STATUS_REG
osSpTaskYield = 0x800cd250; // library: __osSpSetStatus(0x400), sets the yield signal
osSpTaskYielded = 0x800cd270; // library: reads SP_STATUS, tests the yielded bit, clears the signal
__osSpGetStatus = 0x800cd2c0; // library: returns SP_STATUS_REG
sqrtf = 0x800cd2d0; // library: sqrt.s
osStartThread = 0x800cd2e0; // library: moves a stopped thread to the run queue, may yield
osStopThread = 0x800cd400; // library: removes a thread from its queue, state 4
strchr = 0x800cd4c0; // library: scans for a byte, returns pointer (also matches the terminator)
strlen = 0x800cd4f8; // library: counts bytes to NUL
memcpy = 0x800cd51c; // library: forward byte copy, returns dest
alSynAddPlayer = 0x800cd550; // library: (drvr, client): pushes the client on drvr->head with interrupts masked, samplesLeft = curSamples
alSynAllocVoice = 0x800cd5a0; // library
alSynDelete = 0x800cd780; // library: clears drvr->head
alSynRemovePlayer = 0x800cd790; // library: (drvr, client): unlinks the client from drvr->head with interrupts masked
alSynSetPan = 0x800cd830; // library
alSynSetPitch = 0x800cd8c0; // library
alSynSetVol = 0x800cd950; // library: (drvr, voice, vol, delta): posts a volume update, delta via _timeToSamples
alSynStartVoiceParams = 0x800cda10; // library: 8 args (voice, wave, pitch, vol, pan, fxmix clamped 0x7f, t): posts start with all params
alSynStopVoice = 0x800cdb10; // library
alSynNew = 0x800cdb90; // library: builds the synth: heap allocs, then bus/save filters and per-voice alLoadNew/alResampleNew/alEnvmixerNew
alAudioFrame = 0x800cde5c; // library: (cmdList, &cmdLen, outBuf, outLen): runs the filter chain per frame, builds the RSP audio command list
__allocParam = 0x800ce00c; // library: pops an ALParam from the driver's free list
__freeParam = 0x800ce038; // library: pushes an ALParam back on the free list
_collectPVoices = 0x800ce050; // library: moves lame voices back to the free list (alUnlink/alLink)
_freePVoice = 0x800ce0a4; // library: alUnlink + alLink onto the free list
_timeToSamplesNoRound = 0x800ce0e4; // library: usec * outputRate / 1e6 as a double, no round-down to 16
_timeToSamples = 0x800ce12c; // library: same, rounded down to a multiple of 16
__nextSampleTime = 0x800ce178; // library: scans the player list for the smallest samplesLeft
alAdpcmPull = 0x800ce1d0; // library: emits A_LOADADPCM (0x0b000000) and A_ADPCM decode commands per frame
alRaw16Pull = 0x800ce5e4; // library: DMA callback in bytes (samples*2), 16-bit PCM load path
alRaw8Pull = 0x800ce964; // library, modified: an 8-bit copy of alRaw16Pull; not an SDK name
alLoadParam = 0x800cecec; // library: ADPCM/raw loader filter param handler (AL_FILTER_FREE_VOICE = 4 case)
alFxNew = 0x800cf244; // library: picks reverb tables by config type, alFilterNew(type 5), sets alFxPull/alFxParamHdl
alEnvmixerNew = 0x800cf6dc; // library: alFilterNew(type 4), allocs 0x50 bytes (ENVMIX_STATE)
alLoadNew = 0x800cf794; // library: alFilterNew(type 0) with 2x0x20 heap blocks and a DMA callback
alResampleNew = 0x800cf844; // library: alFilterNew(type 1) with a 0x20-byte state block
alSaveNew = 0x800cf988; // library: alFilterNew(type 3), dramout = 0, first = 1
alEnvmixerPull = 0x800cf9d0; // library: per-frame loop over the param update list, pulls its source filter
alEnvmixerParam = 0x800cfed0; // library: AL_FILTER_ADD_UPDATE (3) appends to the update list
alFilterNew = 0x800d0680; // library: (filter, handler, setParam, type): clears next/source, stores the three fields
alResamplePull = 0x800d0810; // library: resampler pull handler
alResampleParam = 0x800d09fc; // library: switch over filter param types 1..9 for the resampler
alFxPull = 0x800d0ac0; // library: reverb pull handler
alFxParam = 0x800d0e34; // library: AL_FILTER_SET_SOURCE (1) stores the source
alFxParamHdl = 0x800d0e48; // library: reverb parameter switch (index / 8)
alSavePull = 0x800d1660; // library: calls the source's pull, then emits the save command
alSaveParam = 0x800d1708; // library: stores param types 1 and 6
alSynAllocFX = 0x800d1730; // library: (drvr, bus, config, heap): alFxNew + hooks the effect into a bus
__osTimerServicesInit = 0x800d1810; // library: zeroes the 64-bit current time, base counter, VI interrupt count, empties the timer list
__osTimerInterrupt = 0x800d1864; // library: pops expired timers from the sorted list and sends their messages
__osSetTimerIntr = 0x800d1a48; // library: writes Compare for the next timer from Count
__osInsertTimer = 0x800d1aa8; // library: sorted 64-bit insert into the timer list
__osSetCompare = 0x800d1bb0; // library: mtc0 Compare
guTranslateF = 0x800d1bc0; // library: float translation matrix
guTranslate = 0x800d1c14; // library: translation matrix then guMtxF2L
osUnmapTLBAll = 0x800d1c90; // library: loop writing 31 TLB entries with tlbwi
osViBlack = 0x800d1ce0; // library: sets or clears the black flag (0x20) in the next VI context
__osViInit = 0x800d1d40; // library: bzero's the VI contexts, sets viCurr/viNext, tv-type mode, __osViSwapContext
osViGetCurrentFramebuffer = 0x800d1e50; // library: returns __osViCurr->buffer with interrupts off
osViGetNextFramebuffer = 0x800d1e90; // library: returns __osViNext->buffer with interrupts off
osCreateViManager = 0x800d1ed0; // library: creates the VI manager thread, queues, __osViInit, event handlers
__osViIntrHandler = 0x800d2070; // library: VI retrace: swaps context, counts retraces, posts the VI event
__osViGetCurrentContext = 0x800d2210; // library: returns __osViCurr
osVirtualToPhysical = 0x800d2220; // library: KSEG0/KSEG1 mask, else __osProbeTLB
__osProbeTLB = 0x800d2280; // library: tlbp/tlbr to translate a mapped address
osViSetEvent = 0x800d2340; // library: (mq, msg, retraceCount): stores them in the next VI context
osViSetMode = 0x800d23a0; // library: stores the mode pointer, state = 1, copies its control word
osViSetSpecialFeatures = 0x800d23f0; // library: maps the OS_VI_* gamma/dither/divot feature bits onto the control word
osViSwapBuffer = 0x800d2560; // library: stores the frame buffer in the next VI context, flags a swap
__osViSwapContext = 0x800d25b0; // library: latches the next VI context into the VI registers (0xA4400000 block)
osWritebackDCache = 0x800d28c0; // library: cache op 0x19 over the range, full index writeback when >= 0x2000
osWritebackDCacheAll = 0x800d2940; // library: index writeback of the whole D-cache
_Printf = 0x800d2970; // library: (output callback, arg, fmt, va_list): the printf formatter, uses strchr over format flags
_Putfld = 0x800d2ee0; // library: converts one field by conversion code (switch on %c, d, i, u, o, x, X, e, f, g, s, p)
_Ldtob = 0x800d33a0; // library: double to ASCII digits for e/f/g
_Ldunscale = 0x800d37e0; // library: splits a double's exponent and detects NaN/Inf
_Genld = 0x800d3878; // library: lays out the digits and exponent for e/f/g
ldiv = 0x800d3e20; // library: 32-bit divide returning quotient and remainder with C rounding
lldiv = 0x800d3ea4; // library: 64-bit divide returning quotient and remainder, via __ll_div
__ll_div = 0x800d3fe0; // library: signed 64-bit divide on 32-bit halves, negates operands then divides
_Litob = 0x800d45d0; // library: integer to ASCII for %d/%u/%o/%x/%X, digit table "0123456789abcdef"
__ull_div = 0x800d4820; // library: unsigned 64-bit divide on 32-bit halves, normalised by a leading-zero table
osYieldThread = 0x800d4d20; // library: state = runnable, __osEnqueueAndYield on the active queue
ProcessGameStates = 0x800d4f80; // string 0x800e4dc0
GameStateFunnel.SetBit = 0x800d5390; // coined; docs/systems/saves.md: (bits, index, value, masks)
GameStateFunnel.GetBit = 0x800d53e0; // coined; docs/systems/saves.md: (bits, index, masks)
GameStateFunnel.Unpack = 0x800d5454; // coined; docs/systems/saves.md: (funnel, buffer): each plain flag's value from its bit, then the derived ones evaluated (0x800CB31C)
GameStateFunnel.Pack = 0x800d54f8; // coined; docs/systems/saves.md: (funnel, buffer): the plain flags (the first 5001 of 5627) as bits, flag n at byte n >> 3, bit n & 7, in a zeroed (count + 31) / 32 words
Crc.Compute = 0x800d5a70; // coined; docs/systems/saves.md: CRC.cpp (named by the debug build's asserts); (buffer, size): big-endian words, each byte shifted in as crc << 8 | byte with the table entry of the old top byte xored in (CRC-32, polynomial 0x04C11DB7, over the augmented message)
Crc.Check = 0x800d5b60; // coined; docs/systems/saves.md: CRC.cpp (named by the debug build's asserts); (buffer, size): takes 8 off the last word, true if Crc.Compute is then 0
Crc.Seal = 0x800d5b98; // coined; docs/systems/saves.md: CRC.cpp (named by the debug build's asserts); (buffer, size): zeroes the last word, then stores Crc.Compute + 8 in it
Crc.TableEntry = 0x800d5be0; // coined; docs/systems/saves.md: CRC.cpp (named by the debug build's asserts); (byte): eight shifts of byte << 24, xor 0x04C11DB7 on a carried top bit
Crc.Init = 0x800d5c24; // coined; docs/systems/saves.md: CRCTable.cpp (the debug build's string 0x800e4f30, debug 0x800d5c24); builds the 256-entry table (the pointer at 0x800E6560), once; SaveMenu.Create calls it
Crc.Free = 0x800d5cb8; // coined; docs/systems/saves.md: CRCTable.cpp (the debug build's string 0x800e4f30, debug 0x800d5c24); frees the table
AllocAllocQueueItem = 0x800d5d2c; // string 0x800e4f50
ProcessAllocQueue = 0x800d5e88; // string 0x800e5024
InitFreeQueueHead = 0x800d6130; // string 0x800e50a0
AllocFreeQueueItem = 0x800d619c; // string 0x800e50cc
ProcessFreeQueue = 0x800d6258; // string 0x800e513c
CodeTable.ParticleTextures = 0x800d88b8; // RomVersion.cs
MapObjectUse.ContainerSounds = 0x800d8e40; // coined; docs/systems/audio.md
CodeTable.SkyGradients = 0x800d9aa0; // RomVersion.cs
CodeTable.GameOverScenes = 0x800d9ea0; // RomVersion.cs
Credits.CardStarts = 0x800db4d0; // coined; matched from 1.0 0x800cf060
CodeTable.PotionDescriptions = 0x800dbce0; // RomVersion.cs
CodeTable.ItemDescriptions = 0x800dbd48; // RomVersion.cs
CodeTable.SpellDescriptions = 0x800dbea8; // RomVersion.cs
CodeTable.WorldMapTowns = 0x800dd350; // RomVersion.cs
CodeTable.RegionFlags = 0x800ddbcc; // RomVersion.cs
CodeTable.ScriptBattleFlags = 0x800deb40; // RomVersion.cs
CodeTable.WeaponModels = 0x800e0114; // RomVersion.cs
CodeTable.ItemModels = 0x800e019c; // RomVersion.cs
CodeTable.SpellSymbols = 0x800e0254; // RomVersion.cs
CodeTable.PotionNotNow = 0x800e0368; // RomVersion.cs
CodeTable.PotionNotInTrek = 0x800e0390; // RomVersion.cs
CodeTable.PartyFlags = 0x800e0b3c; // RomVersion.cs
CodeTable.PartyDeathFlags = 0x800e0b90; // RomVersion.cs
CodeTable.ScrollNoSpell = 0x800e0bd4; // RomVersion.cs
CodeTable.SkillTrainingCosts = 0x800e0d3c; // RomVersion.cs
CodeTable.WeaponTrainingCosts = 0x800e0d7c; // RomVersion.cs
CodeTable.StatTrainingCosts = 0x800e0ef0; // RomVersion.cs
AudioKeys.WeaponSoundTable = 0x800e1ac0; // coined; docs/systems/audio.md
CodeTable.ArmorRecipes = 0x800e6110; // RomVersion.cs
CodeTable.PotionRecipes = 0x800e6130; // RomVersion.cs
CodeTable.CampDialogueFlags = 0x800e6200; // RomVersion.cs
CodeTable.CampfireScenes = 0x800e6214; // RomVersion.cs
Memory.HasExpansionPak = 0x800e66c4; // coined; docs/systems/audio.md
Debug.Enabled = 0x800e68a0; // coined; docs/reference-rig.md
gGlobals = 0x800e68a8; // string 0x800d7ac0
Camera.Listener = 0x800e6abc; // coined; docs/systems/audio.md: look-at at +0, eye at +0xC
AudioKeys.Table = 0x800e6cd4; // coined; docs/systems/audio.md
Bgm.Borg = 0x800e78b8; // coined; docs/systems/audio.md
Bgm.Generation = 0x800e78bc; // coined; docs/systems/audio.md
Bgm.Slot = 0x800e78c0; // coined; docs/systems/audio.md
Bgm.Requested = 0x800e78c2; // coined; docs/systems/audio.md
Bgm.Playing = 0x800e78c4; // coined; docs/systems/audio.md
Zones.Mode = 0x800e78c6; // coined; docs/systems/audio.md: 0 trek, 2 combat
Audio.System = 0x800e7ba0; // coined; docs/systems/audio.md
GameState.Party = 0x800e7ea0; // AresCheckpoint.cs
Settings.SoundVolume = 0x800e88fc; // Settings.cs: a float, 1.0 in a new game
Settings.MusicVolume = 0x800e8900; // Settings.cs: a float, 0.65 in a new game
gGlobals.text = 0x800e8920; // string 0x800d7ac0
CodeTable.FontFaces = 0x800e8d18; // RomVersion.cs
Party.KeptSheets = 0x800e8f10; // docs/systems/saves.md
PakSave.Thumbnail = 0x800e8f20; // coined; docs/systems/saves.md: pointer to the 0x1000-byte 64 x 32 RGBA5551 snapshot Weather.Pause makes and PakSave.CopyThumbnail copies
RomLayout.MapChunkLists = 0x800e9c50; // RomVersion.cs
CodeTable.LensFlare = 0x800ec630; // RomVersion.cs
CodeTable.Clouds = 0x800ec6c8; // RomVersion.cs
CodeTable.SkyObjects = 0x800ecd08; // RomVersion.cs
CodeTable.InventoryOrder = 0x800ed560; // RomVersion.cs
CodeTable.EquipmentSlotImages = 0x800ed5d0; // RomVersion.cs
CodeTable.MenuIcons = 0x800ed660; // RomVersion.cs
CodeTable.WorldMapPieces = 0x800edba0; // RomVersion.cs
CodeTable.MinimapSections = 0x800ee704; // RomVersion.cs
CodeTable.MinimapFlagImages = 0x800ee728; // RomVersion.cs
Dialogue.SoundTable = 0x800ee8c0; // coined; docs/systems/audio.md
CodeTable.ScriptEndings = 0x800ee97c; // RomVersion.cs
AudioKeys.FootstepEntries = 0x800ee9d0; // coined; docs/systems/audio.md
AudioKeys.StepSets = 0x800eeb58; // coined; docs/systems/audio.md
Audio.StepSounds = 0x800eec98; // coined; docs/systems/audio.md
Audio.VoiceSounds = 0x800eee18; // coined; docs/systems/audio.md
Audio.SpellSounds = 0x800ef010; // coined; docs/systems/audio.md
CodeTable.Cinematics = 0x800ef2f0; // RomVersion.cs
CodeTable.CinematicFades = 0x800ef508; // RomVersion.cs
MapObjectMemory.Count = 0x800ef5e0; // coined; docs/systems/saves.md: the byte before the chart: how many of its 19 entries are used
MapObjectMemory.Chart = 0x800ef5e4; // coined; docs/systems/saves.md
MapObjectMemory.Slots = 0x800ef6c8; // coined; docs/systems/saves.md: 19 bytes: the entries' slot numbers, those in use first; Remember takes Slots[Count], Forget puts its slot back at Slots[Count - 1]
CodeTable.DialogEntityList = 0x800ef870; // RomVersion.cs
CodeTable.EntityModels = 0x800ef8a0; // RomVersion.cs
CodeTable.DialogEntityModels = 0x800f10e8; // RomVersion.cs
CodeTable.EntityList = 0x800f13b0; // RomVersion.cs
CodeTable.WeaponsWithModels = 0x800f1490; // RomVersion.cs
CodeTable.ItemsWithModels = 0x800f14d4; // RomVersion.cs
CodeTable.SpellList = 0x800f16b0; // RomVersion.cs
CodeTable.LevelExp = 0x800f1778; // RomVersion.cs
CodeTable.PotionPrices = 0x800f1820; // RomVersion.cs
CodeTable.MustTakeItems = 0x800f1850; // RomVersion.cs
CodeTable.ReservedItems = 0x800f1890; // RomVersion.cs
CodeTable.KeyItemFlags = 0x800f1930; // RomVersion.cs
CodeTable.KeyItems = 0x800f1970; // RomVersion.cs
CodeTable.KeyItemRegionFlags = 0x800f19b0; // RomVersion.cs
CodeTable.KeyEquipment = 0x800f19f0; // RomVersion.cs
CodeTable.CampFactors = 0x800f1ab8; // RomVersion.cs
CodeTable.StatCaps = 0x800f1b64; // RomVersion.cs
GameClock.WorldPointer = 0x800f1bbc; // coined; docs/reference-rig.md
CodeTable.FontGlyphs = 0x800f3640; // RomVersion.cs
CodeTable.FontColors = 0x800f36ac; // RomVersion.cs
SaveBits.Init = 0x800026f0; // coined; docs/systems/saves.md: the bit stream the save file's party block is packed in: (stream, buffer), position 0; bits go lowest first, bit n at byte n >> 3, bit n & 7
SaveBits.Write = 0x80002700; // coined; docs/systems/saves.md: (stream, value, count): the value's low count bits, lowest first, at the position
SaveBits.Read = 0x8000277c; // coined; docs/systems/saves.md: (stream, count): count bits as an unsigned value
SaveBits.Skip = 0x800027f4; // coined; docs/systems/saves.md: (stream, count): moves the position on, leaving the bits as they were (zero in a fresh buffer)
PakSave.WritePotion = 0x8001c640; // coined; docs/systems/saves.md: (stream, potion record): kind 4 bits, power 4, timer 12; a null one skips 20
PakSave.ReadPotion = 0x8001c6ac; // coined; docs/systems/saves.md: (stream, entity): kind 4 bits, 0 for none, power 4, timer 12, then Character.ApplyPotionEffect
PakSave.WriteEffect = 0x8001c730; // coined; docs/systems/saves.md: (stream, spell effect record): power 4 bits, kind 6, margin 5, harmful 1, timer 12; a null one skips 28
PakSave.ReadEffect = 0x8001c7c4; // coined; docs/systems/saves.md: (stream): power 4 bits (0 for none), kind 6, margin 5, harmful 1, timer 12, into a new effect record
PakSave.WriteStatMod = 0x8001c8b4; // coined; docs/systems/saves.md: (stream, stat mod): stat << 7 | (amount + 50) & 0x7F in 10 bits; null skips 10
PakSave.ReadStatMod = 0x8001c908; // coined; docs/systems/saves.md: (stream): the 10 bits as a new stat mod, null for 0
PakSave.WriteItem = 0x8001c980; // coined; docs/systems/saves.md: (stream, item instance): id 13 bits, spell charges 5, stat mod 10; null or id 0 skips 28
PakSave.ReadItem = 0x8001ca00; // coined; docs/systems/saves.md: (stream, inventory slot): id 13 bits (0 skips the other 15), charges 5, stat mod 10, into the slot's item
PakSave.WriteExperience = 0x8001cab0; // coined; docs/systems/saves.md: (stream, CharExp): total and spendable experience, 24 bits each
PakSave.ReadExperience = 0x8001cb10; // coined; docs/systems/saves.md: (stream, CharExp): the same
PakSave.WriteStats = 0x8001cb88; // coined; docs/systems/saves.md: (stream, sheet): Stats.Save of its CharStats, 80 bits
PakSave.ReadStats = 0x8001cbc0; // coined; docs/systems/saves.md: (stream, CharStats): Stats.Load
PakSave.WriteSchoolSpells = 0x8001cbfc; // coined; docs/systems/saves.md: (stream, spellbook, group): the level of each of the group's spells in the spell table's order, 4 bits, 0 for one not known; group 0 is 5
PakSave.ReadSchoolSpells = 0x8001ccfc; // coined; docs/systems/saves.md: (stream, spellbook, group): the same, learning each spell at its level
PakSave.WriteSpells = 0x8001cdd4; // coined; docs/systems/saves.md: (stream, spellbook, school): group 4's spells, then the school's group, 13 - count[school] slots of padding after it, which for school 0 (Chaos, whose 13 are group 5's) is 13 more
PakSave.ReadSpells = 0x8001ce70; // coined; docs/systems/saves.md: (stream, spellbook, school): the same
PakSave.WriteClock = 0x8001cf0c; // coined; docs/systems/saves.md: (stream): the in-game clock, 32 bits
PakSave.ReadClock = 0x8001cf4c; // coined; docs/systems/saves.md: (stream): the same into the world
PakSave.WriteGold = 0x8001cf78; // coined; docs/systems/saves.md: (stream): the party's gold, 32 bits
PakSave.ReadGold = 0x8001cfa0; // coined; docs/systems/saves.md: (stream): 32 bits, returned
PakSave.WriteTimer = 0x8001cfbc; // coined; docs/systems/saves.md: (stream, ticks): ticks / 7200 in 12 bits, a timer in 2-minute units; an unsigned divide, so -1 doesn't come back as -1
PakSave.ReadTimer = 0x8001cff0; // coined; docs/systems/saves.md: (stream): 12 bits x 7200, 0xFFF is -1
PakSave.WriteAlaron = 0x8001d038; // coined; docs/systems/saves.md: (stream, sheet): his name, 20 bytes, then the levels of the Elemental, Naming and Necromancy spells (groups 1 to 3, unpadded)
PakSave.ReadAlaron = 0x8001d0fc; // coined; docs/systems/saves.md: (stream, sheet): the same
PakSave.WriteSheet = 0x8001d19c; // coined; docs/systems/saves.md: (stream, sheet): the entity's low byte, experience, stats, 18 skills, armor, shield, weapon and 12 gear, the spells: 720 bits (90 bytes), 52 more for Chaos; a null sheet skips 720
PakSave.ReadSheet = 0x8001d29c; // coined; docs/systems/saves.md: (stream): a sheet from its entity's low byte + 0x200, built by Character.Build, then the rest; 0 skips 712
PakSave.WritePartySheet = 0x8001d3bc; // coined; docs/systems/saves.md: (stream, sheet): PakSave.WriteSheet, then 15 spell effects and 7 potions (always empty: the kept copy has none); a null sheet skips 0x500 bits
PakSave.ReadPartySheet = 0x8001d4a8; // coined; docs/systems/saves.md: (stream): PakSave.ReadSheet, then the effects and potions; a null sheet skips 0x230 more
PakSave.WriteChart = 0x8001ddfc; // coined; docs/systems/saves.md: (buffer): the chart's count byte (0x800E0A70), the 19 slot numbers (0x800E0B58) and the 19 entries of 12 bytes (0x800E0A74)
PakSave.ReadChart = 0x8001de70; // coined; docs/systems/saves.md: (buffer): the same back
PakSave.Verify = 0x8001dee4; // coined; docs/systems/saves.md: (buffer): Crc.Check over the 0x1C00 bytes
PakSave.CopyThumbnail = 0x8001df00; // coined; docs/systems/saves.md: (buffer): the pause menu's 64 x 32 RGBA5551 snapshot (0x800DA4F0, 0x1000 bytes), if there is one
PakSave.WriteHeader = 0x8001df40; // coined; docs/systems/saves.md: (header): the time played, the four party slots' entity IDs as halfwords, Alaron's name from +12
PakSave.WritePlace = 0x8001dfe0; // coined; docs/systems/saves.md: (place, with place): SaveZoneEngine, then 0x2C bytes of Zones.SavedPosition
PakSave.Build = 0x8001e034; // coined; docs/systems/saves.md: (regions, with place): the header, the place, the plain flags, the minimaps' pieces, SaveBlock.Write and the chart
PakSave.Make = 0x8001e09c; // coined; docs/systems/saves.md: (buffer 0x1C00): zeroes it, PakSave.Build with the place, the thumbnail, then Crc.Seal
PakSave.Regions = 0x8001e0f8; // coined; docs/systems/saves.md: (buffer, regions): where the 0x1C00 bytes' parts are: header +0, place +0x40, flags +0x80, thumbnail +0x300, minimaps +0x1300, party stream +0x1340, chart +0x1B00
PakSave.Restore = 0x8001e168; // coined; docs/systems/saves.md: (regions, with place): the chart cleared, the flags read, flag 3617 cleared, the place, the minimaps, SaveBlock.Read, the chart, the time played; with place the saved chunk marks go to -1
PakSave.Load = 0x8001e21c; // coined; docs/systems/saves.md: (buffer): PakSave.Regions then PakSave.Restore with the place
PakSave.RestorePlace = 0x8001e494; // coined; docs/systems/saves.md: (place, with place): copies it to Zones.SavedPosition and starts the zone engine there (0x8000A344)
Skills.LoadOne = 0x80083580; // coined; docs/systems/saves.md: (skills, stream, current): 4 bits, or -1 if the current level is negative
Skills.Load = 0x800835cc; // coined; docs/systems/saves.md: (skills, stream): the 18 skills PakSave.WriteSheet writes, each into its base and modified level
Skills.Save = 0x80083434; // coined; docs/systems/saves.md: (skills, stream): skills 0 to 11, 15, 16, 17, 20, 21 and 23, 4 bits each
Stats.Save = 0x800845fc; // coined; docs/systems/saves.md: (stats, stream): Base then health, each in the order Stamina 8 bits, Endurance 6, Level 6, Willpower 5, Intelligence 5, Strength 5, Dexterity 5
Stats.Load = 0x80084708; // coined; docs/systems/saves.md: (stats, stream): the same, then base and modified copied from them
Inventory.Load = 0x8007c81c; // coined; docs/systems/saves.md: (inventory, stream): vtable +0x24: 128 stacks of a quantity and an item, the reserved items' quantities, the key items from their flags, the 13 key gear and the old potion replaced
Inventory.Save = 0x8007c8f4; // coined; docs/systems/saves.md: (inventory, stream): vtable +0x2C: 128 stacks of a quantity (8 bits) and an item (28), the 80 reserved quantities, the 13 key gear (slots 239 to 251, an item each)
Inventory.LoadReserved = 0x8007cf28; // coined; docs/systems/saves.md: (inventory, stream): 80 quantities of 8 bits into the slots from 0x80, the items from CodeTable.ReservedItems
Inventory.LoadKeyItems = 0x8007cfa4; // coined; docs/systems/saves.md: (inventory): each of the 31 key items whose flag is set, in the slots from 0xD0
Inventory.LoadKeyGear = 0x8007d024; // coined; docs/systems/saves.md: (inventory, stream): the 13 slots from 239, each an item of quantity 1
Inventory.SaveReserved = 0x8007d0a8; // coined; docs/systems/saves.md: (inventory, stream): the 80 reserved slots' quantities, 8 bits each
Inventory.SaveKeyGear = 0x8007d10c; // coined; docs/systems/saves.md: (inventory, stream): the 13 slots from 239, an item each, 28 bits, null when the quantity is 0
Inventory.ReplaceOldPotion = 0x8007d214; // coined; docs/systems/saves.md: (inventory): item 0x100B, if held, becomes 0x1004 in the same quantity
MinimapSeen.Load = 0x800512b8; // coined; docs/systems/saves.md: (24 bytes): each piece's seen flag from its bit, in CodeTable.MinimapSections' order
SaveMenu.ScanSlot = 0x80086fd4; // coined; docs/systems/saves.md: (menu): a state of the load scan, a note a call: osPfsFileState, game code NAYE and company 78, a read of 0x1C00 bytes, PakSave.Verify, then SaveMenu.AddSlot, or SaveMenu.AddCorrupt
SaveMenu.AddCorrupt = 0x80087950; // coined; docs/systems/saves.md: (menu, note number): the popup "The game saved in Note %d of the Controller Pak is corrupt." (Common 189) with Delete the corrupt game (190)
SaveMenu.Open = 0x80087f40; // coined; docs/systems/saves.md: (menu, ...): SaveMenu.Create, then a 0x1C00-byte buffer at +0x2C4 filled by PakSave.Make, and -1 at +0x2C8
SaveMenu.CreateNote = 0x8008815c; // coined; docs/systems/saves.md: (menu): the free pages, the extensions A to P in use, the first free one, and Pak.AllocateFile with CHRONICLES, company 0x3738, game code 0x4E415945 and 0x1C00 bytes; no free note is 0x8007EF34, too few pages 0x8007EFF8
SaveMenu.WriteNote = 0x80088464; // coined; docs/systems/saves.md: (menu, file number): Pak.WriteFile of the whole 0x1C00 bytes at offset 0, tried twice on a bad-data error
SaveMenu.LoadSlot = 0x80088850; // coined; docs/systems/saves.md: (menu, slot): Pak.Open, then PakSave.Load of the slot's buffer, menu state 5
Pak.CharCodes = 0x800f2da0; // coined; docs/systems/saves.md: the pak's character set as ASCII, 0x42 characters from code 0: NUL, space at 0xF, 0-9 from 0x10, A-Z from 0x1A
Pak.Ports = 0x800f2e94; // coined; docs/systems/saves.md: pointer to the controllers' pak records, 0x78 bytes each, the OSPfs at +4
Pak.Lock = 0x800f3088; // coined; docs/systems/saves.md: the OSMesgQueue every Pak.* call holds
PakSave.WeatherSnapshot = 0x800f53b0; // coined; docs/systems/saves.md: 16 bytes Weather.Pause fills from the world (floats from +8, +0xC and +0x10, and the byte at +6) and SaveBlock.Write saves x 1000
