seibu/t5182.cpp: Remove hardcoded tags, Cleanups: (#12425)

seibu/darkmist.cpp: Cleanups
seibu/metlfrzr.cpp: Cleanups
seibu/mustache.cpp: Cleanups
seibu/panicr.cpp: Cleanups
This commit is contained in:
cam900 2024-06-03 21:59:21 +09:00 committed by GitHub
parent ccc847f50a
commit 02078b1f19
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 307 additions and 289 deletions

View File

@ -63,6 +63,8 @@ public:
m_spr_clut(*this, "spr_clut"),
m_tx_clut(*this, "tx_clut"),
m_decrypted_opcodes(*this, "decrypted_opcodes"),
m_bg_map(*this, "bg_map"),
m_fg_map(*this, "fg_map"),
m_rombank(*this, "rombank")
{ }
@ -75,28 +77,6 @@ protected:
virtual void video_start() override;
private:
required_device<cpu_device> m_maincpu;
required_device<t5182_device> m_t5182;
required_device<screen_device> m_screen;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
required_shared_ptr<uint8_t> m_spritebank;
required_shared_ptr<uint8_t> m_scroll;
required_shared_ptr<uint8_t> m_videoram;
required_shared_ptr<uint8_t> m_spriteram;
required_region_ptr<uint8_t> m_bg_clut;
required_region_ptr<uint8_t> m_fg_clut;
required_region_ptr<uint8_t> m_spr_clut;
required_region_ptr<uint8_t> m_tx_clut;
required_shared_ptr<uint8_t> m_decrypted_opcodes;
required_memory_bank m_rombank;
uint8_t m_hw = 0;
tilemap_t *m_bgtilemap = nullptr;
tilemap_t *m_fgtilemap = nullptr;
tilemap_t *m_txtilemap = nullptr;
void hw_w(uint8_t data);
void tx_vram_w(offs_t offset, uint8_t data);
@ -117,13 +97,37 @@ private:
TIMER_DEVICE_CALLBACK_MEMBER(scanline);
void decrypted_opcodes_map(address_map &map);
void memmap(address_map &map);
required_device<cpu_device> m_maincpu;
required_device<t5182_device> m_t5182;
required_device<screen_device> m_screen;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
required_shared_ptr<uint8_t> m_spritebank;
required_shared_ptr<uint8_t> m_scroll;
required_shared_ptr<uint8_t> m_videoram;
required_shared_ptr<uint8_t> m_spriteram;
required_region_ptr<uint8_t> m_bg_clut;
required_region_ptr<uint8_t> m_fg_clut;
required_region_ptr<uint8_t> m_spr_clut;
required_region_ptr<uint8_t> m_tx_clut;
required_shared_ptr<uint8_t> m_decrypted_opcodes;
required_region_ptr<uint8_t> m_bg_map;
required_region_ptr<uint8_t> m_fg_map;
required_memory_bank m_rombank;
uint8_t m_hw = 0;
tilemap_t *m_bgtilemap = nullptr;
tilemap_t *m_fgtilemap = nullptr;
tilemap_t *m_txtilemap = nullptr;
};
TILE_GET_INFO_MEMBER(darkmist_state::get_bgtile_info)
{
int code = memregion("bg_map")->base()[tile_index * 2]; // TTTTTTTT
int const attr = memregion("bg_map")->base()[(tile_index * 2) + 1]; // -PPP--TT - FIXED BITS (0xxx00xx)
int code = m_bg_map[tile_index * 2]; // TTTTTTTT
int const attr = m_bg_map[(tile_index * 2) + 1]; // -PPP--TT - FIXED BITS (0xxx00xx)
code += (attr & 3) << 8;
int const pal = (attr >> 4) & 0xf;
@ -133,8 +137,8 @@ TILE_GET_INFO_MEMBER(darkmist_state::get_bgtile_info)
TILE_GET_INFO_MEMBER(darkmist_state::get_fgtile_info)
{
int code = memregion("fg_map")->base()[tile_index * 2]; // TTTTTTTT
int const attr = memregion("fg_map")->base()[(tile_index * 2) + 1]; // -PPP--TT - FIXED BITS (0xxx00xx)
int code = m_fg_map[tile_index * 2]; // TTTTTTTT
int const attr = m_fg_map[(tile_index * 2) + 1]; // -PPP--TT - FIXED BITS (0xxx00xx)
code += (attr & 3) << 8;
int const pal = (attr >> 4) & 0xf;
@ -202,7 +206,7 @@ void darkmist_state::mix_layer(screen_device &screen, bitmap_ind16 &bitmap, cons
uint16_t const pix = (src[x] & 0xff);
uint16_t const real = clut[pix];
if (!(real & 0x40))
if (BIT(~real, 6))
dest[x] = src[x];
}
}
@ -224,17 +228,17 @@ void darkmist_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprec
// fetch from top to bottom
for (int i = m_spriteram.bytes() - 32; i >= 0; i -= 32)
{
int const fy = m_spriteram[i + 1] & 0x40;
int const fx = m_spriteram[i + 1] & 0x80;
bool const fy = BIT(m_spriteram[i + 1], 6);
bool const fx = BIT(m_spriteram[i + 1], 7);
int tile = m_spriteram[i + 0];
if (m_spriteram[i + 1] & 0x20)
if (BIT(m_spriteram[i + 1], 5))
tile += (*m_spritebank << 8);
int palette = ((m_spriteram[i + 1]) >> 1) & 0xf;
if (m_spriteram[i + 1] & 0x1)
if (BIT(m_spriteram[i + 1], 0))
palette = machine().rand() & 15;
m_gfxdecode->gfx(3)->transpen(
@ -255,7 +259,7 @@ uint32_t darkmist_state::screen_update(screen_device &screen, bitmap_ind16 &bitm
constexpr int DISPLAY_BG = 4;
constexpr int DISPLAY_TXT = 16;
#define DM_GETSCROLL(n) (((m_scroll[(n)] << 1) & 0xff) + ((m_scroll[(n)] & 0x80) ? 1 : 0) +( ((m_scroll[(n) - 1] << 4) | (m_scroll[(n) - 1] << 12)) & 0xff00))
#define DM_GETSCROLL(n) (((m_scroll[(n)] << 1) & 0xff) + ((m_scroll[(n)] & 0x80) ? 1 : 0) + ( ((m_scroll[(n) - 1] << 4) | (m_scroll[(n) - 1] << 12)) & 0xff00))
m_bgtilemap->set_scrollx(0, DM_GETSCROLL(0x2));
m_bgtilemap->set_scrolly(0, DM_GETSCROLL(0x6));
@ -464,7 +468,6 @@ static const gfx_layout charlayout =
RGN_FRAC(1,2),
4,
{ 0, 4, RGN_FRAC(1,2)+0, RGN_FRAC(1,2)+4 },
{ 0, 1, 2, 3, 8+0, 8+1, 8+2, 8+3 },
{ 0*16, 1*16, 2*16, 3*16, 4*16, 5*16, 6*16, 7*16 },
16*8
@ -476,8 +479,6 @@ static const gfx_layout tilelayout =
RGN_FRAC(1,2),
4,
{ 0, 4, RGN_FRAC(1,2)+0, RGN_FRAC(1,2)+4 },
{ 0, 1, 2, 3, 8+0, 8+1, 8+2, 8+3,
16+0, 16+1, 16+2, 16+3, 24+0, 24+1, 24+2, 24+3 },
{ 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32,
@ -487,9 +488,9 @@ static const gfx_layout tilelayout =
static GFXDECODE_START( gfx_darkmist )
GFXDECODE_ENTRY( "tx_gfx", 0, charlayout, 0x300, 16 )
GFXDECODE_ENTRY( "bg_gfx", 0, tilelayout, 0x000, 16 )
GFXDECODE_ENTRY( "fg_gfx", 0, tilelayout, 0x100, 16 )
GFXDECODE_ENTRY( "tx_gfx", 0, charlayout, 0x300, 16 )
GFXDECODE_ENTRY( "bg_gfx", 0, tilelayout, 0x000, 16 )
GFXDECODE_ENTRY( "fg_gfx", 0, tilelayout, 0x100, 16 )
GFXDECODE_ENTRY( "spr_gfx", 0, tilelayout, 0x200, 16 )
GFXDECODE_END
@ -505,7 +506,6 @@ TIMER_DEVICE_CALLBACK_MEMBER(darkmist_state::scanline)
}
void darkmist_state::darkmist(machine_config &config)
{
// basic machine hardware
@ -514,7 +514,9 @@ void darkmist_state::darkmist(machine_config &config)
m_maincpu->set_addrmap(AS_OPCODES, &darkmist_state::decrypted_opcodes_map);
TIMER(config, "scantimer").configure_scanline(FUNC(darkmist_state::scanline), "screen", 0, 1);
T5182(config, m_t5182, 0);
T5182(config, m_t5182, 14'318'180 / 4);
m_t5182->ym_read_callback().set("ymsnd", FUNC(ym2151_device::read));
m_t5182->ym_write_callback().set("ymsnd", FUNC(ym2151_device::write));
// video hardware
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
@ -545,7 +547,7 @@ ROM_START( darkmist )
ROM_LOAD( "dm_16.rom", 0x10000, 0x08000, CRC(094579d9) SHA1(2449bc9ba38396912ee9b72dd870ea9fcff95776) )
ROM_REGION( 0x8000, "t5182_z80", 0 ) // Toshiba T5182 external ROM
ROM_REGION( 0x8000, "t5182:external", 0 ) // Toshiba T5182 external ROM
ROM_LOAD( "dm_17.rom", 0x0000, 0x8000, CRC(7723dcae) SHA1(a0c69e7a7b6fd74f7ed6b9c6419aed94aabcd4b0) )
ROM_REGION( 0x4000, "tx_gfx", 0 )
@ -664,7 +666,7 @@ void darkmist_state::decrypt_gfx()
void darkmist_state::decrypt_snd()
{
uint8_t *rom = memregion("t5182_z80")->base();
uint8_t *rom = memregion("t5182:external")->base();
for (int i = 0x0000; i < 0x8000; i++)
rom[i] = bitswap<8>(rom[i], 7, 1, 2, 3, 4, 5, 6, 0);

View File

@ -43,7 +43,8 @@ public:
m_vram(*this, "vram"),
m_video_regs(*this, "vregs"),
m_palette(*this, "palette"),
m_gfxdecode(*this, "gfxdecode")
m_gfxdecode(*this, "gfxdecode"),
m_mainbank(*this, "mainbank")
{ }
void metlfrzr(machine_config &config);
@ -60,6 +61,11 @@ private:
void legacy_obj_draw(bitmap_ind16 &bitmap, const rectangle &cliprect);
uint32_t screen_update_metlfrzr(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void output_w(uint8_t data);
TIMER_DEVICE_CALLBACK_MEMBER(scanline);
void decrypted_opcodes_map(address_map &map);
void metlfrzr_map(address_map &map);
required_device<cpu_device> m_maincpu;
required_shared_ptr<uint8_t> m_decrypted_opcodes;
required_shared_ptr<uint8_t> m_work_ram;
@ -68,12 +74,10 @@ private:
required_device<palette_device> m_palette;
required_device<gfxdecode_device> m_gfxdecode;
void output_w(uint8_t data);
TIMER_DEVICE_CALLBACK_MEMBER(scanline);
required_memory_bank m_mainbank;
uint8_t m_fg_tilebank = 0;
bool m_rowscroll_enable = false;
void decrypted_opcodes_map(address_map &map);
void metlfrzr_map(address_map &map);
};
@ -102,34 +106,29 @@ void metlfrzr_state::legacy_bg_draw(bitmap_ind16 &bitmap,const rectangle &clipre
{
gfx_element *gfx = m_gfxdecode->gfx(m_fg_tilebank);
const uint16_t vram_mask = (m_vram.length() - 1) >> 1;
int count;
int x_scroll_base;
int x_scroll_shift;
uint16_t x_scroll_value;
x_scroll_value = m_video_regs[0x17] + ((m_video_regs[0x06] & 1) << 8);
x_scroll_base = (x_scroll_value >> 3) * 32;
uint16_t x_scroll_value = m_video_regs[0x17] + ((m_video_regs[0x06] & 1) << 8);
int x_scroll_base = (x_scroll_value >> 3) * 32;
for (count=0;count<32*33;count++)
for (int count = 0; count< 32 * 33; count++)
{
int tile_base = count;
int y = (count % 32);
if(y > 7 || m_rowscroll_enable == false)
int y = (count & 0x1f);
int x_scroll_shift;
if (y > 7 || m_rowscroll_enable == false)
{
tile_base+= x_scroll_base;
tile_base += x_scroll_base;
x_scroll_shift = (x_scroll_value & 7);
}
else
x_scroll_shift = 0;
tile_base &= vram_mask;
int x = (count / 32);
int x = (count >> 5);
const uint16_t tile = m_vram[tile_base * 2 + 0] + ((m_vram[tile_base * 2 + 1] & 0xf0) << 4);
const uint8_t color = m_vram[tile_base * 2 + 1] & 0xf;
uint16_t tile = m_vram[tile_base*2+0] + ((m_vram[tile_base*2+1] & 0xf0) << 4);
uint8_t color = m_vram[tile_base*2+1] & 0xf;
gfx->transpen(bitmap,cliprect,tile,color,0,0,x*8-x_scroll_shift,y*8,0xf);
gfx->transpen(bitmap, cliprect, tile, color, 0, 0, x * 8 - x_scroll_shift, y * 8, 0xf);
}
}
/*
@ -149,21 +148,20 @@ void metlfrzr_state::legacy_obj_draw(bitmap_ind16 &bitmap,const rectangle &clipr
{
gfx_element *gfx_2 = m_gfxdecode->gfx(2);
gfx_element *gfx_3 = m_gfxdecode->gfx(3);
int count;
uint8_t *base_spriteram = m_work_ram + 0xe00;
uint8_t const *const base_spriteram = m_work_ram + 0xe00;
for(count=0x200-4;count>-1;count-=4)
for (int count = 0x200 - 4; count > -1; count -= 4)
{
gfx_element *cur_gfx = base_spriteram[count+1] & 0x40 ? gfx_3 : gfx_2;
uint8_t tile_bank = (base_spriteram[count+1] & 0x30) >> 4;
uint16_t tile = base_spriteram[count] | (tile_bank << 8);
uint8_t color = base_spriteram[count+1] & 0xf;
int y = base_spriteram[count+2];
int x = base_spriteram[count+3];
if(base_spriteram[count+1] & 0x80)
x-=256;
gfx_element *cur_gfx = base_spriteram[count + 1] & 0x40 ? gfx_3 : gfx_2;
const uint8_t tile_bank = (base_spriteram[count + 1] & 0x30) >> 4;
const uint16_t tile = base_spriteram[count] | (tile_bank << 8);
const uint8_t color = base_spriteram[count + 1] & 0xf;
int y = base_spriteram[count + 2];
int x = base_spriteram[count + 3];
if (BIT(base_spriteram[count + 1], 7))
x -= 256;
cur_gfx->transpen(bitmap,cliprect,tile,color,0,0,x,y,0xf);
cur_gfx->transpen(bitmap, cliprect, tile, color, 0, 0, x, y, 0xf);
}
}
@ -171,8 +169,8 @@ uint32_t metlfrzr_state::screen_update_metlfrzr(screen_device &screen, bitmap_in
{
bitmap.fill(m_palette->black_pen(), cliprect);
legacy_bg_draw(bitmap,cliprect);
legacy_obj_draw(bitmap,cliprect);
legacy_bg_draw(bitmap, cliprect);
legacy_obj_draw(bitmap, cliprect);
return 0;
}
@ -185,11 +183,11 @@ void metlfrzr_state::output_w(uint8_t data)
// bit 1: enabled during gameplay, rowscroll enable?
// bit 0: enabled , unknown purpose (lamp?)
// TODO: bits 1-0 might actually be sprite DMA enable mask/request
machine().bookkeeping().coin_lockout_w(1, BIT(data,6) );
machine().bookkeeping().coin_lockout_w(0, BIT(data,5) );
machine().bookkeeping().coin_lockout_w(1, BIT(data, 6));
machine().bookkeeping().coin_lockout_w(0, BIT(data, 5));
m_fg_tilebank = (data & 0x10) >> 4;
membank("bank1")->set_entry((data & 0xc) >> 2);
m_rowscroll_enable = bool(BIT(data,1));
m_mainbank->set_entry((data & 0xc) >> 2);
m_rowscroll_enable = bool(BIT(data, 1));
// popmessage("%02x %02x",m_fg_tilebank,data & 3);
}
@ -197,7 +195,7 @@ void metlfrzr_state::output_w(uint8_t data)
void metlfrzr_state::metlfrzr_map(address_map &map)
{
map(0x0000, 0x7fff).rom();
map(0x8000, 0xbfff).bankr("bank1");
map(0x8000, 0xbfff).bankr(m_mainbank);
map(0xc000, 0xcfff).ram().share(m_vram);
map(0xd000, 0xd1ff).ram().w(m_palette, FUNC(palette_device::write_indirect)).share("palette");
map(0xd200, 0xd3ff).ram().w(m_palette, FUNC(palette_device::write_indirect_ext)).share("palette_ext");
@ -209,7 +207,7 @@ void metlfrzr_state::metlfrzr_map(address_map &map)
map(0xd602, 0xd602).portr("START");
map(0xd603, 0xd603).portr("DSW1");
map(0xd604, 0xd604).portr("DSW2");
map(0xd600, 0xd61f).writeonly().share("vregs");
map(0xd600, 0xd61f).writeonly().share(m_video_regs);
map(0xd700, 0xd700).w(FUNC(metlfrzr_state::output_w));
map(0xd710, 0xd710).w("t5182", FUNC(t5182_device::sound_irq_w));
@ -220,14 +218,14 @@ void metlfrzr_state::metlfrzr_map(address_map &map)
map(0xd800, 0xdfff).ram();
map(0xe000, 0xefff).ram();
map(0xf000, 0xffff).ram().share("wram");
map(0xf000, 0xffff).ram().share(m_work_ram);
}
void metlfrzr_state::decrypted_opcodes_map(address_map &map)
{
map(0x0000, 0x7fff).rom().share("decrypted_opcodes");
map(0x8000, 0xbfff).bankr("bank1");
map(0xf000, 0xffff).ram().share("wram"); // executes code at 0xf5d5
map(0x0000, 0x7fff).rom().share(m_decrypted_opcodes);
map(0x8000, 0xbfff).bankr(m_mainbank);
map(0xf000, 0xffff).ram().share(m_work_ram); // executes code at 0xf5d5
}
@ -326,13 +324,12 @@ INPUT_PORTS_END
void metlfrzr_state::machine_start()
{
membank("bank1")->configure_entries(0, 4, memregion("maincpu")->base() + 0x10000, 0x4000);
m_mainbank->configure_entries(0, 4, memregion("maincpu")->base() + 0x10000, 0x4000);
}
void metlfrzr_state::machine_reset()
{
membank("bank1")->set_entry(0);
m_mainbank->set_entry(0);
}
@ -360,39 +357,41 @@ static const gfx_layout sprite_layout =
static GFXDECODE_START(gfx_metlfrzr)
GFXDECODE_ENTRY("gfx1", 0, tile_layout, 0x100, 16)
GFXDECODE_ENTRY("gfx2", 0, tile_layout, 0x100, 16)
GFXDECODE_ENTRY("gfx3", 0, sprite_layout, 0, 16)
GFXDECODE_ENTRY("gfx4", 0, sprite_layout, 0, 16)
GFXDECODE_ENTRY("tiles1", 0, tile_layout, 0x100, 16)
GFXDECODE_ENTRY("tiles2", 0, tile_layout, 0x100, 16)
GFXDECODE_ENTRY("sprites1", 0, sprite_layout, 0, 16)
GFXDECODE_ENTRY("sprites2", 0, sprite_layout, 0, 16)
GFXDECODE_END
TIMER_DEVICE_CALLBACK_MEMBER(metlfrzr_state::scanline)
{
int scanline = param;
if(scanline == 240) // vblank-out irq
m_maincpu->set_input_line_and_vector(0, HOLD_LINE,0xd7); /* Z80 - RST 10h */
if (scanline == 240) // vblank-out irq
m_maincpu->set_input_line_and_vector(0, HOLD_LINE, 0xd7); // Z80 - RST 10h
// TODO: check this irq.
if(scanline == 0) // vblank-in irq
m_maincpu->set_input_line_and_vector(0, HOLD_LINE,0xcf); /* Z80 - RST 08h */
if (scanline == 0) // vblank-in irq
m_maincpu->set_input_line_and_vector(0, HOLD_LINE, 0xcf); // Z80 - RST 08h
}
void metlfrzr_state::metlfrzr(machine_config &config)
{
/* basic machine hardware */
// basic machine hardware
Z80(config, m_maincpu, XTAL(12'000'000) / 2);
m_maincpu->set_addrmap(AS_PROGRAM, &metlfrzr_state::metlfrzr_map);
m_maincpu->set_addrmap(AS_OPCODES, &metlfrzr_state::decrypted_opcodes_map);
TIMER(config, "scantimer").configure_scanline(FUNC(metlfrzr_state::scanline), "screen", 0, 1);
T5182(config, "t5182", 0);
t5182_device &t5182(T5182(config, "t5182", XTAL(14'318'181)/4));
t5182.ym_read_callback().set("ymsnd", FUNC(ym2151_device::read));
t5182.ym_write_callback().set("ymsnd", FUNC(ym2151_device::write));
PALETTE(config, m_palette).set_format(palette_device::xBGR_444, 0x200).set_indirect_entries(256 * 2);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_metlfrzr);
/* video hardware */
// video hardware
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_refresh_hz(60);
screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
@ -401,10 +400,10 @@ void metlfrzr_state::metlfrzr(machine_config &config)
screen.set_screen_update(FUNC(metlfrzr_state::screen_update_metlfrzr));
screen.set_palette(m_palette);
/* sound hardware */
// sound hardware
SPEAKER(config, "mono").front_center();
ym2151_device &ymsnd(YM2151(config, "ymsnd", XTAL(14'318'181) / 4)); /* 3.579545 MHz */
ym2151_device &ymsnd(YM2151(config, "ymsnd", XTAL(14'318'181) / 4)); // 3.579545 MHz
ymsnd.irq_handler().set("t5182", FUNC(t5182_device::ym2151_irq_handler));
ymsnd.add_route(0, "mono", 0.5);
ymsnd.add_route(1, "mono", 0.5);
@ -417,22 +416,22 @@ ROM_START(metlfrzr)
ROM_LOAD("1.15j", 0x00000, 0x08000, CRC(f59b5fa2) SHA1(6033967dad5e64f45afbcb1b45c8eb79e0787afb))
ROM_LOAD("2.14j", 0x10000, 0x10000, CRC(21ecc248) SHA1(2fccf7db73890faf7c489bfc43c88ded54d5052d))
ROM_REGION(0x8000, "t5182_z80", 0) /* Toshiba T5182 external data ROM */
ROM_REGION(0x8000, "t5182:external", 0) // Toshiba T5182 external data ROM
ROM_LOAD("3.4h", 0x0000, 0x8000, CRC(36f88e54) SHA1(5cbea56c7e547c353ae2f9256caaceb20e5e8503))
ROM_REGION(0x20000, "gfx1", 0)
ROM_REGION(0x20000, "tiles1", 0)
ROM_LOAD16_BYTE("10.5a", 0x00001, 0x10000, CRC(3313e74a) SHA1(8622dfb5c013173d5bb037254f4c23b1282404e1))
ROM_LOAD16_BYTE("12.7a", 0x00000, 0x10000, CRC(6da5fda9) SHA1(9d7b0b26598f31da589fece3535a4d1405b03fc2))
ROM_REGION(0x20000, "gfx2", 0)
ROM_REGION(0x20000, "tiles2", 0)
ROM_LOAD16_BYTE("11.6a", 0x00001, 0x10000, CRC(fa6490b8) SHA1(9a4c1e09b9e8fb256fec0a5ed120fece8a12e1c8))
ROM_LOAD16_BYTE("13.9a", 0x00000, 0x10000, CRC(a4f689ec) SHA1(e58bfede3fabf4cfca76c20aafb3e9fb604777c9))
ROM_REGION(0x20000, "gfx3", 0)
ROM_REGION(0x20000, "sprites1", 0)
ROM_LOAD16_BYTE("14.13a", 0x00001, 0x10000, CRC(a9cd5225) SHA1(f3d5e29ee08fb563fdc1af3c64128f2cd2feb987))
ROM_LOAD16_BYTE("16.11a", 0x00000, 0x10000, CRC(92f2cb49) SHA1(498021d94b0fde216207076491702af2324a2dcc))
ROM_REGION(0x20000, "gfx4", 0)
ROM_REGION(0x20000, "sprites2", 0)
ROM_LOAD16_BYTE("15.12a", 0x00001, 0x10000, CRC(ce5c4c8b) SHA1(2351d66ba51e80097ce53bfd448ac24901844cda))
ROM_LOAD16_BYTE("17.10a", 0x00000, 0x10000, CRC(3fec33f7) SHA1(af086ba30fc4521a0114da2824f5baa04d225a89))
@ -449,32 +448,32 @@ ROM_END
void metlfrzr_state::init_metlfrzr()
{
// same as cshooter.cpp
// same as seibu/airraid.cpp
uint8_t *rom = memregion("maincpu")->base();
for (int A = 0x0000;A < 0x8000;A++)
for (int A = 0x0000; A < 0x8000; A++)
{
/* decode the opcodes */
// decode the opcodes
m_decrypted_opcodes[A] = rom[A];
if (BIT(A,5) && !BIT(A,3))
if (BIT(A, 5) && !BIT(A, 3))
m_decrypted_opcodes[A] ^= 0x40;
if (BIT(A,10) && !BIT(A,9) && BIT(A,3))
if (BIT(A, 10) && !BIT(A, 9) && BIT(A, 3))
m_decrypted_opcodes[A] ^= 0x20;
if ((BIT(A,10) ^ BIT(A,9)) && BIT(A,1))
if ((BIT(A, 10) ^ BIT(A, 9)) && BIT(A, 1))
m_decrypted_opcodes[A] ^= 0x02;
if (BIT(A,9) || !BIT(A,5) || BIT(A,3))
m_decrypted_opcodes[A] = bitswap<8>(m_decrypted_opcodes[A],7,6,1,4,3,2,5,0);
if (BIT(A, 9) || !BIT(A, 5) || BIT(A, 3))
m_decrypted_opcodes[A] = bitswap<8>(m_decrypted_opcodes[A], 7, 6, 1, 4, 3, 2, 5, 0);
/* decode the data */
if (BIT(A,5))
// decode the data
if (BIT(A, 5))
rom[A] ^= 0x40;
if (BIT(A,9) || !BIT(A,5))
rom[A] = bitswap<8>(rom[A],7,6,1,4,3,2,5,0);
if (BIT(A, 9) || !BIT(A, 5))
rom[A] = bitswap<8>(rom[A], 7, 6, 1, 4, 3, 2, 5, 0);
}
}

View File

@ -150,13 +150,13 @@ void mustache_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprec
gfx_element *gfx = m_gfxdecode->gfx(1);
const rectangle &visarea = m_screen->visible_area();
for (int offs = 0;offs < m_spriteram.bytes();offs += 4)
for (int offs = 0; offs < m_spriteram.bytes(); offs += 4)
{
int sy = 240 - m_spriteram[offs];
int sx = 240 - m_spriteram[offs + 3];
int code = m_spriteram[offs + 2];
int const attr = m_spriteram[offs + 1];
int const color = (attr & 0xe0)>>5;
int const color = (attr & 0xe0) >> 5;
if (sy == 240) continue;
@ -324,7 +324,9 @@ void mustache_state::mustache(machine_config &config)
SEI80BU(config, "sei80bu", 0).set_device_rom_tag("maincpu");
T5182(config, "t5182", 0);
t5182_device &t5182(T5182(config, "t5182", 14.318181_MHz_XTAL / 4));
t5182.ym_read_callback().set("ymsnd", FUNC(ym2151_device::read));
t5182.ym_write_callback().set("ymsnd", FUNC(ym2151_device::write));
// video hardware
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
@ -349,25 +351,25 @@ void mustache_state::mustache(machine_config &config)
}
ROM_START( mustache )
ROM_REGION( 0x20000, "maincpu", 0 )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "mustache.h18", 0x0000, 0x8000, CRC(123bd9b8) SHA1(33a7cba5c3a54b0b1a15dd1e24d298b6f7274321) )
ROM_LOAD( "mustache.h16", 0x8000, 0x4000, CRC(62552beb) SHA1(ee10991d7de0596608fa1db48805781cbfbbdb9f) )
ROM_REGION( 0x8000, "t5182_z80", 0 ) // Toshiba T5182 external ROM
ROM_REGION( 0x8000, "t5182:external", 0 ) // Toshiba T5182 external ROM
ROM_LOAD( "mustache.e5", 0x0000, 0x8000, CRC(efbb1943) SHA1(3320e9eaeb776d09ed63f7dedc79e720674e6718) )
ROM_REGION( 0x0c000, "tiles",0)
ROM_REGION( 0x0c000, "tiles", 0 )
ROM_LOAD( "mustache.a13", 0x0000, 0x4000, CRC(9baee4a7) SHA1(31bcec838789462e67e54ebe7256db9fc4e51b69) )
ROM_LOAD( "mustache.a14", 0x4000, 0x4000, CRC(8155387d) SHA1(5f0a394c7671442519a831b0eeeaba4eecd5a406) )
ROM_LOAD( "mustache.a16", 0x8000, 0x4000, CRC(4db4448d) SHA1(50a94fd65c263d95fd24b4009dbb87707929fdcb) )
ROM_REGION( 0x20000, "sprites",0 )
ROM_REGION( 0x20000, "sprites", 0 )
ROM_LOAD( "mustache.a4", 0x00000, 0x8000, CRC(d5c3bbbf) SHA1(914e3feea54246476701f492c31bd094ad9cea10) )
ROM_LOAD( "mustache.a7", 0x08000, 0x8000, CRC(e2a6012d) SHA1(4e4cd1a186870c8a88924d5bff917c6889da953d) )
ROM_LOAD( "mustache.a5", 0x10000, 0x8000, CRC(c975fb06) SHA1(4d166bd79e19c7cae422673de3e095ad8101e013) )
ROM_LOAD( "mustache.a8", 0x18000, 0x8000, CRC(2e180ee4) SHA1(a5684a25c337aeb4effeda7982164d35bc190af9) )
ROM_REGION( 0x1300, "proms",0 )
ROM_REGION( 0x1300, "proms", 0 )
ROM_LOAD( "mustache.c3",0x0000, 0x0100, CRC(68575300) SHA1(bc93a38df91ad8c2f335f9bccc98b52376f9b483) )
ROM_LOAD( "mustache.c2",0x0100, 0x0100, CRC(eb008d62) SHA1(a370fbd1affaa489210ea36eb9e365263fb4e232) )
ROM_LOAD( "mustache.c1",0x0200, 0x0100, CRC(65da3604) SHA1(e4874d4152a57944d4e47306250833ea5cd0d89b) )
@ -376,25 +378,25 @@ ROM_START( mustache )
ROM_END
ROM_START( mustachei )
ROM_REGION( 0x20000, "maincpu", 0 )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "1.h18", 0x0000, 0x8000, CRC(22893fbc) SHA1(724ea50642aec9be10547bd86fae5e1ebfe54685) )
ROM_LOAD( "2.h16", 0x8000, 0x4000, CRC(ec70cfd3) SHA1(0476eab03b907778ea488c802b79da99bf376eb6) )
ROM_REGION( 0x8000, "t5182_z80", 0 ) // Toshiba T5182 external ROM
ROM_REGION( 0x8000, "t5182:external", 0 ) // Toshiba T5182 external ROM
ROM_LOAD( "10.e5", 0x0000, 0x8000, CRC(efbb1943) SHA1(3320e9eaeb776d09ed63f7dedc79e720674e6718) )
ROM_REGION( 0x0c000, "tiles",0)
ROM_REGION( 0x0c000, "tiles", 0 )
ROM_LOAD( "5.a13", 0x0000, 0x4000, CRC(9baee4a7) SHA1(31bcec838789462e67e54ebe7256db9fc4e51b69) )
ROM_LOAD( "4.a15", 0x4000, 0x4000, CRC(8155387d) SHA1(5f0a394c7671442519a831b0eeeaba4eecd5a406) )
ROM_LOAD( "3.a16", 0x8000, 0x4000, CRC(4db4448d) SHA1(50a94fd65c263d95fd24b4009dbb87707929fdcb) )
ROM_REGION( 0x20000, "sprites",0 )
ROM_REGION( 0x20000, "sprites", 0 )
ROM_LOAD( "6.a4", 0x00000, 0x8000, CRC(4a95a89c) SHA1(b34ebbda9b0e591876988e42bd36fd505452f38c) )
ROM_LOAD( "8.a7", 0x08000, 0x8000, CRC(3e6be0fb) SHA1(319ea59107e37953c31f59f5f635fc520682b09f) )
ROM_LOAD( "7.a5", 0x10000, 0x8000, CRC(8ad38884) SHA1(e11f1e1db6d5d119afedbe6604d10a6fd6049f12) )
ROM_LOAD( "9.a8", 0x18000, 0x8000, CRC(3568c158) SHA1(c3a2120086befe396a112bd62f032638011cb47a) )
ROM_REGION( 0x1300, "proms",0 )
ROM_REGION( 0x1300, "proms", 0 )
ROM_LOAD( "d.c3",0x0000, 0x0100, CRC(68575300) SHA1(bc93a38df91ad8c2f335f9bccc98b52376f9b483) )
ROM_LOAD( "c.c2",0x0100, 0x0100, CRC(eb008d62) SHA1(a370fbd1affaa489210ea36eb9e365263fb4e232) )
ROM_LOAD( "b.c1",0x0200, 0x0100, CRC(65da3604) SHA1(e4874d4152a57944d4e47306250833ea5cd0d89b) )

View File

@ -16,7 +16,7 @@ SEI-8611M (M6100219A)
OSC : 14.31818MHz,12.0000MHz,16.0000MHz
CPU : V20 (Sony CXQ70116D-8) @ 8.000MHz [16/2]
Toshiba T5182 @ 3.579545 (14.31818/4]
Toshiba T5182 @ 3.579545 [14.31818/4]
Sound: YM2151 @ 3.579545 [14.31818/4]
VSync 60Hz
HSync 15.32kHz
@ -87,7 +87,9 @@ public:
m_mainram(*this, "mainram"),
m_spriteram(*this, "spriteram"),
m_textram(*this, "textram"),
m_spritebank(*this, "spritebank")
m_spritebank(*this, "spritebank"),
m_tilerom(*this, "tilerom"),
m_attrrom(*this, "attrrom")
{ }
void panicr(machine_config &config);
@ -95,26 +97,7 @@ public:
void init_panicr();
private:
required_device<cpu_device> m_maincpu;
required_device<t5182_device> m_t5182;
required_device<gfxdecode_device> m_gfxdecode;
required_device<screen_device> m_screen;
required_device<palette_device> m_palette;
required_shared_ptr<uint8_t> m_mainram;
required_shared_ptr<uint8_t> m_spriteram;
required_shared_ptr<uint8_t> m_textram;
required_shared_ptr<uint8_t> m_spritebank;
tilemap_t *m_bgtilemap = nullptr;
tilemap_t *m_infotilemap_2 = nullptr;
tilemap_t *m_txttilemap = nullptr;
int m_scrollx = 0;
std::unique_ptr<bitmap_ind16> m_temprender;
std::unique_ptr<bitmap_ind16> m_tempbitmap_1;
rectangle m_tempbitmap_clip;
void textram_w(offs_t offset, uint8_t data);
uint8_t collision_r(offs_t offset);
void scrollx_lo_w(uint8_t data);
void scrollx_hi_w(uint8_t data);
@ -134,12 +117,34 @@ private:
TIMER_DEVICE_CALLBACK_MEMBER(scanline);
void panicr_map(address_map &map);
required_device<cpu_device> m_maincpu;
required_device<t5182_device> m_t5182;
required_device<gfxdecode_device> m_gfxdecode;
required_device<screen_device> m_screen;
required_device<palette_device> m_palette;
required_shared_ptr<uint8_t> m_mainram;
required_shared_ptr<uint8_t> m_spriteram;
required_shared_ptr<uint8_t> m_textram;
required_shared_ptr<uint8_t> m_spritebank;
required_region_ptr<uint8_t> m_tilerom;
required_region_ptr<uint8_t> m_attrrom;
tilemap_t *m_bgtilemap = nullptr;
tilemap_t *m_infotilemap_2 = nullptr;
tilemap_t *m_txttilemap = nullptr;
int m_scrollx = 0;
std::unique_ptr<bitmap_ind16> m_temprender;
std::unique_ptr<bitmap_ind16> m_tempbitmap_1;
rectangle m_tempbitmap_clip;
};
#define MASTER_CLOCK XTAL(16'000'000)
#define SOUND_CLOCK XTAL(14'318'181)
#define TC15_CLOCK XTAL(12'000'000)
//#define TC15_CLOCK XTAL(12'000'000)
/***************************************************************************
@ -193,11 +198,9 @@ void panicr_state::panicr_palette(palette_device &palette) const
TILE_GET_INFO_MEMBER(panicr_state::get_bgtile_info)
{
int code,attr;
code=memregion("user1")->base()[tile_index];
attr=memregion("user2")->base()[tile_index];
code+=((attr&7)<<8);
int code = m_tilerom[tile_index];
int const attr = m_attrrom[tile_index];
code += ((attr & 7) << 8);
tileinfo.set(1,
code,
(attr & 0xf0) >> 4,
@ -205,14 +208,11 @@ TILE_GET_INFO_MEMBER(panicr_state::get_bgtile_info)
}
TILE_GET_INFO_MEMBER(panicr_state::get_infotile_info_2)
{
int code,attr;
code=memregion("user1")->base()[tile_index];
attr=memregion("user2")->base()[tile_index];
code+=((attr&7)<<8);
int code = m_tilerom[tile_index];
int const attr = m_attrrom[tile_index];
code += ((attr & 7) << 8);
tileinfo.set(3,
code,
0,
@ -220,13 +220,11 @@ TILE_GET_INFO_MEMBER(panicr_state::get_infotile_info_2)
}
TILE_GET_INFO_MEMBER(panicr_state::get_txttile_info)
{
int code=m_textram[tile_index*4];
int attr=m_textram[tile_index*4+2];
int color = attr & 0x07;
int const code = m_textram[tile_index * 4];
int const attr = m_textram[tile_index * 4 + 2];
int const color = attr & 0x07;
tileinfo.group = color;
@ -250,36 +248,32 @@ void panicr_state::video_start()
void panicr_state::draw_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect )
{
int offs,flipx,flipy,x,y,color,sprite;
// ssss ssss | Fx-- cccc | yyyy yyyy | xxxx xxxx
for (offs = m_spriteram.bytes() - 16; offs>=0; offs-=16)
for (int offs = m_spriteram.bytes() - 16; offs >= 0; offs -= 16)
{
flipx = 0;
flipy = m_spriteram[offs+1] & 0x80;
y = m_spriteram[offs+2];
x = m_spriteram[offs+3];
if (m_spriteram[offs+1] & 0x40) x -= 0x100;
bool const flipx = false;
bool const flipy = BIT(m_spriteram[offs + 1], 7);
int const y = m_spriteram[offs + 2];
int x = m_spriteram[offs + 3];
if (BIT(m_spriteram[offs + 1], 6)) x -= 0x100;
if (m_spriteram[offs+1] & 0x20)
if (BIT(m_spriteram[offs + 1], 5))
{
// often set
}
if (m_spriteram[offs+1] & 0x10)
if (BIT(m_spriteram[offs + 1], 4))
{
popmessage("(spriteram[offs+1] & 0x10) %02x\n", (m_spriteram[offs+1] & 0x10));
popmessage("(BIT(spriteram[offs + 1], 4)) %02x\n", BIT(m_spriteram[offs + 1], 4));
}
color = m_spriteram[offs+1] & 0x0f;
sprite = m_spriteram[offs+0] | (*m_spritebank << 8);
uint32_t const color = m_spriteram[offs + 1] & 0x0f;
uint32_t const sprite = m_spriteram[offs + 0] | (*m_spritebank << 8);
m_gfxdecode->gfx(2)->transmask(bitmap,cliprect,
sprite,
color,flipx,flipy,x,y,
color, flipx, flipy, x, y,
m_palette->transpen_mask(*m_gfxdecode->gfx(2), color, 0));
}
}
@ -292,45 +286,36 @@ uint32_t panicr_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap
// m_infotilemap_2->set_scrollx(0, m_scrollx);
// m_infotilemap_2->draw(screen, *m_temprender, m_tempbitmap_clip, 0,0);
bitmap.fill(m_palette->black_pen(), cliprect);
m_txttilemap->mark_all_dirty();
for (int y=0;y<256;y++)
for (int y = cliprect.min_y; y <= cliprect.max_y; y++)
{
uint16_t const *const srcline = &m_temprender->pix(y);
uint16_t *const dstline = &bitmap.pix(y);
for (int x=0;x<256;x++)
for (int x = cliprect.min_x; x <= cliprect.max_x; x++)
{
uint16_t const dat = srcline[x];
dstline[x] = ((dat & 0x00f) | ((dat & 0x1e0)>>0)) + 0x200;
}
}
draw_sprites(bitmap,cliprect);
for (int y=0;y<256;y++)
for (int y = cliprect.min_y; y <= cliprect.max_y; y++)
{
uint16_t const *const srcline = &m_temprender->pix(y);
uint16_t *const dstline = &bitmap.pix(y);
for (int x=0;x<256;x++)
for (int x = cliprect.min_x; x <= cliprect.max_x; x++)
{
uint16_t const dat = srcline[x];
if (dat & 0x10)
dstline[x] = ((dat & 0x00f) | ((dat & 0x1e0)>>0)) + 0x200;
}
}
m_txttilemap->draw(screen, bitmap, cliprect, 0,0);
return 0;
@ -343,6 +328,14 @@ uint32_t panicr_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap
***************************************************************************/
void panicr_state::textram_w(offs_t offset, uint8_t data)
{
m_textram[offset] = data;
if (BIT(~offset, 0))
m_txttilemap->mark_tile_dirty(offset >> 2);
}
uint8_t panicr_state::collision_r(offs_t offset)
{
// re-render the collision data here
@ -357,32 +350,26 @@ uint8_t panicr_state::collision_r(offs_t offset)
m_infotilemap_2->set_scrollx(0, m_scrollx & 0xffff);
m_infotilemap_2->draw(*m_screen, *m_tempbitmap_1, m_tempbitmap_clip, 0,0);
int actual_column = offset&0x3f;
int actual_line = offset >> 6;
int actual_column = offset & 0x3f;
int const actual_line = offset >> 6;
actual_column = actual_column * 4;
actual_column -= m_scrollx;
actual_column &= 0xff;
uint8_t ret = 0;
uint16_t const *const srcline = &m_tempbitmap_1->pix(actual_line);
ret |= (srcline[(actual_column + 0) & 0xff] & 3) << 6;
ret |= (srcline[(actual_column + 1) & 0xff] & 3) << 4;
ret |= (srcline[(actual_column + 2) & 0xff] & 3) << 2;
ret |= (srcline[(actual_column + 3) & 0xff] & 3) << 0;
ret |= (srcline[(actual_column+0)&0xff]&3) << 6;
ret |= (srcline[(actual_column+1)&0xff]&3) << 4;
ret |= (srcline[(actual_column+2)&0xff]&3) << 2;
ret |= (srcline[(actual_column+3)&0xff]&3) << 0;
logerror("%06x: (scroll x upper bits is %04x (full %04x)) read %d %d\n", m_maincpu->pc(), (m_scrollx&0xff00)>>8, m_scrollx, actual_line, actual_column);
if (!machine().side_effects_disabled())
logerror("%06x: (scroll x upper bits is %04x (full %04x)) read %d %d\n", m_maincpu->pc(), (m_scrollx&0xff00)>>8, m_scrollx, actual_line, actual_column);
return ret;
}
@ -401,8 +388,8 @@ void panicr_state::scrollx_hi_w(uint8_t data)
void panicr_state::output_w(uint8_t data)
{
// d6, d7: play counter? (it only triggers on 1st coin)
machine().bookkeeping().coin_counter_w(0, (data & 0x40) ? 1 : 0);
machine().bookkeeping().coin_counter_w(1, (data & 0x80) ? 1 : 0);
machine().bookkeeping().coin_counter_w(0, BIT(data, 6));
machine().bookkeeping().coin_counter_w(1, BIT(data, 7));
logerror("output_w %02x\n", data);
@ -426,11 +413,11 @@ void panicr_state::t5182shared_w(offs_t offset, uint8_t data)
void panicr_state::panicr_map(address_map &map)
{
map(0x00000, 0x01fff).ram().share("mainram");
map(0x02000, 0x03cff).ram().share("spriteram"); // how big is sprite ram, some places definitely have sprites at 3000+
map(0x00000, 0x01fff).ram().share(m_mainram);
map(0x02000, 0x03cff).ram().share(m_spriteram); // how big is sprite ram, some places definitely have sprites at 3000+
map(0x03d00, 0x03fff).ram();
map(0x08000, 0x0bfff).r(FUNC(panicr_state::collision_r));
map(0x0c000, 0x0cfff).ram().share("textram");
map(0x0c000, 0x0cfff).ram().w(FUNC(panicr_state::textram_w)).share(m_textram);
map(0x0d000, 0x0d000).w(m_t5182, FUNC(t5182_device::sound_irq_w));
map(0x0d002, 0x0d002).w(m_t5182, FUNC(t5182_device::sharedram_semaphore_main_acquire_w));
map(0x0d004, 0x0d004).r(m_t5182, FUNC(t5182_device::sharedram_semaphore_snd_r));
@ -444,7 +431,7 @@ void panicr_state::panicr_map(address_map &map)
map(0x0d802, 0x0d802).w(FUNC(panicr_state::scrollx_hi_w));
map(0x0d804, 0x0d804).w(FUNC(panicr_state::scrollx_lo_w));
map(0x0d80a, 0x0d80a).w(FUNC(panicr_state::output_w));
map(0x0d80c, 0x0d80c).writeonly().share("spritebank");
map(0x0d80c, 0x0d80c).writeonly().share(m_spritebank);
map(0x0d818, 0x0d818).nopw(); // watchdog?
map(0xf0000, 0xfffff).rom();
}
@ -586,10 +573,10 @@ static const gfx_layout spritelayout =
};
static GFXDECODE_START( gfx_panicr )
GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0x000, 8 )
GFXDECODE_ENTRY( "gfx2", 0, bgtilelayout, 0x200, 32 )
GFXDECODE_ENTRY( "gfx3", 0, spritelayout, 0x100, 16 )
GFXDECODE_ENTRY( "gfx2", 0, infotilelayout_2, 0x100, 16 ) // palette is just to make it viewable with F4
GFXDECODE_ENTRY( "chars", 0, charlayout, 0x000, 8 )
GFXDECODE_ENTRY( "tiles", 0, bgtilelayout, 0x200, 32 )
GFXDECODE_ENTRY( "sprites", 0, spritelayout, 0x100, 16 )
GFXDECODE_ENTRY( "tiles", 0, infotilelayout_2, 0x100, 16 ) // palette is just to make it viewable with F4
GFXDECODE_END
@ -607,11 +594,16 @@ TIMER_DEVICE_CALLBACK_MEMBER(panicr_state::scanline)
void panicr_state::panicr(machine_config &config)
{
V20(config, m_maincpu, MASTER_CLOCK/2); /* Sony 8623h9 CXQ70116D-8 (V20 compatible) */
constexpr XTAL MASTER_CLOCK = XTAL(16'000'000);
constexpr XTAL SOUND_CLOCK = XTAL(14'318'181);
V20(config, m_maincpu, MASTER_CLOCK/2); // Sony 8623h9 CXQ70116D-8 (V20 compatible)
m_maincpu->set_addrmap(AS_PROGRAM, &panicr_state::panicr_map);
TIMER(config, "scantimer").configure_scanline(FUNC(panicr_state::scanline), "screen", 0, 1);
T5182(config, m_t5182, 0);
T5182(config, m_t5182, SOUND_CLOCK/4);
m_t5182->ym_read_callback().set("ymsnd", FUNC(ym2151_device::read));
m_t5182->ym_write_callback().set("ymsnd", FUNC(ym2151_device::write));
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_refresh_hz(60);
@ -625,10 +617,10 @@ void panicr_state::panicr(machine_config &config)
GFXDECODE(config, m_gfxdecode, m_palette, gfx_panicr);
PALETTE(config, m_palette, FUNC(panicr_state::panicr_palette), 256 * 4, 256);
/* sound hardware */
// sound hardware
SPEAKER(config, "mono").front_center();
ym2151_device &ymsnd(YM2151(config, "ymsnd", SOUND_CLOCK/4)); /* 3.579545 MHz */
ym2151_device &ymsnd(YM2151(config, "ymsnd", SOUND_CLOCK/4)); // 3.579545 MHz
ymsnd.irq_handler().set(m_t5182, FUNC(t5182_device::ym2151_irq_handler));
ymsnd.add_route(0, "mono", 1.0);
ymsnd.add_route(1, "mono", 1.0);
@ -636,30 +628,30 @@ void panicr_state::panicr(machine_config &config)
ROM_START( panicr )
ROM_REGION( 0x200000, "maincpu", 0 ) /* v20 main cpu */
ROM_REGION( 0x100000, "maincpu", 0 ) // v20 main cpu
ROM_LOAD16_BYTE("2.19m", 0x0f0000, 0x08000, CRC(3d48b0b5) SHA1(a6e8b38971a8964af463c16f32bb7dbd301dd314) )
ROM_LOAD16_BYTE("1.19n", 0x0f0001, 0x08000, CRC(674131b9) SHA1(63499cd5ad39e79e70f3ba7060680f0aa133f095) )
ROM_REGION( 0x8000, "t5182_z80", 0 ) /* Toshiba T5182 external ROM */
ROM_REGION( 0x8000, "t5182:external", 0 ) // Toshiba T5182 external ROM
ROM_LOAD( "22d.bin", 0x0000, 0x8000, CRC(eb1a46e1) SHA1(278859ae4bca9f421247e646d789fa1206dcd8fc) )
ROM_REGION( 0x04000, "gfx1", 0 )
ROM_REGION( 0x04000, "chars", 0 )
ROM_LOAD( "13f.bin", 0x000000, 0x2000, CRC(4e6b3c04) SHA1(f388969d5d822df0eaa4d8300cbf9cee47468360) )
ROM_LOAD( "15f.bin", 0x002000, 0x2000, CRC(d735b572) SHA1(edcdb6daec97ac01a73c5010727b1694f512be71) )
ROM_REGION( 0x80000, "gfx2", 0 )
ROM_REGION( 0x80000, "tiles", 0 )
ROM_LOAD( "2a.bin", 0x000000, 0x20000, CRC(3ac0e5b4) SHA1(96b8bdf02002ec8ce87fd47fd21f7797a79d79c9) )
ROM_LOAD( "2b.bin", 0x020000, 0x20000, CRC(567d327b) SHA1(762b18ef1627d71074ba02b0eb270bd9a01ac0d8) )
ROM_LOAD( "2c.bin", 0x040000, 0x20000, CRC(cd77ec79) SHA1(94b61b7d77c016ae274eddbb1e66e755f312e11d) )
ROM_LOAD( "2d.bin", 0x060000, 0x20000, CRC(218d2c3e) SHA1(9503b3b67e71dc63448aed7815845b844e240afe) )
ROM_REGION( 0x40000, "gfx3", 0 )
ROM_REGION( 0x40000, "sprites", 0 )
ROM_LOAD( "2j.bin", 0x000000, 0x20000, CRC(80f05923) SHA1(5c886446fd77d3c39cb4fa43ea4beb8c89d20636) )
ROM_LOAD( "2k.bin", 0x020000, 0x20000, CRC(35f07bca) SHA1(54e6f82c2e6e1373c3ac1c6138ef738e5a0be6d0) )
ROM_REGION( 0x04000, "user1", 0 )
ROM_REGION( 0x04000, "tilerom", 0 )
ROM_LOAD( "5d.bin", 0x00000, 0x4000, CRC(f3466906) SHA1(42b512ba93ba7ac958402d1871c5ae015def3501) ) //tilemaps
ROM_REGION( 0x04000, "user2", 0 )
ROM_REGION( 0x04000, "attrrom", 0 )
ROM_LOAD( "7d.bin", 0x00000, 0x4000, CRC(8032c1e9) SHA1(fcc8579c0117ebe9271cff31e14a30f61a9cf031) ) //attribute maps
ROM_REGION( 0x0800, "proms", 0 )
@ -673,31 +665,31 @@ ROM_START( panicr )
ROM_LOAD( "10l.bpr", 0x00700, 0x100, CRC(f3f29695) SHA1(2607e96564a5e6e9a542377a01f399ea86a36c48) ) // unknown
ROM_END
ROM_START( panicrg ) /* Distributed by TV-Tuning Videospiele GMBH */
ROM_REGION( 0x200000, "maincpu", 0 ) /* v20 main cpu */
ROM_START( panicrg ) // Distributed by TV-Tuning Videospiele GMBH
ROM_REGION( 0x100000, "maincpu", 0 ) // v20 main cpu
ROM_LOAD16_BYTE("2g.19m", 0x0f0000, 0x08000, CRC(cf759403) SHA1(1a0911c943ecc752e46873c9a5da981745f7562d) )
ROM_LOAD16_BYTE("1g.19n", 0x0f0001, 0x08000, CRC(06877f9b) SHA1(8b92209d6422ff2b1f3cb66bd39a3ff84e399eec) )
ROM_REGION( 0x10000, "t5182_z80", 0 ) /* Toshiba T5182 external ROM */
ROM_REGION( 0x10000, "t5182:external", 0 ) // Toshiba T5182 external ROM
ROM_LOAD( "22d.bin", 0x0000, 0x8000, CRC(eb1a46e1) SHA1(278859ae4bca9f421247e646d789fa1206dcd8fc) )
ROM_REGION( 0x04000, "gfx1", 0 )
ROM_REGION( 0x04000, "chars", 0 )
ROM_LOAD( "13f.bin", 0x000000, 0x2000, CRC(4e6b3c04) SHA1(f388969d5d822df0eaa4d8300cbf9cee47468360) )
ROM_LOAD( "15f.bin", 0x002000, 0x2000, CRC(d735b572) SHA1(edcdb6daec97ac01a73c5010727b1694f512be71) )
ROM_REGION( 0x80000, "gfx2", 0 )
ROM_REGION( 0x80000, "tiles", 0 )
ROM_LOAD( "2a.bin", 0x000000, 0x20000, CRC(3ac0e5b4) SHA1(96b8bdf02002ec8ce87fd47fd21f7797a79d79c9) )
ROM_LOAD( "2b.bin", 0x020000, 0x20000, CRC(567d327b) SHA1(762b18ef1627d71074ba02b0eb270bd9a01ac0d8) )
ROM_LOAD( "2c.bin", 0x040000, 0x20000, CRC(cd77ec79) SHA1(94b61b7d77c016ae274eddbb1e66e755f312e11d) )
ROM_LOAD( "2d.bin", 0x060000, 0x20000, CRC(218d2c3e) SHA1(9503b3b67e71dc63448aed7815845b844e240afe) )
ROM_REGION( 0x40000, "gfx3", 0 )
ROM_REGION( 0x40000, "sprites", 0 )
ROM_LOAD( "2j.bin", 0x000000, 0x20000, CRC(80f05923) SHA1(5c886446fd77d3c39cb4fa43ea4beb8c89d20636) )
ROM_LOAD( "2k.bin", 0x020000, 0x20000, CRC(35f07bca) SHA1(54e6f82c2e6e1373c3ac1c6138ef738e5a0be6d0) )
ROM_REGION( 0x04000, "user1", 0 )
ROM_REGION( 0x04000, "tilerom", 0 )
ROM_LOAD( "5d.bin", 0x00000, 0x4000, CRC(f3466906) SHA1(42b512ba93ba7ac958402d1871c5ae015def3501) ) //tilemaps
ROM_REGION( 0x04000, "user2", 0 )
ROM_REGION( 0x04000, "attrrom", 0 )
ROM_LOAD( "7d.bin", 0x00000, 0x4000, CRC(8032c1e9) SHA1(fcc8579c0117ebe9271cff31e14a30f61a9cf031) ) //attribute maps
ROM_REGION( 0x0800, "proms", 0 )
@ -716,8 +708,8 @@ void panicr_state::init_panicr()
{
std::vector<uint8_t> buf(0x80000);
uint8_t *rom = memregion("gfx1")->base();
int size = memregion("gfx1")->bytes();
uint8_t *rom = memregion("chars")->base();
int size = memregion("chars")->bytes();
// text data lines
for (int i = 0; i < size / 2; i++)
@ -735,8 +727,8 @@ void panicr_state::init_panicr()
rom[i] = buf[bitswap<24>(i,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6, 2,3,1,0,5,4)];
}
rom = memregion("gfx2")->base();
size = memregion("gfx2")->bytes();
rom = memregion("tiles")->base();
size = memregion("tiles")->bytes();
// tiles data lines
for (int i = 0; i < size / 4; i++)
@ -759,8 +751,8 @@ void panicr_state::init_panicr()
rom[i] = buf[bitswap<24>(i,23,22,21,20,19,18,17,16,15,14,13,12, 5,4,3,2, 11,10,9,8,7,6, 0,1)];
}
rom = memregion("gfx3")->base();
size = memregion("gfx3")->bytes();
rom = memregion("sprites")->base();
size = memregion("sprites")->bytes();
// sprites data lines
for (int i = 0; i < size / 2; i++)
@ -779,8 +771,8 @@ void panicr_state::init_panicr()
}
//rearrange bg tilemaps a bit....
rom = memregion("user1")->base();
size = memregion("user1")->bytes();
rom = memregion("tilerom")->base();
size = memregion("tilerom")->bytes();
memcpy(&buf[0], rom, size);
for (int j = 0; j < 16; j++)
@ -791,8 +783,8 @@ void panicr_state::init_panicr()
}
}
rom = memregion("user2")->base();
size = memregion("user2")->bytes();
rom = memregion("attrrom")->base();
size = memregion("attrrom")->bytes();
memcpy(&buf[0], rom, size);
for (int j = 0; j < 16; j++)

