mirror of
https://github.com/holub/mame
synced 2025-04-16 13:34:55 +03:00
New machines marked as NOT_WORKING
---------------------------------- G.T. Block Challenger [hap, chaneman]
This commit is contained in:
parent
1de3feb496
commit
307261ec8a
@ -3940,6 +3940,7 @@ files {
|
||||
MAME_DIR .. "src/mame/drivers/arabian.cpp",
|
||||
MAME_DIR .. "src/mame/includes/arabian.h",
|
||||
MAME_DIR .. "src/mame/video/arabian.cpp",
|
||||
MAME_DIR .. "src/mame/drivers/blockch.cpp",
|
||||
MAME_DIR .. "src/mame/drivers/dai3wksi.cpp",
|
||||
MAME_DIR .. "src/mame/drivers/ikki.cpp",
|
||||
MAME_DIR .. "src/mame/includes/ikki.h",
|
||||
|
@ -145,6 +145,7 @@ blktiger.cpp
|
||||
blktiger_ms.cpp
|
||||
blmbycar.cpp
|
||||
blockade.cpp
|
||||
blockch.cpp
|
||||
blockhl.cpp
|
||||
blockout.cpp
|
||||
blocktax.cpp
|
||||
|
301
src/mame/drivers/blockch.cpp
Normal file
301
src/mame/drivers/blockch.cpp
Normal file
@ -0,0 +1,301 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:hap
|
||||
/******************************************************************************
|
||||
|
||||
Sun Electronics / Gifu Tokki G.T. Block Challenger
|
||||
(is "G.T." Gifu Tokki or an indication of table cabinet type like Taito with T.T.?)
|
||||
|
||||
Hardware notes:
|
||||
- NEC 8080A @ 2MHz (18MHz XTAL, 8224 clock divider)
|
||||
- NEC 8228, 2*NEC 8255C
|
||||
- 4KB ROM (4*MB8518)
|
||||
- 256 bytes SRAM(2*MB8101), 1KB SRAM(2*M58754S)
|
||||
- 1bpp bitmap + ball sprite
|
||||
- discrete sound
|
||||
- 15 switches (not the usual small dipswitches, but separate large switches)
|
||||
|
||||
TODO:
|
||||
- paddle sprite and missing (presumed) ball vs paddle collision detection
|
||||
- video timing is wrong
|
||||
- identify remaining switches
|
||||
- the flyer photo shows a green screen, assumed to be an overlay on a B&W CRT
|
||||
- sound emulation
|
||||
|
||||
******************************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
|
||||
#include "cpu/i8085/i8085.h"
|
||||
#include "machine/i8255.h"
|
||||
|
||||
#include "screen.h"
|
||||
|
||||
#include "blockch.lh"
|
||||
|
||||
|
||||
namespace {
|
||||
|
||||
class blockch_state : public driver_device
|
||||
{
|
||||
public:
|
||||
blockch_state(const machine_config &mconfig, device_type type, const char *tag) :
|
||||
driver_device(mconfig, type, tag),
|
||||
m_maincpu(*this, "maincpu"),
|
||||
m_ppi(*this, "ppi%u", 0),
|
||||
m_screen(*this, "screen"),
|
||||
m_vram(*this, "vram"),
|
||||
m_inputs(*this, "IN.%u", 0)
|
||||
{ }
|
||||
|
||||
// machine configs
|
||||
void blockch(machine_config &config);
|
||||
|
||||
protected:
|
||||
virtual void machine_start() override;
|
||||
|
||||
private:
|
||||
// devices/pointers
|
||||
required_device<cpu_device> m_maincpu;
|
||||
required_device_array<i8255_device, 2> m_ppi;
|
||||
required_device<screen_device> m_screen;
|
||||
required_shared_ptr<u8> m_vram;
|
||||
required_ioport_array<4> m_inputs;
|
||||
|
||||
void main_map(address_map &map);
|
||||
void io_map(address_map &map);
|
||||
|
||||
u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
|
||||
DECLARE_WRITE_LINE_MEMBER(vblank_irq);
|
||||
|
||||
void ppi0_c_w(u8 data);
|
||||
void ppi1_a_w(u8 data);
|
||||
void ppi1_b_w(u8 data);
|
||||
void ppi1_c_w(u8 data);
|
||||
|
||||
int m_ball_x = 0;
|
||||
int m_ball_y = 0;
|
||||
};
|
||||
|
||||
void blockch_state::machine_start()
|
||||
{
|
||||
save_item(NAME(m_ball_x));
|
||||
save_item(NAME(m_ball_y));
|
||||
}
|
||||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
Video
|
||||
******************************************************************************/
|
||||
|
||||
u32 blockch_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
// 96x64 background
|
||||
for (int y = cliprect.min_y; y <= cliprect.max_y; y++)
|
||||
{
|
||||
for (int x = cliprect.min_x; x <= cliprect.max_x; x++)
|
||||
{
|
||||
// VRAM is only 1-bit
|
||||
int pixel = m_vram[(x << 4 & 0x1fc0) | (y >> 2 & 0x3f)] & 1;
|
||||
bitmap.pix(y, x) = pixel ? rgb_t::white() : rgb_t::black();
|
||||
}
|
||||
}
|
||||
|
||||
// draw ball sprite
|
||||
int bx = 0x200 - m_ball_x - 2;
|
||||
int by = 0x100 - m_ball_y;
|
||||
|
||||
for (int y = by; y < (by + 4); y++)
|
||||
for (int x = bx; x < (bx + 4); x++)
|
||||
if (cliprect.contains(x, y))
|
||||
bitmap.pix(y, x) = rgb_t::white();
|
||||
|
||||
// draw paddle
|
||||
// TODO: preliminary
|
||||
int py = m_inputs[3]->read();
|
||||
if (cliprect.contains(py, 10))
|
||||
bitmap.pix(py, 10) = rgb_t::white();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
I/O
|
||||
******************************************************************************/
|
||||
|
||||
WRITE_LINE_MEMBER(blockch_state::vblank_irq)
|
||||
{
|
||||
m_maincpu->set_input_line(0, HOLD_LINE);
|
||||
}
|
||||
|
||||
void blockch_state::ppi0_c_w(u8 data)
|
||||
{
|
||||
// sound?
|
||||
}
|
||||
|
||||
void blockch_state::ppi1_a_w(u8 data)
|
||||
{
|
||||
m_ball_y = data;
|
||||
}
|
||||
|
||||
void blockch_state::ppi1_b_w(u8 data)
|
||||
{
|
||||
m_ball_x = (m_ball_x & 0xf00) | data;
|
||||
}
|
||||
|
||||
void blockch_state::ppi1_c_w(u8 data)
|
||||
{
|
||||
m_ball_x = (m_ball_x & 0xff) | (data << 8 & 0xf00);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
Address Maps
|
||||
******************************************************************************/
|
||||
|
||||
void blockch_state::main_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x0fff).mirror(0x1000).rom();
|
||||
map(0x2000, 0x20ff).ram();
|
||||
map(0x8000, 0x9fff).writeonly().share("vram");
|
||||
}
|
||||
|
||||
void blockch_state::io_map(address_map &map)
|
||||
{
|
||||
map(0x10, 0x13).mirror(0x08).rw(m_ppi[0], FUNC(i8255_device::read), FUNC(i8255_device::write));
|
||||
map(0x14, 0x17).mirror(0x08).rw(m_ppi[1], FUNC(i8255_device::read), FUNC(i8255_device::write));
|
||||
}
|
||||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
Input Ports
|
||||
******************************************************************************/
|
||||
|
||||
static INPUT_PORTS_START( blockch )
|
||||
PORT_START("IN.0")
|
||||
PORT_DIPNAME( 0x03, 0x01, DEF_STR( Lives ) )
|
||||
PORT_DIPSETTING( 0x00, "3" )
|
||||
PORT_DIPSETTING( 0x01, "5" )
|
||||
PORT_DIPSETTING( 0x02, "7" )
|
||||
PORT_DIPSETTING( 0x03, "9")
|
||||
PORT_DIPNAME( 0x04, 0x00, "Unknown 0_04" )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x04, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x08, 0x08, DEF_STR( Coinage ) )
|
||||
PORT_DIPSETTING( 0x08, DEF_STR( 1C_1C ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( 1C_2C ) )
|
||||
PORT_DIPNAME( 0x10, 0x00, "Unknown 0_10" )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x10, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x20, 0x00, "Unknown 0_20" )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x20, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x40, 0x00, "Unknown 0_40" )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x40, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x80, 0x00, "Unknown 0_80" )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x80, DEF_STR( On ) )
|
||||
|
||||
PORT_START("IN.1")
|
||||
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 )
|
||||
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START1 )
|
||||
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START2 )
|
||||
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN1 )
|
||||
PORT_DIPNAME( 0x10, 0x00, "Unknown 1_10" )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x10, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x20, 0x00, "Barriers" )
|
||||
PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x40, 0x00, "Unknown 1_40" )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x40, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x80, 0x00, "Unknown 1_80" )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x80, DEF_STR( On ) )
|
||||
|
||||
PORT_START("IN.2")
|
||||
PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED )
|
||||
PORT_DIPNAME( 0x10, 0x10, "Unknown 2_10" )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x10, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x20, 0x00, "Unknown 2_20" )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x20, DEF_STR( On ) )
|
||||
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_VBLANK("screen")
|
||||
PORT_DIPNAME( 0x80, 0x00, "Unknown 2_80" )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x80, DEF_STR( On ) )
|
||||
|
||||
PORT_START("IN.3")
|
||||
PORT_BIT( 0xff, 0x00, IPT_PADDLE ) PORT_SENSITIVITY(50) PORT_KEYDELTA(10) PORT_CENTERDELTA(0)
|
||||
INPUT_PORTS_END
|
||||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
Machine Configs
|
||||
******************************************************************************/
|
||||
|
||||
void blockch_state::blockch(machine_config &config)
|
||||
{
|
||||
/* basic machine hardware */
|
||||
I8080A(config, m_maincpu, 18_MHz_XTAL/9);
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &blockch_state::main_map);
|
||||
m_maincpu->set_addrmap(AS_IO, &blockch_state::io_map);
|
||||
|
||||
I8255(config, m_ppi[0]); // 0x92: A & B = input, C = output
|
||||
m_ppi[0]->in_pa_callback().set_ioport("IN.0");
|
||||
m_ppi[0]->in_pb_callback().set_ioport("IN.1");
|
||||
m_ppi[0]->out_pc_callback().set(FUNC(blockch_state::ppi0_c_w));
|
||||
|
||||
I8255(config, m_ppi[1]); // 0x88: A & B = output, Clow = output, Chigh = input
|
||||
m_ppi[1]->out_pa_callback().set(FUNC(blockch_state::ppi1_a_w));
|
||||
m_ppi[1]->out_pb_callback().set(FUNC(blockch_state::ppi1_b_w));
|
||||
m_ppi[1]->out_pc_callback().set(FUNC(blockch_state::ppi1_c_w));
|
||||
m_ppi[1]->in_pc_callback().set_ioport("IN.2");
|
||||
|
||||
/* video hardware */
|
||||
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
|
||||
m_screen->set_refresh_hz(60);
|
||||
m_screen->set_size(512, 256);
|
||||
m_screen->set_visarea(0, 384-1, 0, 256-1);
|
||||
m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500));
|
||||
m_screen->set_screen_update(FUNC(blockch_state::screen_update));
|
||||
m_screen->screen_vblank().set(FUNC(blockch_state::vblank_irq));
|
||||
|
||||
config.set_default_layout(layout_blockch);
|
||||
|
||||
/* sound hardware */
|
||||
// TODO: discrete?
|
||||
}
|
||||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
ROM Definitions
|
||||
******************************************************************************/
|
||||
|
||||
ROM_START( blockch )
|
||||
ROM_REGION(0x10000, "maincpu", 0)
|
||||
ROM_LOAD("1.62", 0x0000, 0x0400, CRC(94edc2dc) SHA1(3d3b9d996099aa82d2e9b3bed57fe1ce28971e8a))
|
||||
ROM_LOAD("2.61", 0x0400, 0x0400, CRC(e29d4d60) SHA1(2766374286ed2a20c772e005bf45b4079c35acd5))
|
||||
ROM_LOAD("3.60", 0x0800, 0x0400, CRC(9b15f0fc) SHA1(1ff965cfbccfdee7622f21b33e5a7e3d6292d0bb))
|
||||
ROM_LOAD("4.59", 0x0c00, 0x0400, CRC(edf84910) SHA1(292aa16b5f23cae16c03fa7c0e711a5c2a04c27b))
|
||||
ROM_END
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
Drivers
|
||||
******************************************************************************/
|
||||
|
||||
// YEAR NAME PARENT MACHINE INPUT CLASS INIT SCREEN COMPANY, FULLNAME, FLAGS
|
||||
GAME( 1978, blockch, 0, blockch, blockch, blockch_state, empty_init, ROT270, "Sun Electronics / Gifu Tokki", "G.T. Block Challenger", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_COCKTAIL )
|
@ -45,7 +45,6 @@ TODO:
|
||||
|
||||
#include "emupal.h"
|
||||
#include "screen.h"
|
||||
//#include "speaker.h"
|
||||
|
||||
|
||||
namespace {
|
||||
@ -114,7 +113,7 @@ void getaway_state::machine_start()
|
||||
Video
|
||||
******************************************************************************/
|
||||
|
||||
uint32_t getaway_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
u32 getaway_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
// apparently score overlay covers only the rightmost 3 columns
|
||||
const int x_overlay = 29*8;
|
||||
|
18
src/mame/layout/blockch.lay
Normal file
18
src/mame/layout/blockch.lay
Normal file
@ -0,0 +1,18 @@
|
||||
<?xml version="1.0"?>
|
||||
<!--
|
||||
license:CC0
|
||||
-->
|
||||
<mamelayout version="2">
|
||||
<element name="overlay">
|
||||
<rect><color red="0.25" green="1.0" blue="0.25" /></rect>
|
||||
</element>
|
||||
|
||||
<view name="Color Overlay">
|
||||
<screen index="0">
|
||||
<bounds left="0" top="0" right="3" bottom="4" />
|
||||
</screen>
|
||||
<element ref="overlay" blend="multiply">
|
||||
<bounds left="0" top="0" right="3" bottom="4" />
|
||||
</element>
|
||||
</view>
|
||||
</mamelayout>
|
@ -9372,6 +9372,9 @@ hustle // 16-21 [1977 Gremlin]
|
||||
mineswpr // [1977 Amutech]
|
||||
mineswpr4 // [1977 Amutech]
|
||||
|
||||
@source:blockch.cpp
|
||||
blockch
|
||||
|
||||
@source:blockhl.cpp
|
||||
blockhl // GX973 (c) 1989
|
||||
quarth // GX973 (c) 1989 (Japan)
|
||||
|
Loading…
Reference in New Issue
Block a user