(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_M6502_SYNC_CALLBACK(WRITELINE(apple3_state, apple3_sync_w))
MCFG_CPU_PROGRAM_MAP(apple3_map)
MCFG_CPU_PERIODIC_INT_DRIVER(apple3_state, apple3_interrupt, 192)
MCFG_QUANTUM_TIME(attotime::from_hz(60))
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_REFRESH_RATE(60)
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_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_TIMER_DRIVER_ADD_SCANLINE("scantimer", apple3_state, apple3_interrupt, "screen", 0, 1)
/* slot bus */
MCFG_A2BUS_BUS_ADD("a2bus", "maincpu", a2bus_intf)

View File

@ -73,7 +73,7 @@ public:
DECLARE_MACHINE_RESET(apple3);
DECLARE_VIDEO_START(apple3);
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_b);
DECLARE_WRITE8_MEMBER(apple3_via_1_out_a);
@ -95,6 +95,7 @@ public:
UINT8 *apple3_get_indexed_addr(offs_t offset);
TIMER_DEVICE_CALLBACK_MEMBER(apple3_c040_tick);
DECLARE_PALETTE_INIT(apple3);
void apple3_irq_update();
bool m_sync;
UINT8 m_indir_opcode;

View File

@ -4,22 +4,41 @@
Apple ///
VIA #0 (D VIA)
CA1: 1 if a cartridge is inserted, 0 otherwise
VIA #1 (E VIA)
CA2: 1 if key pressed, 0 otherwise
CA1: IRQ from the MM58167 RTC
CA2: 1 if key pressed, 0 otherwise
CB1/CB2: connected to VBL
m_via_0_a: Environment register
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 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)
CA1: OR of all 4 slots' IRQ status
CA2: SW1 (Open Apple key?)
CB1: SW3/SCO
CB2: SER
Port A:
bits 0-2: bank select for $2000-$9FFF range
bit 3: n/c
bit 4: slot 4 IRQ (in)
bit 5: slot 3 IRQ (in)
bit 6: Apple II mode trap output (out)
bit 7: IRQ status (in) (0 = IRQ, 1 = no IRQ)
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_cb1(machine().primary_screen->vblank());
m_via_1->write_cb1(machine().primary_screen->vblank());
m_via_1->write_cb2(machine().primary_screen->vblank());
}
UINT8 *apple3_state::apple3_bankaddr(UINT16 bank, offs_t offset)
{
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);
}
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)
{
// printf(" asserting IRQ\n");
m_maincpu->set_input_line(M6502_IRQ_LINE, ASSERT_LINE);
m_via_1->write_pa7(0); // this is active low
}
else
{
// printf(" clearing IRQ\n");
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)
{
// printf("via 0 IRQ: %d\n", state);
m_via_0_irq = state;
if (m_via_1_irq || m_via_0_irq)
{
m_maincpu->set_input_line(M6502_IRQ_LINE, ASSERT_LINE);
}
else
{
m_maincpu->set_input_line(M6502_IRQ_LINE, CLEAR_LINE);
}
apple3_irq_update();
}
MACHINE_RESET_MEMBER(apple3_state,apple3)