New working clones

------------------
Blood Storm (v2.21) [coolmod]

angelkds.cpp, crgolf.cpp: finders and other small cleanups
This commit is contained in:
Ivan Vangelista 2022-04-12 12:57:32 +02:00
parent 492b0e0df2
commit ce68a1d711
9 changed files with 759 additions and 862 deletions

View File

@ -3062,8 +3062,6 @@ files {
createMAMEProjects(_target, _subtarget, "nasco") createMAMEProjects(_target, _subtarget, "nasco")
files { files {
MAME_DIR .. "src/mame/drivers/crgolf.cpp", MAME_DIR .. "src/mame/drivers/crgolf.cpp",
MAME_DIR .. "src/mame/includes/crgolf.h",
MAME_DIR .. "src/mame/video/crgolf.cpp",
MAME_DIR .. "src/mame/drivers/himesiki.cpp", MAME_DIR .. "src/mame/drivers/himesiki.cpp",
MAME_DIR .. "src/mame/drivers/suprgolf.cpp", MAME_DIR .. "src/mame/drivers/suprgolf.cpp",
} }
@ -3425,8 +3423,6 @@ files {
createMAMEProjects(_target, _subtarget, "sega") createMAMEProjects(_target, _subtarget, "sega")
files { files {
MAME_DIR .. "src/mame/drivers/angelkds.cpp", MAME_DIR .. "src/mame/drivers/angelkds.cpp",
MAME_DIR .. "src/mame/includes/angelkds.h",
MAME_DIR .. "src/mame/video/angelkds.cpp",
MAME_DIR .. "src/mame/drivers/bingoc.cpp", MAME_DIR .. "src/mame/drivers/bingoc.cpp",
MAME_DIR .. "src/mame/drivers/blockade.cpp", MAME_DIR .. "src/mame/drivers/blockade.cpp",
MAME_DIR .. "src/mame/drivers/calorie.cpp", MAME_DIR .. "src/mame/drivers/calorie.cpp",

View File

@ -18,15 +18,16 @@ for details on this encryption scheme
*/ */
/* started 23/01/2002 */ // started 23/01/2002
/* notes / todo: /* notes / TODO:
Unknown Reads / Writes * Unknown Reads / Writes
Whats the Prom for? nothing important? * Whats the PROM for? nothing important?
the progress sprite on the side of the screen re-appears at the bottom when you get the progress sprite on the side of the screen re-appears at the bottom when you get
to the top, but the wrap-around is needed for other things, actual game bug? to the top, but the wrap-around is needed for other things, actual game bug?
Angel Kids service mode doesn't seem to work, did it ever? * Angel Kids service mode doesn't seem to work, did it ever?
* Enable / disable tilemap bits might be wrong
*/ */
@ -126,30 +127,279 @@ Dumped by Chackn
#include "emu.h" #include "emu.h"
#include "includes/angelkds.h"
#include "machine/segacrp2_device.h"
#include "cpu/z80/z80.h" #include "cpu/z80/z80.h"
#include "machine/i8255.h" #include "machine/i8255.h"
#include "machine/segacrp2_device.h"
#include "sound/ymopn.h" #include "sound/ymopn.h"
#include "emupal.h" #include "emupal.h"
#include "screen.h" #include "screen.h"
#include "speaker.h" #include "speaker.h"
#include "tilemap.h"
namespace {
/*** CPU Banking class angelkds_state : public driver_device
{
public:
angelkds_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_bgvideoram(*this, "bgvideoram%u", 0U),
m_txvideoram(*this, "txvideoram"),
m_spriteram(*this, "spriteram"),
m_decrypted_opcodes(*this, "decrypted_opcodes"),
m_mainbank(*this, "mainbank"),
m_maincpu(*this, "maincpu"),
m_audiocpu(*this, "audiocpu"),
m_gfxdecode(*this, "gfxdecode")
{ }
void angelkds(machine_config &config);
void spcpostn(machine_config &config);
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
virtual void video_start() override;
private:
// memory pointers
required_shared_ptr_array<uint8_t, 2> m_bgvideoram;
required_shared_ptr<uint8_t> m_txvideoram;
required_shared_ptr<uint8_t> m_spriteram;
optional_shared_ptr<uint8_t> m_decrypted_opcodes;
required_memory_bank m_mainbank;
// devices
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
required_device<gfxdecode_device> m_gfxdecode;
tilemap_t *m_tx_tilemap = nullptr;
tilemap_t *m_bg_tilemap[2]{};
uint8_t m_txbank = 0;
uint8_t m_bgbank[2]{};
uint8_t m_sound[4]{};
uint8_t m_sound2[4]{};
uint8_t m_layer_ctrl = 0;
void cpu_bank_w(uint8_t data);
void main_sound_w(offs_t offset, uint8_t data);
uint8_t main_sound_r(offs_t offset);
void audio_sound_w(offs_t offset, uint8_t data);
uint8_t audio_sound_r(offs_t offset);
void txvideoram_w(offs_t offset, uint8_t data);
void txbank_w(uint8_t data);
template <uint8_t Which> void bgvideoram_w(offs_t offset, uint8_t data);
template <uint8_t Which> void bgbank_w(uint8_t data);
template <uint8_t Which> void bgscroll_w(uint8_t data);
void layer_ctrl_w(uint8_t data);
TILE_GET_INFO_MEMBER(get_tx_tile_info);
template <uint8_t Which> TILE_GET_INFO_MEMBER(get_bg_tile_info);
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, int enable_n);
void decrypted_opcodes_map(address_map &map);
void main_map(address_map &map);
void main_portmap(address_map &map);
void sound_map(address_map &map);
void sound_portmap(address_map &map);
};
// video
// Text Layer Tilemap
TILE_GET_INFO_MEMBER(angelkds_state::get_tx_tile_info)
{
int tileno = m_txvideoram[tile_index] + (m_txbank * 0x100);
tileinfo.set(0, tileno, 0, 0);
}
void angelkds_state::txvideoram_w(offs_t offset, uint8_t data)
{
m_txvideoram[offset] = data;
m_tx_tilemap->mark_tile_dirty(offset);
}
void angelkds_state::txbank_w(uint8_t data)
{
if (m_txbank != data)
{
m_txbank = data;
m_tx_tilemap->mark_all_dirty();
}
}
// Top (0) and Bottom (1) Half Background Tilemap
template <uint8_t Which>
TILE_GET_INFO_MEMBER(angelkds_state::get_bg_tile_info)
{
int tileno = m_bgvideoram[Which][tile_index];
tileno += m_bgbank[Which] * 0x100 ;
tileinfo.set(Which + 1, tileno, Which, 0);
}
template <uint8_t Which>
void angelkds_state::bgvideoram_w(offs_t offset, uint8_t data)
{
m_bgvideoram[Which][offset] = data;
m_bg_tilemap[Which]->mark_tile_dirty(offset);
}
template <uint8_t Which>
void angelkds_state::bgbank_w(uint8_t data)
{
if (m_bgbank[Which] != data)
{
m_bgbank[Which] = data;
m_bg_tilemap[Which]->mark_all_dirty();
}
}
template <uint8_t Which>
void angelkds_state::bgscroll_w(uint8_t data)
{
m_bg_tilemap[Which]->set_scrollx(0, data);
}
void angelkds_state::layer_ctrl_w(uint8_t data)
{
m_layer_ctrl = data;
}
/* Sprites
the sprites are similar to the tilemaps in the sense that there is
a split down the middle of the screen
*/ */
void angelkds_state::angelkds_cpu_bank_write(uint8_t data) void angelkds_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, int enable_n)
{ {
membank("bank1")->set_entry(data & 0x0f); // shall we check (data & 0x0f) < # of available banks (8 or 10 resp.)? const uint8_t *source = m_spriteram + 0x100 - 4;
const uint8_t *finish = m_spriteram;
gfx_element *gfx = m_gfxdecode->gfx(3);
while (source >= finish)
{
/*
nnnn nnnn - EeFf B?cc - yyyy yyyy - xxxx xxxx
n = sprite number
E = Sprite Enabled in Top Half of Screen
e = Sprite Enabled in Bottom Half of Screen
F = Flip Y
f = Flip X
B = Tile Bank
? = unknown, nothing / unused? recheck
c = color
y = Y position
x = X position
*/
uint16_t tile_no = source[0];
uint8_t attr = source[1];
uint8_t ypos = source[2];
uint8_t xpos = source[3];
uint8_t enable = attr & 0xc0;
uint8_t flipx = (attr & 0x10) >> 4;
uint8_t flipy = (attr & 0x20) >> 5;
uint8_t bank = attr & 0x08;
uint8_t color = attr & 0x03;
if (bank)
tile_no += 0x100;
ypos = 0xff - ypos;
if (enable & enable_n)
{
gfx->transpen(bitmap, cliprect, tile_no, color * 4, flipx, flipy, xpos, ypos, 15);
// wraparound
if (xpos > 240)
gfx->transpen(bitmap, cliprect, tile_no, color * 4, flipx, flipy, xpos - 256, ypos, 15);
// wraparound
if (ypos > 240)
{
gfx->transpen(bitmap, cliprect, tile_no, color * 4, flipx, flipy, xpos, ypos - 256, 15);
// wraparound
if (xpos > 240)
gfx->transpen(bitmap, cliprect, tile_no, color * 4, flipx, flipy, xpos - 256, ypos - 256, 15);
}
}
source -= 0x04;
}
} }
// Video Start & Update
void angelkds_state::video_start()
{
m_tx_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(angelkds_state::get_tx_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
m_tx_tilemap->set_transparent_pen(0);
m_bg_tilemap[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(angelkds_state::get_bg_tile_info<1>)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
m_bg_tilemap[1]->set_transparent_pen(15);
m_bg_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(angelkds_state::get_bg_tile_info<0>)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
m_bg_tilemap[0]->set_transparent_pen(15);
}
// enable bits are uncertain
uint32_t angelkds_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
const rectangle &visarea = screen.visible_area();
rectangle clip;
bitmap.fill(0x3f, cliprect); // is there a register controlling the colour?, we currently use the last colour of the tx palette
// draw top of screen
clip.set(8 * 0, 8 * 16 - 1, visarea.min_y, visarea.max_y);
if ((m_layer_ctrl & 0x80) == 0x00)
m_bg_tilemap[0]->draw(screen, bitmap, clip, 0, 0);
draw_sprites(bitmap, clip, 0x80);
if ((m_layer_ctrl & 0x20) == 0x00)
m_tx_tilemap->draw(screen, bitmap, clip, 0, 0);
// draw bottom of screen
clip.set(8 * 16, 8 * 32 - 1, visarea.min_y, visarea.max_y);
if ((m_layer_ctrl & 0x40) == 0x00)
m_bg_tilemap[1]->draw(screen, bitmap, clip, 0, 0);
draw_sprites(bitmap, clip, 0x40);
if ((m_layer_ctrl & 0x20) == 0x00)
m_tx_tilemap->draw(screen, bitmap, clip, 0, 0);
return 0;
}
// machine
// CPU Banking
void angelkds_state::cpu_bank_w(uint8_t data)
{
m_mainbank->set_entry(data & 0x0f); // shall we check (data & 0x0f) < # of available banks (8 or 10 resp.)?
}
/*** Memory Structures /*** Memory Structures
@ -171,27 +421,27 @@ contain a level.
void angelkds_state::main_map(address_map &map) void angelkds_state::main_map(address_map &map)
{ {
map(0x0000, 0x7fff).rom(); map(0x0000, 0x7fff).rom();
map(0x8000, 0xbfff).bankr("bank1"); map(0x8000, 0xbfff).bankr(m_mainbank);
map(0xc000, 0xdfff).ram(); map(0xc000, 0xdfff).ram();
map(0xe000, 0xe3ff).ram().w(FUNC(angelkds_state::angelkds_bgtopvideoram_w)).share("bgtopvideoram"); /* Top Half of Screen */ map(0xe000, 0xe3ff).ram().w(FUNC(angelkds_state::bgvideoram_w<0>)).share(m_bgvideoram[0]); // Top Half of Screen
map(0xe400, 0xe7ff).ram().w(FUNC(angelkds_state::angelkds_bgbotvideoram_w)).share("bgbotvideoram"); /* Bottom Half of Screen */ map(0xe400, 0xe7ff).ram().w(FUNC(angelkds_state::bgvideoram_w<1>)).share(m_bgvideoram[1]); // Bottom Half of Screen
map(0xe800, 0xebff).ram().w(FUNC(angelkds_state::angelkds_txvideoram_w)).share("txvideoram"); map(0xe800, 0xebff).ram().w(FUNC(angelkds_state::txvideoram_w)).share(m_txvideoram);
map(0xec00, 0xecff).ram().share("spriteram"); map(0xec00, 0xecff).ram().share(m_spriteram);
map(0xed00, 0xedff).ram().w("palette", FUNC(palette_device::write8)).share("palette"); map(0xed00, 0xedff).ram().w("palette", FUNC(palette_device::write8)).share("palette");
map(0xee00, 0xeeff).ram().w("palette", FUNC(palette_device::write8_ext)).share("palette_ext"); map(0xee00, 0xeeff).ram().w("palette", FUNC(palette_device::write8_ext)).share("palette_ext");
map(0xef00, 0xefff).ram(); map(0xef00, 0xefff).ram();
map(0xf000, 0xf000).w(FUNC(angelkds_state::angelkds_bgtopbank_write)); map(0xf000, 0xf000).w(FUNC(angelkds_state::bgbank_w<0>));
map(0xf001, 0xf001).w(FUNC(angelkds_state::angelkds_bgtopscroll_write)); map(0xf001, 0xf001).w(FUNC(angelkds_state::bgscroll_w<0>));
map(0xf002, 0xf002).w(FUNC(angelkds_state::angelkds_bgbotbank_write)); map(0xf002, 0xf002).w(FUNC(angelkds_state::bgbank_w<1>));
map(0xf003, 0xf003).w(FUNC(angelkds_state::angelkds_bgbotscroll_write)); map(0xf003, 0xf003).w(FUNC(angelkds_state::bgscroll_w<1>));
map(0xf004, 0xf004).w(FUNC(angelkds_state::angelkds_txbank_write)); map(0xf004, 0xf004).w(FUNC(angelkds_state::txbank_w));
map(0xf005, 0xf005).w(FUNC(angelkds_state::angelkds_layer_ctrl_write)); map(0xf005, 0xf005).w(FUNC(angelkds_state::layer_ctrl_w));
} }
void angelkds_state::decrypted_opcodes_map(address_map &map) void angelkds_state::decrypted_opcodes_map(address_map &map)
{ {
map(0x0000, 0x7fff).rom().share("decrypted_opcodes"); map(0x0000, 0x7fff).rom().share(m_decrypted_opcodes);
map(0x8000, 0xbfff).bankr("bank1"); map(0x8000, 0xbfff).bankr(m_mainbank);
} }
void angelkds_state::main_portmap(address_map &map) void angelkds_state::main_portmap(address_map &map)
@ -202,16 +452,16 @@ void angelkds_state::main_portmap(address_map &map)
map(0x40, 0x43).rw("ppi8255_0", FUNC(i8255_device::read), FUNC(i8255_device::write)); map(0x40, 0x43).rw("ppi8255_0", FUNC(i8255_device::read), FUNC(i8255_device::write));
map(0x80, 0x83).rw("ppi8255_1", FUNC(i8255_device::read), FUNC(i8255_device::write)); map(0x80, 0x83).rw("ppi8255_1", FUNC(i8255_device::read), FUNC(i8255_device::write));
map(0xc0, 0xc3).rw(FUNC(angelkds_state::angelkds_main_sound_r), FUNC(angelkds_state::angelkds_main_sound_w)); // 02 various points map(0xc0, 0xc3).rw(FUNC(angelkds_state::main_sound_r), FUNC(angelkds_state::main_sound_w)); // 02 various points
} }
/* sub cpu */ // audio CPU
void angelkds_state::sub_map(address_map &map) void angelkds_state::sound_map(address_map &map)
{ {
map(0x0000, 0x7fff).rom(); map(0x0000, 0x7fff).rom();
map(0x8000, 0x87ff).ram(); map(0x8000, 0x87ff).ram();
@ -220,16 +470,16 @@ void angelkds_state::sub_map(address_map &map)
map(0xaaac, 0xaaac).nopr(); map(0xaaac, 0xaaac).nopr();
} }
void angelkds_state::sub_portmap(address_map &map) void angelkds_state::sound_portmap(address_map &map)
{ {
map.global_mask(0xff); map.global_mask(0xff);
map(0x00, 0x01).rw("ym1", FUNC(ym2203_device::read), FUNC(ym2203_device::write)); map(0x00, 0x01).rw("ym1", FUNC(ym2203_device::read), FUNC(ym2203_device::write));
map(0x40, 0x41).rw("ym2", FUNC(ym2203_device::read), FUNC(ym2203_device::write)); map(0x40, 0x41).rw("ym2", FUNC(ym2203_device::read), FUNC(ym2203_device::write));
map(0x80, 0x83).rw(FUNC(angelkds_state::angelkds_sub_sound_r), FUNC(angelkds_state::angelkds_sub_sound_w)); // spcpostn map(0x80, 0x83).rw(FUNC(angelkds_state::audio_sound_r), FUNC(angelkds_state::audio_sound_w)); // spcpostn
} }
/* Input Ports */ // Input Ports
#define ANGELDSK_PLAYERS_INPUT( player ) \ #define ANGELDSK_PLAYERS_INPUT( player ) \
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_UP ) PORT_PLAYER(player) PORT_8WAY \ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_UP ) PORT_PLAYER(player) PORT_8WAY \
@ -249,18 +499,18 @@ static INPUT_PORTS_START( angelkds )
Joystick Test: Set SW1:1-7 ON & SW1:8 OFF (A:Free Play & B:3C_1C), hold test switch and reboot. Joystick Test: Set SW1:1-7 ON & SW1:8 OFF (A:Free Play & B:3C_1C), hold test switch and reboot.
Joystick Test Coin_A & Coin_B seem to be switched, only works when setting A to 3C_1C and B to Free Play. Joystick Test Coin_A & Coin_B seem to be switched, only works when setting A to 3C_1C and B to Free Play.
*/ */
PORT_START("I40") /* inport $40 */ PORT_START("I40") // inport $40
PORT_DIPNAME( 0xf0, 0xf0, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW1:1,2,3,4") PORT_DIPNAME( 0xf0, 0xf0, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW1:1,2,3,4")
PORT_DIPSETTING( 0x70, DEF_STR( 4C_1C ) ) PORT_DIPSETTING( 0x70, DEF_STR( 4C_1C ) )
PORT_DIPSETTING( 0x80, DEF_STR( 3C_1C ) ) PORT_DIPSETTING( 0x80, DEF_STR( 3C_1C ) )
PORT_DIPSETTING( 0x90, DEF_STR( 2C_1C ) ) PORT_DIPSETTING( 0x90, DEF_STR( 2C_1C ) )
// PORT_DIPSETTING( 0x60, DEF_STR( 2C_1C ) ) PORT_DIPSETTING( 0x60, DEF_STR( 2C_1C ) )
// PORT_DIPSETTING( 0x50, DEF_STR( 2C_1C ) ) PORT_DIPSETTING( 0x50, DEF_STR( 2C_1C ) )
// PORT_DIPSETTING( 0x40, DEF_STR( 2C_1C ) ) PORT_DIPSETTING( 0x40, DEF_STR( 2C_1C ) )
PORT_DIPSETTING( 0xf0, DEF_STR( 1C_1C ) ) PORT_DIPSETTING( 0xf0, DEF_STR( 1C_1C ) )
// PORT_DIPSETTING( 0x30, DEF_STR( 1C_1C ) ) PORT_DIPSETTING( 0x30, DEF_STR( 1C_1C ) )
// PORT_DIPSETTING( 0x20, DEF_STR( 1C_1C ) ) PORT_DIPSETTING( 0x20, DEF_STR( 1C_1C ) )
// PORT_DIPSETTING( 0x10, DEF_STR( 1C_1C ) ) PORT_DIPSETTING( 0x10, DEF_STR( 1C_1C ) )
PORT_DIPSETTING( 0xe0, DEF_STR( 1C_2C ) ) PORT_DIPSETTING( 0xe0, DEF_STR( 1C_2C ) )
PORT_DIPSETTING( 0xd0, DEF_STR( 1C_3C ) ) PORT_DIPSETTING( 0xd0, DEF_STR( 1C_3C ) )
PORT_DIPSETTING( 0xc0, DEF_STR( 1C_4C ) ) PORT_DIPSETTING( 0xc0, DEF_STR( 1C_4C ) )
@ -272,13 +522,13 @@ static INPUT_PORTS_START( angelkds )
PORT_DIPSETTING( 0x07, DEF_STR( 4C_1C ) ) PORT_DIPSETTING( 0x07, DEF_STR( 4C_1C ) )
PORT_DIPSETTING( 0x08, DEF_STR( 3C_1C ) ) PORT_DIPSETTING( 0x08, DEF_STR( 3C_1C ) )
PORT_DIPSETTING( 0x09, DEF_STR( 2C_1C ) ) PORT_DIPSETTING( 0x09, DEF_STR( 2C_1C ) )
// PORT_DIPSETTING( 0x06, DEF_STR( 2C_1C ) ) PORT_DIPSETTING( 0x06, DEF_STR( 2C_1C ) )
// PORT_DIPSETTING( 0x05, DEF_STR( 2C_1C ) ) PORT_DIPSETTING( 0x05, DEF_STR( 2C_1C ) )
// PORT_DIPSETTING( 0x04, DEF_STR( 2C_1C ) ) PORT_DIPSETTING( 0x04, DEF_STR( 2C_1C ) )
PORT_DIPSETTING( 0x0f, DEF_STR( 1C_1C ) ) PORT_DIPSETTING( 0x0f, DEF_STR( 1C_1C ) )
// PORT_DIPSETTING( 0x03, DEF_STR( 1C_1C ) ) PORT_DIPSETTING( 0x03, DEF_STR( 1C_1C ) )
// PORT_DIPSETTING( 0x02, DEF_STR( 1C_1C ) ) PORT_DIPSETTING( 0x02, DEF_STR( 1C_1C ) )
// PORT_DIPSETTING( 0x01, DEF_STR( 1C_1C ) ) PORT_DIPSETTING( 0x01, DEF_STR( 1C_1C ) )
PORT_DIPSETTING( 0x0e, DEF_STR( 1C_2C ) ) PORT_DIPSETTING( 0x0e, DEF_STR( 1C_2C ) )
PORT_DIPSETTING( 0x0d, DEF_STR( 1C_3C ) ) PORT_DIPSETTING( 0x0d, DEF_STR( 1C_3C ) )
PORT_DIPSETTING( 0x0c, DEF_STR( 1C_4C ) ) PORT_DIPSETTING( 0x0c, DEF_STR( 1C_4C ) )
@ -286,7 +536,7 @@ static INPUT_PORTS_START( angelkds )
PORT_DIPSETTING( 0x0a, DEF_STR( 1C_6C ) ) PORT_DIPSETTING( 0x0a, DEF_STR( 1C_6C ) )
PORT_DIPSETTING( 0x00, DEF_STR( Free_Play ) ) PORT_DIPSETTING( 0x00, DEF_STR( Free_Play ) )
PORT_START("I41") /* inport $41 */ PORT_START("I41") // inport $41
PORT_DIPNAME( 0x01, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW2:1") PORT_DIPNAME( 0x01, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW2:1")
PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) PORT_DIPSETTING( 0x00, DEF_STR( Upright ) )
PORT_DIPSETTING( 0x01, DEF_STR( Cocktail ) ) PORT_DIPSETTING( 0x01, DEF_STR( Cocktail ) )
@ -303,14 +553,14 @@ static INPUT_PORTS_START( angelkds )
PORT_DIPSETTING( 0x20, "4" ) PORT_DIPSETTING( 0x20, "4" )
PORT_DIPSETTING( 0x10, "5" ) PORT_DIPSETTING( 0x10, "5" )
PORT_DIPSETTING( 0x00, "99 (Cheat)" ) PORT_DIPSETTING( 0x00, "99 (Cheat)" )
PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:7,8") /* Stored at 0xc023 */ PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:7,8") // Stored at 0xc023
PORT_DIPSETTING( 0xc0, DEF_STR( Very_Easy ) ) PORT_DIPSETTING( 0xc0, DEF_STR( Very_Easy ) )
PORT_DIPSETTING( 0x40, DEF_STR( Easy ) ) PORT_DIPSETTING( 0x40, DEF_STR( Easy ) )
PORT_DIPSETTING( 0x80, DEF_STR( Hard ) ) PORT_DIPSETTING( 0x80, DEF_STR( Hard ) )
PORT_DIPSETTING( 0x00, DEF_STR( Very_Hard ) ) PORT_DIPSETTING( 0x00, DEF_STR( Very_Hard ) )
PORT_START("I80") /* inport $80 */ PORT_START("I80") // inport $80
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE1 )
@ -320,16 +570,16 @@ static INPUT_PORTS_START( angelkds )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_SERVICE( 0x80, IP_ACTIVE_LOW ) PORT_SERVICE( 0x80, IP_ACTIVE_LOW )
PORT_START("I81") /* inport $81 */ PORT_START("I81") // inport $81
ANGELDSK_PLAYERS_INPUT( 1 ) ANGELDSK_PLAYERS_INPUT( 1 )
PORT_START("I82") /* inport $82 */ PORT_START("I82") // inport $82
ANGELDSK_PLAYERS_INPUT( 2 ) ANGELDSK_PLAYERS_INPUT( 2 )
INPUT_PORTS_END INPUT_PORTS_END
static INPUT_PORTS_START( spcpostn ) static INPUT_PORTS_START( spcpostn )
PORT_START("I40") /* inport $40 */ PORT_START("I40") // inport $40
PORT_DIPNAME( 0x0f, 0x0f, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW1:1,2,3,4") PORT_DIPNAME( 0x0f, 0x0f, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW1:1,2,3,4")
PORT_DIPSETTING( 0x02, DEF_STR( 4C_1C ) ) PORT_DIPSETTING( 0x02, DEF_STR( 4C_1C ) )
PORT_DIPSETTING( 0x05, DEF_STR( 3C_1C ) ) PORT_DIPSETTING( 0x05, DEF_STR( 3C_1C ) )
@ -365,7 +615,7 @@ static INPUT_PORTS_START( spcpostn )
PORT_DIPSETTING( 0xa0, DEF_STR( 1C_6C ) ) PORT_DIPSETTING( 0xa0, DEF_STR( 1C_6C ) )
PORT_DIPSETTING( 0x90, DEF_STR( 1C_7C ) ) PORT_DIPSETTING( 0x90, DEF_STR( 1C_7C ) )
PORT_START("I41") /* inport $41 */ PORT_START("I41") // inport $41
PORT_DIPNAME( 0x01, 0x01, DEF_STR(Allow_Continue ) ) PORT_DIPLOCATION("SW2:1") PORT_DIPNAME( 0x01, 0x01, DEF_STR(Allow_Continue ) ) PORT_DIPLOCATION("SW2:1")
PORT_DIPSETTING( 0x01, DEF_STR( No ) ) PORT_DIPSETTING( 0x01, DEF_STR( No ) )
PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) PORT_DIPSETTING( 0x00, DEF_STR( Yes ) )
@ -385,9 +635,9 @@ static INPUT_PORTS_START( spcpostn )
PORT_DIPNAME( 0x40, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:7") PORT_DIPNAME( 0x40, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:7")
PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPUNUSED_DIPLOC( 0x80, 0x80, "SW2:8" ) /* Listed as "Unused" */ PORT_DIPUNUSED_DIPLOC( 0x80, 0x80, "SW2:8" ) // Listed as "Unused"
PORT_START("I80") /* inport $80 */ PORT_START("I80") // inport $80
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE1 )
@ -397,7 +647,7 @@ static INPUT_PORTS_START( spcpostn )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_SERVICE( 0x80, IP_ACTIVE_LOW ) PORT_SERVICE( 0x80, IP_ACTIVE_LOW )
PORT_START("I81") /* inport $81 */ PORT_START("I81") // inport $81
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_8WAY PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_8WAY
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) PORT_8WAY PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) PORT_8WAY
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) PORT_8WAY PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) PORT_8WAY
@ -407,7 +657,7 @@ static INPUT_PORTS_START( spcpostn )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_PLAYER(1) // probably unused PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_PLAYER(1) // probably unused
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_PLAYER(1) // probably unused PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_PLAYER(1) // probably unused
PORT_START("I82") /* inport $82 */ PORT_START("I82") // inport $82
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2) PORT_8WAY PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2) PORT_8WAY
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) PORT_8WAY PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) PORT_8WAY
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) PORT_8WAY PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) PORT_8WAY
@ -419,36 +669,36 @@ static INPUT_PORTS_START( spcpostn )
INPUT_PORTS_END INPUT_PORTS_END
/*** Sound Hardware /* Sound Hardware
todo: verify / correct things TODO: verify / correct things
seems a bit strange are all the addresses really seems a bit strange are all the addresses really
sound related ? sound related ?
*/ */
void angelkds_state::angelkds_main_sound_w(offs_t offset, uint8_t data) void angelkds_state::main_sound_w(offs_t offset, uint8_t data)
{ {
m_sound[offset] = data; m_sound[offset] = data;
} }
uint8_t angelkds_state::angelkds_main_sound_r(offs_t offset) uint8_t angelkds_state::main_sound_r(offs_t offset)
{ {
return m_sound2[offset]; return m_sound2[offset];
} }
void angelkds_state::angelkds_sub_sound_w(offs_t offset, uint8_t data) void angelkds_state::audio_sound_w(offs_t offset, uint8_t data)
{ {
m_sound2[offset] = data; m_sound2[offset] = data;
} }
uint8_t angelkds_state::angelkds_sub_sound_r(offs_t offset) uint8_t angelkds_state::audio_sound_r(offs_t offset)
{ {
return m_sound[offset]; return m_sound[offset];
} }
/*** Graphics Decoding /* Graphics Decoding
all the 8x8 tiles are in one format, the 16x16 sprites in another all the 8x8 tiles are in one format, the 16x16 sprites in another
@ -466,15 +716,15 @@ static const gfx_layout angelkds_spritelayout =
}; };
static GFXDECODE_START( gfx_angelkds ) static GFXDECODE_START( gfx_angelkds )
GFXDECODE_ENTRY( "gfx1", 0, gfx_8x8x4_packed_msb, 0x30, 1 ) GFXDECODE_ENTRY( "chars", 0, gfx_8x8x4_packed_msb, 0x30, 1 )
GFXDECODE_ENTRY( "gfx3", 0, gfx_8x8x4_packed_msb, 0, 16 ) GFXDECODE_ENTRY( "bgtiles_top", 0, gfx_8x8x4_packed_msb, 0, 16 )
GFXDECODE_ENTRY( "gfx4", 0, gfx_8x8x4_packed_msb, 0, 16 ) GFXDECODE_ENTRY( "bgtiles_bottom", 0, gfx_8x8x4_packed_msb, 0, 16 )
GFXDECODE_ENTRY( "gfx2", 0, angelkds_spritelayout, 0x20, 0x0d ) GFXDECODE_ENTRY( "sprites", 0, angelkds_spritelayout, 0x20, 0x0d )
GFXDECODE_END GFXDECODE_END
/*** Machine Driver /* Machine Driver
2 x z80 (one for game, one for sound) 2 x Z80 (one for game, one for sound)
2 x YM2203 (for sound) 2 x YM2203 (for sound)
all fairly straightforward all fairly straightforward
@ -483,19 +733,19 @@ GFXDECODE_END
void angelkds_state::machine_start() void angelkds_state::machine_start()
{ {
uint8_t *rom = memregion("banked_roms")->base();
m_mainbank->configure_entries(0, 16, &rom[0x0000], 0x4000);
save_item(NAME(m_layer_ctrl)); save_item(NAME(m_layer_ctrl));
save_item(NAME(m_txbank)); save_item(NAME(m_txbank));
save_item(NAME(m_bgbotbank)); save_item(NAME(m_bgbank));
save_item(NAME(m_bgtopbank));
save_item(NAME(m_sound)); save_item(NAME(m_sound));
save_item(NAME(m_sound2)); save_item(NAME(m_sound2));
} }
void angelkds_state::machine_reset() void angelkds_state::machine_reset()
{ {
int i; for (int i = 0; i < 4; i++)
for (i = 0; i < 4; i++)
{ {
m_sound[i] = 0; m_sound[i] = 0;
m_sound2[i] = 0; m_sound2[i] = 0;
@ -503,8 +753,7 @@ void angelkds_state::machine_reset()
m_layer_ctrl = 0; m_layer_ctrl = 0;
m_txbank = 0; m_txbank = 0;
m_bgbotbank = 0; m_bgbank[0] = m_bgbank[1] = 0;
m_bgtopbank = 0;
} }
void angelkds_state::angelkds(machine_config &config) void angelkds_state::angelkds(machine_config &config)
@ -514,15 +763,15 @@ void angelkds_state::angelkds(machine_config &config)
m_maincpu->set_addrmap(AS_IO, &angelkds_state::main_portmap); m_maincpu->set_addrmap(AS_IO, &angelkds_state::main_portmap);
m_maincpu->set_vblank_int("screen", FUNC(angelkds_state::irq0_line_hold)); m_maincpu->set_vblank_int("screen", FUNC(angelkds_state::irq0_line_hold));
Z80(config, m_subcpu, XTAL(4'000'000)); Z80(config, m_audiocpu, XTAL(4'000'000));
m_subcpu->set_addrmap(AS_PROGRAM, &angelkds_state::sub_map); m_audiocpu->set_addrmap(AS_PROGRAM, &angelkds_state::sound_map);
m_subcpu->set_addrmap(AS_IO, &angelkds_state::sub_portmap); m_audiocpu->set_addrmap(AS_IO, &angelkds_state::sound_portmap);
i8255_device &ppi0(I8255A(config, "ppi8255_0")); i8255_device &ppi0(I8255A(config, "ppi8255_0"));
ppi0.in_pa_callback().set_ioport("I40"); ppi0.in_pa_callback().set_ioport("I40");
ppi0.in_pb_callback().set_ioport("I41"); ppi0.in_pb_callback().set_ioport("I41");
ppi0.in_pc_callback().set(FUNC(angelkds_state::angeklds_ff_r)); // or left inputs don't work ppi0.in_pc_callback().set_constant(0xff); // or left inputs don't work
ppi0.out_pc_callback().set(FUNC(angelkds_state::angelkds_cpu_bank_write)); ppi0.out_pc_callback().set(FUNC(angelkds_state::cpu_bank_w));
i8255_device &ppi1(I8255A(config, "ppi8255_1")); i8255_device &ppi1(I8255A(config, "ppi8255_1"));
ppi1.in_pa_callback().set_ioport("I80"); ppi1.in_pa_callback().set_ioport("I80");
@ -531,13 +780,13 @@ void angelkds_state::angelkds(machine_config &config)
config.set_maximum_quantum(attotime::from_hz(6000)); config.set_maximum_quantum(attotime::from_hz(6000));
/* video hardware */ // video hardware
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_refresh_hz(60); screen.set_refresh_hz(60);
screen.set_vblank_time(ATTOSECONDS_IN_USEC(0)); screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
screen.set_size(32*8, 32*8); screen.set_size(32*8, 32*8);
screen.set_visarea(0*8, 32*8-1, 1*8, 31*8-1); screen.set_visarea(0*8, 32*8-1, 1*8, 31*8-1);
screen.set_screen_update(FUNC(angelkds_state::screen_update_angelkds)); screen.set_screen_update(FUNC(angelkds_state::screen_update));
screen.set_palette("palette"); screen.set_palette("palette");
GFXDECODE(config, m_gfxdecode, "palette", gfx_angelkds); GFXDECODE(config, m_gfxdecode, "palette", gfx_angelkds);
@ -546,7 +795,7 @@ void angelkds_state::angelkds(machine_config &config)
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
ym2203_device &ym1(YM2203(config, "ym1", XTAL(4'000'000))); ym2203_device &ym1(YM2203(config, "ym1", XTAL(4'000'000)));
ym1.irq_handler().set_inputline(m_subcpu, 0); ym1.irq_handler().set_inputline(m_audiocpu, 0);
ym1.add_route(0, "mono", 0.65); ym1.add_route(0, "mono", 0.65);
ym1.add_route(1, "mono", 0.65); ym1.add_route(1, "mono", 0.65);
ym1.add_route(2, "mono", 0.65); ym1.add_route(2, "mono", 0.65);
@ -563,7 +812,7 @@ void angelkds_state::spcpostn(machine_config &config)
{ {
angelkds(config); angelkds(config);
/* encryption */ // encryption
sega_317_0005_device &maincpu(SEGA_317_0005(config.replace(), m_maincpu, XTAL(6'000'000))); sega_317_0005_device &maincpu(SEGA_317_0005(config.replace(), m_maincpu, XTAL(6'000'000)));
maincpu.set_addrmap(AS_PROGRAM, &angelkds_state::main_map); maincpu.set_addrmap(AS_PROGRAM, &angelkds_state::main_map);
maincpu.set_addrmap(AS_IO, &angelkds_state::main_portmap); maincpu.set_addrmap(AS_IO, &angelkds_state::main_portmap);
@ -572,43 +821,31 @@ void angelkds_state::spcpostn(machine_config &config)
maincpu.set_decrypted_tag(m_decrypted_opcodes); maincpu.set_decrypted_tag(m_decrypted_opcodes);
} }
/*** Rom Loading
"maincpu" for the main code
"user1" for the banked data
"sub" for the sound cpu code
"gfx1" for the 8x8 Txt Layer Tiles
"gfx2" for the 16x16 Sprites
"gfx3" for the 8x8 Bg Layer Tiles (top tilemap)
"gfx4" for the 8x8 Bg Layer Tiles (bottom tilemap)
"proms" for the Prom (same between games)
*/
ROM_START( angelkds ) ROM_START( angelkds )
/* Nasco X090-PC-A (Sega 837-6600) */ // Nasco X090-PC-A (Sega 837-6600)
ROM_REGION( 0x8000, "maincpu", 0 ) ROM_REGION( 0x8000, "maincpu", 0 )
ROM_LOAD( "epr-11428.c10", 0x00000, 0x08000, CRC(90daacd2) SHA1(7e50ad1cbed0c1e6bad04ef1611cad25538c905f) ) ROM_LOAD( "epr-11428.c10", 0x00000, 0x08000, CRC(90daacd2) SHA1(7e50ad1cbed0c1e6bad04ef1611cad25538c905f) )
ROM_REGION( 0x40000, "user1", 0 ) /* Banked Code */ ROM_REGION( 0x40000, "banked_roms", 0 )
ROM_LOAD( "epr-11424.c1", 0x00000, 0x08000, CRC(b55997f6) SHA1(7ed746becac1851f39591f1fdbeff64aa97d6206) ) ROM_LOAD( "epr-11424.c1", 0x00000, 0x08000, CRC(b55997f6) SHA1(7ed746becac1851f39591f1fdbeff64aa97d6206) )
ROM_LOAD( "epr-11425.c2", 0x08000, 0x08000, CRC(299359de) SHA1(f531dd3bfe6f64e9e043cb4f85d5657455241dc7) ) ROM_LOAD( "epr-11425.c2", 0x08000, 0x08000, CRC(299359de) SHA1(f531dd3bfe6f64e9e043cb4f85d5657455241dc7) )
ROM_LOAD( "epr-11426.c3", 0x10000, 0x08000, CRC(5fad8bd3) SHA1(4d865342eb10dcfb779eee4ac1e159bb9ec140cb) ) ROM_LOAD( "epr-11426.c3", 0x10000, 0x08000, CRC(5fad8bd3) SHA1(4d865342eb10dcfb779eee4ac1e159bb9ec140cb) )
ROM_LOAD( "epr-11427.c4", 0x18000, 0x08000, CRC(ef920c74) SHA1(81c0fbe4ace5441e4cd99ba423e0190cc541da31) ) ROM_LOAD( "epr-11427.c4", 0x18000, 0x08000, CRC(ef920c74) SHA1(81c0fbe4ace5441e4cd99ba423e0190cc541da31) )
ROM_REGION( 0x10000, "sub", 0 ) ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "epr-11429.d4", 0x00000, 0x08000, CRC(0ca50a66) SHA1(cccb081b447419138b1ebd309e7f291e392a44d5) ) ROM_LOAD( "epr-11429.d4", 0x00000, 0x08000, CRC(0ca50a66) SHA1(cccb081b447419138b1ebd309e7f291e392a44d5) )
/* Nasco X090-PC-B */ // Nasco X090-PC-B
ROM_REGION( 0x08000, "gfx1", 0 ) ROM_REGION( 0x08000, "chars", 0 )
ROM_LOAD( "epr-11446", 0x00000, 0x08000, CRC(45052470) SHA1(c2312a9f814d6dbe42aa465147a04a2bd9b2aa1b) ) ROM_LOAD( "epr-11446", 0x00000, 0x08000, CRC(45052470) SHA1(c2312a9f814d6dbe42aa465147a04a2bd9b2aa1b) )
ROM_REGION( 0x10000, "gfx2", 0 ) ROM_REGION( 0x10000, "sprites", 0 )
ROM_LOAD( "epr-11447.f7", 0x08000, 0x08000, CRC(b3afc5b3) SHA1(376d527f60e9044f18d19a5535bca77606efbd4c) ) ROM_LOAD( "epr-11447.f7", 0x08000, 0x08000, CRC(b3afc5b3) SHA1(376d527f60e9044f18d19a5535bca77606efbd4c) )
ROM_LOAD( "epr-11448.h7", 0x00000, 0x08000, CRC(05dab626) SHA1(73feaca6e23c673a7d8c9e972714b20bd8f2d51e) ) ROM_LOAD( "epr-11448.h7", 0x00000, 0x08000, CRC(05dab626) SHA1(73feaca6e23c673a7d8c9e972714b20bd8f2d51e) )
/* both tilemaps on angelkds use the same gfx */ // both tilemaps on angelkds use the same GFX
ROM_REGION( 0x40000, "gfx3", 0 ) ROM_REGION( 0x40000, "bgtiles_top", 0 )
ROM_LOAD( "epr-11437", 0x00000, 0x08000, CRC(a520b628) SHA1(2b51f59e760e740e5e6b06dad61bbc23fc84a72b) ) ROM_LOAD( "epr-11437", 0x00000, 0x08000, CRC(a520b628) SHA1(2b51f59e760e740e5e6b06dad61bbc23fc84a72b) )
ROM_LOAD( "epr-11436", 0x08000, 0x08000, CRC(469ab216) SHA1(8223f072a6f9135ff84841c95410368bcea073d8) ) ROM_LOAD( "epr-11436", 0x08000, 0x08000, CRC(469ab216) SHA1(8223f072a6f9135ff84841c95410368bcea073d8) )
ROM_LOAD( "epr-11435", 0x10000, 0x08000, CRC(b0f8c245) SHA1(882e27eaceac46c397fdae8427a082caa7d6b7dc) ) ROM_LOAD( "epr-11435", 0x10000, 0x08000, CRC(b0f8c245) SHA1(882e27eaceac46c397fdae8427a082caa7d6b7dc) )
@ -618,7 +855,7 @@ ROM_START( angelkds )
ROM_LOAD( "epr-11431", 0x30000, 0x08000, CRC(ac2025af) SHA1(2aba145df3ccdb1a7f0fec524bd2de3f9aab4161) ) ROM_LOAD( "epr-11431", 0x30000, 0x08000, CRC(ac2025af) SHA1(2aba145df3ccdb1a7f0fec524bd2de3f9aab4161) )
ROM_LOAD( "epr-11430", 0x38000, 0x08000, CRC(d640f89e) SHA1(38fb67bcb2a3d1ad614fc62e42f22a66bc757137) ) ROM_LOAD( "epr-11430", 0x38000, 0x08000, CRC(d640f89e) SHA1(38fb67bcb2a3d1ad614fc62e42f22a66bc757137) )
ROM_REGION( 0x40000, "gfx4", 0 ) ROM_REGION( 0x40000, "bgtiles_bottom", 0 )
ROM_LOAD( "epr-11445", 0x00000, 0x08000, CRC(a520b628) SHA1(2b51f59e760e740e5e6b06dad61bbc23fc84a72b) ) ROM_LOAD( "epr-11445", 0x00000, 0x08000, CRC(a520b628) SHA1(2b51f59e760e740e5e6b06dad61bbc23fc84a72b) )
ROM_LOAD( "epr-11444", 0x08000, 0x08000, CRC(469ab216) SHA1(8223f072a6f9135ff84841c95410368bcea073d8) ) ROM_LOAD( "epr-11444", 0x08000, 0x08000, CRC(469ab216) SHA1(8223f072a6f9135ff84841c95410368bcea073d8) )
ROM_LOAD( "epr-11443", 0x10000, 0x08000, CRC(b0f8c245) SHA1(882e27eaceac46c397fdae8427a082caa7d6b7dc) ) ROM_LOAD( "epr-11443", 0x10000, 0x08000, CRC(b0f8c245) SHA1(882e27eaceac46c397fdae8427a082caa7d6b7dc) )
@ -633,34 +870,34 @@ ROM_START( angelkds )
ROM_END ROM_END
ROM_START( spcpostn ) ROM_START( spcpostn )
/* X090-PC-A 171-5383 (Sega 834-6089 SPACE POSITION) */ // X090-PC-A 171-5383 (Sega 834-6089 SPACE POSITION)
ROM_REGION( 0x8000, "maincpu", 0 ) /* D317-0005 (NEC Z80 Custom) */ ROM_REGION( 0x8000, "maincpu", 0 ) // D317-0005 (NEC Z80 Custom)
ROM_LOAD( "epr-10125.c10", 0x00000, 0x08000, CRC(bffd38c6) SHA1(af02907124343ddecd21439d25f1ebb81ef9f51a) ) /* encrypted */ ROM_LOAD( "epr-10125.c10", 0x00000, 0x08000, CRC(bffd38c6) SHA1(af02907124343ddecd21439d25f1ebb81ef9f51a) ) // encrypted
ROM_REGION( 0x40000, "user1", 0 ) /* Banked Code */ ROM_REGION( 0x40000, "banked_roms", 0 )
ROM_LOAD( "epr-10120.c1", 0x00000, 0x08000, CRC(d6399f99) SHA1(4c7d19a8798e5a10b688bf793ca74f5170fd9b51) ) ROM_LOAD( "epr-10120.c1", 0x00000, 0x08000, CRC(d6399f99) SHA1(4c7d19a8798e5a10b688bf793ca74f5170fd9b51) )
ROM_LOAD( "epr-10121.c2", 0x08000, 0x08000, CRC(d4861560) SHA1(74d28c36a08880abbd3c398cc3e990e8986caccb) ) ROM_LOAD( "epr-10121.c2", 0x08000, 0x08000, CRC(d4861560) SHA1(74d28c36a08880abbd3c398cc3e990e8986caccb) )
ROM_LOAD( "epr-10122.c3", 0x10000, 0x08000, CRC(7a1bff1b) SHA1(e1bda8430fd632c1813dd78e0f210a358e1b0d2f) ) ROM_LOAD( "epr-10122.c3", 0x10000, 0x08000, CRC(7a1bff1b) SHA1(e1bda8430fd632c1813dd78e0f210a358e1b0d2f) )
ROM_LOAD( "epr-10123.c4", 0x18000, 0x08000, CRC(6aed2925) SHA1(75848c8086c460b72494da2367f592d7d5dcf9f1) ) ROM_LOAD( "epr-10123.c4", 0x18000, 0x08000, CRC(6aed2925) SHA1(75848c8086c460b72494da2367f592d7d5dcf9f1) )
ROM_LOAD( "epr-10124.c5", 0x20000, 0x08000, CRC(a1d7ae6b) SHA1(ec81fecf63e0515cae2077e2623262227adfdf37) ) ROM_LOAD( "epr-10124.c5", 0x20000, 0x08000, CRC(a1d7ae6b) SHA1(ec81fecf63e0515cae2077e2623262227adfdf37) )
ROM_REGION( 0x10000, "sub", 0 ) /* NEC D780C-1 */ ROM_REGION( 0x10000, "audiocpu", 0 ) // NEC D780C-1
ROM_LOAD( "epr-10126.d4", 0x00000, 0x08000, CRC(ab17f852) SHA1(dc0db427ddb4df97bb40dfb6fc65cb9354a6b9ad) ) ROM_LOAD( "epr-10126.d4", 0x00000, 0x08000, CRC(ab17f852) SHA1(dc0db427ddb4df97bb40dfb6fc65cb9354a6b9ad) )
/* X090-PC-B 171-5384 */ // X090-PC-B 171-5384
ROM_REGION( 0x08000, "gfx1", 0 ) ROM_REGION( 0x08000, "chars", 0 )
ROM_LOAD( "epr-10133.17", 0x00000, 0x08000, CRC(642e6609) SHA1(2dfb4cc66f89543b55ed2a5b914e2c9304e821ca) ) ROM_LOAD( "epr-10133.17", 0x00000, 0x08000, CRC(642e6609) SHA1(2dfb4cc66f89543b55ed2a5b914e2c9304e821ca) )
ROM_REGION( 0x10000, "gfx2", 0 ) ROM_REGION( 0x10000, "sprites", 0 )
ROM_LOAD( "epr-10134.18", 0x08000, 0x08000, CRC(c674ff88) SHA1(9f240910a1ffb7c9e09d2326de280e6a5dd84565) ) ROM_LOAD( "epr-10134.18", 0x08000, 0x08000, CRC(c674ff88) SHA1(9f240910a1ffb7c9e09d2326de280e6a5dd84565) )
ROM_LOAD( "epr-10135.19", 0x00000, 0x08000, CRC(0685c4fa) SHA1(6950d9ad9ec13236cf24e83e87adb62aa53af7bb) ) ROM_LOAD( "epr-10135.19", 0x00000, 0x08000, CRC(0685c4fa) SHA1(6950d9ad9ec13236cf24e83e87adb62aa53af7bb) )
ROM_REGION( 0x30000, "gfx3", 0 ) ROM_REGION( 0x30000, "bgtiles_top", 0 )
ROM_LOAD( "epr-10130.14", 0x10000, 0x08000, CRC(b68fcb36) SHA1(3943dd550b13f2911d56d8dad675410da79196e6) ) ROM_LOAD( "epr-10130.14", 0x10000, 0x08000, CRC(b68fcb36) SHA1(3943dd550b13f2911d56d8dad675410da79196e6) )
ROM_LOAD( "epr-10131.15", 0x08000, 0x08000, CRC(de223817) SHA1(1860db0a19c926fcfaabe676cb57fff38c4df8e6) ) ROM_LOAD( "epr-10131.15", 0x08000, 0x08000, CRC(de223817) SHA1(1860db0a19c926fcfaabe676cb57fff38c4df8e6) )
ROM_LOAD( "epr-10132.16", 0x00000, 0x08000, CRC(2df8b1bd) SHA1(cad8befa3f2c158d2aa74073066ccd2b54e68825) ) ROM_LOAD( "epr-10132.16", 0x00000, 0x08000, CRC(2df8b1bd) SHA1(cad8befa3f2c158d2aa74073066ccd2b54e68825) )
ROM_REGION( 0x18000, "gfx4", 0 ) ROM_REGION( 0x18000, "bgtiles_bottom", 0 )
ROM_LOAD( "epr-10127.06", 0x10000, 0x08000, CRC(b68fcb36) SHA1(3943dd550b13f2911d56d8dad675410da79196e6) ) ROM_LOAD( "epr-10127.06", 0x10000, 0x08000, CRC(b68fcb36) SHA1(3943dd550b13f2911d56d8dad675410da79196e6) )
ROM_LOAD( "epr-10128.07", 0x08000, 0x08000, CRC(de223817) SHA1(1860db0a19c926fcfaabe676cb57fff38c4df8e6) ) ROM_LOAD( "epr-10128.07", 0x08000, 0x08000, CRC(de223817) SHA1(1860db0a19c926fcfaabe676cb57fff38c4df8e6) )
ROM_LOAD( "epr-10129.08", 0x00000, 0x08000, CRC(a6f21023) SHA1(8d573446a2d3d3428409707d0c59b118d1463131) ) ROM_LOAD( "epr-10129.08", 0x00000, 0x08000, CRC(a6f21023) SHA1(8d573446a2d3d3428409707d0c59b118d1463131) )
@ -669,14 +906,8 @@ ROM_START( spcpostn )
ROM_LOAD( "63s081n.u5", 0x00, 0x20, CRC(36b98627) SHA1(d2d54d92d1d47e7cc85104989ee421ce5d80a42a) ) ROM_LOAD( "63s081n.u5", 0x00, 0x20, CRC(36b98627) SHA1(d2d54d92d1d47e7cc85104989ee421ce5d80a42a) )
ROM_END ROM_END
} // anonymous namespace
void angelkds_state::init_angelkds()
{
uint8_t *RAM = memregion("user1")->base();
membank("bank1")->configure_entries(0, 16, &RAM[0x0000], 0x4000);
}
GAME( 1988, angelkds, 0, angelkds, angelkds, angelkds_state, empty_init, ROT90, "Sega / Nasco?", "Angel Kids (Japan)" , MACHINE_SUPPORTS_SAVE) // Nasco not displayed but 'Exa Planning' is
GAME( 1988, angelkds, 0, angelkds, angelkds, angelkds_state, init_angelkds, ROT90, "Sega / Nasco?", "Angel Kids (Japan)" , MACHINE_SUPPORTS_SAVE) /* Nasco not displayed but 'Exa Planning' is */ GAME( 1986, spcpostn, 0, spcpostn, spcpostn, angelkds_state, empty_init, ROT90, "Sega / Nasco", "Space Position (Japan)" , MACHINE_SUPPORTS_SAVE) // encrypted
GAME( 1986, spcpostn, 0, spcpostn, spcpostn, angelkds_state, init_angelkds, ROT90, "Sega / Nasco", "Space Position (Japan)" , MACHINE_SUPPORTS_SAVE) /* encrypted */

