mirror of
https://github.com/holub/mame
synced 2025-04-21 16:01:56 +03:00
upd7810: refresh port C on MCC related output changes
This commit is contained in:
parent
ae973b6d65
commit
842efa863d
@ -897,6 +897,15 @@ void upd7801_device::upd7810_take_irq()
|
||||
}
|
||||
}
|
||||
|
||||
void upd7810_device::upd7810_to_output_change(int state)
|
||||
{
|
||||
TO = state & 1;
|
||||
m_to_func(TO);
|
||||
|
||||
if (m_mcc & 0x10)
|
||||
WP(UPD7810_PORTC, m_pc_out);
|
||||
}
|
||||
|
||||
void upd7810_device::upd7810_co0_output_change()
|
||||
{
|
||||
/* Output LV0 Content to CO0 */
|
||||
@ -907,6 +916,8 @@ void upd7810_device::upd7810_co0_output_change()
|
||||
LV0 ^= 1;
|
||||
|
||||
m_co0_func(CO0);
|
||||
if (m_mcc & 0x40)
|
||||
WP(UPD7810_PORTC, m_pc_out);
|
||||
}
|
||||
void upd7810_device::upd7810_co1_output_change()
|
||||
{
|
||||
@ -918,6 +929,8 @@ void upd7810_device::upd7810_co1_output_change()
|
||||
LV1 ^= 1;
|
||||
|
||||
m_co1_func(CO1);
|
||||
if (m_mcc & 0x80)
|
||||
WP(UPD7810_PORTC, m_pc_out);
|
||||
}
|
||||
|
||||
void upd7810_device::upd7810_write_EOM()
|
||||
@ -972,6 +985,8 @@ void upd7810_device::upd7810_sio_output()
|
||||
{
|
||||
TXD = m_txs & 1;
|
||||
m_txd_func(TXD);
|
||||
if (m_mcc & 0x01)
|
||||
WP(UPD7810_PORTC, m_pc_out);
|
||||
m_txs >>= 1;
|
||||
m_txcnt--;
|
||||
if (0 == m_txcnt)
|
||||
@ -1267,8 +1282,7 @@ void upd7810_device::upd7810_handle_timer0(int cycles, int clkdiv)
|
||||
/* timer F/F source is timer 0 ? */
|
||||
if (0x00 == (TMM & 0x03))
|
||||
{
|
||||
TO ^= 1;
|
||||
m_to_func(TO);
|
||||
upd7810_to_output_change(TO ^ 1);
|
||||
}
|
||||
/* timer 1 chained with timer 0 ? */
|
||||
if ((TMM & 0xe0) == 0x60)
|
||||
@ -1281,8 +1295,7 @@ void upd7810_device::upd7810_handle_timer0(int cycles, int clkdiv)
|
||||
/* timer F/F source is timer 1 ? */
|
||||
if (0x01 == (TMM & 0x03))
|
||||
{
|
||||
TO ^= 1;
|
||||
m_to_func(TO);
|
||||
upd7810_to_output_change(TO ^ 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1304,8 +1317,7 @@ void upd7810_device::upd7810_handle_timer1(int cycles, int clkdiv)
|
||||
/* timer F/F source is timer 1 ? */
|
||||
if (0x01 == (TMM & 0x03))
|
||||
{
|
||||
TO ^= 1;
|
||||
m_to_func(TO);
|
||||
upd7810_to_output_change(TO ^ 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1360,8 +1372,7 @@ void upd7810_device::handle_timers(int cycles)
|
||||
OVCF += cycles;
|
||||
while (OVCF >= 1)
|
||||
{
|
||||
TO ^= 1;
|
||||
m_to_func(TO);
|
||||
upd7810_to_output_change(TO ^ 1);
|
||||
OVCF -= 1;
|
||||
}
|
||||
}
|
||||
@ -1526,8 +1537,7 @@ void upd7801_device::handle_timers(int cycles)
|
||||
IRR |= INTFT0;
|
||||
|
||||
/* Reset the timer flip/fliop */
|
||||
TO = 0;
|
||||
m_to_func(TO);
|
||||
upd7810_to_output_change(0);
|
||||
|
||||
/* Reload the timer */
|
||||
m_ovc0 = 8 * ( TM0 + ( ( TM1 & 0x0f ) << 8 ) );
|
||||
@ -1540,16 +1550,14 @@ void upd78c05_device::handle_timers(int cycles)
|
||||
if ( m_ovc0 ) {
|
||||
m_ovc0 -= cycles;
|
||||
|
||||
if ( m_ovc0 <= 0 ) {
|
||||
if ( m_ovc0 <= 0 )
|
||||
{
|
||||
IRR |= INTFT0;
|
||||
if (0x00 == (TMM & 0x03)) {
|
||||
TO ^= 1;
|
||||
m_to_func(TO);
|
||||
}
|
||||
if (0x00 == (TMM & 0x03))
|
||||
upd7810_to_output_change(TO ^ 1);
|
||||
|
||||
while ( m_ovc0 <= 0 ) {
|
||||
while ( m_ovc0 <= 0 )
|
||||
m_ovc0 += ( ( TMM & 0x04 ) ? 16 * 8 : 8 ) * TM0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -161,6 +161,7 @@ protected:
|
||||
void upd7810_handle_timer0(int cycles, int clkdiv);
|
||||
void upd7810_handle_timer1(int cycles, int clkdiv);
|
||||
|
||||
void upd7810_to_output_change(int state);
|
||||
void upd7810_co0_output_change();
|
||||
void upd7810_co1_output_change();
|
||||
|
||||
|
@ -1047,7 +1047,10 @@ void upd7810_device::MOV_MM_A()
|
||||
/* 4d d1: 0100 1101 1101 0001 */
|
||||
void upd7810_device::MOV_MCC_A()
|
||||
{
|
||||
if (MCC == A)
|
||||
return;
|
||||
MCC = A;
|
||||
WP(UPD7810_PORTC, m_pc_out);
|
||||
}
|
||||
|
||||
/* 4d d2: 0100 1101 1101 0010 */
|
||||
@ -9448,8 +9451,7 @@ void upd7810_device::STM()
|
||||
void upd7810_device::STM_7801()
|
||||
{
|
||||
/* Set the timer flip/flop */
|
||||
TO = 1;
|
||||
m_to_func(TO);
|
||||
upd7810_to_output_change(1);
|
||||
|
||||
/* Reload the timer */
|
||||
m_ovc0 = 16 * ( TM0 + ( ( TM1 & 0x0f ) << 8 ) );
|
||||
|
@ -7,7 +7,7 @@ PeT mess@utanet.at march 2002
|
||||
|
||||
Hardware notes:
|
||||
- NEC D78C11AGF (4KB internal ROM), 12.00MHz XTAL
|
||||
- ?KB external RAM, cartridge slot for external ROM
|
||||
- 2KB external RAM(UM6116-2L), cartridge slot for external ROM
|
||||
- 2*LCDC hiding under epoxy, appears to be SED1520
|
||||
- 61*64 1bpp LCD screen (the odd width is correct)
|
||||
- 1-bit sound
|
||||
@ -27,15 +27,9 @@ a copyright by Bon Treasure (a Hong Kong company that's also involved with
|
||||
Watara SuperVision), so perhaps it's them.
|
||||
|
||||
TODO:
|
||||
- how much external RAM does it have? 16KB seems overkill and the games
|
||||
only use a little
|
||||
- sound off doesn't work (usually the Select button to toggle), speaker is
|
||||
connected to PC4, but upd7810.cpp doesn't automatically write to port C
|
||||
on MCC related changes
|
||||
- related to the note above, writing to PC4 manually when MCC4 is off won't
|
||||
produce sound, the only game that does this is hspace
|
||||
- hspace should have some kind of volume filter on the bgm, not sure what
|
||||
controls it, maybe port B?
|
||||
- does port B do anything?
|
||||
- hspace should have some kind of volume filter on the bgm? not sure what
|
||||
what controls it, or maybe it's a hardware quirk
|
||||
|
||||
BTANB:
|
||||
- LCD flickers partially, especially bad in finitezn
|
||||
@ -92,7 +86,7 @@ private:
|
||||
|
||||
void gmaster_mem(address_map &map);
|
||||
|
||||
u8 m_ram[0x4000] = { };
|
||||
u8 m_ram[0x800] = { };
|
||||
u8 m_chipsel = 0;
|
||||
};
|
||||
|
||||
@ -182,7 +176,7 @@ void gmaster_state::io_w(offs_t offset, u8 data)
|
||||
void gmaster_state::gmaster_mem(address_map &map)
|
||||
{
|
||||
// 0x0000-0x0fff is internal ROM
|
||||
map(0x4000, 0x7fff).rw(FUNC(gmaster_state::io_r), FUNC(gmaster_state::io_w));
|
||||
map(0x4000, 0x47ff).mirror(0x3800).rw(FUNC(gmaster_state::io_r), FUNC(gmaster_state::io_w));
|
||||
map(0x8000, 0xfeff).r("cartslot", FUNC(generic_slot_device::read_rom));
|
||||
// 0xff00-0xffff is internal RAM
|
||||
}
|
||||
@ -200,6 +194,9 @@ void gmaster_state::portc_w(u8 data)
|
||||
// d0: RAM CS
|
||||
// d1,d2: LCD CS
|
||||
m_chipsel = data & 7;
|
||||
|
||||
// d4: speaker out
|
||||
m_speaker->level_w(BIT(data, 4));
|
||||
}
|
||||
|
||||
|
||||
@ -234,7 +231,6 @@ void gmaster_state::gmaster(machine_config &config)
|
||||
m_maincpu->pa_in_cb().set_ioport("JOY");
|
||||
m_maincpu->pb_out_cb().set(FUNC(gmaster_state::portb_w));
|
||||
m_maincpu->pc_out_cb().set(FUNC(gmaster_state::portc_w));
|
||||
m_maincpu->to_func().set(m_speaker, FUNC(speaker_sound_device::level_w));
|
||||
|
||||
// video hardware
|
||||
SCREEN(config, m_screen, SCREEN_TYPE_LCD);
|
||||
|
Loading…
Reference in New Issue
Block a user