(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_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)
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user