fromance.cpp: added visible horizontal parameter to CRTC [Angelo Salese]

This commit is contained in:
angelosa 2016-12-14 01:05:03 +01:00
parent fecb9fd762
commit 2dc0281103
3 changed files with 42 additions and 11 deletions

View File

@ -37,7 +37,9 @@ Memo:
- 2player's input is not supported.
- CRT Controller.
- Identify CRT Controller and fix layer misalignment in nekkyoku.
- nekkyoku: soft reset enables flip screen without any real reason.
- nekkyoku writes to a VRAM mirror for showing the OL gal, I guess ROM mirroring
is the same for all empty slots for this HW.
@ -885,11 +887,10 @@ MACHINE_START_MEMBER(fromance_state,fromance)
membank("bank1")->configure_entries(0, 0x100, &ROM[0x10000], 0x4000);
save_item(NAME(m_directionflag));
save_item(NAME(m_commanddata));
save_item(NAME(m_portselect));
save_item(NAME(m_adpcm_reset));
save_item(NAME(m_adpcm_data));
save_item(NAME(m_vclk_left));
@ -1265,7 +1266,7 @@ ROM_END
*
*************************************/
GAME( 1988, nekkyoku, 0, nekkyoku, nekkyoku, driver_device, 0, ROT0, "Video System Co.", "Rettou Juudan Nekkyoku Janshi - Higashi Nippon Hen (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
GAME( 1988, nekkyoku, 0, nekkyoku, nekkyoku, driver_device, 0, ROT0, "Video System Co.", "Rettou Juudan Nekkyoku Janshi - Higashi Nippon Hen (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1988, idolmj, 0, idolmj, idolmj, driver_device, 0, ROT0, "System Service", "Idol-Mahjong Housoukyoku (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1989, mjnatsu, 0, fromance, mjnatsu, driver_device, 0, ROT0, "Video System Co.", "Mahjong Natsu Monogatari (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1989, natsuiro, mjnatsu, fromance, mjnatsu, driver_device, 0, ROT0, "Video System Co.", "Natsuiro Mahjong (Japan)", MACHINE_SUPPORTS_SAVE )

View File

@ -50,7 +50,7 @@ public:
uint8_t m_crtc_register;
uint8_t m_crtc_data[0x10];
emu_timer *m_crtc_timer;
/* misc */
uint8_t m_directionflag;
uint8_t m_commanddata;
@ -98,7 +98,8 @@ public:
TIMER_CALLBACK_MEMBER(crtc_interrupt_gen);
inline void get_fromance_tile_info( tile_data &tileinfo, int tile_index, int layer );
inline void get_nekkyoku_tile_info( tile_data &tileinfo, int tile_index, int layer );
void init_common( );
void init_common();
void crtc_refresh();
DECLARE_WRITE_LINE_MEMBER(fromance_adpcm_int);
required_device<cpu_device> m_maincpu;
optional_device<msm5205_device> m_msm;

View File

@ -217,6 +217,7 @@ WRITE8_MEMBER(fromance_state::fromance_scroll_w)
}
else
{
switch (offset)
{
case 0:
@ -250,15 +251,46 @@ TIMER_CALLBACK_MEMBER(fromance_state::crtc_interrupt_gen)
m_crtc_timer->adjust(m_screen->frame_period() / param, 0, m_screen->frame_period() / param);
}
/*
0 1 2 3 4 5
57 63 69 71 1f 00 (all games)
4f 62 69 71 1f 04 nekkyoku
8 9 A B
7a 7b 7d 7f (all games)
79 7a 7d 7f nekkyoku (gameplay/title screen)
77 79 7d 7e nekkyoku (gals display)
*/
// TODO: guesswork, looks fully programmable
void fromance_state::crtc_refresh()
{
if(m_crtc_data[0] == 0) // sanity check
return;
rectangle visarea;
attoseconds_t refresh;
visarea.min_x = 0;
visarea.min_y = 0;
visarea.max_x = ((m_crtc_data[0]+1)*4) - 1;
visarea.max_y = 240 - 1;
refresh = HZ_TO_ATTOSECONDS(60);
m_screen->configure(512, 256, visarea, refresh);
}
WRITE8_MEMBER(fromance_state::fromance_crtc_data_w)
{
m_crtc_data[m_crtc_register] = data;
switch (m_crtc_register)
{
/* only register we know about.... */
case 0x00:
crtc_refresh();
break;
case 0x0b:
// TODO: actually is never > 0x80?
m_crtc_timer->adjust(m_screen->time_until_vblank_start(), (data > 0x80) ? 2 : 1);
break;
@ -271,13 +303,10 @@ WRITE8_MEMBER(fromance_state::fromance_crtc_data_w)
WRITE8_MEMBER(fromance_state::fromance_crtc_register_w)
{
m_crtc_register = data;
m_crtc_register = data & 0x0f;
}
/*************************************
*
* Main screen refresh