rungun.cpp: Fixed Run N Gun single/dual monitor logic setup. [Angelo Salese]

(Note: graphics are currently broken if attempting to run the game with dual screen setup).
This commit is contained in:
angelosa 2015-11-30 01:28:22 +01:00
parent 378cca039a
commit 3f6ce8f36e
2 changed files with 20 additions and 5 deletions

View File

@ -80,10 +80,14 @@ READ16_MEMBER(rungun_state::rng_sysregs_r)
/*
bit0-7: coin mechs and services
bit8 : freeze
bit9 : joysticks layout(auto detect???)
bit9 : screen output select
*/
return ioport("SYSTEM")->read();
{
UINT8 field_bit = machine().first_screen()->frame_number() & 1;
if(m_single_screen_mode == true)
field_bit = 1;
return (ioport("SYSTEM")->read() & 0xfdff) | (field_bit << 9);
}
case 0x06/2:
if (ACCESSING_BITS_0_7)
{
@ -110,14 +114,17 @@ WRITE16_MEMBER(rungun_state::rng_sysregs_w)
bit4 : coin counter #2 (when coin slot "common" is selected)
bit7 : set before massive memory writes (video chip select?)
bit10 : IRQ5 ACK
bit12 : if set, forces screen output to 1 monitor.
bit14 : (0) sprite on top of PSAC2 layer (1) other way around (title screen)
*/
if (ACCESSING_BITS_0_7)
{
membank("spriteram_bank")->set_entry((data & 0x80) >> 7);
ioport("EEPROMOUT")->write(data, 0xff);
}
if (ACCESSING_BITS_8_15)
{
m_single_screen_mode = (data & 0x1000) == 0x1000;
m_video_priority_mode = (data & 0x4000) == 0x4000;
if (!(data & 0x400)) // actually a 0 -> 1 transition
m_maincpu->set_input_line(M68K_IRQ_5, CLEAR_LINE);
@ -195,7 +202,7 @@ static ADDRESS_MAP_START( rungun_map, AS_PROGRAM, 16, rungun_state )
AM_RANGE(0x5c0000, 0x5c000f) AM_DEVREAD("k055673", k055673_device, k055673_rom_word_r) // 246A ROM readback window
AM_RANGE(0x5c0010, 0x5c001f) AM_DEVWRITE("k055673", k055673_device, k055673_reg_word_w)
AM_RANGE(0x600000, 0x600fff) AM_DEVREADWRITE("k055673", k055673_device, k053247_word_r, k053247_word_w) // OBJ RAM
AM_RANGE(0x601000, 0x601fff) AM_RAM // communication? second monitor buffer?
AM_RANGE(0x601000, 0x601fff) AM_RAMBANK("spriteram_bank") // OBJ RAM, actually used as work RAM banked buffer
AM_RANGE(0x640000, 0x640007) AM_DEVWRITE("k055673", k055673_device, k053246_word_w) // '246A registers
AM_RANGE(0x680000, 0x68001f) AM_DEVWRITE("k053936", k053936_device, ctrl_w) // '936 registers
AM_RANGE(0x6c0000, 0x6cffff) AM_RAM_WRITE(rng_936_videoram_w) AM_SHARE("936_videoram") // PSAC2 ('936) RAM (34v + 35v)
@ -346,6 +353,10 @@ void rungun_state::machine_start()
m_roz_rom = memregion("gfx1")->base();
membank("bank2")->configure_entries(0, 8, &ROM[0x10000], 0x4000);
m_banked_ram = auto_alloc_array_clear(machine(), UINT16, 0x2000);
membank("spriteram_bank")->configure_entries(0,2,&m_banked_ram[0],0x1000);
save_item(NAME(m_sound_ctrl));
save_item(NAME(m_sound_status));
save_item(NAME(m_sound_nmi_clk));

View File

@ -60,7 +60,11 @@ public:
UINT8 m_sound_nmi_clk;
bool m_video_priority_mode;
UINT16 *m_banked_ram;
bool m_single_screen_mode;
DECLARE_READ16_MEMBER(test_r);
DECLARE_WRITE16_MEMBER(test_w);
DECLARE_READ16_MEMBER(rng_sysregs_r);
DECLARE_WRITE16_MEMBER(rng_sysregs_w);
DECLARE_WRITE16_MEMBER(sound_cmd1_w);