From 5a9fe25e7dba9304de04ced6e71456603e9f3e81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Banaan=20Ananas?= Date: Mon, 31 Mar 2014 19:58:13 +0000 Subject: [PATCH] fixed foreground colors, fixed background wrap, added notes --- src/mame/drivers/kopunch.c | 111 +++++++++++++++++++++--------------- src/mame/includes/kopunch.h | 46 ++++++++------- src/mame/video/kopunch.c | 40 +++++++++---- 3 files changed, 117 insertions(+), 80 deletions(-) diff --git a/src/mame/drivers/kopunch.c b/src/mame/drivers/kopunch.c index 89bc93df499..5511deab4df 100644 --- a/src/mame/drivers/kopunch.c +++ b/src/mame/drivers/kopunch.c @@ -1,6 +1,30 @@ /******************************************************** - KO Punch (c) 1981 Sega + KO Punch (c) 1981 Sega + + XTAL: ? + CPU: 8085 (proof: it uses SIM opcode) + + TODO: + - discrete sound? + - figure out sensors + - coins sometimes don't register + + +********************************************************* + + This is a simple boxing bag game, but for visual feedback + it has a small CRT instead of LEDs or a dial. + + Insert coin, select your weightclass (7 buttons on cab), and punch. + + Heavyweight - 300K + Middleweight - 260K + Welterweight - 230K + Lightweight - 200K + Featherweight - 170K + Bantamweight - 140K + Flyweight - 100K ********************************************************/ @@ -8,6 +32,7 @@ #include "cpu/i8085/i8085.h" #include "includes/kopunch.h" + INTERRUPT_GEN_MEMBER(kopunch_state::kopunch_interrupt) { device.execute().set_input_line(I8085_RST75_LINE, ASSERT_LINE); @@ -26,9 +51,6 @@ READ8_MEMBER(kopunch_state::kopunch_in_r) WRITE8_MEMBER(kopunch_state::kopunch_lamp_w) { set_led_status(machine(), 0, ~data & 0x80); - -// if ((data & 0x7f) != 0x7f) -// popmessage("port 38 = %02x",data); } WRITE8_MEMBER(kopunch_state::kopunch_coin_w) @@ -36,8 +58,8 @@ WRITE8_MEMBER(kopunch_state::kopunch_coin_w) coin_counter_w(machine(), 0, ~data & 0x80); coin_counter_w(machine(), 1, ~data & 0x40); -// if ((data & 0x3f) != 0x3f) -// popmessage("port 34 = %02x",data); +// if ((data & 0x3f) != 0x3e) +// printf("port 34 = %02x ",data); } @@ -45,9 +67,9 @@ WRITE8_MEMBER(kopunch_state::kopunch_coin_w) static ADDRESS_MAP_START( kopunch_map, AS_PROGRAM, 8, kopunch_state ) AM_RANGE(0x0000, 0x1fff) AM_ROM AM_RANGE(0x2000, 0x23ff) AM_RAM - AM_RANGE(0x6000, 0x63ff) AM_RAM_WRITE(kopunch_videoram_w) AM_SHARE("videoram") - AM_RANGE(0x7000, 0x70ff) AM_RAM_WRITE(kopunch_videoram2_w) AM_SHARE("videoram2") - AM_RANGE(0x7100, 0x7aff) AM_RAM // ??? + AM_RANGE(0x6000, 0x63ff) AM_RAM_WRITE(kopunch_fg_w) AM_SHARE("vram_fg") + AM_RANGE(0x7000, 0x70ff) AM_RAM_WRITE(kopunch_bg_w) AM_SHARE("vram_bg") + AM_RANGE(0x7100, 0x73ff) AM_RAM // unused vram ADDRESS_MAP_END static ADDRESS_MAP_START( kopunch_io_map, AS_IO, 8, kopunch_state ) @@ -70,36 +92,36 @@ ADDRESS_MAP_END INPUT_CHANGED_MEMBER(kopunch_state::left_coin_inserted) { - /* left coin insertion causes a rst6.5 (vector 0x34) */ + // left coin insertion causes a rst6.5 (vector 0x34) if (newval) m_maincpu->set_input_line(I8085_RST65_LINE, HOLD_LINE); } INPUT_CHANGED_MEMBER(kopunch_state::right_coin_inserted) { - /* right coin insertion causes a rst5.5 (vector 0x2c) */ + // right coin insertion causes a rst5.5 (vector 0x2c) if (newval) m_maincpu->set_input_line(I8085_RST55_LINE, HOLD_LINE); } static INPUT_PORTS_START( kopunch ) PORT_START("P1") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_4WAY - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_4WAY - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_4WAY - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_4WAY - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON4 ) - - PORT_START("SYSTEM") - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_SPECIAL ) /* punch strength (high 3 bits) */ - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_IMPULSE(1) PORT_CHANGED_MEMBER(DEVICE_SELF, kopunch_state,right_coin_inserted, 0) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON7 ) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(1) PORT_CHANGED_MEMBER(DEVICE_SELF, kopunch_state,left_coin_inserted, 0) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) // related to above startbuttons + + PORT_START("SYSTEM") + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_SPECIAL ) // punch strength (high 3 bits) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, kopunch_state, right_coin_inserted, 0) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_SPECIAL ) // sensor + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_SPECIAL ) // sensor + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SPECIAL ) // sensor + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, kopunch_state, left_coin_inserted, 0) PORT_START("DSW") PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) ) @@ -128,13 +150,10 @@ static INPUT_PORTS_START( kopunch ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_START("P2") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_4WAY PORT_COCKTAIL - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_4WAY PORT_COCKTAIL - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_4WAY PORT_COCKTAIL - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_4WAY PORT_COCKTAIL - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_COCKTAIL + PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) // ? these 3 are read at the same time: p2>>4, and 7, <<1, read from a table + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) // " + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) // " PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE1 ) INPUT_PORTS_END @@ -162,30 +181,30 @@ static const gfx_layout charlayoutbig = }; static GFXDECODE_START( kopunch ) - GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 1 ) + GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 1 ) GFXDECODE_ENTRY( "gfx2", 0, charlayoutbig, 0, 1 ) GFXDECODE_END void kopunch_state::machine_start() { - save_item(NAME(m_gfxbank)); -} - -void kopunch_state::machine_reset() -{ + // zerofill m_gfxbank = 0; + m_scrollx = 0; + + // savestates + save_item(NAME(m_gfxbank)); + save_item(NAME(m_scrollx)); } static MACHINE_CONFIG_START( kopunch, kopunch_state ) /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", I8085A, 4000000) /* 4 MHz ???? Uses SIM, must be 8085 */ + MCFG_CPU_ADD("maincpu", I8085A, 4000000) // 4 MHz? MCFG_CPU_PROGRAM_MAP(kopunch_map) MCFG_CPU_IO_MAP(kopunch_io_map) MCFG_CPU_VBLANK_INT_DRIVER("screen", kopunch_state, kopunch_interrupt) - /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) @@ -215,9 +234,9 @@ ROM_START( kopunch ) ROM_LOAD( "epr1106.x", 0x1000, 0x1000, CRC(25a5c68b) SHA1(9761418c6f3903f8aaceece658739fe5bf5c0803) ) ROM_REGION( 0x1800, "gfx1", 0 ) - ROM_LOAD( "epr1102", 0x0000, 0x0800, CRC(8a52de96) SHA1(5abdaa83c6bfea81395cb190f5364b72811927ba) ) - ROM_LOAD( "epr1103", 0x0800, 0x0800, CRC(bae5e054) SHA1(95373123ab64543cdffb7ee9e02d0613c5c494bf) ) - ROM_LOAD( "epr1104", 0x1000, 0x0800, CRC(7b119a0e) SHA1(454f01355fa9512a7442990cc92da7bc7a8d6b68) ) + ROM_LOAD( "epr1103", 0x0000, 0x0800, CRC(bae5e054) SHA1(95373123ab64543cdffb7ee9e02d0613c5c494bf) ) + ROM_LOAD( "epr1104", 0x0800, 0x0800, CRC(7b119a0e) SHA1(454f01355fa9512a7442990cc92da7bc7a8d6b68) ) + ROM_LOAD( "epr1102", 0x1000, 0x0800, CRC(8a52de96) SHA1(5abdaa83c6bfea81395cb190f5364b72811927ba) ) ROM_REGION( 0x6000, "gfx2", 0 ) ROM_LOAD( "epr1107", 0x0000, 0x1000, CRC(ca00244d) SHA1(690931ea1bef9d80dcd7bd2ea2462b083c884a89) ) @@ -228,9 +247,9 @@ ROM_START( kopunch ) ROM_LOAD( "epr1111", 0x5000, 0x1000, CRC(28530ec9) SHA1(1a8782d37128cdb43133fc891cde93d2bdd5476b) ) ROM_REGION( 0x0060, "proms", 0 ) - ROM_LOAD( "epr1101", 0x0000, 0x0020, CRC(15600f5d) SHA1(130179f79761cb16316c544e3c689bc10431db30) ) /* palette */ - ROM_LOAD( "epr1099", 0x0020, 0x0020, CRC(fc58c456) SHA1(f27c3ad669dfdc33bcd7e0481fa01bf34973e816) ) /* unknown */ - ROM_LOAD( "epr1100", 0x0040, 0x0020, CRC(bedb66b1) SHA1(8e78bb205d900075b761e1baa5f5813174ff28ba) ) /* unknown */ + ROM_LOAD( "epr1101", 0x0000, 0x0020, CRC(15600f5d) SHA1(130179f79761cb16316c544e3c689bc10431db30) ) /* palette */ + ROM_LOAD( "epr1099", 0x0020, 0x0020, CRC(fc58c456) SHA1(f27c3ad669dfdc33bcd7e0481fa01bf34973e816) ) /* unknown */ + ROM_LOAD( "epr1100", 0x0040, 0x0020, CRC(bedb66b1) SHA1(8e78bb205d900075b761e1baa5f5813174ff28ba) ) /* unknown */ ROM_END -GAME( 1981, kopunch, 0, kopunch, kopunch, driver_device, 0, ROT270, "Sega", "KO Punch", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) +GAME( 1981, kopunch, 0, kopunch, kopunch, driver_device, 0, ROT270, "Sega", "KO Punch", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL | GAME_SUPPORTS_SAVE ) diff --git a/src/mame/includes/kopunch.h b/src/mame/includes/kopunch.h index 8fb7965f7e1..be423124882 100644 --- a/src/mame/includes/kopunch.h +++ b/src/mame/includes/kopunch.h @@ -1,6 +1,6 @@ /************************************************************************* - KO Punch + Sega KO Punch *************************************************************************/ @@ -9,43 +9,45 @@ class kopunch_state : public driver_device public: kopunch_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), - m_videoram(*this, "videoram"), - m_videoram2(*this, "videoram2"), m_maincpu(*this, "maincpu"), - m_gfxdecode(*this, "gfxdecode") { } - - /* memory pointers */ - required_shared_ptr m_videoram; - required_shared_ptr m_videoram2; - UINT8 * m_colorram; - UINT8 * m_spriteram; - size_t m_spriteram_size; - - /* video-related */ - tilemap_t *m_bg_tilemap; - tilemap_t *m_fg_tilemap; - int m_gfxbank; + m_gfxdecode(*this, "gfxdecode"), + m_vram_fg(*this, "vram_fg"), + m_vram_bg(*this, "vram_bg") + { } /* devices */ required_device m_maincpu; required_device m_gfxdecode; - + + /* memory pointers */ + required_shared_ptr m_vram_fg; + required_shared_ptr m_vram_bg; + + /* video-related */ + tilemap_t *m_bg_tilemap; + tilemap_t *m_fg_tilemap; + UINT8 m_gfxbank; + UINT8 m_scrollx; + DECLARE_READ8_MEMBER(kopunch_in_r); DECLARE_WRITE8_MEMBER(kopunch_lamp_w); DECLARE_WRITE8_MEMBER(kopunch_coin_w); - DECLARE_WRITE8_MEMBER(kopunch_videoram_w); - DECLARE_WRITE8_MEMBER(kopunch_videoram2_w); + DECLARE_WRITE8_MEMBER(kopunch_fg_w); + DECLARE_WRITE8_MEMBER(kopunch_bg_w); DECLARE_WRITE8_MEMBER(kopunch_scroll_x_w); DECLARE_WRITE8_MEMBER(kopunch_scroll_y_w); DECLARE_WRITE8_MEMBER(kopunch_gfxbank_w); + DECLARE_INPUT_CHANGED_MEMBER(left_coin_inserted); DECLARE_INPUT_CHANGED_MEMBER(right_coin_inserted); + TILE_GET_INFO_MEMBER(get_fg_tile_info); TILE_GET_INFO_MEMBER(get_bg_tile_info); - virtual void machine_start(); - virtual void machine_reset(); - virtual void video_start(); DECLARE_PALETTE_INIT(kopunch); UINT32 screen_update_kopunch(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + + virtual void machine_start(); + virtual void video_start(); + INTERRUPT_GEN_MEMBER(kopunch_interrupt); }; diff --git a/src/mame/video/kopunch.c b/src/mame/video/kopunch.c index a77f2be2af5..6fd1e259328 100644 --- a/src/mame/video/kopunch.c +++ b/src/mame/video/kopunch.c @@ -1,3 +1,11 @@ +/************************************************************************* + + Sega KO Punch + + Functions to emulate the video hardware of the machine. + +*************************************************************************/ + #include "emu.h" #include "includes/kopunch.h" @@ -5,10 +13,10 @@ PALETTE_INIT_MEMBER(kopunch_state, kopunch) { const UINT8 *color_prom = memregion("proms")->base(); - int i; - color_prom += 24; /* first 24 colors are black */ - for (i = 0; i < palette.entries(); i++) + color_prom += 24; // first 24 colors are black + + for (int i = 0; i < palette.entries(); i++) { int bit0, bit1, bit2, r, g, b; @@ -33,20 +41,21 @@ PALETTE_INIT_MEMBER(kopunch_state, kopunch) } } -WRITE8_MEMBER(kopunch_state::kopunch_videoram_w) +WRITE8_MEMBER(kopunch_state::kopunch_fg_w) { - m_videoram[offset] = data; + m_vram_fg[offset] = data; m_fg_tilemap->mark_tile_dirty(offset); } -WRITE8_MEMBER(kopunch_state::kopunch_videoram2_w) +WRITE8_MEMBER(kopunch_state::kopunch_bg_w) { - m_videoram2[offset] = data; + m_vram_bg[offset] = data; m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_MEMBER(kopunch_state::kopunch_scroll_x_w) { + m_scrollx = data; m_bg_tilemap->set_scrollx(0, data); } @@ -57,25 +66,28 @@ WRITE8_MEMBER(kopunch_state::kopunch_scroll_y_w) WRITE8_MEMBER(kopunch_state::kopunch_gfxbank_w) { + // d0-d2: bg gfx bank if (m_gfxbank != (data & 0x07)) { m_gfxbank = data & 0x07; m_bg_tilemap->mark_all_dirty(); } + // d3: flip y, other bits: unused m_bg_tilemap->set_flip((data & 0x08) ? TILEMAP_FLIPY : 0); } TILE_GET_INFO_MEMBER(kopunch_state::get_fg_tile_info) { - int code = m_videoram[tile_index]; + int code = m_vram_fg[tile_index]; SET_TILE_INFO_MEMBER(0, code, 0, 0); } TILE_GET_INFO_MEMBER(kopunch_state::get_bg_tile_info) { - int code = (m_videoram2[tile_index] & 0x7f) + 128 * m_gfxbank; + // note: highest bit is unused + int code = (m_vram_bg[tile_index] & 0x7f) | m_gfxbank << 7; SET_TILE_INFO_MEMBER(1, code, 0, 0); } @@ -86,13 +98,17 @@ void kopunch_state::video_start() m_bg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(kopunch_state::get_bg_tile_info),this), TILEMAP_SCAN_ROWS, 16, 16, 16, 16); m_fg_tilemap->set_transparent_pen(0); - - m_bg_tilemap->set_scrolldx(16, 16); } UINT32 kopunch_state::screen_update_kopunch(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0); + bitmap.fill(0, cliprect); + + // background does not wrap around horizontally + rectangle bg_clip = cliprect; + bg_clip.max_x = m_scrollx ^ 0xff; + + m_bg_tilemap->draw(screen, bitmap, bg_clip, 0, 0); m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 0); return 0;