Common pitfalls

Check your hardware before checking your code...

=Unwanted resets=
 * The watchdog isn't reset often enough, write a byte to 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.
 * or 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.
 * 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.