mirror of
https://github.com/holub/mame
synced 2025-04-23 08:49:55 +03:00
apple2e.cpp: correct I/O intercepts to match hardware [Peter Ferrie]
This commit is contained in:
parent
b5f4d91694
commit
545df40e7f
@ -1443,6 +1443,13 @@ void apple2e_state::do_io(address_space &space, int offset, bool is_iic)
|
||||
return;
|
||||
}
|
||||
|
||||
if ((offset & 0xf0) == 0x30) // speaker, $C030 is really 30-3f
|
||||
{
|
||||
m_speaker_state ^= 1;
|
||||
m_speaker->level_w(m_speaker_state);
|
||||
return;
|
||||
}
|
||||
|
||||
switch (offset)
|
||||
{
|
||||
case 0x20:
|
||||
@ -1482,11 +1489,6 @@ void apple2e_state::do_io(address_space &space, int offset, bool is_iic)
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x30:
|
||||
m_speaker_state ^= 1;
|
||||
m_speaker->level_w(m_speaker_state);
|
||||
break;
|
||||
|
||||
case 0x48: // (IIc only) clear mouse X/Y interrupt flags
|
||||
m_xirq = m_yirq = false;
|
||||
lower_irq(IRQ_MOUSEXY);
|
||||
@ -1599,11 +1601,13 @@ READ8_MEMBER(apple2e_state::c000_r)
|
||||
{
|
||||
if(machine().side_effects_disabled()) return read_floatingbus();
|
||||
|
||||
if ((offset & 0xf0) == 0x00) // keyboard latch, $C000 is really 00-0F
|
||||
{
|
||||
return m_transchar | m_strobe;
|
||||
}
|
||||
|
||||
switch (offset)
|
||||
{
|
||||
case 0x00: // keyboard latch
|
||||
return m_transchar | m_strobe;
|
||||
|
||||
case 0x10: // read any key down, reset keyboard strobe
|
||||
{
|
||||
uint8_t rv = m_transchar | (m_anykeydown ? 0x80 : 0x00);
|
||||
@ -1611,50 +1615,50 @@ READ8_MEMBER(apple2e_state::c000_r)
|
||||
return rv;
|
||||
}
|
||||
|
||||
case 0x11: // read LCRAM2 (LC Dxxx bank)
|
||||
return m_lcram2 ? 0x80 : 0x00;
|
||||
case 0x11: // read LCRAM2 (LC Dxxx bank), also reads like $C010 without strobe reset
|
||||
return (m_lcram2 ? 0x80 : 0x00) | m_strobe | m_transchar;
|
||||
|
||||
case 0x12: // read LCRAM (is LC readable?)
|
||||
return m_lcram ? 0x80 : 0x00;
|
||||
return (m_lcram ? 0x80 : 0x00) | m_transchar;
|
||||
|
||||
case 0x13: // read RAMRD
|
||||
return m_ramrd ? 0x80 : 0x00;
|
||||
return (m_ramrd ? 0x80 : 0x00) | m_transchar;
|
||||
|
||||
case 0x14: // read RAMWRT
|
||||
return m_ramwrt ? 0x80 : 0x00;
|
||||
return (m_ramwrt ? 0x80 : 0x00) | m_transchar;
|
||||
|
||||
case 0x15: // read INTCXROM
|
||||
return m_intcxrom ? 0x80 : 0x00;
|
||||
return (m_intcxrom ? 0x80 : 0x00) | m_transchar;
|
||||
|
||||
case 0x16: // read ALTZP
|
||||
return m_altzp ? 0x80 : 0x00;
|
||||
return (m_altzp ? 0x80 : 0x00) | m_transchar;
|
||||
|
||||
case 0x17: // read SLOTC3ROM
|
||||
return m_slotc3rom ? 0x80 : 0x00;
|
||||
return (m_slotc3rom ? 0x80 : 0x00) | m_transchar;
|
||||
|
||||
case 0x18: // read 80STORE
|
||||
return m_80store ? 0x80 : 0x00;
|
||||
return (m_80store ? 0x80 : 0x00) | m_transchar;
|
||||
|
||||
case 0x19: // read VBLBAR
|
||||
return m_screen->vblank() ? 0x00 : 0x80;
|
||||
return (m_screen->vblank() ? 0x00 : 0x80) | m_transchar;
|
||||
|
||||
case 0x1a: // read TEXT
|
||||
return m_video->m_graphics ? 0x00 : 0x80;
|
||||
return (m_video->m_graphics ? 0x00 : 0x80) | m_transchar;
|
||||
|
||||
case 0x1b: // read MIXED
|
||||
return m_video->m_mix ? 0x80 : 0x00;
|
||||
return (m_video->m_mix ? 0x80 : 0x00) | m_transchar;
|
||||
|
||||
case 0x1c: // read PAGE2
|
||||
return m_page2 ? 0x80 : 0x00;
|
||||
return (m_page2 ? 0x80 : 0x00) | m_transchar;
|
||||
|
||||
case 0x1d: // read HIRES
|
||||
return m_video->m_hires ? 0x80 : 0x00;
|
||||
return (m_video->m_hires ? 0x80 : 0x00) | m_transchar;
|
||||
|
||||
case 0x1e: // read ALTCHARSET
|
||||
return m_video->m_altcharset ? 0x80 : 0x00;
|
||||
return (m_video->m_altcharset ? 0x80 : 0x00) | m_transchar;
|
||||
|
||||
case 0x1f: // read 80COL
|
||||
return m_video->m_80col ? 0x80 : 0x00;
|
||||
return (m_video->m_80col ? 0x80 : 0x00) | m_transchar;
|
||||
|
||||
case 0x60: // cassette in
|
||||
case 0x68:
|
||||
@ -1710,6 +1714,12 @@ WRITE8_MEMBER(apple2e_state::c000_w)
|
||||
{
|
||||
if(machine().side_effects_disabled()) return;
|
||||
|
||||
if ((offset & 0xf0) == 0x10) // clear keyboard latch, $C010 is really 10-1F
|
||||
{
|
||||
m_strobe = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
switch (offset)
|
||||
{
|
||||
case 0x00: // 80STOREOFF
|
||||
@ -1796,10 +1806,6 @@ WRITE8_MEMBER(apple2e_state::c000_w)
|
||||
m_video->m_altcharset = true;
|
||||
break;
|
||||
|
||||
case 0x10: // clear keyboard latch
|
||||
m_strobe = 0;
|
||||
break;
|
||||
|
||||
case 0x20: // cassette output
|
||||
if (m_cassette)
|
||||
{
|
||||
@ -1836,31 +1842,13 @@ READ8_MEMBER(apple2e_state::c000_iic_r)
|
||||
{
|
||||
if(machine().side_effects_disabled()) return read_floatingbus();
|
||||
|
||||
if ((offset & 0xf0) == 0x00) // keyboard latch, $C000 is really 00-0F
|
||||
{
|
||||
return m_transchar | m_strobe;
|
||||
}
|
||||
|
||||
switch (offset)
|
||||
{
|
||||
case 0x00: // keyboard latch
|
||||
return m_transchar | m_strobe;
|
||||
|
||||
case 0x02: // RAMRDOFF
|
||||
m_ramrd = false;
|
||||
auxbank_update();
|
||||
break;
|
||||
|
||||
case 0x03: // RAMRDON
|
||||
m_ramrd = true;
|
||||
auxbank_update();
|
||||
break;
|
||||
|
||||
case 0x04: // RAMWRTOFF
|
||||
m_ramwrt = false;
|
||||
auxbank_update();
|
||||
break;
|
||||
|
||||
case 0x05: // RAMWRTON
|
||||
m_ramwrt = true;
|
||||
auxbank_update();
|
||||
break;
|
||||
|
||||
case 0x10: // read any key down, reset keyboard strobe
|
||||
{
|
||||
uint8_t rv = m_transchar | (m_anykeydown ? 0x80 : 0x00);
|
||||
@ -1868,54 +1856,52 @@ READ8_MEMBER(apple2e_state::c000_iic_r)
|
||||
return rv;
|
||||
}
|
||||
|
||||
case 0x11: // read LCRAM2 (LC Dxxx bank)
|
||||
return m_lcram2 ? 0x80 : 0x00;
|
||||
break;
|
||||
case 0x11: // read LCRAM2 (LC Dxxx bank), also reads like $C010 without strobe reset
|
||||
return (m_lcram2 ? 0x80 : 0x00) | m_strobe | m_transchar;
|
||||
|
||||
case 0x12: // read LCRAM (is LC readable?)
|
||||
return m_lcram ? 0x80 : 0x00;
|
||||
break;
|
||||
return (m_lcram ? 0x80 : 0x00) | m_transchar;
|
||||
|
||||
case 0x13: // read RAMRD
|
||||
return m_ramrd ? 0x80 : 0x00;
|
||||
return (m_ramrd ? 0x80 : 0x00) | m_transchar;
|
||||
|
||||
case 0x14: // read RAMWRT
|
||||
return m_ramwrt ? 0x80 : 0x00;
|
||||
return (m_ramwrt ? 0x80 : 0x00) | m_transchar;
|
||||
|
||||
case 0x15: // read & reset mouse X0 interrupt flag
|
||||
lower_irq(IRQ_MOUSEXY);
|
||||
return m_xirq ? 0x80 : 0x00;
|
||||
return (m_xirq ? 0x80 : 0x00) | m_transchar;
|
||||
|
||||
case 0x16: // read ALTZP
|
||||
return m_altzp ? 0x80 : 0x00;
|
||||
return (m_altzp ? 0x80 : 0x00) | m_transchar;
|
||||
|
||||
case 0x17: // read & reset mouse Y0 interrupt flag
|
||||
lower_irq(IRQ_MOUSEXY);
|
||||
return m_yirq ? 0x80 : 0x00;
|
||||
return (m_yirq ? 0x80 : 0x00) | m_transchar;
|
||||
|
||||
case 0x18: // read 80STORE
|
||||
return m_80store ? 0x80 : 0x00;
|
||||
return (m_80store ? 0x80 : 0x00) | m_transchar;
|
||||
|
||||
case 0x19: // read VBL
|
||||
return m_vbl ? 0x80 : 0x00;
|
||||
return (m_vbl ? 0x80 : 0x00) | m_transchar;
|
||||
|
||||
case 0x1a: // read TEXT
|
||||
return m_video->m_graphics ? 0x00 : 0x80;
|
||||
return (m_video->m_graphics ? 0x00 : 0x80) | m_transchar;
|
||||
|
||||
case 0x1b: // read MIXED
|
||||
return m_video->m_mix ? 0x80 : 0x00;
|
||||
return (m_video->m_mix ? 0x80 : 0x00) | m_transchar;
|
||||
|
||||
case 0x1c: // read PAGE2
|
||||
return m_page2 ? 0x80 : 0x00;
|
||||
return (m_page2 ? 0x80 : 0x00) | m_transchar;
|
||||
|
||||
case 0x1d: // read HIRES
|
||||
return m_video->m_hires ? 0x80 : 0x00;
|
||||
return (m_video->m_hires ? 0x80 : 0x00) | m_transchar;
|
||||
|
||||
case 0x1e: // read ALTCHARSET
|
||||
return m_video->m_altcharset ? 0x80 : 0x00;
|
||||
return (m_video->m_altcharset ? 0x80 : 0x00) | m_transchar;
|
||||
|
||||
case 0x1f: // read 80COL
|
||||
return m_video->m_80col ? 0x80 : 0x00;
|
||||
return (m_video->m_80col ? 0x80 : 0x00) | m_transchar;
|
||||
|
||||
case 0x40: // read XYMask (IIc only)
|
||||
return m_xy ? 0x80 : 0x00;
|
||||
@ -1980,6 +1966,12 @@ WRITE8_MEMBER(apple2e_state::c000_iic_w)
|
||||
{
|
||||
if(machine().side_effects_disabled()) return;
|
||||
|
||||
if ((offset & 0xf0) == 0x10) // clear keyboard latch, $C010 is really 10-1F
|
||||
{
|
||||
m_strobe = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
switch (offset)
|
||||
{
|
||||
case 0x00: // 80STOREOFF
|
||||
@ -2058,10 +2050,6 @@ WRITE8_MEMBER(apple2e_state::c000_iic_w)
|
||||
m_video->m_altcharset = true;
|
||||
break;
|
||||
|
||||
case 0x10: // clear keyboard latch
|
||||
m_strobe = 0;
|
||||
break;
|
||||
|
||||
case 0x5a: // IIC+ accelerator unlock
|
||||
if (m_isiicplus)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user