summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/apple2e.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/apple2e.cpp')
-rw-r--r--src/mame/drivers/apple2e.cpp134
1 files changed, 61 insertions, 73 deletions
diff --git a/src/mame/drivers/apple2e.cpp b/src/mame/drivers/apple2e.cpp
index f6775153aca..7ef36277f9d 100644
--- a/src/mame/drivers/apple2e.cpp
+++ b/src/mame/drivers/apple2e.cpp
@@ -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();
- switch (offset)
+ if ((offset & 0xf0) == 0x00) // keyboard latch, $C000 is really 00-0F
{
- case 0x00: // keyboard latch
- return m_transchar | m_strobe;
+ return m_transchar | m_strobe;
+ }
+ switch (offset)
+ {
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();
- switch (offset)
+ if ((offset & 0xf0) == 0x00) // keyboard latch, $C000 is really 00-0F
{
- 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;
+ return m_transchar | m_strobe;
+ }
+ switch (offset)
+ {
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)
{