static int hw_pal_instance_read_callback (hw_instance *instance, void *buf, unsigned_word len) { DITRACE (pal, ("read - %s (%ld)", (const char*) buf, (long int) len)); return sim_io_read_stdin (buf, len); }
static int hw_com_instance_read(device_instance *instance, void *buf, unsigned_word len) { device *me = device_instance_device(instance); hw_com_device *com = device_data(me); if (com->input.file == NULL) return sim_io_read_stdin(buf, len); else { return fread(buf, 1, len, com->input.file); } }
/* check the console for an available character */ static void scan_hw_pal(hw_pal_device *hw_pal) { char c; int count; count = sim_io_read_stdin(&c, sizeof(c)); switch (count) { case sim_io_not_ready: case sim_io_eof: hw_pal->input.buffer = 0; hw_pal->input.status = 0; break; default: hw_pal->input.buffer = c; hw_pal->input.status = 1; } }
static void read_com(device *me, hw_com_device *com, unsigned_word a, char val[1]) { unsigned_word addr = a % 8; /* the divisor latch is special */ if (com->reg[3] & 0x8 && addr < 2) { *val = com->dlab[addr]; return; } switch (addr) { case 0: /* fifo */ if (!com->modem.carrier) *val = '\0'; if (com->input.ready) { /* read the char in */ if (com->input.file == NULL) { if (sim_io_read_stdin(val, 1) < 0) com->modem.carrier_changed = 1; } else { if (fread(val, 1, 1, com->input.file) == 0) com->modem.carrier_changed = 1; } /* setup for next read */ if (com->modem.carrier_changed) { /* once lost carrier, never ready */ com->modem.carrier = 0; com->input.ready = 0; *val = '\0'; } else if (com->input.delay > 0) { com->input.ready = 0; device_event_queue_schedule(me, com->input.delay, make_read_ready, me); } } else { /* discard it? */ /* overflow input fifo? */ *val = '\0'; } break; case 2: /* interrupt ident */ if (com->interrupting) { if (com->input.interrupting) *val = 0x4; else if (com->output.interrupting) *val = 0x2; else if (com->modem.interrupting == 0) *val = 0; else device_error(me, "bad elif for interrupts\n"); } else *val = 0x1; break; case 5: /* line status */ *val = ((com->input.ready ? 0x1 : 0) | (com->output.ready ? 0x60 : 0) ); break; case 6: /* modem status */ *val = ((com->modem.carrier_changed ? 0x08 : 0) | (com->modem.carrier ? 0x80 : 0) ); com->modem.carrier_changed = 0; break; default: *val = com->reg[addr]; break; } update_com_interrupts(me, com); }