mirror of
https://github.com/holub/mame
synced 2025-07-05 18:08:04 +03:00
apple2: updated PC Transporter to use alternate DMAC emulation & fixed V30 clock. [Peter Ferrie, R. Belmont]
This commit is contained in:
parent
c1efcefc26
commit
f81948b663
@ -53,30 +53,10 @@
|
|||||||
CF31: control/flags: bit 4 = 1 to assert reset on V30, 5 = 1 to assert halt on V30
|
CF31: control/flags: bit 4 = 1 to assert reset on V30, 5 = 1 to assert halt on V30
|
||||||
|
|
||||||
TODO:
|
TODO:
|
||||||
- Code at $70b0-$70c5 waits for the V30 to answer some configuration data.
|
- Code at $70b0-$70c5 waits for the V30 to answer FPU presence.
|
||||||
- What's going on at CF0E/CF0F?
|
- What's going on at CF0E/CF0F?
|
||||||
- There's likely A2 ROM at CnXX and C800-CBFF to support the "Slinky" memory
|
- The manual indicates there is no ROM; special drivers installed into ProDOS 8
|
||||||
expansion card emulation function inside one of the custom ASICs. Need to
|
provide the RAMdisk and A2-accessing-PC-drives functionality.
|
||||||
dump this...
|
|
||||||
|
|
||||||
The final stages before the software settles into its loop are:
|
|
||||||
|
|
||||||
20 to C800 at cf30
|
|
||||||
00 to C800 at cf31
|
|
||||||
12 to C800 at cf2b
|
|
||||||
21 to C800 at cf25
|
|
||||||
33 to C800 at cf24
|
|
||||||
80 to C800 at cf31
|
|
||||||
20 to C800 at cf30
|
|
||||||
loop:
|
|
||||||
Read $C800 at cf36
|
|
||||||
Read $C800 at cf31
|
|
||||||
Read $C800 at cf31
|
|
||||||
Read $C800 at cf36
|
|
||||||
Read $C800 at cf31
|
|
||||||
Read $C800 at cf31
|
|
||||||
80 to C800 at cf31
|
|
||||||
loop end: (return to loop)
|
|
||||||
|
|
||||||
*********************************************************************/
|
*********************************************************************/
|
||||||
|
|
||||||
@ -94,7 +74,6 @@ const device_type A2BUS_PCXPORTER = &device_creator<a2bus_pcxporter_device>;
|
|||||||
|
|
||||||
static ADDRESS_MAP_START( pc_map, AS_PROGRAM, 16, a2bus_pcxporter_device )
|
static ADDRESS_MAP_START( pc_map, AS_PROGRAM, 16, a2bus_pcxporter_device )
|
||||||
ADDRESS_MAP_UNMAP_HIGH
|
ADDRESS_MAP_UNMAP_HIGH
|
||||||
//AM_RANGE(0xf0000, 0xfffff) AM_READ(pc_bios_r)
|
|
||||||
ADDRESS_MAP_END
|
ADDRESS_MAP_END
|
||||||
|
|
||||||
static ADDRESS_MAP_START(pc_io, AS_IO, 16, a2bus_pcxporter_device )
|
static ADDRESS_MAP_START(pc_io, AS_IO, 16, a2bus_pcxporter_device )
|
||||||
@ -108,7 +87,7 @@ static ADDRESS_MAP_START(pc_io, AS_IO, 16, a2bus_pcxporter_device )
|
|||||||
ADDRESS_MAP_END
|
ADDRESS_MAP_END
|
||||||
|
|
||||||
MACHINE_CONFIG_FRAGMENT( pcxporter )
|
MACHINE_CONFIG_FRAGMENT( pcxporter )
|
||||||
MCFG_CPU_ADD("v30", V30, XTAL_14_31818MHz/3)
|
MCFG_CPU_ADD("v30", V30, XTAL_14_31818MHz/2) // 7.16 MHz as per manual
|
||||||
MCFG_CPU_PROGRAM_MAP(pc_map)
|
MCFG_CPU_PROGRAM_MAP(pc_map)
|
||||||
MCFG_CPU_IO_MAP(pc_io)
|
MCFG_CPU_IO_MAP(pc_io)
|
||||||
MCFG_CPU_IRQ_ACKNOWLEDGE_DEVICE("pic8259", pic8259_device, inta_cb)
|
MCFG_CPU_IRQ_ACKNOWLEDGE_DEVICE("pic8259", pic8259_device, inta_cb)
|
||||||
@ -121,7 +100,7 @@ MACHINE_CONFIG_FRAGMENT( pcxporter )
|
|||||||
MCFG_PIT8253_CLK2(XTAL_14_31818MHz/12) /* pio port c pin 4, and speaker polling enough */
|
MCFG_PIT8253_CLK2(XTAL_14_31818MHz/12) /* pio port c pin 4, and speaker polling enough */
|
||||||
MCFG_PIT8253_OUT2_HANDLER(WRITELINE(a2bus_pcxporter_device, pc_pit8253_out2_changed))
|
MCFG_PIT8253_OUT2_HANDLER(WRITELINE(a2bus_pcxporter_device, pc_pit8253_out2_changed))
|
||||||
|
|
||||||
MCFG_DEVICE_ADD( "dma8237", AM9517A, XTAL_14_31818MHz/3 )
|
MCFG_DEVICE_ADD( "dma8237", PCXPORT_DMAC, XTAL_14_31818MHz/2 )
|
||||||
MCFG_I8237_OUT_HREQ_CB(WRITELINE(a2bus_pcxporter_device, pc_dma_hrq_changed))
|
MCFG_I8237_OUT_HREQ_CB(WRITELINE(a2bus_pcxporter_device, pc_dma_hrq_changed))
|
||||||
MCFG_I8237_OUT_EOP_CB(WRITELINE(a2bus_pcxporter_device, pc_dma8237_out_eop))
|
MCFG_I8237_OUT_EOP_CB(WRITELINE(a2bus_pcxporter_device, pc_dma8237_out_eop))
|
||||||
MCFG_I8237_IN_MEMR_CB(READ8(a2bus_pcxporter_device, pc_dma_read_byte))
|
MCFG_I8237_IN_MEMR_CB(READ8(a2bus_pcxporter_device, pc_dma_read_byte))
|
||||||
@ -390,9 +369,36 @@ void a2bus_pcxporter_device::write_c800(address_space &space, UINT16 offset, UIN
|
|||||||
|
|
||||||
case 0x72c: // CGA 6845 register select
|
case 0x72c: // CGA 6845 register select
|
||||||
m_pcio_space->write_byte(0x3d6, data);
|
m_pcio_space->write_byte(0x3d6, data);
|
||||||
|
m_6845_reg = data;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x72d: // CGA 6845 data read/write
|
case 0x72d: // CGA 6845 data read/write
|
||||||
|
// HACK: adjust the 40 column mode the 6502 sets to
|
||||||
|
// be more within specs.
|
||||||
|
switch (m_6845_reg)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
if (data == 0x3e)
|
||||||
|
{
|
||||||
|
data -= 6;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
if (data == 0x29)
|
||||||
|
{
|
||||||
|
data += 4;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3:
|
||||||
|
if (data == 0x5)
|
||||||
|
{
|
||||||
|
data *= 2;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
m_pcio_space->write_byte(0x3d7, data);
|
m_pcio_space->write_byte(0x3d7, data);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -424,7 +430,7 @@ void a2bus_pcxporter_device::write_c800(address_space &space, UINT16 offset, UIN
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
printf("%02x to C800 at %x\n", data, offset + 0xc800);
|
// printf("%02x to C800 at %x\n", data, offset + 0xc800);
|
||||||
m_regs[offset] = data;
|
m_regs[offset] = data;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -123,6 +123,8 @@ private:
|
|||||||
address_space *m_pcmem_space, *m_pcio_space;
|
address_space *m_pcmem_space, *m_pcio_space;
|
||||||
bool m_reset_during_halt;
|
bool m_reset_during_halt;
|
||||||
|
|
||||||
|
UINT8 m_6845_reg;
|
||||||
|
|
||||||
void pc_select_dma_channel(int channel, bool state);
|
void pc_select_dma_channel(int channel, bool state);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user