Debug

There exists a fair amount of debug functionality leftover in the retail version of Castlevania: Symphony of the Night.

Below is a non-exhaustive list of the debug functionality found within the game.


Debug Print Messages

Debug prints occur throughout the game's execution via calls to FntPrint(...), but this data is not ever displayed to the screen (except when data decompression fails). By enabling debug print functionality, various aspects of the game's current state will be displayed on the screen.

Debug print functionality can be enabled with the following GameShark code:

  1. 800E3D5C 45BF
  2. 800E3D5E 0C00
  3. 800E3D60 FFFF
  4. 800E3D62 2404

This will replace 1 of 3 checks for the hitbox viewing functionality with FntFlush(-1), which will cause calls to FntPrint(...) to be displayed starting at the top-left corner of the screen.

Debug information printed to the screen.


Debug Drawing Environment Counts

When debug prints are enabled, the current counts for each type of polygon can also be viewed with the following GameShark code and pressing the Select button on a 2nd plugged-in controller:

  1. 800E3D70 8BCF
  2. 800E3D72 0C03

Drawing environment information printed to the screen.

Note: The Debug Print Messages code must first be enabled for these counts to be visible.


Debug HBLANK Info

When debug prints are enabled, the current HBLANK count can be displayed with the following GameShark code:

  1. 800BD1C0 0001
  2. 800E3D08 8C70
  3. 800E3D0A 0C03

HBLANK information printed to the screen.

Note: The Debug Print Messages code must first be enabled for this count to be visible.


Tileset / CLUT Viewer

The game includes a tileset viewer that also displays the currently-applied CLUT. The values for the current tileset and CLUT are hardcoded to be 0x20 and 0x200, respectively.

The tileset viewer can be enabled with the following GameShark code:

  1. 800BD1C0 0001
  2. 800E3D00 8AC0
  3. 800E3D02 0C03

However, while the functionality to display this information remains in the game, the functionality to modify the tileset/CLUT values has been omitted from the final game. This results in only the aforementioned values being the only viewable combination.

This limitation can be bypassed with the GameShark code below, which aims to implement similar functionality.

Note: This code is very long. View at your own risk.


Full GameShark Code

The following GameShark code can be used to view different tilesets/CLUTs with the tileset viewer:

  1. 800BD1C0 0001
  2. 800E3D00 D928
  3. 800E3D02 0C04
  4. 801364A0 8009
  5. 801364A2 3C03
  6. 801364A4 749C
  7. 801364A6 2463
  8. 801364A8 0000
  9. 801364AA 9463
  10. 801364AC 8013
  11. 801364AE 3C13
  12. 801364B0 62B4
  13. 801364B2 9674
  14. 801364B4 00A0
  15. 801364B6 3062
  16. 801364B8 0005
  17. 801364BA 1040
  18. 801364BC 0020
  19. 801364BE 3062
  20. 801364C0 0002
  21. 801364C2 1440
  22. 801364C4 0001
  23. 801364C6 2694
  24. 801364C8 FFFE
  25. 801364CA 2694
  26. 801364CC 62B4
  27. 801364CE A674
  28. 801364D0 8014
  29. 801364D2 3C13
  30. 801364D4 900C
  31. 801364D6 9674
  32. 801364D8 A000
  33. 801364DA 3062
  34. 801364DC 0004
  35. 801364DE 1040
  36. 801364E0 2000
  37. 801364E2 3062
  38. 801364E4 0002
  39. 801364E6 1440
  40. 801364E8 0001
  41. 801364EA 2694
  42. 801364EC FFFE
  43. 801364EE 2694
  44. 801364F0 5000
  45. 801364F2 3062
  46. 801364F4 0004
  47. 801364F6 1040
  48. 801364F8 1000
  49. 801364FA 3062
  50. 801364FC 0002
  51. 801364FE 1440
  52. 80136500 0010
  53. 80136502 2694
  54. 80136504 FFE0
  55. 80136506 2694
  56. 80136508 900C
  57. 8013650A A674
  58. 8013650C 8AC0
  59. 8013650E 0803

The following controls can be used on a 2nd plugged-in controller:

Button Description
Circle Display next tileset
Square Display previous tileset
Right Display next CLUT
Left Display previous CLUT
Up Move forwards 16 CLUTs
Down Move backwards 16 CLUTs

Tileset viewer showing the debug tileset and CLUT.