View File

@ -75,7 +75,7 @@
| YUVO CO., LTD | | YUVO CO., LTD |
|----------------------------------------------- |-----------------------------------------------
next to rom M-GF_A10.12K next to ROM M-GF_A10.12K
the box must contain at least a Z80 the box must contain at least a Z80
DASM Notes: DASM Notes:
@ -84,23 +84,255 @@ tries to see if $612c onward has a "MASTERJ" string on it, resets itself
otherwise. otherwise.
During irq routines it also checks if bit 7 is active for $640a-$6415, During irq routines it also checks if bit 7 is active for $640a-$6415,
modifies this area if condition is true. modifies this area if condition is true.
Neither of above matches what we have in the rom data banks, so it's either Neither of above matches what we have in the ROM data banks, so it's either
protected or a snippet should do the aforementioned string copy. protected or a snippet should do the aforementioned string copy.
***************************************************************************/ ***************************************************************************/
#include "emu.h" #include "emu.h"
#include "includes/crgolf.h"
#include "cpu/z80/z80.h" #include "cpu/z80/z80.h"
#include "machine/74259.h" #include "machine/74259.h"
#include "machine/gen_latch.h" #include "machine/gen_latch.h"
#include "sound/ay8910.h" #include "sound/ay8910.h"
#include "sound/msm5205.h" #include "sound/msm5205.h"
#include "emupal.h"
#include "screen.h" #include "screen.h"
#include "speaker.h" #include "speaker.h"
namespace {
class crgolf_state : public driver_device
{
public:
crgolf_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_audiocpu(*this, "audiocpu"),
m_palette(*this, "palette"),
m_videoram(*this, "vram%u", 0U, 0x6000U, ENDIANNESS_LITTLE),
m_mainbank(*this, "mainbank"),
m_stick(*this, "STICK%u", 0U),
m_ioport(*this, { "IN0", "IN1", "P1", "P2", "DSW", "UNUSED0", "UNUSED1" })
{ }
void crgolf(machine_config &config);
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
// devices
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
required_device<palette_device> m_palette;
void sound_map(address_map &map);
private:
// memory pointers
memory_share_array_creator<uint8_t, 2> m_videoram;
required_memory_bank m_mainbank;
required_ioport_array<2> m_stick;
required_ioport_array<7> m_ioport;
bool m_color_select = false;
bool m_screen_flip = false;
bool m_screen_enable[2] = { false, false };
// misc
uint8_t m_port_select = 0U;
void rom_bank_select_w(uint8_t data);
uint8_t switch_input_r();
uint8_t analog_input_r();
void switch_input_select_w(uint8_t data);
void unknown_w(uint8_t data);
DECLARE_WRITE_LINE_MEMBER(color_select_w);
DECLARE_WRITE_LINE_MEMBER(screen_flip_w);
DECLARE_WRITE_LINE_MEMBER(screen_select_w);
template <uint8_t Which> DECLARE_WRITE_LINE_MEMBER(screen_enable_w);
void palette(palette_device &palette) const;
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void main_map(address_map &map);
};
class crgolfhi_state : public crgolf_state
{
public:
crgolfhi_state(const machine_config &mconfig, device_type type, const char *tag) :
crgolf_state(mconfig, type, tag),
m_adpcm_rom(*this, "adpcm"),
m_msm(*this, "msm")
{ }
void crgolfhi(machine_config &config);
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
private:
// memory pointers
required_region_ptr<uint8_t> m_adpcm_rom;
// devices
required_device<msm5205_device> m_msm;
// misc
uint16_t m_sample_offset = 0U;
uint8_t m_sample_count = 0U;
void sample_w(offs_t offset, uint8_t data);
DECLARE_WRITE_LINE_MEMBER(vck_callback);
void sound_map(address_map &map);
};
class mastrglf_state : public crgolfhi_state
{
public:
mastrglf_state(const machine_config &mconfig, device_type type, const char *tag) :
crgolfhi_state(mconfig, type, tag)
{ }
void mastrglf(machine_config &config);
private:
uint8_t unk_sound_02_r();
uint8_t unk_sound_05_r();
uint8_t unk_sound_07_r();
void unk_sound_0c_w(uint8_t data);
void palette(palette_device &palette) const;
void main_io_map(address_map &map);
void main_prg_map(address_map &map);
void sound_io_map(address_map &map);
void sound_prg_map(address_map &map);
};
// video
/*************************************
*
* Video startup
*
*************************************/
void crgolf_state::palette(palette_device &palette) const
{
uint8_t const *const prom = memregion("proms")->base();
static constexpr uint8_t NUM_PENS = 0x20;
for (offs_t offs = 0; offs < NUM_PENS; offs++)
{
uint8_t const data = prom[offs];
// red component
int bit0 = BIT(data, 0);
int bit1 = BIT(data, 1);
int bit2 = BIT(data, 2);
int const r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
// green component
bit0 = BIT(data, 3);
bit1 = BIT(data, 4);
bit2 = BIT(data, 5);
int const g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
// blue component
bit0 = BIT(data, 6);
bit1 = BIT(data, 7);
int const b = 0x4f * bit0 + 0xa8 * bit1;
m_palette->set_pen_color(offs, r, g, b);
}
}
void mastrglf_state::palette(palette_device &palette) const
{
// TODO: once PROMs are dumped
}
/*************************************
*
* Video update
*
*************************************/
uint32_t crgolf_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
int flip = m_screen_flip;
static constexpr uint16_t VIDEORAM_SIZE = 0x2000 * 3;
// for each byte in the video RAM
for (offs_t offs = 0; offs < VIDEORAM_SIZE / 3; offs++)
{
uint8_t y = (offs & 0x1fe0) >> 5;
uint8_t x = (offs & 0x001f) << 3;
uint8_t data_a0 = m_videoram[0][0x2000 | offs];
uint8_t data_a1 = m_videoram[0][0x0000 | offs];
uint8_t data_a2 = m_videoram[0][0x4000 | offs];
uint8_t data_b0 = m_videoram[1][0x2000 | offs];
uint8_t data_b1 = m_videoram[1][0x0000 | offs];
uint8_t data_b2 = m_videoram[1][0x4000 | offs];
if (flip)
{
y = ~y;
x = ~x;
}
// for each pixel in the byte
for (int i = 0; i < 8; i++)
{
offs_t color;
uint8_t data_b = 0;
uint8_t data_a = 0;
if (!m_screen_enable[0])
data_a = ((data_a0 & 0x80) >> 7) | ((data_a1 & 0x80) >> 6) | ((data_a2 & 0x80) >> 5);
if (!m_screen_enable[1])
data_b = ((data_b0 & 0x80) >> 7) | ((data_b1 & 0x80) >> 6) | ((data_b2 & 0x80) >> 5);
// screen A has priority over B
if (data_a)
color = data_a;
else
color = data_b | 0x08;
// add HI bit if enabled
if (m_color_select)
color = color | 0x10;
bitmap.pix(y, x) = color;
// next pixel
data_a0 = data_a0 << 1;
data_a1 = data_a1 << 1;
data_a2 = data_a2 << 1;
data_b0 = data_b0 << 1;
data_b1 = data_b1 << 1;
data_b2 = data_b2 << 1;
if (flip)
x = x - 1;
else
x = x + 1;
}
}
return 0;
}
// machine
/************************************* /*************************************
* *
* ROM banking * ROM banking
@ -109,35 +341,44 @@ protected or a snippet should do the aforementioned string copy.
void crgolf_state::rom_bank_select_w(uint8_t data) void crgolf_state::rom_bank_select_w(uint8_t data)
{ {
membank("bank1")->set_entry(data & 15); m_mainbank->set_entry(data & 15); // TODO: mastrglf has more banks
} }
void crgolf_state::machine_start() void crgolf_state::machine_start()
{ {
if (membank("bank1")) uint32_t size = memregion("maindata")->bytes();
{
uint32_t size = memregion("maindata")->bytes();
/* configure the banking */ // configure the banking
membank("bank1")->configure_entries(0, size/0x2000, memregion("maindata")->base(), 0x2000); m_mainbank->configure_entries(0, size / 0x2000, memregion("maindata")->base(), 0x2000);
membank("bank1")->set_entry(0); m_mainbank->set_entry(0);
} membank("vrambank")->configure_entry(0, m_videoram[0]);
membank("vrambank")->configure_entry(1, m_videoram[1]);
/* register for save states */ // register for save states
save_item(NAME(m_port_select)); save_item(NAME(m_port_select));
save_item(NAME(m_sample_offset));
save_item(NAME(m_sample_count));
save_item(NAME(m_color_select)); save_item(NAME(m_color_select));
save_item(NAME(m_screen_flip)); save_item(NAME(m_screen_flip));
save_item(NAME(m_screena_enable)); save_item(NAME(m_screen_enable));
save_item(NAME(m_screenb_enable));
} }
void crgolfhi_state::machine_start()
{
crgolf_state::machine_start();
save_item(NAME(m_sample_offset));
save_item(NAME(m_sample_count));
}
void crgolf_state::machine_reset() void crgolf_state::machine_reset()
{ {
m_port_select = 0; m_port_select = 0;
}
void crgolfhi_state::machine_reset()
{
crgolf_state::machine_reset();
m_sample_offset = 0; m_sample_offset = 0;
m_sample_count = 0; m_sample_count = 0;
} }
@ -151,27 +392,21 @@ void crgolf_state::machine_reset()
uint8_t crgolf_state::switch_input_r() uint8_t crgolf_state::switch_input_r()
{ {
static const char *const portnames[] = { "IN0", "IN1", "P1", "P2", "DSW", "UNUSED0", "UNUSED1" }; return m_ioport[m_port_select]->read();
return ioport(portnames[m_port_select])->read();
} }
uint8_t crgolf_state::analog_input_r() uint8_t crgolf_state::analog_input_r()
{ {
return ((ioport("STICK0")->read() >> 4) | (ioport("STICK1")->read() & 0xf0)) ^ 0x88; return ((m_stick[0]->read() >> 4) | (m_stick[1]->read() & 0xf0)) ^ 0x88;
} }
void crgolf_state::switch_input_select_w(uint8_t data) void crgolf_state::switch_input_select_w(uint8_t data)
{ {
if (!(data & 0x40)) m_port_select = 6; for (int i = 6; i >= 0; i--)
if (!(data & 0x20)) m_port_select = 5; if (!(BIT(data, i)))
if (!(data & 0x10)) m_port_select = 4; m_port_select = i;
if (!(data & 0x08)) m_port_select = 3;
if (!(data & 0x04)) m_port_select = 2;
if (!(data & 0x02)) m_port_select = 1;
if (!(data & 0x01)) m_port_select = 0;
} }
@ -188,23 +423,23 @@ void crgolf_state::unknown_w(uint8_t data)
* *
*************************************/ *************************************/
WRITE_LINE_MEMBER(crgolf_state::vck_callback) WRITE_LINE_MEMBER(crgolfhi_state::vck_callback)
{ {
/* only play back if we have data remaining */ // only play back if we have data remaining
if (m_sample_count != 0xff) if (m_sample_count != 0xff)
{ {
uint8_t data = memregion("adpcm")->base()[m_sample_offset >> 1]; uint8_t data = m_adpcm_rom[m_sample_offset >> 1];
/* write the next nibble and advance */ // write the next nibble and advance
m_msm->data_w((data >> (4 * (~m_sample_offset & 1))) & 0x0f); m_msm->data_w((data >> (4 * (~m_sample_offset & 1))) & 0x0f);
m_sample_offset++; m_sample_offset++;
/* every 256 clocks, we decrement the length */ // every 256 clocks, we decrement the length
if (!(m_sample_offset & 0xff)) if (!(m_sample_offset & 0xff))
{ {
m_sample_count--; m_sample_count--;
/* if we hit 0xff, automatically turn off playback */ // if we hit 0xff, automatically turn off playback
if (m_sample_count == 0xff) if (m_sample_count == 0xff)
m_msm->reset_w(1); m_msm->reset_w(1);
} }
@ -212,26 +447,26 @@ WRITE_LINE_MEMBER(crgolf_state::vck_callback)
} }
void crgolf_state::crgolfhi_sample_w(offs_t offset, uint8_t data) void crgolfhi_state::sample_w(offs_t offset, uint8_t data)
{ {
switch (offset) switch (offset)
{ {
/* offset 0 holds the MSM5205 in reset */ // offset 0 holds the MSM5205 in reset
case 0: case 0:
m_msm->reset_w(1); m_msm->reset_w(1);
break; break;
/* offset 1 is the length/256 nibbles */ // offset 1 is the length/256 nibbles
case 1: case 1:
m_sample_count = data; m_sample_count = data;
break; break;
/* offset 2 is the offset/256 nibbles */ // offset 2 is the offset/256 nibbles
case 2: case 2:
m_sample_offset = data << 8; m_sample_offset = data << 8;
break; break;
/* offset 3 turns on playback */ // offset 3 turns on playback
case 3: case 3:
m_msm->reset_w(0); m_msm->reset_w(0);
break; break;
@ -251,21 +486,10 @@ WRITE_LINE_MEMBER(crgolf_state::screen_flip_w)
} }
WRITE_LINE_MEMBER(crgolf_state::screen_select_w) template <uint8_t Which>
WRITE_LINE_MEMBER(crgolf_state::screen_enable_w)
{ {
m_vrambank->set_bank(state); m_screen_enable[Which] = state;
}
WRITE_LINE_MEMBER(crgolf_state::screena_enable_w)
{
m_screena_enable = state;
}
WRITE_LINE_MEMBER(crgolf_state::screenb_enable_w)
{
m_screenb_enable = state;
} }
@ -280,18 +504,12 @@ void crgolf_state::main_map(address_map &map)
{ {
map(0x0000, 0x3fff).rom(); map(0x0000, 0x3fff).rom();
map(0x4000, 0x5fff).ram(); map(0x4000, 0x5fff).ram();
map(0x6000, 0x7fff).bankr("bank1"); map(0x6000, 0x7fff).bankr(m_mainbank);
map(0x8000, 0x8007).w("mainlatch", FUNC(ls259_device::write_d0)); map(0x8000, 0x8007).w("mainlatch", FUNC(ls259_device::write_d0));
map(0x8800, 0x8800).r("soundlatch2", FUNC(generic_latch_8_device::read)); map(0x8800, 0x8800).r("soundlatch2", FUNC(generic_latch_8_device::read));
map(0x8800, 0x8800).w("soundlatch1", FUNC(generic_latch_8_device::write)); map(0x8800, 0x8800).w("soundlatch1", FUNC(generic_latch_8_device::write));
map(0x9000, 0x9000).w(FUNC(crgolf_state::rom_bank_select_w)); map(0x9000, 0x9000).w(FUNC(crgolf_state::rom_bank_select_w));
map(0xa000, 0xffff).m(m_vrambank, FUNC(address_map_bank_device::amap8)); map(0xa000, 0xffff).bankrw("vrambank");
}
void crgolf_state::vrambank_map(address_map &map)
{
map(0x0000, 0x5fff).ram().share("vrama");
map(0x8000, 0xdfff).ram().share("vramb");
} }
@ -313,24 +531,28 @@ void crgolf_state::sound_map(address_map &map)
map(0xe003, 0xe003).w("soundlatch2", FUNC(generic_latch_8_device::write)); map(0xe003, 0xe003).w("soundlatch2", FUNC(generic_latch_8_device::write));
} }
void crgolfhi_state::sound_map(address_map &map)
{
crgolf_state::sound_map(map);
map(0xa000, 0xa003).w(FUNC(crgolfhi_state::sample_w));
}
void mastrglf_state::main_prg_map(address_map &map)
void crgolf_state::mastrglf_map(address_map &map)
{ {
map(0x0000, 0x3fff).rom(); map(0x0000, 0x3fff).rom();
map(0x4000, 0x5fff).bankr("bank1"); map(0x4000, 0x5fff).bankr("mainbank");
map(0x6000, 0x8fff).ram(); // maybe RAM and ROM here? map(0x6000, 0x8fff).ram(); // maybe RAM and ROM here?
map(0x9000, 0x9fff).ram(); map(0x9000, 0x9fff).ram();
map(0xa000, 0xffff).m(m_vrambank, FUNC(address_map_bank_device::amap8)); map(0xa000, 0xffff).bankrw("vrambank");
} }
void crgolf_state::mastrglf_io(address_map &map) void mastrglf_state::main_io_map(address_map &map)
{ {
map.global_mask(0xff); map.global_mask(0xff);
map(0x00, 0x07).w("mainlatch", FUNC(ls259_device::write_d0)); map(0x00, 0x07).w("mainlatch", FUNC(ls259_device::write_d0));
@ -341,43 +563,43 @@ void crgolf_state::mastrglf_io(address_map &map)
void crgolf_state::mastrglf_submap(address_map &map) void mastrglf_state::sound_prg_map(address_map &map)
{ {
map(0x0000, 0x7fff).rom(); map(0x0000, 0x7fff).rom();
map(0x8000, 0x87ff).ram(); map(0x8000, 0x87ff).ram();
} }
uint8_t crgolf_state::unk_sub_02_r() uint8_t mastrglf_state::unk_sound_02_r()
{ {
return 0x00; return 0x00;
} }
uint8_t crgolf_state::unk_sub_05_r() uint8_t mastrglf_state::unk_sound_05_r()
{ {
return 0x00; return 0x00;
} }
uint8_t crgolf_state::unk_sub_07_r() uint8_t mastrglf_state::unk_sound_07_r()
{ {
return 0x00; return 0x00;
} }
void crgolf_state::unk_sub_0c_w(uint8_t data) void mastrglf_state::unk_sound_0c_w(uint8_t data)
{ {
} }
void crgolf_state::mastrglf_subio(address_map &map) void mastrglf_state::sound_io_map(address_map &map)
{ {
map.global_mask(0xff); map.global_mask(0xff);
map(0x00, 0x00).r("soundlatch1", FUNC(generic_latch_8_device::read)).nopw(); map(0x00, 0x00).r("soundlatch1", FUNC(generic_latch_8_device::read)).nopw();
map(0x02, 0x02).r(FUNC(crgolf_state::unk_sub_02_r)); map(0x02, 0x02).r(FUNC(mastrglf_state::unk_sound_02_r));
map(0x05, 0x05).r(FUNC(crgolf_state::unk_sub_05_r)); map(0x05, 0x05).r(FUNC(mastrglf_state::unk_sound_05_r));
map(0x06, 0x06).nopr(); map(0x06, 0x06).nopr();
map(0x07, 0x07).r(FUNC(crgolf_state::unk_sub_07_r)); map(0x07, 0x07).r(FUNC(mastrglf_state::unk_sound_07_r));
map(0x08, 0x08).w("soundlatch2", FUNC(generic_latch_8_device::write)); map(0x08, 0x08).w("soundlatch2", FUNC(generic_latch_8_device::write));
map(0x0c, 0x0c).w(FUNC(crgolf_state::unk_sub_0c_w)); map(0x0c, 0x0c).w(FUNC(mastrglf_state::unk_sound_0c_w));
map(0x10, 0x11).w("aysnd", FUNC(ay8910_device::address_data_w)); map(0x10, 0x11).w("aysnd", FUNC(ay8910_device::address_data_w));
} }
@ -390,12 +612,12 @@ void crgolf_state::mastrglf_subio(address_map &map)
*************************************/ *************************************/
static INPUT_PORTS_START( crgolf ) static INPUT_PORTS_START( crgolf )
PORT_START("IN0") /* CREDIT */ PORT_START("IN0") // CREDIT
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_SERVICE1 )
PORT_BIT( 0xfc, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0xfc, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("IN1") /* SELECT */ PORT_START("IN1") // SELECT
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 ) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START2 ) PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START2 )
@ -404,24 +626,24 @@ static INPUT_PORTS_START( crgolf )
PORT_BIT( 0xe0, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0xe0, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("P1") PORT_START("P1")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_PLAYER(1) /* club select */ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_PLAYER(1) // club select
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) /* backward address */ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) // backward address
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(1) /* forward address */ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(1) // forward address
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(1) /* open stance */ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(1) // open stance
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_PLAYER(1) /* closed stance */ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_PLAYER(1) // closed stance
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) /* direction left */ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) // direction left
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) /* direction right */ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) // direction right
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) /* shot switch */ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) // shot switch
PORT_START("P2") PORT_START("P2")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_COCKTAIL /* club select */ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_COCKTAIL // club select
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL /* backward address */ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL // backward address
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_COCKTAIL /* forward address */ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_COCKTAIL // forward address
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_COCKTAIL /* open stance */ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_COCKTAIL // open stance
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_COCKTAIL /* closed stance */ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_COCKTAIL // closed stance
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL /* direction left */ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL // direction left
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL /* direction right */ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL // direction right
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL /* shot switch */ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL // shot switch
PORT_START("DSW") PORT_START("DSW")
PORT_DIPNAME( 0x01, 0x00, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW:2") PORT_DIPNAME( 0x01, 0x00, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW:2")
@ -488,12 +710,14 @@ INPUT_PORTS_END
void crgolf_state::crgolf(machine_config &config) void crgolf_state::crgolf(machine_config &config)
{ {
/* basic machine hardware */ static constexpr XTAL MASTER_CLOCK = XTAL(18'432'000);
Z80(config, m_maincpu, MASTER_CLOCK/3/2);
// basic machine hardware
Z80(config, m_maincpu, MASTER_CLOCK / 3 / 2);
m_maincpu->set_addrmap(AS_PROGRAM, &crgolf_state::main_map); m_maincpu->set_addrmap(AS_PROGRAM, &crgolf_state::main_map);
m_maincpu->set_vblank_int("screen", FUNC(crgolf_state::irq0_line_hold)); m_maincpu->set_vblank_int("screen", FUNC(crgolf_state::irq0_line_hold));
Z80(config, m_audiocpu, MASTER_CLOCK/3/2); Z80(config, m_audiocpu, MASTER_CLOCK / 3 / 2);
m_audiocpu->set_addrmap(AS_PROGRAM, &crgolf_state::sound_map); m_audiocpu->set_addrmap(AS_PROGRAM, &crgolf_state::sound_map);
m_audiocpu->set_vblank_int("screen", FUNC(crgolf_state::irq0_line_hold)); m_audiocpu->set_vblank_int("screen", FUNC(crgolf_state::irq0_line_hold));
@ -502,56 +726,55 @@ void crgolf_state::crgolf(machine_config &config)
ls259_device &mainlatch(LS259(config, "mainlatch")); // 1H ls259_device &mainlatch(LS259(config, "mainlatch")); // 1H
mainlatch.q_out_cb<3>().set(FUNC(crgolf_state::color_select_w)); mainlatch.q_out_cb<3>().set(FUNC(crgolf_state::color_select_w));
mainlatch.q_out_cb<4>().set(FUNC(crgolf_state::screen_flip_w)); mainlatch.q_out_cb<4>().set(FUNC(crgolf_state::screen_flip_w));
mainlatch.q_out_cb<5>().set(FUNC(crgolf_state::screen_select_w)); mainlatch.q_out_cb<5>().set_membank("vrambank");
mainlatch.q_out_cb<6>().set(FUNC(crgolf_state::screenb_enable_w)); mainlatch.q_out_cb<6>().set(FUNC(crgolf_state::screen_enable_w<1>));
mainlatch.q_out_cb<7>().set(FUNC(crgolf_state::screena_enable_w)); mainlatch.q_out_cb<7>().set(FUNC(crgolf_state::screen_enable_w<0>));
GENERIC_LATCH_8(config, "soundlatch1").data_pending_callback().set_inputline(m_audiocpu, INPUT_LINE_NMI); GENERIC_LATCH_8(config, "soundlatch1").data_pending_callback().set_inputline(m_audiocpu, INPUT_LINE_NMI);
GENERIC_LATCH_8(config, "soundlatch2").data_pending_callback().set_inputline(m_maincpu, INPUT_LINE_NMI); GENERIC_LATCH_8(config, "soundlatch2").data_pending_callback().set_inputline(m_maincpu, INPUT_LINE_NMI);
/* stride is technically 0x6000, but powers of 2 makes the memory map / address masking cleaner. */ PALETTE(config, m_palette, FUNC(crgolf_state::palette), 0x20);
ADDRESS_MAP_BANK(config, "vrambank").set_map(&crgolf_state::vrambank_map).set_options(ENDIANNESS_LITTLE, 8, 16, 0x8000);
PALETTE(config, m_palette, FUNC(crgolf_state::crgolf_palette), 0x20); // video hardware
/* video hardware */
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_refresh_hz(60); screen.set_refresh_hz(60);
screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); // not accurate
screen.set_size(256, 256); screen.set_size(256, 256);
screen.set_visarea(0, 255, 8, 247); screen.set_visarea(0, 255, 8, 247);
screen.set_screen_update(FUNC(crgolf_state::screen_update_crgolf)); screen.set_screen_update(FUNC(crgolf_state::screen_update));
screen.set_palette(m_palette); screen.set_palette(m_palette);
/* sound hardware */ // sound hardware
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
AY8910(config, "aysnd", MASTER_CLOCK/3/2/2).add_route(ALL_OUTPUTS, "mono", 1.0); AY8910(config, "aysnd", MASTER_CLOCK / 3 / 2 / 2).add_route(ALL_OUTPUTS, "mono", 1.0);
} }
void crgolf_state::crgolfhi(machine_config &config) void crgolfhi_state::crgolfhi(machine_config &config)
{ {
crgolf(config); crgolf(config);
m_audiocpu->set_addrmap(AS_PROGRAM, &crgolfhi_state::sound_map);
MSM5205(config, m_msm, 384000); MSM5205(config, m_msm, 384000);
m_msm->vck_legacy_callback().set(FUNC(crgolf_state::vck_callback)); m_msm->vck_legacy_callback().set(FUNC(crgolfhi_state::vck_callback));
m_msm->set_prescaler_selector(msm5205_device::S64_4B); m_msm->set_prescaler_selector(msm5205_device::S64_4B);
m_msm->add_route(ALL_OUTPUTS, "mono", 1.0); m_msm->add_route(ALL_OUTPUTS, "mono", 1.0);
} }
void crgolf_state::mastrglf(machine_config &config) void mastrglf_state::mastrglf(machine_config &config)
{ {
crgolfhi(config); crgolfhi(config);
/* basic machine hardware */ // basic machine hardware
m_maincpu->set_addrmap(AS_PROGRAM, &crgolf_state::mastrglf_map); m_maincpu->set_addrmap(AS_PROGRAM, &mastrglf_state::main_prg_map);
m_maincpu->set_addrmap(AS_IO, &crgolf_state::mastrglf_io); m_maincpu->set_addrmap(AS_IO, &mastrglf_state::main_io_map);
m_maincpu->set_vblank_int("screen", FUNC(crgolf_state::irq0_line_hold)); m_maincpu->set_vblank_int("screen", FUNC(mastrglf_state::irq0_line_hold));
m_audiocpu->set_addrmap(AS_PROGRAM, &crgolf_state::mastrglf_submap); m_audiocpu->set_addrmap(AS_PROGRAM, &mastrglf_state::sound_prg_map);
m_audiocpu->set_addrmap(AS_IO, &crgolf_state::mastrglf_subio); m_audiocpu->set_addrmap(AS_IO, &mastrglf_state::sound_io_map);
m_audiocpu->set_vblank_int("screen", FUNC(crgolf_state::irq0_line_hold)); m_audiocpu->set_vblank_int("screen", FUNC(mastrglf_state::irq0_line_hold));
PALETTE(config.replace(), m_palette, FUNC(crgolf_state::mastrglf_palette), 0x100); PALETTE(config.replace(), m_palette, FUNC(mastrglf_state::palette), 0x100);
} }
@ -588,7 +811,7 @@ ROM_START( crgolf ) // 834-5419-04
ROM_LOAD( "pr5877.1s", 0x0000, 0x0020, CRC(f880b95d) SHA1(5ad0ee39e2b9befaf3895ec635d5865b7b1e562b) ) ROM_LOAD( "pr5877.1s", 0x0000, 0x0020, CRC(f880b95d) SHA1(5ad0ee39e2b9befaf3895ec635d5865b7b1e562b) )
ROM_REGION( 0x0200, "plds", 0 ) // pal16l8 ROM_REGION( 0x0200, "plds", 0 ) // pal16l8
ROM_LOAD( "cg.3e.bin", 0x0000, 0x0104, CRC(beef5560) SHA1(cd7462dea015151cf29029e2275e10b949537cd2) ) /* PAL is read protected */ ROM_LOAD( "cg.3e.bin", 0x0000, 0x0104, CRC(beef5560) SHA1(cd7462dea015151cf29029e2275e10b949537cd2) ) // PAL is read protected
ROM_END ROM_END
ROM_START( crgolfa ) // 834-5419-03 ROM_START( crgolfa ) // 834-5419-03
@ -618,7 +841,7 @@ ROM_START( crgolfa ) // 834-5419-03
ROM_LOAD( "pr5877.1s", 0x0000, 0x0020, CRC(f880b95d) SHA1(5ad0ee39e2b9befaf3895ec635d5865b7b1e562b) ) ROM_LOAD( "pr5877.1s", 0x0000, 0x0020, CRC(f880b95d) SHA1(5ad0ee39e2b9befaf3895ec635d5865b7b1e562b) )
ROM_REGION( 0x0200, "plds", 0 ) // pal16l8 ROM_REGION( 0x0200, "plds", 0 ) // pal16l8
ROM_LOAD( "cg.3e.bin", 0x0000, 0x0104, CRC(beef5560) SHA1(cd7462dea015151cf29029e2275e10b949537cd2) ) /* PAL is read protected */ ROM_LOAD( "cg.3e.bin", 0x0000, 0x0104, CRC(beef5560) SHA1(cd7462dea015151cf29029e2275e10b949537cd2) ) // PAL is read protected
ROM_END ROM_END
@ -766,21 +989,7 @@ ROM_START( mastrglf )
ROM_LOAD( "tbp24s10n.2", 0x0200, 0x0100, NO_DUMP ) ROM_LOAD( "tbp24s10n.2", 0x0200, 0x0100, NO_DUMP )
ROM_END ROM_END
} // anonymous namespace
/*************************************
*
* Game-specific init
*
*************************************/
void crgolf_state::init_crgolfhi()
{
m_audiocpu->space(AS_PROGRAM).install_write_handler(0xa000, 0xa003, write8sm_delegate(*this, FUNC(crgolf_state::crgolfhi_sample_w)));
}
/************************************* /*************************************
@ -789,11 +998,11 @@ void crgolf_state::init_crgolfhi()
* *
*************************************/ *************************************/
GAME( 1984, crgolf, 0, crgolf, crgolf, crgolf_state, empty_init, ROT0, "Nasco Japan", "Crowns Golf (834-5419-04)", MACHINE_SUPPORTS_SAVE ) GAME( 1984, crgolf, 0, crgolf, crgolf, crgolf_state, empty_init, ROT0, "Nasco Japan", "Crowns Golf (834-5419-04)", MACHINE_SUPPORTS_SAVE )
GAME( 1984, crgolfa, crgolf, crgolf, crgolfa, crgolf_state, empty_init, ROT0, "Nasco Japan", "Crowns Golf (834-5419-03)", MACHINE_SUPPORTS_SAVE ) GAME( 1984, crgolfa, crgolf, crgolf, crgolfa, crgolf_state, empty_init, ROT0, "Nasco Japan", "Crowns Golf (834-5419-03)", MACHINE_SUPPORTS_SAVE )
GAME( 1984, crgolfb, crgolf, crgolf, crgolfb, crgolf_state, empty_init, ROT0, "Nasco Japan", "Crowns Golf (set 3)", MACHINE_SUPPORTS_SAVE ) GAME( 1984, crgolfb, crgolf, crgolf, crgolfb, crgolf_state, empty_init, ROT0, "Nasco Japan", "Crowns Golf (set 3)", MACHINE_SUPPORTS_SAVE )
GAME( 1984, crgolfc, crgolf, crgolf, crgolfb, crgolf_state, empty_init, ROT0, "Nasco Japan", "Champion Golf", MACHINE_SUPPORTS_SAVE ) GAME( 1984, crgolfc, crgolf, crgolf, crgolfb, crgolf_state, empty_init, ROT0, "Nasco Japan", "Champion Golf", MACHINE_SUPPORTS_SAVE )
GAME( 1984, crgolfbt, crgolf, crgolf, crgolfb, crgolf_state, empty_init, ROT0, "bootleg", "Champion Golf (bootleg)", MACHINE_SUPPORTS_SAVE ) GAME( 1984, crgolfbt, crgolf, crgolf, crgolfb, crgolf_state, empty_init, ROT0, "bootleg", "Champion Golf (bootleg)", MACHINE_SUPPORTS_SAVE )
GAME( 1985, crgolfhi, 0, crgolfhi, crgolfa, crgolf_state, init_crgolfhi, ROT0, "Nasco Japan", "Crowns Golf in Hawaii", MACHINE_SUPPORTS_SAVE ) GAME( 1985, crgolfhi, 0, crgolfhi, crgolfa, crgolfhi_state, empty_init, ROT0, "Nasco Japan", "Crowns Golf in Hawaii", MACHINE_SUPPORTS_SAVE )
GAME( 1985, mastrglf, 0, mastrglf, crgolf, crgolf_state, empty_init, ROT0, "Nasco", "Master's Golf", MACHINE_NOT_WORKING | MACHINE_UNEMULATED_PROTECTION ) GAME( 1985, mastrglf, 0, mastrglf, crgolf, mastrglf_state, empty_init, ROT0, "Nasco", "Master's Golf", MACHINE_NOT_WORKING | MACHINE_UNEMULATED_PROTECTION )

