summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/spaceg.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/spaceg.c')
-rw-r--r--src/mame/drivers/spaceg.c478
1 files changed, 478 insertions, 0 deletions
diff --git a/src/mame/drivers/spaceg.c b/src/mame/drivers/spaceg.c
new file mode 100644
index 00000000000..855a60b52a5
--- /dev/null
+++ b/src/mame/drivers/spaceg.c
@@ -0,0 +1,478 @@
+#include "driver.h"
+#include "cpu/z80/z80.h"
+#include "sound/dac.h"
+#include "sound/sn76496.h"
+
+
+/*
+Space Guerrilla PCB Layout
+--------------------------
+
+All PCBs slot into a metal frame. Each PCB is joined by the 14way/28way edge connectors
+on one side, and the 50 pin connectors via flat cables on the other side.
+
+ 14-way
+OEC-5 |----------------|
+|----------------|----------------|-----------------|
+| 1 2 3 4 5 6 |
+|A 74273 7417 555 |
+| |
+|B 74273 7417 555 7493 76477 LM380 |
+| |
+|C DIP16 74121 4066 7400 4030 |
+| |
+|D LM324 LM324 LM3900 LM3900 458 4006 |
+| |
+| |
+| |
+| |
+| VR1 VR2 VR3 VR4 VR5 VR6 VR7 VOL |
+|---------------------------------------------------|
+
+Notes:
+ DIP16 - Joins to DIP16 socket at 3F on IOC2-A PCB via a 16-wire flat cable.
+ VR1-7 - Potentiometers for volume of sounds
+ VOL - Master Volume
+ Note PCB also contains a lot of resistors, transistors, capacitors etc
+
+
+
+ 28-way
+IOC2-A |-----------------------------|
+|----------------|-----------------------------|----------------|
+| 1 2 3 4 5 6 7 |
+|A DIP16 DIP16 DIP16 DIP16 |
+| VR1 |
+|B D1-8 7404 7404 7404 LM324 4066 |
+| |
+|C D9-16 74240 7406 DIP8 LM324 VR2 |
+| |
+|D 74240 74240 74175 75472 555 555 |
+| |
+|E DSW1 74240 74273 7417 VR3 |
+| |
+|F DIP16 DIP16 DIP16 555 458 LM3900 LM3900 |
+| |
+|G 74244 74244 7432 555 VR4 |
+| |
+|H |
+| |
+| |
+| |-------------| |
+|--|-------------|----------------------------------------------|
+ 50 pin
+
+Notes:
+ DIP8 - Unpopulated position for DIP8 IC
+ DIP16- Unpopulated position for DIP16 IC
+ D1-16- Diodes
+ VR1-4- Potentiometers for volume of sounds
+
+
+
+ 28-way
+CRTC1-A |-----------------------------|
+|----------------|-----------------------------|----------------|
+| 1 2 3 4 5 6 7 8 9 |
+|A 20MHz 7455 Diodes 1-4 DIP16 DIP16 DIP16 4027 4027 |
+| & |
+|B 74163 7404 Transtrs 1-7 DIP16 DIP16 DIP16 4027 4027 |
+| |
+|C 7486 74161 7404 DIP16 DIP16 DIP16 4027 4027 |
+| |
+|D 7486 74161 7408 82S09 74374 74157 4027 4027 |
+| |
+|E 7486 74161 7402 7411 74157 74377 7408 4027 4027 |
+| |
+|F 7486 74161 7411 74157 74244 74377 7400 74153 74157 |
+| |
+|G 74107 7404 7474 74175 74107 74157 7404 74377 74157 |
+| |
+|H 7404 7404 74244 74139 7404 7427 7474 74164 7404 |
+| |
+| |
+| |-------------| |-------------| |-------------| |
+|--|-------------|-------|-------------|-------|-------------|--|
+ 50 pin 50 pin 50 pin
+
+Notes:
+ 4027 - MOSTEK MK4027-4 RAM (DIP16)
+ DIP16- Unpopulated position for DIP16 IC
+
+
+
+ 28-way
+CRTC2-A |-----------------------------|
+|----------------|-----------------------------|----------------|
+| 1 2 3 4 5 6 7 8 9 |
+|A 7402 74377 74157 7400 74194 74S288 4027 4027 |
+| |
+|B 7486 74153 7486 7400 74194 74S288 4027 4027 |
+| |
+|C 7408 74374 74158 74273 7427 4027 4027 |
+| |
+|D 7400 74244 25S10 74181 7430 7408 4027 4027 |
+| |
+|E 7400 74153 25S10 74181 7402 4027 4027 |
+| |
+|F 7408 74153 7411 7404 7404 4027 4027 |
+| |
+|G 7404 74153 DIP16 74153 74153 74283 4027 4027 |
+| |
+|H 74138 74244 7474 74153 74153 74157 4027 4027 |
+| |
+| |
+| |-------------| |-------------| |-------------| |
+|--|-------------|-------|-------------|-------|-------------|--|
+ 50 pin 50 pin 50 pin
+
+Notes:
+ 74S288 - 32bytes x8 Bipolar PROM (DIP16, both PROMs contain identical contents)
+ 4027 - MOSTEK MK4027-4 RAM (DIP16)
+
+
+
+ 28-way
+SBC-A |-----------------------------|
+|----------------|-----------------------------|----------------|
+| 1 2 3 4 5 6 7 8 9 |
+|A 74161 DIP18 4045 4045 ROM2 ROM1 |
+| |
+|B 7404 7402 74139 DIP18 DIP18 ROM4 ROM3 |
+| |
+|C 7404 7404 7420 4045 4045 ROM6 ROM5 |
+| |
+|D 7420 DIP18 DIP18 ROM8 ROM7 |
+| |
+|E 74241 74241 8216 8216 DIP24 DIP24 |
+| |
+|F Z80 74241 DIP24 DIP24 |
+| |
+|G 7407 74241 ROM14 ROM13 |
+| |
+|H 74241 7442 7442 74244 ROM16 ROM15 |
+| |
+| |
+| |-------------| |-------------| |
+|--|-------------|-------|-------------|------------------------|
+ 50 pin 50 pin
+
+Notes:
+ 4045 - TMS4045-45NL RAM (DIP18)
+ 8216 - Mitsubishi M5L8216 RAM (DIP16)
+ DIP18- Unpopulated position for DIP18 IC
+ DIP24- Unpopulated position for DIP24 IC
+ All ROMs type 2708 (DIP24)
+
+*/
+
+
+
+
+static UINT8 unkram[65536];
+
+static int io9400;
+static int io9401;
+
+static VIDEO_UPDATE( spaceg )
+{
+ copybitmap(bitmap,tmpbitmap,0,0,0,0,cliprect,TRANSPARENCY_NONE,0);
+
+ return 0;
+}
+
+static PALETTE_INIT( spaceg )
+{
+ int i;
+
+ for (i=0; i<128; i++)
+ palette_set_color (machine, i, MAKE_RGB(0x00,0x00,0x00));
+
+
+ palette_set_color (machine,0, MAKE_RGB(0x00,0x00,0x00)); //ok czarny
+ palette_set_color (machine,1, MAKE_RGB(0x7f,0x00,0x00));//???
+ palette_set_color (machine,2, MAKE_RGB(0xff,0xff,0xff)); //ok+ bialy
+ palette_set_color (machine,3, MAKE_RGB(0xff,0x00,0x00)); //ok j.czerw.
+ palette_set_color (machine,4, MAKE_RGB(0x3f,0x3f,0xff)); //ok j.niebieski
+ palette_set_color (machine,5, MAKE_RGB(0x3f,0xff,0x3f)); //ok j.zielony
+ palette_set_color (machine,6, MAKE_RGB(0xff,0xbf,0xbf)); //ok+ 'majtki'
+ palette_set_color (machine,7, MAKE_RGB(0xff,0xff,0x00)); //ok+ zolty
+
+ palette_set_color (machine,8, MAKE_RGB(0xff,0x7f,0x00)); //ok+ pomaranczowy
+ palette_set_color (machine,9, MAKE_RGB(0x3f,0xbf,0xff)); //ok j.niebieski (ciemniejszy od 13)
+ palette_set_color (machine,10,MAKE_RGB(0x3f,0xbf,0x3f)); //ok+ c.zielony
+ palette_set_color (machine,11,MAKE_RGB(0x00,0xff,0x00)); //ok j.zielony
+ palette_set_color (machine,12,MAKE_RGB(0x7f,0x00,0x00)); //ok brazowy (c.czerw)
+ palette_set_color (machine,13,MAKE_RGB(0x7f,0xbf,0xff)); //ok j.niebieski (jasniejszy od 9)
+ palette_set_color (machine,14,MAKE_RGB(0x00,0xff,0xff));//???
+ palette_set_color (machine,15,MAKE_RGB(0x7f,0x7f,0x7f));//???
+
+}
+
+static WRITE8_HANDLER( zvideoram_w )
+{
+ int i,x,y,col;
+
+ col = unkram[0x400];
+
+ if (col>0x0f) popmessage("color>0x0f =%2d",col);
+
+ col &=0x0f;
+
+ switch(io9401)
+ {
+ case 0x0d: /* 1101 */
+ videoram[offset] &= ~data;
+ data = videoram[offset];
+ break;
+
+ case 0x01: /* 0001 */
+ case 0x00: /* 0000 */
+ videoram[offset] = data;
+ break;
+
+ default:
+ logerror("mode =%02x pc=%04x\n",io9401,activecpu_get_pc() );
+ popmessage("mode =%02x pc=%04x\n",io9401,activecpu_get_pc() );
+ return;
+ break;
+ }
+
+
+ unkram [offset] = col;
+
+ y= 255 - (offset & 0xff);
+ x= 255 - ((offset>>8)*8);
+ x -= ((io9400&0xe0)>>5);
+
+ /* draw modified eight pixels */
+ if (y >= 0 && y < tmpbitmap->height)
+ for (i = 0; i < 8; i++)
+ {
+ if (x >= 0 && y < tmpbitmap->width)
+ *BITMAP_ADDR16(tmpbitmap, y, x) = (data&1)?Machine->pens[col]:Machine->pens[0];
+ x++;
+ data >>= 1;
+ }
+}
+
+static READ8_HANDLER(fake_r)
+{
+// logerror("vb %04x\n", activecpu_get_pc() );
+ return 0;
+}
+
+
+static READ8_HANDLER(spaceg_colorram_r)
+{
+
+int rgbcolor;
+
+ if (offset<0x400)
+ {
+ rgbcolor = (unkram[offset]<<1) | ((offset &0x100)>>8);
+
+ if ((offset>=0x200) && (offset<0x220)) /* 0xa200- 0xa21f */
+ {
+ /* palette 1 */
+ int col_ind = offset & 0x1f;
+ palette_set_color_rgb(Machine, 0x10 + 0x00 + col_ind, pal3bit(rgbcolor >> 0), pal3bit(rgbcolor >> 6), pal3bit(rgbcolor >> 3));
+ }
+ else
+ if ((offset>=0x300) && (offset<0x320)) /* 0xa300- 0xa31f */
+ {
+ /* palette 2 */
+ int col_ind = offset & 0x1f;
+ palette_set_color_rgb(Machine, 0x10 + 0x00 + col_ind, pal3bit(rgbcolor >> 0), pal3bit(rgbcolor >> 6), pal3bit(rgbcolor >> 3));
+ }
+ else
+ logerror("palette? read from unkram offset = %04x\n",offset);
+ }
+
+if (io9401!=0x40)
+ logerror("unkram read in mode: 9401 = %02x (offset=%04x)\n",io9401,offset);
+
+
+ return unkram[offset];
+}
+
+static WRITE8_HANDLER(spaceg_colorram_w)
+{
+ int i,x,y,col;
+
+ unkram[offset] = data;
+
+
+ /* refresh eight pixels because the color might have just been changed */
+ data = videoram[offset];
+ col = unkram [offset];
+
+ y= 255 - (offset & 0xff);
+ x= 255 - ((offset>>8)*8);
+ x -= ((io9400&0xe0)>>5);
+
+ /* draw modified eight pixels */
+ if (y >= 0 && y < tmpbitmap->height)
+ for (i = 0; i < 8; i++)
+ {
+ if (x >= 0 && x < tmpbitmap->width)
+ *BITMAP_ADDR16(tmpbitmap, y, x) = (data&1)?Machine->pens[col]:Machine->pens[0];
+ x++;
+ data >>= 1;
+ }
+}
+
+
+static READ8_HANDLER(zr_r)
+{
+ return videoram[offset];
+}
+
+static WRITE8_HANDLER(io9400_w)
+{
+ io9400=data;
+ if (io9400 & 0x1f)
+ {
+ logerror("!!9400 =%02x pc=%04x\n",io9400,activecpu_get_pc() );
+ }
+}
+
+static WRITE8_HANDLER(io9401_w)
+{
+ io9401 = data;
+
+
+//0x40 - loads the palette on READ, address line 0x100 is the ninth bit (3rd bit of the red component)
+
+ switch(io9401)
+ {
+ case 0x0d:
+ case 0x01:
+ case 0x00:
+ break;
+ default:
+ logerror("!!9401 mode =%02x pc=%04x\n",io9401,activecpu_get_pc() );
+ break;
+ }
+}
+
+static ADDRESS_MAP_START( readwritemem, ADDRESS_SPACE_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0x1fff) AM_ROM
+ AM_RANGE(0x3000, 0x3fff) AM_ROM
+ AM_RANGE(0x7000, 0x77ff) AM_RAM
+ AM_RANGE(0xc000, 0xdfff) AM_READWRITE(zr_r, zvideoram_w) AM_BASE(&videoram)
+ AM_RANGE(0xa000, 0xbfff) AM_READWRITE(spaceg_colorram_r, spaceg_colorram_w)
+
+
+ AM_RANGE(0x9400, 0x9400) AM_WRITE(io9400_w) /* gfx ctrl */
+ AM_RANGE(0x9401, 0x9401) AM_WRITE(io9401_w) /* gfx ctrl */
+ /* 9402 -
+ bits 0 and 1 probably control the lamps under the player 1 and player 2 start buttons
+ bit 3 is probably a flip screen
+ bit 7 - unknown - set to 1 during the gameplay (coinlock ?)
+ */
+ AM_RANGE(0x9402, 0x9407) AM_RAM
+
+ AM_RANGE(0x9800, 0x9800) AM_READ(fake_r) //watchdog read ? nmi mask/ack ?
+ AM_RANGE(0x9801, 0x9801) AM_READ(input_port_0_r)
+ AM_RANGE(0x9802, 0x9802) AM_READ(input_port_1_r)
+ AM_RANGE(0x9805, 0x9805) AM_READ(input_port_2_r) /* pl 1 */
+ AM_RANGE(0x9806, 0x9806) AM_READ(input_port_3_r) /* pl 2 */
+ADDRESS_MAP_END
+
+
+
+static INPUT_PORTS_START( spaceg )
+ PORT_START
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 )
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 )
+
+ PORT_START
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START1 )
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START2 )
+
+ PORT_START /* player 1 */
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT )
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT )
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 )
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 )
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON4 )
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP )
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN )
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON3 )
+
+ PORT_START /* player 2 */
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT )
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT )
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 )
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 )
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON4 )
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP )
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN )
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON3 )
+
+
+INPUT_PORTS_END
+
+
+static MACHINE_DRIVER_START( spaceg )
+
+ /* basic machine hardware */
+ MDRV_CPU_ADD(Z80,2500000) /* 2.5 MHz */
+ MDRV_CPU_PROGRAM_MAP(readwritemem,0)
+ MDRV_CPU_VBLANK_INT(nmi_line_pulse,1) /* 60 Hz NMIs (verified) */
+
+ MDRV_SCREEN_REFRESH_RATE(60)
+ MDRV_SCREEN_VBLANK_TIME(DEFAULT_60HZ_VBLANK_DURATION)
+
+ /* video hardware */
+ MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
+ MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
+ MDRV_SCREEN_SIZE(256, 256)
+ MDRV_SCREEN_VISIBLE_AREA(0, 256-1, 0, 256-1-3*8)
+ MDRV_PALETTE_LENGTH(16+128-16)
+ MDRV_PALETTE_INIT( spaceg )
+ MDRV_VIDEO_START(generic_bitmapped)
+ MDRV_VIDEO_UPDATE( spaceg )
+
+ /* sound hardware */
+ MDRV_SPEAKER_STANDARD_MONO("mono")
+
+// MDRV_SOUND_ADD(SN76496, 15468480/4)
+// MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+
+// MDRV_SOUND_ADD(SN76496, 15468480/4)
+// MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+
+// MDRV_SOUND_ADD(SN76496, 15468480/4)
+// MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+
+// MDRV_SOUND_ADD(DAC, 0)
+// MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+MACHINE_DRIVER_END
+
+
+/***************************************************************************
+
+ Game driver(s)
+
+***************************************************************************/
+
+ROM_START( spaceg )
+ ROM_REGION( 0x10000, REGION_CPU1, 0 )
+ ROM_LOAD( "1.9a", 0x0000, 0x0400, CRC(d6f80b0e) SHA1(503e832c065bb302ec60ed239c4d99a605cb931a) )
+ ROM_LOAD( "2.8a", 0x0400, 0x0400, CRC(708b8eec) SHA1(70f9b1506a653985d9d3eacba220f0a4eb241318) )
+ ROM_LOAD( "3.9b", 0x0800, 0x0400, CRC(7f0b5cb4) SHA1(97a7125d046e7191b5d3be8f203d1bbb6f988209) )
+ ROM_LOAD( "4.8b", 0x0c00, 0x0400, CRC(8b40a154) SHA1(f42bdd8e94090fc5eae58e833b8443300d3ce991) )
+ ROM_LOAD( "5.9c", 0x1000, 0x0400, CRC(5279241c) SHA1(7278b6b037322b2f75311ed247f2de3c4816681b) )
+ ROM_LOAD( "6.8c", 0x1400, 0x0400, CRC(9b84fe3a) SHA1(7ebeca10ee11d22f4af06be9f381f46864464ec2) )
+ ROM_LOAD( "7.9d", 0x1800, 0x0400, CRC(95279b25) SHA1(367d129d4dd2cfea2a2f4703f41f24cc49453715) )
+ ROM_LOAD( "8.8d", 0x1c00, 0x0400, CRC(6a824383) SHA1(7c43f2c7d1f070d93f6a8b5b4f7f97f3578bd91d) )
+ ROM_LOAD( "13.9g", 0x3000, 0x0400, CRC(dccc386f) SHA1(5d493da3e7b8269314dd54f0b3ba9f71829a14da) )
+ ROM_LOAD( "14.8g", 0x3400, 0x0400, CRC(dc9a10c2) SHA1(8fb2316d6e8aeef558d0da5029e2932abf47a6b4) )
+ ROM_LOAD( "15.9h", 0x3800, 0x0400, CRC(55e2950d) SHA1(2241c3620c9a6df8b8bd234ccee9af5d3d19a5d4) )
+ ROM_LOAD( "16.8h", 0x3c00, 0x0400, CRC(567259c4) SHA1(b2c3f7aaceabea075af6a43b89fb7331732278c8) )
+ROM_END
+
+
+GAME( 1979, spaceg, 0, spaceg, spaceg, 0, ROT90, "Omori", "Space Guerrilla", GAME_IMPERFECT_GRAPHICS | GAME_NO_SOUND)