(MESS) apple3: improved interrupt generation and scanline timing [R. Belmont]

This commit is contained in:
R. Belmont 2014-02-06 03:13:33 +00:00
parent 277ead61c9
commit c75c744600
3 changed files with 54 additions and 31 deletions

View File

@ -52,7 +52,6 @@ static MACHINE_CONFIG_START( apple3, apple3_state )
MCFG_CPU_ADD("maincpu", M6502, 2000000) /* 2 MHz */ MCFG_CPU_ADD("maincpu", M6502, 2000000) /* 2 MHz */
MCFG_M6502_SYNC_CALLBACK(WRITELINE(apple3_state, apple3_sync_w)) MCFG_M6502_SYNC_CALLBACK(WRITELINE(apple3_state, apple3_sync_w))
MCFG_CPU_PROGRAM_MAP(apple3_map) MCFG_CPU_PROGRAM_MAP(apple3_map)
MCFG_CPU_PERIODIC_INT_DRIVER(apple3_state, apple3_interrupt, 192)
MCFG_QUANTUM_TIME(attotime::from_hz(60)) MCFG_QUANTUM_TIME(attotime::from_hz(60))
MCFG_MACHINE_RESET_OVERRIDE(apple3_state, apple3 ) MCFG_MACHINE_RESET_OVERRIDE(apple3_state, apple3 )
@ -61,7 +60,7 @@ static MACHINE_CONFIG_START( apple3, apple3_state )
MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_REFRESH_RATE(60)
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
MCFG_SCREEN_SIZE(280*2, 192) MCFG_SCREEN_SIZE(280*2, 224)
MCFG_SCREEN_VISIBLE_AREA(0, (280*2)-1,0,192-1) MCFG_SCREEN_VISIBLE_AREA(0, (280*2)-1,0,192-1)
MCFG_SCREEN_UPDATE_DRIVER(apple3_state, screen_update_apple3) MCFG_SCREEN_UPDATE_DRIVER(apple3_state, screen_update_apple3)
@ -70,6 +69,8 @@ static MACHINE_CONFIG_START( apple3, apple3_state )
MCFG_VIDEO_START_OVERRIDE(apple3_state, apple3 ) MCFG_VIDEO_START_OVERRIDE(apple3_state, apple3 )
MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", apple3_state, apple3_interrupt, "screen", 0, 1)
/* slot bus */ /* slot bus */
MCFG_A2BUS_BUS_ADD("a2bus", "maincpu", a2bus_intf) MCFG_A2BUS_BUS_ADD("a2bus", "maincpu", a2bus_intf)

View File

