diff options
Diffstat (limited to 'src/mess/machine/pc1401.c')
-rw-r--r-- | src/mess/machine/pc1401.c | 238 |
1 files changed, 238 insertions, 0 deletions
diff --git a/src/mess/machine/pc1401.c b/src/mess/machine/pc1401.c new file mode 100644 index 00000000000..f8305f56895 --- /dev/null +++ b/src/mess/machine/pc1401.c @@ -0,0 +1,238 @@ +#include "emu.h" +#include "cpu/sc61860/sc61860.h" + +#include "includes/pocketc.h" +#include "includes/pc1401.h" +#include "machine/ram.h" + +/* C-CE while reset, program will not be destroyed! */ + +/* error codes +1 syntax error +2 calculation error +3 illegal function argument +4 too large a line number +5 next without for + return without gosub +6 memory overflow +7 print using error +8 i/o device error +9 other errors*/ + + + +void pc1401_outa(device_t *device, int data) +{ + pc1401_state *state = device->machine().driver_data<pc1401_state>(); + state->m_outa = data; +} + +void pc1401_outb(device_t *device, int data) +{ + pc1401_state *state = device->machine().driver_data<pc1401_state>(); + state->m_outb = data; +} + +void pc1401_outc(device_t *device, int data) +{ + pc1401_state *state = device->machine().driver_data<pc1401_state>(); + //logerror("%g outc %.2x\n", machine.time().as_double(), data); + state->m_portc = data; +} + +int pc1401_ina(device_t *device) +{ + pc1401_state *state = device->machine().driver_data<pc1401_state>(); + int data = state->m_outa; + + if (state->m_outb & 0x01) + data |= device->machine().root_device().ioport("KEY0")->read(); + + if (state->m_outb & 0x02) + data |= device->machine().root_device().ioport("KEY1")->read(); + + if (state->m_outb & 0x04) + data |= device->machine().root_device().ioport("KEY2")->read(); + + if (state->m_outb & 0x08) + data |= device->machine().root_device().ioport("KEY3")->read(); + + if (state->m_outb & 0x10) + data |= device->machine().root_device().ioport("KEY4")->read(); + + if (state->m_outb & 0x20) + { + data |= state->ioport("KEY5")->read(); + + /* At Power Up we fake a 'C-CE' pressure */ + if (state->m_power) + data |= 0x01; + } + + if (state->m_outa & 0x01) + data |= device->machine().root_device().ioport("KEY6")->read(); + + if (state->m_outa & 0x02) + data |= device->machine().root_device().ioport("KEY7")->read(); + + if (state->m_outa & 0x04) + data |= device->machine().root_device().ioport("KEY8")->read(); + + if (state->m_outa & 0x08) + data |= device->machine().root_device().ioport("KEY9")->read(); + + if (state->m_outa & 0x10) + data |= device->machine().root_device().ioport("KEY10")->read(); + + if (state->m_outa & 0x20) + data |= device->machine().root_device().ioport("KEY11")->read(); + + if (state->m_outa & 0x40) + data |= device->machine().root_device().ioport("KEY12")->read(); + + return data; +} + +int pc1401_inb(device_t *device) +{ + pc1401_state *state = device->machine().driver_data<pc1401_state>(); + int data=state->m_outb; + + if (state->ioport("EXTRA")->read() & 0x04) + data |= 0x01; + + return data; +} + +int pc1401_brk(device_t *device) +{ + return (device->machine().root_device().ioport("EXTRA")->read() & 0x01); +} + +int pc1401_reset(device_t *device) +{ + return (device->machine().root_device().ioport("EXTRA")->read() & 0x02); +} + +MACHINE_START( pc1401 ) +{ + device_t *main_cpu = machine.device("maincpu"); + UINT8 *ram = machine.root_device().memregion("maincpu")->base() + 0x2000; + UINT8 *cpu = sc61860_internal_ram(main_cpu); + + machine.device<nvram_device>("cpu_nvram")->set_base(cpu, 96); + machine.device<nvram_device>("ram_nvram")->set_base(ram, 0x2800); +} + +static TIMER_CALLBACK(pc1401_power_up) +{ + pc1401_state *state = machine.driver_data<pc1401_state>(); + state->m_power = 0; +} + +DRIVER_INIT_MEMBER(pc1401_state,pc1401) +{ + int i; + UINT8 *gfx=memregion("gfx1")->base(); +#if 0 + static const char sucker[]={ + /* this routine dump the memory (start 0) + in an endless loop, + the pc side must be started before this + its here to allow verification of the decimal data + in mame disassembler + */ +#if 1 + 18,4,/*lip xl */ + 2,0,/*lia 0 startaddress low */ + 219,/*exam */ + 18,5,/*lip xh */ + 2,0,/*lia 0 startaddress high */ + 219,/*exam */ +/*400f x: */ + /* dump internal rom */ + 18,5,/*lip 4 */ + 89,/*ldm */ + 218,/*exab */ + 18,4,/*lip 5 */ + 89,/*ldm */ + 4,/*ix for increasing x */ + 0,0,/*lii,0 */ + 18,20,/*lip 20 */ + 53, /* */ + 18,20,/* lip 20 */ + 219,/*exam */ +#else + 18,4,/*lip xl */ + 2,255,/*lia 0 */ + 219,/*exam */ + 18,5,/*lip xh */ + 2,255,/*lia 0 */ + 219,/*exam */ +/*400f x: */ + /* dump external memory */ + 4, /*ix */ + 87,/* ldd */ +#endif + 218,/*exab */ + + + + 0,4,/*lii 4 */ + + /*a: */ + 218,/* exab */ + 90,/* sl */ + 218,/* exab */ + 18,94,/* lip 94 */ + 96,252,/* anma 252 */ + 2,2, /*lia 2 */ + 196,/* adcm */ + 95,/* outf */ + /*b: */ + 204,/*inb */ + 102,128,/*tsia 0x80 */ +#if 0 + 41,4,/* jnzm b */ +#else + /* input not working reliable! */ + /* so handshake removed, PC side must run with disabled */ + /* interrupt to not lose data */ + 78,20, /*wait 20 */ +#endif + + 218,/* exab */ + 90,/* sl */ + 218,/* exab */ + 18,94,/* lip 94 */ + 96,252,/*anma 252 */ + 2,0,/* lia 0 */ + 196,/*adcm */ + 95,/* outf */ + /*c: */ + 204,/*inb */ + 102,128,/*tsia 0x80 */ +#if 0 + 57,4,/* jzm c */ +#else + 78,20, /*wait 20 */ +#endif + + 65,/*deci */ + 41,34,/*jnzm a */ + + 41,41,/*jnzm x: */ + + 55,/* rtn */ + }; + + for (i=0; i<sizeof(sucker);i++) pc1401_mem[0x4000+i]=sucker[i]; + logerror("%d %d\n",i, 0x4000+i); +#endif + + for (i=0; i<128; i++) + gfx[i]=i; + + m_power = 1; + machine().scheduler().timer_set(attotime::from_seconds(1), FUNC(pc1401_power_up)); +} |