/DMG-CPU-Inside

Reverse-engineered schematics for DMG-CPU-B

Creative Commons Attribution Share Alike 4.0 InternationalCC-BY-SA-4.0

DMG-CPU-Inside

This repo contains an annotated overlay for the Nintendo Game Boy DMG-CPU-B chip die and the extracted schematics.

DMG-CPU-B die vector overlay

This was done manually with only a few automated checks so THERE'S A HIGH RISK OF ERROR. I'm in no way responsible if you made someone's life depend on this and it fucked up.

What is done:

  • All APU logic.
  • All PPU logic.
  • All I/O and timer logic.
  • All DMA logic.
  • All interrupt logic.
  • Various stuff used for testing/debugging.

What isn't done:

  • CPU. Why: it's a standalone core which doesn't use the standard cell topology. Visibility isn't good enough and it's too complex for me, sorry.
  • Clock complements. Why: They don't affect functionality. Only required because the DFF cells need a clock and its complement to work.
  • Some analog parts. Why: Poor visibility, lazyness.
  • Some cell groups related to embedded ROM and RAM blocks. Why: They don't affect functionality.

How to use

Just read the schematics :)

If you want to use the overlay:

  • Get Inkscape
  • Download the die picture from Digshadow
  • Resize it to 8000px wide if you're using Inkscape 0.92.2, otherwise it may freeze
  • Download the SVG overlay
  • Open the overlay in Inkscape, import the die picture (chose link, not embed), stick it under the overlay layers, align it and lock it in place
  • Have "fun"

Notes

Nets named FROM_CPU* and TO_CPU are connected to the CPU core but are not clearly identified. Many of them are trigger and acknowledge signals for interrupts. Others might be state indicators like the Z80 /M1 or HALT.

Some DFF clock polarities have to be verified.

The parallel-in-serial-out shift registers used for the serial link and video rendering are made of chains of set-reset-capable DFFs. Their loading logic require a lot of cells and seem complex, but in the end it forms something quite simple.

Rather than using multiplexers, many internal busses are instead tri-state capable. The "TRIBUFFER" cells are extensively used for this.

Mysteries

  • Bit 4 and 5 of FF26 (NR52) can be written to.
    • Bit 4 sets NET03 (APU test mode ?).
    • Bit 5 allows software clocking of the CH1 sweep timer when NET03 is high.
  • Bit 0 of FF23 (NR44) can be read. It relates to the CH4 prescaler.
  • The current wave RAM address can be read in bits 4~0 of FF1C (NR32) when NET03 is high.
  • The whole chip can be made a slave for an external CPU by using the test pins. This was already discovered by @Gekkio and maybe others.
  • Probably other things I missed...

PAQ (Potentially Asked Questions)

  • Why ?

It is well known by emulator authors that the Game Boy is full of quirks. Knowing exactly how and when signals change can help reaching perfect accuracy.

  • Why are the schematics not in an editable format ?

Because I used proprietary CAD software for speed and I didn't finish making the converter for the KiCAD format. I hope to be able to do that soon.

  • What's up with the cell labels ?

They're random, unique names. The first letter corresponds to the column they're in on the silicon die.

  • Many small lines aren't traced, why ?

I didn't bother tracing branching lines when their end point was near enough to see it on my 15" screen at the zoom level I used. They're reported on the schematic, of course.

  • Why are there copies of logic blocks providing identical functions ?

It's a way to trade off die space for speed, it seems weird but it's useful. Look up "logic duplication".

  • I found a mistake, how can I report it ?

Until I get the files exported in KiCAD format, please open an issue and describe what's wrong (cell name, net name, position on die, ...).

  • How did you know which cells did what ?

I had to take guesses. Inputs and outputs are easily identified and the cell size gives some clues. When connections are made on the schematic, it becomes quickly obvious when a guess is wrong. Check out the cell zoo.

  • How long did it take ?

Identifying the cells, isolating them, tracing the connections and the schematics took 191 hours.

If you find it worth it, I accept donations through Paypal: paypal.me/furrtek

Thanks to Gekkio, Tanjent and Kevin Murphy for the help.