Note: These codes are currently incompatible with the Toggle Layers code.


Level Select

Within the level select functionality, the currently-selected level is displayed via FntPrint(...), thus it is recommended to enable debug prints. Otherwise, the only feedback from changing the currently-selected level is an audio cue (the same audio cue in the E3 demo).

Level select functionality can be enabled with the following GameShark code:

  1. 801B4A38 0004

The level select menu can then be entered by pressing Start at the main menu. The following controls are used for the level select menu:

Button Description
Right Move forwards 1 level
Down Move forwards 8 levels
Left Move backwards 1 level
Up Move backwards 8 levels
Start Load the currently-selected level

Loading the debug room via the level select menu.


E3 Demo Functionality

The "NORMAL / SPECIAL" selection functionality found in the E3 demo can be enabled with the following GameShark code:

  1. 801B4834 0004

However, this will not cause the background to fade nor will it display the "SELECT !!" text as the code to do this has been removed. Instead, it will display an offset blinking rectangle with the same selection audio cue found in the E3 demo.

E3 mode selection functionality being used in the final game.


Hitbox Viewer

The hitboxes of most entities (e.g. Alucard, enemies, pickups, breakables, etc.) can be viewed by using the following GameShark code:

  1. 800BD1C0 0001
  2. 801362B0 0001

Hitboxes along the Stone Rose entity.

Hitboxes of the poison mist.

Hitboxes for each of the Dodo Bird's feathers.


Noclip Mode

Within this mode, it is possible to move through all collision and cycle through each of Alucard's sprites one frame at a time. It is also possible to disable Alucard's sprite entirely to get a better view of the area, as well as the ability to enable and disable this functionality on command.

You can enable this functionality by entering the following GameShark code, then pressing L2 to enable/disable Noclip mode:

  1. 80098850 0001

The following controls are used in noclip mode:

Button Description
D-Pad Move 16 pixels in the desired direction
X (hold) + D-Pad Move continuously in the desired direction
Triangle Toggle visilibity of Alucard's sprite
Square Display Alucard's next sprite
Circle Display Alucard's previous sprite
L2 Toggle noclip mode

Video showing debug noclip functionality.

Interestingly, when the button settings screen is displayed, it's hardcoded to only display 7 values. However, if this is modified to display all 8 values, it can be seen that an 8th option does in fact exist, and that this option is mapped to the L2 button by default.

Hidden 8th option within the Button Settings menu.

This is notable because かいはつ (Kaihatsu) directly translates to the English word "Development" and is a common phrase often indicating leftover debugging functionality in Japanese games.


Exit Screen Freeze (?) Mode

The game is able to exit a frozen screen state (undocumented for now) by pressing Down on a 2nd plugged-in controller.


Toggle Layers

The foreground and background layers can be toggled on or off with the following GameShark code:

  1. 800E3D00 C509
  2. 800E3D02 0C03

The following controls can be used on a 2nd plugged-in controller to toggle the layers:

Button Description
L1 Toggle foreground
L2 Toggle background
R1 Unknown (800730A0 ^= 2)

Note: This code is currently incompatible with the Tileset / CLUT Viewer code.


Control Doppleganger10

It is possible to control Doppleganger10 using a 2nd plugged-in controller by using the following GameShark code:

  1. 801C2E10 0000

The following controls can be used to perform special actions while controlling Doppleganger10:

Button Description
R1 Transform into bat
R2 Transform into mist

Video showing Doppleganger10 being controlled using a 2nd controller.


Control Doppleganger40

It is possible to control Doppleganger40 using a 2nd plugged-in controller by using the following GameShark code:

  1. 801C1DD0 0000

The following controls can be used to perform special actions while controlling Doppleganger40:

Button Description
R1 Transform into bat
R2 Transform into mist
Down (hold) + Triangle Perform a high jump

Video showing Doppleganger40 being controlled using a 2nd controller.


Control Richter (Boss Fight)

It is possible to control Richter using a 2nd plugged-in controller by using the following GameShark code:

  1. 801B5A68 0000

The following controls can be used to perform special actions while controlling Richter:

Button Description
Square Attack with Richter's whip
Triangle Item Crash
R1 Blade Dash
R2 Uppercut
Up + Square Use sub-weapon

Richter's item crash will use Holy Cross by default, but can be modified by holding the corresponding button when pressing Triangle:

