A collection of technical information and resources for the Mega Duck console brought together in one place. Much of it researched by others, some by me (minor sound reg fixes, laptop model docs, some ports and patches, etc).
- Sean Riddle
- MAME: 1 2 3
- MiSTer
Sean Riddle, Ruud van Falier, Nitro2k, Toxa, Youkal3, Zwenergy, Inside Gadgets, Kuddel, ManCloud
- Browse releases (and find source code links) on the MegaDuck Homebrew and ROM Hack showcase.
- There's also a view for showing what's new
Patches for running Game Boy games on the MegaDuck
- See ROM patches in the MegaDuck Homebrew and ROM Hack showcase
-
- Fork of SameBoy with support for MegaDuck Handheld and Laptop models (Development oriented)
- Has correct audio emulation
-
MiSTer Game Boy/MegaDuck core:
- Has support for MegaDuck Handheld and Laptop models models
- Has correct audio emulation
-
SameDuck branch of SameBoy (modified version of SameBoy, not pre-built)
- GBDK-2020: C dev kit, supports Mega Duck as a build target
- Cate83 - A C-like programming language compiler for sm83 cpus (MegaDuck, Game Boy)
- There are several example game programs for the MegaDuck
- hardware.inc for MegaDuck: Hardware constants and addresses for use with asm/RGBDS
- Newer hardware.inc base version
- Asm83 - An Assembler, linker and librarian for retro CPUs including the sm83 (MegaDuck, Game Boy)
- Mega Duck port of the hUGE Driver Game Boy music driver
- Mega Duck port of the CBTFX Game Boy Sound FX driver
- Sample code for interfacing with the MegaDuck Laptop model Keyboard, RTC and speech module (Quique and Junior Computer). See related partial docs
- Audio recordings of the 6 built-in speech phrases for the German and Spanish MegaDuck Laptop models
- picoDuck by zwenergy an Open-source RP2040-based flash cart
- Alternate firmware which supports up to 1MB ROMs with the MD2 (only) type MBC (required for some homebrew and rom patches)
- A2 Heaven multi-flash cart
- Inside Gadgets 32K flash cart - Compatible with GBXCart flasher
- 3D Printable cartridge shell
- Adapter to plug Game Boy (flash) carts into the MegaDuck
- Alternate sub board design which has the cart sticking up instead of down
- Display adapter board by zwenergy for Game Boy DMG style display kits
- Ruud van Falier's DMG IPS adapter mod
- Game Boy Pocket (MGB) to Mega Duck display adapter
- Info for building a replacement Gamepad / "Mouse" for the MegaDuck Laptop model
- The link port on the Mega Duck has the same pin order and signals as the Game Boy, but a different connector style (bare header).
- The serial control registers have the same address, control flags and behavior as a the Game Boy
With the use of a connector style adapter a Mega Duck and a Game Boy can exchange data over their link ports.
Diagram showing the link port receptacle*1 pinout when looking at the side of the console:
Front of console
-----------------------------------
|
-------- ----------------- |
volume | | CLK SIN VCC*2 | |
dial | | GND - SOUT | |
-------- ----------------- |
|
-----------------------------------
Back of console
- 1: View and pinout is of the connector receptacle, not of the cable
- 2: For most uses the VCC pin should not be connected
- Mega Duck Cart Dumping
- Scans:
Handheld
- 3.5 mm exterior, 1.35mm interior
- 6 volts, centrer NEGATIVE polarity
Laptop
- 3.5 mm exterior, 1.35mm interior
- 9 volts, centrer POSITIVE polarity
- Example picture
- MegaDuck Interceptor Modified firmware for the GB Interceptor which allows it to work with a MegaDuck. The device streams emulated video from the console over USB. Requires cart slot adapter for the device to connect to the MegaDuck.
| Extension | Informal # | Switchable ROM Bank | Max | ROM Bank Range | SRAM Bank | Max | SRAM Bank Range | SRAM Reg Style |
|---|---|---|---|---|---|---|---|---|
.duck,.bin |
fixed | 32K | none | 0 | ||||
.md0 |
0xE0 |
32K (0x0000-0x7FFF) |
512K | 0 - 15 | 8K | 32K | 0 - 3 | MD0 |
.md1 |
0xE1 |
32K (0x0000-0x7FFF) |
64K | 0 - 1 | none | 0 | ||
.md2 |
0xE2 |
16K (0x4000-0x7FFF) |
256K | 1-3 or 1-7 | none | 0 | ||
.md20s |
0xE3 |
16K (0x4000-0x7FFF) |
4MB | 1 - 255 | 8K | 32K | 0 - 3 | MD0 |
.md25s |
0xE4 |
16K (0x4000-0x7FFF) |
4MB | 1 - 255 | 8K | 128K | 0 - 15 | MBC5 |
- Extension:
.md0 - Informal MBC:
0xE0 - Register:
0x1000- ROM Bank: Write
0 - 15in Lower Nibble (mask0x0F), switches full 32K ROM region - SRAM Bank: Write (
0 - 3) in Upper Nibble (mask0x30), 8K banks at0xA000 - 0xBFFF, No SRAM enable- Note: SRAM is a secondary cart in memory cart slot
- ROM Bank: Write
- Games/Programs: Laptop System ROM, Bilder Lexikon, DataBank (requires SRAM cart)
- Laptop Games: MegaDuck_Laptop_BilderLexikon.md0, MegaDuck_Laptop_DataBank.md0
- System ROMs: MegaDuck_Laptop_SystemROM_German.md0, MegaDuck_Laptop_SystemROM_Spanish.md0
- Games: Duck Duck Wordyl
- Note: Delay of ~41 M-Cycles used (executed from WRAM) after writing bank switch before resuming execution in ROM. Unclear if required.
- Extension:
.duck,.bin - 32K with NO switchable banks
- No SRAM
- Extension
.binis used for banked ROMs with some emulators - Games: Arctic Zone, Bomb Disposer, Magic Maze, Pile Wonder, Street Rider, The Brick Wall, Trap and Turn, Vex
- Extension:
.md1 - Informal MBC:
0xE1 - ROM Bank Register:
0xB000, Write0 - 1, switches full 32K ROM region at (0x0000 - 0x7FFF) - No SRAM
- Games: Puppet Knight, Suleiman’s Treasure
- Extension:
.md2 - Informal MBC:
0xE2 - ROM Bank Register:
0x0001, Write1 - 3or1 - 7, switches upper 16K ROM at0x4000 - 0x7FFF - Fixed 16K lower bank 0 at
0x0000 - 0x3FFF - No SRAM
- Laptop Games: MegaDuck_Laptop_MusikModul.md2
- Games: 2nd Space, Ant Soldiers, Armour Force, Beast Fighter, Black Forest Tale, Captain Knick Knack, Commin Five in One, Duck Adventures, Four in One, Magic Tower, Railway, Snake Roy, Worm Visitor, Zipball
- Like
MD2, but with the MD0 SRAM memory cart plugged in to the laptop - Extension:
.md20s - Informal MBC:
0xE3 - Additional Register:
- SRAM Bank:
0x1000, Write (0 - 3) in Upper Nibble (mask0x30), 8K banks at0xA000 - 0xBFFF, No SRAM enable
- SRAM Bank:
- Games: QR-Paint, Workboy (rom patch)
- Like
MD2, but with the MBC5 SRAM memory - Extension:
.md25s - Informal MBC:
0xE4 - Additional Registers:
- SRAM Bank:
0x4000, Write (0 - 15) 8K banks at0xA000 - 0xBFFF - SRAM Enable:
0x0000, Write0x0Ato enable SRAM, other values to disable SRAM
- SRAM Bank:
- Games: Pokemon Red/Blue (rom patch)
MBC type per game is according to Reddit
Game Boy ROMs contain an embedded meta-data header which (usually) indicates the type of MBC (Memory Bank Controller) used. This allows emulators to automatically emulate the correct cart hardware (the Game Boy hardware itself ignores this and doesn't need it since the cart hardware is present).
OEM Mega Duck ROMs lack this header which means that emulators have to use other methods to infer what type of cart MBC is required by a given ROM.
The main methods for selecting the right MegaDuck cart MBC:
- By File Extension (
.md1= 32K banks,.md2= Upper 16K Banks,.bin= 32k no mbc)- Analogue Pocket OpenFPGA MegaDuck Core
- By hashes of the ROMs
- MAME (partially)
- By emulating both MBC styles at the same time in case a game uses either. This works since the two MBCs use a different register address.
- MAME (partially), MiSTer
- Handheld Model: No System/Boot ROM
- CEFA Toys Super Quique Laptop Model (Spanish): Partial disassembly of the System ROM
- Hartung Super Junior Computer (German)
Developing for the Mega Duck is mostly identical (cpu & integrated peripherals) to the Original Game Boy though it has a couple changes listed below.
Register and flag names will mostly follow those in the Game Boy dev hardware.inc, but may have some GBDK-isms.
Most of this research was done by others, I've added a small amount.
Physical / Hardware:
- Different cartridge pinout / connector
- Different serial link port connector shape
Programming:
- No Boot ROM
- Cartridge Boot Logo: not present on Mega Duck
- Cartridge Header data: not present on Mega Duck
- Checksum header: not present on Mega Duck. Do not apply checksum to ROM after building as on the Game Boy
- Program Entry Point:
0x0000(on Game Boy:0x0100) - Initial registers
- Handheld Models: (
AF, BC, DE, HL, SP) are random at startup (due to lack of boot rom) with some affinity toward0xFFFF/0x0000 - Laptop Model: Based on System ROM design (no stack init before first call/ret) it appears SP is NOT
0x0000at power-on- Possibly it's something like 0xFFFE or lower which would allow pushing and popping the stack before init without a resulting crash
- Handheld Models: (
- Serial control
- Laptop Mode: Some Game Boy emulators do not support triggering SC to send before loading the send value into SB, however this is a design pattern that the Laptop System ROM uses to interface with the hardware. So it needs to be implemented to more closely follow the hardware (same for Game Boy).
- For Super Junior SameDuck it is implemented as follows: Writing 0x81 to SC -> Resets serial master clock=low, Does NOT clock the first bit immediately. Instead waits for serial_master_clock to complete a full low->hi->low transition before the first bit gets clocked on negative edge.
- Display registers address and flag definitions: Some changed (details below)
- VRAM data:
- The user program should clear it before use.
- For Handhelds: since a boot ROM does not run on startup it means Tile Map and Pattern data are not cleared and will have (consistent) random data.
- For Laptop models: The System ROM will not clear VRAM before launching a user program from the system menu. The font patterns left in VRAM on program startup can be used to tell the difference between the Super Quique (Spanish) and Super Junior (German) laptop models. See example code.
- Audio registers address and flag definitions: Some changed (details below)
- Different MBC bank switching register addresses than Game Boy MBCs
Laptop:
- Built-in System ROM
- Additional Cart Slot for add-on Memory Card (access not yet documented)
- Peripherals attached via Serial/Link port
- Keyboard + Piano Keys
- RTC
- Cart
- Detached Gamepad
- Mechanism to launch cartridges in the Cart Slot
- External communication port for the printer (type not yet documented)
These changes should be kept in mind when porting Sound Effects and Music Drivers written for the Game Boy.
- Registers
NR12, NR22, NR42, and NR43have their contents nybble swapped.- To maintain compatibility with the Game Boy the value to write (or the value read) can be converted this way:
((uint8_t)(value << 4) | (uint8_t)(value >> 4))
- To maintain compatibility with the Game Boy the value to write (or the value read) can be converted this way:
- Register
NR32has the volume bit values changed.Game Boy: Bits:6..5 : 00 = mute, 01 = 100%, 10 = 50%, 11 = 25%Mega Duck: Bits:6..5 : 00 = mute, 01 = 25%, 10 = 50%, 11 = 100%- To maintain compatibility witht he Game Boy the value to write (or the value read) can be converted this way:
(((~(uint8_t)value) + (uint8_t)0x20u) & (uint8_t)0x60u)
Addr Changemeans deviation from the expected linear incrementing register address order per sound channel that the Game Boy registers follow. The shuffled order on the Mega Duck can break assumptions in Game Boy sound drivers which attempt to write each channel as a sequential block using an incrementing register pointer.
| Reg | Alt Name | Game Boy | Mega Duck | Data Change | Addr Change |
|---|---|---|---|---|---|
| NR10 | rAUD1SWEEP | 0xFF10 | 0xFF20 | ||
| NR11 | rAUD1LEN | 0xFF11 | 0xFF22 | Addr +1 | |
| NR12 | rAUD1ENV | 0xFF12 | 0xFF21 | nybble swap | Addr -1 |
| NR13 | rAUD1LOW | 0xFF13 | 0xFF23 | ||
| NR14 | rAUD1HIGH | 0xFF14 | 0xFF24 | ||
| NR21 | rAUD2LEN | 0xFF16 | 0xFF25 | Addr -1 | |
| NR22 | rAUD2ENV | 0xFF17 | 0xFF27 | nybble swap | |
| NR23 | rAUD2LOW | 0xFF18 | 0xFF28 | ||
| NR24 | rAUD2HIGH | 0xFF19 | 0xFF29 | ||
| NR30 | rAUD3ENA | 0xFF1A | 0xFF2A | ||
| NR31 | rAUD3LEN | 0xFF1B | 0xFF2B | ||
| NR32 | rAUD3LEVEL | 0xFF1C | 0xFF2C | volume bit swizzle | |
| NR33 | rAUD3LOW | 0xFF1D | 0xFF2E | Addr +1 | |
| NR34 | rAUD3HIGH | 0xFF1E | 0xFF2D | Addr -1 | |
| NR41 | rAUD4LEN | 0xFF20 | 0xFF40 | ||
| NR42 | rAUD4ENV | 0xFF21 | 0xFF42 | nybble swap | Addr +1 |
| NR43 | rAUD4POLY | 0xFF22 | 0xFF41 | nybble swap | Addr -1 |
| NR44 | rAUD4GO | 0xFF23 | 0xFF43 | ||
| NR50 | rAUDVOL | 0xFF24 | 0xFF44 | ||
| NR51 | rAUDTERM | 0xFF25 | 0xFF46 | Addr +1 | |
| NR52 | rAUDENA | 0xFF26 | 0xFF45 | Addr +1 |
| LCDC Flag | Game Boy | Mega Duck | Purpose | |
|---|---|---|---|---|
| LCDCF_B_ON | .7 | .7 | (same) | Bit for LCD On/Off Select |
| LCDCF_B_WIN9C00 | .6 | .3 | Bit for Window Tile Map Region Select | |
| LCDCF_B_WINON | .5 | .5 | (same) | Bit for Window Display On/Off Control |
| LCDCF_B_BG8000 | .4 | .4 | (same) | Bit for BG & Window Tile Data Region Select |
| LCDCF_B_BG9C00 | .3 | .2 | Bit for BG Tile Map Region Select | |
| LCDCF_B_OBJ16 | .2 | .1 | Bit for Sprites Size Select | |
| LCDCF_B_OBJON | .1 | .0 | Bit for Sprites Display Visible/Hidden Select | |
| LCDCF_B_BGON | .0 | .6 | Bit for Background Display Visible Hidden Select |
| Register | Game Boy | Mega Duck |
|---|---|---|
| LCDC | 0xFF40 | 0xFF10 |
| STAT | 0xFF41 | 0xFF11 |
| SCY | 0xFF42 | 0xFF12 |
| SCX | 0xFF43 | 0xFF13 |
| LY | 0xFF44 | 0xFF18 |
| LYC | 0xFF45 | 0xFF19 |
| DMA | 0xFF46 | 0xFF1A |
| BGP | 0xFF47 | 0xFF1B |
| OBP0 | 0xFF48 | 0xFF14 |
| OBP1 | 0xFF49 | 0xFF15 |
| WY | 0xFF4A | 0xFF16 |
| WX | 0xFF4B | 0xFF17 |