@ -73,7 +73,7 @@ public:
DECLARE_MACHINE_RESET(apple3); DECLARE_MACHINE_RESET(apple3);
DECLARE_VIDEO_START(apple3); DECLARE_VIDEO_START(apple3);
UINT32 screen_update_apple3(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); UINT32 screen_update_apple3(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
INTERRUPT_GEN_MEMBER(apple3_interrupt); TIMER_DEVICE_CALLBACK_MEMBER(apple3_interrupt);
DECLARE_WRITE8_MEMBER(apple3_via_0_out_a); DECLARE_WRITE8_MEMBER(apple3_via_0_out_a);
DECLARE_WRITE8_MEMBER(apple3_via_0_out_b); DECLARE_WRITE8_MEMBER(apple3_via_0_out_b);
DECLARE_WRITE8_MEMBER(apple3_via_1_out_a); DECLARE_WRITE8_MEMBER(apple3_via_1_out_a);
@ -95,6 +95,7 @@ public:
UINT8 *apple3_get_indexed_addr(offs_t offset); UINT8 *apple3_get_indexed_addr(offs_t offset);
TIMER_DEVICE_CALLBACK_MEMBER(apple3_c040_tick); TIMER_DEVICE_CALLBACK_MEMBER(apple3_c040_tick);
DECLARE_PALETTE_INIT(apple3); DECLARE_PALETTE_INIT(apple3);
void apple3_irq_update();
bool m_sync; bool m_sync;
UINT8 m_indir_opcode; UINT8 m_indir_opcode;

View File

@ -4,22 +4,41 @@
Apple /// Apple ///
VIA #0 (D VIA) VIA #0 (D VIA)
CA1: 1 if a cartridge is inserted, 0 otherwise CA1: IRQ from the MM58167 RTC
CA2: 1 if key pressed, 0 otherwise
CB1/CB2: connected to VBL
Port A: Environment register (all bits out)
bit 7: 1 for 1 MHz, 0 for 2 MHz
bit 6: 1 for I/O at C000-CFFF
bit 5: 1 to enable video
bit 4: 1 to enable NMI/Reset
bit 3: 1 to write-protect RAM in system bank C000-FFFF
bit 2: 1 to force primary stack at 0100-01FF
bit 1: 1 for primary ROM, 0 for secondary (Apple III doesn't have a secondary ROM, so this should always be '1' when bit 0 is)
bit 0: 1 to enable ROM in F000-FFFF
Port B: Zero page high 8 address bits, also MM58167 RTC register select (all bits out)
VIA #1 (E VIA) VIA #1 (E VIA)
CA2: 1 if key pressed, 0 otherwise CA1: OR of all 4 slots' IRQ status
CA2: SW1 (Open Apple key?)
CB1: SW3/SCO
CB2: SER
m_via_0_a: Environment register Port A:
bit 7: 1 for 1 MHz, 0 for 2 MHz bits 0-2: bank select for $2000-$9FFF range
bit 6: 1 for I/O at C000-CFFF bit 3: n/c
bit 5: 1 to enable video bit 4: slot 4 IRQ (in)
bit 4: 1 to enable NMI/Reset bit 5: slot 3 IRQ (in)
bit 3: 1 to write-protect RAM in system bank C000-FFFF bit 6: Apple II mode trap output (out)
bit 2: 1 to force primary stack at 0100-01FF bit 7: IRQ status (in) (0 = IRQ, 1 = no IRQ)
bit 1: 1 for primary ROM, 0 for secondary (Apple III doesn't have a secondary ROM, so this should always be '1' when bit 0 is)
bit 0: 1 to enable ROM in F000-FFFF Port B:
bits 0-5: 6-bit audio DAC output
bit 6: screen blank
bit 7: OR of NMI from slots
***************************************************************************/ ***************************************************************************/
@ -228,15 +247,13 @@ WRITE8_MEMBER(apple3_state::apple3_c0xx_w)
} }
} }
INTERRUPT_GEN_MEMBER(apple3_state::apple3_interrupt) TIMER_DEVICE_CALLBACK_MEMBER(apple3_state::apple3_interrupt)
{ {
m_via_1->write_ca2((AY3600_keydata_strobe_r(machine()) & 0x80) ? 1 : 0); m_via_1->write_ca2((AY3600_keydata_strobe_r(machine()) & 0x80) ? 1 : 0);
m_via_1->write_cb1(machine().primary_screen->vblank()); m_via_1->write_cb1(machine().primary_screen->vblank());
m_via_1->write_cb2(machine().primary_screen->vblank()); m_via_1->write_cb2(machine().primary_screen->vblank());
} }
UINT8 *apple3_state::apple3_bankaddr(UINT16 bank, offs_t offset) UINT8 *apple3_state::apple3_bankaddr(UINT16 bank, offs_t offset)
{ {
if (bank != (UINT16) ~0) if (bank != (UINT16) ~0)
@ -373,31 +390,35 @@ WRITE8_MEMBER(apple3_state::apple3_via_1_out_b)
apple3_via_out(&m_via_1_b, data); apple3_via_out(&m_via_1_b, data);
} }
WRITE_LINE_MEMBER(apple3_state::apple3_via_1_irq_func) void apple3_state::apple3_irq_update()
{ {
m_via_1_irq = state;
if (m_via_1_irq || m_via_0_irq) if (m_via_1_irq || m_via_0_irq)
{ {
// printf(" asserting IRQ\n");
m_maincpu->set_input_line(M6502_IRQ_LINE, ASSERT_LINE); m_maincpu->set_input_line(M6502_IRQ_LINE, ASSERT_LINE);
m_via_1->write_pa7(0); // this is active low
} }
else else
{ {
// printf(" clearing IRQ\n");
m_maincpu->set_input_line(M6502_IRQ_LINE, CLEAR_LINE); m_maincpu->set_input_line(M6502_IRQ_LINE, CLEAR_LINE);
m_via_1->write_pa7(1);
} }
} }
WRITE_LINE_MEMBER(apple3_state::apple3_via_1_irq_func)
{
// printf("via 1 IRQ: %d\n", state);
m_via_1_irq = state;
apple3_irq_update();
}
WRITE_LINE_MEMBER(apple3_state::apple3_via_0_irq_func) WRITE_LINE_MEMBER(apple3_state::apple3_via_0_irq_func)
{ {
// printf("via 0 IRQ: %d\n", state);
m_via_0_irq = state; m_via_0_irq = state;
if (m_via_1_irq || m_via_0_irq) apple3_irq_update();
{
m_maincpu->set_input_line(M6502_IRQ_LINE, ASSERT_LINE);
}
else
{
m_maincpu->set_input_line(M6502_IRQ_LINE, CLEAR_LINE);
}
} }
MACHINE_RESET_MEMBER(apple3_state,apple3) MACHINE_RESET_MEMBER(apple3_state,apple3)