t_stat tmr_reset (DEVICE *dptr) { tmr_poll = sim_rtcn_init_unit (&tmr_unit, CLK_DELAY, TMR_CLK); /* init timer */ tmxr_poll = tmr_poll * TMXR_MULT; /* set mux poll */ tmr_iccs = 0; tmr_nicr = 0; tmr_int = 0; sim_cancel (&tmr_unit); /* cancel timer */ return SCPE_OK; }
void iccs_wr (int32 val) { sim_debug_bits_hdr (TMR_DB_REG, &tmr_dev, "iccs_wr()", tmr_iccs_bits, tmr_iccs, val, TRUE); if ((val & TMR_CSR_RUN) == 0) { /* clearing run? */ if (tmr_iccs & TMR_CSR_RUN) { /* run 1 -> 0? */ tmr_icr = icr_rd (); /* update itr */ sim_rtcn_calb (0, TMR_CLK); /* stop timer */ } sim_cancel (&tmr_unit); /* cancel timer */ } if (val & CSR_DONE) /* Interrupt Acked? */ sim_rtcn_tick_ack (20, TMR_CLK); /* Let timers know */ tmr_iccs = tmr_iccs & ~(val & TMR_CSR_W1C); /* W1C csr */ tmr_iccs = (tmr_iccs & ~TMR_CSR_WR) | /* new r/w */ (val & TMR_CSR_WR); if (val & TMR_CSR_XFR) /* xfr set? */ tmr_icr = tmr_nicr; if (val & TMR_CSR_RUN) { /* run? */ if (val & TMR_CSR_XFR) /* new tir? */ sim_cancel (&tmr_unit); /* stop prev */ if (!sim_is_active (&tmr_unit)) { /* not running? */ sim_rtcn_init_unit (&tmr_unit, CLK_DELAY, TMR_CLK); /* init timer */ tmr_sched (tmr_icr); /* activate */ } } else { if (val & TMR_CSR_XFR) /* xfr set? */ tmr_icr = tmr_nicr; if (val & TMR_CSR_SGL) { /* single step? */ tmr_icr = tmr_icr + 1; /* incr tmr */ if (tmr_icr == 0) { /* if ovflo, */ if (tmr_iccs & TMR_CSR_DON) /* done? set err */ tmr_iccs = tmr_iccs | TMR_CSR_ERR; else tmr_iccs = tmr_iccs | TMR_CSR_DON; /* set done */ if (tmr_iccs & TMR_CSR_IE) { /* ie? */ tmr_int = 1; /* set int req */ sim_debug (TMR_DB_INT, &tmr_dev, "tmr_incr() - INT=1\n"); } tmr_icr = tmr_nicr; /* reload tir */ } } } if ((tmr_iccs & (TMR_CSR_DON | TMR_CSR_IE)) != /* update int */ (TMR_CSR_DON | TMR_CSR_IE)) { if (tmr_int) { tmr_int = 0; sim_debug (TMR_DB_INT, &tmr_dev, "iccs_wr() - INT=0\n"); } } }
t_stat clk_reset (DEVICE *dptr) { int32 t; clk_csr = 0; CLR_INT (CLK); if (!sim_is_running) { /* RESET (not IORESET)? */ t = sim_rtcn_init_unit (&clk_unit, clk_unit.wait, TMR_CLK);/* init 100Hz timer */ sim_activate_after (&clk_unit, 1000000/clk_tps); /* activate 100Hz unit */ tmr_poll = t; /* set tmr poll */ tmxr_poll = t * TMXR_MULT; /* set mux poll */ } if (clk_unit.filebuf == NULL) { /* make sure the TODR is initialized */ clk_unit.filebuf = calloc(sizeof(TOY), 1); if (clk_unit.filebuf == NULL) return SCPE_MEM; todr_resync (); } return SCPE_OK; }