--- Net2/arch/i386/isa/pccons.c 2018/04/24 18:12:02 1.1.1.4 +++ Net2/arch/i386/isa/pccons.c 2018/04/24 18:20:06 1.1.1.5 @@ -33,27 +33,10 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * @(#)pccons.c 5.11 (Berkeley) 5/21/91 - * - * PATCHES MAGIC LEVEL PATCH THAT GOT US HERE - * -------------------- ----- ---------------------- - * CURRENT PATCH LEVEL: 5 00083 - * -------------------- ----- ---------------------- - * - * 15 Aug 92 Pace Willisson Patches for X server - * 21 Aug 92 Frank Maclachlan Fixed back-scroll system crash - * 28 Nov 92 Terry Lee Fixed LED's in X mode - * 09 Feb 93 Rich Murphey Added 'BELL' mode in X - * 14 Mar 93 Bruce Evans Added keyboard timeout in pcprobe - * Fixed color/mono test and mono - * kernel color. Added check for - * minor. - * 14 Mar 93 Chris G. Demetriou Moved pg() to i386/cons.c, code - * cleanup, removed ctl-alt-del. + * from: @(#)pccons.c 5.11 (Berkeley) 5/21/91 + * pccons.c,v 1.28 1993/07/12 11:37:17 mycroft Exp */ -static char rcsid[] = "$Header: /var/lib/cvsd/net2/Net2/arch/i386/isa/pccons.c,v 1.1.1.4 2018/04/24 18:12:02 root Exp $"; - /* * code to work keyboard & display for PC-style console */ @@ -62,6 +45,7 @@ static char rcsid[] = "$Header: /var/lib #include "ioctl.h" #include "proc.h" #include "user.h" +#include "select.h" #include "tty.h" #include "uio.h" #include "i386/isa/isa_device.h" @@ -76,11 +60,25 @@ static char rcsid[] = "$Header: /var/lib #include "i386/isa/kbd.h" #include "machine/pc/display.h" +#include "pc.h" +#if NPC > 0 + +#ifndef BEEP_FREQ +#define BEEP_FREQ 1500 +#endif +#ifndef BEEP_TIME +#define BEEP_TIME (hz/4) +#endif + +#define PCBURST 128 + +extern u_short *Crtat; + #ifdef XSERVER /* 15 Aug 92*/ int pc_xmode; #endif /* XSERVER */ -struct tty pccons; +struct tty *pc_tty[1]; struct pcconsoftc { char cs_flags; @@ -127,17 +125,13 @@ struct isa_driver pcdriver = { #define COL 80 #define ROW 25 #define CHR 2 -#define MONO_BASE 0x3B4 -#define MONO_BUF 0xfe0B0000 -#define CGA_BASE 0x3D4 -#define CGA_BUF 0xfe0B8000 -#define IOPHYSMEM 0xA0000 static unsigned int addr_6845 = MONO_BASE; -u_short *Crtat = (u_short *)MONO_BUF; static openf; -char *sgetc(int); +char *sgetc __P((int)); +static sputc __P((u_char, u_char)); + static char *more_chars; static int char_count; @@ -155,6 +149,7 @@ int pcparam(); int ttrstrt(); char partab[]; + extern pcopen(dev_t, int, int, struct proc *); /* * Wait for CP to accept last CP command sent @@ -305,7 +300,11 @@ pcopen(dev, flag, mode, p) if (minor(dev) != 0) return (ENXIO); - tp = &pccons; + if(!pc_tty[0]) { + tp = pc_tty[0] = ttymalloc(); + } else { + tp = pc_tty[0]; + } tp->t_oproc = pcstart; tp->t_param = pcparam; tp->t_dev = dev; @@ -331,8 +330,10 @@ pcclose(dev, flag, mode, p) int flag, mode; struct proc *p; { - (*linesw[pccons.t_line].l_close)(&pccons, flag); - ttyclose(&pccons); + register struct tty *tp = pc_tty[0]; + + (*linesw[tp->t_line].l_close)(tp, flag); + ttyclose(tp); return(0); } @@ -341,7 +342,9 @@ pcread(dev, uio, flag) dev_t dev; struct uio *uio; { - return ((*linesw[pccons.t_line].l_read)(&pccons, uio, flag)); + register struct tty *tp = pc_tty[0]; + + return ((*linesw[tp->t_line].l_read)(tp, uio, flag)); } /*ARGSUSED*/ @@ -349,7 +352,9 @@ pcwrite(dev, uio, flag) dev_t dev; struct uio *uio; { - return ((*linesw[pccons.t_line].l_write)(&pccons, uio, flag)); + register struct tty *tp = pc_tty[0]; + + return ((*linesw[tp->t_line].l_write)(tp, uio, flag)); } /* @@ -360,6 +365,8 @@ pcwrite(dev, uio, flag) pcrint(dev, irq, cpl) dev_t dev; { + register struct tty *tp = pc_tty[0]; + int c; char *cp; @@ -369,7 +376,7 @@ pcrint(dev, irq, cpl) if (pcconsoftc.cs_flags & CSF_POLLING) return; #ifdef KDB - if (kdbrintr(c, &pccons)) + if (kdbrintr(c, tp)) return; #endif if (!openf) @@ -377,11 +384,11 @@ pcrint(dev, irq, cpl) #ifdef XSERVER /* 15 Aug 92*/ /* send at least one character, because cntl-space is a null */ - (*linesw[pccons.t_line].l_rint)(*cp++ & 0xff, &pccons); + (*linesw[tp->t_line].l_rint)(*cp++ & 0xff, tp); #endif /* XSERVER */ while (*cp) - (*linesw[pccons.t_line].l_rint)(*cp++ & 0xff, &pccons); + (*linesw[tp->t_line].l_rint)(*cp++ & 0xff, tp); } #ifdef XSERVER /* 15 Aug 92*/ @@ -394,7 +401,7 @@ pcioctl(dev, cmd, data, flag) dev_t dev; caddr_t data; { - register struct tty *tp = &pccons; + register struct tty *tp = pc_tty[0]; register error; #ifdef XSERVER /* 15 Aug 92*/ @@ -409,10 +416,10 @@ pcioctl(dev, cmd, data, flag) integers. data[0] is the pitch in Hz and data[1] is the duration in msec. */ if (data) { - sysbeep(1187500/ ((int*)data)[0], - ((int*)data)[1] * hz/ 3000); + sysbeep(((int*)data)[0], + (((int*)data)[1] * hz)/ 3000); } else { - sysbeep(0x31b, hz/4); + sysbeep(BEEP_FREQ, BEEP_TIME); } return (0); } @@ -435,48 +442,52 @@ int pcconsintr = 1; pcxint(dev) dev_t dev; { - register struct tty *tp; + register struct tty *tp = pc_tty[0]; register int unit; if (!pcconsintr) return; - pccons.t_state &= ~TS_BUSY; + tp->t_state &= ~TS_BUSY; pcconsoftc.cs_timo = 0; - if (pccons.t_line) - (*linesw[pccons.t_line].l_start)(&pccons); + if (tp->t_line) + (*linesw[tp->t_line].l_start)(tp); else - pcstart(&pccons); + pcstart(tp); } pcstart(tp) - register struct tty *tp; +register struct tty *tp; { - int c, s; + register struct clist *rbp; + int s, len, n; + u_char buf[PCBURST]; s = spltty(); if (tp->t_state & (TS_TIMEOUT|TS_BUSY|TS_TTSTOP)) goto out; - do { - if (RB_LEN(&tp->t_out) <= tp->t_lowat) { + tp->t_state |= TS_BUSY; + splx(s); + /* + * We need to do this outside spl since it could be fairly + * expensive and we don't want our serial ports to overflow. + */ + rbp = &tp->t_outq; + len = q_to_b(rbp, buf, PCBURST); + for (n = 0; n < len; n++) + if (buf[n]) sputc(buf[n], 0); + s = spltty(); + tp->t_state &= ~TS_BUSY; + if (rbp->c_cc) { + tp->t_state |= TS_TIMEOUT; + timeout((timeout_t)ttrstrt, (caddr_t)tp, 1); + } + if (rbp->c_cc <= tp->t_lowat) { if (tp->t_state&TS_ASLEEP) { tp->t_state &= ~TS_ASLEEP; - wakeup((caddr_t)&tp->t_out); - } - if (tp->t_wsel) { - selwakeup(tp->t_wsel, tp->t_state & TS_WCOLL); - tp->t_wsel = 0; - tp->t_state &= ~TS_WCOLL; + wakeup((caddr_t)rbp); } + selwakeup(&tp->t_wsel); } - if (RB_LEN(&tp->t_out) == 0) - goto out; - c = getc(&tp->t_out); - tp->t_state |= TS_BUSY; /* 21 Aug 92*/ - splx(s); - sput(c, 0); - (void)spltty(); - tp->t_state &= ~TS_BUSY; /* 21 Aug 92*/ - } while(1); out: splx(s); } @@ -493,7 +504,6 @@ pccnprobe(cp) /* initialize required fields */ cp->cn_dev = makedev(maj, 0); - cp->cn_tp = &pccons; cp->cn_pri = CN_INTERNAL; } @@ -515,8 +525,8 @@ pccnputc(dev, c) char c; { if (c == '\n') - sput('\r', 1); - sput(c, 1); + sputc('\r', 1); + sputc(c, 1); } /* @@ -526,7 +536,7 @@ pcputchar(c, tp) char c; register struct tty *tp; { - sput(c, 1); + sputc(c, 1); /*if (c=='\n') getchar();*/ } @@ -618,7 +628,7 @@ cursor(int a) outb(addr_6845+1, 18); #endif FAT_CURSOR if (a == 0) - timeout(cursor, 0, hz/10); + timeout((timeout_t)cursor, (caddr_t)0, hz/10); #ifdef XSERVER /* 15 Aug 92*/ } #endif /* XSERVER */ @@ -640,12 +650,15 @@ static char bgansitopc[] = BG_MAGENTA, BG_CYAN, BG_LIGHTGREY}; /* - * sput has support for emulation of the 'pc3' termcap entry. + * sputc has support for emulation of the 'pc3' termcap entry. * if ka, use kernel attributes. */ -sput(c, ka) -u_char c; -u_char ka; +#ifdef __STDC__ +static sputc(u_char c, u_char ka) +#else +static sputc(c, ka) + u_char c, ka; +#endif { int sc = 1; /* do scroll check */ @@ -928,7 +941,7 @@ u_char ka; } } else { if (c == 7) - sysbeep(0x31b, hz/4); + sysbeep(BEEP_FREQ, BEEP_TIME); else { if (vs.so) { wrtchar(c, vs.so_at); @@ -940,7 +953,11 @@ u_char ka; } } if (sc && crtat >= Crtat+vs.ncol*vs.nrow) { /* scroll check */ - if (openf) do (void)sgetc(1); while (scroll); + if (openf) { + (void)sgetc(1); + if (scroll) + sleep((caddr_t)&scroll, PUSER); + } bcopy(Crtat+vs.ncol, Crtat, vs.ncol*(vs.nrow-1)*CHR); fillw ((at << 8) + ' ', Crtat + vs.ncol*(vs.nrow-1), vs.ncol); @@ -1406,7 +1423,7 @@ char *sgetc(noblock) { u_char dt; unsigned key; - static u_char extended = 0; + static u_char extended = 0, lock_down = 0; static char capchar[2]; /* @@ -1421,24 +1438,43 @@ loop: /* * Check for locking keys */ - if (!(dt & 0x80)) + switch (scan_codes[dt & 0x7f].type) { - dt = dt & 0x7f; - switch (scan_codes[dt].type) - { - case NUM: - num ^= 1; - update_led(); + case NUM: + if (dt & 0x80) { + lock_down &= ~NUM; break; - case CAPS: - caps ^= 1; - update_led(); + } + if (lock_down & NUM) + goto loop; + lock_down |= NUM; + num ^= 1; + update_led(); + break; + case CAPS: + if (dt & 0x80) { + lock_down &= ~CAPS; break; - case SCROLL: - scroll ^= 1; - update_led(); + } + if (lock_down & CAPS) + goto loop; + lock_down |= CAPS; + caps ^= 1; + update_led(); + break; + case SCROLL: + if (dt & 0x80) { + lock_down &= ~SCROLL; break; - } + } + if (lock_down & SCROLL) + goto loop; + lock_down |= SCROLL; + scroll ^= 1; + if (!scroll) + wakeup((caddr_t)&scroll); + update_led(); + break; } return (&capchar[0]); } @@ -1489,6 +1525,15 @@ loop: dt = dt & 0x7f; switch (scan_codes[dt].type) { + case NUM: + lock_down &= ~NUM; + break; + case CAPS: + lock_down &= ~CAPS; + break; + case SCROLL: + lock_down &= ~SCROLL; + break; case SHIFT: shift_down = 0; break; @@ -1512,15 +1557,26 @@ loop: * Locking keys */ case NUM: + if (lock_down & NUM) + break; + lock_down |= NUM; num ^= 1; update_led(); break; case CAPS: + if (lock_down & CAPS) + break; + lock_down |= CAPS; caps ^= 1; update_led(); break; case SCROLL: + if (lock_down & SCROLL) + break; + lock_down |= SCROLL; scroll ^= 1; + if (!scroll) + wakeup((caddr_t)&scroll); update_led(); break; @@ -1625,30 +1681,30 @@ getchar() pcconsoftc.cs_flags |= CSF_POLLING; x = splhigh(); - sput('>', 1); + sputc('>', 1); /*while (1) {*/ thechar = *(sgetc(0)); pcconsoftc.cs_flags &= ~CSF_POLLING; splx(x); switch (thechar) { default: if (thechar >= ' ') - sput(thechar, 1); + sputc(thechar, 1); return(thechar); case cr: - case lf: sput('\r', 1); - sput('\n', 1); + case lf: sputc('\r', 1); + sputc('\n', 1); return(lf); case bs: case del: - sput('\b', 1); - sput(' ', 1); - sput('\b', 1); + sputc('\b', 1); + sputc(' ', 1); + sputc('\b', 1); return(thechar); case cntlc: - sput('^', 1) ; sput('C', 1) ; sput('\r', 1) ; sput('\n', 1) ; + sputc('^', 1) ; sputc('C', 1) ; sputc('\r', 1) ; sputc('\n', 1) ; cpu_reset(); case cntld: - sput('^', 1) ; sput('D', 1) ; sput('\r', 1) ; sput('\n', 1) ; + sputc('^', 1) ; sputc('D', 1) ; sputc('\r', 1) ; sputc('\n', 1) ; return(0); } /*}*/ @@ -1685,8 +1741,6 @@ dprintf(flgs, fmt /*, va_alist */) __color = 0; } -consinit() {} - int pcmmap(dev_t dev, int offset, int nprot) { if (offset > 0x20000) @@ -1725,6 +1779,4 @@ pc_xmode_off () } #endif /* XSERVER*/ -/* - * EOF -- File has not been truncated - */ +#endif /* NPC > 0 */