mirror of
https://github.com/holub/mame
synced 2025-04-28 19:14:55 +03:00
armedf.cpp, galivan.cpp: major video config cleanups, converted to screen.set_raw() parameters;
galivan.cpp: added irq acknowledge signal; nb1414m4.cpp: improved notes, added stub for frame synchronization;
This commit is contained in:
parent
5c226e1f99
commit
c8f62f483d
@ -27,9 +27,11 @@ actually bootlegs.
|
|||||||
|
|
||||||
TODO:
|
TODO:
|
||||||
- identify and decap the NB1414M4 chip, it could be either a MCU or a fancy blitter chip;
|
- identify and decap the NB1414M4 chip, it could be either a MCU or a fancy blitter chip;
|
||||||
- time over doesn't kill the player in Kozure Ookami, check (1) note;
|
|
||||||
- Fix Armed F and Tatakae Big Fighter text tilemap usage, they both doesn't use the NB1414M4
|
- Fix Armed F and Tatakae Big Fighter text tilemap usage, they both doesn't use the NB1414M4
|
||||||
(as shown by the per-game kludge)
|
(as shown by the per-game kludge)
|
||||||
|
- kozure: time over doesn't kill the player, check (1) note for further details (kludged to work for now);
|
||||||
|
- kozure: POST screen should have green as backdrop, this is actually drawn by the text layer but not seen
|
||||||
|
because being mapped on pen 15 (-> unimplemented opaque flag?)
|
||||||
|
|
||||||
Notes:
|
Notes:
|
||||||
- the initial level color fade in effect in Armed F is confirmed on real HW, i.e. goes from
|
- the initial level color fade in effect in Armed F is confirmed on real HW, i.e. goes from
|
||||||
@ -185,7 +187,7 @@ Stephh's notes (based on the games M68000 code and some tests) :
|
|||||||
|
|
||||||
Tatakae! Big Fighter (c)1989 Nichibutsu
|
Tatakae! Big Fighter (c)1989 Nichibutsu
|
||||||
|
|
||||||
based on armedf.c
|
based on armedf.cpp
|
||||||
|
|
||||||
TODO:
|
TODO:
|
||||||
- scroll
|
- scroll
|
||||||
@ -322,7 +324,6 @@ Notes:
|
|||||||
#include "sound/3812intf.h"
|
#include "sound/3812intf.h"
|
||||||
#include "sound/dac.h"
|
#include "sound/dac.h"
|
||||||
#include "sound/volt_reg.h"
|
#include "sound/volt_reg.h"
|
||||||
#include "screen.h"
|
|
||||||
#include "speaker.h"
|
#include "speaker.h"
|
||||||
|
|
||||||
#define LEGION_HACK 0
|
#define LEGION_HACK 0
|
||||||
@ -345,7 +346,6 @@ Notes:
|
|||||||
---- ---- ---- --x- coin counter 1
|
---- ---- ---- --x- coin counter 1
|
||||||
---- ---- ---- ---x coin counter 0
|
---- ---- ---- ---x coin counter 0
|
||||||
*/
|
*/
|
||||||
|
|
||||||
WRITE16_MEMBER(armedf_state::terraf_io_w)
|
WRITE16_MEMBER(armedf_state::terraf_io_w)
|
||||||
{
|
{
|
||||||
if(data & 0x4000 && ((m_vreg & 0x4000) == 0)) //0 -> 1 transition
|
if(data & 0x4000 && ((m_vreg & 0x4000) == 0)) //0 -> 1 transition
|
||||||
@ -402,11 +402,15 @@ READ8_MEMBER(armedf_state::soundlatch_clear_r)
|
|||||||
|
|
||||||
WRITE16_MEMBER(armedf_state::irq_lv1_ack_w)
|
WRITE16_MEMBER(armedf_state::irq_lv1_ack_w)
|
||||||
{
|
{
|
||||||
|
if (m_nb1414m4 != nullptr)
|
||||||
|
m_nb1414m4->vblank_trigger();
|
||||||
m_maincpu->set_input_line(1, CLEAR_LINE);
|
m_maincpu->set_input_line(1, CLEAR_LINE);
|
||||||
}
|
}
|
||||||
|
|
||||||
WRITE16_MEMBER(armedf_state::irq_lv2_ack_w)
|
WRITE16_MEMBER(armedf_state::irq_lv2_ack_w)
|
||||||
{
|
{
|
||||||
|
if (m_nb1414m4 != nullptr)
|
||||||
|
m_nb1414m4->vblank_trigger();
|
||||||
m_maincpu->set_input_line(2, CLEAR_LINE);
|
m_maincpu->set_input_line(2, CLEAR_LINE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -557,7 +561,7 @@ void armedf_state::armedf_map(address_map &map)
|
|||||||
map(0x06d006, 0x06d007).w(FUNC(armedf_state::armedf_fg_scrollx_w));
|
map(0x06d006, 0x06d007).w(FUNC(armedf_state::armedf_fg_scrollx_w));
|
||||||
map(0x06d008, 0x06d009).w(FUNC(armedf_state::armedf_fg_scrolly_w));
|
map(0x06d008, 0x06d009).w(FUNC(armedf_state::armedf_fg_scrolly_w));
|
||||||
map(0x06d00a, 0x06d00b).w(FUNC(armedf_state::sound_command_w));
|
map(0x06d00a, 0x06d00b).w(FUNC(armedf_state::sound_command_w));
|
||||||
map(0x06d00c, 0x06d00d).nopw(); //watchdog
|
map(0x06d00c, 0x06d00d).nopw(); //watchdog?
|
||||||
map(0x06d00e, 0x06d00f).w(FUNC(armedf_state::irq_lv1_ack_w));
|
map(0x06d00e, 0x06d00f).w(FUNC(armedf_state::irq_lv1_ack_w));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -567,152 +571,6 @@ READ16_MEMBER(bigfghtr_state::latch_r)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
// reference code, in case anything goes bad
|
|
||||||
WRITE16_MEMBER(bigfghtr_state::sharedram_w)
|
|
||||||
{
|
|
||||||
data &= mem_mask;
|
|
||||||
COMBINE_DATA(&m_sharedram[offset]);
|
|
||||||
|
|
||||||
switch(offset)
|
|
||||||
{
|
|
||||||
case 0x40/2:
|
|
||||||
m_mcu_input_snippet = (data == 0x100);
|
|
||||||
m_mcu_jsr_snippet = (data == 0x300);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
READ16_MEMBER(bigfghtr_state::sharedram_r)
|
|
||||||
{
|
|
||||||
if(m_mcu_input_snippet)
|
|
||||||
{
|
|
||||||
switch(offset+0x600/2)
|
|
||||||
{
|
|
||||||
case 0x640/2:
|
|
||||||
if(m_read_latch)
|
|
||||||
{
|
|
||||||
m_read_latch = 0;
|
|
||||||
return machine().rand(); // TODO
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0x642/2:
|
|
||||||
return (ioport("DSW0")->read() & 0xffff) ^ 0xffff;
|
|
||||||
|
|
||||||
case 0x644/2:
|
|
||||||
return (ioport("DSW1")->read() & 0xffff) ^ 0xffff;
|
|
||||||
|
|
||||||
case 0x646/2:
|
|
||||||
return (ioport("P1")->read() & 0xffff) ^ 0xffff;
|
|
||||||
|
|
||||||
case 0x648/2:
|
|
||||||
return (ioport("P2")->read() & 0xffff) ^ 0xffff;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(m_mcu_jsr_snippet)
|
|
||||||
{
|
|
||||||
switch(offset+0x600/2)
|
|
||||||
{
|
|
||||||
case 0x640/2:
|
|
||||||
if(m_read_latch)
|
|
||||||
{
|
|
||||||
m_read_latch = 0;
|
|
||||||
return machine().rand(); // TODO
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 0x642/2:
|
|
||||||
return (ioport("DSW0")->read() & 0xffff) ^ 0xffff;
|
|
||||||
|
|
||||||
case 0x644/2:
|
|
||||||
return (ioport("DSW1")->read() & 0xffff) ^ 0xffff;
|
|
||||||
|
|
||||||
case 0x646/2:
|
|
||||||
return (ioport("P1")->read() & 0xffff) ^ 0xffff;
|
|
||||||
|
|
||||||
case 0x648/2:
|
|
||||||
return (ioport("P2")->read() & 0xffff) ^ 0xffff;
|
|
||||||
|
|
||||||
/*
|
|
||||||
protection controls where the program code should jump to.
|
|
||||||
|
|
||||||
example snippet:
|
|
||||||
00DB2A: 41FA FE86 lea (-$17a,PC), A0; ($d9b2) ;base program vector
|
|
||||||
00DB2E: 4DF9 0008 0E2A lea $80e2a.l, A6 ;base RAM vector, used by the i8751 to send the value, this value is added to the above A0
|
|
||||||
00DB34: 3039 0008 0E62 move.w $80e62.l, D0 ;number of snippets to execute
|
|
||||||
00DB3A: 6100 00F0 bsr $dc2c
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* bp daee, A0 = 0xdd02, A6 = 0x808ca, D0 = 0x80902 */
|
|
||||||
//case 0x902/2:
|
|
||||||
// return 0x0001;
|
|
||||||
//case (0x90a+0x24)/2:
|
|
||||||
// return 0x0001;
|
|
||||||
//case (0x902+8)/2:
|
|
||||||
// return 0x0004; // 0xf86a
|
|
||||||
|
|
||||||
/* bp db02, A0 = 0xdc2e, A6 = 0x80912, D0 = 0x8094a */
|
|
||||||
//case 0x94a/2:
|
|
||||||
// return 1;
|
|
||||||
//case (0x94a+8)/2:
|
|
||||||
// return 0x00dc; // 0xd62e
|
|
||||||
|
|
||||||
/* bp db16, A0 = 0xda86, A6 = 0x80c22, D0 = 0x80c5a */
|
|
||||||
//case 0xc5a/2:
|
|
||||||
// return 1;
|
|
||||||
//case (0xc5a+8)/2:
|
|
||||||
// return 0x0288; // 0x345f4
|
|
||||||
|
|
||||||
/* bp db2a, A0 = 0xd9b2, A6 = 0x80e2a, D0 = 0x80e62 */
|
|
||||||
|
|
||||||
/* bp db3e, A0 = 0xd8da, A6 = 0x81132, D0 = 0x8116a */
|
|
||||||
|
|
||||||
/* bp db52, A0 = 0xd806, A6 = 0x8133a, D0 = 0x81372 */
|
|
||||||
|
|
||||||
/* bp db66, A0 = 0xd7aa, A6 = 0x81742, D0 = 0x8177a */
|
|
||||||
|
|
||||||
/* bp db7a, A0 = 0xd746, A6 = 0x81b4a, D0 = 0x81b82 */
|
|
||||||
|
|
||||||
/* bp db8e, A0 = 0xd672, A6 = 0x81f52, D0 = 0x81f8a */
|
|
||||||
|
|
||||||
/* bp dba4, A0 = 0xd5ae, A6 = 0x8205a, D0 = 0x82092 */
|
|
||||||
|
|
||||||
/* bp dbba, A0 = 0xd5be, A6 = 0x82862, D0 = 0x8289a */
|
|
||||||
|
|
||||||
/* bp dbd0, A0 = 0xd512, A6 = 0x8296a, D0 = 0x829a2 */
|
|
||||||
|
|
||||||
/* bp dbe6, A0 = 0xd466, A6 = 0x82d72, D0 = 0x82daa */
|
|
||||||
|
|
||||||
/* bp dbfc, A0 = 0xd43e, A6 = 0x8357a, D0 = 0x835b2 */
|
|
||||||
|
|
||||||
/* following is separated from the others, dunno why ... */
|
|
||||||
/* bp dc14, A0 = 0xd3aa, A6 = 0x835a2, D0 = 0x835b2 */
|
|
||||||
|
|
||||||
|
|
||||||
/*case 0x
|
|
||||||
case 0x94a/2:
|
|
||||||
return 0x0002*4;
|
|
||||||
case (0x90a+2*0x40)/2:
|
|
||||||
case (0x90a+3*0x40)/2:
|
|
||||||
return 0x0003*4;
|
|
||||||
case (0x90a+4*0x40)/2:
|
|
||||||
return 0x000c*4; // 0x13d74
|
|
||||||
case (0x90a+5*0x40)/2:
|
|
||||||
return 0x000d*4; // 0x130f6
|
|
||||||
case (0x90a+6*0x40)/2:
|
|
||||||
return 0x000e*4; // 0x1817e
|
|
||||||
case (0x90a+7*0x40)/2:
|
|
||||||
return 0x0010*4; // 0x15924
|
|
||||||
//case (0x90a+0x25)/2:
|
|
||||||
// return 2;*/
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return m_sharedram[offset];
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
READ8_MEMBER(bigfghtr_state::main_sharedram_r)
|
READ8_MEMBER(bigfghtr_state::main_sharedram_r)
|
||||||
{
|
{
|
||||||
return m_sharedram[offset];
|
return m_sharedram[offset];
|
||||||
@ -1255,8 +1113,24 @@ void armedf_state::machine_reset()
|
|||||||
m_bg_scrolly = 0;
|
m_bg_scrolly = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void armedf_state::video_config(machine_config &config, int hchar_start, int vstart, int vend)
|
||||||
|
{
|
||||||
|
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
|
||||||
|
// assume all games on this HW running at ~59.1358Hz (trusted for Big Fighter)
|
||||||
|
// TODO: recheck if visible area isn't just 320x240 for everything (overscan may be masked by the text layer).
|
||||||
|
// TODO: bootlegs may not run at this speed
|
||||||
|
m_screen->set_raw(XTAL(16'000'000)/2,531,hchar_start*8,(64-hchar_start)*8, 255, vstart, vend);
|
||||||
|
m_screen->set_palette(m_palette);
|
||||||
|
m_screen->set_screen_update(FUNC(armedf_state::screen_update_armedf));
|
||||||
|
m_screen->screen_vblank().set(m_spriteram, FUNC(buffered_spriteram16_device::vblank_copy_rising));
|
||||||
|
|
||||||
void armedf_state::terraf_sound(machine_config &config)
|
GFXDECODE(config, m_gfxdecode, m_palette, gfx_armedf);
|
||||||
|
PALETTE(config, m_palette).set_format(palette_device::xRGB_444, 2048);
|
||||||
|
|
||||||
|
BUFFERED_SPRITERAM16(config, m_spriteram);
|
||||||
|
}
|
||||||
|
|
||||||
|
void armedf_state::sound_config(machine_config &config)
|
||||||
{
|
{
|
||||||
z80_device &audiocpu(Z80(config, "audiocpu", XTAL(24'000'000)/6)); // 4mhz
|
z80_device &audiocpu(Z80(config, "audiocpu", XTAL(24'000'000)/6)); // 4mhz
|
||||||
audiocpu.set_addrmap(AS_PROGRAM, &armedf_state::sound_map);
|
audiocpu.set_addrmap(AS_PROGRAM, &armedf_state::sound_map);
|
||||||
@ -1278,37 +1152,21 @@ void armedf_state::terraf_sound(machine_config &config)
|
|||||||
|
|
||||||
void armedf_state::terraf(machine_config &config)
|
void armedf_state::terraf(machine_config &config)
|
||||||
{
|
{
|
||||||
/* basic machine hardware */
|
|
||||||
M68000(config, m_maincpu, XTAL(16'000'000)/2); // 8mhz?
|
M68000(config, m_maincpu, XTAL(16'000'000)/2); // 8mhz?
|
||||||
m_maincpu->set_addrmap(AS_PROGRAM, &armedf_state::terraf_map);
|
m_maincpu->set_addrmap(AS_PROGRAM, &armedf_state::terraf_map);
|
||||||
m_maincpu->set_vblank_int("screen", FUNC(armedf_state::irq1_line_assert));
|
m_maincpu->set_vblank_int("screen", FUNC(armedf_state::irq1_line_assert));
|
||||||
|
|
||||||
NB1414M4(config, m_nb1414m4, 0);
|
NB1414M4(config, m_nb1414m4, 0);
|
||||||
|
|
||||||
/* video hardware */
|
video_config(config, 12, 8, 248);
|
||||||
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
|
|
||||||
screen.set_refresh_hz(57);
|
|
||||||
screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
|
|
||||||
screen.set_size(64*8, 32*8);
|
|
||||||
screen.set_visarea(12*8, (64-12)*8-1, 1*8, 31*8-1 );
|
|
||||||
screen.set_palette(m_palette);
|
|
||||||
screen.set_screen_update(FUNC(armedf_state::screen_update_armedf));
|
|
||||||
screen.screen_vblank().set(m_spriteram, FUNC(buffered_spriteram16_device::vblank_copy_rising));
|
|
||||||
|
|
||||||
MCFG_VIDEO_START_OVERRIDE(armedf_state,terraf)
|
MCFG_VIDEO_START_OVERRIDE(armedf_state,terraf)
|
||||||
|
|
||||||
GFXDECODE(config, m_gfxdecode, m_palette, gfx_armedf);
|
|
||||||
PALETTE(config, m_palette).set_format(palette_device::xRGB_444, 2048);
|
|
||||||
|
|
||||||
BUFFERED_SPRITERAM16(config, m_spriteram);
|
|
||||||
|
|
||||||
/* sound hardware */
|
/* sound hardware */
|
||||||
terraf_sound(config);
|
sound_config(config);
|
||||||
}
|
}
|
||||||
|
|
||||||
void armedf_state::terrafjb(machine_config &config)
|
void armedf_state::terrafjb(machine_config &config)
|
||||||
{
|
{
|
||||||
/* basic machine hardware */
|
|
||||||
M68000(config, m_maincpu, XTAL(16'000'000)/2); // 8mhz
|
M68000(config, m_maincpu, XTAL(16'000'000)/2); // 8mhz
|
||||||
m_maincpu->set_addrmap(AS_PROGRAM, &armedf_state::terraf_map);
|
m_maincpu->set_addrmap(AS_PROGRAM, &armedf_state::terraf_map);
|
||||||
m_maincpu->set_vblank_int("screen", FUNC(armedf_state::irq1_line_assert));
|
m_maincpu->set_vblank_int("screen", FUNC(armedf_state::irq1_line_assert));
|
||||||
@ -1322,23 +1180,9 @@ void armedf_state::terrafjb(machine_config &config)
|
|||||||
m_extra->set_addrmap(AS_PROGRAM, &armedf_state::terrafjb_extraz80_map);
|
m_extra->set_addrmap(AS_PROGRAM, &armedf_state::terrafjb_extraz80_map);
|
||||||
m_extra->set_addrmap(AS_IO, &armedf_state::terrafjb_extraz80_portmap);
|
m_extra->set_addrmap(AS_IO, &armedf_state::terrafjb_extraz80_portmap);
|
||||||
|
|
||||||
/* video hardware */
|
video_config(config, 12, 8, 248);
|
||||||
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
|
|
||||||
screen.set_refresh_hz(57);
|
|
||||||
screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
|
|
||||||
screen.set_size(64*8, 32*8);
|
|
||||||
screen.set_visarea(12*8, (64-12)*8-1, 1*8, 31*8-1 );
|
|
||||||
screen.set_palette(m_palette);
|
|
||||||
screen.set_screen_update(FUNC(armedf_state::screen_update_armedf));
|
|
||||||
screen.screen_vblank().set(m_spriteram, FUNC(buffered_spriteram16_device::vblank_copy_rising));
|
|
||||||
|
|
||||||
MCFG_VIDEO_START_OVERRIDE(armedf_state,terraf)
|
MCFG_VIDEO_START_OVERRIDE(armedf_state,terraf)
|
||||||
|
|
||||||
GFXDECODE(config, m_gfxdecode, m_palette, gfx_armedf);
|
|
||||||
PALETTE(config, m_palette).set_format(palette_device::xRGB_444, 2048);
|
|
||||||
|
|
||||||
BUFFERED_SPRITERAM16(config, m_spriteram);
|
|
||||||
|
|
||||||
/* sound hardware */
|
/* sound hardware */
|
||||||
SPEAKER(config, "speaker").front_center();
|
SPEAKER(config, "speaker").front_center();
|
||||||
|
|
||||||
@ -1361,7 +1205,6 @@ void armedf_state::terrafb(machine_config &config)
|
|||||||
|
|
||||||
void armedf_state::kozure(machine_config &config)
|
void armedf_state::kozure(machine_config &config)
|
||||||
{
|
{
|
||||||
/* basic machine hardware */
|
|
||||||
M68000(config, m_maincpu, XTAL(16'000'000)/2); // 8mhz
|
M68000(config, m_maincpu, XTAL(16'000'000)/2); // 8mhz
|
||||||
m_maincpu->set_addrmap(AS_PROGRAM, &armedf_state::kozure_map);
|
m_maincpu->set_addrmap(AS_PROGRAM, &armedf_state::kozure_map);
|
||||||
m_maincpu->set_vblank_int("screen", FUNC(armedf_state::irq1_line_assert));
|
m_maincpu->set_vblank_int("screen", FUNC(armedf_state::irq1_line_assert));
|
||||||
@ -1369,29 +1212,15 @@ void armedf_state::kozure(machine_config &config)
|
|||||||
NB1414M4(config, m_nb1414m4, 0);
|
NB1414M4(config, m_nb1414m4, 0);
|
||||||
|
|
||||||
/* video hardware */
|
/* video hardware */
|
||||||
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
|
video_config(config, 12, 8, 248);
|
||||||
screen.set_refresh_hz(60);
|
|
||||||
screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
|
|
||||||
screen.set_size(64*8, 32*8);
|
|
||||||
screen.set_visarea(12*8, (64-12)*8-1, 1*8, 31*8-1 ); // 320 x 240, trusted
|
|
||||||
screen.set_palette(m_palette);
|
|
||||||
screen.set_screen_update(FUNC(armedf_state::screen_update_armedf));
|
|
||||||
screen.screen_vblank().set(m_spriteram, FUNC(buffered_spriteram16_device::vblank_copy_rising));
|
|
||||||
|
|
||||||
MCFG_VIDEO_START_OVERRIDE(armedf_state,terraf)
|
MCFG_VIDEO_START_OVERRIDE(armedf_state,terraf)
|
||||||
|
|
||||||
GFXDECODE(config, m_gfxdecode, m_palette, gfx_armedf);
|
|
||||||
PALETTE(config, m_palette).set_format(palette_device::xRGB_444, 2048);
|
|
||||||
|
|
||||||
BUFFERED_SPRITERAM16(config, m_spriteram);
|
|
||||||
|
|
||||||
/* sound hardware */
|
/* sound hardware */
|
||||||
terraf_sound(config);
|
sound_config(config);
|
||||||
}
|
}
|
||||||
|
|
||||||
void armedf_state::armedf(machine_config &config)
|
void armedf_state::armedf(machine_config &config)
|
||||||
{
|
{
|
||||||
/* basic machine hardware */
|
|
||||||
M68000(config, m_maincpu, XTAL(16'000'000)/2); // 8mhz
|
M68000(config, m_maincpu, XTAL(16'000'000)/2); // 8mhz
|
||||||
m_maincpu->set_addrmap(AS_PROGRAM, &armedf_state::armedf_map);
|
m_maincpu->set_addrmap(AS_PROGRAM, &armedf_state::armedf_map);
|
||||||
m_maincpu->set_vblank_int("screen", FUNC(armedf_state::irq1_line_assert));
|
m_maincpu->set_vblank_int("screen", FUNC(armedf_state::irq1_line_assert));
|
||||||
@ -1401,23 +1230,9 @@ void armedf_state::armedf(machine_config &config)
|
|||||||
audiocpu.set_addrmap(AS_IO, &armedf_state::sound_portmap);
|
audiocpu.set_addrmap(AS_IO, &armedf_state::sound_portmap);
|
||||||
audiocpu.set_periodic_int(FUNC(armedf_state::irq0_line_hold), attotime::from_hz(XTAL(8'000'000)/2/512)); // ?
|
audiocpu.set_periodic_int(FUNC(armedf_state::irq0_line_hold), attotime::from_hz(XTAL(8'000'000)/2/512)); // ?
|
||||||
|
|
||||||
/* video hardware */
|
video_config(config, 12, 16, 240);
|
||||||
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
|
|
||||||
screen.set_refresh_hz(57);
|
|
||||||
screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
|
|
||||||
screen.set_size(64*8, 32*8);
|
|
||||||
screen.set_visarea(12*8, (64-12)*8-1, 1*8, 31*8-1 );
|
|
||||||
screen.set_palette(m_palette);
|
|
||||||
screen.set_screen_update(FUNC(armedf_state::screen_update_armedf));
|
|
||||||
screen.screen_vblank().set(m_spriteram, FUNC(buffered_spriteram16_device::vblank_copy_rising));
|
|
||||||
|
|
||||||
MCFG_VIDEO_START_OVERRIDE(armedf_state,armedf)
|
MCFG_VIDEO_START_OVERRIDE(armedf_state,armedf)
|
||||||
|
|
||||||
GFXDECODE(config, m_gfxdecode, m_palette, gfx_armedf);
|
|
||||||
PALETTE(config, m_palette).set_format(palette_device::xRGB_444, 2048);
|
|
||||||
|
|
||||||
BUFFERED_SPRITERAM16(config, m_spriteram);
|
|
||||||
|
|
||||||
/* sound hardware */
|
/* sound hardware */
|
||||||
SPEAKER(config, "speaker").front_center();
|
SPEAKER(config, "speaker").front_center();
|
||||||
|
|
||||||
@ -1434,7 +1249,6 @@ void armedf_state::armedf(machine_config &config)
|
|||||||
|
|
||||||
void armedf_state::cclimbr2(machine_config &config)
|
void armedf_state::cclimbr2(machine_config &config)
|
||||||
{
|
{
|
||||||
/* basic machine hardware */
|
|
||||||
M68000(config, m_maincpu, XTAL(16'000'000)/2); // 8mhz
|
M68000(config, m_maincpu, XTAL(16'000'000)/2); // 8mhz
|
||||||
m_maincpu->set_addrmap(AS_PROGRAM, &armedf_state::cclimbr2_map);
|
m_maincpu->set_addrmap(AS_PROGRAM, &armedf_state::cclimbr2_map);
|
||||||
m_maincpu->set_vblank_int("screen", FUNC(armedf_state::irq2_line_assert));
|
m_maincpu->set_vblank_int("screen", FUNC(armedf_state::irq2_line_assert));
|
||||||
@ -1446,23 +1260,9 @@ void armedf_state::cclimbr2(machine_config &config)
|
|||||||
|
|
||||||
NB1414M4(config, m_nb1414m4, 0);
|
NB1414M4(config, m_nb1414m4, 0);
|
||||||
|
|
||||||
/* video hardware */
|
video_config(config, 14, 16, 240);
|
||||||
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
|
|
||||||
screen.set_refresh_hz(60);
|
|
||||||
screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
|
|
||||||
screen.set_size(64*8, 32*8);
|
|
||||||
screen.set_visarea(14*8, (64-14)*8-1, 2*8, 30*8-1 );
|
|
||||||
screen.set_palette(m_palette);
|
|
||||||
screen.set_screen_update(FUNC(armedf_state::screen_update_armedf));
|
|
||||||
screen.screen_vblank().set(m_spriteram, FUNC(buffered_spriteram16_device::vblank_copy_rising));
|
|
||||||
|
|
||||||
MCFG_VIDEO_START_OVERRIDE(armedf_state,terraf)
|
MCFG_VIDEO_START_OVERRIDE(armedf_state,terraf)
|
||||||
|
|
||||||
GFXDECODE(config, m_gfxdecode, m_palette, gfx_armedf);
|
|
||||||
PALETTE(config, m_palette).set_format(palette_device::xRGB_444, 2048);
|
|
||||||
|
|
||||||
BUFFERED_SPRITERAM16(config, m_spriteram);
|
|
||||||
|
|
||||||
/* sound hardware */
|
/* sound hardware */
|
||||||
SPEAKER(config, "speaker").front_center();
|
SPEAKER(config, "speaker").front_center();
|
||||||
|
|
||||||
@ -1479,7 +1279,6 @@ void armedf_state::cclimbr2(machine_config &config)
|
|||||||
|
|
||||||
void armedf_state::legion_common(machine_config &config)
|
void armedf_state::legion_common(machine_config &config)
|
||||||
{
|
{
|
||||||
/* basic machine hardware */
|
|
||||||
M68000(config, m_maincpu, XTAL(16'000'000)/2); // 8mhz
|
M68000(config, m_maincpu, XTAL(16'000'000)/2); // 8mhz
|
||||||
m_maincpu->set_vblank_int("screen", FUNC(armedf_state::irq2_line_assert));
|
m_maincpu->set_vblank_int("screen", FUNC(armedf_state::irq2_line_assert));
|
||||||
|
|
||||||
@ -1487,23 +1286,9 @@ void armedf_state::legion_common(machine_config &config)
|
|||||||
audiocpu.set_addrmap(AS_PROGRAM, &armedf_state::cclimbr2_soundmap);
|
audiocpu.set_addrmap(AS_PROGRAM, &armedf_state::cclimbr2_soundmap);
|
||||||
audiocpu.set_periodic_int(FUNC(armedf_state::irq0_line_hold), attotime::from_hz(XTAL(8'000'000)/2/512)); // ?
|
audiocpu.set_periodic_int(FUNC(armedf_state::irq0_line_hold), attotime::from_hz(XTAL(8'000'000)/2/512)); // ?
|
||||||
|
|
||||||
/* video hardware */
|
video_config(config, 14, 16, 240);
|
||||||
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
|
|
||||||
screen.set_refresh_hz(60);
|
|
||||||
screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
|
|
||||||
screen.set_size(64*8, 32*8);
|
|
||||||
screen.set_visarea(14*8, (64-14)*8-1, 2*8, 30*8-1 );
|
|
||||||
screen.set_palette(m_palette);
|
|
||||||
screen.set_screen_update(FUNC(armedf_state::screen_update_armedf));
|
|
||||||
screen.screen_vblank().set(m_spriteram, FUNC(buffered_spriteram16_device::vblank_copy_rising));
|
|
||||||
|
|
||||||
MCFG_VIDEO_START_OVERRIDE(armedf_state,terraf)
|
MCFG_VIDEO_START_OVERRIDE(armedf_state,terraf)
|
||||||
|
|
||||||
GFXDECODE(config, m_gfxdecode, m_palette, gfx_armedf);
|
|
||||||
PALETTE(config, m_palette).set_format(palette_device::xRGB_444, 2048);
|
|
||||||
|
|
||||||
BUFFERED_SPRITERAM16(config, m_spriteram);
|
|
||||||
|
|
||||||
/* sound hardware */
|
/* sound hardware */
|
||||||
SPEAKER(config, "speaker").front_center();
|
SPEAKER(config, "speaker").front_center();
|
||||||
|
|
||||||
@ -1549,7 +1334,6 @@ void armedf_state::legionjb2(machine_config &config)
|
|||||||
|
|
||||||
void bigfghtr_state::bigfghtr(machine_config &config)
|
void bigfghtr_state::bigfghtr(machine_config &config)
|
||||||
{
|
{
|
||||||
|
|
||||||
M68000(config, m_maincpu, XTAL(16'000'000)/2); // verified
|
M68000(config, m_maincpu, XTAL(16'000'000)/2); // verified
|
||||||
m_maincpu->set_addrmap(AS_PROGRAM, &bigfghtr_state::bigfghtr_map);
|
m_maincpu->set_addrmap(AS_PROGRAM, &bigfghtr_state::bigfghtr_map);
|
||||||
m_maincpu->set_vblank_int("screen", FUNC(armedf_state::irq1_line_assert));
|
m_maincpu->set_vblank_int("screen", FUNC(armedf_state::irq1_line_assert));
|
||||||
@ -1559,22 +1343,10 @@ void bigfghtr_state::bigfghtr(machine_config &config)
|
|||||||
mcu.set_addrmap(AS_IO, &bigfghtr_state::bigfghtr_mcu_io_map);
|
mcu.set_addrmap(AS_IO, &bigfghtr_state::bigfghtr_mcu_io_map);
|
||||||
mcu.port_in_cb<1>().set_constant(0xdf); // bit 5: bus contention related?
|
mcu.port_in_cb<1>().set_constant(0xdf); // bit 5: bus contention related?
|
||||||
|
|
||||||
/* video hardware */
|
video_config(config, 12, 8, 248);
|
||||||
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
|
|
||||||
screen.set_raw(XTAL(16'000'000)/2,531,12*8,(64-12)*8, 254, 1*8, 31*8); // guess, matches 59.3 Hz from reference - measured at 59.1358Hz
|
|
||||||
screen.set_palette(m_palette);
|
|
||||||
screen.set_screen_update(FUNC(armedf_state::screen_update_armedf));
|
|
||||||
screen.screen_vblank().set(m_spriteram, FUNC(buffered_spriteram16_device::vblank_copy_rising));
|
|
||||||
|
|
||||||
MCFG_VIDEO_START_OVERRIDE(armedf_state,armedf)
|
MCFG_VIDEO_START_OVERRIDE(armedf_state,armedf)
|
||||||
|
|
||||||
GFXDECODE(config, m_gfxdecode, m_palette, gfx_armedf);
|
sound_config(config);
|
||||||
PALETTE(config, m_palette).set_format(palette_device::xRGB_444, 2048);
|
|
||||||
|
|
||||||
BUFFERED_SPRITERAM16(config, m_spriteram);
|
|
||||||
|
|
||||||
/* sound hardware */
|
|
||||||
terraf_sound(config);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*************************************
|
/*************************************
|
||||||
|
@ -53,6 +53,7 @@ Mighty Guy board layout:
|
|||||||
YM3526
|
YM3526
|
||||||
|
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
#include "emu.h"
|
#include "emu.h"
|
||||||
#include "includes/cop01.h"
|
#include "includes/cop01.h"
|
||||||
|
|
||||||
|
@ -23,11 +23,6 @@ TODO
|
|||||||
- bit 3 of ninjemak_gfxbank_w, there currently is a kludge to clear text RAM
|
- bit 3 of ninjemak_gfxbank_w, there currently is a kludge to clear text RAM
|
||||||
but it should really copy stuff from the extra ROM.
|
but it should really copy stuff from the extra ROM.
|
||||||
- Ninja Emaki has minor protection issues, see NB1414M4 simulation for more info.
|
- Ninja Emaki has minor protection issues, see NB1414M4 simulation for more info.
|
||||||
- dangarj has unemulated protection at I/Os 0x80-1 for missing sprites.
|
|
||||||
This is a 1412M2, which is the same chip used in terracre.cpp and cop01.cpp
|
|
||||||
The protection here is used for a code snippet at 0xf9c0, that of course is the
|
|
||||||
sprite handling. The code snippet is sum8 with 0x27 at 0x9d74 so no, the
|
|
||||||
later dangar US version snippet doesn't work
|
|
||||||
|
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
@ -38,7 +33,6 @@ TODO
|
|||||||
#include "sound/3526intf.h"
|
#include "sound/3526intf.h"
|
||||||
#include "sound/dac.h"
|
#include "sound/dac.h"
|
||||||
#include "sound/volt_reg.h"
|
#include "sound/volt_reg.h"
|
||||||
#include "screen.h"
|
|
||||||
#include "speaker.h"
|
#include "speaker.h"
|
||||||
|
|
||||||
|
|
||||||
@ -55,7 +49,15 @@ READ8_MEMBER(galivan_state::soundlatch_clear_r)
|
|||||||
|
|
||||||
READ8_MEMBER(galivan_state::IO_port_c0_r)
|
READ8_MEMBER(galivan_state::IO_port_c0_r)
|
||||||
{
|
{
|
||||||
return (0x58); /* To Avoid Reset on Ufo Robot dangar */
|
// causes a reset in dangar if value differs.
|
||||||
|
return (0x58);
|
||||||
|
}
|
||||||
|
|
||||||
|
WRITE8_MEMBER(galivan_state::vblank_ack_w)
|
||||||
|
{
|
||||||
|
if (m_nb1414m4 != nullptr)
|
||||||
|
m_nb1414m4->vblank_trigger();
|
||||||
|
m_maincpu->set_input_line(0, CLEAR_LINE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void galivan_state::galivan_map(address_map &map)
|
void galivan_state::galivan_map(address_map &map)
|
||||||
@ -93,21 +95,20 @@ void galivan_state::io_map(address_map &map)
|
|||||||
map(0x43, 0x44).w(FUNC(galivan_state::galivan_scrolly_w));
|
map(0x43, 0x44).w(FUNC(galivan_state::galivan_scrolly_w));
|
||||||
map(0x45, 0x45).w(FUNC(galivan_state::galivan_sound_command_w));
|
map(0x45, 0x45).w(FUNC(galivan_state::galivan_sound_command_w));
|
||||||
// map(0x46, 0x46).nopw();
|
// map(0x46, 0x46).nopw();
|
||||||
// map(0x47, 0x47).nopw();
|
map(0x47, 0x47).w(FUNC(galivan_state::vblank_ack_w));
|
||||||
map(0xc0, 0xc0).r(FUNC(galivan_state::IO_port_c0_r)); /* dangar needs to return 0x58 */
|
map(0xc0, 0xc0).r(FUNC(galivan_state::IO_port_c0_r));
|
||||||
}
|
}
|
||||||
|
|
||||||
void dangarj_state::dangarj_io_map(address_map &map)
|
void dangarj_state::dangarj_io_map(address_map &map)
|
||||||
{
|
{
|
||||||
io_map(map);
|
io_map(map);
|
||||||
// 1412M2
|
|
||||||
map(0x80, 0x80).rw("prot_chip", FUNC(nb1412m2_device::data_r), FUNC(nb1412m2_device::data_w));
|
map(0x80, 0x80).rw("prot_chip", FUNC(nb1412m2_device::data_r), FUNC(nb1412m2_device::data_w));
|
||||||
map(0x81, 0x81).w("prot_chip", FUNC(nb1412m2_device::command_w));
|
map(0x81, 0x81).w("prot_chip", FUNC(nb1412m2_device::command_w));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
WRITE8_MEMBER(galivan_state::blit_trigger_w)
|
WRITE8_MEMBER(galivan_state::blit_trigger_w)
|
||||||
{
|
{
|
||||||
|
// TODO: may not be right, diverges with armedf.cpp
|
||||||
m_nb1414m4->exec((m_videoram[0] << 8) | (m_videoram[1] & 0xff),m_videoram,m_scrollx,m_scrolly,m_tx_tilemap);
|
m_nb1414m4->exec((m_videoram[0] << 8) | (m_videoram[1] & 0xff),m_videoram,m_scrollx,m_scrolly,m_tx_tilemap);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -120,8 +121,8 @@ void galivan_state::ninjemak_io_map(address_map &map)
|
|||||||
map(0x83, 0x83).portr("SERVICE");
|
map(0x83, 0x83).portr("SERVICE");
|
||||||
map(0x84, 0x84).portr("DSW1");
|
map(0x84, 0x84).portr("DSW1");
|
||||||
map(0x85, 0x85).portr("DSW2").w(FUNC(galivan_state::galivan_sound_command_w));
|
map(0x85, 0x85).portr("DSW2").w(FUNC(galivan_state::galivan_sound_command_w));
|
||||||
map(0x86, 0x86).w(FUNC(galivan_state::blit_trigger_w)); // ??
|
map(0x86, 0x86).w(FUNC(galivan_state::blit_trigger_w));
|
||||||
// map(0x87, 0x87).nopw(); // ??
|
map(0x87, 0x87).w(FUNC(galivan_state::vblank_ack_w));
|
||||||
}
|
}
|
||||||
|
|
||||||
void galivan_state::sound_map(address_map &map)
|
void galivan_state::sound_map(address_map &map)
|
||||||
@ -142,7 +143,7 @@ void galivan_state::sound_io_map(address_map &map)
|
|||||||
|
|
||||||
|
|
||||||
/***************
|
/***************
|
||||||
Dip Sitches
|
Dip Switches
|
||||||
***************/
|
***************/
|
||||||
|
|
||||||
#define NIHON_JOYSTICK(_n_) \
|
#define NIHON_JOYSTICK(_n_) \
|
||||||
@ -432,13 +433,24 @@ MACHINE_RESET_MEMBER(galivan_state,ninjemak)
|
|||||||
m_ninjemak_dispdisable = 0;
|
m_ninjemak_dispdisable = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void galivan_state::video_config(machine_config &config)
|
||||||
|
{
|
||||||
|
BUFFERED_SPRITERAM8(config, m_spriteram);
|
||||||
|
|
||||||
|
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
|
||||||
|
// TODO: not measured, ~60 Hz
|
||||||
|
m_screen->set_raw(XTAL(12'000'000)/2,382,0,32*8, 262, 2*8, 30*8);
|
||||||
|
m_screen->screen_vblank().set(m_spriteram, FUNC(buffered_spriteram8_device::vblank_copy_rising));
|
||||||
|
m_screen->set_palette(m_palette);
|
||||||
|
}
|
||||||
|
|
||||||
void galivan_state::galivan(machine_config &config)
|
void galivan_state::galivan(machine_config &config)
|
||||||
{
|
{
|
||||||
/* basic machine hardware */
|
/* basic machine hardware */
|
||||||
Z80(config, m_maincpu, XTAL(12'000'000)/2); /* 6 MHz? */
|
Z80(config, m_maincpu, XTAL(12'000'000)/2); /* 6 MHz? */
|
||||||
m_maincpu->set_addrmap(AS_PROGRAM, &galivan_state::galivan_map);
|
m_maincpu->set_addrmap(AS_PROGRAM, &galivan_state::galivan_map);
|
||||||
m_maincpu->set_addrmap(AS_IO, &galivan_state::io_map);
|
m_maincpu->set_addrmap(AS_IO, &galivan_state::io_map);
|
||||||
m_maincpu->set_vblank_int("screen", FUNC(galivan_state::irq0_line_hold));
|
m_maincpu->set_vblank_int("screen", FUNC(galivan_state::irq0_line_assert));
|
||||||
|
|
||||||
z80_device &audiocpu(Z80(config, "audiocpu", XTAL(8'000'000)/2)); /* 4 MHz? */
|
z80_device &audiocpu(Z80(config, "audiocpu", XTAL(8'000'000)/2)); /* 4 MHz? */
|
||||||
audiocpu.set_addrmap(AS_PROGRAM, &galivan_state::sound_map);
|
audiocpu.set_addrmap(AS_PROGRAM, &galivan_state::sound_map);
|
||||||
@ -448,23 +460,12 @@ void galivan_state::galivan(machine_config &config)
|
|||||||
MCFG_MACHINE_START_OVERRIDE(galivan_state,galivan)
|
MCFG_MACHINE_START_OVERRIDE(galivan_state,galivan)
|
||||||
MCFG_MACHINE_RESET_OVERRIDE(galivan_state,galivan)
|
MCFG_MACHINE_RESET_OVERRIDE(galivan_state,galivan)
|
||||||
|
|
||||||
/* video hardware */
|
video_config(config);
|
||||||
BUFFERED_SPRITERAM8(config, m_spriteram);
|
MCFG_VIDEO_START_OVERRIDE(galivan_state,galivan)
|
||||||
|
m_screen->set_screen_update(FUNC(galivan_state::screen_update_galivan));
|
||||||
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
|
|
||||||
screen.set_refresh_hz(60);
|
|
||||||
screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
|
|
||||||
screen.set_size(32*8, 32*8);
|
|
||||||
screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
|
|
||||||
screen.set_screen_update(FUNC(galivan_state::screen_update_galivan));
|
|
||||||
screen.screen_vblank().set(m_spriteram, FUNC(buffered_spriteram8_device::vblank_copy_rising));
|
|
||||||
screen.set_palette(m_palette);
|
|
||||||
|
|
||||||
GFXDECODE(config, m_gfxdecode, m_palette, gfx_galivan);
|
GFXDECODE(config, m_gfxdecode, m_palette, gfx_galivan);
|
||||||
PALETTE(config, m_palette, FUNC(galivan_state::galivan_palette), 16*16+16*16+256*16, 256);
|
PALETTE(config, m_palette, FUNC(galivan_state::galivan_palette), 16*16+16*16+256*16, 256);
|
||||||
|
|
||||||
MCFG_VIDEO_START_OVERRIDE(galivan_state,galivan)
|
|
||||||
|
|
||||||
/* sound hardware */
|
/* sound hardware */
|
||||||
SPEAKER(config, "speaker").front_center();
|
SPEAKER(config, "speaker").front_center();
|
||||||
|
|
||||||
@ -493,7 +494,7 @@ void galivan_state::ninjemak(machine_config &config)
|
|||||||
Z80(config, m_maincpu, XTAL(12'000'000)/2); /* 6 MHz? */
|
Z80(config, m_maincpu, XTAL(12'000'000)/2); /* 6 MHz? */
|
||||||
m_maincpu->set_addrmap(AS_PROGRAM, &galivan_state::ninjemak_map);
|
m_maincpu->set_addrmap(AS_PROGRAM, &galivan_state::ninjemak_map);
|
||||||
m_maincpu->set_addrmap(AS_IO, &galivan_state::ninjemak_io_map);
|
m_maincpu->set_addrmap(AS_IO, &galivan_state::ninjemak_io_map);
|
||||||
m_maincpu->set_vblank_int("screen", FUNC(galivan_state::irq0_line_hold));
|
m_maincpu->set_vblank_int("screen", FUNC(galivan_state::irq0_line_assert));
|
||||||
|
|
||||||
z80_device &audiocpu(Z80(config, "audiocpu", XTAL(8'000'000)/2)); /* 4 MHz? */
|
z80_device &audiocpu(Z80(config, "audiocpu", XTAL(8'000'000)/2)); /* 4 MHz? */
|
||||||
audiocpu.set_addrmap(AS_PROGRAM, &galivan_state::sound_map);
|
audiocpu.set_addrmap(AS_PROGRAM, &galivan_state::sound_map);
|
||||||
@ -506,22 +507,12 @@ void galivan_state::ninjemak(machine_config &config)
|
|||||||
NB1414M4(config, m_nb1414m4, 0);
|
NB1414M4(config, m_nb1414m4, 0);
|
||||||
|
|
||||||
/* video hardware */
|
/* video hardware */
|
||||||
BUFFERED_SPRITERAM8(config, m_spriteram);
|
video_config(config);
|
||||||
|
MCFG_VIDEO_START_OVERRIDE(galivan_state,ninjemak)
|
||||||
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
|
m_screen->set_screen_update(FUNC(galivan_state::screen_update_ninjemak));
|
||||||
screen.set_refresh_hz(60);
|
|
||||||
screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
|
|
||||||
screen.set_size(32*8, 32*8);
|
|
||||||
screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
|
|
||||||
screen.set_screen_update(FUNC(galivan_state::screen_update_ninjemak));
|
|
||||||
screen.screen_vblank().set(m_spriteram, FUNC(buffered_spriteram8_device::vblank_copy_rising));
|
|
||||||
screen.set_palette(m_palette);
|
|
||||||
|
|
||||||
GFXDECODE(config, m_gfxdecode, m_palette, gfx_ninjemak);
|
GFXDECODE(config, m_gfxdecode, m_palette, gfx_ninjemak);
|
||||||
PALETTE(config, m_palette, FUNC(galivan_state::ninjemak_palette), 8*16+16*16+256*16, 256);
|
PALETTE(config, m_palette, FUNC(galivan_state::ninjemak_palette), 8*16+16*16+256*16, 256);
|
||||||
|
|
||||||
MCFG_VIDEO_START_OVERRIDE(galivan_state,ninjemak)
|
|
||||||
|
|
||||||
/* sound hardware */
|
/* sound hardware */
|
||||||
SPEAKER(config, "speaker").front_center();
|
SPEAKER(config, "speaker").front_center();
|
||||||
|
|
||||||
@ -536,13 +527,13 @@ void galivan_state::ninjemak(machine_config &config)
|
|||||||
vref.add_route(0, "dac2", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "dac2", -1.0, DAC_VREF_NEG_INPUT);
|
vref.add_route(0, "dac2", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "dac2", -1.0, DAC_VREF_NEG_INPUT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void galivan_state::youmab(machine_config &config)
|
void galivan_state::youmab(machine_config &config)
|
||||||
{
|
{
|
||||||
ninjemak(config);
|
ninjemak(config);
|
||||||
|
|
||||||
config.device_remove("nb1414m4");
|
config.device_remove("nb1414m4");
|
||||||
}
|
}
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
|
|
||||||
Game driver(s)
|
Game driver(s)
|
||||||
@ -1179,6 +1170,7 @@ WRITE8_MEMBER(galivan_state::youmab_86_w)
|
|||||||
|
|
||||||
void galivan_state::init_youmab()
|
void galivan_state::init_youmab()
|
||||||
{
|
{
|
||||||
|
// TODO: move all of this to an address map instead
|
||||||
m_maincpu->space(AS_IO).install_write_handler(0x82, 0x82, write8_delegate(*this, FUNC(galivan_state::youmab_extra_bank_w))); // banks rom at 0x8000? writes 0xff and 0x00 before executing code there
|
m_maincpu->space(AS_IO).install_write_handler(0x82, 0x82, write8_delegate(*this, FUNC(galivan_state::youmab_extra_bank_w))); // banks rom at 0x8000? writes 0xff and 0x00 before executing code there
|
||||||
m_maincpu->space(AS_PROGRAM).install_read_bank(0x0000, 0x7fff, "bank3");
|
m_maincpu->space(AS_PROGRAM).install_read_bank(0x0000, 0x7fff, "bank3");
|
||||||
membank("bank3")->set_base(memregion("maincpu")->base());
|
membank("bank3")->set_base(memregion("maincpu")->base());
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
#include "machine/nb1414m4.h"
|
#include "machine/nb1414m4.h"
|
||||||
#include "machine/gen_latch.h"
|
#include "machine/gen_latch.h"
|
||||||
#include "video/bufsprite.h"
|
#include "video/bufsprite.h"
|
||||||
|
#include "screen.h"
|
||||||
#include "emupal.h"
|
#include "emupal.h"
|
||||||
#include "tilemap.h"
|
#include "tilemap.h"
|
||||||
|
|
||||||
@ -15,17 +16,18 @@ class armedf_state : public driver_device
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
armedf_state(const machine_config &mconfig, device_type type, const char *tag) :
|
armedf_state(const machine_config &mconfig, device_type type, const char *tag) :
|
||||||
driver_device(mconfig, type, tag),
|
driver_device(mconfig, type, tag)
|
||||||
m_maincpu(*this, "maincpu"),
|
, m_maincpu(*this, "maincpu")
|
||||||
m_extra(*this, "extra"),
|
, m_extra(*this, "extra")
|
||||||
m_nb1414m4(*this, "nb1414m4"),
|
, m_nb1414m4(*this, "nb1414m4")
|
||||||
m_gfxdecode(*this, "gfxdecode"),
|
, m_screen(*this, "screen")
|
||||||
m_palette(*this, "palette"),
|
, m_gfxdecode(*this, "gfxdecode")
|
||||||
m_spriteram(*this, "spriteram"),
|
, m_palette(*this, "palette")
|
||||||
m_soundlatch(*this, "soundlatch"),
|
, m_spriteram(*this, "spriteram")
|
||||||
m_spr_pal_clut(*this, "spr_pal_clut"),
|
, m_soundlatch(*this, "soundlatch")
|
||||||
m_fg_videoram(*this, "fg_videoram"),
|
, m_spr_pal_clut(*this, "spr_pal_clut")
|
||||||
m_bg_videoram(*this, "bg_videoram")
|
, m_fg_videoram(*this, "fg_videoram")
|
||||||
|
, m_bg_videoram(*this, "bg_videoram")
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
void init_cclimbr2();
|
void init_cclimbr2();
|
||||||
@ -37,7 +39,6 @@ public:
|
|||||||
void init_terraf();
|
void init_terraf();
|
||||||
void init_terrafjb();
|
void init_terrafjb();
|
||||||
|
|
||||||
void terraf_sound(machine_config &config);
|
|
||||||
void terraf(machine_config &config);
|
void terraf(machine_config &config);
|
||||||
void terrafb(machine_config &config);
|
void terrafb(machine_config &config);
|
||||||
void legion_common(machine_config &config);
|
void legion_common(machine_config &config);
|
||||||
@ -55,11 +56,14 @@ public:
|
|||||||
protected:
|
protected:
|
||||||
virtual void machine_start() override;
|
virtual void machine_start() override;
|
||||||
virtual void machine_reset() override;
|
virtual void machine_reset() override;
|
||||||
|
void video_config(machine_config &config, int hchar_start, int vstart, int vend);
|
||||||
|
void sound_config(machine_config &config);
|
||||||
|
|
||||||
// devices
|
// devices
|
||||||
required_device<cpu_device> m_maincpu;
|
required_device<cpu_device> m_maincpu;
|
||||||
optional_device<cpu_device> m_extra;
|
optional_device<cpu_device> m_extra;
|
||||||
optional_device<nb1414m4_device> m_nb1414m4;
|
optional_device<nb1414m4_device> m_nb1414m4;
|
||||||
|
required_device<screen_device> m_screen;
|
||||||
required_device<gfxdecode_device> m_gfxdecode;
|
required_device<gfxdecode_device> m_gfxdecode;
|
||||||
required_device<palette_device> m_palette;
|
required_device<palette_device> m_palette;
|
||||||
required_device<buffered_spriteram16_device> m_spriteram;
|
required_device<buffered_spriteram16_device> m_spriteram;
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
#include "machine/nb1414m4.h"
|
#include "machine/nb1414m4.h"
|
||||||
#include "machine/gen_latch.h"
|
#include "machine/gen_latch.h"
|
||||||
#include "video/bufsprite.h"
|
#include "video/bufsprite.h"
|
||||||
|
#include "screen.h"
|
||||||
#include "emupal.h"
|
#include "emupal.h"
|
||||||
#include "tilemap.h"
|
#include "tilemap.h"
|
||||||
|
|
||||||
@ -21,14 +22,15 @@ class galivan_state : public driver_device
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
galivan_state(const machine_config &mconfig, device_type type, const char *tag) :
|
galivan_state(const machine_config &mconfig, device_type type, const char *tag) :
|
||||||
driver_device(mconfig, type, tag),
|
driver_device(mconfig, type, tag)
|
||||||
m_maincpu(*this, "maincpu"),
|
, m_maincpu(*this, "maincpu")
|
||||||
m_videoram(*this, "videoram"),
|
, m_videoram(*this, "videoram")
|
||||||
m_spriteram(*this, "spriteram"),
|
, m_spriteram(*this, "spriteram")
|
||||||
m_nb1414m4(*this, "nb1414m4"),
|
, m_nb1414m4(*this, "nb1414m4")
|
||||||
m_gfxdecode(*this, "gfxdecode"),
|
, m_screen(*this, "screen")
|
||||||
m_palette(*this, "palette"),
|
, m_gfxdecode(*this, "gfxdecode")
|
||||||
m_soundlatch(*this, "soundlatch")
|
, m_palette(*this, "palette")
|
||||||
|
, m_soundlatch(*this, "soundlatch")
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
void galivan(machine_config &config);
|
void galivan(machine_config &config);
|
||||||
@ -39,6 +41,7 @@ public:
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
void io_map(address_map &map);
|
void io_map(address_map &map);
|
||||||
|
void video_config(machine_config &config);
|
||||||
|
|
||||||
required_device<cpu_device> m_maincpu;
|
required_device<cpu_device> m_maincpu;
|
||||||
|
|
||||||
@ -62,6 +65,7 @@ private:
|
|||||||
DECLARE_READ8_MEMBER(soundlatch_clear_r);
|
DECLARE_READ8_MEMBER(soundlatch_clear_r);
|
||||||
DECLARE_READ8_MEMBER(IO_port_c0_r);
|
DECLARE_READ8_MEMBER(IO_port_c0_r);
|
||||||
DECLARE_WRITE8_MEMBER(blit_trigger_w);
|
DECLARE_WRITE8_MEMBER(blit_trigger_w);
|
||||||
|
DECLARE_WRITE8_MEMBER(vblank_ack_w);
|
||||||
DECLARE_WRITE8_MEMBER(youmab_extra_bank_w);
|
DECLARE_WRITE8_MEMBER(youmab_extra_bank_w);
|
||||||
DECLARE_READ8_MEMBER(youmab_8a_r);
|
DECLARE_READ8_MEMBER(youmab_8a_r);
|
||||||
DECLARE_WRITE8_MEMBER(youmab_81_w);
|
DECLARE_WRITE8_MEMBER(youmab_81_w);
|
||||||
@ -89,6 +93,7 @@ private:
|
|||||||
void draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect );
|
void draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect );
|
||||||
|
|
||||||
optional_device<nb1414m4_device> m_nb1414m4;
|
optional_device<nb1414m4_device> m_nb1414m4;
|
||||||
|
required_device<screen_device> m_screen;
|
||||||
required_device<gfxdecode_device> m_gfxdecode;
|
required_device<gfxdecode_device> m_gfxdecode;
|
||||||
required_device<palette_device> m_palette;
|
required_device<palette_device> m_palette;
|
||||||
required_device<generic_latch_8_device> m_soundlatch;
|
required_device<generic_latch_8_device> m_soundlatch;
|
||||||
|
@ -6,9 +6,14 @@ Nichibutsu 1414M4 device emulation
|
|||||||
|
|
||||||
Written by Angelo Salese, based on researches by Tomasz Slanina with Legion
|
Written by Angelo Salese, based on researches by Tomasz Slanina with Legion
|
||||||
|
|
||||||
This is some fancy MCU / blitter that copies text strings in various Nihon Bussan games;
|
This is some fancy blitter DMA or MCU or even a discrete structure that copies text strings to a 8-bit text layer in
|
||||||
|
various Nihon Bussan games;
|
||||||
|
|
||||||
TODO:
|
TODO:
|
||||||
|
- Identify what exactly this "device" is;
|
||||||
|
- The overlying text layer should actually be a base device for this (and used where not applicable like galivan,
|
||||||
|
armedf and bigfightr);
|
||||||
|
- Command triggering condition not understood (and diverges between galivan.cpp and armedf.cpp);
|
||||||
- where is the condition that makes "insert coin" text to properly blink?
|
- where is the condition that makes "insert coin" text to properly blink?
|
||||||
- first byte meaning is completely unknown;
|
- first byte meaning is completely unknown;
|
||||||
- Ninja Emaki triggers unknown commands 0x8000 & 0xff20;
|
- Ninja Emaki triggers unknown commands 0x8000 & 0xff20;
|
||||||
@ -21,9 +26,6 @@ Notes:
|
|||||||
11-- ---- ---- ---- src -> dst copy, if destination != 0 fixed src, otherwise do a src -> dst
|
11-- ---- ---- ---- src -> dst copy, if destination != 0 fixed src, otherwise do a src -> dst
|
||||||
--xx xxxx xxxx xxxx destination offset in the VRAM tilemap
|
--xx xxxx xxxx xxxx destination offset in the VRAM tilemap
|
||||||
|
|
||||||
- I'm sure that this is a shared device, that shares everything. All of the known differences are due of not
|
|
||||||
understood features of the chip (some bytes in the ROM etc.)
|
|
||||||
|
|
||||||
********************************************************************************************************************/
|
********************************************************************************************************************/
|
||||||
|
|
||||||
#include "emu.h"
|
#include "emu.h"
|
||||||
@ -309,6 +311,17 @@ void nb1414m4_device::_0e00(uint16_t mcu_cmd, uint8_t *vram)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
DEVICE SETTERS
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
void nb1414m4_device::vblank_trigger()
|
||||||
|
{
|
||||||
|
// TODO: use this for frame number synchronization instead of screen().frame_number()
|
||||||
|
// real HW references definitely syncs insert coin blinking after POST so whatever is the host actually
|
||||||
|
// have an interest over vblank signal.
|
||||||
|
}
|
||||||
|
|
||||||
void nb1414m4_device::exec(uint16_t mcu_cmd, uint8_t *vram, uint16_t &scrollx, uint16_t &scrolly, tilemap_t *tilemap)
|
void nb1414m4_device::exec(uint16_t mcu_cmd, uint8_t *vram, uint16_t &scrollx, uint16_t &scrolly, tilemap_t *tilemap)
|
||||||
{
|
{
|
||||||
/* latch fg scroll values */
|
/* latch fg scroll values */
|
||||||
|
@ -13,6 +13,7 @@ public:
|
|||||||
nb1414m4_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
|
nb1414m4_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
|
||||||
|
|
||||||
void exec(uint16_t mcu_cmd, uint8_t *vram, uint16_t &scrollx, uint16_t &scrolly, tilemap_t *tilemap);
|
void exec(uint16_t mcu_cmd, uint8_t *vram, uint16_t &scrollx, uint16_t &scrolly, tilemap_t *tilemap);
|
||||||
|
void vblank_trigger();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// device-level overrides
|
// device-level overrides
|
||||||
|
@ -45,7 +45,8 @@ TILE_GET_INFO_MEMBER(armedf_state::get_nb1414m4_tx_tile_info)
|
|||||||
{
|
{
|
||||||
attributes = m_text_videoram[tile_index + 0x400] & 0xff;
|
attributes = m_text_videoram[tile_index + 0x400] & 0xff;
|
||||||
|
|
||||||
if(tile_index < 0x12) /* don't draw the NB1414M4 params! TODO: could be a better fix */
|
// TODO: skip drawing the NB1414M4 params, how the HW actually handles this?
|
||||||
|
if(tile_index < 0x12)
|
||||||
tile_number = attributes = 0x00;
|
tile_number = attributes = 0x00;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -193,7 +193,8 @@ TILE_GET_INFO_MEMBER(galivan_state::ninjemak_get_bg_tile_info)
|
|||||||
TILE_GET_INFO_MEMBER(galivan_state::ninjemak_get_tx_tile_info)
|
TILE_GET_INFO_MEMBER(galivan_state::ninjemak_get_tx_tile_info)
|
||||||
{
|
{
|
||||||
uint16_t index = tile_index;
|
uint16_t index = tile_index;
|
||||||
if (index < 0x12) /* don't draw the NB1414M4 params! TODO: could be a better fix */
|
// TODO: skip drawing the NB1414M4 params, how the HW actually handles this?
|
||||||
|
if (index < 0x12)
|
||||||
index = 0x12;
|
index = 0x12;
|
||||||
|
|
||||||
int attr = m_videoram[index + 0x400];
|
int attr = m_videoram[index + 0x400];
|
||||||
|
Loading…
Reference in New Issue
Block a user