void txdb_func (int32 data) { int32 sel = TXDB_GETSEL (data); /* get selection */ if (sel == TXDB_MISC) { /* misc function? */ switch (data & MISC_MASK) { /* case on function */ case MISC_SWDN: ABORT (STOP_SWDN); break; case MISC_BOOT: con_halt (0, 0); /* set up reboot */ break; case MISC_LEDS0: case MISC_LEDS1: case MISC_LEDS2: case MISC_LEDS3: case MISC_LEDS4: case MISC_LEDS5: case MISC_LEDS6: case MISC_LEDS7: tto_leds = 0x7 & (~((data & MISC_MASK)-MISC_LEDS0)); sim_putchar ('.'); sim_putchar ('0' + tto_leds); sim_putchar ('.'); break; } } else if (sel != 0) RSVD_OPND_FAULT; }
t_stat txdb_misc_wr (int32 data) { int32 sel = TXDB_GETSEL (data); /* get selection */ sim_activate (&tto_unit, tto_unit.wait); /* set up timeout */ if (sel == TXDB_MISC) { /* misc function? */ switch (data & MISC_MASK) { /* case on function */ case MISC_CLWS: case MISC_CLCS: break; case MISC_SWDN: ABORT (STOP_SWDN); break; case MISC_BOOT: con_halt (0, 0); /* set up reboot */ break; } } return SCPE_OK; }
t_stat fl_wr_txdb (int32 data) { int32 sel = TXDB_GETSEL (data); /* get selection */ if (sel == TXDB_FCMD) { /* floppy command? */ fl_fnc = FL_GETFNC (data); /* get function */ if (fl_state != FL_IDLE) /* cmd in prog? */ switch (fl_fnc) { case FL_FNCCA: /* cancel? */ sim_cancel (&fl_unit); /* stop op */ fl_state = FL_DONE; break; default: /* all others */ fl_protocol_error (); return SCPE_OK; } else switch (fl_fnc) { /* idle, case */ case FL_FNCRS: /* read status */ fl_state = FL_READSTA; break; case FL_FNCCA: /* cancel, nop */ fl_state = FL_DONE; break; case FL_FNCRD: case FL_FNCWR: /* data xfer */ case FL_FNCWD: fl_esr = 0; /* clear errors */ fl_ecode = 0; fl_bptr = 0; /* init buffer */ fl_state = FL_RWDS; /* sector next */ break; default: /* all others */ fl_protocol_error (); return SCPE_OK; } sim_activate (&fl_unit, fl_cwait); /* sched command */ } /* end command */ else if (sel == TXDB_FDAT) { /* floppy data? */ switch (fl_state) { /* data */ case FL_RWDS: /* expecting sector */ fl_sector = data & FL_M_SECTOR; fl_state = FL_RWDT; break; case FL_RWDT: /* expecting track */ fl_track = data & FL_M_TRACK; if (fl_fnc == FL_FNCRD) fl_state = FL_READ; else fl_state = FL_FILL; break; case FL_FILL: /* expecting wr data */ fl_buf[fl_bptr++] = data & BMASK; if (fl_bptr >= FL_NUMBY) fl_state = FL_WRITE; break; default: fl_protocol_error (); return SCPE_OK; } sim_activate (&fl_unit, fl_xwait); /* schedule xfer */ } /* end else data */ else { sim_activate (&tto_unit, tto_unit.wait); /* set up timeout */ if (sel == TXDB_COMM) { /* read comm region? */ data = data & COMM_MASK; /* byte to select */ tti_buf = comm_region[data] | COMM_DATA; tti_csr = tti_csr | CSR_DONE; /* set input flag */ if (tti_csr & CSR_IE) tti_int = 1; } else if (sel == TXDB_MISC) { /* misc function? */ switch (data & MISC_MASK) { /* case on function */ case MISC_CLWS: comm_region[COMM_WRMS] = 0; case MISC_CLCS: comm_region[COMM_CLDS] = 0; break; case MISC_SWDN: ABORT (STOP_SWDN); break; case MISC_BOOT: con_halt (0, 0); /* set up reboot */ break; } } } return SCPE_OK; }