MyArcade Cabinet Customization
General introduction
The DreamGear, now rebranded MyArcade, micro-player/mini-arcade/etc cabinets are a collection of NES game emulator toys. See The MyArcade Gaming web site
There are a number of MyArcade cabinets, the micro player only play a single title and the mini player play multiple-titles. At time of writing there were 14 different micro player cabinets which all boot to one game only, and two mini player cabinets which boot many titles from namco, or data east.
In reality some contain only one game title whilst others contain many but the power-on game title is determined by make/break pads inside the cabinet PCB.
These units also have a interchangeable no-button, one-button, and two-button game pad tray. This tray can be popped out with a little pressure.
Opening the Cabinet
The cabinet has a sticker left and right of the back of the cabinet. This sticker is best removed with a heat gun, or exacto blade down the seam, or alternatively puncture the screw heads. See below
<<PICTURE OF REMOVAL>>
Removing the Joypad
<<PICTURE HERE>>
Main Circuit board
The main board consists of an emulator chip-on-board ( aka Chip-On-Board or Glob/Blob-top ) , SPI flash chip of 8Mbits (1Mbyte), a PWM speaker driver, and an unknown ASIC.
Silk Screen ID | Chip Designation | Description |
---|---|---|
chip-on-bard ASIC | NES Emulator Chip | |
U2 | SC662K-3.3V | 3.3V LDO |
U3 | GD25Q80C / XT25F08B | 8Mbit SPI Flash |
Q1 | S8550 PNP (2TY) | |
U7 | NO-MARKING | PWM FB1/FB2 back buttons |
U8 | ST3157 | PWM SOUND Switch |
The chip-on-board ASIC, is something like the VT03, which is a complete NES emulator. It includes a 6502 CPU, PPU Graphic Unit with LCD output, SPU Sound Unit, two internal 2KBytes SRAMs, SPI, and some General Purpose I/O controller. It also contains a unique mapper that allows for mapping upto 1MB, maybe more into the small 65KB memory space.
The GPIO comes out to the various joystick and game buttons. Whilst the SPI is used to house various games that are mapped into the 6502 CPU's upper memory region $8000-$FFFF. By selecting the mapping address its possible to load any number of games from the flash.
<mapping graphic>
Dumping the ROM
The SPI ROM cannot have a programmer attached, and the ROM must be disconnected from the +V rail in order to run or boot. Cutting the track and inserting a switch to toggle on the 5V rail works.
Model | SPI ROM Part # | ROM SHA256 | Games Contained |
---|---|---|---|
Mappy | XT25F08B | d0a9ae89205fa078564a4fd6dc778cdcfc045386755e549f1110d7f5b5b4bf02 | Mappy, Pacman, Rolling Thunder, Galaga, Galaxian |
Bubble Bobble | GD25Q08C-SIG (Datasheet) | 0136a88ae8a7bee3a2cbcc196a33a4c284291be18050debb90fa73faef740f5a | Bubble Bobble |
Useful for checking NES images are the CHR rom editors such as NES Sprite Editor. The CHR ROM are hard to spot visually but do have a tendency to contain 00s and "3" characters because of the way the planar data is recorded
A deeper discussion for graphics can be seen at DustMop.io
The TILE and SQUARE mapping can be seen NES FAQ
IOB in Mappy Cabinet
<<PICTURE HERE>>
MSB... LSB
IOB2 -- furthest from chip
IOB3
IOB1 -- closest to chip (overlap to legs area)
000 - Rolling Thunder
001 - PacMan
010 - Galaga
011 - Galaxian
100 - Mappy
101 - DigDug
110 - Mappy
111 - Rolling Thunder
Monitoring SPI Bus
SPI protocol discussion;
- MOSI, multi-drop << WAVEFORM and wiring >>
- QUAD mode << WAVEFORM inc. E7h command >>
- Reason for decoder in python is size of data likely to be seen; not trying to make generic SPI but specific reader
<WAVEFORM PICTURE>
- 100MHZ? FIXME
- sample E7h command + continuous read mode
NOTES;
- Multiple accesses to same memory location, appears to have zero caching
- Other random low-memory accesses to 0x0000 - 0x1FFF
- Accesses are WORD aligned so access to read 0x00F1 means 0x00F0 gets read, then 0x00F2
Decoding the SPI for a simple boot session can look like the following, part way through.
line# 14110198 READ:* 0x7effe(mode=0xa5): 0xf120
line# 14110212 READ:* 0x7effe(mode=0xa5): 0xf120
line# 14110226 READ:* 0x7effe(mode=0xa5): 0xf120
line# 14110240 READ:* 0x7f000(mode=0xa5): 0x0df1
line# 14110254 READ:* 0x7f000(mode=0xa5): 0x0df1
line# 14110268 READ:* 0x7f000(mode=0xa5): 0x0df1
line# 14110282 READ:* 0x7f000(mode=0xa5): 0x0df1
line# 14110296 READ:* 0x7f000(mode=0xa5): 0x0df1
line# 14110310 READ:* 0x7f000(mode=0xa5): 0x0df1
line# 14110408 READ:* 0x7f10c(mode=0xa5): 0x608a
line# 14110422 READ:* 0x7f10c(mode=0xa5): 0x608a
line# 14110436 READ:* 0x7f10c(mode=0xa5): 0x608a
This fits perfectly with the ROM disassembly for this memory location, assuming 0x7_E000 is mapped to m6502 CPU memory at 0xE000.
ROM:EFF4 09 04 ORA #4
ROM:EFF6 8D 4B 41 STA byte_414B
ROM:EFF9 20 0D F1 JSR xsub_F10D_Delay
ROM:EFFC 20 0D F1 JSR xsub_F10D_Delay
ROM:EFFF 20 0D F1 JSR xsub_F10D_Delay <--- here
ROM:F002 20 0D F1 JSR xsub_F10D_Delay
ROM:F005 20 0D F1 JSR xsub_F10D_Delay
ROM:F008 60 RTS
ROM:F008 ; End of function xsub_EF83_CART_DoSomething
ROM:F10C 60 RTS
ROM:F10D xsub_F10D_Delay:
ROM:F10D 8A TXA
The above method was very useful in working out that the System-Test feature used 0x6_3000 for its CHR memory.
SPI 1MB Flash layout
The cabinet starts up with at first accesses to SPI at 0x1000, repeating until around XXXms. This then starts the MOS 6502 which defaults to SPI address 0x7_XXXX. The MOS 6502 RESET vector can be seen as the first read at SPI address 0x7_FFFC and then of course instruction reads happen from the address read from 0x7_FFFC.
The code at 0x7_XXXX ~ 0x7_FFFF is a custom NES Emulator ASIC initialization routine setting various custom values.
- In the case of the bubble bobble cabinet, it copies code to low RAM and this remaps the SPI to 0x?_???? then jumps to that ROM reset vector starting Bubble Bobble
- In the case of the Mappy/XX/YY/ZZ cabinet, it reads IOB pad values, copies code to low RAM which maps 1-of-6 titles, and this remaps the SPI to 0x?_???? then jumps to that ROM reset vector starting Bubble Bobble
Bubble Bobble Cabinet ROM
0_0000 PRG: Bubble Bobble Game
7_B000 Game Entry Table
7_C000 Initial Reset Handler Code
Mappy Cabinet ROM
0_0000 PRG: "BANK0" string, per Rolling Thunder (ROLLING THUNDER : 8000-9FFF)
0_2000 PRG: (ROLLING THUNDER : A000-BFFF)
0_4000 ???: (ROLLING THUNDER : [ Title Screen texts here ] )
0_8000 ???: "BANK2" string, per Rolling Thunder ...
0_A000 ???: More data ...
0_C000 ???: "BANK3" string, per Rolling Thunder ...
0_E000 ???: More data
1_0000 ???: More data
1_2000 ???: More data
1_4000 ???: More data
1_6000 ???: More data
1_8000 ???: More data
1_A000 ???: More data ...
1_A000 ???: More data (ROLLING THUNDER : Unknown data)
1_C000 PRG: ROLLING THUNDER (B000-DFFF)
1_E000 PRG: ROLLING THUNDER (E000-FFFF)
2_0000 CHR: Rolling Thunder
2_2000 CHR: Rolling Thunder
2_4000 CHR: Rolling Thunder
2_6000 CHR: Rolling Thunder
2_8000 CHR: Rolling Thunder
2_A000 CHR: Rolling Thunder
2_C000 CHR: Rolling Thunder
2_E000 CHR: Rolling Thunder
3_0000 CHR: Rolling Thunder
3_2000 CHR: Rolling Thunder
3_4000 CHR: Rolling Thunder
3_6000 CHR: Rolling Thunder
3_8000 CHR: Rolling Thunder
3_A000 CHR: Rolling Thunder
3_C000 CHR: Rolling Thunder
3_E000 CHR: Rolling Thunder
4_0000 PRG: PACMAN
4_2000 PRG: PACMAN
4_4000 CHR: PACMAN
4_6000 CHR: MAPPY
4_8000 PRG: MAPPY
4_A000 PRG: MAPPY
4_C000 PRG: DIGDUG
4_E000 PRG: DIGDUG
5_0000 CHR: DIGDUG
5_2000 CHR: GALAGA
5_4000 PRG: GALAGA?????
5_6000 PRG: GALAGA?????
5_8000 PRG: GALAXIAN
5_A000 PRG: GALAXIAN
5_C000 CHR: GALAXIAN (Weird: Contains strings "MISSION" "DESTROY" "CONVOY" "CHARGER" "READY" "PAUSE" "START" "GALAXIA" )
5_E000 FF..FF..FF..
6_0000 CHR: "4in1" / "PAC-MAN" / "FROGGER" / ???? title names
6_2000 CHR: "4in1" and "380in1" / FONTS / ASTEROID / QBERT / PAC-MAN / ICONS for Qbert/PAC-MAN
6_4000 CHR: "GAMES LIST" / "ENGLiSH/JAPANESE"
7_0000 PRG: Not sure what this applicaiton is, but its a program; mapped to 0x8000
7_2000 ???: Not sure (Up to 7_54D0)
7_5800 ???: Some data
7_A000 ???: Some table
7_A400 ???: Some other table
7_B000 Game Image Mapper Table (See below)
7_C000 Inital boot rom
00: 06 <number of games in cabinet> ....
10: ZERO terminated list of game names
7_F000 Initial boot rom (exec at 7_FFFC as reset vector)
8_0000 FF FF ...
F_FFFF FF FF
Mapping NES Cartridge to SPI Memory
If the ROM is 1 page then it maps to 0xF000, if its two then 0xE000, and so on until 0x8000.
After this the FIRST two pages map to 0x8000 and 0xA0000 respectfully, and the LAST two pages map to
0xC000, and 0xE000
<< Rollercoster thingy ROM example >>
<< PICTURE side by side .... >>
* NES expects
* 0x8000 = PAGE0 : Your Code
* 0xA000 = PAGE1 : Your Code
* 0xC000 = PAGE2 : Your Code
* 0xE000 = PAGE3 : Code + Reset Vectors
* 0xFFF4 COP
* 0xFFF6 N/A
* 0xFFF8 ABORT
* 0xFFFA NMI
* 0xFFFC RESET
* 0xFFFE IRQ/BRK
Controlling the Mapping
Discussion of the MMC, best left to the NESDEV wiki however the
and then discussion of the table at 7_B000.
At reset the ASIC mapps 0x8000-0xAFFF to RAM.
And 0xB000-0xFFFF to SPI Flash at 7_B000-7_FFFF.
In the Mappy/Pacman/Digdug/Galaga/Galaxian/Rolling Thunder cabinet
this section is a rom switcher. It will setup the ASIC correctly,
then will jump to the right game based on IOB shorting.
In BubbleBobble its just a system setup program, and will only jump to the game.
All cabinets also support UP-JOY + SELECT for a test mode.
IOB are read ($4147??) and this is used to select entry from table.
These are loaded into the MMC and the system is restarted.
Initial Reset Code, and Game Table Format
At reset the 0x7_B000 ~ 0x7_FFFF is mapped into the m6502 memory space and the RESET vector is taken. The Mappy and bubble bobble cabinet have similar reset handler code. It looks at the IOB values, uses this with a Game Table at 0x7_B000 to program the mapper and then boot that mapped game cartridge code.
The values from the Game Table are 9 bytes long and represent mapper registers that will be loaded for that game.
Example Table Entry
ROM TABLE $B000
ROM:B000 00 .BYTE 0 ; CHR Bank MSB; Always 0
ROM:B001 00 .BYTE 0 ; CHR Bank Mid; 0 / $10 / $20
ROM:B002 81 .BYTE $81 ; CHR Bank LSB;
ROM:B003 02 .BYTE 2 ; MMC mapper (2,4: Four ROM Banks or 5: Two Rom Banks )
ROM:B004 00 .BYTE 0 ; PRG Bank0 x 2
ROM:B005 01 .BYTE 1 ; PRG Bank1 x 2
ROM:B006 0E .BYTE $E ; PRG Bank2 x 2
ROM:B007 0F .BYTE $F ; PRG Bank3 x 2
ROM:B008 00 .BYTE 0 ; Mirrored / Vertical - A000h
All Entries for Mappy Cabinet
RT ROM:B000 00 00 81 02 00 01 0E 0F+ struc_RomTable <0, $00, $81 20 10, 2, $00, $01, $0E, $0F, 0>
PM ROM:B009 00 00 10 16 05 20 21 20+ struc_RomTable <0, $10, $16 5 2, 5, $20, $21, $20, $21, 1>
MA ROM:B012 21 01 00 10 1E 05 24 25+ struc_RomTable <0, $10, $1E 7 3, 5, $24, $25, $24, $25, 0>
DD ROM:B01B 24 25 00 00 10 46 05 26+ struc_RomTable <0, $10, $46 11 8, 5, $26, $27, $26, $27, 1>
GL ROM:B024 27 26 27 01 00 10 4E 05+ struc_RomTable <0, $10, $4E 13 9, 5, $2A, $2B, $2A, $2B, 1>
GA ROM:B02D 2A 2B 2A 2B 01 00 10 76+ struc_RomTable <0, $10, $76 1D E, 5, $2C, $2D, $2C, $2D, 1>
So calculating the CHR/PRG mapping for the Mappy cabinet looks something like the following
Case ($201A & 0x07) => Video Mode and affects MASK value.
Normal Video Modes: ($4100&0x0F)<<21+($2018&0x70)<<14+(($201A&0xF8)|(VBANK&0x07))<<10
Enhanced Video Modes: ($4100&0x0F)<<21+(($201A&0xF8&MASK)|(VBANK&0x07))<<13+EVA<<10
76543210
ROLLING CHR> 2_0000 81 10000001 10000 001 10 1 0x10 * 0x2000 -> 2_0000
PACMAN CHR> 4_4000 16 00010110 00010 110 2 6 0x02 * 0x2000 -> 0_4000
MAPPY CHR> 4_6000 1E 00011110 00011 110 3 6 0x03 * 0x2000 -> 0_6000
DigDug CHR> 5_0000 46 01000110 01000 110 8 6 0x08 * 0x2000 -> 1_0000
GALAGA CHR> 5_2000 4E 01001110 01001 110 9 6 0x09 * 0x2000 -> 1_2000
GALAXIAN CHR> 5_C000 76 01110110 01110 110 E 6 0x0E * 0x2000 -> 1_C000
MyArcade Custom Mapper Registers
$4100, Program Bank1, Video Bank2 PA[24:21]VA[24:21]
$2018, Video Bank1 register, BKPAGE, Video RW Bank X|VA[20:18]|BKPAGE|VRWB[2:0]
Write $00/10/20 ( Intermediate CHR Bank number; PPU $0000-$1FFF: Selected by register $2018 bits 4-6 (VA18-20). )
$201A, Video Bank0 register6, Video Bank0 selector RV6[7:3]VB0S[2:0]
$410B, MMC mapper (2,4: Four ROM Banks or 5: Two Rom Banks )
$4107, PRG ROM Bank0: $8000 or $8000
$4108, PRG ROM Bank1: $A000 .. $C000
$4109, PRG ROM Bank2: $C000 $8000
$410A, PRG ROM Bank3: $E000 $C000
$A000
MyArcade Custom Register Map
$2010/2011 / 2018
$4105 SEEN: Bubblebobble
$410B SEEN: Bubblebobble
$4144 SEEN: Bubblebobble
$4146 SEEN: Bubblebobble
$4147, IOB/GPIO
$4148 SEEN: Bubblebobble
$414A SEEN: Bubblebobble
$414C SEEN: Bubblebobble
$414E SEEN: Bubblebobble
$414F SEEN: Bubblebobble
$4155 SEEN: Bubblebobble
$4157 SEEN: Bubblebobble
$415A SEEN: Bubblebobble
$415B SEEN: Bubblebobble
$41E4 SEEN: Bubblebobble
$41E6 SEEN: Bubblebobble
$41E8 SEEN: Bubblebobble
https://problemkaputt.de/everynes.htm#mapper4mmc3prg8kvrom2k1kntsramirq
$8000 / 8001 :
Applications and Tools
Hex Dump NES Application
Other Cabinet stuff
* https://wrongbaud.github.io/MK-Teardown/
* https://boards.dingoonity.org/other-game-systems/identify-myarcade-pacman-pocket-player-hardware/
RANDOM LINKS
Very close to the "Mapper 64: Tengen RAMBO-1 - PRG/8K, VROM/2K/1K, NT, IRQ"
Or : Mapper 4: MMC3 - PRG/8K, VROM/2K/1K, NT, SRAM, IRQ