Button Item Crash
(None) Holy Cross
L1 Spiral Axe
L2 Hydro Storm
Start Lightning Bolt
Select Bible

Additionally, the sub-weapon that Richter uses is based on the following criteria:

  • Cross: Used by default.
  • Holy Water: Used when Richter is within 80 pixels of Alucard, or when Richter is at least 24 pixels above Alucard.
  • Axe: Used when Alucard is at least 24 pixels above Richter.

Video showing Richter being controlled using a 2nd controller.


Load "dra000.bmp"

There exists functionality to attempt to load the file sim:c:\\bin\\dra000.bmp while holding up and pressing Select on a 2nd plugged-in controller.

However, this will always crash the game since the function attempts to store the current framebuffer to memory address 0x80200000.


Load "dra000.mov"

There exists functionality to attempt to load the file sim:c:\\bin\\dra000.mov when pressing the Triangle button on the main controller.

This function will briefly display an error on screen before returning. However, forcing the game to skip this return will cause the game to crash since the same write to memory address 0x80200000 occurs immediately thereafter.

Load for dra000.mov fails and displays an error.


Underground Caverns Barrier Skip

The barrier separating the Underground Caverns from the Abandoned Pit can be broken by pressing the Triangle button on a 2nd plugged-in controller.

Note that this does not need a code to work and can be performed in-game with no modifications whatsoever.

This skips the need to travel across the waterfall gap and spawn the Skeleton Ape, as well as waiting for the Skeleton Ape to throw the barrel at the barrier.

Video showing the barrier being immediately broken using a 2nd controller.

Additionally, in the bottom-left room with the Oarsman directly under the Castle Entrance loading area, the Triangle button can be pressed on a 2nd plugged-in controller to play the same sound as the barrier breaking.

The player may need to enter the area from the right-hand side or travel right far enough to spawn the entity responsible for this functionality.


Sprite Viewer

There are many sprites in the game that can be viewed by using a 2nd plugged-in controller.

Unless otherwise noted, the controls for each sprite viewer are as follows:

Button Description
Circle Display previous sprite
Square Display next sprite

Below is a list of sprites and their accompanying locations where this can be performed.


Blade Master (Colosseum)

A Sprite viewer for the Blade Master can be accessed by setting the entity's current_state property to 0xFF.

Sprite viewer for the Blade Master entity.


Owl Knight (Colosseum)

A sprite viewer for the Owl Knight can be accessed by setting the entity's current_state property to 0x10.

Sprite viewer for the Owl Knight entity.


Valhalla Knight (Colosseum)

A sprite viewer for the Valhalla Knight can be accessed by setting the entity's current_state property to 0xFF.

Sprite viewer for the Valhalla Knight entity.


Bone Ark (Catacombs)

A sprite viewer for the Bone Ark can be accessed by setting the entity's current_state property to 0x10.

Sprite viewer for the Bone Ark entity.


Wall (Abandoned Mine)

A sprite viewer for the wall can be accessed by setting the entity's current_state property to 0x10.

Sprite viewer for the wall entity.


Bone Pillar (Royal Chapel)

A sprite viewer for the Bone Pillar can be accessed by setting the entity's current_state property to 0xFF.

Sprite viewer for the Bone Pillar entity.


Skelerang (Royal Chapel)

A sprite viewer for the Skelerang can be accessed by setting the entity's current_state property to 0x10.

Sprite viewer for the Skelerang entity.


Spectral Sword (Royal Chapel)

A sprite viewer for the Spectral Sword can be accessed by setting the entity's current_state property to 0xFF.

Sprite viewer for the Spectral Sword entity.


Winged Guard (Royal Chapel)

A sprite viewer for the Winged Guard can be accessed by setting the entity's current_state property to 0xFF.

Sprite viewer for the Winged Guard entity.


Succubus (Nightmare)

A sprite viewer for the Succubus can be accessed by setting the entity's current_state property to 0xFF.

Sprite viewer for the Succubus entity.


Furniture (Long Library)

A sprite viewer for the furniture can be accessed by setting the entity's current_state property to 0xFF.

Sprite viewer for the furniture entity.


Flying Zombie (Long Library) [Unused]

A sprite viewer for the Flying Zombie can be accessed by setting the entity's current_state property to 0x10.

Sprite viewer for the Flying Zombie entity.


Spellbook (Long Library)

A sprite viewer for the Spellbook can be accessed by setting the entity's current_state property to 0x20.

Note: This sprite viewer uses the following controls on controller 2:

Button Description
Right Increase Z value (rotate along Y axis)
Left Decrease Z value (rotate along Y axis)
Circle Increase Y value (rotate along Z axis)
Square Decrease Y value (rotate along Z axis)
Triangle Increase X value (rotate along X axis)
X Decrease X value (rotate along X axis)
Select Reset all coordinates

Additionally, the following controls are used on controller 1:

Button Description
Up Increase HZ value (move further away)
Down Decrease HZ value (move closer)

Sprite viewer for the Spellbook entity.


Lesser Demon (Long Library)

A sprite viewer for the Lesser Demon can be accessed by setting the entity's current_state property to 0xFF.

Sprite viewer for the Lesser Demon entity.


Slogra (Castle Entrance)

A sprite viewer for Slogra can be accessed by setting the entity's current_state property to 0xFF.

Sprite viewer for the Slogra entity.


Gaibon (Castle Entrance)

A sprite viewer for Gaibon can be accessed by setting the entity's current_state property to 0xFF.

Sprite viewer for the Gaibon entity.


Minotaur (Reverse Colosseum)

A sprite viewer for the Minotaur can be accessed by setting the entity's current_state property to 0xFF.

Sprite viewer for the Slogra entity.


Azaghal (Reverse Colosseum)

A sprite viewer for Azaghal can be accessed by setting the entity's current_state property to 0xFF.

Note: This sprite viewer uses the following controls on controller 2:

Button Description
Right Increase Z value (rotate along Y axis)
Left Decrease Z value (rotate along Y axis)
Circle Increase Y value (rotate along Z axis)
Square Decrease Y value (rotate along Z axis)
Triangle Increase X value (rotate along X axis)
X Decrease X value (rotate along X axis)

Sprite viewer for the Azaghal entity.


Frozen Half (Reverse Catacombs)

A sprite viewer for the Frozen Half can be accessed by setting the entity's current_state property to 0xFF.

Sprite viewer for the Frozen Half entity.


Wall (Cave)

A sprite viewer for the wall can be accessed by setting the entity's current_state property to 0x10.

Sprite viewer for the wall entity.


Azaghal (Death Wing's Lair)

A sprite viewer for Azaghal can be accessed by setting the entity's current_state property to 0xFF.

Note: This sprite viewer uses the following controls on controller 2:

Button Description
Right Increase Z value (rotate along Y axis)
Left Decrease Z value (rotate along Y axis)
Circle Increase Y value (rotate along Z axis)
Square Decrease Y value (rotate along Z axis)
Triangle Increase X value (rotate along X axis)
X Decrease X value (rotate along X axis)

Sprite viewer for the Azaghal entity.


Flying Zombie (Death Wing's Lair)

A sprite viewer for the Flying Zombie can be accessed by setting the entity's current_state property to 0x10.

Sprite viewer for the Flying Zombie entity.


Dark Octopus (Reverse Caverns)

A sprite viewer for the Dark Octopus can be accessed by setting the entity's current_state property to 0x10.

Sprite viewer for the Dark Octopus entity.


Fire Demon (Necromancy Laboratory)

A sprite viewer for the Fire Demon can be accessed by setting the entity's current_state property to 0x20.

Sprite viewer for the Fire Demon entity.


Dracula (Final Stage: Bloodlines)

A sprite viewer for Dracula can be accessed by setting the entity's current_state property to 0xFF.

Sprite viewer for the Dracula entity.


Unknown (Olrox's Quarters)

A sprite viewer for an unknown entity that can be accessed by setting the entity's current_state property to 0x10.

Sprite viewer for an unknown entity.


Olrox (Olrox's Quarters)

A sprite viewer for Olrox can be accessed by setting the entity's current_state property to 0x20.

Sprite viewer for the Olrox entity.


Wall (Olrox's Quarters)

A sprite viewer for the wall can be accessed by setting the entity's current_state property to 0xFF.

Sprite viewer for the wall entity.


Skelerang (Olrox's Quarters) [Unused]

A sprite viewer for the Skelerang can be accessed by setting the entity's current_state property to 0x10.

Sprite viewer for the Skelerang entity.


Owl Knight (Olrox's Quarters) [Unused]

A sprite viewer for the Owl Knight can be accessed by setting the entity's current_state property to 0x10.

Sprite viewer for the Owl Knight entity.


Owl Knight (Olrox's Quarters) [No Owl, Unused]

A sprite viewer for the Owl Knight (without the owl) can be accessed by setting the entity's current_state property to 0x20.

Sprite viewer for the Owl Knight entity.


Granfaloon (Catacombs)

A sprite viewer for Granfaloon can be accessed by setting the entity's current_state property to 0xFF.

Sprite viewer for the Granfaloon entity.


Minotaurus (Colosseum)

A sprite viewer for the Minotaurus can be accessed by setting the entity's current_state property to 0xFF.

Sprite viewer for the Minotaurus entity.


Werewolf (Colosseum)

A sprite viewer for the Werewolf can be accessed by setting the entity's current_state property to 0xFF.

Sprite viewer for the Werewolf entity.


Gate (Colosseum)

A sprite viewer for the gate can be accessed by setting the entity's current_state property to 0xFF.

Sprite viewer for the gate entity.


Wall (Colosseum)

A sprite viewer for the wall overlay (which hides the gate) can be accessed by setting the entity's current_state property to 0xFF.

Sprite viewer for the wall overlay entity.


Scylla (Underground Caverns)

A sprite viewer for Scylla can be accessed by setting the entity's current_state property to 0xFF.

Sprite viewer for the Scylla entity.


Hippogryph (Royal Chapel)

A sprite viewer for Hippogryph can be accessed by setting the entity's current_state property to 0xFF.

Note: This sprite viewer uses the following controls on controller 1:

Button Description
Square Display next sprite

Sprite viewer for the Hippogryph entity.


Wall (Abandoned Mine)

A sprite viewer for the wall can be accessed by setting the entity's current_state property to 0x10.

Sprite viewer for the wall entity.


Cerberos (Abandoned Mine)

A sprite viewer for Cerberos can be accessed by setting the entity's current_state property to 0xFF.

Sprite viewer for the Cerberos entity.


Gate (Reverse Colosseum)

A sprite viewer for the gate can be accessed by setting the entity's current_state property to 0xFF.

Sprite viewer for the gate entity.


Wall (Reverse Colosseum)

A sprite viewer for the wall overlay (which hides the gate) can be accessed by setting the entity's current_state property to 0xFF.

Sprite viewer for the wall overlay entity.


Fake Trevor (Reverse Colosseum)

A sprite viewer for Fake Trevor can be accessed by setting the entity's current_state property to 0xFF.

Sprite viewer for the Fake Trevor entity.


Fake Grant (Reverse Colosseum)

A sprite viewer for Fake Grant can be accessed by setting the entity's current_state property to 0xFF.

Sprite viewer for the Fake Grant entity.


Fake Sypha (Reverse Colosseum)

A sprite viewer for Fake Sypha can be accessed by setting the entity's current_state property to 0xFF.

Sprite viewer for the Fake Sypha entity.


Coffin (Reverse Colosseum)

A sprite viewer for the coffin can be accessed by setting the entity's current_state property to 0xFF.

Sprite viewer for the coffin entity.


Beelzebub (Necromancy Laboratory)

A sprite viewer for Beelzebub can be accessed by setting the entity's current_state property to 0xFF.

Sprite viewer for the Beelzebub entity.


Death (Cave)

A sprite viewer for Death can be accessed by setting the entity's current_state property to 0xFF.

Sprite viewer for the Death entity.


Death (Cave) [2nd Form]

A sprite viewer for Death can be accessed by setting the entity's current_state property to 0xFF.

Sprite viewer for the Death entity.


Medusa (Anti-Chapel)

A sprite viewer for Medusa can be accessed by setting the entity's current_state property to 0xFF.

Sprite viewer for the Medusa entity.


The Creature (Reverse Outer Wall)

A sprite viewer for The Creature can be accessed by setting the entity's current_state property to 0xFF.

Sprite viewer for the The Creature entity.


Dracula (Reverse Castle Center)

A sprite viewer for Dracula can be accessed by setting the entity's current_state property to 0xFF.

Sprite viewer for the Dracula entity.


Wall (Death Wing's Lair)

A sprite viewer for the wall can be accessed by setting the entity's current_state property to 0xFF.

Sprite viewer for the wall entity.


Akmodan II (Death Wing's Lair)

A sprite viewer for Akmodan II can be accessed by setting the entity's current_state property to 0xFF.

Sprite viewer for the Akmodan II entity.