Пример #1
0
void tto_echo (int32 c)
{
uint32 cnt;

cnt = 1;
if (c == '\r')
    tto_pos = 0;
else if (c == '\n') {
    tto_pos = 0;
    sim_putchar ('\r');
    tt_unit[TTO].pos = tt_unit[TTO].pos + 1;
    }
else if (c == '\t') {
    c = ' ';
    cnt = 8 - (tto_pos % 8);
    }
else c = sim_tt_outcvt (c, TT_GET_MODE (tt_unit[TTO].flags));
if (c >= 0) {
    while (cnt-- > 0) {
        sim_putchar (c);
        tto_pos++;
        tt_unit[TTO].pos = tt_unit[TTO].pos + 1;
        }
    }
return;
}
Пример #2
0
t_stat ttpi_svc (UNIT *uptr)
{
int32 c, out;

sim_activate (uptr, KBD_WAIT (uptr->wait, lfc_poll));   /* continue poll */
ttp_sta = ttp_sta & ~STA_FR;                            /* clear break */
if ((c = sim_poll_kbd ()) < SCPE_KFLAG)                 /* no char or error? */
    return c;
ttp_sta = ttp_sta & ~STA_PF;                            /* clear parity err */
if (ttp_kchp)                                           /* overrun? */
    ttp_sta = ttp_sta | STA_OVR;
if (ttp_karm)
    SET_INT (v_TTP);
if (c & SCPE_BREAK) {                                   /* break? */
    ttp_sta = ttp_sta | STA_FR;                         /* framing error */
    uptr->buf = 0;                                      /* no character */
    }
else {
    out = c & 0x7F;                                     /* echo is 7b */
    c = sim_tt_inpcvt (c, TT_GET_MODE (uptr->flags));
    if (TT_GET_MODE (uptr->flags) != TT_MODE_8B)        /* not 8b mode? */
        c = pas_par (ttp_cmd, c);                       /* apply parity */
    uptr->buf = c;                                      /* save char */
    uptr->pos = uptr->pos + 1;                          /* incr count */
    ttp_kchp = 1;                                       /* char pending */
    if (ttp_cmd & CMD_ECHO) {
        out = sim_tt_outcvt (out, TT_GET_MODE (uptr->flags));
        if (c >= 0)
            sim_putchar (out);
        ttp_unit[TTO].pos = ttp_unit[TTO].pos + 1;
        }
    }
return SCPE_OK;
}
Пример #3
0
t_stat tto_write (int32 c)
{
UNIT *tuptr = &tty_unit[TTO];

c = sim_tt_outcvt (c, TT_GET_MODE (tuptr->flags) | TTUF_KSR);
tuptr->pos = tuptr->pos + 1;
if (c >= 0)
    return sim_putchar_s (c);
else return SCPE_OK;
}
Пример #4
0
t_stat tto_out (int32 c)
{
t_stat r;

if (tty_mode & TM_PRI) {                                /* printing? */
    c = sim_tt_outcvt (c, TT_GET_MODE (tty_unit[TTO].flags));
    if (c >= 0) {                                       /* valid? */
        r = sim_putchar_s (c);                          /* output char */
        if (r != SCPE_OK)
            return r;
        tty_unit[TTO].pos = tty_unit[TTO].pos + 1;
        }
    }
return SCPE_OK;
}
Пример #5
0
t_stat tto_svc (UNIT *uptr)
{
int32 c;
t_stat r;

c = sim_tt_outcvt (uptr->buf, TT_GET_MODE (uptr->flags) | TTUF_KSR);
if (c >= 0) {
    if ((r = sim_putchar_s (c)) != SCPE_OK) {           /* output; error? */
        sim_activate (uptr, uptr->wait);                /* try again */
        return ((r == SCPE_STALL)? SCPE_OK: r);         /* !stall? report */
        }
    }
dev_done = dev_done | INT_TTO;                          /* set ready */
uptr->pos = uptr->pos + 1;
return SCPE_OK;
}
Пример #6
0
t_stat tto_svc (UNIT *uptr)
{
int32 c;
t_stat r;

c = sim_tt_outcvt (uptr->buf, TT_GET_MODE (uptr->flags));
if (c >= 0) {
    if ((r = sim_putchar_s (c)) != SCPE_OK) {           /* output; error? */
        sim_activate (uptr, uptr->wait);                /* try again */
        return ((r == SCPE_STALL)? SCPE_OK: r);         /* !stall? report */
        }
    }
tto_csr = tto_csr | CSR_DONE;
if (tto_csr & CSR_IE) SET_INT (TTO);
uptr->pos = uptr->pos + 1;
return SCPE_OK;
}
Пример #7
0
t_stat tto_svc (UNIT *uptr)
{
int32 c;
t_stat r;

if ((tto_buf & TXDB_SEL) == 0) {                        /* for console? */
    c = sim_tt_outcvt (tto_buf, TT_GET_MODE (uptr->flags));
    if (c >= 0) {
        if ((r = sim_putchar_s (c)) != SCPE_OK) {       /* output; error? */
            sim_activate (uptr, uptr->wait);            /* retry */
            return ((r == SCPE_STALL)? SCPE_OK: r);     /* !stall? report */
            }
        }
    uptr->pos = uptr->pos + 1;
    }
tto_csr = tto_csr | CSR_DONE;
if (tto_csr & CSR_IE)
    tto_int = 1;
return SCPE_OK;
}
Пример #8
0
t_stat ttpo_svc (UNIT *uptr)
{
int32 c;
t_stat r;

if (TT_GET_MODE (uptr->flags) == TT_MODE_8B)            /* 8b? */
    c = pas_par (ttp_cmd, uptr->buf);                   /* apply parity */
else c = sim_tt_outcvt (uptr->buf, TT_GET_MODE (uptr->flags));
if (c >= 0) {
    if ((r = sim_putchar_s (c)) != SCPE_OK) {           /* output; error? */
        sim_activate (uptr, uptr->wait);                /* try again */
        return ((r == SCPE_STALL)? SCPE_OK: r);
        }
    }
ttp_sta = ttp_sta & ~STA_BSY;                           /* not busy */
if (ttp_tarm)                                           /* set intr */
    SET_INT (v_TTP + 1);
uptr->pos = uptr->pos + 1;                              /* incr count */
return SCPE_OK;
}
Пример #9
0
t_stat ttox_svc (UNIT *uptr)
{
int32 c, ln = uptr - ttox_unit;                         /* line # */

if (ttx_ldsc[ln].conn) {                                /* connected? */
    if (ttx_ldsc[ln].xmte) {                            /* tx enabled? */
        TMLN *lp = &ttx_ldsc[ln];                       /* get line */
        c = sim_tt_outcvt (ttox_buf[ln], TT_GET_MODE (ttox_unit[ln].flags) | TTUF_KSR);
        if (c >= 0)                                     /* output char */
            tmxr_putc_ln (lp, c);
        tmxr_poll_tx (&ttx_desc);                       /* poll xmt */
        }
    else {
        tmxr_poll_tx (&ttx_desc);                       /* poll xmt */
        sim_activate (uptr, ttox_unit[ln].wait);        /* wait */
        return SCPE_OK;
        }
    }
ttox_set_done (ln);                                     /* set done */
return SCPE_OK;
}
Пример #10
0
t_stat muxo_svc (UNIT *uptr)
{
    int32 c;
    uint32 ln = uptr - muxl_unit;                           /* line # */

    if (mux_ldsc[ln].conn) {                                /* connected? */
        if (mux_ldsc[ln].xmte) {                            /* xmt enabled? */
            c = sim_tt_outcvt (mux_xbuf[ln], TT_GET_MODE (muxl_unit[ln].flags));
            if (c >= 0)
                tmxr_putc_ln (&mux_ldsc[ln], c);            /* output char */
            tmxr_poll_tx (&mux_desc);                       /* poll xmt */
            if (mux_sta[ln] & MUXL_XIA) {                   /* armed? */
                mux_sta[ln] |= MUXL_XIR;                    /* req intr */
                mux_scan_next (0);                          /* kick scanner */
            }
        }
        else {                                              /* buf full */
            tmxr_poll_tx (&mux_desc);                       /* poll xmt */
            sim_activate (uptr, muxl_unit[ln].wait);        /* wait */
            return SCPE_OK;
        }
    }
    return SCPE_OK;
}
Пример #11
0
t_stat ports_xmt_svc(UNIT *uptr)
{
    uint8 cid, ln;
    char c;
    t_bool tx = FALSE; /* Did a tx ever occur? */
    cio_entry centry = {0};
    uint8 app_data[4] = {0};
    uint32 wait = 0x7fffffff;

    /* Scan all lines for output */
    for (ln = 0; ln < ports_desc.lines; ln++) {
        cid = LCID(ln);
        if (ports_ldsc[ln].conn && ports_state[ln].tx_chars > 0) {
            tx = TRUE; /* Even an attempt at TX counts for rescheduling */
            c = sim_tt_outcvt(pread_b(ports_state[ln].tx_addr),
                              TT_GET_MODE(ports_unit[0].flags));

            /* The PORTS card optionally handles NL->CRLF */
            if (c == 0xa &&
                (ports_state[ln].oflag & ONLCR) &&
                !(ports_state[ln].crlf)) {
                if (tmxr_putc_ln(&ports_ldsc[ln], 0xd) == SCPE_OK) {
                    wait = MIN(wait, ports_ldsc[ln].txdeltausecs);
                    sim_debug(IO_DBG, &ports_dev,
                              "[%08x] [ports_xmt_svc] [LINE %d] XMIT (crlf):  %02x (%c)\n",
                              R[NUM_PC], ln, 0xd, 0xd);
                    /* Indicate that we're in a CRLF translation */
                    ports_state[ln].crlf = TRUE;
                }

                break;
            }

            ports_state[ln].crlf = FALSE;

            if (tmxr_putc_ln(&ports_ldsc[ln], c) == SCPE_OK) {
                wait = MIN(wait, ports_ldsc[ln].txdeltausecs);
                ports_state[ln].tx_chars--;
                ports_state[ln].tx_addr++;
                sim_debug(IO_DBG, &ports_dev,
                          "[%08x] [ports_xmt_svc] [LINE %d] XMIT:         %02x (%c)\n",
                          R[NUM_PC], ln, c, c);
            }

            if (ports_state[ln].tx_chars == 0) {
                sim_debug(TRACE_DBG, &ports_dev,
                          "[%08x] [ports_xmt_svc] Done with xmit, card=%d port=%d. Interrupting.\n",
                          R[NUM_PC], cid, LPORT(ln));
                centry.byte_count = ports_state[ln].tx_req_chars;
                centry.subdevice = LPORT(ln);
                centry.opcode = PPC_XMIT;
                centry.address = ports_state[ln].tx_req_addr;
                app_data[0] = RC_FLU;
                cio_cqueue(cid, CIO_STAT, PPQESIZE, &centry, app_data);
                cio[cid].intr = TRUE;
            }
        }
    }

    tmxr_poll_tx(&ports_desc);

    if (tx) {
        tmxr_activate_after(uptr, wait);
    }

    return SCPE_OK;
}
Пример #12
0
t_stat tto_svc (UNIT *uptr)
{
int32 c = uptr->buf;

#ifdef CYR_CTLN_CTLO
c &= 0177;
if (c == ('N' & 037)) {
    tto_charconv = 1;
    c = -1;
} else if (c == ('O' & 037)) {
    tto_charconv = 0;
    c = -1;
} else if (tto_charconv && c >= '@') {
#ifdef _WIN32
    static uint8 tab[0100] = {
#if 0
        /* Codepage 1251 */
        0376, 0340, 0341, 0366, 0344, 0345, 0364, 0343, /* @ABCDEFG */
        0365, 0350, 0351, 0352, 0353, 0354, 0355, 0356, /* HIJKLMNO */
        0357, 0377, 0360, 0361, 0362, 0363, 0346, 0342, /* PQRSTUVW */
        0374, 0373, 0347, 0370, 0375, 0371, 0367, 0372, /* XYZ[\]^_ */
        0336, 0300, 0301, 0326, 0304, 0305, 0324, 0303, /* `abcdefg */
        0325, 0310, 0311, 0312, 0313, 0314, 0315, 0316, /* hijklmno */
        0317, 0337, 0320, 0321, 0322, 0323, 0306, 0302, /* pqrstuvw */
        0334, 0333, 0307, 0330, 0335, 0331, 0327, 0332, /* xyz{|}~  */
#else
        /* Codepage 866 */
        0356, 0240, 0241, 0346, 0244, 0245, 0344, 0243, /* @ABCDEFG */
        0345, 0250, 0251, 0252, 0253, 0254, 0255, 0256, /* HIJKLMNO */
        0257, 0357, 0340, 0341, 0342, 0343, 0246, 0242, /* PQRSTUVW */
        0354, 0353, 0247, 0350, 0355, 0351, 0347, 0352, /* XYZ[\]^_ */
        0236, 0200, 0201, 0226, 0204, 0205, 0224, 0203, /* `abcdefg */
        0225, 0210, 0211, 0212, 0213, 0214, 0215, 0216, /* hijklmno */
        0217, 0237, 0220, 0221, 0222, 0223, 0206, 0202, /* pqrstuvw */
        0234, 0233, 0207, 0230, 0235, 0231, 0227, 0232, /* xyz{|}~  */
#endif
        };
    c = tab [c - '@'];
#else /* _WIN32 */
    /* UTF-8 */
    static const char *tab[0100] = {
        "ю", "а", "б", "ц", "д", "е", "ф", "г",         /* @ABCDEFG */
        "х", "и", "й", "к", "л", "м", "н", "о",         /* HIJKLMNO */
        "п", "я", "р", "с", "т", "у", "ж", "в",         /* PQRSTUVW */
        "ь", "ы", "з", "ш", "э", "щ", "ч", "ъ",         /* XYZ[\]^_ */
        "Ю", "А", "Б", "Ц", "Д", "Е", "Ф", "Г",         /* `abcdefg */
        "Х", "И", "Й", "К", "Л", "М", "Н", "О",         /* hijklmno */
        "П", "Я", "Р", "С", "Т", "У", "Ж", "В",         /* pqrstuvw */
        "Ь", "Ы", "З", "Ш", "Э", "Щ", "Ч", "Ъ",         /* xyz{|}~  */
        };
    const char *str = tab[c-'@'];
    t_stat r = sim_putchar_s (str[0]);
    if (r != SCPE_OK) {                             /* output; error? */
        sim_activate (uptr, uptr->wait);            /* try again */
        return ((r == SCPE_STALL)? SCPE_OK: r);     /* !stall? report */
        }
    for (c=1; str[c]; c++)
        sim_putchar (str[c]);
    c = -1;
#endif /* _WIN32 */
    }
#else /* CYR_CTLN_CTLO */
c = sim_tt_outcvt (c, TT_GET_MODE (uptr->flags));
#endif /* CYR_CTLN_CTLO */

if (c >= 0) {
    t_stat r = sim_putchar_s (c);
    if (r != SCPE_OK) {                             /* output; error? */
        sim_activate (uptr, uptr->wait);            /* try again */
        return ((r == SCPE_STALL)? SCPE_OK: r);     /* !stall? report */
        }
    }
tto_csr = tto_csr | CSR_DONE;
if (tto_csr & CSR_IE)
    SET_INT (TTO);
uptr->pos = uptr->pos + 1;
return SCPE_OK;
}