(MESS) apple3: improved interrupt generation and scanline timing [R. Belmont]
This commit is contained in:
parent
277ead61c9
commit
c75c744600
@ -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)
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user