199767f8919635c4928607450d9e0abb932109ceToomas Soome/*-
199767f8919635c4928607450d9e0abb932109ceToomas Soome * Copyright (c) 1998 Michael Smith (msmith@freebsd.org)
199767f8919635c4928607450d9e0abb932109ceToomas Soome * Copyright (c) 1997 Kazutaka YOKOTA (yokota@zodiac.mech.utsunomiya-u.ac.jp)
199767f8919635c4928607450d9e0abb932109ceToomas Soome * All rights reserved.
199767f8919635c4928607450d9e0abb932109ceToomas Soome *
199767f8919635c4928607450d9e0abb932109ceToomas Soome * Redistribution and use in source and binary forms, with or without
199767f8919635c4928607450d9e0abb932109ceToomas Soome * modification, are permitted provided that the following conditions
199767f8919635c4928607450d9e0abb932109ceToomas Soome * are met:
199767f8919635c4928607450d9e0abb932109ceToomas Soome * 1. Redistributions of source code must retain the above copyright
199767f8919635c4928607450d9e0abb932109ceToomas Soome * notice, this list of conditions and the following disclaimer.
199767f8919635c4928607450d9e0abb932109ceToomas Soome * 2. Redistributions in binary form must reproduce the above copyright
199767f8919635c4928607450d9e0abb932109ceToomas Soome * notice, this list of conditions and the following disclaimer in the
199767f8919635c4928607450d9e0abb932109ceToomas Soome * documentation and/or other materials provided with the distribution.
199767f8919635c4928607450d9e0abb932109ceToomas Soome *
199767f8919635c4928607450d9e0abb932109ceToomas Soome * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
199767f8919635c4928607450d9e0abb932109ceToomas Soome * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
199767f8919635c4928607450d9e0abb932109ceToomas Soome * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
199767f8919635c4928607450d9e0abb932109ceToomas Soome * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
199767f8919635c4928607450d9e0abb932109ceToomas Soome * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
199767f8919635c4928607450d9e0abb932109ceToomas Soome * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
199767f8919635c4928607450d9e0abb932109ceToomas Soome * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
199767f8919635c4928607450d9e0abb932109ceToomas Soome * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
199767f8919635c4928607450d9e0abb932109ceToomas Soome * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
199767f8919635c4928607450d9e0abb932109ceToomas Soome * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
199767f8919635c4928607450d9e0abb932109ceToomas Soome * SUCH DAMAGE.
199767f8919635c4928607450d9e0abb932109ceToomas Soome *
199767f8919635c4928607450d9e0abb932109ceToomas Soome * Id: probe_keyboard.c,v 1.13 1997/06/09 05:10:55 bde Exp
199767f8919635c4928607450d9e0abb932109ceToomas Soome */
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome#include <sys/cdefs.h>
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome#include <stand.h>
199767f8919635c4928607450d9e0abb932109ceToomas Soome#include <bootstrap.h>
199767f8919635c4928607450d9e0abb932109ceToomas Soome#include <btxv86.h>
199767f8919635c4928607450d9e0abb932109ceToomas Soome#include <machine/psl.h>
199767f8919635c4928607450d9e0abb932109ceToomas Soome#include "libi386.h"
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome#if KEYBOARD_PROBE
199767f8919635c4928607450d9e0abb932109ceToomas Soome#include <machine/cpufunc.h>
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soomestatic int probe_keyboard(void);
199767f8919635c4928607450d9e0abb932109ceToomas Soome#endif
199767f8919635c4928607450d9e0abb932109ceToomas Soomestatic void vidc_probe(struct console *cp);
199767f8919635c4928607450d9e0abb932109ceToomas Soomestatic int vidc_init(struct console *cp, int arg);
199767f8919635c4928607450d9e0abb932109ceToomas Soomestatic void vidc_putchar(struct console *cp, int c);
199767f8919635c4928607450d9e0abb932109ceToomas Soomestatic int vidc_getchar(struct console *cp);
199767f8919635c4928607450d9e0abb932109ceToomas Soomestatic int vidc_ischar(struct console *cp);
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soomestatic int vidc_started;
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome#ifdef TERM_EMU
199767f8919635c4928607450d9e0abb932109ceToomas Soome#define MAXARGS 8
199767f8919635c4928607450d9e0abb932109ceToomas Soome#define KEYBUFSZ 10
199767f8919635c4928607450d9e0abb932109ceToomas Soome#define DEFAULT_FGCOLOR 7
199767f8919635c4928607450d9e0abb932109ceToomas Soome#define DEFAULT_BGCOLOR 0
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soomevoid end_term(void);
199767f8919635c4928607450d9e0abb932109ceToomas Soomevoid bail_out(int c);
199767f8919635c4928607450d9e0abb932109ceToomas Soomevoid vidc_term_emu(int c);
199767f8919635c4928607450d9e0abb932109ceToomas Soomevoid get_pos(int *x, int *y);
199767f8919635c4928607450d9e0abb932109ceToomas Soomevoid curs_move(int *_x, int *_y, int x, int y);
199767f8919635c4928607450d9e0abb932109ceToomas Soomevoid write_char(int c, int fg, int bg);
199767f8919635c4928607450d9e0abb932109ceToomas Soomevoid scroll_up(int rows, int fg, int bg);
199767f8919635c4928607450d9e0abb932109ceToomas Soomevoid CD(void);
199767f8919635c4928607450d9e0abb932109ceToomas Soomevoid CM(void);
199767f8919635c4928607450d9e0abb932109ceToomas Soomevoid HO(void);
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soomestatic unsigned keybuf[KEYBUFSZ]; /* keybuf for extended codes */
199767f8919635c4928607450d9e0abb932109ceToomas Soomestatic int args[MAXARGS], argc;
199767f8919635c4928607450d9e0abb932109ceToomas Soomestatic int fg_c, bg_c, curx, cury;
199767f8919635c4928607450d9e0abb932109ceToomas Soomestatic int esc;
199767f8919635c4928607450d9e0abb932109ceToomas Soome#endif
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soomestruct console text = {
199767f8919635c4928607450d9e0abb932109ceToomas Soome "text",
199767f8919635c4928607450d9e0abb932109ceToomas Soome "internal video/keyboard",
199767f8919635c4928607450d9e0abb932109ceToomas Soome 0,
199767f8919635c4928607450d9e0abb932109ceToomas Soome vidc_probe,
199767f8919635c4928607450d9e0abb932109ceToomas Soome vidc_init,
199767f8919635c4928607450d9e0abb932109ceToomas Soome vidc_putchar,
199767f8919635c4928607450d9e0abb932109ceToomas Soome vidc_getchar,
199767f8919635c4928607450d9e0abb932109ceToomas Soome vidc_ischar,
199767f8919635c4928607450d9e0abb932109ceToomas Soome NULL
199767f8919635c4928607450d9e0abb932109ceToomas Soome};
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soomestatic void
199767f8919635c4928607450d9e0abb932109ceToomas Soomevidc_probe(struct console *cp)
199767f8919635c4928607450d9e0abb932109ceToomas Soome{
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome /* look for a keyboard */
199767f8919635c4928607450d9e0abb932109ceToomas Soome#if KEYBOARD_PROBE
199767f8919635c4928607450d9e0abb932109ceToomas Soome if (probe_keyboard())
199767f8919635c4928607450d9e0abb932109ceToomas Soome#endif
199767f8919635c4928607450d9e0abb932109ceToomas Soome {
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome cp->c_flags |= C_PRESENTIN;
199767f8919635c4928607450d9e0abb932109ceToomas Soome }
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome /* XXX for now, always assume we can do BIOS screen output */
199767f8919635c4928607450d9e0abb932109ceToomas Soome cp->c_flags |= C_PRESENTOUT;
199767f8919635c4928607450d9e0abb932109ceToomas Soome}
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soomestatic int
199767f8919635c4928607450d9e0abb932109ceToomas Soomevidc_init(struct console *cp, int arg)
199767f8919635c4928607450d9e0abb932109ceToomas Soome{
199767f8919635c4928607450d9e0abb932109ceToomas Soome int i;
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome if (vidc_started && arg == 0)
199767f8919635c4928607450d9e0abb932109ceToomas Soome return (0);
199767f8919635c4928607450d9e0abb932109ceToomas Soome vidc_started = 1;
199767f8919635c4928607450d9e0abb932109ceToomas Soome#ifdef TERM_EMU
199767f8919635c4928607450d9e0abb932109ceToomas Soome /* Init terminal emulator */
199767f8919635c4928607450d9e0abb932109ceToomas Soome end_term();
199767f8919635c4928607450d9e0abb932109ceToomas Soome get_pos(&curx, &cury);
199767f8919635c4928607450d9e0abb932109ceToomas Soome curs_move(&curx, &cury, curx, cury);
199767f8919635c4928607450d9e0abb932109ceToomas Soome fg_c = DEFAULT_FGCOLOR;
199767f8919635c4928607450d9e0abb932109ceToomas Soome bg_c = DEFAULT_BGCOLOR;
199767f8919635c4928607450d9e0abb932109ceToomas Soome memset(keybuf, 0, KEYBUFSZ);
199767f8919635c4928607450d9e0abb932109ceToomas Soome#endif
199767f8919635c4928607450d9e0abb932109ceToomas Soome for (i = 0; i < 10 && vidc_ischar(cp); i++)
199767f8919635c4928607450d9e0abb932109ceToomas Soome (void)vidc_getchar(cp);
199767f8919635c4928607450d9e0abb932109ceToomas Soome return (0); /* XXX reinit? */
199767f8919635c4928607450d9e0abb932109ceToomas Soome}
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soomevoid
199767f8919635c4928607450d9e0abb932109ceToomas Soomevidc_biosputchar(int c)
199767f8919635c4928607450d9e0abb932109ceToomas Soome{
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.ctl = 0;
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.addr = 0x10;
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.eax = 0xe00 | (c & 0xff);
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.ebx = 0x7;
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86int();
199767f8919635c4928607450d9e0abb932109ceToomas Soome}
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soomestatic void
199767f8919635c4928607450d9e0abb932109ceToomas Soomevidc_rawputchar(int c)
199767f8919635c4928607450d9e0abb932109ceToomas Soome{
199767f8919635c4928607450d9e0abb932109ceToomas Soome int i;
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome if (c == '\t')
199767f8919635c4928607450d9e0abb932109ceToomas Soome /* lame tab expansion */
199767f8919635c4928607450d9e0abb932109ceToomas Soome for (i = 0; i < 8; i++)
199767f8919635c4928607450d9e0abb932109ceToomas Soome vidc_rawputchar(' ');
199767f8919635c4928607450d9e0abb932109ceToomas Soome else {
199767f8919635c4928607450d9e0abb932109ceToomas Soome#ifndef TERM_EMU
199767f8919635c4928607450d9e0abb932109ceToomas Soome vidc_biosputchar(c);
199767f8919635c4928607450d9e0abb932109ceToomas Soome#else
199767f8919635c4928607450d9e0abb932109ceToomas Soome /* Emulate AH=0eh (teletype output) */
199767f8919635c4928607450d9e0abb932109ceToomas Soome switch(c) {
199767f8919635c4928607450d9e0abb932109ceToomas Soome case '\a':
199767f8919635c4928607450d9e0abb932109ceToomas Soome vidc_biosputchar(c);
199767f8919635c4928607450d9e0abb932109ceToomas Soome return;
199767f8919635c4928607450d9e0abb932109ceToomas Soome case '\r':
199767f8919635c4928607450d9e0abb932109ceToomas Soome curx = 0;
199767f8919635c4928607450d9e0abb932109ceToomas Soome break;
199767f8919635c4928607450d9e0abb932109ceToomas Soome case '\n':
199767f8919635c4928607450d9e0abb932109ceToomas Soome cury++;
199767f8919635c4928607450d9e0abb932109ceToomas Soome if ((text.c_flags & C_MODERAW) == 0)
199767f8919635c4928607450d9e0abb932109ceToomas Soome curx = 0;
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome if (cury > 24) {
199767f8919635c4928607450d9e0abb932109ceToomas Soome scroll_up(1, fg_c, bg_c);
199767f8919635c4928607450d9e0abb932109ceToomas Soome cury--;
199767f8919635c4928607450d9e0abb932109ceToomas Soome }
199767f8919635c4928607450d9e0abb932109ceToomas Soome break;
199767f8919635c4928607450d9e0abb932109ceToomas Soome case '\b':
199767f8919635c4928607450d9e0abb932109ceToomas Soome if (curx > 0)
199767f8919635c4928607450d9e0abb932109ceToomas Soome curx--;
199767f8919635c4928607450d9e0abb932109ceToomas Soome break;
199767f8919635c4928607450d9e0abb932109ceToomas Soome default:
199767f8919635c4928607450d9e0abb932109ceToomas Soome if (curx > 79) {
199767f8919635c4928607450d9e0abb932109ceToomas Soome curx = 0;
199767f8919635c4928607450d9e0abb932109ceToomas Soome cury++;
199767f8919635c4928607450d9e0abb932109ceToomas Soome curs_move(&curx, &cury, curx, cury);
199767f8919635c4928607450d9e0abb932109ceToomas Soome }
199767f8919635c4928607450d9e0abb932109ceToomas Soome if ((text.c_flags & C_MODERAW) == 0) {
199767f8919635c4928607450d9e0abb932109ceToomas Soome if (cury > 24) {
199767f8919635c4928607450d9e0abb932109ceToomas Soome curx = 0;
199767f8919635c4928607450d9e0abb932109ceToomas Soome scroll_up(1, fg_c, bg_c);
199767f8919635c4928607450d9e0abb932109ceToomas Soome cury--;
199767f8919635c4928607450d9e0abb932109ceToomas Soome curs_move(&curx, &cury, curx, cury);
199767f8919635c4928607450d9e0abb932109ceToomas Soome }
199767f8919635c4928607450d9e0abb932109ceToomas Soome }
199767f8919635c4928607450d9e0abb932109ceToomas Soome write_char(c, fg_c, bg_c);
199767f8919635c4928607450d9e0abb932109ceToomas Soome curx++;
199767f8919635c4928607450d9e0abb932109ceToomas Soome if (text.c_flags & C_MODERAW) {
199767f8919635c4928607450d9e0abb932109ceToomas Soome if (curx > 79) {
199767f8919635c4928607450d9e0abb932109ceToomas Soome curx = 0;
199767f8919635c4928607450d9e0abb932109ceToomas Soome if (cury == 25)
199767f8919635c4928607450d9e0abb932109ceToomas Soome scroll_up(1, fg_c, bg_c);
199767f8919635c4928607450d9e0abb932109ceToomas Soome else
199767f8919635c4928607450d9e0abb932109ceToomas Soome cury++;
199767f8919635c4928607450d9e0abb932109ceToomas Soome }
199767f8919635c4928607450d9e0abb932109ceToomas Soome }
199767f8919635c4928607450d9e0abb932109ceToomas Soome }
199767f8919635c4928607450d9e0abb932109ceToomas Soome curs_move(&curx, &cury, curx, cury);
199767f8919635c4928607450d9e0abb932109ceToomas Soome#endif
199767f8919635c4928607450d9e0abb932109ceToomas Soome }
199767f8919635c4928607450d9e0abb932109ceToomas Soome}
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome#ifdef TERM_EMU
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome/* Get cursor position on the screen. Result is in edx. Sets
199767f8919635c4928607450d9e0abb932109ceToomas Soome * curx and cury appropriately.
199767f8919635c4928607450d9e0abb932109ceToomas Soome */
199767f8919635c4928607450d9e0abb932109ceToomas Soomevoid
199767f8919635c4928607450d9e0abb932109ceToomas Soomeget_pos(int *x, int *y)
199767f8919635c4928607450d9e0abb932109ceToomas Soome{
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.ctl = 0;
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.addr = 0x10;
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.eax = 0x0300;
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.ebx = 0x0;
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86int();
199767f8919635c4928607450d9e0abb932109ceToomas Soome *x = v86.edx & 0x00ff;
199767f8919635c4928607450d9e0abb932109ceToomas Soome *y = (v86.edx & 0xff00) >> 8;
199767f8919635c4928607450d9e0abb932109ceToomas Soome}
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome/* Move cursor to x rows and y cols (0-based). */
199767f8919635c4928607450d9e0abb932109ceToomas Soomevoid
199767f8919635c4928607450d9e0abb932109ceToomas Soomecurs_move(int *_x, int *_y, int x, int y)
199767f8919635c4928607450d9e0abb932109ceToomas Soome{
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.ctl = 0;
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.addr = 0x10;
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.eax = 0x0200;
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.ebx = 0x0;
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.edx = ((0x00ff & y) << 8) + (0x00ff & x);
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86int();
199767f8919635c4928607450d9e0abb932109ceToomas Soome if (_x != NULL)
199767f8919635c4928607450d9e0abb932109ceToomas Soome *_x = x;
199767f8919635c4928607450d9e0abb932109ceToomas Soome if (_y != NULL)
199767f8919635c4928607450d9e0abb932109ceToomas Soome *_y = y;
199767f8919635c4928607450d9e0abb932109ceToomas Soome /* If there is ctrl char at this position, cursor would be invisible.
199767f8919635c4928607450d9e0abb932109ceToomas Soome * Make it a space instead.
199767f8919635c4928607450d9e0abb932109ceToomas Soome */
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.ctl = 0;
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.addr = 0x10;
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.eax = 0x0800;
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.ebx = 0x0;
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86int();
199767f8919635c4928607450d9e0abb932109ceToomas Soome#define isvisible(c) (((c) >= 32) && ((c) < 255))
199767f8919635c4928607450d9e0abb932109ceToomas Soome if (!isvisible(v86.eax & 0x00ff)) {
199767f8919635c4928607450d9e0abb932109ceToomas Soome write_char(' ', fg_c, bg_c);
199767f8919635c4928607450d9e0abb932109ceToomas Soome }
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.ctl = 0; /* show normal underline cursor */
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.addr = 0x10;
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.eax = 0x0100;
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.ecx = 0x0607;
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86int();
199767f8919635c4928607450d9e0abb932109ceToomas Soome}
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome/* Scroll up the whole window by a number of rows. If rows==0,
199767f8919635c4928607450d9e0abb932109ceToomas Soome * clear the window. fg and bg are attributes for the new lines
199767f8919635c4928607450d9e0abb932109ceToomas Soome * inserted in the window.
199767f8919635c4928607450d9e0abb932109ceToomas Soome */
199767f8919635c4928607450d9e0abb932109ceToomas Soomevoid
199767f8919635c4928607450d9e0abb932109ceToomas Soomescroll_up(int rows, int fgcol, int bgcol)
199767f8919635c4928607450d9e0abb932109ceToomas Soome{
199767f8919635c4928607450d9e0abb932109ceToomas Soome if (rows == 0)
199767f8919635c4928607450d9e0abb932109ceToomas Soome rows = 25;
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.ctl = 0;
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.addr = 0x10;
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.eax = 0x0600 + (0x00ff & rows);
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.ebx = (bgcol << 12) + (fgcol << 8);
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.ecx = 0x0;
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.edx = 0x184f;
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86int();
199767f8919635c4928607450d9e0abb932109ceToomas Soome}
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome/* Write character and attribute at cursor position. */
199767f8919635c4928607450d9e0abb932109ceToomas Soomevoid
199767f8919635c4928607450d9e0abb932109ceToomas Soomewrite_char(int c, int fgcol, int bgcol)
199767f8919635c4928607450d9e0abb932109ceToomas Soome{
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.ctl = 0;
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.addr = 0x10;
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.eax = 0x0900 + (0x00ff & c);
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.ebx = (bgcol << 4) + fgcol;
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.ecx = 0x1;
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86int();
199767f8919635c4928607450d9e0abb932109ceToomas Soome}
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome/**************************************************************/
199767f8919635c4928607450d9e0abb932109ceToomas Soome/*
199767f8919635c4928607450d9e0abb932109ceToomas Soome * Screen manipulation functions. They use accumulated data in
199767f8919635c4928607450d9e0abb932109ceToomas Soome * args[] and argc variables.
199767f8919635c4928607450d9e0abb932109ceToomas Soome *
199767f8919635c4928607450d9e0abb932109ceToomas Soome */
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome/* Clear line from current position to end of line */
199767f8919635c4928607450d9e0abb932109ceToomas Soomevoid
199767f8919635c4928607450d9e0abb932109ceToomas SoomeCL(int direction)
199767f8919635c4928607450d9e0abb932109ceToomas Soome{
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.ctl = 0;
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.addr = 0x10;
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.eax = 0x0600;
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.ebx = (bg_c << 12) + (fg_c << 8);
199767f8919635c4928607450d9e0abb932109ceToomas Soome if (direction == 0) { /* from cursor to end */
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.ecx = (cury << 8) + curx;
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.edx = (cury << 8) + 79;
199767f8919635c4928607450d9e0abb932109ceToomas Soome } else if (direction == 1) { /* from beginning to cursor */
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.ecx = (cury << 8) + 0;
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.edx = (cury << 8) + curx;
199767f8919635c4928607450d9e0abb932109ceToomas Soome } else if (direction == 2) { /* entire line */
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.ecx = (cury << 8) + 0;
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.edx = (cury << 8) + 79;
199767f8919635c4928607450d9e0abb932109ceToomas Soome }
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86int();
199767f8919635c4928607450d9e0abb932109ceToomas Soome end_term();
199767f8919635c4928607450d9e0abb932109ceToomas Soome return;
199767f8919635c4928607450d9e0abb932109ceToomas Soome}
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome/* Clear display from current position to end of screen */
199767f8919635c4928607450d9e0abb932109ceToomas Soomevoid
199767f8919635c4928607450d9e0abb932109ceToomas SoomeCD(void)
199767f8919635c4928607450d9e0abb932109ceToomas Soome{
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome get_pos(&curx, &cury);
199767f8919635c4928607450d9e0abb932109ceToomas Soome if (curx > 0) {
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.ctl = 0;
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.addr = 0x10;
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.eax = 0x0600;
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.ebx = (bg_c << 12) + (fg_c << 8);
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.ecx = (cury << 8) + curx;
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.edx = (cury << 8) + 79;
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86int();
199767f8919635c4928607450d9e0abb932109ceToomas Soome if (++cury > 24) {
199767f8919635c4928607450d9e0abb932109ceToomas Soome end_term();
199767f8919635c4928607450d9e0abb932109ceToomas Soome return;
199767f8919635c4928607450d9e0abb932109ceToomas Soome }
199767f8919635c4928607450d9e0abb932109ceToomas Soome }
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.ctl = 0;
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.addr = 0x10;
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.eax = 0x0600;
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.ebx = (bg_c << 12) + (fg_c << 8);
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.ecx = (cury << 8) + 0;
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.edx = (24 << 8) + 79;
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86int();
199767f8919635c4928607450d9e0abb932109ceToomas Soome end_term();
199767f8919635c4928607450d9e0abb932109ceToomas Soome}
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome/* Absolute cursor move to args[0] rows and args[1] columns
199767f8919635c4928607450d9e0abb932109ceToomas Soome * (the coordinates are 1-based).
199767f8919635c4928607450d9e0abb932109ceToomas Soome */
199767f8919635c4928607450d9e0abb932109ceToomas Soomevoid
199767f8919635c4928607450d9e0abb932109ceToomas SoomeCM(void)
199767f8919635c4928607450d9e0abb932109ceToomas Soome{
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome if (args[0] > 0)
199767f8919635c4928607450d9e0abb932109ceToomas Soome args[0]--;
199767f8919635c4928607450d9e0abb932109ceToomas Soome if (args[1] > 0)
199767f8919635c4928607450d9e0abb932109ceToomas Soome args[1]--;
199767f8919635c4928607450d9e0abb932109ceToomas Soome curs_move(&curx, &cury, args[1], args[0]);
199767f8919635c4928607450d9e0abb932109ceToomas Soome end_term();
199767f8919635c4928607450d9e0abb932109ceToomas Soome}
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome/* Home cursor (left top corner) */
199767f8919635c4928607450d9e0abb932109ceToomas Soomevoid
199767f8919635c4928607450d9e0abb932109ceToomas SoomeHO(void)
199767f8919635c4928607450d9e0abb932109ceToomas Soome{
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome argc = 1;
199767f8919635c4928607450d9e0abb932109ceToomas Soome args[0] = args[1] = 1;
199767f8919635c4928607450d9e0abb932109ceToomas Soome CM();
199767f8919635c4928607450d9e0abb932109ceToomas Soome}
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome/* Clear internal state of the terminal emulation code */
199767f8919635c4928607450d9e0abb932109ceToomas Soomevoid
199767f8919635c4928607450d9e0abb932109ceToomas Soomeend_term(void)
199767f8919635c4928607450d9e0abb932109ceToomas Soome{
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome esc = 0;
199767f8919635c4928607450d9e0abb932109ceToomas Soome argc = -1;
199767f8919635c4928607450d9e0abb932109ceToomas Soome}
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome/* Gracefully exit ESC-sequence processing in case of misunderstanding */
199767f8919635c4928607450d9e0abb932109ceToomas Soomevoid
199767f8919635c4928607450d9e0abb932109ceToomas Soomebail_out(int c)
199767f8919635c4928607450d9e0abb932109ceToomas Soome{
199767f8919635c4928607450d9e0abb932109ceToomas Soome char buf[16], *ch;
199767f8919635c4928607450d9e0abb932109ceToomas Soome int i;
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome if (esc) {
199767f8919635c4928607450d9e0abb932109ceToomas Soome vidc_rawputchar('\033');
199767f8919635c4928607450d9e0abb932109ceToomas Soome if (esc != '\033')
199767f8919635c4928607450d9e0abb932109ceToomas Soome vidc_rawputchar(esc);
199767f8919635c4928607450d9e0abb932109ceToomas Soome for (i = 0; i <= argc; ++i) {
199767f8919635c4928607450d9e0abb932109ceToomas Soome sprintf(buf, "%d", args[i]);
199767f8919635c4928607450d9e0abb932109ceToomas Soome ch = buf;
199767f8919635c4928607450d9e0abb932109ceToomas Soome while (*ch)
199767f8919635c4928607450d9e0abb932109ceToomas Soome vidc_rawputchar(*ch++);
199767f8919635c4928607450d9e0abb932109ceToomas Soome }
199767f8919635c4928607450d9e0abb932109ceToomas Soome }
199767f8919635c4928607450d9e0abb932109ceToomas Soome vidc_rawputchar(c);
199767f8919635c4928607450d9e0abb932109ceToomas Soome end_term();
199767f8919635c4928607450d9e0abb932109ceToomas Soome}
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soomestatic void
199767f8919635c4928607450d9e0abb932109ceToomas Soomeget_arg(int c)
199767f8919635c4928607450d9e0abb932109ceToomas Soome{
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome if (argc < 0)
199767f8919635c4928607450d9e0abb932109ceToomas Soome argc = 0;
199767f8919635c4928607450d9e0abb932109ceToomas Soome args[argc] *= 10;
199767f8919635c4928607450d9e0abb932109ceToomas Soome args[argc] += c - '0';
199767f8919635c4928607450d9e0abb932109ceToomas Soome}
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome/* Emulate basic capabilities of sun-color terminal */
199767f8919635c4928607450d9e0abb932109ceToomas Soomevoid
199767f8919635c4928607450d9e0abb932109ceToomas Soomevidc_term_emu(int c)
199767f8919635c4928607450d9e0abb932109ceToomas Soome{
199767f8919635c4928607450d9e0abb932109ceToomas Soome static int ansi_col[] = {
199767f8919635c4928607450d9e0abb932109ceToomas Soome 0, 4, 2, 6, 1, 5, 3, 7,
199767f8919635c4928607450d9e0abb932109ceToomas Soome };
199767f8919635c4928607450d9e0abb932109ceToomas Soome int t;
199767f8919635c4928607450d9e0abb932109ceToomas Soome int i;
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome switch (esc) {
199767f8919635c4928607450d9e0abb932109ceToomas Soome case 0:
199767f8919635c4928607450d9e0abb932109ceToomas Soome switch (c) {
199767f8919635c4928607450d9e0abb932109ceToomas Soome case '\033':
199767f8919635c4928607450d9e0abb932109ceToomas Soome esc = c;
199767f8919635c4928607450d9e0abb932109ceToomas Soome break;
199767f8919635c4928607450d9e0abb932109ceToomas Soome default:
199767f8919635c4928607450d9e0abb932109ceToomas Soome vidc_rawputchar(c);
199767f8919635c4928607450d9e0abb932109ceToomas Soome break;
199767f8919635c4928607450d9e0abb932109ceToomas Soome }
199767f8919635c4928607450d9e0abb932109ceToomas Soome break;
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome case '\033':
199767f8919635c4928607450d9e0abb932109ceToomas Soome switch (c) {
199767f8919635c4928607450d9e0abb932109ceToomas Soome case '[':
199767f8919635c4928607450d9e0abb932109ceToomas Soome esc = c;
199767f8919635c4928607450d9e0abb932109ceToomas Soome args[0] = 0;
199767f8919635c4928607450d9e0abb932109ceToomas Soome argc = -1;
199767f8919635c4928607450d9e0abb932109ceToomas Soome break;
199767f8919635c4928607450d9e0abb932109ceToomas Soome default:
199767f8919635c4928607450d9e0abb932109ceToomas Soome bail_out(c);
199767f8919635c4928607450d9e0abb932109ceToomas Soome break;
199767f8919635c4928607450d9e0abb932109ceToomas Soome }
199767f8919635c4928607450d9e0abb932109ceToomas Soome break;
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome case '[':
199767f8919635c4928607450d9e0abb932109ceToomas Soome switch (c) {
199767f8919635c4928607450d9e0abb932109ceToomas Soome case ';':
199767f8919635c4928607450d9e0abb932109ceToomas Soome if (argc < 0) /* XXX */
199767f8919635c4928607450d9e0abb932109ceToomas Soome argc = 0;
199767f8919635c4928607450d9e0abb932109ceToomas Soome else if (argc + 1 >= MAXARGS)
199767f8919635c4928607450d9e0abb932109ceToomas Soome bail_out(c);
199767f8919635c4928607450d9e0abb932109ceToomas Soome else
199767f8919635c4928607450d9e0abb932109ceToomas Soome args[++argc] = 0;
199767f8919635c4928607450d9e0abb932109ceToomas Soome break;
199767f8919635c4928607450d9e0abb932109ceToomas Soome case 'A': /* UP = \E[%dA */
199767f8919635c4928607450d9e0abb932109ceToomas Soome if (argc == 0) {
199767f8919635c4928607450d9e0abb932109ceToomas Soome int x, y;
199767f8919635c4928607450d9e0abb932109ceToomas Soome get_pos(&x, &y);
199767f8919635c4928607450d9e0abb932109ceToomas Soome args[1] = x + 1;
199767f8919635c4928607450d9e0abb932109ceToomas Soome args[0] = y - args[0] + 1;
199767f8919635c4928607450d9e0abb932109ceToomas Soome CM();
199767f8919635c4928607450d9e0abb932109ceToomas Soome } else
199767f8919635c4928607450d9e0abb932109ceToomas Soome bail_out(c);
199767f8919635c4928607450d9e0abb932109ceToomas Soome break;
199767f8919635c4928607450d9e0abb932109ceToomas Soome case 'B': /* DO = \E[%dB */
199767f8919635c4928607450d9e0abb932109ceToomas Soome if (argc == 0) {
199767f8919635c4928607450d9e0abb932109ceToomas Soome int x, y;
199767f8919635c4928607450d9e0abb932109ceToomas Soome get_pos(&x, &y);
199767f8919635c4928607450d9e0abb932109ceToomas Soome args[1] = x + 1;
199767f8919635c4928607450d9e0abb932109ceToomas Soome args[0] = y + args[0] + 1;
199767f8919635c4928607450d9e0abb932109ceToomas Soome CM();
199767f8919635c4928607450d9e0abb932109ceToomas Soome } else
199767f8919635c4928607450d9e0abb932109ceToomas Soome bail_out(c);
199767f8919635c4928607450d9e0abb932109ceToomas Soome break;
199767f8919635c4928607450d9e0abb932109ceToomas Soome case 'C': /* RI = \E[%dC */
199767f8919635c4928607450d9e0abb932109ceToomas Soome if (argc == 0) {
199767f8919635c4928607450d9e0abb932109ceToomas Soome int x, y;
199767f8919635c4928607450d9e0abb932109ceToomas Soome get_pos(&x, &y);
199767f8919635c4928607450d9e0abb932109ceToomas Soome args[1] = args[0] + 1;
199767f8919635c4928607450d9e0abb932109ceToomas Soome args[0] = y + 1;
199767f8919635c4928607450d9e0abb932109ceToomas Soome CM();
199767f8919635c4928607450d9e0abb932109ceToomas Soome } else
199767f8919635c4928607450d9e0abb932109ceToomas Soome bail_out(c);
199767f8919635c4928607450d9e0abb932109ceToomas Soome break;
199767f8919635c4928607450d9e0abb932109ceToomas Soome case 'H': /* ho = \E[H */
199767f8919635c4928607450d9e0abb932109ceToomas Soome if (argc < 0)
199767f8919635c4928607450d9e0abb932109ceToomas Soome HO();
199767f8919635c4928607450d9e0abb932109ceToomas Soome else if (argc == 1)
199767f8919635c4928607450d9e0abb932109ceToomas Soome CM();
199767f8919635c4928607450d9e0abb932109ceToomas Soome else
199767f8919635c4928607450d9e0abb932109ceToomas Soome bail_out(c);
199767f8919635c4928607450d9e0abb932109ceToomas Soome break;
199767f8919635c4928607450d9e0abb932109ceToomas Soome case 'J': /* cd = \E[J */
199767f8919635c4928607450d9e0abb932109ceToomas Soome if (argc < 0)
199767f8919635c4928607450d9e0abb932109ceToomas Soome CD();
199767f8919635c4928607450d9e0abb932109ceToomas Soome else
199767f8919635c4928607450d9e0abb932109ceToomas Soome bail_out(c);
199767f8919635c4928607450d9e0abb932109ceToomas Soome break;
199767f8919635c4928607450d9e0abb932109ceToomas Soome case 'K':
199767f8919635c4928607450d9e0abb932109ceToomas Soome if (argc < 0)
199767f8919635c4928607450d9e0abb932109ceToomas Soome CL(0);
199767f8919635c4928607450d9e0abb932109ceToomas Soome else if (argc == 0)
199767f8919635c4928607450d9e0abb932109ceToomas Soome switch (args[0]) {
199767f8919635c4928607450d9e0abb932109ceToomas Soome case 0:
199767f8919635c4928607450d9e0abb932109ceToomas Soome case 1:
199767f8919635c4928607450d9e0abb932109ceToomas Soome case 2:
199767f8919635c4928607450d9e0abb932109ceToomas Soome CL(args[0]);
199767f8919635c4928607450d9e0abb932109ceToomas Soome break;
199767f8919635c4928607450d9e0abb932109ceToomas Soome default:
199767f8919635c4928607450d9e0abb932109ceToomas Soome bail_out(c);
199767f8919635c4928607450d9e0abb932109ceToomas Soome }
199767f8919635c4928607450d9e0abb932109ceToomas Soome else
199767f8919635c4928607450d9e0abb932109ceToomas Soome bail_out(c);
199767f8919635c4928607450d9e0abb932109ceToomas Soome break;
199767f8919635c4928607450d9e0abb932109ceToomas Soome case 'm':
199767f8919635c4928607450d9e0abb932109ceToomas Soome if (argc < 0) {
199767f8919635c4928607450d9e0abb932109ceToomas Soome fg_c = DEFAULT_FGCOLOR;
199767f8919635c4928607450d9e0abb932109ceToomas Soome bg_c = DEFAULT_BGCOLOR;
199767f8919635c4928607450d9e0abb932109ceToomas Soome }
199767f8919635c4928607450d9e0abb932109ceToomas Soome for (i = 0; i <= argc; ++i) {
199767f8919635c4928607450d9e0abb932109ceToomas Soome switch (args[i]) {
199767f8919635c4928607450d9e0abb932109ceToomas Soome case 0: /* back to normal */
199767f8919635c4928607450d9e0abb932109ceToomas Soome fg_c = DEFAULT_FGCOLOR;
199767f8919635c4928607450d9e0abb932109ceToomas Soome bg_c = DEFAULT_BGCOLOR;
199767f8919635c4928607450d9e0abb932109ceToomas Soome break;
199767f8919635c4928607450d9e0abb932109ceToomas Soome case 1: /* bold */
199767f8919635c4928607450d9e0abb932109ceToomas Soome fg_c |= 0x8;
199767f8919635c4928607450d9e0abb932109ceToomas Soome break;
199767f8919635c4928607450d9e0abb932109ceToomas Soome case 4: /* underline */
199767f8919635c4928607450d9e0abb932109ceToomas Soome case 5: /* blink */
199767f8919635c4928607450d9e0abb932109ceToomas Soome bg_c |= 0x8;
199767f8919635c4928607450d9e0abb932109ceToomas Soome break;
199767f8919635c4928607450d9e0abb932109ceToomas Soome case 7: /* reverse */
199767f8919635c4928607450d9e0abb932109ceToomas Soome t = fg_c;
199767f8919635c4928607450d9e0abb932109ceToomas Soome fg_c = bg_c;
199767f8919635c4928607450d9e0abb932109ceToomas Soome bg_c = t;
199767f8919635c4928607450d9e0abb932109ceToomas Soome break;
199767f8919635c4928607450d9e0abb932109ceToomas Soome case 30: case 31: case 32: case 33:
199767f8919635c4928607450d9e0abb932109ceToomas Soome case 34: case 35: case 36: case 37:
199767f8919635c4928607450d9e0abb932109ceToomas Soome fg_c = ansi_col[args[i] - 30];
199767f8919635c4928607450d9e0abb932109ceToomas Soome break;
199767f8919635c4928607450d9e0abb932109ceToomas Soome case 39: /* normal */
199767f8919635c4928607450d9e0abb932109ceToomas Soome fg_c = DEFAULT_FGCOLOR;
199767f8919635c4928607450d9e0abb932109ceToomas Soome break;
199767f8919635c4928607450d9e0abb932109ceToomas Soome case 40: case 41: case 42: case 43:
199767f8919635c4928607450d9e0abb932109ceToomas Soome case 44: case 45: case 46: case 47:
199767f8919635c4928607450d9e0abb932109ceToomas Soome bg_c = ansi_col[args[i] - 40];
199767f8919635c4928607450d9e0abb932109ceToomas Soome break;
199767f8919635c4928607450d9e0abb932109ceToomas Soome case 49: /* normal */
199767f8919635c4928607450d9e0abb932109ceToomas Soome bg_c = DEFAULT_BGCOLOR;
199767f8919635c4928607450d9e0abb932109ceToomas Soome break;
199767f8919635c4928607450d9e0abb932109ceToomas Soome }
199767f8919635c4928607450d9e0abb932109ceToomas Soome }
199767f8919635c4928607450d9e0abb932109ceToomas Soome end_term();
199767f8919635c4928607450d9e0abb932109ceToomas Soome break;
199767f8919635c4928607450d9e0abb932109ceToomas Soome default:
199767f8919635c4928607450d9e0abb932109ceToomas Soome if (isdigit(c))
199767f8919635c4928607450d9e0abb932109ceToomas Soome get_arg(c);
199767f8919635c4928607450d9e0abb932109ceToomas Soome else
199767f8919635c4928607450d9e0abb932109ceToomas Soome bail_out(c);
199767f8919635c4928607450d9e0abb932109ceToomas Soome break;
199767f8919635c4928607450d9e0abb932109ceToomas Soome }
199767f8919635c4928607450d9e0abb932109ceToomas Soome break;
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome default:
199767f8919635c4928607450d9e0abb932109ceToomas Soome bail_out(c);
199767f8919635c4928607450d9e0abb932109ceToomas Soome break;
199767f8919635c4928607450d9e0abb932109ceToomas Soome }
199767f8919635c4928607450d9e0abb932109ceToomas Soome}
199767f8919635c4928607450d9e0abb932109ceToomas Soome#endif
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soomestatic void
199767f8919635c4928607450d9e0abb932109ceToomas Soomevidc_putchar(struct console *cp, int c)
199767f8919635c4928607450d9e0abb932109ceToomas Soome{
199767f8919635c4928607450d9e0abb932109ceToomas Soome#ifdef TERM_EMU
199767f8919635c4928607450d9e0abb932109ceToomas Soome vidc_term_emu(c);
199767f8919635c4928607450d9e0abb932109ceToomas Soome#else
199767f8919635c4928607450d9e0abb932109ceToomas Soome vidc_rawputchar(c);
199767f8919635c4928607450d9e0abb932109ceToomas Soome#endif
199767f8919635c4928607450d9e0abb932109ceToomas Soome}
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soomestatic int
199767f8919635c4928607450d9e0abb932109ceToomas Soomevidc_getchar(struct console *cp)
199767f8919635c4928607450d9e0abb932109ceToomas Soome{
199767f8919635c4928607450d9e0abb932109ceToomas Soome int i, c;
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome for (i = 0; i < KEYBUFSZ; i++) {
199767f8919635c4928607450d9e0abb932109ceToomas Soome if (keybuf[i] != 0) {
199767f8919635c4928607450d9e0abb932109ceToomas Soome c = keybuf[i];
199767f8919635c4928607450d9e0abb932109ceToomas Soome keybuf[i] = 0;
199767f8919635c4928607450d9e0abb932109ceToomas Soome return (c);
199767f8919635c4928607450d9e0abb932109ceToomas Soome }
199767f8919635c4928607450d9e0abb932109ceToomas Soome }
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome if (vidc_ischar(cp)) {
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.ctl = 0;
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.addr = 0x16;
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.eax = 0x0;
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86int();
199767f8919635c4928607450d9e0abb932109ceToomas Soome if ((v86.eax & 0xff) != 0) {
199767f8919635c4928607450d9e0abb932109ceToomas Soome return (v86.eax & 0xff);
199767f8919635c4928607450d9e0abb932109ceToomas Soome }
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome /* extended keys */
199767f8919635c4928607450d9e0abb932109ceToomas Soome switch (v86.eax & 0xff00) {
199767f8919635c4928607450d9e0abb932109ceToomas Soome case 0x4800: /* up */
199767f8919635c4928607450d9e0abb932109ceToomas Soome keybuf[0] = '[';
199767f8919635c4928607450d9e0abb932109ceToomas Soome keybuf[1] = 'A';
199767f8919635c4928607450d9e0abb932109ceToomas Soome return (0x1b); /* esc */
199767f8919635c4928607450d9e0abb932109ceToomas Soome case 0x4b00: /* left */
199767f8919635c4928607450d9e0abb932109ceToomas Soome keybuf[0] = '[';
199767f8919635c4928607450d9e0abb932109ceToomas Soome keybuf[1] = 'D';
199767f8919635c4928607450d9e0abb932109ceToomas Soome return (0x1b); /* esc */
199767f8919635c4928607450d9e0abb932109ceToomas Soome case 0x4d00: /* right */
199767f8919635c4928607450d9e0abb932109ceToomas Soome keybuf[0] = '[';
199767f8919635c4928607450d9e0abb932109ceToomas Soome keybuf[1] = 'C';
199767f8919635c4928607450d9e0abb932109ceToomas Soome return (0x1b); /* esc */
199767f8919635c4928607450d9e0abb932109ceToomas Soome case 0x5000: /* down */
199767f8919635c4928607450d9e0abb932109ceToomas Soome keybuf[0] = '[';
199767f8919635c4928607450d9e0abb932109ceToomas Soome keybuf[1] = 'B';
199767f8919635c4928607450d9e0abb932109ceToomas Soome return (0x1b); /* esc */
199767f8919635c4928607450d9e0abb932109ceToomas Soome default:
199767f8919635c4928607450d9e0abb932109ceToomas Soome return (-1);
199767f8919635c4928607450d9e0abb932109ceToomas Soome }
199767f8919635c4928607450d9e0abb932109ceToomas Soome } else {
199767f8919635c4928607450d9e0abb932109ceToomas Soome return (-1);
199767f8919635c4928607450d9e0abb932109ceToomas Soome }
199767f8919635c4928607450d9e0abb932109ceToomas Soome}
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soomestatic int
199767f8919635c4928607450d9e0abb932109ceToomas Soomevidc_ischar(struct console *cp)
199767f8919635c4928607450d9e0abb932109ceToomas Soome{
199767f8919635c4928607450d9e0abb932109ceToomas Soome int i;
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome for (i = 0; i < KEYBUFSZ; i++) {
199767f8919635c4928607450d9e0abb932109ceToomas Soome if (keybuf[i] != 0) {
199767f8919635c4928607450d9e0abb932109ceToomas Soome return (1);
199767f8919635c4928607450d9e0abb932109ceToomas Soome }
199767f8919635c4928607450d9e0abb932109ceToomas Soome }
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.ctl = V86_FLAGS;
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.addr = 0x16;
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86.eax = 0x100;
199767f8919635c4928607450d9e0abb932109ceToomas Soome v86int();
199767f8919635c4928607450d9e0abb932109ceToomas Soome return (!V86_ZR(v86.efl));
199767f8919635c4928607450d9e0abb932109ceToomas Soome}
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome#if KEYBOARD_PROBE
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome#define PROBE_MAXRETRY 5
199767f8919635c4928607450d9e0abb932109ceToomas Soome#define PROBE_MAXWAIT 400
199767f8919635c4928607450d9e0abb932109ceToomas Soome#define IO_DUMMY 0x84
199767f8919635c4928607450d9e0abb932109ceToomas Soome#define IO_KBD 0x060 /* 8042 Keyboard */
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome/* selected defines from kbdio.h */
199767f8919635c4928607450d9e0abb932109ceToomas Soome#define KBD_STATUS_PORT 4 /* status port, read */
199767f8919635c4928607450d9e0abb932109ceToomas Soome#define KBD_DATA_PORT 0 /* data port, read/write
199767f8919635c4928607450d9e0abb932109ceToomas Soome * also used as keyboard command
199767f8919635c4928607450d9e0abb932109ceToomas Soome * and mouse command port
199767f8919635c4928607450d9e0abb932109ceToomas Soome */
199767f8919635c4928607450d9e0abb932109ceToomas Soome#define KBDC_ECHO 0x00ee
199767f8919635c4928607450d9e0abb932109ceToomas Soome#define KBDS_ANY_BUFFER_FULL 0x0001
199767f8919635c4928607450d9e0abb932109ceToomas Soome#define KBDS_INPUT_BUFFER_FULL 0x0002
199767f8919635c4928607450d9e0abb932109ceToomas Soome#define KBD_ECHO 0x00ee
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome/* 7 microsec delay necessary for some keyboard controllers */
199767f8919635c4928607450d9e0abb932109ceToomas Soomestatic void
199767f8919635c4928607450d9e0abb932109ceToomas Soomedelay7(void)
199767f8919635c4928607450d9e0abb932109ceToomas Soome{
199767f8919635c4928607450d9e0abb932109ceToomas Soome /*
199767f8919635c4928607450d9e0abb932109ceToomas Soome * I know this is broken, but no timer is available yet at this stage...
199767f8919635c4928607450d9e0abb932109ceToomas Soome * See also comments in `delay1ms()'.
199767f8919635c4928607450d9e0abb932109ceToomas Soome */
199767f8919635c4928607450d9e0abb932109ceToomas Soome inb(IO_DUMMY); inb(IO_DUMMY);
199767f8919635c4928607450d9e0abb932109ceToomas Soome inb(IO_DUMMY); inb(IO_DUMMY);
199767f8919635c4928607450d9e0abb932109ceToomas Soome inb(IO_DUMMY); inb(IO_DUMMY);
199767f8919635c4928607450d9e0abb932109ceToomas Soome}
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome/*
199767f8919635c4928607450d9e0abb932109ceToomas Soome * This routine uses an inb to an unused port, the time to execute that
199767f8919635c4928607450d9e0abb932109ceToomas Soome * inb is approximately 1.25uS. This value is pretty constant across
199767f8919635c4928607450d9e0abb932109ceToomas Soome * all CPU's and all buses, with the exception of some PCI implentations
199767f8919635c4928607450d9e0abb932109ceToomas Soome * that do not forward this I/O address to the ISA bus as they know it
199767f8919635c4928607450d9e0abb932109ceToomas Soome * is not a valid ISA bus address, those machines execute this inb in
199767f8919635c4928607450d9e0abb932109ceToomas Soome * 60 nS :-(.
199767f8919635c4928607450d9e0abb932109ceToomas Soome *
199767f8919635c4928607450d9e0abb932109ceToomas Soome */
199767f8919635c4928607450d9e0abb932109ceToomas Soomestatic void
199767f8919635c4928607450d9e0abb932109ceToomas Soomedelay1ms(void)
199767f8919635c4928607450d9e0abb932109ceToomas Soome{
199767f8919635c4928607450d9e0abb932109ceToomas Soome int i = 800;
199767f8919635c4928607450d9e0abb932109ceToomas Soome while (--i >= 0)
199767f8919635c4928607450d9e0abb932109ceToomas Soome (void)inb(0x84);
199767f8919635c4928607450d9e0abb932109ceToomas Soome}
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome/*
199767f8919635c4928607450d9e0abb932109ceToomas Soome * We use the presence/absence of a keyboard to determine whether the internal
199767f8919635c4928607450d9e0abb932109ceToomas Soome * console can be used for input.
199767f8919635c4928607450d9e0abb932109ceToomas Soome *
199767f8919635c4928607450d9e0abb932109ceToomas Soome * Perform a simple test on the keyboard; issue the ECHO command and see
199767f8919635c4928607450d9e0abb932109ceToomas Soome * if the right answer is returned. We don't do anything as drastic as
199767f8919635c4928607450d9e0abb932109ceToomas Soome * full keyboard reset; it will be too troublesome and take too much time.
199767f8919635c4928607450d9e0abb932109ceToomas Soome */
199767f8919635c4928607450d9e0abb932109ceToomas Soomestatic int
199767f8919635c4928607450d9e0abb932109ceToomas Soomeprobe_keyboard(void)
199767f8919635c4928607450d9e0abb932109ceToomas Soome{
199767f8919635c4928607450d9e0abb932109ceToomas Soome int retry = PROBE_MAXRETRY;
199767f8919635c4928607450d9e0abb932109ceToomas Soome int wait;
199767f8919635c4928607450d9e0abb932109ceToomas Soome int i;
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome while (--retry >= 0) {
199767f8919635c4928607450d9e0abb932109ceToomas Soome /* flush any noise */
199767f8919635c4928607450d9e0abb932109ceToomas Soome while (inb(IO_KBD + KBD_STATUS_PORT) & KBDS_ANY_BUFFER_FULL) {
199767f8919635c4928607450d9e0abb932109ceToomas Soome delay7();
199767f8919635c4928607450d9e0abb932109ceToomas Soome inb(IO_KBD + KBD_DATA_PORT);
199767f8919635c4928607450d9e0abb932109ceToomas Soome delay1ms();
199767f8919635c4928607450d9e0abb932109ceToomas Soome }
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome /* wait until the controller can accept a command */
199767f8919635c4928607450d9e0abb932109ceToomas Soome for (wait = PROBE_MAXWAIT; wait > 0; --wait) {
199767f8919635c4928607450d9e0abb932109ceToomas Soome if (((i = inb(IO_KBD + KBD_STATUS_PORT))
199767f8919635c4928607450d9e0abb932109ceToomas Soome & (KBDS_INPUT_BUFFER_FULL | KBDS_ANY_BUFFER_FULL)) == 0)
199767f8919635c4928607450d9e0abb932109ceToomas Soome break;
199767f8919635c4928607450d9e0abb932109ceToomas Soome if (i & KBDS_ANY_BUFFER_FULL) {
199767f8919635c4928607450d9e0abb932109ceToomas Soome delay7();
199767f8919635c4928607450d9e0abb932109ceToomas Soome inb(IO_KBD + KBD_DATA_PORT);
199767f8919635c4928607450d9e0abb932109ceToomas Soome }
199767f8919635c4928607450d9e0abb932109ceToomas Soome delay1ms();
199767f8919635c4928607450d9e0abb932109ceToomas Soome }
199767f8919635c4928607450d9e0abb932109ceToomas Soome if (wait <= 0)
199767f8919635c4928607450d9e0abb932109ceToomas Soome continue;
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome /* send the ECHO command */
199767f8919635c4928607450d9e0abb932109ceToomas Soome outb(IO_KBD + KBD_DATA_PORT, KBDC_ECHO);
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome /* wait for a response */
199767f8919635c4928607450d9e0abb932109ceToomas Soome for (wait = PROBE_MAXWAIT; wait > 0; --wait) {
199767f8919635c4928607450d9e0abb932109ceToomas Soome if (inb(IO_KBD + KBD_STATUS_PORT) & KBDS_ANY_BUFFER_FULL)
199767f8919635c4928607450d9e0abb932109ceToomas Soome break;
199767f8919635c4928607450d9e0abb932109ceToomas Soome delay1ms();
199767f8919635c4928607450d9e0abb932109ceToomas Soome }
199767f8919635c4928607450d9e0abb932109ceToomas Soome if (wait <= 0)
199767f8919635c4928607450d9e0abb932109ceToomas Soome continue;
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome delay7();
199767f8919635c4928607450d9e0abb932109ceToomas Soome i = inb(IO_KBD + KBD_DATA_PORT);
199767f8919635c4928607450d9e0abb932109ceToomas Soome#ifdef PROBE_KBD_BEBUG
199767f8919635c4928607450d9e0abb932109ceToomas Soome printf("probe_keyboard: got 0x%x.\n", i);
199767f8919635c4928607450d9e0abb932109ceToomas Soome#endif
199767f8919635c4928607450d9e0abb932109ceToomas Soome if (i == KBD_ECHO) {
199767f8919635c4928607450d9e0abb932109ceToomas Soome /* got the right answer */
199767f8919635c4928607450d9e0abb932109ceToomas Soome return (1);
199767f8919635c4928607450d9e0abb932109ceToomas Soome }
199767f8919635c4928607450d9e0abb932109ceToomas Soome }
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome return (0);
199767f8919635c4928607450d9e0abb932109ceToomas Soome}
199767f8919635c4928607450d9e0abb932109ceToomas Soome#endif /* KEYBOARD_PROBE */