- galaxian/galaxold.cpp: corrected GFX ROM loading for superbikg, gives confirmed correct (even if strange looking) colors

- misc/belatra.cpp: tried to give the driver some flesh

- various drivers: removed some now unneeded trampolines for flipscreen related functions
This commit is contained in:
Ivan Vangelista 2024-05-14 19:12:30 +02:00
parent b5205c7d40
commit f95fa332ca
14 changed files with 79 additions and 105 deletions

View File

@ -2335,8 +2335,8 @@ ROM_START( superbikg )
ROM_LOAD( "moto6-2532.bin", 0x6000, 0x1000, CRC(f5b7627a) SHA1(02dfa62b0bf5962ad56d922084888f2216eca497) )
ROM_REGION( 0x1000, "gfx1", 0 ) // these are the same as sbdk in nintendo/dkong.cpp
ROM_LOAD( "m0kl-2716.bin", 0x0000, 0x0800, CRC(ea5f9f88) SHA1(5742d3554d967ed1e90f7c6f73dafbd302f0f244) )
ROM_LOAD( "m0hj-2716.bin", 0x0800, 0x0800, CRC(b1d76b59) SHA1(aed57ec67d80abdff1a4bfc3a713fa01c0dd15a2) )
ROM_LOAD( "m0hj-2716.bin", 0x0000, 0x0800, CRC(b1d76b59) SHA1(aed57ec67d80abdff1a4bfc3a713fa01c0dd15a2) )
ROM_LOAD( "m0kl-2716.bin", 0x0800, 0x0800, CRC(ea5f9f88) SHA1(5742d3554d967ed1e90f7c6f73dafbd302f0f244) )
ROM_REGION( 0x0020, "proms", 0 )
ROM_LOAD( "mmi6331.6l", 0x0000, 0x0020, CRC(c5f12bc3) SHA1(b746ba06b596d4227fdc730a23bdf495f84e6a72) ) // same as amidarc, bongoa and froggervd in galaxian/galaxian.cpp
@ -2652,7 +2652,7 @@ GAME( 1981, froggerv, frogger, videotron, froggerv, galaxold_state, empty_ini
GAME( 1983, hunchbkg, hunchbak, hunchbkg, hunchbkg, galaxold_state, empty_init, ROT90, "Century Electronics", "Hunchback (Galaxian hardware)", MACHINE_SUPPORTS_SAVE )
GAME( 1983, hunchbgb, hunchbak, hunchbkg, hunchbkg, galaxold_state, empty_init, ROT90, "bootleg (FAR S.A.)", "Hunchback (FAR S.A. bootleg on Galaxian hardware)", MACHINE_SUPPORTS_SAVE )
GAME( 1983, spcwarp, 0, spcwarp, hunchbkg, galaxold_state, empty_init, ROT90, "Century Electronics", "Space Warp? (Cosmos conversion on Galaxian hardware)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE | MACHINE_WRONG_COLORS ) // bad dump
GAME( 1983, superbikg, superbik, superbikg, superbikg, galaxold_state, init_superbikg, ROT90, "bootleg", "Superbike (bootleg on Galaxian hardware)", MACHINE_IMPERFECT_SOUND | MACHINE_WRONG_COLORS | MACHINE_SUPPORTS_SAVE ) // needs real hw references for correcting colors
GAME( 1983, superbikg, superbik, superbikg, superbikg, galaxold_state, init_superbikg, ROT90, "bootleg", "Superbike (bootleg on Galaxian hardware)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) // colors look strange but match real hw video
GAME( 1984, drivfrcg, drivfrcp, drivfrcg, drivfrcg, galaxold_state, empty_init, ROT90, "Shinkai Inc. (Magic Electronics USA license)", "Driving Force (Galaxian conversion)", MACHINE_SUPPORTS_SAVE )
GAME( 1984, drivfrct, drivfrcp, drivfrcg, drivfrcg, galaxold_state, empty_init, ROT90, "bootleg (EMT Germany)", "Top Racer (bootleg of Driving Force)", MACHINE_SUPPORTS_SAVE ) // Video Klein PCB
GAME( 1985, drivfrcb, drivfrcp, drivfrcg, drivfrcg, galaxold_state, empty_init, ROT90, "bootleg (Elsys Software)", "Driving Force (Galaxian conversion bootleg)", MACHINE_SUPPORTS_SAVE )

View File

@ -1,12 +1,14 @@
// license:BSD-3-Clause
// copyright-holders:David Haywood
/* Belatra Russian Fruit Machines (Video?) */
// copyright-holders: David Haywood
// Belatra Russian Fruit Machines (Video?)
/*
These appear to run on Acorn Archimedes-compatible hardware, similar to ertictac.c.
That would make the SoC an ARM7500 or similar.
SoC is suspected to be an ARM7500 or similar.
TODO:
- just a skeleton and everything is complete guesswork.
*/
/*
@ -36,14 +38,19 @@ Merry Joiner
Piggy Bank
The Scrooge
Spirit of Prairies
Viking?s Fun Mill
Viking's Fun Mill
*/
#include "emu.h"
#include "cpu/arm7/arm7.h"
#include "cpu/arm7/arm7core.h"
#include "machine/acorn_vidc.h"
#include "machine/arm_iomd.h"
#include "screen.h"
#include "speaker.h"
@ -54,20 +61,31 @@ class belatra_state : public driver_device
public:
belatra_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu")
m_maincpu(*this, "maincpu"),
m_vidc(*this, "vidc"),
m_iomd(*this, "iomd")
{ }
void belatra(machine_config &config);
void belatra_map(address_map &map);
protected:
// devices
private:
required_device<cpu_device> m_maincpu;
required_device<arm_vidc20_device> m_vidc;
required_device<arm7500fe_iomd_device> m_iomd;
void program_map(address_map &map);
};
void belatra_state::belatra_map(address_map &map)
void belatra_state::program_map(address_map &map)
{
map(0x00000000, 0x003fffff).rom();
map(0x00000000, 0x001fffff).rom().region("maincpu", 0x000000); // TODO: implement this as proper flash ROM device
map(0x00800000, 0x009fffff).rom().region("maincpu", 0x200000); // "
map(0x03200000, 0x032001ff).m(m_iomd, FUNC(arm7500fe_iomd_device::map)); // TODO: writes to some unimplemented registers
//map(0x03340000, 0x03340003).r;
//map(0x03400000, 0x037fffff).w(m_vidc, FUNC(arm_vidc20_device::write));
//map(0x08000000, 0x0800000f).r;
map(0x10000000, 0x13ffffff).ram();
map(0x14000000, 0x17ffffff).ram();
}
static INPUT_PORTS_START( belatra )
@ -75,12 +93,33 @@ INPUT_PORTS_END
void belatra_state::belatra(machine_config &config)
{
ARM7(config, m_maincpu, 54000000); // guess...
m_maincpu->set_addrmap(AS_PROGRAM, &belatra_state::belatra_map);
ARM7500(config, m_maincpu, 54'000'000); // CPU type and clock guessed
m_maincpu->set_addrmap(AS_PROGRAM, &belatra_state::program_map);
SCREEN(config, "screen", SCREEN_TYPE_RASTER);
ARM_VIDC20(config, m_vidc, 24'000'000); // chip type and clock guessed
m_vidc->set_screen("screen");
m_vidc->vblank().set(m_iomd, FUNC(arm_iomd_device::vblank_irq));
m_vidc->sound_drq().set(m_iomd, FUNC(arm_iomd_device::sound_drq));
ARM7500FE_IOMD(config, m_iomd, 54'000'000); // CPU type and clock guessed
m_iomd->set_host_cpu_tag(m_maincpu);
m_iomd->set_vidc_tag(m_vidc);
m_iomd->iocr_read_od<0>().set([this] () { logerror("%s: IOCR read OD 0\n", machine().describe_context()); return 0; });
m_iomd->iocr_read_od<1>().set([this] () { logerror("%s: IOCR read OD 1\n", machine().describe_context()); return 0; });
m_iomd->iocr_read_id().set([this] () { logerror("%s: IOCR read ID\n", machine().describe_context()); return 0; });
m_iomd->iocr_write_od<0>().set([this] (int state) { logerror("%s: IOCR write OD 0 %d\n", machine().describe_context(), state); });
m_iomd->iocr_write_od<1>().set([this] (int state) { logerror("%s: IOCR write OD 1 %d\n", machine().describe_context(), state); });
m_iomd->iocr_write_id().set([this] (int state) { logerror("%s: IOCR write ID %d\n", machine().describe_context(), state); });
m_iomd->iolines_read().set([this] () { logerror("%s: IO lines read\n", machine().describe_context()); return uint8_t(0); });
m_iomd->iolines_write().set([this] (uint8_t data) { logerror("%s: IO lines write %02x\n", machine().describe_context(), data); });
// AT90S2313(config, "mcu", xxxx); // TODO: AVR 8-bit core, only the fairyl2 set has a dump
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
/* unknown sound */
// unknown sound
}
@ -94,6 +133,7 @@ ROM_START( fairyl2 )
ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF )
ROM_LOAD( "zfl2-1belatra.bin", 0x000000, 0x200000, CRC(cb0f3eba) SHA1(a7776810cfe037c25c196bbe900e5e17a2005d2d) )
ROM_LOAD( "zfl2-2belatra.bin", 0x200000, 0x200000, CRC(755fad4b) SHA1(12243fdf95fcdd9012d1bbde6a18abb00918f560) )
ROM_REGION( 0x400000, "others", ROMREGION_ERASEFF )
ROM_LOAD( "at90s2313_fl2.bin", 0x0000, 0x000800, CRC(38e2d37e) SHA1(78178cb3ea219a71d1f15ffde722f9c03ad64dda) )
ROM_END
@ -131,12 +171,12 @@ ROM_END
} // anonymous namespace
GAME( 2004, fairyl2, 0, belatra, belatra, belatra_state, empty_init, ROT0, "Belatra","Fairy Land 2 (set 1)", MACHINE_IS_SKELETON )
GAME( 2004, fairyl2a, fairyl2, belatra, belatra, belatra_state, empty_init, ROT0, "Belatra","Fairy Land 2 (set 2)", MACHINE_IS_SKELETON )
GAME( 2004, fairyl2b, fairyl2, belatra, belatra, belatra_state, empty_init, ROT0, "Belatra","Fairy Land 2 (set 3)", MACHINE_IS_SKELETON )
GAME( 2004, fairyl2bl, fairyl2, belatra, belatra, belatra_state, empty_init, ROT0, "Belatra","Fairy Land 2 (bootleg)", MACHINE_IS_SKELETON )
GAME( 2004, fairyl2, 0, belatra, belatra, belatra_state, empty_init, ROT0, "Belatra", "Fairy Land 2 (set 1)", MACHINE_IS_SKELETON )
GAME( 2004, fairyl2a, fairyl2, belatra, belatra, belatra_state, empty_init, ROT0, "Belatra", "Fairy Land 2 (set 2)", MACHINE_IS_SKELETON )
GAME( 2004, fairyl2b, fairyl2, belatra, belatra, belatra_state, empty_init, ROT0, "Belatra", "Fairy Land 2 (set 3)", MACHINE_IS_SKELETON )
GAME( 2004, fairyl2bl, fairyl2, belatra, belatra, belatra_state, empty_init, ROT0, "Belatra", "Fairy Land 2 (bootleg)", MACHINE_IS_SKELETON )
GAME( 2004, ldrink, 0, belatra, belatra, belatra_state, empty_init, ROT0, "Belatra","Lucky Drink (set 1)", MACHINE_IS_SKELETON )
GAME( 2004, ldrinka, ldrink, belatra, belatra, belatra_state, empty_init, ROT0, "Belatra","Lucky Drink (set 2)", MACHINE_IS_SKELETON )
GAME( 2004, ldrink, 0, belatra, belatra, belatra_state, empty_init, ROT0, "Belatra", "Lucky Drink (set 1)", MACHINE_IS_SKELETON )
GAME( 2004, ldrinka, ldrink, belatra, belatra, belatra_state, empty_init, ROT0, "Belatra", "Lucky Drink (set 2)", MACHINE_IS_SKELETON )
GAME( 2004, merryjn, 0, belatra, belatra, belatra_state, empty_init, ROT0, "Belatra","Merry Joiner", MACHINE_IS_SKELETON )
GAME( 2004, merryjn, 0, belatra, belatra, belatra_state, empty_init, ROT0, "Belatra", "Merry Joiner", MACHINE_IS_SKELETON )

