megaduck-info

Mega Duck / Cougar Boy Console Info

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).

Web version

References

Credits / Thanks

Sean Riddle, Ruud van Falier, Nitro2k, Toxa, Youkal3, Zwenergy, Inside Gadgets, Kuddel

Software

Homebrew Games / Programs

ROM Patches

Patches for running Game Boy games on the MegaDuck

Homebrew Music Tools

Emulators/FPGA Re-implementations

Development Tools

Hardware

Flash Cartridges

Display mod / LCD Header info

Laptop model Gamepad

Cartridge Pinout

AC Adapters

Handheld

Laptop

MBCs / Bank Switching

MBC Controllers

Laptop model System ROM MBC (CEFA Super Quique, Hartung Super Junior Computer):

OEM Games:

MBC type per game is according to Reddit

Implementation in emulators

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:

System ROMs

Porting from Game Boy to Mega Duck

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.

Summary of Hardware changes versus the Game Boy:

Physical / Hardware:

Programming:

Laptop:

Sound Register Value/Data Changes

These changes should be kept in mind when porting Sound Effects and Music Drivers written for the Game Boy.

  1. Registers NR12, NR22, NR42, and NR43 have 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))
  2. Register NR32 has 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)

Sound Register Changes Table

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

Graphics Register Bit Flag Changes

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

Graphics Register Address Changes

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