Skip to content

Latest commit

 

History

72 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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, ManCloud

Software

Homebrew Games / Programs

ROM Patches

Patches for running Game Boy games on the MegaDuck

Homebrew Music Tools

Emulators/FPGA Re-implementations

Development Tools

SDKs / Build related

C language
ASM
  • hardware.inc for MegaDuck: Hardware constants and addresses for use with asm/RGBDS
  • Asm83 - An Assembler, linker and librarian for retro CPUs including the sm83 (MegaDuck, Game Boy)

Music / SFX

Peripherals

  • 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

Hardware

Flash Cartridges

Hardware Schematics / PCB Info

Adapters

Display mod / LCD Header info

Laptop model Gamepad

Serial Link Port

  • 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

Cartridge Pinout

AC Adapters

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

USB Video Streaming

MBCs / Bank Switching

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

MD0

  • Extension: .md0
  • Informal MBC: 0xE0
  • Register: 0x1000
    • ROM Bank: Write 0 - 15 in Lower Nibble (mask 0x0F), switches full 32K ROM region
    • SRAM Bank: Write (0 - 3) in Upper Nibble (mask 0x30), 8K banks at 0xA000 - 0xBFFF, No SRAM enable
      • Note: SRAM is a secondary cart in memory cart slot
  • 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.

No MBC

  • Extension: .duck, .bin
  • 32K with NO switchable banks
  • No SRAM
  • Extension .bin is 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

MD1

  • Extension: .md1
  • Informal MBC: 0xE1
  • ROM Bank Register: 0xB000, Write 0 - 1, switches full 32K ROM region at (0x0000 - 0x7FFF)
  • No SRAM
  • Games: Puppet Knight, Suleiman’s Treasure

MD2

  • Extension: .md2
  • Informal MBC: 0xE2
  • ROM Bank Register: 0x0001, Write 1 - 3 or 1 - 7, switches upper 16K ROM at 0x4000 - 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

MD20S

  • 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 (mask 0x30), 8K banks at 0xA000 - 0xBFFF, No SRAM enable
  • Games: QR-Paint, Workboy (rom patch)

MD25S

  • Like MD2, but with the MBC5 SRAM memory
  • Extension: .md25s
  • Informal MBC: 0xE4
  • Additional Registers:
    • SRAM Bank: 0x4000, Write (0 - 15) 8K banks at 0xA000 - 0xBFFF
    • SRAM Enable: 0x0000, Write 0x0A to enable SRAM, other values to disable SRAM
  • Games: Pokemon Red/Blue (rom patch)

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:

  • 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

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:

  • 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 toward 0xFFFF / 0x0000
    • Laptop Model: Based on System ROM design (no stack init before first call/ret) it appears SP is NOT 0x0000 at power-on
      • Possibly it's something like 0xFFFE or lower which would allow pushing and popping the stack before init without a resulting crash
  • 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)

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

  • Addr Change means 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

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

About

Collection of Mega Duck console dev tools, technical documentation / info and resources

Topics

Resources

Stars

8 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors