Home News Forum                            

Play your favorite classic games and more with the GameEx front end. Read more.

mastboyi: MAME ROM Information.


Master Boy (c) 1991 Gaelco.

A quiz game.


Main CPU : Z180 (@ 8 Mhz)

Screen orientation : Horizontal

Video resolution : 256 x 224 pixels

Screen refresh : 60.00 Hz

Palette colors : 256


Default highscore table (MASTERBOY de PLATA) :

JUNIOR PEPITO 64800 5.50





Staff: Xavier Arrébola


Game's rom.

MAME Info:

0.105u5 [David Haywood, Guru, ClawGrip]

< Spain >


- 0.131u1: Angelo Salese merged memory maps in Master Boy.

- 0.115u2: ClawGrip added dipswitches to Master Boy according to the game manual. Added dipswitches 'Game Mode', 'Erase Records', 'Difficulty', 'Coin A/B' and 'Unused'.

- 0.113u3: David Haywood, Charles MacDonald and Clawgrip fixed Master Boy - Game now playable. Added internal HD647180 MCU data rom and changed Z180 CPU clock speed to 6MHz and VSync to 55.407801 Hz. Added SAA1099 (6Mhz), MSM5205 (384000 Hz) and dipswitches 'DSW1/2', 'Demo Sounds', 'Lives' and lots of 'Unknown'.

- 17th March 2007: Charles MacDonald - Good news, Master Boy has been dumped. Thanks again to ClawGrip for loaning the board out and Haze for doing a great job adding it to MAME in record time, check his website for screenshots of the game in action. It quickly became clear that dumping the Master Boy internal ROM manually was going to take forever. I designed a EPROM/SRAM emulator around the FT2232 USB chip and assembled two of them so I could have full access to the data ROM where the text pointers are stored, and the video RAM where the dumped code would be written to. The first test was to find out exactly which bytes were control codes for the text printing routine. I wrote a program to reset the board 256 times and change a string to each of 256 possible values. As it turns out there were no additional codes apart from 0x5C (newline) and 0x7F (end of string). These are the only two values that couldn't be retrieved from the internal ROM. The program was then modified to dump 16 bytes starting from each of the 16384 addresses. By overdumping, I could compare the data before and after the undumped bytes which would appear as a growing string of 0x23 bytes (the value the game initializes the name table to) which abruptly stops as soon as the start address is past the control code. This allows unreadable addresses to be positively identified. With the entire ROM dumped and a list of bad addresses made, the program was changed to test each bad address and see if data from the next adderss appeared at a different position in the name table, signifying a newline rather than the string terminator. This reduced the list further, and it was assumed that all remaining addresses were 0x7F. I went through and inspected the addresses in a disassembly to make sure these values seemed right, and they did. It was pretty cool to trace through the print string routine that made this possible, no other obvious security holes or other ways to get access to the internal ROM seemed available. And nearly all of it was filled with code, I was wrong about it being mostly empty. This ended up being one of the most rewarding and complicated projects I've worked on, since there was no information about the hardware to start with and everything had to be figured out from scratch. And now I've finally got two EPROM emulators as a result, which have been useful for playing with other hardware - I've done some experiments on the SC-3000H console and Sunsoft Shanghai / Sega Mega Play boards. Later on I'll release the project notes and files for the EPROM emulator so other people can build their own.

- 17th March 2007: David Haywood - Another 'impossible' task has almost been complete. This time Gaelco's Master Boy. It isn't playable yet (*Edit* Fully Working), and there could be more problems I've not yet encountered, but it's looking good so far. Special thanks to Clawgrip for giving us a PCB, and Charles MacDonald for working out how to get code out of the CPU.

- 11th February 2007: Charles MacDonald - It's been a while, but I finally found a way to extract the code from the MCU in Gaelco's "Master Boy". It has a string printing routine that does not do any checks on the source address, and writes data from the specified address into VRAM after adjusting the ASCII characters to match up with the tile numbers of the character set in VROM. This routine is used as soon as the game is powered up to display the diagnostic results. To make use of this, I modified the system to use NVRAM in place of the regular VRAM, and hacked up the Namco System 2 dev board so that a 27C512 EPROM could be replaced with 29F010 flash. While an EPROM emulator would have been more convenient, reprogramming the flash for each new start address is managable if tiresome. This is not without difficulties; there is only 4K VRAM present for name table storage and each entry is 4 bytes, and given the start address of the text string only about 800 bytes of internal ROM data can be saved to NVRAM on each try. Furthermore certain control codes will abort text printing immediately or skip several rows, so sometimes much less data can be recovered depending on what values are present. In time it should be possible to dump most all of the ROM, and the game's code can be examined for additional security holes if they are any. The programmer(s) have done an impressive job preventing the MCU from being affected by external tampering through modifying the stack or triggering interrupts, as well as doing range checks on lists of addresses and offsets in the ROMs.

