Common pitfalls

From NeoGeo Development Wiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Check your hardware before checking your code...

Unwanted resets

  • The watchdog isn't reset often enough, write a byte to REG_DIPSW at least each frame.
  • An exception is occuring, set up a simple 68k exception handling screen to debug your code.
  • Misaligned word or longword read/write (address error)
  • RTS with wrong return address in stack (or bad SP ?)
  • JSR instead of JMP
  • Jump table with bad index (address error)
  • Timer interrupt too fast, causes stack to explode

Invisible sprites

  • Sprites are disabled (NeoGeo CD only, they're enabled by default)
  • The fix layer is filled with non-transparent tiles which hide everything.
  • Sprite position is out of the 320*224 visible area.
  • Sprite height is set to 0 (SCB3).
  • Sprite tiles are all transparent (bad tile numbers ?).
  • Tile colors are the same as the backdrop color.
  • Wrong palette bank.
  • Shrinking values too low (at least 2 pixels should still be visible).
  • Bad C ROM, it happens...
  • Reference color (0) is not black.

Invisible fix layer

  • Fix is disabled (NeoGeo CD only, enabled by default)
  • No non-transparent tiles mapped (bad S ROM ?)
  • Tile colors are the same as the backdrop color.
  • Tiles are on the invisible borders.
  • Reference color is not black.

Wrong colors

  • The wrong palette bank is selected.
  • Reference color is not black.
  • Palettes loading routine is broken (byte load instead of word, bad offset...).
  • Tiles are assigned to an uninitialized palette.

Erratic sprite movement or display

  • Sprite is driven by the previous one.
  • REG_VRAMRW or REG_VRAMMOD writes too fast.
  • Never use CLR instructions on LSPC registers.
  • The Timer interrupt routine has VRAM writes which interferes with the VBlank interrupt routine. Disable the Timer interrupt when out of the display area.

Interrupts don't work

  • Some emulators ignore the timer interrupt, it may work on the real hardware.
  • The interrupt mask causes them to be ignored by the 68k. Check the SR register.
  • Wrong configuration of the timer interrupt, see REG_LSPCMODE.
  • The interrupt vector points to an RTE or RTS. Beware of the different levels between cart and CD systems.

Game doesn't boot (goes directly to the crosshatch)

  • Check the "NEO-GEO" string at $100
  • Check the security code and pointer at $182
  • NGH number at header $108 must be greater than 0

Game isn't recognized on Neo CD

  • Check that all files in IPL.TXT are present
  • Check that IPL.TXT ends with CR+LF
  • Check if the ABS, CPY and BIB files are present and that they contain the right data

Vblank routine is long

  • Stop the timer interrupt when out of the active display. The timer interrupt can be very mean.