diff options
Diffstat (limited to 'src/mame/machine/pitnrun.c')
-rw-r--r-- | src/mame/machine/pitnrun.c | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/src/mame/machine/pitnrun.c b/src/mame/machine/pitnrun.c new file mode 100644 index 00000000000..570d8e3a04d --- /dev/null +++ b/src/mame/machine/pitnrun.c @@ -0,0 +1,158 @@ +/*************************************************************************** + + Pit&Run + + Based on TaitsoSJ driver + 68705 has access to Z80 memory space + +***************************************************************************/ + +#include "driver.h" +#include "cpu/m6805/m6805.h" + + +static UINT8 fromz80,toz80; +static int zaccept,zready; + +MACHINE_RESET( pitnrun ) +{ + zaccept = 1; + zready = 0; + cpunum_set_input_line(2,0,CLEAR_LINE); +} + +static TIMER_CALLBACK( pitnrun_mcu_real_data_r ) +{ + zaccept = 1; +} + +READ8_HANDLER( pitnrun_mcu_data_r ) +{ + timer_call_after_resynch(0,pitnrun_mcu_real_data_r); + return toz80; +} + +static TIMER_CALLBACK( pitnrun_mcu_real_data_w ) +{ + zready = 1; + cpunum_set_input_line(2,0,ASSERT_LINE); + fromz80 = param; +} + +WRITE8_HANDLER( pitnrun_mcu_data_w ) +{ + timer_call_after_resynch(data,pitnrun_mcu_real_data_w); +} + +READ8_HANDLER( pitnrun_mcu_status_r ) +{ + /* mcu synchronization */ + cpu_yielduntil_time (ATTOTIME_IN_USEC(5)); + /* bit 0 = the 68705 has read data from the Z80 */ + /* bit 1 = the 68705 has written data for the Z80 */ + return ~((zready << 1) | (zaccept << 0)); +} + +static UINT8 portA_in,portA_out; + +READ8_HANDLER( pitnrun_68705_portA_r ) +{ + return portA_in; +} + +WRITE8_HANDLER( pitnrun_68705_portA_w ) +{ + portA_out = data; +} + + + +/* + * Port B connections: + * + * all bits are logical 1 when read (+5V pullup) + * + * 0 W !68INTRQ + * 1 W !68LRD (enables latch which holds command from the Z80) + * 2 W !68LWR (loads the latch which holds data for the Z80, and sets a + * status bit so the Z80 knows there's data waiting) + * 3 W to Z80 !BUSRQ (aka !WAIT) pin + * 4 W !68WRITE (triggers write to main Z80 memory area ) + * 5 W !68READ (triggers read from main Z80 memory area ) + * 6 W !LAL (loads the latch which holds the low 8 bits of the address of + * the main Z80 memory location to access) + * 7 W !UAL (loads the latch which holds the high 8 bits of the address of + * the main Z80 memory location to access) + */ + +READ8_HANDLER( pitnrun_68705_portB_r ) +{ + return 0xff; +} + +static int address; + +static TIMER_CALLBACK( pitnrun_mcu_data_real_r ) +{ + zready = 0; +} + +static TIMER_CALLBACK( pitnrun_mcu_status_real_w ) +{ + toz80 = param; + zaccept = 0; +} + +WRITE8_HANDLER( pitnrun_68705_portB_w ) +{ + if (~data & 0x02) + { + /* 68705 is going to read data from the Z80 */ + timer_call_after_resynch(0,pitnrun_mcu_data_real_r); + cpunum_set_input_line(2,0,CLEAR_LINE); + portA_in = fromz80; + } + if (~data & 0x04) + { + /* 68705 is writing data for the Z80 */ + timer_call_after_resynch(portA_out,pitnrun_mcu_status_real_w); + } + if (~data & 0x10) + { + memory_set_context(0); + program_write_byte(address, portA_out); + memory_set_context(2); + } + if (~data & 0x20) + { + memory_set_context(0); + portA_in = program_read_byte(address); + memory_set_context(2); + } + if (~data & 0x40) + { + address = (address & 0xff00) | portA_out; + } + if (~data & 0x80) + { + address = (address & 0x00ff) | (portA_out << 8); + } +} + +/* + * Port C connections: + * + * 0 R ZREADY (1 when the Z80 has written a command in the latch) + * 1 R ZACCEPT (1 when the Z80 has read data from the latch) + * 2 R from Z80 !BUSAK pin + * 3 R 68INTAK (goes 0 when the interrupt request done with 68INTRQ + * passes through) + */ + +READ8_HANDLER( pitnrun_68705_portC_r ) +{ + return (zready << 0) | (zaccept << 1); +} + + + |