View File

@ -69,8 +69,6 @@ private:
tilemap_t* m_tilemap = nullptr;
int m_nmi = 0;
void flip_screen_x_w(int state);
void flip_screen_y_w(int state);
void videoram_w(offs_t offset, uint8_t data);
void colorram_w(offs_t offset, uint8_t data);
void coin_counter_w(int state);
@ -92,16 +90,6 @@ void skyarmy_state::machine_start()
save_item(NAME(m_nmi));
}
void skyarmy_state::flip_screen_x_w(int state)
{
flip_screen_x_set(state);
}
void skyarmy_state::flip_screen_y_w(int state)
{
flip_screen_y_set(state);
}
TILE_GET_INFO_MEMBER(skyarmy_state::get_tile_info)
{
int code = m_videoram[tile_index];
@ -334,8 +322,8 @@ void skyarmy_state::skyarmy(machine_config &config)
ls259_device &latch(LS259(config, "latch")); // 11C
latch.q_out_cb<0>().set(FUNC(skyarmy_state::coin_counter_w));
latch.q_out_cb<4>().set(FUNC(skyarmy_state::nmi_enable_w)); // ???
latch.q_out_cb<5>().set(FUNC(skyarmy_state::flip_screen_x_w));
latch.q_out_cb<6>().set(FUNC(skyarmy_state::flip_screen_y_w));
latch.q_out_cb<5>().set(FUNC(skyarmy_state::flip_screen_x_set));
latch.q_out_cb<6>().set(FUNC(skyarmy_state::flip_screen_y_set));
latch.q_out_cb<7>().set_nop(); // video RAM buffering?
/* video hardware */

View File

@ -436,8 +436,8 @@ void mermaid_state::mermaid(machine_config &config)
m_latch[0]->q_out_cb<2>().set([this](int state){ logerror("02 = %d\n", state); }); // plays sample
m_latch[0]->q_out_cb<3>().set([this](int state){ logerror("03 = %d\n", state); }); // ???
m_latch[0]->q_out_cb<4>().set([this](int state){ logerror("04 = %d\n", state); }); // ???
m_latch[0]->q_out_cb<5>().set(FUNC(mermaid_state::flip_screen_x_w));
m_latch[0]->q_out_cb<6>().set(FUNC(mermaid_state::flip_screen_y_w));
m_latch[0]->q_out_cb<5>().set(FUNC(mermaid_state::flip_screen_x_set));
m_latch[0]->q_out_cb<6>().set(FUNC(mermaid_state::flip_screen_y_set));
m_latch[0]->q_out_cb<7>().set(FUNC(mermaid_state::nmi_mask_w));
LS259(config, m_latch[1]);

View File

@ -100,8 +100,6 @@ private:
void mermaid_videoram2_w(offs_t offset, uint8_t data);
void mermaid_videoram_w(offs_t offset, uint8_t data);
void mermaid_colorram_w(offs_t offset, uint8_t data);
void flip_screen_x_w(int state);
void flip_screen_y_w(int state);
void mermaid_bg_scroll_w(offs_t offset, uint8_t data);
void mermaid_fg_scroll_w(offs_t offset, uint8_t data);
void bg_mask_w(int state);

View File

@ -72,16 +72,6 @@ void mermaid_state::mermaid_colorram_w(offs_t offset, uint8_t data)
m_fg_tilemap->mark_tile_dirty(offset);
}
void mermaid_state::flip_screen_x_w(int state)
{
flip_screen_x_set(state);
}
void mermaid_state::flip_screen_y_w(int state)
{
flip_screen_y_set(state);
}
void mermaid_state::mermaid_bg_scroll_w(offs_t offset, uint8_t data)
{
m_bg_scrollram[offset] = data;

View File

@ -137,8 +137,6 @@ private:
tilemap_t *m_fg = nullptr;
void nmi_enable_w(int state);
void hflip_w(int state);
void vflip_w(int state);
uint8_t inputs_watchdog_r();
template <uint8_t Which> void videoram_w(offs_t offset, uint8_t data);
void char_bank_select_w(int state);
@ -654,16 +652,6 @@ void pitnrun_state::nmi_enable_w(int state)
m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
}
void pitnrun_state::hflip_w(int state)
{
flip_screen_x_set(state);
}
void pitnrun_state::vflip_w(int state)
{
flip_screen_y_set(state);
}
uint8_t pitnrun_state::inputs_r()
{
return ~m_inputmux->output_r();
@ -850,9 +838,9 @@ void pitnrun_state::pitnrun(machine_config &config)
mainlatch.q_out_cb<1>().set(FUNC(pitnrun_state::color_select_w));
mainlatch.q_out_cb<4>().set_nop(); // COLOR SEL 2 - not used ?
mainlatch.q_out_cb<5>().set(FUNC(pitnrun_state::char_bank_select_w));
mainlatch.q_out_cb<6>().set(FUNC(pitnrun_state::hflip_w)); // HFLIP
mainlatch.q_out_cb<6>().set(FUNC(pitnrun_state::flip_screen_x_set)); // HFLIP
mainlatch.q_out_cb<6>().append(m_inputmux, FUNC(ls157_x2_device::select_w));
mainlatch.q_out_cb<7>().set(FUNC(pitnrun_state::vflip_w)); // VFLIP
mainlatch.q_out_cb<7>().set(FUNC(pitnrun_state::flip_screen_y_set)); // VFLIP
LS157_X2(config, m_inputmux); // 2F (0-3) & 2H (4-7)
m_inputmux->a_in_callback().set_ioport("INPUTS");

View File

@ -70,8 +70,6 @@ protected:
void colorram_w(offs_t offset, uint8_t data);
void pal_offs_w(uint8_t data);
void scroll_w(uint8_t data);
void flipscreen_x_w(int state);
void flipscreen_y_w(int state);
void io_map(address_map &map);
};
@ -200,16 +198,6 @@ void base_state::scroll_w(uint8_t data)
m_bg_tilemap->set_scrollx(0, data);
}
void base_state::flipscreen_x_w(int state)
{
flip_screen_x_set(state);
}
void base_state::flipscreen_y_w(int state)
{
flip_screen_y_set(state);
}
void holeland_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
{
@ -560,8 +548,8 @@ void holeland_state::holeland(machine_config &config)
LS259(config, m_latch); // 3J
m_latch->parallel_out_cb().set(FUNC(holeland_state::pal_offs_w)).mask(0x03);
m_latch->q_out_cb<5>().set(FUNC(holeland_state::coin_counter_w));
m_latch->q_out_cb<6>().set(FUNC(holeland_state::flipscreen_x_w));
m_latch->q_out_cb<7>().set(FUNC(holeland_state::flipscreen_y_w));
m_latch->q_out_cb<6>().set(FUNC(holeland_state::flip_screen_x_set));
m_latch->q_out_cb<7>().set(FUNC(holeland_state::flip_screen_y_set));
WATCHDOG_TIMER(config, "watchdog");

View File

@ -479,8 +479,8 @@ void bagman_state::bagman_base(machine_config &config)
LS259(config, m_mainlatch); // 8H
m_mainlatch->q_out_cb<0>().set(FUNC(bagman_state::irq_mask_w));
m_mainlatch->q_out_cb<1>().set(FUNC(bagman_state::flipscreen_x_w));
m_mainlatch->q_out_cb<2>().set(FUNC(bagman_state::flipscreen_y_w));
m_mainlatch->q_out_cb<1>().set(FUNC(bagman_state::flip_screen_x_set));
m_mainlatch->q_out_cb<2>().set(FUNC(bagman_state::flip_screen_y_set));
// video enable register not available on earlier hardware revision(s)
// Bagman is supposed to have glitches during screen transitions
m_mainlatch->q_out_cb<4>().set(FUNC(bagman_state::coin_counter_w));
@ -558,8 +558,8 @@ void pickin_state::pickin(machine_config &config)
LS259(config, m_mainlatch);
m_mainlatch->q_out_cb<0>().set(FUNC(pickin_state::irq_mask_w));
m_mainlatch->q_out_cb<1>().set(FUNC(pickin_state::flipscreen_x_w));
m_mainlatch->q_out_cb<2>().set(FUNC(pickin_state::flipscreen_y_w));
m_mainlatch->q_out_cb<1>().set(FUNC(pickin_state::flip_screen_x_set));
m_mainlatch->q_out_cb<2>().set(FUNC(pickin_state::flip_screen_y_set));
m_mainlatch->q_out_cb<3>().set(FUNC(pickin_state::video_enable_w));
m_mainlatch->q_out_cb<4>().set(FUNC(pickin_state::coin_counter_w));
m_mainlatch->q_out_cb<5>().set_nop(); // ????
@ -620,8 +620,8 @@ void pickin_state::botanic(machine_config &config)
LS259(config, m_mainlatch);
m_mainlatch->q_out_cb<0>().set(FUNC(pickin_state::irq_mask_w));
m_mainlatch->q_out_cb<1>().set(FUNC(pickin_state::flipscreen_x_w));
m_mainlatch->q_out_cb<2>().set(FUNC(pickin_state::flipscreen_y_w));
m_mainlatch->q_out_cb<1>().set(FUNC(pickin_state::flip_screen_x_set));
m_mainlatch->q_out_cb<2>().set(FUNC(pickin_state::flip_screen_y_set));
m_mainlatch->q_out_cb<3>().set(FUNC(pickin_state::video_enable_w));
m_mainlatch->q_out_cb<4>().set(FUNC(pickin_state::coin_counter_w));
m_mainlatch->q_out_cb<5>().set_nop(); // ????

View File

@ -40,8 +40,6 @@ protected:
void irq_mask_w(int state);
void videoram_w(offs_t offset, uint8_t data);
void colorram_w(offs_t offset, uint8_t data);
void flipscreen_x_w(int state);
void flipscreen_y_w(int state);
void video_enable_w(int state);
// bagman

View File

@ -81,16 +81,6 @@ void bagman_state::bagman_palette(palette_device &palette) const
}
}
void bagman_state::flipscreen_x_w(int state)
{
flip_screen_x_set(state);
}
void bagman_state::flipscreen_y_w(int state)
{
flip_screen_y_set(state);
}
void bagman_state::video_enable_w(int state)
{
m_video_enable = state;

View File

@ -346,7 +346,7 @@ void zaccaria_state::zaccaria(machine_config &config)
ls259_device &mainlatch(LS259(config, "mainlatch")); // 3G on 1B1141 I/O (Z80) board
mainlatch.q_out_cb<0>().set(FUNC(zaccaria_state::flip_screen_x_w)); // VCMA
mainlatch.q_out_cb<1>().set(FUNC(zaccaria_state::flip_screen_y_w)); // HCMA
mainlatch.q_out_cb<1>().set(FUNC(zaccaria_state::flip_screen_y_set)); // HCMA
mainlatch.q_out_cb<2>().set("audiopcb", FUNC(zac1b11142_audio_device::ressound_w)); // RESSOUND
mainlatch.q_out_cb<6>().set(FUNC(zaccaria_state::coin_w)); // COUNT
mainlatch.q_out_cb<7>().set(FUNC(zaccaria_state::nmi_mask_w)); // INTST

View File

@ -43,7 +43,6 @@ private:
uint8_t read_attr(offs_t offset, int which);
void update_colscroll();
void flip_screen_x_w(int state);
void flip_screen_y_w(int state);
void dsw_sel_w(uint8_t data);
TILE_GET_INFO_MEMBER(get_tile_info);
void palette(palette_device &palette) const;

View File

@ -183,11 +183,6 @@ void zaccaria_state::flip_screen_x_w(int state)
update_colscroll();
}
void zaccaria_state::flip_screen_y_w(int state)
{
flip_screen_y_set(state);
}
/***************************************************************************