Apocalypse
Legendary
A small side project I'm working on for a couple a friends.
Big thank to @mastercello for giving me a boardset.
Only 8 known games on this System:
- Astro Flash/Transformer
- Fantazy Zone II (encrypted)
- Hang-On Jr. (requires specific analog I/O board)
- Megumi Rescue (original owner doesn't want to release the ROMs for now, so won't be included in the multi)
- Opa Opa (encrypted)
- Riddle of Pythagoras (requires specific spinner I/O board)
- Slap Shooter
- Tetris
Only 2 ROM banks, so 2 EPROMs needed for the kit, nothing special here, it works as it should.
An other big thank to @mastercello for confirming the decrypted sets work fine on real hardware (couldn't test myself as I was missing the adapter as System E isn't JAMMA).
It could have been the end of this small announcement but...
First for once I wanted to build a nice adapter, something not hand soldered with dozens of sagging wires:
And it works just great:
Then System E being based on the Master System I wondered if it could run console games, even if it wasn't the main goal of this multi, it could be a nice addition. Of course there are some differences:
- System E has 2 VDPs
- Some I/O ports are at different addresses, sometimes with data arranged differently
The main obstacle was the input ports for controls:
Master System (from SMS Power):
Port $DC: I/O port A and B
Bit Function
7 Port B Down pin input
6 Port B Up pin input
5 Port A TR pin input
4 Port A TL pin input
3 Port A Right pin input
2 Port A Left pin input
1 Port A Down pin input
0 Port A Up pin input
Port $DD: I/O port B and miscellaneous
Bit Function
7 Port B TH pin input
6 Port A TH pin input
5 Cartridge slot CONT pin *
4 Reset button (1= not pressed, 0= pressed) *
3 Port B TR pin input
2 Port B TL pin input
1 Port B Right pin input
0 Port B Left pin input
System E (from MAME):
PORT_START("e1") /* Read from Port 0xe1 */
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1)
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1)
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1)
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1)
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1)
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1)
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("e2") /* Read from Port 0xe2 */
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2)
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2)
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2)
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2)
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
Which gives the following equivalent
DC.b0 0x01 => E1.b0 0x01
DC.b1 0x02 => E1.b1 0x02
DC.b2 0x04 => E1.b2 0x04
DC.b3 0x08 => E1.b3 0x08
DC.b4 0x10 => E1.b4 0x10
DC.b5 0x20 => E1.b5 0x20
DC.b6 0x40 => E2.b0 0x01
DC.b7 0x80 => E2.b1 0x02
DD.b0 0x01 => E2.b2 0x04
DD.b1 0x02 => E2.b3 0x08
DD.b2 0x04 => E2.b4 0x10
DD.b3 0x08 => E2.b5 0x20
The idea is to patch ports on the fly so a standard MS cartridge can be plugged in the multi.
As you see player 2 inputs are spread across 2 registers on Master System. It would require quite complicated hardware to handle those so the patching only supports inputs for player 1.
I used a simple GAL22V10 chip for on-the-fly patching and it works quite well:
BUT... Background colour is always black as VDP1 isn't used by MS games and it's the one handling the background layer on System E. Otherwise games play identical:
I even went further and tried some SG-1000 games. This time controls didn't work at all (although working perfectly fine in MAME as always
) :
Big thank to @mastercello for giving me a boardset.
Only 8 known games on this System:
- Astro Flash/Transformer
- Fantazy Zone II (encrypted)
- Hang-On Jr. (requires specific analog I/O board)
- Megumi Rescue (original owner doesn't want to release the ROMs for now, so won't be included in the multi)
- Opa Opa (encrypted)
- Riddle of Pythagoras (requires specific spinner I/O board)
- Slap Shooter
- Tetris
Only 2 ROM banks, so 2 EPROMs needed for the kit, nothing special here, it works as it should.
An other big thank to @mastercello for confirming the decrypted sets work fine on real hardware (couldn't test myself as I was missing the adapter as System E isn't JAMMA).
It could have been the end of this small announcement but...

First for once I wanted to build a nice adapter, something not hand soldered with dozens of sagging wires:





And it works just great:



Then System E being based on the Master System I wondered if it could run console games, even if it wasn't the main goal of this multi, it could be a nice addition. Of course there are some differences:
- System E has 2 VDPs
- Some I/O ports are at different addresses, sometimes with data arranged differently
The main obstacle was the input ports for controls:
Master System (from SMS Power):
Port $DC: I/O port A and B
Bit Function
7 Port B Down pin input
6 Port B Up pin input
5 Port A TR pin input
4 Port A TL pin input
3 Port A Right pin input
2 Port A Left pin input
1 Port A Down pin input
0 Port A Up pin input
Port $DD: I/O port B and miscellaneous
Bit Function
7 Port B TH pin input
6 Port A TH pin input
5 Cartridge slot CONT pin *
4 Reset button (1= not pressed, 0= pressed) *
3 Port B TR pin input
2 Port B TL pin input
1 Port B Right pin input
0 Port B Left pin input
System E (from MAME):
PORT_START("e1") /* Read from Port 0xe1 */
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1)
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1)
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1)
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1)
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1)
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1)
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("e2") /* Read from Port 0xe2 */
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2)
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2)
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2)
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2)
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
Which gives the following equivalent
DC.b0 0x01 => E1.b0 0x01
DC.b1 0x02 => E1.b1 0x02
DC.b2 0x04 => E1.b2 0x04
DC.b3 0x08 => E1.b3 0x08
DC.b4 0x10 => E1.b4 0x10
DC.b5 0x20 => E1.b5 0x20
DC.b6 0x40 => E2.b0 0x01
DC.b7 0x80 => E2.b1 0x02
DD.b0 0x01 => E2.b2 0x04
DD.b1 0x02 => E2.b3 0x08
DD.b2 0x04 => E2.b4 0x10
DD.b3 0x08 => E2.b5 0x20
The idea is to patch ports on the fly so a standard MS cartridge can be plugged in the multi.
As you see player 2 inputs are spread across 2 registers on Master System. It would require quite complicated hardware to handle those so the patching only supports inputs for player 1.
I used a simple GAL22V10 chip for on-the-fly patching and it works quite well:

BUT... Background colour is always black as VDP1 isn't used by MS games and it's the one handling the background layer on System E. Otherwise games play identical:

I even went further and tried some SG-1000 games. This time controls didn't work at all (although working perfectly fine in MAME as always



Last edited: