summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author ClawGrip <clawgrip@hotmail.com>2023-09-13 17:28:21 +0200
committer GitHub <noreply@github.com>2023-09-13 11:28:21 -0400
commit86c6e83b4c2b8aca18db2565e72b03f90a25dda5 (patch)
tree4012720d16fe0db223f511178084cde9736378ef
parentf1dd0d0651b6f04240c23739279e704c1c7bfabc (diff)
efo/cedar_magnet.cpp: Add a new game, ordered the games on the driver... (#11543)
* efo/cedar_magnet.cpp: Add a new game, ordered the games on the driver, and reformatted comments New WORKING clone ------------------------ Booby Kids (Magnet System) [Hugo Benedet, Recreativas.org]
-rw-r--r--src/mame/efo/cedar_magnet.cpp299
-rw-r--r--src/mame/mame.lst1
2 files changed, 146 insertions, 154 deletions
diff --git a/src/mame/efo/cedar_magnet.cpp b/src/mame/efo/cedar_magnet.cpp
index 6b7dd381380..44f11b2937a 100644
--- a/src/mame/efo/cedar_magnet.cpp
+++ b/src/mame/efo/cedar_magnet.cpp
@@ -3,26 +3,26 @@
// thanks to: Ricky2001, ArcadeHacker, IFW
/*
- todo:
- - fix sound emulation (speed needs verifying + sample playback)
- - fix sprite communication / banking
+ TODO:
+ - Fix sound emulation (speed needs verifying + sample playback)
+ - Fix sprite communication / banking
* bit "output bit 0x02 %d (IC21)" at 0x42 might be important
* mag_exzi currently requires a gross hack to stop the sprite CPU crashing on startup
* mag_xain sometimes leaves old sprites on the screen, probably due to a lost clear
command
- - fix flipscreen
- - verify behavior of unknown / unused ports / interrupt sources etc.
- - verify the disk images, convert to a better format that can natively store protection
+ - Fix flipscreen
+ - Verify behavior of unknown / unused ports / interrupt sources etc.
+ - Verify the disk images, convert to a better format that can natively store protection
* RAW data also available if required
* as mentioned, the disks are copy protected, see notes below
- Use proper floppy drive emulation code that originally came from MESS (tied with above)
- - verify all clocks and screen params (50hz seems to match original videos)
- - work out why we need a protection hack and replace it with proper emulation
+ - Verify all clocks and screen params (50hz seems to match original videos)
+ - Work out why we need a protection hack and replace it with proper emulation
* there are no per-game protection devices, so it's something to do with the base hardware
* there seem to be 2 checks, one based on a weird sector on the discs, the other based on
a port read
- - add additional hardware notes from ArcadeHacker
- - layer enables on War Mission? (transitions from title screen etc.)
+ - Add additional hardware notes from ArcadeHacker
+ - Layer enables on War Mission? (transitions from title screen etc.)
notes:
- high scores will be defaulted if the data in the table is corrupt, the games give no
@@ -31,50 +31,49 @@
*/
-
/*
- Magnet System by
-
- EFO SA (Electrónica Funcional Operativa SA).
- based on Cedar hardware
-
+ Magnet System by EFO SA (Electrónica Funcional Operativa SA).
+ Based on Cedar hardware
http://retrolaser.es/cedar-computer-el-ordenador-profesional-de-efo-sa/
http://www.recreativas.org/magnet-system-2427-efosa
A number of original games as well as conversions were advertised for this system, it is however
- believed that EFO went bankrupt before anything hit the market. The only 3 dumped games are
- conversions and appear to be in incomplete states (it is rather easy to break Time Scanner for
- example, the ball simply gets stuck in some places) These are not simply bootlegs, they're
- completely original pieces of code more akin to home computer ports.
+ believed that EFO went bankrupt before anything hit the market. The conversions are not simply
+ bootlegs, they're completely original pieces of code more akin to home computer ports.
The following were advertised
Original Games
- A Day in Space ** *
- Crazy Driver
+ - Formula
- Jungle Trophy
- - Quadrum
- - War Mission ** *
- - The Burning Cave *
- - Scorpio
- Paris Dakar ** *
+ - Quadrum
- Sailing Race
- - Formula
+ - Scorpio
+ - The Burning Cavern *
+ - War Mission ** *
Ports / Conversions
- - Exzisus *
+ - Booby Kids *
+ - Cocomania (Pacmania)
+ - Dodge Ball
- Double Dragon
+ - Dracula's Castle (Haunted House)
+ - Exzisus *
- Flying Shark
+ - Super Contra
- Time Scanner *
+ - Twin Eagle
+ - World Wars (Bermuda Triangle)
- Xain d'Sleena *
- - Boody Kids (Booby Kids?)
** screenshots present on flyer
* dumps exist
-
Disk Protection
Sectors are 1024 (0x400) bytes long but marked on the disc as 512 bytes as a copy protection
@@ -100,7 +99,7 @@ The hardware consists of 5 main PCBs in a cage.
1x Sprite PCB
On some systems, there are small memory sub-boards on the Master PCB and Sprite PCB; due to the awkwardness of
-the banking at times (and the fact that even with 4 banks of 256 colours, only one can be active)
+the banking at times (and the fact that even with 4 banks of 256 colours, only one can be active).
I suspect the additional memory was an afterthought.
SOUND BOARD
@@ -171,6 +170,8 @@ MASTER BOARD
|__ CONN |
|________________________________________________________________________|
+Xtal 1 = 16.000 MHz
+Xtal 2 = 20.000 MHz
PLANES BOARD
___________________________________________________________________________
@@ -265,7 +266,6 @@ MASTER BOARD
| __________ |
| |MC74HC157| |
|________________________________________________________________________|
-
*/
#include "emu.h"
@@ -463,18 +463,18 @@ void cedar_magnet_state::cedar_magnet_io(address_map &map)
void cedar_magnet_state::cedar_bank0(address_map &map)
{
- /* memory configuration 0 */
+ // Memory configuration 0
map(0x00000, 0x0ffff).m(m_sub_ram_bankdev, FUNC(address_map_bank_device::amap8));
- /* memory configuration 1 */
+ // Memory configuration 1
map(0x10000, 0x1dfff).m(m_sub_ram_bankdev, FUNC(address_map_bank_device::amap8));
map(0x1e000, 0x1ffff).rom().region("maincpu", 0x0000);
- /* memory configuration 2*/
+ // memory configuration 2
map(0x20000, 0x2bfff).m(m_sub_ram_bankdev, FUNC(address_map_bank_device::amap8));
map(0x2c000, 0x2ffff).rw(FUNC(cedar_magnet_state::other_cpu_r), FUNC(cedar_magnet_state::other_cpu_w));
- /* memory configuration 3*/
+ // memory configuration 3
map(0x30000, 0x31fff).rom().region("maincpu", 0x0000).mirror(0x0e000);
}
@@ -865,7 +865,6 @@ void cedar_magnet_state::ic49_pio_pb_w(u8 data) // 0x42
LOGMASKED(LOG_IC49_PIO_PB, "output bit 0x01 (LED) %d\n", (data >> 0)&1); // B0 -> LED LD1
-
int soundselect = (m_ic49_pio_pb_val & 0x70) >> 4;
handle_sub_board_cpu_lines(*m_cedsound, oldsoundselect, soundselect);
@@ -937,8 +936,8 @@ INTERRUPT_GEN_MEMBER(cedar_magnet_state::irq)
void cedar_magnet_state::cedar_magnet(machine_config &config)
{
- /* basic machine hardware */
- Z80(config, m_maincpu, 4000000); /* ? MHz */
+ // Basic machine hardware
+ Z80(config, m_maincpu, 4000000); // ? MHz
m_maincpu->set_addrmap(AS_PROGRAM, &cedar_magnet_state::cedar_magnet_map);
m_maincpu->set_addrmap(AS_IO, &cedar_magnet_state::cedar_magnet_io);
m_maincpu->set_vblank_int("screen", FUNC(cedar_magnet_state::irq));
@@ -961,7 +960,7 @@ void cedar_magnet_state::cedar_magnet(machine_config &config)
m_ic49_pio->in_pb_callback().set(FUNC(cedar_magnet_state::ic49_pio_pb_r));
m_ic49_pio->out_pb_callback().set(FUNC(cedar_magnet_state::ic49_pio_pb_w));
- /* video hardware */
+ // Video hardware
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_refresh_hz(50);
screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
@@ -982,69 +981,81 @@ void cedar_magnet_state::cedar_magnet(machine_config &config)
config.set_perfect_quantum(m_maincpu);
}
+/*
+ Protection? (Time Scanner note)
-#define BIOS_ROM \
- ROM_REGION( 0x10000, "maincpu", 0 ) \
- ROM_LOAD( "magnet-master-vid-e03.bin", 0x00000, 0x02000, CRC(86c4a4f0) SHA1(6db1a006b2e0b2a7cc9748ade881debb098b6757) )
-
-
-
-ROM_START( cedmag )
- BIOS_ROM
+ One part of the code is a weird loop checking values from port 0x7c while doing other nonsensical stuff, a flag gets set to 0xff if it fails.
- ROM_REGION( 0x100000, "flop:disk", ROMREGION_ERASE00 )
- // no disk inserted
-ROM_END
+ The other part is after reading the weird extra block on the disk (score / protection data at 0xea400 in the disk image*) and again a flag
+ gets set to 0xff in certain conditions there's then a check after inserting a coin, these values can't be 0xff at that point, and there
+ doesn't appear to be any code to reset them.
-ROM_START( mag_time )
- BIOS_ROM
+ *0xea400 is/was track 4e, side 00, sector 01 for future reference if the floppy format changes
- ROM_REGION( 0x100000, "flop:disk", 0 )
- ROM_LOAD( "timescanner.img", 0x00000, 0xf0000, CRC(214c558c) SHA1(9c71fce35acaf17ac685f77aebb1b0a930060f0b) )
-ROM_END
+ All games have the same code in them but at different addresses
+*/
+void cedar_magnet_state::kludge_protection()
+{
+ const int max_addr = 0x3ffff;
-ROM_START( mag_exzi )
- BIOS_ROM
+ if (m_address1hack == -1)
+ {
+ for (int i = 0; i < max_addr - 4; i++)
+ {
+ if ((m_ram0[i + 0] == 0x7f) && (m_ram0[i + 1] == 0xc8) && (m_ram0[i + 2] == 0x3e) && (m_ram0[i + 3] == 0xff))
+ {
+ m_address1hack = i + 2;
+ logerror("found patch at %06x\n", i + 2);
+ break;
+ }
+ }
+ }
+ else
+ {
+ if ((m_ram0[m_address1hack] == 0x3e) && (m_ram0[m_address1hack + 1] == 0xff)) m_ram0[m_address1hack] = 0xc9;
+ }
- ROM_REGION( 0x100000, "flop:disk", ROMREGION_ERASE00 )
- ROM_LOAD( "exzisus.img", 0x00000, 0xf0000, CRC(3705e9dc) SHA1(78c8010d224f5deb202a29bd273ea7dc85ddcdb4) )
-ROM_END
+ if (m_address2hack == -1)
+ {
+ for (int i = 0; i < max_addr - 4; i++)
+ {
+ if ((m_ram0[i + 0] == 0x10) && (m_ram0[i + 1] == 0xdd) && (m_ram0[i + 2] == 0x3e) && (m_ram0[i + 3] == 0xff))
+ {
+ m_address2hack = i + 2;
+ logerror("found patch at %06x\n", i + 2);
+ break;
+ }
+ }
+ }
+ else
+ {
+ if ((m_ram0[m_address2hack] == 0x3e) && (m_ram0[m_address2hack + 1] == 0xff)) m_ram0[m_address2hack] = 0xc9;
+ }
+}
-ROM_START( mag_xain )
- BIOS_ROM
- ROM_REGION( 0x100000, "flop:disk", ROMREGION_ERASE00 )
- ROM_LOAD( "xain.img", 0x00000, 0xf0000, CRC(5647849f) SHA1(edd2f3f6359424583bf526bf4601476dc849e617) )
-ROM_END
+#define BIOS_ROM \
+ ROM_REGION( 0x10000, "maincpu", 0 ) \
+ ROM_LOAD( "magnet-master-vid-e03.bin", 0x00000, 0x02000, CRC(86c4a4f0) SHA1(6db1a006b2e0b2a7cc9748ade881debb098b6757) )
-/*
- Data after 0xd56b0 would not read consistently, however the game only appears to use the first 24 tracks (up to 0x48fff)
- as it loads once on startup, not during gameplay, and all tracks before that gave consistent reads. There is data after this
- point but it is likely leftovers from another game / whatever was on the disk before, so for our purposes this should be fine.
- Some bullets do seem to spawn from locations where there are no enemies, but I think this is just annoying game design.
-*/
-ROM_START( mag_war )
+ROM_START( cedmag )
BIOS_ROM
ROM_REGION( 0x100000, "flop:disk", ROMREGION_ERASE00 )
- ROM_LOAD( "war mission wm 4_6_87.img", 0x00000, 0xf0000, CRC(7c813520) SHA1(2ba5999709a52302aa367fb46199b331421a0d56) )
+ // no disk inserted
ROM_END
-/*
- Data read 100% consistently with multiple drives
-*/
-ROM_START( mag_wara )
+// Marked as BAD_DUMP because of the missing tracks (hence the different size).
+ROM_START( mag_boob )
BIOS_ROM
ROM_REGION( 0x100000, "flop:disk", ROMREGION_ERASE00 )
- ROM_LOAD( "war mission wm 9_4_87.img", 0x00000, 0xf0000, CRC(6296ea6f) SHA1(c0aaf51362bfa3362ef39c3fb1e1c848b73fd780) )
+ ROM_LOAD( "boobykid.img", 0x00000, 0xde000, BAD_DUMP CRC(3196ffb4) SHA1(99732f74bb907ed6a93ed097c7b211c709d8bf85) ) // Floppy labeled "BOOBY KID CC / TUBO VERTICAL / 1 joystick, 2 pulsadores"
ROM_END
-/*
- Data read 100% consistently with multiple drives
-*/
+// Data read 100% consistently with multiple drives
ROM_START( mag_burn )
BIOS_ROM
@@ -1067,16 +1078,6 @@ ROM_START( mag_day )
ROM_LOAD( "adayinspace 31_3_87.img", 0x00000, 0xf0000, CRC(bc65302d) SHA1(6ace68a0b5f7a07a8f5c318c5359011074e7f2ec) )
ROM_END
-// track 79 side 1 (file offset 0x0ee800) would not read, but it appears to be outside of the used data
-// this also has many scores stored on the disk at offset 0x01cc00, invalidating these does reset the
-// score table to 'EFO 100000' scores, but then it never writes new scores?
-ROM_START( mag_pdak )
- BIOS_ROM
-
- ROM_REGION( 0x100000, "flop:disk", ROMREGION_ERASE00 )
- ROM_LOAD( "paris.dsk 31_3_87.img", 0x00000, 0xf0000, BAD_DUMP CRC(2c4ee9e1) SHA1(22c2b75c16aca95ecf2199451c1bd12dd3a3844c) )
-ROM_END
-
/*
The following tracks/sides failed to read (bad disk)
@@ -1090,12 +1091,10 @@ track:74:0 (file offset:0x0de000 - 0x0df7ff)
track:75:0 (file offset:0x0e1000 - 0x0e27ff)
track:76:0 (file offset:0x0e4000 - 0x0e57ff)
-these areas aren't read by the code that currently loads, but other areas also didn't read consistently
-
-the 3 dumps in the set below contain different reads of tracks 0-67
+These areas aren't read by the code that currently loads, but other areas also didn't read consistently.
+The 3 dumps in the set below contain different reads of tracks 0-67.
*/
-
ROM_START( mag_drac )
BIOS_ROM
@@ -1105,81 +1104,73 @@ ROM_START( mag_drac )
ROM_LOAD( "drac3.dsk", 0x00000, 0xf0000, BAD_DUMP CRC(7060e4a2) SHA1(b8e5437afff11d57a40c092d005d6b075819537a))
ROM_END
+ROM_START( mag_exzi )
+ BIOS_ROM
+ ROM_REGION( 0x100000, "flop:disk", ROMREGION_ERASE00 )
+ ROM_LOAD( "exzisus.img", 0x00000, 0xf0000, CRC(3705e9dc) SHA1(78c8010d224f5deb202a29bd273ea7dc85ddcdb4) )
+ROM_END
/*
- protection? (Time Scanner note)
-
- one part of the code is a weird loop checking values from port 0x7c while doing other nonsensical stuff, a flag gets set to 0xff if it fails
-
- the other part is after reading the weird extra block on the disk (score / protection data at 0xea400 in the disk image*) and again a flag
- gets set to 0xff in certain conditions there's then a check after inserting a coin, these values can't be 0xff at that point, and there
- doesn't appear to be any code to reset them.
-
- *0xea400 is/was track 4e, side 00, sector 01 for future reference if the floppy format changes
-
- all games have the same code in them but at different addresses
+ Track 79 side 1 (file offset 0x0ee800) would not read, but it appears to be outside of the used data
+ this also has many scores stored on the disk at offset 0x01cc00, invalidating these does reset the
+ score table to 'EFO 100000' scores, but then it never writes new scores?
*/
+ROM_START( mag_pdak )
+ BIOS_ROM
+ ROM_REGION( 0x100000, "flop:disk", ROMREGION_ERASE00 )
+ ROM_LOAD( "paris.dsk 31_3_87.img", 0x00000, 0xf0000, BAD_DUMP CRC(2c4ee9e1) SHA1(22c2b75c16aca95ecf2199451c1bd12dd3a3844c) )
+ROM_END
-void cedar_magnet_state::kludge_protection()
-{
- const int max_addr = 0x3ffff;
-
- if (m_address1hack == -1)
- {
- for (int i = 0; i < max_addr - 4; i++)
- {
- if ((m_ram0[i + 0] == 0x7f) && (m_ram0[i + 1] == 0xc8) && (m_ram0[i + 2] == 0x3e) && (m_ram0[i + 3] == 0xff))
- {
- m_address1hack = i + 2;
- logerror("found patch at %06x\n", i + 2);
- break;
- }
- }
- }
- else
- {
- if ((m_ram0[m_address1hack] == 0x3e) && (m_ram0[m_address1hack + 1] == 0xff)) m_ram0[m_address1hack] = 0xc9;
- }
+ROM_START( mag_time )
+ BIOS_ROM
- if (m_address2hack == -1)
- {
- for (int i = 0; i < max_addr - 4; i++)
- {
- if ((m_ram0[i + 0] == 0x10) && (m_ram0[i + 1] == 0xdd) && (m_ram0[i + 2] == 0x3e) && (m_ram0[i + 3] == 0xff))
- {
- m_address2hack = i + 2;
- logerror("found patch at %06x\n", i + 2);
- break;
- }
- }
- }
- else
- {
- if ((m_ram0[m_address2hack] == 0x3e) && (m_ram0[m_address2hack + 1] == 0xff)) m_ram0[m_address2hack] = 0xc9;
- }
-}
+ ROM_REGION( 0x100000, "flop:disk", 0 )
+ ROM_LOAD( "timescanner.img", 0x00000, 0xf0000, CRC(214c558c) SHA1(9c71fce35acaf17ac685f77aebb1b0a930060f0b) )
+ROM_END
-} // anonymous namespace
+/*
+ Data after 0xd56b0 would not read consistently, however the game only appears to use the first 24 tracks (up to 0x48fff)
+ as it loads once on startup, not during gameplay, and all tracks before that gave consistent reads. There is data after this
+ point but it is likely leftovers from another game / whatever was on the disk before, so for our purposes this should be fine.
+ Some bullets do seem to spawn from locations where there are no enemies, but I think this is just annoying game design.
+*/
+ROM_START( mag_war )
+ BIOS_ROM
-GAME( 1987, cedmag, 0, cedar_magnet, cedar_magnet, cedar_magnet_state, empty_init, ROT0, "EFO SA / Cedar", "Magnet System", MACHINE_IS_BIOS_ROOT )
+ ROM_REGION( 0x100000, "flop:disk", ROMREGION_ERASE00 )
+ ROM_LOAD( "war mission wm 4_6_87.img", 0x00000, 0xf0000, CRC(7c813520) SHA1(2ba5999709a52302aa367fb46199b331421a0d56) )
+ROM_END
-GAME( 1987, mag_time, cedmag, cedar_magnet, cedar_magnet, cedar_magnet_state, empty_init, ROT90, "EFO SA / Cedar", "Time Scanner (TS 2.0, Magnet System)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // original game was by Sega
+// Data read 100% consistently with multiple drives
+ROM_START( mag_wara )
+ BIOS_ROM
-GAME( 1987, mag_exzi, cedmag, cedar_magnet, cedar_magnet, cedar_magnet_state, empty_init, ROT0, "EFO SA / Cedar", "Exzisus (EX 1.0, Magnet System)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // original game was by Taito
+ ROM_REGION( 0x100000, "flop:disk", ROMREGION_ERASE00 )
+ ROM_LOAD( "war mission wm 9_4_87.img", 0x00000, 0xf0000, CRC(6296ea6f) SHA1(c0aaf51362bfa3362ef39c3fb1e1c848b73fd780) )
+ROM_END
-GAME( 1987, mag_xain, cedmag, cedar_magnet, cedar_magnet, cedar_magnet_state, empty_init, ROT0, "EFO SA / Cedar", "Xain'd Sleena (SC 3.0, Magnet System)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // original game was by Technos
+ROM_START( mag_xain )
+ BIOS_ROM
-GAME( 1987, mag_war, cedmag, cedar_magnet, cedar_magnet, cedar_magnet_state, empty_init, ROT90, "EFO SA / Cedar", "War Mission (WM 04/06/87)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // date in program
-GAME( 1987, mag_wara, mag_war,cedar_magnet, cedar_magnet, cedar_magnet_state, empty_init, ROT90, "EFO SA / Cedar", "War Mission (WM 09/04/87)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // the '9' was handwritten over a printed letter on disk label, date not in program
+ ROM_REGION( 0x100000, "flop:disk", ROMREGION_ERASE00 )
+ ROM_LOAD( "xain.img", 0x00000, 0xf0000, CRC(5647849f) SHA1(edd2f3f6359424583bf526bf4601476dc849e617) )
+ROM_END
-GAME( 1987, mag_burn, cedmag, cedar_magnet, cedar_magnet, cedar_magnet_state, empty_init, ROT0, "EFO SA / Cedar", "The Burning Cavern (31/03/87)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // date on label
-GAME( 1987, mag_day, cedmag, cedar_magnet, cedar_magnet, cedar_magnet_state, empty_init, ROT90, "EFO SA / Cedar", "A Day In Space (31/03/87)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // date on label
+} // anonymous namespace
-// has unemulated 'handlebar' option that can be enabled in service mode
-GAME( 1987, mag_pdak, cedmag, cedar_magnet, cedar_magnet, cedar_magnet_state, empty_init, ROT0, "EFO SA / Cedar", "Paris Dakar (31/03/87, Spanish)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // date on label
-GAME( 1987, mag_drac, cedmag, cedar_magnet, cedar_magnet, cedar_magnet_state, empty_init, ROT0, "EFO SA / Cedar", "Dracula's Castle (Magnet System)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+GAME( 1987, cedmag, 0, cedar_magnet, cedar_magnet, cedar_magnet_state, empty_init, ROT0, "EFO SA / Cedar", "Magnet System", MACHINE_IS_BIOS_ROOT )
+GAME( 1987, mag_boob, cedmag, cedar_magnet, cedar_magnet, cedar_magnet_state, empty_init, ROT90, "EFO SA / Cedar", "Booby Kids (Magnet System)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // Original game (Kid no Hore Hore Daisakusen) by Nichibutsu
+GAME( 1987, mag_burn, cedmag, cedar_magnet, cedar_magnet, cedar_magnet_state, empty_init, ROT0, "EFO SA / Cedar", "The Burning Cavern (31/03/87)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // Date on label
+GAME( 1987, mag_day, cedmag, cedar_magnet, cedar_magnet, cedar_magnet_state, empty_init, ROT90, "EFO SA / Cedar", "A Day In Space (31/03/87)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // Date on label
+GAME( 1987, mag_drac, cedmag, cedar_magnet, cedar_magnet, cedar_magnet_state, empty_init, ROT0, "EFO SA / Cedar", "Dracula's Castle (Magnet System)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+GAME( 1987, mag_exzi, cedmag, cedar_magnet, cedar_magnet, cedar_magnet_state, empty_init, ROT0, "EFO SA / Cedar", "Exzisus (EX 1.0, Magnet System)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // Original game was by Taito
+GAME( 1987, mag_pdak, cedmag, cedar_magnet, cedar_magnet, cedar_magnet_state, empty_init, ROT0, "EFO SA / Cedar", "Paris Dakar (31/03/87, Spanish)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // Date on label, has unemulated 'handlebar' option that can be enabled in service mode
+GAME( 1987, mag_time, cedmag, cedar_magnet, cedar_magnet, cedar_magnet_state, empty_init, ROT90, "EFO SA / Cedar", "Time Scanner (TS 2.0, Magnet System)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // Original game was by Sega
+GAME( 1987, mag_war, cedmag, cedar_magnet, cedar_magnet, cedar_magnet_state, empty_init, ROT90, "EFO SA / Cedar", "War Mission (WM 04/06/87)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // Date in program
+GAME( 1987, mag_wara, mag_war, cedar_magnet, cedar_magnet, cedar_magnet_state, empty_init, ROT90, "EFO SA / Cedar", "War Mission (WM 09/04/87)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // The '9' was handwritten over a printed letter on disk label, date not in program
+GAME( 1987, mag_xain, cedmag, cedar_magnet, cedar_magnet, cedar_magnet_state, empty_init, ROT0, "EFO SA / Cedar", "Xain'd Sleena (SC 3.0, Magnet System)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // Original game was by Technos
diff --git a/src/mame/mame.lst b/src/mame/mame.lst
index 6f57bb7c093..a53247e6255 100644
--- a/src/mame/mame.lst
+++ b/src/mame/mame.lst
@@ -17402,6 +17402,7 @@ twinsed2 // (c) 1994 Electronic Devices
@source:efo/cedar_magnet.cpp
cedmag
+mag_boob
mag_burn
mag_day
mag_drac