summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/malzak.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/malzak.c')
-rw-r--r--src/mame/drivers/malzak.c558
1 files changed, 558 insertions, 0 deletions
diff --git a/src/mame/drivers/malzak.c b/src/mame/drivers/malzak.c
new file mode 100644
index 00000000000..a3a1e6c3f18
--- /dev/null
+++ b/src/mame/drivers/malzak.c
@@ -0,0 +1,558 @@
+/*
+
+ Malzak
+
+ Produced by Kitronix, cabinet artwork suggests it was
+ released in 1980.
+
+ Was sold around New Zealand in the early '80s.
+ Sold about 500 sets, fairly decent for the time.
+
+ There are more games on this hardware, as far as I am aware.
+
+ Driver by Reip, Barry Rodewald
+ SAA 5050 display code "borrowed" from the Philips 2000T/2000M driver in MESS
+
+ Basic memory map
+
+ 0x0000 - 0x0fff | S2650 code [malzak.5, malzak.4, malzak.2 (data only)]
+ 0x1000 - 0x13ff | Work RAM
+ 0x1400 - 0x14ff | S2636 #1 video
+ 0x1500 - 0x15ff | S2636 #2 video
+ 0x1600 - 0x16ff | Playfield gfx
+ 0x1700 - 0x17ff | Work RAM - contains hiscore table, coin count
+ 0x1800 - 0x1fff | SAA 5050 video RAM
+
+ TODO - I/O ports (0x00 for sprite->background collisions)
+ sound (2x SN76477)
+ playfield graphics may be banked, tiles above 0x1f are incorrect
+ sprite->sprite collisions aren't quite perfect
+ (you can often fly through flying missiles)
+
+ Notes:
+ - Test mode in Malzak II should be enabled by setting a POT to position
+ '4' and pressing button 1 three times. Then the POT is set to position
+ '1' to go back to the game.
+
+*/
+
+#include "driver.h"
+#include "video/s2636.h"
+#include "cpu/s2650/s2650.h"
+#include "sound/sn76477.h"
+
+#define SAA5050_VBLANK 2500
+
+static int malzak_bank1;
+
+extern int malzak_x;
+extern int malzak_y;
+
+extern UINT8* saa5050_vidram; /* Video RAM for SAA 5050 */
+
+// in video/malzak.c
+VIDEO_START( malzak );
+VIDEO_UPDATE( malzak );
+WRITE8_HANDLER( playfield_w );
+
+static READ8_HANDLER( malzak_s2636_1_r )
+{
+ return s2636_1_ram[offset];
+}
+
+static READ8_HANDLER( malzak_s2636_2_r )
+{
+ return s2636_2_ram[offset];
+}
+
+static WRITE8_HANDLER( malzak_s2636_1_w )
+{
+ s2636_w(s2636_1_ram,offset,data,s2636_1_dirty);
+}
+
+static WRITE8_HANDLER( malzak_s2636_2_w )
+{
+ s2636_w(s2636_2_ram,offset,data,s2636_2_dirty);
+}
+
+
+static READ8_HANDLER( saa5050_r )
+{
+ return saa5050_vidram[offset];
+}
+
+static WRITE8_HANDLER( saa5050_w )
+{
+ saa5050_vidram[offset] = data;
+}
+
+static READ8_HANDLER( fake_VRLE_r )
+{
+ return (s2636_1_ram[0xcb] & 0x3f) + (video_screen_get_vblank(0)*0x40);
+}
+
+static READ8_HANDLER( ram_mirror_r )
+{
+ return program_read_byte(0x1000+offset);
+}
+
+static WRITE8_HANDLER( ram_mirror_w )
+{
+ program_write_byte(0x1000+offset,data);
+}
+
+static READ8_HANDLER( bank_r )
+{
+ UINT8* bank = memory_region(REGION_USER2);
+
+ return bank[offset + (malzak_bank1 * 0x0400)];
+}
+
+static READ8_HANDLER( s2636_portA_r )
+{
+ // POT switch position, read from port A of the first S2636
+ // Not sure of the correct values to return, but these should
+ // do based on the game code.
+ switch(readinputport(1))
+ {
+ case 0: // Normal play
+ return 0xf0;
+ case 1:
+ return 0x90;
+ case 2:
+ return 0x70;
+ case 3: // Change settings
+ return 0x00;
+ default:
+ return 0xf0;
+ }
+}
+
+/*
+static READ8_HANDLER( bank2_r )
+{ // probably very wrong :)
+ UINT8* bank = memory_region(REGION_USER1);
+
+ return bank[offset + (malzak_bank1 * 0x0400)];
+}
+*/
+static ADDRESS_MAP_START( readmem, ADDRESS_SPACE_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0x0bff) AM_READ(MRA8_ROM)
+ AM_RANGE(0x0c00, 0x0fff) AM_READ(bank_r)
+ AM_RANGE(0x1000, 0x10ff) AM_READ(MRA8_RAM)
+ AM_RANGE(0x1100, 0x11ff) AM_READ(MRA8_RAM)
+ AM_RANGE(0x1200, 0x12ff) AM_READ(MRA8_RAM)
+ AM_RANGE(0x1300, 0x13ff) AM_READ(MRA8_RAM)
+ AM_RANGE(0x14cb, 0x14cb) AM_READ(fake_VRLE_r)
+ AM_RANGE(0x1400, 0x14ff) AM_READ(malzak_s2636_1_r)
+ AM_RANGE(0x1500, 0x15ff) AM_READ(malzak_s2636_2_r)
+ AM_RANGE(0x1600, 0x16ff) AM_READ(MRA8_RAM)
+ AM_RANGE(0x1700, 0x17ff) AM_READ(MRA8_RAM)
+ AM_RANGE(0x1800, 0x1fff) AM_READ(saa5050_r) // SAA 5050 video RAM
+ AM_RANGE(0x2000, 0x2fff) AM_READ(MRA8_ROM)
+ AM_RANGE(0x3000, 0x3fff) AM_READ(ram_mirror_r)
+ AM_RANGE(0x4000, 0x4fff) AM_READ(MRA8_ROM)
+ AM_RANGE(0x5000, 0x5fff) AM_READ(ram_mirror_r)
+ AM_RANGE(0x6000, 0x6fff) AM_READ(MRA8_ROM)
+ AM_RANGE(0x7000, 0x7fff) AM_READ(ram_mirror_r)
+ADDRESS_MAP_END
+
+
+static ADDRESS_MAP_START( writemem, ADDRESS_SPACE_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0x0fff) AM_WRITE(MWA8_ROM)
+ AM_RANGE(0x1000, 0x10ff) AM_WRITE(MWA8_RAM)
+ AM_RANGE(0x1100, 0x11ff) AM_WRITE(MWA8_RAM)
+ AM_RANGE(0x1200, 0x12ff) AM_WRITE(MWA8_RAM)
+ AM_RANGE(0x1300, 0x13ff) AM_WRITE(MWA8_RAM)
+ AM_RANGE(0x1400, 0x14ff) AM_WRITE(malzak_s2636_1_w)
+ AM_RANGE(0x1500, 0x15ff) AM_WRITE(malzak_s2636_2_w)
+ AM_RANGE(0x1600, 0x16ff) AM_WRITE(playfield_w)
+ AM_RANGE(0x1600, 0x16ff) AM_WRITE(MWA8_RAM)
+ AM_RANGE(0x1700, 0x17ff) AM_WRITE(MWA8_RAM)
+ AM_RANGE(0x1800, 0x1fff) AM_WRITE(saa5050_w) // SAA 5050 video RAM
+ AM_RANGE(0x2000, 0x2fff) AM_WRITE(MWA8_ROM)
+ AM_RANGE(0x3000, 0x3fff) AM_WRITE(ram_mirror_w)
+ AM_RANGE(0x4000, 0x4fff) AM_WRITE(MWA8_ROM)
+ AM_RANGE(0x5000, 0x5fff) AM_WRITE(ram_mirror_w)
+ AM_RANGE(0x6000, 0x6fff) AM_WRITE(MWA8_ROM)
+ AM_RANGE(0x7000, 0x7fff) AM_WRITE(ram_mirror_w)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( malzak2_readmem, ADDRESS_SPACE_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0x0bff) AM_READ(MRA8_ROM)
+ AM_RANGE(0x0c00, 0x0fff) AM_READ(bank_r)
+ AM_RANGE(0x1000, 0x10ff) AM_READ(MRA8_RAM)
+ AM_RANGE(0x1100, 0x11ff) AM_READ(MRA8_RAM)
+ AM_RANGE(0x1200, 0x12ff) AM_READ(MRA8_RAM)
+ AM_RANGE(0x1300, 0x13ff) AM_READ(MRA8_RAM)
+ AM_RANGE(0x14cb, 0x14cb) AM_READ(fake_VRLE_r)
+ AM_RANGE(0x14cc, 0x14cc) AM_READ(s2636_portA_r)
+ AM_RANGE(0x1400, 0x14ff) AM_READ(malzak_s2636_1_r)
+ AM_RANGE(0x1500, 0x15ff) AM_READ(malzak_s2636_2_r)
+ AM_RANGE(0x1600, 0x16ff) AM_READ(MRA8_RAM)
+ AM_RANGE(0x1700, 0x17ff) AM_READ(MRA8_RAM) AM_BASE(&generic_nvram) AM_SIZE(&generic_nvram_size)
+ AM_RANGE(0x1800, 0x1fff) AM_READ(saa5050_r) // SAA 5050 video RAM
+ AM_RANGE(0x2000, 0x2fff) AM_READ(MRA8_ROM)
+ AM_RANGE(0x3000, 0x3fff) AM_READ(ram_mirror_r)
+ AM_RANGE(0x4000, 0x4fff) AM_READ(MRA8_ROM)
+ AM_RANGE(0x5000, 0x5fff) AM_READ(ram_mirror_r)
+ AM_RANGE(0x6000, 0x6fff) AM_READ(MRA8_ROM)
+ AM_RANGE(0x7000, 0x7fff) AM_READ(ram_mirror_r)
+ADDRESS_MAP_END
+
+
+static ADDRESS_MAP_START( malzak2_writemem, ADDRESS_SPACE_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0x0fff) AM_WRITE(MWA8_ROM)
+ AM_RANGE(0x1000, 0x10ff) AM_WRITE(MWA8_RAM)
+ AM_RANGE(0x1100, 0x11ff) AM_WRITE(MWA8_RAM)
+ AM_RANGE(0x1200, 0x12ff) AM_WRITE(MWA8_RAM)
+ AM_RANGE(0x1300, 0x13ff) AM_WRITE(MWA8_RAM)
+ AM_RANGE(0x1400, 0x14ff) AM_WRITE(malzak_s2636_1_w)
+ AM_RANGE(0x1500, 0x15ff) AM_WRITE(malzak_s2636_2_w)
+ AM_RANGE(0x1600, 0x16ff) AM_WRITE(playfield_w)
+ AM_RANGE(0x1600, 0x16ff) AM_WRITE(MWA8_RAM)
+ AM_RANGE(0x1700, 0x17ff) AM_WRITE(MWA8_RAM) AM_BASE(&generic_nvram) AM_SIZE(&generic_nvram_size)
+ AM_RANGE(0x1800, 0x1fff) AM_WRITE(saa5050_w) // SAA 5050 video RAM
+ AM_RANGE(0x2000, 0x2fff) AM_WRITE(MWA8_ROM)
+ AM_RANGE(0x3000, 0x3fff) AM_WRITE(ram_mirror_w)
+ AM_RANGE(0x4000, 0x4fff) AM_WRITE(MWA8_ROM)
+ AM_RANGE(0x5000, 0x5fff) AM_WRITE(ram_mirror_w)
+ AM_RANGE(0x6000, 0x6fff) AM_WRITE(MWA8_ROM)
+ AM_RANGE(0x7000, 0x7fff) AM_WRITE(ram_mirror_w)
+ADDRESS_MAP_END
+
+static READ8_HANDLER( s2650_data_r )
+{
+ popmessage("S2650 data port read");
+ return 0xff;
+}
+
+static WRITE8_HANDLER( port40_w )
+{
+// Bit 0 is constantly set high during gameplay
+// Bit 4 is set high, then low, upon death
+// Bit 1 is set high on boot, and on the title screens.
+// Bits 1-3 are all set high upon death, until the game continues
+// Bit 6 is used only in Malzak II, and is set high after checking
+// the selected version
+// logerror("S2650 [0x%04x]: port 0x40 write: 0x%02x\n",cpunum_get_physical_pc_byte(0),data);
+ if(data & 0x40)
+ malzak_bank1 = 1;
+ else
+ malzak_bank1 = 0;
+}
+
+static WRITE8_HANDLER( port60_w )
+{
+ malzak_x = data;
+// logerror("I/O: port 0x60 write 0x%02x\n",data);
+}
+
+static WRITE8_HANDLER( portc0_w )
+{
+ malzak_y = data;
+// logerror("I/O: port 0xc0 write 0x%02x\n",data);
+}
+
+static READ8_HANDLER( collision_r )
+{
+ // High 4 bits seem to refer to the row affected.
+ static int counter;
+
+ if(++counter > 15)
+ counter = 0;
+// logerror("I/O port 0x00 read\n");
+ return 0xd0 + counter;
+}
+
+static ADDRESS_MAP_START( readport, ADDRESS_SPACE_IO, 8 )
+ AM_RANGE(0x00, 0x00) AM_READ(collision_r) // returns where a collision can occur.
+ AM_RANGE(0x80, 0x80) AM_READ(input_port_0_r) //controls
+ AM_RANGE(S2650_DATA_PORT, S2650_DATA_PORT) AM_READ(s2650_data_r) // read upon death
+ AM_RANGE(S2650_SENSE_PORT, S2650_SENSE_PORT) AM_READ(input_port_2_r)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( writeport, ADDRESS_SPACE_IO, 8 )
+ AM_RANGE(0x40, 0x40) AM_WRITE(port40_w) // possibly sound codes for dual SN76477s
+ AM_RANGE(0x60, 0x60) AM_WRITE(port60_w) // possibly playfield scroll X offset
+ AM_RANGE(0xa0, 0xa0) AM_WRITE(MWA8_NOP) // echoes I/O port read from port 0x80
+ AM_RANGE(0xc0, 0xc0) AM_WRITE(portc0_w) // possibly playfield row selection for writing and/or collisions
+ADDRESS_MAP_END
+
+static INPUT_PORTS_START( malzak )
+
+ /* Malzak has an 8-way stick
+ and only one button (firing and bomb dropping on the same button) */
+
+ PORT_START /* I/O port 0x80 */
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN )
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 )
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START2 )
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 )
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT )
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT )
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP )
+
+ PORT_START
+ // No POT switch on Malzak as far as I know
+
+ PORT_START /* SENSE */
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_VBLANK )
+
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( malzak2 )
+
+ /* Same as Malzak, but with additional POT switch, and
+ possibly a reset button too. */
+
+ PORT_START /* I/O port 0x80 */
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN )
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 )
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START2 )
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 )
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT )
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT )
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP )
+
+ PORT_START // Fake DIP switch to handle the POT switch.
+ PORT_DIPNAME( 0x03, 0x00, "POT switch position" )
+ PORT_DIPSETTING( 0x00, "1" ) // Normal play
+ PORT_DIPSETTING( 0x01, "2" )
+ PORT_DIPSETTING( 0x02, "3" )
+ PORT_DIPSETTING( 0x03, "4" ) // Change settings
+
+ PORT_START /* SENSE */
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_VBLANK )
+
+INPUT_PORTS_END
+
+
+static const gfx_layout charlayout =
+{
+ 16,16,
+ RGN_FRAC(1,1),
+ 1,
+ { 0 },
+ { 7, 6, 5, 4, 3, 2, 1, 0, 15, 14, 13, 12, 11, 10, 9, 8 },
+ { 0*16, 1*16, 2*16, 3*16, 4*16, 5*16, 6*16, 7*16,
+ 8*16, 9*16, 10*16, 11*16, 12*16, 13*16, 14*16, 15*16 },
+// { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
+ 16*16
+// 8*8
+};
+
+static const gfx_layout s2636_character10 =
+{
+ 8,10,
+ 5,
+ 1,
+ { 0 },
+ { 0,1,2,3,4,5,6,7 },
+ { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8, 8*8, 9*8 },
+ 8*16
+};
+
+static const gfx_layout saa5050_charlayout =
+{
+ 6, 10,
+ 256,
+ 1,
+ { 0 },
+ { 2, 3, 4, 5, 6, 7 },
+ { 0*8, 1*8, 2*8, 3*8, 4*8,
+ 5*8, 6*8, 7*8, 8*8, 9*8 },
+ 8 * 10
+};
+
+static const gfx_layout saa5050_hilayout =
+{
+ 6, 10,
+ 256,
+ 1,
+ { 0 },
+ { 2, 3, 4, 5, 6, 7 },
+ { 0*8, 0*8, 1*8, 1*8, 2*8,
+ 2*8, 3*8, 3*8, 4*8, 4*8 },
+ 8 * 10
+};
+
+static const gfx_layout saa5050_lolayout =
+{
+ 6, 10,
+ 256,
+ 1,
+ { 0 },
+ { 2, 3, 4, 5, 6, 7 },
+ { 5*8, 5*8, 6*8, 6*8, 7*8,
+ 7*8, 8*8, 8*8, 9*8, 9*8 },
+ 8 * 10
+};
+
+static const rgb_t saa5050_palette[8] =
+{
+ MAKE_RGB(0x00, 0x00, 0x00), /* black */
+ MAKE_RGB(0xff, 0x00, 0x00), /* red */
+ MAKE_RGB(0x00, 0xff, 0x00), /* green */
+ MAKE_RGB(0xff, 0xff, 0x00), /* yellow */
+ MAKE_RGB(0x00, 0x00, 0xff), /* blue */
+ MAKE_RGB(0xff, 0x00, 0xff), /* magenta */
+ MAKE_RGB(0x00, 0xff, 0xff), /* cyan */
+ MAKE_RGB(0xff, 0xff, 0xff) /* white */
+};
+
+/* bgnd, fgnd */
+static unsigned short saa5050_colortable[64 * 2] =
+{
+ 0,1, 0,1, 0,2, 0,3, 0,4, 0,5, 0,6, 0,7,
+ 1,0, 1,1, 1,2, 1,3, 1,4, 1,5, 1,6, 1,7,
+ 2,0, 2,1, 2,2, 2,3, 2,4, 2,5, 2,6, 2,7,
+ 3,0, 3,1, 3,2, 3,3, 3,4, 3,5, 3,6, 3,7,
+ 4,0, 4,1, 4,2, 4,3, 4,4, 4,5, 4,6, 4,7,
+ 5,0, 5,1, 5,2, 5,3, 5,4, 5,5, 5,6, 5,7,
+ 6,0, 6,1, 6,2, 6,3, 6,4, 6,5, 6,6, 6,7,
+ 7,0, 7,1, 7,2, 7,3, 7,4, 7,5, 7,6, 7,7
+};
+
+//add s2636 decodes here (i.e. from zac2650) and maybe re-arrange them
+static GFXDECODE_START( malzak )
+ GFXDECODE_ENTRY( REGION_GFX1, 0, charlayout, 0, 16 )
+ GFXDECODE_ENTRY( REGION_CPU1, 0x0000, s2636_character10, 0, 8 ) /* s2636 #1 */
+ GFXDECODE_ENTRY( REGION_CPU1, 0x0000, s2636_character10, 0, 8 ) /* s2636 #2 */
+ GFXDECODE_ENTRY( REGION_GFX2, 0x0000, saa5050_charlayout, 0, 128)
+ GFXDECODE_ENTRY( REGION_GFX2, 0x0000, saa5050_hilayout, 0, 128)
+ GFXDECODE_ENTRY( REGION_GFX2, 0x0000, saa5050_lolayout, 0, 128)
+GFXDECODE_END
+
+
+static PALETTE_INIT( malzak )
+{
+ palette_set_colors(machine, 0, saa5050_palette, ARRAY_LENGTH(saa5050_palette));
+ memcpy(colortable, saa5050_colortable, sizeof (saa5050_colortable));
+}
+
+
+static struct SN76477interface sn76477_intf =
+{
+ 0, /* N/C */ /* 4 noise_res */
+ 0, /* N/C */ /* 5 filter_res */
+ 0, /* N/C */ /* 6 filter_cap */
+ 0, /* N/C */ /* 7 decay_res */
+ 0, /* N/C */ /* 8 attack_decay_cap */
+ RES_K(100), /* 10 attack_res */
+ RES_K(56), /* 11 amplitude_res */
+ RES_K(10), /* 12 feedback_res */
+ 0, /* N/C */ /* 16 vco_voltage */
+ CAP_U(0.1), /* 17 vco_cap */
+ RES_K(8.2), /* 18 vco_res */
+ 5.0, /* 19 pitch_voltage */
+ RES_K(120), /* 20 slf_res */
+ CAP_U(1.0), /* 21 slf_cap */
+ 0, /* N/C */ /* 23 oneshot_cap */
+ 0, /* N/C */ /* 24 oneshot_res */
+ 0, /* 22 vco */
+ 1, /* 26 mixer A */
+ 1, /* 25 mixer B */
+ 1, /* 27 mixer C */
+ 1, /* 1 envelope 1 */
+ 1, /* 28 envelope 2 */
+ 1 /* 9 enable */
+};
+
+
+static MACHINE_DRIVER_START( malzak )
+
+ /* basic machine hardware */
+ MDRV_CPU_ADD_TAG("main", S2650, 3800000/4)
+ MDRV_CPU_PROGRAM_MAP(readmem,writemem)
+ MDRV_CPU_IO_MAP(readport,writeport)
+
+ MDRV_SCREEN_REFRESH_RATE(50)
+ //MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(SAA5050_VBLANK))
+
+ /* video hardware */
+ MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
+ MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
+ MDRV_SCREEN_SIZE(240, 256) /* vert size is a guess */
+ MDRV_SCREEN_VISIBLE_AREA(0, 239, 0, 239)
+ MDRV_GFXDECODE(malzak)
+ MDRV_PALETTE_LENGTH(16)
+ MDRV_PALETTE_INIT(malzak)
+ MDRV_COLORTABLE_LENGTH(128)
+
+// MDRV_MACHINE_RESET(malzak)
+
+ MDRV_VIDEO_START(malzak)
+ MDRV_VIDEO_UPDATE(malzak)
+
+ /* sound hardware */
+ MDRV_SPEAKER_STANDARD_MONO("mono")
+
+ MDRV_SOUND_ADD(SN76477, 0)
+ MDRV_SOUND_CONFIG(sn76477_intf)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
+
+ MDRV_SOUND_ADD(SN76477, 0)
+ MDRV_SOUND_CONFIG(sn76477_intf)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
+MACHINE_DRIVER_END
+
+static MACHINE_DRIVER_START( malzak2 )
+ MDRV_IMPORT_FROM( malzak )
+
+ MDRV_CPU_MODIFY( "main" )
+ MDRV_CPU_PROGRAM_MAP( malzak2_readmem, malzak2_writemem )
+
+ MDRV_NVRAM_HANDLER( generic_0fill )
+MACHINE_DRIVER_END
+
+ROM_START( malzak )
+ ROM_REGION( 0x8000, REGION_CPU1, 0 )
+ ROM_LOAD( "malzak.5", 0x0000, 0x0800, CRC(75355c98) SHA1(7036ed5d9ee38585b1a6bc204d410d5fb5ddd81f) )
+ ROM_CONTINUE( 0x2000, 0x0800 )
+ ROM_LOAD( "malzak.4", 0x0800, 0x0400, CRC(744c81e3) SHA1(c08d6df3cf2808a5f99d8247fc19a59be88121a9) )
+ ROM_CONTINUE( 0x4000, 0x0c00 )
+ // Terrain data
+ ROM_LOAD( "malzak.3", 0x4400, 0x0800, CRC(b947229e) SHA1(37b88b5aa91a483fcfe60a9bdd67a66f6378c487) )
+
+ // Screen data
+ ROM_REGION(0x0800, REGION_USER2, 0)
+ ROM_LOAD( "malzak.2", 0x0000, 0x0800, CRC(2a12ad67) SHA1(f89a50b62311a170004c061abd8dedc3ebd84748) )
+
+ ROM_REGION( 0x0800, REGION_GFX1, ROMREGION_DISPOSE )
+ ROM_LOAD( "malzak.1", 0x0000, 0x0800, CRC(74d5ff7b) SHA1(cae326370dc83b86542f9d070e2dc91b1b833356) )
+
+ ROM_REGION(0x01000, REGION_GFX2,0) // SAA5050 internal character ROM
+ ROM_LOAD("p2000.chr", 0x0140, 0x08c0, BAD_DUMP CRC(78c17e3e) SHA1(4e1c59dc484505de1dc0b1ba7e5f70a54b0d4ccc) )
+
+ROM_END
+
+ROM_START( malzak2 )
+ ROM_REGION( 0x8000, REGION_CPU1, 0 )
+ ROM_LOAD( "malz1a.bin", 0x000000, 0x000800, CRC(5c3cb14c) SHA1(2d3b5703cb9a47e34aa593f0e8d42d4e67c167d9) )
+ ROM_CONTINUE( 0x2000, 0x0800 )
+
+ ROM_LOAD( "malz2b.bin", 0x0800, 0x0400, CRC(2af8aace) SHA1(7aaf03d4848c2cce72b2b3729661e7826834ad44) )
+ ROM_CONTINUE( 0x4000, 0x0400 )
+ ROM_CONTINUE( 0x2800, 0x0400 )
+ ROM_CONTINUE( 0x6000, 0x0400 )
+ // Terrain data
+ ROM_LOAD( "malz3c.bin", 0x4400, 0x0800, CRC(54d6a02e) SHA1(80c550d74da770689fe451cb0ee8e550a63b1b96) )
+
+ // Screen data
+ ROM_REGION(0x0800, REGION_USER2, 0)
+ ROM_LOAD( "malz4d.bin", 0x0000, 0x0800, CRC(5c6ca415) SHA1(e7571519ac7911507d2c1cf975a7663f41321cb9) )
+
+ ROM_REGION( 0x0800, REGION_GFX1, ROMREGION_DISPOSE )
+ ROM_LOAD( "malzak.1", 0x0000, 0x0800, CRC(74d5ff7b) SHA1(cae326370dc83b86542f9d070e2dc91b1b833356) )
+
+ ROM_REGION(0x01000, REGION_GFX2,0) // SAA5050 internal character ROM
+ ROM_LOAD("p2000.chr", 0x0140, 0x08c0, BAD_DUMP CRC(78c17e3e) SHA1(4e1c59dc484505de1dc0b1ba7e5f70a54b0d4ccc) )
+
+ROM_END
+
+
+GAME( 19??, malzak, 0, malzak, malzak, 0, ROT0, "Kitronix", "Malzak", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_IMPERFECT_GRAPHICS )
+GAME( 19??, malzak2, malzak, malzak2, malzak2, 0, ROT0, "Kitronix", "Malzak II", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_IMPERFECT_GRAPHICS )