📄 ckongs.c
字号:
/***************************************************************************
Crazy Kong running on Scamble board memory map (preliminary)
MAIN BOARD:
0000-5fff ROM
6000-6bff RAM
9000-93ff Video RAM
9800-98ff Object RAM
9800-983f screen attributes
9840-985f sprites
9860-987f bullets
9880-98ff unused?
read:
b000 Watchdog Reset
7000 IN0
7001 IN1
7002 IN2
write:
a801 interrupt enable
a802 coin counter
a803 ? (POUT1)
a804 stars on
a805 ? (POUT2)
a806 screen vertical flip
a807 screen horizontal flip
7800 To AY-3-8910 port A (commands for the audio CPU)
7801 bit 3 = interrupt trigger on audio CPU bit 4 = AMPM (?)
SOUND BOARD:
0000-1fff ROM
8000-83ff RAM
I/0 ports:
read:
20 8910 #2 read
80 8910 #1 read
write
10 8910 #2 control
20 8910 #2 write
40 8910 #1 control
80 8910 #1 write
interrupts:
interrupt mode 1 triggered by the main CPU
***************************************************************************/
#include "driver.h"
#include "vidhrdw/generic.h"
extern unsigned char *galaxian_attributesram;
extern unsigned char *galaxian_bulletsram;
extern int galaxian_bulletsram_size;
void galaxian_vh_convert_color_prom(unsigned char *palette, unsigned short *colortable,const unsigned char *color_prom);
void galaxian_flipx_w(int offset,int data);
void galaxian_flipy_w(int offset,int data);
void galaxian_attributes_w(int offset,int data);
void galaxian_stars_w(int offset,int data);
int ckongs_vh_start(void);
void galaxian_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh);
int scramble_vh_interrupt(void);
int scramble_portB_r(int offset);
void scramble_sh_irqtrigger_w(int offset,int data);
int ckongs_input_port_1_r(int offset)
{
return (readinputport(1) & 0xfc) | ((readinputport(2) & 0x06) >> 1);
}
int ckongs_input_port_2_r(int offset)
{
return (readinputport(2) & 0xf9) | ((readinputport(1) & 0x03) << 1);
}
static struct MemoryReadAddress readmem[] =
{
{ 0x0000, 0x5fff, MRA_ROM },
{ 0x6000, 0x6bff, MRA_RAM }, /* RAM */
{ 0x7000, 0x7000, input_port_0_r }, /* IN0 */
{ 0x7001, 0x7001, ckongs_input_port_1_r }, /* IN1 */
{ 0x7002, 0x7002, ckongs_input_port_2_r }, /* IN2 */
{ 0x9000, 0x93ff, MRA_RAM }, /* Video RAM */
{ 0x9800, 0x987f, MRA_RAM }, /* screen attributes, sprites, bullets */
{ 0xb000, 0xb000, watchdog_reset_r },
{ -1 } /* end of table */
};
static struct MemoryWriteAddress writemem[] =
{
{ 0x0000, 0x5fff, MWA_ROM },
{ 0x6000, 0x6bff, MWA_RAM },
{ 0x7800, 0x7800, soundlatch_w },
{ 0x7801, 0x7801, scramble_sh_irqtrigger_w },
{ 0x9000, 0x93ff, videoram_w, &videoram, &videoram_size },
{ 0x9800, 0x983f, galaxian_attributes_w, &galaxian_attributesram },
{ 0x9840, 0x985f, MWA_RAM, &spriteram, &spriteram_size },
{ 0x9860, 0x987f, MWA_RAM, &galaxian_bulletsram, &galaxian_bulletsram_size },
{ 0xa801, 0xa801, interrupt_enable_w },
{ 0xa802, 0xa802, MWA_NOP },
{ 0xa804, 0xa804, galaxian_stars_w },
{ 0xa806, 0xa806, galaxian_flipx_w },
{ 0xa807, 0xa807, galaxian_flipy_w },
{ -1 } /* end of table */
};
static struct MemoryReadAddress sound_readmem[] =
{
{ 0x0000, 0x1fff, MRA_ROM },
{ 0x8000, 0x83ff, MRA_RAM },
{ -1 } /* end of table */
};
static struct MemoryWriteAddress sound_writemem[] =
{
{ 0x0000, 0x1fff, MWA_ROM },
{ 0x8000, 0x83ff, MWA_RAM },
{ -1 } /* end of table */
};
static struct IOReadPort sound_readport[] =
{
{ 0x80, 0x80, AY8910_read_port_0_r },
{ 0x20, 0x20, AY8910_read_port_1_r },
{ -1 } /* end of table */
};
static struct IOWritePort sound_writeport[] =
{
{ 0x40, 0x40, AY8910_control_port_0_w },
{ 0x80, 0x80, AY8910_write_port_0_w },
{ 0x10, 0x10, AY8910_control_port_1_w },
{ 0x20, 0x20, AY8910_write_port_1_w },
{ -1 } /* end of table */
};
INPUT_PORTS_START( input_ports )
PORT_START /* IN0 */
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_4WAY | IPF_COCKTAIL )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* probably unused */
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* probably unused */
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_4WAY )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_4WAY )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN2 )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_START /* IN1 */
/* the coinage dip switch is spread across bits 0/1 of port 1 and bit 3 of port 2. */
/* To handle that, we swap bits 0/1 of port 1 and bits 1/2 of port 2 - this is handled */
/* by ckongs_input_port_N_r() */
PORT_DIPNAME( 0x01, 0x00, "Cabinet", IP_KEY_NONE )
PORT_DIPSETTING( 0x00, "Upright" )
PORT_DIPSETTING( 0x01, "Cocktail" )
PORT_DIPNAME( 0x02, 0x02, "Lives", IP_KEY_NONE )
PORT_DIPSETTING( 0x02, "3" )
PORT_DIPSETTING( 0x00, "4" )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* probably unused */
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_COCKTAIL )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_4WAY | IPF_COCKTAIL )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_4WAY | IPF_COCKTAIL )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START2 )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START1 )
PORT_START /* IN2 */
/* the coinage dip switch is spread across bits 0/1 of port 1 and bit 3 of port 2. */
/* To handle that, we swap bits 0/1 of port 1 and bits 1/2 of port 2 - this is handled */
/* by ckongs_input_port_N_r() */
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_4WAY | IPF_COCKTAIL )
PORT_DIPNAME( 0x0e, 0x0e, "Coinage", IP_KEY_NONE )
PORT_DIPSETTING( 0x00, "5 Coins/1 Credit" )
PORT_DIPSETTING( 0x02, "4 Coins/1 Credit" )
PORT_DIPSETTING( 0x08, "3 Coins/1 Credit" )
PORT_DIPSETTING( 0x0a, "2 Coins/1 Credit" )
PORT_DIPSETTING( 0x0e, "1 Coin/1 Credit" )
PORT_DIPSETTING( 0x0c, "1 Coin/2 Credits" )
PORT_DIPSETTING( 0x06, "1 Coin/3 Credits" )
PORT_DIPSETTING( 0x04, "1 Coin/4 Credits" )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_4WAY )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* probably unused */
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_4WAY )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* probably unused */
INPUT_PORTS_END
static struct GfxLayout charlayout =
{
8,8, /* 8*8 characters */
256, /* 256 characters */
2, /* 2 bits per pixel */
{ 0, 512*8*8 }, /* the two bitplanes are separated */
{ 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 /* every char takes 8 consecutive bytes */
};
static struct GfxLayout spritelayout =
{
16,16, /* 16*16 sprites */
128, /* 128 sprites */
2, /* 2 bits per pixel */
{ 0, 128*16*16 }, /* the two bitplanes are separated */
{ 0, 1, 2, 3, 4, 5, 6, 7,
8*8+0, 8*8+1, 8*8+2, 8*8+3, 8*8+4, 8*8+5, 8*8+6, 8*8+7 },
{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8,
16*8, 17*8, 18*8, 19*8, 20*8, 21*8, 22*8, 23*8 },
32*8 /* every sprite takes 32 consecutive bytes */
};
static struct GfxLayout bulletlayout =
{
/* there is no gfx ROM for this one, it is generated by the hardware */
3,1, /* 3*1 line */
1, /* just one */
1, /* 1 bit per pixel */
{ 0 },
{ 2, 2, 2 }, /* I "know" that this bit of the */
{ 0 }, /* graphics ROMs is 1 */
0 /* no use */
};
static struct GfxDecodeInfo gfxdecodeinfo[] =
{
{ 1, 0x0000, &charlayout, 0, 8 },
{ 1, 0x0000, &spritelayout, 0, 8 },
{ 1, 0x0000, &bulletlayout, 8*4, 2 },
{ -1 } /* end of array */
};
static struct AY8910interface ay8910_interface =
{
2, /* 2 chips */
1789750, /* 1.78975 MHz */
{ 0x30ff, 0x30ff },
{ soundlatch_r },
{ scramble_portB_r },
{ 0 },
{ 0 }
};
static struct MachineDriver machine_driver =
{
/* basic machine hardware */
{
{
CPU_Z80,
3072000, /* 3.072 Mhz */
0,
readmem,writemem,0,0,
scramble_vh_interrupt,1
},
{
CPU_Z80 | CPU_AUDIO_CPU,
1789750, /* 1.78975 Mhz */
3, /* memory region #2 */
sound_readmem,sound_writemem,sound_readport,sound_writeport,
ignore_interrupt,1 /* interrupts are triggered by the main CPU */
}
},
60, DEFAULT_60HZ_VBLANK_DURATION, /* frames per second, vblank duration */
1, /* 1 CPU slice per frame - interleaving is forced when a sound command is written */
0,
/* video hardware */
32*8, 32*8, { 0*8, 32*8-1, 2*8, 30*8-1 },
gfxdecodeinfo,
32+64,8*4+2*2, /* 32 for the characters, 64 for the stars */
galaxian_vh_convert_color_prom,
VIDEO_TYPE_RASTER,
0,
ckongs_vh_start,
generic_vh_stop,
galaxian_vh_screenrefresh,
/* sound hardware */
0,0,0,0,
{
{
SOUND_AY8910,
&ay8910_interface
}
}
};
/***************************************************************************
Game driver(s)
***************************************************************************/
ROM_START( ckongs_rom )
ROM_REGION(0x10000) /* 64k for code */
ROM_LOAD( "vid_2c.bin", 0x0000, 0x1000, 0x49a8c234 )
ROM_LOAD( "vid_2e.bin", 0x1000, 0x1000, 0xf1b667f1 )
ROM_LOAD( "vid_2f.bin", 0x2000, 0x1000, 0xb194b75d )
ROM_LOAD( "vid_2h.bin", 0x3000, 0x1000, 0x2052ba8a )
ROM_LOAD( "vid_2j.bin", 0x4000, 0x1000, 0xb377afd0 )
ROM_LOAD( "vid_2l.bin", 0x5000, 0x1000, 0xfe65e691 )
ROM_REGION_DISPOSE(0x2000) /* temporary space for graphics (disposed after conversion) */
ROM_LOAD( "vid_5f.bin", 0x0000, 0x1000, 0x7866d2cb )
ROM_LOAD( "vid_5h.bin", 0x1000, 0x1000, 0x7311a101 )
ROM_REGION(0x20) /* color prom */
ROM_LOAD( "vid_6e.bin", 0x0000, 0x20, 0x5039af97 )
ROM_REGION(0x10000) /* 64k for the audio CPU */
ROM_LOAD( "snd_5c.bin", 0x0000, 0x1000, 0xf0c30f9a )
ROM_LOAD( "snd_5d.bin", 0x1000, 0x1000, 0x892c9547 )
ROM_END
/* hsc 12/01/98 */
static int hiload(void)
{
unsigned char *RAM = Machine->memory_region[Machine->drv->cpu[0].memory_region];
/* check if the hi score table has already been initialized */
/* NOTE : 60b8 + 3 */
if (memcmp(&RAM[0x6109],"\x07\x06\x05",3) == 0 && memcmp(&RAM[0x61a0],"\xfd\xfd\xfd",3) == 0 )
{
void *f;
if ((f = osd_fopen(Machine->gamedrv->name,0,OSD_FILETYPE_HIGHSCORE,0)) != 0)
{
int hi;
osd_fread(f,&RAM[0x6107],155);
osd_fclose(f);
hi = (RAM[0x610b] &0x0f) * 0x10 +
(RAM[0x610c] &0x0f);
RAM[0x60b8] = hi;
hi = (RAM[0x6109] &0x0f) * 0x10 +
(RAM[0x610a] &0x0f);
RAM[0x60b9] = hi;
hi = (RAM[0x6107] &0x0f) * 0x10 +
(RAM[0x6108] &0x0f);
RAM[0x60ba] = hi;
}
return 1;
}
else
return 0; /* we can't load the hi scores yet */
}
static void hisave(void)
{
void *f;
unsigned char *RAM = Machine->memory_region[Machine->drv->cpu[0].memory_region];
if ((f = osd_fopen(Machine->gamedrv->name,0,OSD_FILETYPE_HIGHSCORE,1)) != 0)
{
osd_fwrite(f,&RAM[0x6107],155);
osd_fclose(f);
}
}
extern struct GameDriver ckong_driver;
struct GameDriver ckongs_driver =
{
__FILE__,
&ckong_driver,
"ckongs",
"Crazy Kong (Scramble Hardware)",
"1981",
"bootleg",
"Nicola Salmoria (MAME driver)",
0,
&machine_driver,
0,
ckongs_rom,
0, 0,
0,
0, /* sound_prom */
input_ports,
PROM_MEMORY_REGION(2), 0, 0,
ORIENTATION_ROTATE_90,
hiload, hisave /* hsc 12/01/98 */
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -