t_stat lpt_devio(uint32 dev, uint64 *data) { UNIT *uptr = &lpt_unit; switch(dev & 3) { case CONI: *data = uptr->STATUS; if ((uptr->flags & UNIT_UC) == 0) *data |= C96; if ((uptr->flags & UNIT_ATT) == 0) *data |= ERR_FLG; sim_debug(DEBUG_CONI, &lpt_dev, "LP CONI %012llo PC=%06o\n", *data, PC); break; case CONO: clr_interrupt(dev); sim_debug(DEBUG_CONO, &lpt_dev, "LP CONO %012llo PC=%06o\n", *data, PC); uptr->STATUS = ((PI_DONE|PI_ERROR|DONE_FLG|BUSY_FLG) & *data); if (*data & CLR_LPT) { uptr->CHR = 0; uptr->CHL = 0; uptr->STATUS |= BUSY_FLG; sim_activate (&lpt_unit, lpt_unit.wait); } if ((uptr->flags & UNIT_ATT) == 0) { set_interrupt(dev, (uptr->STATUS >> 3)); } if (uptr->STATUS & DONE_FLG) set_interrupt(dev, uptr->STATUS); break; case DATAO: if ((uptr->STATUS & BUSY_FLG) == 0) { uptr->CHL = (int32)(*data >> 15); uptr->CHR = (*data >> 1) & 0037777; uptr->STATUS |= BUSY_FLG; uptr->STATUS &= ~DONE_FLG; clr_interrupt(dev); sim_activate (&lpt_unit, lpt_unit.wait); }
void i860_cpu_device::run_cycle() { CLEAR_FLOW(); m_dim_cc_valid = false; m_flow &= ~DIM_OP; UINT64 insn64 = ifetch64(m_pc); if(!(m_pc & 4)) { UINT32 savepc = m_pc; #if ENABLE_DEBUGGER if(m_single_stepping) debugger(0,0); #endif UINT32 insnLow = insn64; if(insnLow == INSN_FNOP_DIM) { if(m_dim) m_flow |= DIM_OP; else m_flow &= ~DIM_OP; } else if((insnLow & INSN_MASK_DIM) == INSN_FP_DIM) m_flow |= DIM_OP; decode_exec(insnLow); if (PENDING_TRAP()) { handle_trap(savepc); goto done; } else if(GET_PC_UPDATED()) { goto done; } else { // If the PC wasn't updated by a control flow instruction, just bump to next sequential instruction. m_pc += 4; CLEAR_FLOW(); } } if(m_pc & 4) { UINT32 savepc = m_pc; #if ENABLE_DEBUGGER if(m_single_stepping && !(m_dim)) debugger(0,0); #endif UINT32 insnHigh= insn64 >> 32; decode_exec(insnHigh); // only check for external interrupts // - on high-word (speedup) // - not DIM (safety :-) // - when no other traps are pending if(!(m_dim) && !(PENDING_TRAP())) { if(m_flow & EXT_INTR) { m_flow &= ~EXT_INTR; gen_interrupt(); } else clr_interrupt(); } if (PENDING_TRAP()) { handle_trap(savepc); } else if (GET_PC_UPDATED()) { goto done; } else { // If the PC wasn't updated by a control flow instruction, just bump to next sequential instruction. m_pc += 4; } }