Exemple #1
0
t_stat tti_svc (UNIT *uptr)
{
int32 c;

uptr->wait = sim_rtcn_calb (POLL_RATE, TMR_POLL);       /* calibrate poll timer */
sim_activate (uptr, uptr->wait);                        /* continue poll */

tty_shin = 0377;                                        /* assume inactive */
if (tty_lf) {                                           /* auto lf pending? */
    c = 012;                                            /* force lf */
    tty_lf = 0;
    }
else {
    if ((c = sim_poll_kbd ()) < SCPE_KFLAG) return c;   /* no char or error? */
    if (c & SCPE_BREAK) c = 0;                          /* break? */
    else c = sim_tt_inpcvt (c, TT_GET_MODE (uptr->flags));
    tty_lf = ((c & 0177) == 015) && (uptr->flags & UNIT_AUTOLF);
    }
if (tty_mode & TM_KBD) {                                /* keyboard enabled? */
    tty_buf = c;                                        /* put char in buf */
    uptr->pos = uptr->pos + 1;

    ttyio (&tty_dib, ioENF, 0);                         /* set flag */

    if (c) {
        tto_out (c);                                    /* echo? */
        return ttp_out (c);                             /* punch? */
        }
    }
else tty_shin = c;                                      /* no, char shifts in */
return SCPE_OK;
}
Exemple #2
0
t_stat rtc_svc (UNIT *uptr)
{
uint32 i, idx;
int32 t;
t_stat st;

t = sim_rtcn_calb (RTC_HZ_BASE, TMR_RTC);               /* calibrate clock */
sim_activate (uptr, t);                                 /* reactivate unit */
for (i = 0; i < RTC_NUM_EVNTS; i++) {                   /* loop thru events */
    if (rtc_cntr[i] != 0) {                             /* event active? */
        rtc_cntr[i] = rtc_cntr[i] - 1;                  /* decrement */
        if (rtc_cntr[i] == 0) {                         /* expired? */
            idx = rtc_indx[i];
            rtc_cntr[i] = rtc_tab[idx].cntr_reset;      /* reset counter */
            if (rtc_xtra[i] != 0) {                     /* fudge factor? */
                rtc_xtra[i] = rtc_xtra[i] - 1;          /* decr fudge cntr */
                if (rtc_xtra[i] == 0) {                 /* expired? */
                    rtc_cntr[i]++;                      /* extra tick */
                    rtc_xtra[i] = rtc_tab[idx].xtra_reset; /* reset fudge cntr */
                    }                                   /* end fudge = 0 */
                }                                       /* end fudge active */
            if ((rtc_usrv[i] == NULL) ||                /* registered? */
                (rtc_usrv[i]->action == NULL))
                return SCPE_IERR;                       /* should be */
            st = rtc_usrv[i]->action (rtc_usrv[i]);     /* callback */
            if (st != SCPE_OK)                          /* error */
                return st;
            }                                           /* end cntr = 0 */
        }                                               /* end event active */
    }                                                   /* end event loop */
return SCPE_OK;
}
Exemple #3
0
t_stat clk_svc (UNIT *uptr)
{
tmr_poll = sim_rtcn_calb (clk_tps, TMR_CLK);            /* calibrate clock */
sim_activate_after (uptr, 1000000/clk_tps);             /* reactivate unit */
tmxr_poll = tmr_poll * TMXR_MULT;                       /* set mux poll */
AIO_SET_INTERRUPT_LATENCY(tmr_poll*clk_tps);            /* set interrrupt latency */
return SCPE_OK;
}
Exemple #4
0
static t_stat clk_service (UNIT *uptr)
{
dprintf (clk_dev, DEB_PSERV, "Service entered with counter %u increment %u limit %u\n",
         count_register, increment, limit_register);

prescaler = prescaler - 1;                              /* decrement the prescaler count */

if (prescaler == 0) {                                       /* if the prescaler count has expired */
    count_register = count_register + increment & R_MASK;   /*   then the count register counts up */

    if (count_register == limit_register) {             /* if the limit has been reached */
        if (limit_irq == SET)                           /*   then if the last limit interrupt wasn't serviced */
            lost_tick_irq = SET;                        /*     then set the overflow interrupt */
        else                                            /*   otherwise */
            limit_irq = SET;                            /*     set the limit interrupt */

        if (control_word & CN_COUNT_RESET)              /* if the counter reset option is selected */
            count_register = 0;                         /*   then clear the count register */

        if (control_word & CN_IRQ_ENABLE                /* if clock interrupts are enabled */
          && clk_dib.interrupt_active == CLEAR) {       /*   and the interrupt active flip-flop is clear */
            clk_dib.interrupt_request = SET;            /*     then request an interrupt */
            iop_assert_INTREQ (&clk_dib);               /*       and notify the IOP of the INTREQ signal */
            }
        }

    if (uptr->flags & UNIT_CALTIME)                     /* if in calibrated timing mode */
        prescaler = scale [rate];                       /*   then reset the prescaler */
    else                                                /* otherwise */
        prescaler = 1;                                  /*   the prescaler isn't used */
    }

if (!(uptr->flags & UNIT_CALTIME)) {                    /* if the clock is in real timing mode */
    uptr->wait = delay [rate];                          /*   then set an event-based delay */
    increment = 1;                                      /*     equal to the selected period */
    coscheduled = FALSE;                                /* the clock is not coscheduled with the process clock */
    }

else if (coschedulable && cpu_is_calibrated) {          /* otherwise if the process clock is calibrated */
    uptr->wait = sim_activate_time (cpu_pclk_uptr);     /*   then synchronize with it */
    increment = CLK_MULTIPLIER;                         /*     at one-tenth of the selected period */
    coscheduled = TRUE;                                 /* the clock is coscheduled with the process clock */
    }

else {                                                  /* otherwise */
    uptr->wait = sim_rtcn_calb (ticks [rate], TMR_CLK); /*   calibrate the clock to a delay */
    increment = 1;                                      /*     equal to the selected period */
    coscheduled = FALSE;                                /* the clock is not coscheduled with the process clock */
    }

dprintf (clk_dev, DEB_PSERV, "Rate %s delay %d service %s\n",
         rate_name [rate], uptr->wait,
         (coscheduled ? "coscheduled" : "scheduled"));

return sim_activate (uptr, uptr->wait);                 /* activate the unit and return the status */
}
void tmr_sched (uint32 nicr)
{
uint32 usecs = (nicr) ? (~nicr + 1) : 0xFFFFFFFF;

clk_tps = (int32)((1000000.0 / usecs) + 0.5);

sim_debug (TMR_DB_SCHED, &tmr_dev, "tmr_sched(nicr=0x%08X-usecs=0x%08X) - tps=%d\n", nicr, usecs, clk_tps);
tmr_poll = sim_rtcn_calb (clk_tps, TMR_CLK);
sim_activate_after (&tmr_unit, usecs);
}
t_stat clk_svc (UNIT *uptr)
{
tmr_poll = sim_rtcn_calb (clk_tps, TMR_CLK);            /* calibrate clock */
sim_activate (&clk_unit, tmr_poll);                     /* reactivate unit */
tmxr_poll = tmr_poll * TMXR_MULT;                       /* set mux poll */
todr_reg = todr_reg + 1;                                /* incr TODR */
if ((tmr_iccs & TMR_CSR_RUN) && tmr_use_100hz)          /* timer on, std intvl? */
    tmr_incr (TMR_INC);                                 /* do timer service */
return SCPE_OK;
}
Exemple #7
0
t_stat clk_svc (UNIT *uptr)
{
tmr_poll = sim_rtcn_calb (clk_tps, TMR_CLK);            /* calibrate clock */
sim_activate_after (uptr, 1000000/clk_tps);             /* reactivate unit */
tmxr_poll = tmr_poll * TMXR_MULT;                       /* set mux poll */
AIO_SET_INTERRUPT_LATENCY(tmr_poll*clk_tps);            /* set interrrupt latency */
if ((tmr_iccs & TMR_CSR_RUN) && tmr_use_100hz)          /* timer on, std intvl? */
    tmr_incr (TMR_INC);                                 /* do timer service */
return SCPE_OK;
}
Exemple #8
0
t_stat clk_svc (UNIT *uptr)
{
int32 t;

dev_done = dev_done | INT_CLK;                          /* set done */
int_req = INT_UPDATE;                                   /* update interrupts */
t = sim_rtcn_calb (clk_tps, TMR_CLK);                   /* calibrate clock */
sim_activate (&clk_unit, t);                            /* reactivate unit */
tmxr_poll = t;                                          /* set mux poll */
return SCPE_OK;
}
Exemple #9
0
t_stat pclk_svc (UNIT *uptr)
{
int32 rv;

pclk_tick ();                                           /* tick clock */
if ((pclk_csr & CSR_GO) == 0)                           /* done? */
    return SCPE_OK;
rv = CSR_GETRATE (pclk_csr);                            /* get rate */
sim_activate (&pclk_unit, sim_rtcn_calb (rate[rv], TMR_PCLK));
return SCPE_OK;
}
Exemple #10
0
void tmr_sched (uint32 nicr)
{
uint32 usecs = (nicr) ? (~nicr + 1) : 0xFFFFFFFF;

clk_tps = 1000000 / usecs;

sim_debug (TMR_DB_SCHED, &tmr_dev, "tmr_sched(nicr=0x%08X-usecs=0x%08X) - tps=%d\n", nicr, usecs, clk_tps);
tmr_poll = sim_rtcn_calb (clk_tps, TMR_CLK);
if (SCPE_OK == sim_activate_after (&tmr_unit, usecs))
    tmr_sav = sim_grtime();                             /* Save interval base time */
}
Exemple #11
0
t_stat clk_svc (UNIT *uptr)
{
int32 t;

clk_csr = clk_csr | CSR_DONE;                           /* set done */
if ((clk_csr & CSR_IE) || clk_fie) SET_INT (CLK);
t = sim_rtcn_calb (clk_tps, TMR_CLK);                   /* calibrate clock */
sim_activate (&clk_unit, t);                            /* reactivate unit */
tmr_poll = t;                                           /* set timer poll */
tmxr_poll = t;                                          /* set mux poll */
return SCPE_OK;
}
Exemple #12
0
static t_stat clk_svc (UNUSED UNIT * up)
{
    // only valid for TR
#ifdef USE_IDLE
    sim_activate (& TR_clk_unit [0], sim_rtcn_init(CLK_TR_HZ, TR_CLK));
#else
    (void) sim_rtcn_calb (CLK_TR_HZ, TR_CLK);   // calibrate clock
#endif
    uint32 t = sim_is_active(&TR_clk_unit[0]);
    sim_debug (DBG_INFO, & clk_dev, "clk_svc: TR has %d time units left\n", t);
    return 0;
}
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");
        }
    }
}
Exemple #14
0
t_stat clk_svc (UNIT *uptr)
{
int32 t;

if (clk_csr & CSR_IE)
    SET_INT (CLK);
t = sim_rtcn_calb (clk_tps, TMR_CLK);                   /* calibrate clock */
sim_activate_after (&clk_unit, 1000000/clk_tps);        /* reactivate unit */
tmr_poll = t;                                           /* set tmr poll */
tmxr_poll = t * TMXR_MULT;                              /* set mux poll */
if (!todr_blow && todr_reg)                             /* if running? */
    todr_reg = todr_reg + 1;                            /* incr TODR */
return SCPE_OK;
}
Exemple #15
0
t_stat clk_svc (UNIT *uptr)
{
if (clk_dev.flags & DEV_DIS)                            /* disabled? */
    return SCPE_OK;
tmxr_poll = sim_rtcn_calb (CLK_TPS, TMR_CLK);           /* calibrate clock */
sim_activate (&clk_unit, tmxr_poll);                    /* reactivate unit */
clk_cntr = clk_cntr + CLK_CNTS;                         /* incr counter */
if ((clk_cntr % CLK_C32MS) == 0)                        /* 32ms interval? */
    dev_req_int (clk32ms_sbs);                          /* req intr */
if (clk_cntr >= CLK_C1MIN) {                            /* 1min interval? */
    dev_req_int (clk1min_sbs);                          /* req intr */
    clk_cntr = 0;                                       /* reset counter */
    }
return SCPE_OK;
}
Exemple #16
0
t_stat XX_clk_svc(UNIT *up)
{
    // only valid for TR
#if 0
    tmr_poll = sim_rtcn_calb (clk_tps, TMR_CLK);            /* calibrate clock */
    sim_activate (&clk_unit, tmr_poll);                     /* reactivate unit */
    tmxr_poll = tmr_poll * TMXR_MULT;                       /* set mux poll */
    todr_reg = todr_reg + 1;                                /* incr TODR */
    if ((tmr_iccs & TMR_CSR_RUN) && tmr_use_100hz)          /* timer on, std intvl? */
        tmr_incr (TMR_INC);                                 /* do timer service */
    return 0;
#else
    return 2;
#endif
}
Exemple #17
0
t_stat clk_svc (UNIT *uptr)
{
if (!clk.control)                                       /* control clear? */
    return SCPE_OK;                                     /* done */

if (clk_unit.flags & UNIT_DIAG)                         /* diag mode? */
    clk_tick = clk_delay (0);                           /* get fixed delay */
else if (clk_select == 2)                               /* 10 msec period? */
    clk_tick = sync_poll (SERVICE);                     /* sync poll */
else
    clk_tick = sim_rtcn_calb (clk_tps[clk_select], TMR_CLK);    /* calibrate delay */

sim_activate (uptr, clk_tick);                          /* reactivate */
clk_ctr = clk_ctr - 1;                                  /* decrement counter */
if (clk_ctr <= 0) {                                     /* end of interval? */
    if (clk.flag)
        clk_error = CLK_ERROR;                          /* overrun? error */
    else
        clkio (&clk_dib, ioENF, 0);                     /* set flag */
    clk_ctr = clk_delay (1);                            /* reset counter */
    }
return SCPE_OK;
}