View File

@ -2206,7 +2206,44 @@ ROM_START( bloodstm )
ROM_LOAD16_BYTE( "bssrom2.bin", 0x300000, 0x40000, CRC(8aee1e77) SHA1(f949fa89ee7d59f457ce89c72d461cecd0cface3) ) ROM_LOAD16_BYTE( "bssrom2.bin", 0x300000, 0x40000, CRC(8aee1e77) SHA1(f949fa89ee7d59f457ce89c72d461cecd0cface3) )
ROM_END ROM_END
ROM_START( bloodstm22 ) ROM_START( bloodstm221 ) // this board had generic stickers
ROM_REGION16_BE( 0x80000, "user1", 0 )
ROM_LOAD16_BYTE( "bld00_v21.u83", 0x00000, 0x40000, CRC(01907aec) SHA1(a954366f2374c0836140e3b75a55ff47e4cfa645) )
ROM_LOAD16_BYTE( "bld01_v21.u88", 0x00001, 0x40000, CRC(eeae123e) SHA1(9fdd53d6651cac16402a9c3fe0ae15c9b1baa0db) )
ROM_REGION( 0x28000, "soundcpu", 0 )
ROM_LOAD( "bldsnd_v10.u17", 0x10000, 0x18000, CRC(dddeedbb) SHA1(f8ea786836630fc44bba968845fd2cb42cd81592) )
ROM_CONTINUE( 0x08000, 0x08000 )
ROM_REGION( 0x880000, "gfx1", 0 )
ROM_LOAD32_BYTE( "bsgrom0.bin", 0x000000, 0x080000, CRC(4e10b8c1) SHA1(b80f7dbf32faa97829c735da6dc0ee424dc9ecec) )
ROM_LOAD32_BYTE( "bsgrom5.bin", 0x000001, 0x080000, CRC(6333b6ce) SHA1(53b884e09d198f8f53449bd011ba743c28b2c934) )
ROM_LOAD32_BYTE( "bsgrom10.bin", 0x000002, 0x080000, CRC(a972a65c) SHA1(7772c2e0aaa0b3183c6287125b95fd1cd0c3775a) )
ROM_LOAD32_BYTE( "bsgrom15.bin", 0x000003, 0x080000, CRC(9a8f54aa) SHA1(3a2f99c28324ba1fcfb652bdc596d94c90637b72) )
ROM_LOAD32_BYTE( "bsgrom1.bin", 0x200000, 0x080000, CRC(10abf660) SHA1(e5b28ee12972abbcd883d702f496feae62d19e07) )
ROM_LOAD32_BYTE( "bsgrom6.bin", 0x200001, 0x080000, CRC(06a260d5) SHA1(f506b799bbb5d4465a4ab564cfd276877b8a52e9) )
ROM_LOAD32_BYTE( "bsgrom11.bin", 0x200002, 0x080000, CRC(f2cab3c7) SHA1(eecb1f2f8a3f3b1663a51c343e28e1b2078da5f4) )
ROM_LOAD32_BYTE( "bsgrom16.bin", 0x200003, 0x080000, CRC(403aef7b) SHA1(0a2a61480cddd020bfbad01c6c328dfa6760bddd) )
ROM_LOAD32_BYTE( "bsgrom2.bin", 0x400000, 0x080000, CRC(488200b1) SHA1(ae25bb5e9a836ae362d88de4e392ff46ff93c636) )
ROM_LOAD32_BYTE( "bsgrom7.bin", 0x400001, 0x080000, CRC(5bb19727) SHA1(fd8aa73ff0606ac86f054794f6abc42f99b4f856) )
ROM_LOAD32_BYTE( "bsgrom12.bin", 0x400002, 0x080000, CRC(b10d674f) SHA1(f5c713480deac44b86173ca9ac3aeea8a4d2ac85) )
ROM_LOAD32_BYTE( "bsgrom17.bin", 0x400003, 0x080000, CRC(7119df7e) SHA1(67acb0525f21d5cd174528fb0fa72c7101deb5eb) )
ROM_LOAD32_BYTE( "bsgrom3.bin", 0x600000, 0x080000, CRC(2378792e) SHA1(8cf1040a86ce7b6be3f56d144d4a17b7a888a648) )
ROM_LOAD32_BYTE( "bsgrom8.bin", 0x600001, 0x080000, CRC(3640ca2e) SHA1(1fbc8306c7310ab23d40887c16f80e2dc3d730f8) )
ROM_LOAD32_BYTE( "bsgrom13.bin", 0x600002, 0x080000, CRC(bd4a071d) SHA1(f25483591659d7424a4c62d0093fa56e5d337bf3) )
ROM_LOAD32_BYTE( "bsgrom18.bin", 0x600003, 0x080000, CRC(12959bb8) SHA1(f74d407004ccbf461f749672e4e57a5f0b6b549f) )
ROM_FILL( 0x800000, 0x080000, 0xff )
ROM_REGION16_BE( 0x400000, "ensoniq.0", ROMREGION_ERASE00 )
ROM_LOAD16_BYTE( "ensoniq.2m", 0x000000, 0x200000, CRC(9fdc4825) SHA1(71e5255c66d9010be7e6f27916b605441fc53839) )
ROM_REGION16_BE( 0x400000, "ensoniq.2", ROMREGION_ERASE00 )
ROM_LOAD16_BYTE( "bssrom0.bin", 0x000000, 0x80000, CRC(ee4570c8) SHA1(73dd292224bf182770b3cc2d90eb52b7d7b24378) )
ROM_LOAD16_BYTE( "bssrom1.bin", 0x100000, 0x80000, CRC(b0f32ec5) SHA1(666f904b31cdef12cbf1dbb43a7d3ff7c2903260) )
ROM_LOAD16_BYTE( "bssrom2.bin", 0x300000, 0x40000, CRC(8aee1e77) SHA1(f949fa89ee7d59f457ce89c72d461cecd0cface3) )
ROM_END
ROM_START( bloodstm220 )
ROM_REGION16_BE( 0x80000, "user1", 0 ) ROM_REGION16_BE( 0x80000, "user1", 0 )
ROM_LOAD16_BYTE( "bld00_v22.u83", 0x00000, 0x40000, CRC(904e9208) SHA1(12e96027724b905140250db969130d90b1afec83) ) /* Labeled BLD00 V2.2 (U83) */ ROM_LOAD16_BYTE( "bld00_v22.u83", 0x00000, 0x40000, CRC(904e9208) SHA1(12e96027724b905140250db969130d90b1afec83) ) /* Labeled BLD00 V2.2 (U83) */
ROM_LOAD16_BYTE( "bld01_v22.u88", 0x00001, 0x40000, CRC(78336a7b) SHA1(76002ce4a2d83ceae10d9c9c123013832a081150) ) /* Labeled BLD01 V2.2 (U88) */ ROM_LOAD16_BYTE( "bld01_v22.u88", 0x00001, 0x40000, CRC(78336a7b) SHA1(76002ce4a2d83ceae10d9c9c123013832a081150) ) /* Labeled BLD01 V2.2 (U88) */
@ -2243,7 +2280,7 @@ ROM_START( bloodstm22 )
ROM_LOAD16_BYTE( "bssrom2.bin", 0x300000, 0x40000, CRC(8aee1e77) SHA1(f949fa89ee7d59f457ce89c72d461cecd0cface3) ) ROM_LOAD16_BYTE( "bssrom2.bin", 0x300000, 0x40000, CRC(8aee1e77) SHA1(f949fa89ee7d59f457ce89c72d461cecd0cface3) )
ROM_END ROM_END
ROM_START( bloodstm21 ) ROM_START( bloodstm210 )
ROM_REGION16_BE( 0x80000, "user1", 0 ) ROM_REGION16_BE( 0x80000, "user1", 0 )
ROM_LOAD16_BYTE( "bld00_v21.u83", 0x00000, 0x40000, CRC(71215c8e) SHA1(ee0f94c3a2619d7e3cc1ba5e1888a97b0c75a3ae) ) /* Labeled BLD00 V2.1 (U83) */ ROM_LOAD16_BYTE( "bld00_v21.u83", 0x00000, 0x40000, CRC(71215c8e) SHA1(ee0f94c3a2619d7e3cc1ba5e1888a97b0c75a3ae) ) /* Labeled BLD00 V2.1 (U83) */
ROM_LOAD16_BYTE( "bld01_v21.u88", 0x00001, 0x40000, CRC(da403da6) SHA1(0f09f38ae932acb4ddbb6323bce58be7284cb24b) ) /* Labeled BLD01 V2.1 (U88) */ ROM_LOAD16_BYTE( "bld01_v21.u88", 0x00001, 0x40000, CRC(da403da6) SHA1(0f09f38ae932acb4ddbb6323bce58be7284cb24b) ) /* Labeled BLD01 V2.1 (U88) */
@ -2280,7 +2317,7 @@ ROM_START( bloodstm21 )
ROM_LOAD16_BYTE( "bssrom2.bin", 0x300000, 0x40000, CRC(8aee1e77) SHA1(f949fa89ee7d59f457ce89c72d461cecd0cface3) ) ROM_LOAD16_BYTE( "bssrom2.bin", 0x300000, 0x40000, CRC(8aee1e77) SHA1(f949fa89ee7d59f457ce89c72d461cecd0cface3) )
ROM_END ROM_END
ROM_START( bloodstm11 ) ROM_START( bloodstm110 )
ROM_REGION16_BE( 0x80000, "user1", 0 ) ROM_REGION16_BE( 0x80000, "user1", 0 )
ROM_LOAD16_BYTE( "bld00_v11.u83", 0x00000, 0x40000, CRC(4fff8f9b) SHA1(90f450497935322b0082a70e10abf758fc441dd0) ) /* Labeled BLD00 V1.1 (U83) */ ROM_LOAD16_BYTE( "bld00_v11.u83", 0x00000, 0x40000, CRC(4fff8f9b) SHA1(90f450497935322b0082a70e10abf758fc441dd0) ) /* Labeled BLD00 V1.1 (U83) */
ROM_LOAD16_BYTE( "bld01_v11.u88", 0x00001, 0x40000, CRC(59ce23ea) SHA1(6aa02fff07f5ec6dff4f6db9ea7878a722079f81) ) /* Labeled BLD01 V1.1 (U88) */ ROM_LOAD16_BYTE( "bld01_v11.u88", 0x00001, 0x40000, CRC(59ce23ea) SHA1(6aa02fff07f5ec6dff4f6db9ea7878a722079f81) ) /* Labeled BLD01 V1.1 (U88) */
@ -2317,7 +2354,7 @@ ROM_START( bloodstm11 )
ROM_LOAD16_BYTE( "bssrom2.bin", 0x300000, 0x40000, CRC(8aee1e77) SHA1(f949fa89ee7d59f457ce89c72d461cecd0cface3) ) ROM_LOAD16_BYTE( "bssrom2.bin", 0x300000, 0x40000, CRC(8aee1e77) SHA1(f949fa89ee7d59f457ce89c72d461cecd0cface3) )
ROM_END ROM_END
ROM_START( bloodstm10 ) ROM_START( bloodstm104 )
ROM_REGION16_BE( 0x80000, "user1", 0 ) ROM_REGION16_BE( 0x80000, "user1", 0 )
ROM_LOAD16_BYTE( "bld00_v10.u83", 0x00000, 0x40000, CRC(a0982119) SHA1(7a55f662db062488714b42aedea56eea3b80aed5) ) /* Labeled BLD00 V1.0 (U83) */ ROM_LOAD16_BYTE( "bld00_v10.u83", 0x00000, 0x40000, CRC(a0982119) SHA1(7a55f662db062488714b42aedea56eea3b80aed5) ) /* Labeled BLD00 V1.0 (U83) */
ROM_LOAD16_BYTE( "bld01_v10.u88", 0x00001, 0x40000, CRC(65800339) SHA1(379e57bd2c31180fa077b9a6e9fcffacde95280c) ) /* Labeled BLD01 V1.0 (U88) */ ROM_LOAD16_BYTE( "bld01_v10.u88", 0x00001, 0x40000, CRC(65800339) SHA1(379e57bd2c31180fa077b9a6e9fcffacde95280c) ) /* Labeled BLD01 V1.0 (U88) */
@ -5094,10 +5131,11 @@ GAME( 1993, hardyard11, hardyard, bloodstm, hardyard, itech32_state, init_har
GAME( 1993, hardyard10, hardyard, bloodstm, hardyard, itech32_state, init_hardyard, ROT0, "Strata/Incredible Technologies", "Hard Yardage (v1.00)", MACHINE_SUPPORTS_SAVE ) GAME( 1993, hardyard10, hardyard, bloodstm, hardyard, itech32_state, init_hardyard, ROT0, "Strata/Incredible Technologies", "Hard Yardage (v1.00)", MACHINE_SUPPORTS_SAVE )
GAME( 1994, bloodstm, 0, bloodstm, bloodstm, itech32_state, init_bloodstm, ROT0, "Strata/Incredible Technologies", "Blood Storm (v2.22)", MACHINE_SUPPORTS_SAVE ) GAME( 1994, bloodstm, 0, bloodstm, bloodstm, itech32_state, init_bloodstm, ROT0, "Strata/Incredible Technologies", "Blood Storm (v2.22)", MACHINE_SUPPORTS_SAVE )
GAME( 1994, bloodstm22, bloodstm, bloodstm, bloodstm, itech32_state, init_bloodstm, ROT0, "Strata/Incredible Technologies", "Blood Storm (v2.20)", MACHINE_SUPPORTS_SAVE ) GAME( 1994, bloodstm221, bloodstm, bloodstm, bloodstm, itech32_state, init_bloodstm, ROT0, "Strata/Incredible Technologies", "Blood Storm (v2.21)", MACHINE_SUPPORTS_SAVE )
GAME( 1994, bloodstm21, bloodstm, bloodstm, bloodstm, itech32_state, init_bloodstm, ROT0, "Strata/Incredible Technologies", "Blood Storm (v2.10)", MACHINE_SUPPORTS_SAVE ) GAME( 1994, bloodstm220, bloodstm, bloodstm, bloodstm, itech32_state, init_bloodstm, ROT0, "Strata/Incredible Technologies", "Blood Storm (v2.20)", MACHINE_SUPPORTS_SAVE )
GAME( 1994, bloodstm11, bloodstm, bloodstm, bloodstm, itech32_state, init_bloodstm, ROT0, "Strata/Incredible Technologies", "Blood Storm (v1.10)", MACHINE_SUPPORTS_SAVE ) GAME( 1994, bloodstm210, bloodstm, bloodstm, bloodstm, itech32_state, init_bloodstm, ROT0, "Strata/Incredible Technologies", "Blood Storm (v2.10)", MACHINE_SUPPORTS_SAVE )
GAME( 1994, bloodstm10, bloodstm, bloodstm, bloodstm, itech32_state, init_bloodstm, ROT0, "Strata/Incredible Technologies", "Blood Storm (v1.04)", MACHINE_SUPPORTS_SAVE ) GAME( 1994, bloodstm110, bloodstm, bloodstm, bloodstm, itech32_state, init_bloodstm, ROT0, "Strata/Incredible Technologies", "Blood Storm (v1.10)", MACHINE_SUPPORTS_SAVE )
GAME( 1994, bloodstm104, bloodstm, bloodstm, bloodstm, itech32_state, init_bloodstm, ROT0, "Strata/Incredible Technologies", "Blood Storm (v1.04)", MACHINE_SUPPORTS_SAVE )
GAME( 1994, pairs, 0, bloodstm, pairs, itech32_state, init_bloodstm, ROT0, "Strata/Incredible Technologies", "Pairs (V1.2, 09/30/94)", MACHINE_SUPPORTS_SAVE ) GAME( 1994, pairs, 0, bloodstm, pairs, itech32_state, init_bloodstm, ROT0, "Strata/Incredible Technologies", "Pairs (V1.2, 09/30/94)", MACHINE_SUPPORTS_SAVE )
GAME( 1994, pairsa, pairs, bloodstm, pairs, itech32_state, init_bloodstm, ROT0, "Strata/Incredible Technologies", "Pairs (V1, 09/07/94)", MACHINE_SUPPORTS_SAVE ) GAME( 1994, pairsa, pairs, bloodstm, pairs, itech32_state, init_bloodstm, ROT0, "Strata/Incredible Technologies", "Pairs (V1, 09/07/94)", MACHINE_SUPPORTS_SAVE )

View File

@ -1,87 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:David Haywood
/*************************************************************************
Angel Kids
*************************************************************************/
#ifndef MAME_INCLUDES_ANGELKDS_H
#define MAME_INCLUDES_ANGELKDS_H
#pragma once
#include "tilemap.h"
class angelkds_state : public driver_device
{
public:
angelkds_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_bgtopvideoram(*this, "bgtopvideoram"),
m_bgbotvideoram(*this, "bgbotvideoram"),
m_txvideoram(*this, "txvideoram"),
m_spriteram(*this, "spriteram"),
m_subcpu(*this, "sub"),
m_maincpu(*this, "maincpu"),
m_gfxdecode(*this, "gfxdecode"),
m_decrypted_opcodes(*this, "decrypted_opcodes")
{ }
void init_angelkds();
void angelkds(machine_config &config);
void spcpostn(machine_config &config);
private:
/* memory pointers */
required_shared_ptr<uint8_t> m_bgtopvideoram;
required_shared_ptr<uint8_t> m_bgbotvideoram;
required_shared_ptr<uint8_t> m_txvideoram;
required_shared_ptr<uint8_t> m_spriteram;
tilemap_t *m_tx_tilemap = nullptr;
tilemap_t *m_bgbot_tilemap = nullptr;
tilemap_t *m_bgtop_tilemap = nullptr;
int m_txbank = 0;
int m_bgbotbank = 0;
int m_bgtopbank = 0;
uint8_t m_sound[4]{};
uint8_t m_sound2[4]{};
uint8_t m_layer_ctrl = 0;
/* devices */
required_device<cpu_device> m_subcpu;
uint8_t angeklds_ff_r() { return 0xff; }
void angelkds_cpu_bank_write(uint8_t data);
void angelkds_main_sound_w(offs_t offset, uint8_t data);
uint8_t angelkds_main_sound_r(offs_t offset);
void angelkds_sub_sound_w(offs_t offset, uint8_t data);
uint8_t angelkds_sub_sound_r(offs_t offset);
void angelkds_txvideoram_w(offs_t offset, uint8_t data);
void angelkds_txbank_write(uint8_t data);
void angelkds_bgtopvideoram_w(offs_t offset, uint8_t data);
void angelkds_bgtopbank_write(uint8_t data);
void angelkds_bgtopscroll_write(uint8_t data);
void angelkds_bgbotvideoram_w(offs_t offset, uint8_t data);
void angelkds_bgbotbank_write(uint8_t data);
void angelkds_bgbotscroll_write(uint8_t data);
void angelkds_layer_ctrl_write(uint8_t data);
TILE_GET_INFO_MEMBER(get_tx_tile_info);
TILE_GET_INFO_MEMBER(get_bgtop_tile_info);
TILE_GET_INFO_MEMBER(get_bgbot_tile_info);
virtual void machine_start() override;
virtual void machine_reset() override;
virtual void video_start() override;
uint32_t screen_update_angelkds(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, int enable_n);
required_device<cpu_device> m_maincpu;
required_device<gfxdecode_device> m_gfxdecode;
optional_shared_ptr<uint8_t> m_decrypted_opcodes;
void decrypted_opcodes_map(address_map &map);
void main_map(address_map &map);
void main_portmap(address_map &map);
void sub_map(address_map &map);
void sub_portmap(address_map &map);
};
#endif // MAME_INCLUDES_ANGELKDS_H

View File

@ -1,95 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Aaron Giles
/*************************************************************************
Kitco Crowns Golf hardware
**************************************************************************/
#ifndef MAME_INCLUDES_CRGOLF_H
#define MAME_INCLUDES_CRGOLF_H
#pragma once
#include "sound/msm5205.h"
#include "machine/bankdev.h"
#include "emupal.h"
#define MASTER_CLOCK XTAL(18'432'000)
class crgolf_state : public driver_device
{
public:
crgolf_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_videoram_a(*this, "vrama"),
m_videoram_b(*this, "vramb"),
m_vrambank(*this, "vrambank"),
m_maincpu(*this, "maincpu"),
m_audiocpu(*this, "audiocpu"),
m_msm(*this, "msm"),
m_palette(*this, "palette")
{ }
void crgolfhi(machine_config &config);
void crgolf(machine_config &config);
void crgolf_video(machine_config &config);
void mastrglf(machine_config &config);
void init_crgolfhi();
private:
/* memory pointers */
required_shared_ptr<uint8_t> m_videoram_a;
required_shared_ptr<uint8_t> m_videoram_b;
bool m_color_select = false;
bool m_screen_flip = false;
bool m_screena_enable = false;
bool m_screenb_enable = false;
/* misc */
uint8_t m_port_select = 0U;
uint16_t m_sample_offset = 0U;
uint8_t m_sample_count = 0U;
/* devices */
required_device<address_map_bank_device> m_vrambank;
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
optional_device<msm5205_device> m_msm;
required_device<palette_device> m_palette;
void rom_bank_select_w(uint8_t data);
uint8_t switch_input_r();
uint8_t analog_input_r();
void switch_input_select_w(uint8_t data);
void unknown_w(uint8_t data);
DECLARE_WRITE_LINE_MEMBER(color_select_w);
DECLARE_WRITE_LINE_MEMBER(screen_flip_w);
DECLARE_WRITE_LINE_MEMBER(screen_select_w);
DECLARE_WRITE_LINE_MEMBER(screena_enable_w);
DECLARE_WRITE_LINE_MEMBER(screenb_enable_w);
void crgolfhi_sample_w(offs_t offset, uint8_t data);
uint8_t unk_sub_02_r();
uint8_t unk_sub_05_r();
uint8_t unk_sub_07_r();
void unk_sub_0c_w(uint8_t data);
virtual void machine_start() override;
virtual void machine_reset() override;
void crgolf_palette(palette_device &palette) const;
void mastrglf_palette(palette_device &palette) const;
uint32_t screen_update_crgolf(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void get_pens( pen_t *pens );
DECLARE_WRITE_LINE_MEMBER(vck_callback);
void main_map(address_map &map);
void mastrglf_io(address_map &map);
void mastrglf_map(address_map &map);
void mastrglf_subio(address_map &map);
void mastrglf_submap(address_map &map);
void sound_map(address_map &map);
void vrambank_map(address_map &map);
};
#endif // MAME_INCLUDES_CRGOLF_H

View File

@ -17540,10 +17540,11 @@ virtpool //
@source:itech32.cpp @source:itech32.cpp
bloodstm // (c) 1994 Strata/Incredible Technologies bloodstm // (c) 1994 Strata/Incredible Technologies
bloodstm10 // (c) 1994 Strata/Incredible Technologies bloodstm104 // (c) 1994 Strata/Incredible Technologies
bloodstm11 // (c) 1994 Strata/Incredible Technologies bloodstm110 // (c) 1994 Strata/Incredible Technologies
bloodstm21 // (c) 1994 Strata/Incredible Technologies bloodstm210 // (c) 1994 Strata/Incredible Technologies
bloodstm22 // (c) 1994 Strata/Incredible Technologies bloodstm220 // (c) 1994 Strata/Incredible Technologies
bloodstm221 // (c) 1994 Strata/Incredible Technologies
drivedge // (c) 1994 Strata/Incredible Technologies drivedge // (c) 1994 Strata/Incredible Technologies
gt2k // (c) 2000 Incredible Technologies gt2k // (c) 2000 Incredible Technologies
gt2kp100 // (c) 2000 Incredible Technologies gt2kp100 // (c) 2000 Incredible Technologies

View File

@ -1,265 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:David Haywood
/* video/angelkds.c - see drivers/angelkds.c for more info */
/* graphical issues
enable / disable tilemap bits might be wrong
*/
#include "emu.h"
#include "includes/angelkds.h"
#include "screen.h"
/*** Text Layer Tilemap
*/
TILE_GET_INFO_MEMBER(angelkds_state::get_tx_tile_info)
{
int tileno;
tileno = m_txvideoram[tile_index] + (m_txbank * 0x100);
tileinfo.set(0, tileno, 0, 0);
}
void angelkds_state::angelkds_txvideoram_w(offs_t offset, uint8_t data)
{
m_txvideoram[offset] = data;
m_tx_tilemap->mark_tile_dirty(offset);
}
void angelkds_state::angelkds_txbank_write(uint8_t data)
{
if (m_txbank != data)
{
m_txbank = data;
m_tx_tilemap->mark_all_dirty();
}
}
/*** Top Half Background Tilemap
*/
TILE_GET_INFO_MEMBER(angelkds_state::get_bgtop_tile_info)
{
int tileno;
tileno = m_bgtopvideoram[tile_index];
tileno += m_bgtopbank * 0x100 ;
tileinfo.set(1, tileno, 0, 0);
}
void angelkds_state::angelkds_bgtopvideoram_w(offs_t offset, uint8_t data)
{
m_bgtopvideoram[offset] = data;
m_bgtop_tilemap->mark_tile_dirty(offset);
}
void angelkds_state::angelkds_bgtopbank_write(uint8_t data)
{
if (m_bgtopbank != data)
{
m_bgtopbank = data;
m_bgtop_tilemap->mark_all_dirty();
}
}
void angelkds_state::angelkds_bgtopscroll_write(uint8_t data)
{
m_bgtop_tilemap->set_scrollx(0, data);
}
/*** Bottom Half Background Tilemap
*/
TILE_GET_INFO_MEMBER(angelkds_state::get_bgbot_tile_info)
{
int tileno;
tileno = m_bgbotvideoram[tile_index];
tileno += m_bgbotbank * 0x100 ;
tileinfo.set(2, tileno, 1, 0);
}
void angelkds_state::angelkds_bgbotvideoram_w(offs_t offset, uint8_t data)
{
m_bgbotvideoram[offset] = data;
m_bgbot_tilemap->mark_tile_dirty(offset);
}
void angelkds_state::angelkds_bgbotbank_write(uint8_t data)
{
if (m_bgbotbank != data)
{
m_bgbotbank = data;
m_bgbot_tilemap->mark_all_dirty();
}
}
void angelkds_state::angelkds_bgbotscroll_write(uint8_t data)
{
m_bgbot_tilemap->set_scrollx(0, data);
}
void angelkds_state::angelkds_layer_ctrl_write(uint8_t data)
{
m_layer_ctrl = data;
}
/*** Sprites
the sprites are similar to the tilemaps in the sense that there is
a split down the middle of the screen
*/
void angelkds_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, int enable_n)
{
const uint8_t *source = m_spriteram + 0x100 - 4;
const uint8_t *finish = m_spriteram;
gfx_element *gfx = m_gfxdecode->gfx(3);
while (source >= finish)
{
/*
nnnn nnnn - EeFf B?cc - yyyy yyyy - xxxx xxxx
n = sprite number
E = Sprite Enabled in Top Half of Screen
e = Sprite Enabled in Bottom Half of Screen
F = Flip Y
f = Flip X
B = Tile Bank
? = unknown, nothing / unused? recheck
c = color
y = Y position
x = X position
*/
uint16_t tile_no = source[0];
uint8_t attr = source[1];
uint8_t ypos = source[2];
uint8_t xpos = source[3];
uint8_t enable = attr & 0xc0;
uint8_t flipx = (attr & 0x10) >> 4;
uint8_t flipy = (attr & 0x20) >> 5;
uint8_t bank = attr & 0x08;
uint8_t color = attr & 0x03;
if (bank)
tile_no += 0x100;
ypos = 0xff - ypos;
if (enable & enable_n)
{
gfx->transpen(
bitmap,
cliprect,
tile_no,
color*4,
flipx,flipy,
xpos,ypos,15
);
/* wraparound */
if (xpos > 240)
gfx->transpen(
bitmap,
cliprect,
tile_no,
color*4,
flipx,flipy,
xpos-256,ypos,15
);
/* wraparound */
if (ypos > 240)
{
gfx->transpen(
bitmap,
cliprect,
tile_no,
color*4,
flipx,flipy,
xpos,ypos-256,15
);
/* wraparound */
if (xpos > 240)
gfx->transpen(
bitmap,
cliprect,
tile_no,
color*4,
flipx,flipy,
xpos-256,ypos-256,15
);
}
}
source -= 0x04;
}
}
/*** Video Start & Update
*/
void angelkds_state::video_start()
{
m_tx_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(angelkds_state::get_tx_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
m_tx_tilemap->set_transparent_pen(0);
m_bgbot_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(angelkds_state::get_bgbot_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
m_bgbot_tilemap->set_transparent_pen(15);
m_bgtop_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(angelkds_state::get_bgtop_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
m_bgtop_tilemap->set_transparent_pen(15);
}
/* enable bits are uncertain */
uint32_t angelkds_state::screen_update_angelkds(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
const rectangle &visarea = screen.visible_area();
rectangle clip;
bitmap.fill(0x3f, cliprect); /* is there a register controlling the colour?, we currently use the last colour of the tx palette */
/* draw top of screen */
clip.set(8*0, 8*16-1, visarea.min_y, visarea.max_y);
if ((m_layer_ctrl & 0x80) == 0x00)
m_bgtop_tilemap->draw(screen, bitmap, clip, 0, 0);
draw_sprites(bitmap, clip, 0x80);
if ((m_layer_ctrl & 0x20) == 0x00)
m_tx_tilemap->draw(screen, bitmap, clip, 0, 0);
/* draw bottom of screen */
clip.set(8*16, 8*32-1, visarea.min_y, visarea.max_y);
if ((m_layer_ctrl & 0x40) == 0x00)
m_bgbot_tilemap->draw(screen, bitmap, clip, 0, 0);
draw_sprites(bitmap, clip, 0x40);
if ((m_layer_ctrl & 0x20) == 0x00)
m_tx_tilemap->draw(screen, bitmap, clip, 0, 0);
return 0;
}

View File

@ -1,131 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Aaron Giles
/***************************************************************************
Kitco Crowns Golf hardware
***************************************************************************/
#include "emu.h"
#include "includes/crgolf.h"
#define NUM_PENS (0x20)
#define VIDEORAM_SIZE (0x2000 * 3)
/*************************************
*
* Video startup
*
*************************************/
void crgolf_state::crgolf_palette(palette_device &palette) const
{
uint8_t const *const prom = memregion("proms")->base();
for (offs_t offs = 0; offs < NUM_PENS; offs++)
{
int bit0, bit1, bit2;
uint8_t const data = prom[offs];
// red component
bit0 = BIT(data, 0);
bit1 = BIT(data, 1);
bit2 = BIT(data, 2);
int const r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
// green component
bit0 = BIT(data, 3);
bit1 = BIT(data, 4);
bit2 = BIT(data, 5);
int const g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
// blue component
bit0 = BIT(data, 6);
bit1 = BIT(data, 7);
int const b = 0x4f * bit0 + 0xa8 * bit1;
m_palette->set_pen_color(offs, r, g, b);
}
}
void crgolf_state::mastrglf_palette(palette_device &palette) const
{
}
/*************************************
*
* Video update
*
*************************************/
uint32_t crgolf_state::screen_update_crgolf(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
int flip = m_screen_flip;
/* for each byte in the video RAM */
for (offs_t offs = 0; offs < VIDEORAM_SIZE / 3; offs++)
{
uint8_t y = (offs & 0x1fe0) >> 5;
uint8_t x = (offs & 0x001f) << 3;
uint8_t data_a0 = m_videoram_a[0x2000 | offs];
uint8_t data_a1 = m_videoram_a[0x0000 | offs];
uint8_t data_a2 = m_videoram_a[0x4000 | offs];
uint8_t data_b0 = m_videoram_b[0x2000 | offs];
uint8_t data_b1 = m_videoram_b[0x0000 | offs];
uint8_t data_b2 = m_videoram_b[0x4000 | offs];
if (flip)
{
y = ~y;
x = ~x;
}
/* for each pixel in the byte */
for (int i = 0; i < 8; i++)
{
offs_t color;
uint8_t data_b = 0;
uint8_t data_a = 0;
if (!m_screena_enable)
data_a = ((data_a0 & 0x80) >> 7) | ((data_a1 & 0x80) >> 6) | ((data_a2 & 0x80) >> 5);
if (!m_screenb_enable)
data_b = ((data_b0 & 0x80) >> 7) | ((data_b1 & 0x80) >> 6) | ((data_b2 & 0x80) >> 5);
/* screen A has priority over B */
if (data_a)
color = data_a;
else
color = data_b | 0x08;
/* add HI bit if enabled */
if (m_color_select)
color = color | 0x10;
bitmap.pix(y, x) = color;
/* next pixel */
data_a0 = data_a0 << 1;
data_a1 = data_a1 << 1;
data_a2 = data_a2 << 1;
data_b0 = data_b0 << 1;
data_b1 = data_b1 << 1;
data_b2 = data_b2 << 1;
if (flip)
x = x - 1;
else
x = x + 1;
}
}
return 0;
}