mario.c
来自「这个是延伸mame的在wince平台下的游戏模拟器的代码」· C语言 代码 · 共 613 行 · 第 1/2 页
C
613 行
/***************************************************************************
Mario Bros memory map (preliminary):
0000-5fff ROM
6000-6fff RAM
7000-73ff ?
7400-77ff Video RAM
f000-ffff ROM
read:
7c00 IN0
7c80 IN1
7f80 DSW
*
* IN0 (bits NOT inverted)
* bit 7 : TEST
* bit 6 : START 2
* bit 5 : START 1
* bit 4 : JUMP player 1
* bit 3 : ? DOWN player 1 ?
* bit 2 : ? UP player 1 ?
* bit 1 : LEFT player 1
* bit 0 : RIGHT player 1
*
*
* IN1 (bits NOT inverted)
* bit 7 : ?
* bit 6 : COIN 2
* bit 5 : COIN 1
* bit 4 : JUMP player 2
* bit 3 : ? DOWN player 2 ?
* bit 2 : ? UP player 2 ?
* bit 1 : LEFT player 2
* bit 0 : RIGHT player 2
*
*
* DSW (bits NOT inverted)
* bit 7 : \ difficulty
* bit 6 : / 00 = easy 01 = medium 10 = hard 11 = hardest
* bit 5 : \ bonus
* bit 4 : / 00 = 20000 01 = 30000 10 = 40000 11 = none
* bit 3 : \ coins per play
* bit 2 : /
* bit 1 : \ 00 = 3 lives 01 = 4 lives
* bit 0 : / 10 = 5 lives 11 = 6 lives
*
write:
7d00 vertical scroll (pow)
7d80 ?
7e00 sound
7e80-7e82 ?
7e83 sprite palette bank select
7e84 interrupt enable
7e85 ?
7f00-7f07 sound triggers
I/O ports
write:
00 ?
***************************************************************************/
#include "driver.h"
#include "vidhrdw/generic.h"
#include "I8039/I8039.h"
static int p[8] = { 0,0xf0,0,0,0,0,0,0 };
static int t[2] = { 0,0 };
extern unsigned char *mario_scrolly;
void mario_gfxbank_w(int offset,int data);
void mario_palettebank_w(int offset,int data);
int mario_vh_start(void);
void mario_vh_convert_color_prom(unsigned char *palette, unsigned short *colortable,const unsigned char *color_prom);
void mario_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh);
/*
* from sndhrdw/mario.c
*/
void mario_sh_w(int offset,int data);
void mario_sh1_w(int offset,int data);
void mario_sh2_w(int offset,int data);
void mario_sh3_w(int offset,int data);
#define ACTIVELOW_PORT_BIT(P,A,D) ((P & (~(1 << A))) | ((D ^ 1) << A))
#define ACTIVEHIGH_PORT_BIT(P,A,D) ((P & (~(1 << A))) | (D << A))
void mario_sh_growing(int offset, int data) { t[1] = data; }
void mario_sh_getcoin(int offset, int data) { t[0] = data; }
void mario_sh_crab(int offset, int data) { p[1] = ACTIVEHIGH_PORT_BIT(p[1],0,data); }
void mario_sh_turtle(int offset, int data) { p[1] = ACTIVEHIGH_PORT_BIT(p[1],1,data); }
void mario_sh_fly(int offset, int data) { p[1] = ACTIVEHIGH_PORT_BIT(p[1],2,data); }
static void mario_sh_tuneselect(int offset, int data) { soundlatch_w(offset,data); }
static int mario_sh_getp1(int offset) { return p[1]; }
static int mario_sh_getp2(int offset) { return p[2]; }
static int mario_sh_gett0(int offset) { return t[0]; }
static int mario_sh_gett1(int offset) { return t[1]; }
static int mario_sh_gettune(int offset) { return soundlatch_r(offset); }
static void mario_sh_putsound(int offset, int data)
{
DAC_data_w(0,data);
}
static void mario_sh_putp1(int offset, int data)
{
p[1] = data;
}
static void mario_sh_putp2(int offset, int data)
{
p[2] = data;
}
void masao_sh_irqtrigger_w(int offset,int data)
{
static int last;
if (last == 1 && data == 0)
{
/* setting bit 0 high then low triggers IRQ on the sound CPU */
cpu_cause_interrupt(1,0xff);
}
last = data;
}
static struct MemoryReadAddress readmem[] =
{
{ 0x0000, 0x5fff, MRA_ROM },
{ 0x6000, 0x6fff, MRA_RAM },
{ 0x7400, 0x77ff, MRA_RAM }, /* video RAM */
{ 0x7c00, 0x7c00, input_port_0_r }, /* IN0 */
{ 0x7c80, 0x7c80, input_port_1_r }, /* IN1 */
{ 0x7f80, 0x7f80, input_port_2_r }, /* DSW */
{ 0xf000, 0xffff, MRA_ROM },
{ -1 } /* end of table */
};
static struct MemoryWriteAddress writemem[] =
{
{ 0x0000, 0x5fff, MWA_ROM },
{ 0x6000, 0x68ff, MWA_RAM },
{ 0x6a80, 0x6fff, MWA_RAM },
{ 0x6900, 0x6a7f, MWA_RAM, &spriteram, &spriteram_size },
{ 0x7400, 0x77ff, videoram_w, &videoram, &videoram_size },
{ 0x7c00, 0x7c00, mario_sh1_w }, /* Mario run sample */
{ 0x7c80, 0x7c80, mario_sh2_w }, /* Luigi run sample */
{ 0x7d00, 0x7d00, MWA_RAM, &mario_scrolly },
{ 0x7e80, 0x7e80, mario_gfxbank_w },
{ 0x7e83, 0x7e83, mario_palettebank_w },
{ 0x7e84, 0x7e84, interrupt_enable_w },
{ 0x7f01, 0x7f01, mario_sh_getcoin },
{ 0x7f03, 0x7f03, mario_sh_crab },
{ 0x7f04, 0x7f04, mario_sh_turtle },
{ 0x7f05, 0x7f05, mario_sh_fly },
{ 0x7f00, 0x7f07, mario_sh3_w }, /* Misc discrete samples */
{ 0x7e00, 0x7e00, mario_sh_tuneselect },
{ 0x7000, 0x73ff, MWA_NOP }, /* ??? */
{ 0xf000, 0xffff, MWA_ROM },
{ -1 } /* end of table */
};
static struct MemoryWriteAddress masao_writemem[] =
{
{ 0x0000, 0x5fff, MWA_ROM },
{ 0x6000, 0x68ff, MWA_RAM },
{ 0x6a80, 0x6fff, MWA_RAM },
{ 0x6900, 0x6a7f, MWA_RAM, &spriteram, &spriteram_size },
{ 0x7400, 0x77ff, videoram_w, &videoram, &videoram_size },
{ 0x7d00, 0x7d00, MWA_RAM, &mario_scrolly },
{ 0x7e00, 0x7e00, soundlatch_w },
{ 0x7e80, 0x7e80, mario_gfxbank_w },
{ 0x7e83, 0x7e83, mario_palettebank_w },
{ 0x7e84, 0x7e84, interrupt_enable_w },
{ 0x7000, 0x73ff, MWA_NOP }, /* ??? */
{ 0x7f00, 0x7f00, masao_sh_irqtrigger_w },
{ 0xf000, 0xffff, MWA_ROM },
{ -1 } /* end of table */
};
static struct IOWritePort mario_writeport[] =
{
{ 0x00, 0x00, IOWP_NOP }, /* unknown... is this a trigger? */
{ -1 } /* end of table */
};
static struct MemoryReadAddress readmem_sound[] =
{
{ 0x0000, 0x0fff, MRA_ROM },
{ -1 } /* end of table */
};
static struct MemoryWriteAddress writemem_sound[] =
{
{ 0x0000, 0x0fff, MWA_ROM },
{ -1 } /* end of table */
};
static struct IOReadPort readport_sound[] =
{
{ 0x00, 0xff, mario_sh_gettune },
{ I8039_p1, I8039_p1, mario_sh_getp1 },
{ I8039_p2, I8039_p2, mario_sh_getp2 },
{ I8039_t0, I8039_t0, mario_sh_gett0 },
{ I8039_t1, I8039_t1, mario_sh_gett1 },
{ -1 } /* end of table */
};
static struct IOWritePort writeport_sound[] =
{
{ 0x00, 0xff, mario_sh_putsound },
{ I8039_p1, I8039_p1, mario_sh_putp1 },
{ I8039_p2, I8039_p2, mario_sh_putp2 },
{ -1 } /* end of table */
};
INPUT_PORTS_START( input_ports )
PORT_START /* IN0 */
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT | IPF_2WAY )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT | IPF_2WAY )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_START1 )
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_START2 )
PORT_BITX(0x80, IP_ACTIVE_HIGH, IPT_SERVICE, "Service Mode", OSD_KEY_F2, IP_JOY_NONE, 0 )
PORT_START /* IN1 */
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT | IPF_2WAY | IPF_PLAYER2 )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT | IPF_2WAY | IPF_PLAYER2 )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 | IPF_PLAYER2 )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_COIN2 )
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_COIN1 )
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_START /* DSW0 */
PORT_DIPNAME( 0x03, 0x00, "Lives", IP_KEY_NONE )
PORT_DIPSETTING( 0x00, "3" )
PORT_DIPSETTING( 0x01, "4" )
PORT_DIPSETTING( 0x02, "5" )
PORT_DIPSETTING( 0x03, "6" )
PORT_DIPNAME( 0x0c, 0x00, "Coinage", IP_KEY_NONE )
PORT_DIPSETTING( 0x04, "2 Coins/1 Credit" )
PORT_DIPSETTING( 0x00, "1 Coin/1 Credit" )
PORT_DIPSETTING( 0x08, "1 Coin/2 Credits" )
PORT_DIPSETTING( 0x0c, "1 Coin/3 Credits" )
PORT_DIPNAME( 0x30, 0x00, "Bonus Life", IP_KEY_NONE )
PORT_DIPSETTING( 0x00, "20000" )
PORT_DIPSETTING( 0x10, "30000" )
PORT_DIPSETTING( 0x20, "40000" )
PORT_DIPSETTING( 0x30, "None" )
PORT_DIPNAME( 0xc0, 0x00, "Difficulty", IP_KEY_NONE )
PORT_DIPSETTING( 0x00, "Easy" )
PORT_DIPSETTING( 0x40, "Medium" )
PORT_DIPSETTING( 0x80, "Hard" )
PORT_DIPSETTING( 0xc0, "Hardest" )
INPUT_PORTS_END
static struct GfxLayout charlayout =
{
8,8, /* 8*8 characters */
512, /* 512 characters */
2, /* 2 bits per pixel */
{ 512*8*8, 0 }, /* the bitplanes are separated */
{ 0, 1, 2, 3, 4, 5, 6, 7 }, /* pretty straightforward layout */
{ 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 */
256, /* 256 sprites */
3, /* 3 bits per pixel */
{ 2*256*16*16, 256*16*16, 0 }, /* the bitplanes are separated */
{ 0, 1, 2, 3, 4, 5, 6, 7, /* the two halves of the sprite are separated */
256*16*8+0, 256*16*8+1, 256*16*8+2, 256*16*8+3, 256*16*8+4, 256*16*8+5, 256*16*8+6, 256*16*8+7 },
{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8,
8*8, 9*8, 10*8, 11*8, 12*8, 13*8, 14*8, 15*8 },
16*8 /* every sprite takes 16 consecutive bytes */
};
static struct GfxDecodeInfo gfxdecodeinfo[] =
{
{ 1, 0x0000, &charlayout, 0, 16 },
{ 1, 0x2000, &spritelayout, 16*4, 32 },
{ -1 } /* end of array */
};
static struct DACinterface dac_interface =
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?