View File

@ -149,17 +149,17 @@ rom.
#include "emu.h"
#include "t5182.h"
#define T5182_CLOCK XTAL(14'318'181)/4
DEFINE_DEVICE_TYPE(T5182, t5182_device, "t5182", "T5182 MCU")
t5182_device::t5182_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, T5182, tag, owner, clock),
m_ourcpu(*this, "t5182_z80"),
m_sharedram(*this, "sharedram"),
m_irqstate(0),
m_semaphore_main(0),
m_semaphore_snd(0)
: device_t(mconfig, T5182, tag, owner, clock)
, m_ourcpu(*this, "t5182_z80")
, m_sharedram(*this, "sharedram")
, m_ym_read_cb(*this, 0)
, m_ym_write_cb(*this)
, m_irqstate(0)
, m_semaphore_main(false)
, m_semaphore_snd(false)
{
}
@ -185,12 +185,12 @@ void t5182_device::sharedram_w(offs_t offset, uint8_t data)
m_sharedram[offset] = data;
}
TIMER_CALLBACK_MEMBER( t5182_device::setirq_callback )
TIMER_CALLBACK_MEMBER(t5182_device::setirq_callback)
{
switch(param)
switch (param)
{
case YM2151_ASSERT:
m_irqstate |= 1|4;
m_irqstate |= 1 | 4;
break;
case YM2151_CLEAR:
@ -213,10 +213,10 @@ TIMER_CALLBACK_MEMBER( t5182_device::setirq_callback )
if (m_ourcpu == nullptr)
return;
if (m_irqstate == 0) /* no IRQs pending */
m_ourcpu->set_input_line(0,CLEAR_LINE);
else /* IRQ pending */
m_ourcpu->set_input_line(0,ASSERT_LINE);
if (m_irqstate == 0) // no IRQs pending
m_ourcpu->set_input_line(0, CLEAR_LINE);
else // IRQ pending
m_ourcpu->set_input_line(0, ASSERT_LINE);
}
void t5182_device::sound_irq_w(uint8_t data)
@ -244,32 +244,42 @@ void t5182_device::ym2151_irq_handler(int state)
uint8_t t5182_device::sharedram_semaphore_snd_r()
{
return m_semaphore_snd;
return m_semaphore_snd ? 1 : 0;
}
void t5182_device::sharedram_semaphore_main_acquire_w(uint8_t data)
{
m_semaphore_main = 1;
m_semaphore_main = true;
}
void t5182_device::sharedram_semaphore_main_release_w(uint8_t data)
{
m_semaphore_main = 0;
m_semaphore_main = false;
}
void t5182_device::sharedram_semaphore_snd_acquire_w(uint8_t data)
{
m_semaphore_snd = 1;
m_semaphore_snd = true;
}
void t5182_device::sharedram_semaphore_snd_release_w(uint8_t data)
{
m_semaphore_snd = 0;
m_semaphore_snd = false;
}
uint8_t t5182_device::sharedram_semaphore_main_r()
{
return m_semaphore_main | (m_irqstate & 2);
return (m_semaphore_main ? 1 : 0) | (m_irqstate & 2);
}
uint8_t t5182_device::ym_r(offs_t offset)
{
return m_ym_read_cb(offset);
}
void t5182_device::ym_w(offs_t offset, uint8_t data)
{
m_ym_write_cb(offset, data);
}
// ROM definition for the Toshiba T5182 Custom CPU internal program ROM
@ -325,8 +335,8 @@ void t5182_device::t5182_map(address_map &map)
{
map(0x0000, 0x1fff).rom().region("cpu", 0); // internal ROM
map(0x2000, 0x27ff).ram().mirror(0x1800); // internal RAM
map(0x4000, 0x40ff).ram().mirror(0x3F00).share("sharedram"); // 2016 with four 74ls245s, one each for main and t5182 address and data. pins 23, 22, 20, 19, 18 are all tied low so only 256 bytes are usable
map(0x8000, 0xffff).rom().region(":t5182_z80", 0); // external ROM
map(0x4000, 0x40ff).ram().mirror(0x3f00).share(m_sharedram); // 2016 with four 74ls245s, one each for main and t5182 address and data. pins 23, 22, 20, 19, 18 are all tied low so only 256 bytes are usable
map(0x8000, 0xffff).rom().region("external", 0); // external ROM
}
@ -343,7 +353,7 @@ void t5182_device::t5182_map(address_map &map)
void t5182_device::t5182_io(address_map &map)
{
map.global_mask(0xff);
map(0x00, 0x01).rw(":ymsnd", FUNC(ym2151_device::read), FUNC(ym2151_device::write));
map(0x00, 0x01).rw(FUNC(t5182_device::ym_r), FUNC(t5182_device::ym_w));
map(0x10, 0x10).w(FUNC(t5182_device::sharedram_semaphore_snd_acquire_w));
map(0x11, 0x11).w(FUNC(t5182_device::sharedram_semaphore_snd_release_w));
map(0x12, 0x12).w(FUNC(t5182_device::ym2151_irq_ack_w));
@ -359,7 +369,7 @@ void t5182_device::t5182_io(address_map &map)
void t5182_device::device_add_mconfig(machine_config &config)
{
Z80(config, m_ourcpu, T5182_CLOCK);
Z80(config, m_ourcpu, DERIVED_CLOCK(1, 1));
m_ourcpu->set_addrmap(AS_PROGRAM, &t5182_device::t5182_map);
m_ourcpu->set_addrmap(AS_IO, &t5182_device::t5182_io);
}

View File

@ -24,6 +24,10 @@ public:
CPU_CLEAR
};
// configuration
auto ym_read_callback() { return m_ym_read_cb.bind(); }
auto ym_write_callback() { return m_ym_write_cb.bind(); }
void sound_irq_w(uint8_t data);
uint8_t sharedram_semaphore_snd_r();
void sharedram_semaphore_main_acquire_w(uint8_t data);
@ -32,8 +36,6 @@ public:
void sharedram_w(offs_t offset, uint8_t data);
void ym2151_irq_handler(int state);
void t5182_io(address_map &map);
void t5182_map(address_map &map);
protected:
// device-level overrides
virtual void device_start() override;
@ -42,12 +44,6 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
private:
// internal state
required_device<cpu_device> m_ourcpu;
required_shared_ptr<uint8_t> m_sharedram;
int m_irqstate;
int m_semaphore_main;
int m_semaphore_snd;
TIMER_CALLBACK_MEMBER(setirq_callback);
void sharedram_semaphore_snd_acquire_w(uint8_t data);
@ -55,6 +51,23 @@ private:
uint8_t sharedram_semaphore_main_r();
void ym2151_irq_ack_w(uint8_t data);
void cpu_irq_ack_w(uint8_t data);
uint8_t ym_r(offs_t offset);
void ym_w(offs_t offset, uint8_t data);
void t5182_io(address_map &map);
void t5182_map(address_map &map);
// internal state
required_device<cpu_device> m_ourcpu;
required_shared_ptr<uint8_t> m_sharedram;
// device callbacks
devcb_read8 m_ym_read_cb;
devcb_write8 m_ym_write_cb;
uint32_t m_irqstate;
bool m_semaphore_main;
bool m_semaphore_snd;
};
DECLARE_DEVICE_TYPE(T5182, t5182_device)