- 19th September 2006: Charles MacDonald - I was recently sent a Gaelco "Master Boy" PCB from ClawGrip to examine. It's entirely implemented in TTL logic and a few PALs which I've desoldered, socketed, and dumped. All of the hardware functions have been mapped out except for the video timing and tilemap generation. One surprise was the inclusion of a Phillips SAA1099 stereo programmable sound generator which I haven't seen before, to go along with MSM5205 ADPCM decoder. I can't get sound out of the board, but it seems like quite a capable chip compared to other PSGs like the AY8910 or SN76489. It uses a Hitachi HD647180 MCU, a Z80 clone with a number of features added such as I/O ports, a MMU, DMA, and so on. However none of the special function pins are not brought out to the connector that joins the CPU module to the main board. In effect, it's just used as a Z80 with internal ROM. Some clever tweaking of the address lines (and assumed use of the MMU) allows the MCU to address 16K of internal ROM and 64K of external space, but the actual game board's memory map only uses 48K with a 16K gap at the beginning. Now that it's known that the ROM data is accessed in banks rather than linearly (something I was sure the MMU would have allowed for) this means some trojaning methods won't work, and others might. The game has several pointers and offset tables in the ROM which may be useful for accessing the internal ROM data. It all depends on the game doing any validity checks on the table contents before using them.

- 0.105u5: David Haywood added Master Boy (Spanish, PCB Rev A) (Gaelco 1991) and clone (Italian, PCB Rev A).

- 25th April 2006: f205v dumped Master Boy (Italian, PCB Rev A). PCB has the Gaelco logo, but all markings are in Italian, roms sticker have the Playmark logo.

- 30th July 2004: Guru - Master Boy (Gaelco) arrived from ClawGrip.

Romset: 1040 kb / 9 files / 311.1 zip

MAME XML Output:

       <game name="mastboyi" sourcefile="mastboy.c" cloneof="mastboy" romof="mastboy">
              <description>Master Boy (Italian, PCB Rev A)</description>
              <rom name="hd647180.bin" merge="hd647180.bin" size="16384" crc="75716dd1" sha1="9b14b9b889b29b6022a3815de95487fb6a720d7a" region="maincpu" offset="0"/>
              <rom name="3-mem-a.ic77" size="65536" crc="3ee33282" sha1="26371e3bb436869461e9870409b69aa9fb1845d6" region="maincpu" offset="4000"/>
              <rom name="4.ic91" size="65536" crc="858d7b27" sha1="b0ddf49df5665003f3616d67f7fc27408433483b" region="gfx2" offset="0"/>
              <rom name="1-mem-c.ic75" size="262144" crc="7c7b1cc5" sha1="73ad7bdb61d1f99ce09ef3a5a3ae0f1e72364eee" region="user1" offset="0"/>
              <rom name="2-mem-b.ic76" size="131072" crc="87015c18" sha1="a16bf2707ce847da0923662796195b75719a6d77" region="user1" offset="40000"/>
              <rom name="5-rom.ic95" size="131072" crc="adc07f12" sha1="2e0b46ac5884ad459bc354f56ff384ff1932f147" region="user1" offset="80000"/>
              <rom name="6-rom.ic96" size="131072" crc="2c52cb1e" sha1="d58f21c09bd3983497f74ab6c5a37977d9e30f0c" region="user1" offset="c0000"/>
              <rom name="7-rom.ic97" size="131072" crc="7818408f" sha1="2a69688b6cda5baf2a45966dd86f10b2fcd54b66" region="user1" offset="100000"/>
              <chip type="cpu" tag="maincpu" name="Z180" clock="6000000"/>
              <chip type="audio" tag="mono" name="Speaker"/>
              <chip type="audio" tag="saa" name="SAA1099" clock="6000000"/>
              <chip type="audio" tag="msm" name="MSM5205" clock="384000"/>
              <display tag="screen" type="raster" rotate="0" width="256" height="224" refresh="55.407801" />
              <sound channels="1"/>
              <input players="2" buttons="2" coins="2">
              <dipswitch name="Game Mode" tag="DSW1" mask="1">
                     <dipvalue name="1" value="1" default="yes"/>
                     <dipvalue name="2" value="0"/>
              <dipswitch name="Demo Sounds" tag="DSW1" mask="2">
                     <dipvalue name="Off" value="0"/>
                     <dipvalue name="On" value="2" default="yes"/>
              <dipswitch name="Lives" tag="DSW1" mask="12">
                     <dipvalue name="1" value="8"/>
                     <dipvalue name="2" value="12"/>
                     <dipvalue name="3" value="4" default="yes"/>
                     <dipvalue name="4" value="0"/>
              <dipswitch name="Erase Records" tag="DSW1" mask="16">
                     <dipvalue name="No" value="16" default="yes"/>
                     <dipvalue name="Yes" value="0"/>
              <dipswitch name="Difficulty" tag="DSW1" mask="96">
                     <dipvalue name="Very Hard" value="0"/>
                     <dipvalue name="Hard" value="32"/>
                     <dipvalue name="Easy" value="64"/>
                     <dipvalue name="Normal" value="96" default="yes"/>
              <dipswitch name="Unused" tag="DSW1" mask="128">
                     <dipvalue name="Off" value="0"/>
                     <dipvalue name="On" value="128" default="yes"/>
              <dipswitch name="Coin B" tag="DSW2" mask="15">
                     <dipvalue name="9 Coins/1 Credit" value="0"/>
                     <dipvalue name="8 Coins/1 Credit" value="1"/>
                     <dipvalue name="7 Coins/1 Credit" value="2"/>
                     <dipvalue name="6 Coins/1 Credit" value="3"/>
                     <dipvalue name="5 Coins/1 Credit" value="4"/>
                     <dipvalue name="4 Coins/1 Credit" value="5"/>
                     <dipvalue name="3 Coins/1 Credit" value="6"/>
                     <dipvalue name="2 Coins/1 Credit" value="7"/>
                     <dipvalue name="1 Coin/1 Credit" value="15" default="yes"/>
                     <dipvalue name="1 Coin/2 Credits" value="14"/>
                     <dipvalue name="1 Coin/3 Credits" value="13"/>
                     <dipvalue name="1 Coin/4 Credits" value="12"/>
                     <dipvalue name="1 Coin/5 Credits" value="11"/>
                     <dipvalue name="1 Coin/6 Credits" value="10"/>
                     <dipvalue name="1 Coin/7 Credits" value="9"/>
                     <dipvalue name="1 Coin/8 Credits" value="8"/>
              <dipswitch name="Coin A" tag="DSW2" mask="240">
                     <dipvalue name="9 Coins/1 Credit" value="0"/>
                     <dipvalue name="8 Coins/1 Credit" value="16"/>
                     <dipvalue name="7 Coins/1 Credit" value="32"/>
                     <dipvalue name="6 Coins/1 Credit" value="48"/>
                     <dipvalue name="5 Coins/1 Credit" value="64"/>
                     <dipvalue name="4 Coins/1 Credit" value="80"/>
                     <dipvalue name="3 Coins/1 Credit" value="96"/>
                     <dipvalue name="2 Coins/1 Credit" value="112"/>
                     <dipvalue name="1 Coin/1 Credit" value="240" default="yes"/>
                     <dipvalue name="1 Coin/2 Credits" value="224"/>
                     <dipvalue name="1 Coin/3 Credits" value="208"/>
                     <dipvalue name="1 Coin/4 Credits" value="192"/>
                     <dipvalue name="1 Coin/5 Credits" value="176"/>
                     <dipvalue name="1 Coin/6 Credits" value="160"/>
                     <dipvalue name="1 Coin/7 Credits" value="144"/>
                     <dipvalue name="1 Coin/8 Credits" value="128"/>
              <driver status="good" emulation="good" color="good" sound="good" graphic="good" savestate="unsupported" palettesize="256"/>

emumovies.com      Retro bytes Portal           Bookmark and Share

Developed by: Spesoft  Headsoft     Terms of use     Privacy    Advertise