diff options
Diffstat (limited to 'sys/dev')
-rw-r--r-- | sys/dev/syscons/syscons.c | 818 |
1 files changed, 432 insertions, 386 deletions
diff --git a/sys/dev/syscons/syscons.c b/sys/dev/syscons/syscons.c index e43f3c1..c7c49c3 100644 --- a/sys/dev/syscons/syscons.c +++ b/sys/dev/syscons/syscons.c @@ -34,19 +34,13 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * from:@(#)syscons.c 1.3 940129 - * $Id: syscons.c,v 1.48 1994/08/13 03:50:16 wollman Exp $ - * + * $Id: syscons.c,v 1.1 1994/07/03 20:50:34 sos Exp $ */ #include "sc.h" #if NSC > 0 -#if !defined(__FreeBSD__) -#define FAT_CURSOR -#endif - #include <sys/param.h> #include <sys/systm.h> #include <sys/conf.h> @@ -63,18 +57,21 @@ #include <i386/isa/isa.h> #include <i386/isa/isa_device.h> #include <i386/isa/timerreg.h> +#include <i386/isa/kbdtables.h> #include <i386/i386/cons.h> #include <machine/console.h> #include <machine/psl.h> #include <machine/frame.h> #include <machine/pc/display.h> -#include <i386/isa/iso8859.font> -#include <i386/isa/kbdtables.h> #if !defined(NCONS) #define NCONS 12 #endif +#if !defined(NO_HARDFONTS) +#include <i386/isa/iso8859.font> +#endif + /* status flags */ #define LOCK_KEY_MASK 0x0000F #define LED_MASK 0x00007 @@ -87,15 +84,21 @@ #define VIDEOMEM 0x000A0000 /* misc defines */ -#define MAX_ESC_PAR 3 +#define MAX_ESC_PAR 5 #define TEXT80x25 1 #define TEXT80x50 2 +#define LOAD 1 +#define SAVE 0 #define COL 80 #define ROW 25 #define BELL_DURATION 5 #define BELL_PITCH 800 #define TIMER_FREQ 1193182 /* should be in isa.h */ -#define PCBURST 256 +#define CONSOLE_BUFSIZE 1024 +#define PCBURST 128 +#define FONT_8_LOADED 0x001 +#define FONT_14_LOADED 0x002 +#define FONT_16_LOADED 0x004 /* defines related to hardware addresses */ #define MONO_BASE 0x3B4 /* crt controller base mono */ @@ -164,33 +167,37 @@ static default_attr kernel_default = { (FG_BLACK | BG_LIGHTGREY) << 8 }; -#define CONSOLE_BUFFER_SIZE 1024 -int console_buffer_count; -char console_buffer[CONSOLE_BUFFER_SIZE]; - static scr_stat console[NCONS]; static scr_stat *cur_console = &console[0]; static scr_stat *new_scp, *old_scp; static term_stat kernel_console; static default_attr *current_default; +static int console_buffer_count; +static char console_buffer[CONSOLE_BUFSIZE]; static int switch_in_progress = 0; static u_short *crtat = 0; static u_int crtc_addr = MONO_BASE; static char crtc_vga = 0; static u_char shfts = 0, ctls = 0, alts = 0, agrs = 0, metas = 0; static u_char nlkcnt = 0, clkcnt = 0, slkcnt = 0, alkcnt = 0; +static char *font_8 = NULL, *font_14 = NULL, *font_16 = NULL; +static int fonts_loaded = 0; static char palette[3*256]; static const u_int n_fkey_tab = sizeof(fkey_tab) / sizeof(*fkey_tab); static int cur_cursor_pos = -1; static char in_putc = 0; static char polling = 0; +#if ASYNCH +static u_char kbd_reply = 0; +#endif static int delayed_next_scr; static char saved_console = -1; /* saved console number */ -static long scrn_blank_time = 0; /* screen saver timout value */ +static long scrn_blank_time = 0; /* screen saver timeout value */ static int scrn_blanked = 0; /* screen saver active flag */ static int scrn_saver = 0; /* screen saver routine */ static long scrn_time_stamp; static u_char scr_map[256]; + extern int hz; extern struct timeval time; @@ -234,18 +241,14 @@ static u_char *get_fstr(u_int c, u_int *len); static void update_leds(int which); static void kbd_wait(void); static void kbd_cmd(u_char command); -static void kbd_cmd2(u_char command, u_char arg); -static int kbd_reply(void); static void set_mode(scr_stat *scp); static void set_border(int color); -static void load_font(int segment, int size, char* font); +static void copy_font(int direction, int segment, int size, char* font); static void save_palette(void); static void load_palette(void); static void change_winsize(struct tty *tp, int x, int y); - /* available screen savers */ - static void none_saver(int test); static void blank_saver(int test); static void fade_saver(int test); @@ -266,18 +269,6 @@ static const struct { #define NUM_SCRN_SAVERS (sizeof(screen_savers) / sizeof(screen_savers[0])) /* OS specific stuff */ - -#if defined(NetBSD) -#define VIRTUAL_TTY(x) pc_tty[x] ? (pc_tty[x]) : (pc_tty[x] = ttymalloc()) -#define CONSOLE_TTY pc_tty[NCONS] ? (pc_tty[NCONS]) : (pc_tty[NCONS] = ttymalloc()) -#define frametype struct trapframe -#define eflags tf_eflags -extern u_short *Crtat; -struct tty *pc_tty[NCONS+1]; -int ttrstrt(); -#endif - -#if defined(__FreeBSD__) #if 0 #define VIRTUAL_TTY(x) (pccons[x] = ttymalloc(pccons[x])) #define CONSOLE_TTY (pccons[NCONS] = ttymalloc(pccons[NCONS])) @@ -288,60 +279,71 @@ struct tty *pccons[NCONS+1]; struct tty pccons[NCONS+1]; #endif #define timeout_t timeout_func_t -#define frametype struct trapframe -#define eflags tf_eflags #define MONO_BUF (KERNBASE+0xB0000) #define CGA_BUF (KERNBASE+0xB8000) -#endif - -#if defined(__386BSD__) && !defined(__FreeBSD__) -#define VIRTUAL_TTY(x) &pccons[x] -#define CONSOLE_TTY &pccons[NCONS] -#define frametype struct syscframe -#define eflags sf_eflags -#define timeout_t caddr_t -#define MONO_BUF (0xFE0B0000) -#define CGA_BUF (0xFE0B8000) -struct tty pccons[NCONS+1]; -#endif - -#if defined(__386BSD__) || defined(__FreeBSD__) -u_short *Crtat = (u_short *)MONO_BUF; -void consinit(void) {scinit();} #include "ddb.h" #if NDDB > 0 #define DDB 1 #endif -#endif +u_short *Crtat = (u_short *)MONO_BUF; +void consinit(void) {scinit();} struct isa_driver scdriver = { pcprobe, pcattach, "sc", }; -int pcprobe(struct isa_device *dev) +int +pcprobe(struct isa_device *dev) { + int i, retries = 5; + unsigned char val; + /* Enable interrupts and keyboard controller */ kbd_wait(); outb(KB_STAT, KB_WRITE); - kbd_cmd(0x4D); + kbd_wait(); + outb(KB_DATA, KB_MODE); - /* Start keyboard stuff RESET */ - for (;;) { - kbd_cmd(KB_RESET); - if (kbd_reply() == KB_ACK && /* command accepted */ - kbd_reply() == 0xaa) /* self test passed */ - break; - printf("Keyboard reset failed\n"); -#ifdef KBD_RESET_FAIL_OK - break; -#endif + /* flush any noise in the buffer */ + while (inb(KB_STAT) & KB_BUF_FULL) { + DELAY(10); + (void) inb(KB_DATA); + } + + /* Reset keyboard hardware */ + while (retries--) { + kbd_wait(); + outb(KB_DATA, KB_RESET); + for (i=0; i<100000; i++) { + DELAY(10); + val = inb(KB_DATA); + if (val == KB_ACK || val == KB_ECHO) + goto gotres; + if (val == KB_RESEND) + break; + } + } +gotres: + if (!retries) + printf("scprobe: keyboard won't accept RESET command\n"); + else { +gotack: + DELAY(10); + while ((inb(KB_STAT) & KB_BUF_FULL) == 0) DELAY(10); + DELAY(10); + val = inb(KB_DATA); + if (val == KB_ACK) + goto gotack; + if (val != KB_RESET_DONE) + printf("scprobe: keyboard RESET failed %02x\n", val); } return (IO_KBDSIZE); } -int pcattach(struct isa_device *dev) +int +pcattach(struct isa_device *dev) { scr_stat *scp; int start = -1, end = -1, i; @@ -370,15 +372,28 @@ int pcattach(struct isa_device *dev) if (crtc_vga) { get_cursor_shape(&start, &end); #endif +#if !defined(NO_HARDFONTS) + font_8 = font_8x8; + font_14 = font_8x14; + font_16 = font_8x16; + fonts_loaded = FONT_8_LOADED|FONT_14_LOADED|FONT_16_LOADED; + copy_font(LOAD, 1, 8, font_8); + copy_font(LOAD, 2, 14, font_14); + copy_font(LOAD, 0, 16, font_16); +#else + font_8 = (char *)malloc(8*256, M_DEVBUF, M_NOWAIT); + font_14 = (char *)malloc(14*256, M_DEVBUF, M_NOWAIT); + font_16 = (char *)malloc(16*256, M_DEVBUF, M_NOWAIT); + copy_font(SAVE, 0, 16, font_16); + fonts_loaded = FONT_16_LOADED; +#endif save_palette(); - load_font(0, 16, font_8x16); - load_font(1, 8, font_8x8); - load_font(2, 14, font_8x14); } current_default = &user_default; for (i = 0; i < NCONS; i++) { scp = &console[i]; - scp->scr_buf = (u_short *)malloc(COL * ROW * 2, M_DEVBUF, M_NOWAIT); + scp->scr_buf = (u_short *)malloc(COL * ROW * 2, + M_DEVBUF, M_NOWAIT); scp->mode = TEXT80x25; scp->term.esc = 0; scp->term.std_attr = current_default->std_attr; @@ -391,13 +406,14 @@ int pcattach(struct isa_device *dev) scp->ysize = ROW; scp->bell_pitch = BELL_PITCH; scp->bell_duration = BELL_DURATION; - scp->status = 0; + scp->status = NLKED; scp->pid = 0; scp->proc = NULL; scp->smode.mode = VT_AUTO; if (i > 0) { scp->crt_base = scp->crtat = scp->scr_buf; - fillw(scp->term.cur_attr|scr_map[0x20], scp->scr_buf, COL*ROW); + fillw(scp->term.cur_attr|scr_map[0x20], + scp->scr_buf, COL*ROW); } } /* get cursor going */ @@ -406,11 +422,13 @@ int pcattach(struct isa_device *dev) console[0].cursor_end); #endif cursor_pos(1); + update_leds(console[0].status); return 0; } -static struct tty *get_tty_ptr(dev_t dev) +static struct tty +*get_tty_ptr(dev_t dev) { int unit = minor(dev); @@ -422,7 +440,8 @@ static struct tty *get_tty_ptr(dev_t dev) } -static scr_stat *get_scr_stat(dev_t dev) +static scr_stat +*get_scr_stat(dev_t dev) { int unit = minor(dev); @@ -434,7 +453,8 @@ static scr_stat *get_scr_stat(dev_t dev) } -static int get_scr_num() +static int +get_scr_num() { int i = 0; @@ -442,7 +462,9 @@ static int get_scr_num() return i < NCONS ? i : 0; } -int pcopen(dev_t dev, int flag, int mode, struct proc *p) + +int +pcopen(dev_t dev, int flag, int mode, struct proc *p) { struct tty *tp = get_tty_ptr(dev); @@ -453,7 +475,6 @@ int pcopen(dev_t dev, int flag, int mode, struct proc *p) tp->t_param = pcparam; tp->t_dev = dev; if (!(tp->t_state & TS_ISOPEN)) { - tp->t_state |= TS_WOPEN; ttychars(tp); tp->t_iflag = TTYDEF_IFLAG; tp->t_oflag = TTYDEF_OFLAG; @@ -470,7 +491,8 @@ int pcopen(dev_t dev, int flag, int mode, struct proc *p) } -int pcclose(dev_t dev, int flag, int mode, struct proc *p) +int +pcclose(dev_t dev, int flag, int mode, struct proc *p) { struct tty *tp = get_tty_ptr(dev); struct scr_stat *scp; @@ -491,7 +513,8 @@ int pcclose(dev_t dev, int flag, int mode, struct proc *p) } -int pcread(dev_t dev, struct uio *uio, int flag) +int +pcread(dev_t dev, struct uio *uio, int flag) { struct tty *tp = get_tty_ptr(dev); @@ -501,7 +524,8 @@ int pcread(dev_t dev, struct uio *uio, int flag) } -int pcwrite(dev_t dev, struct uio *uio, int flag) +int +pcwrite(dev_t dev, struct uio *uio, int flag) { struct tty *tp = get_tty_ptr(dev); @@ -511,11 +535,8 @@ int pcwrite(dev_t dev, struct uio *uio, int flag) } -/* - * Got a console interrupt, keyboard action ! - * Catch the character, and see who it goes to. - */ -void scintr(int unit) +void +scintr(int unit) { static struct tty *cur_tty; int c, len; @@ -556,10 +577,8 @@ void scintr(int unit) } -/* - * Set line parameters - */ -int pcparam(struct tty *tp, struct termios *t) +int +pcparam(struct tty *tp, struct termios *t) { int cflag = t->c_cflag; @@ -571,11 +590,12 @@ int pcparam(struct tty *tp, struct termios *t) } -int pcioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p) +int +pcioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p) { int i, error; struct tty *tp; - frametype *fp; + struct trapframe *fp; scr_stat *scp; tp = get_tty_ptr(dev); @@ -627,17 +647,23 @@ int pcioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p) case CONS_80x50TEXT: /* set 80x50 text mode */ if (!crtc_vga) return ENXIO; - scp->mode = TEXT80x50; - scp->ysize = 50; - free(scp->scr_buf, M_DEVBUF); - scp->scr_buf = (u_short *)malloc(scp->xsize*scp->ysize*2, - M_DEVBUF, M_NOWAIT); - if (scp != cur_console) - scp->crt_base = scp->scr_buf; - set_mode(scp); - clear_screen(scp); - change_winsize(tp, scp->xsize, scp->ysize); - return 0; + /* is there a 8x8 font loaded ? */ + if (fonts_loaded & FONT_8_LOADED) { + scp->mode = TEXT80x50; + scp->ysize = 50; + free(scp->scr_buf, M_DEVBUF); + scp->scr_buf = + (u_short *)malloc(scp->xsize * scp->ysize * 2, + M_DEVBUF, M_NOWAIT); + if (scp != cur_console) + scp->crt_base = scp->scr_buf; + set_mode(scp); + clear_screen(scp); + change_winsize(tp, scp->xsize, scp->ysize); + return 0; + } + else + return EINVAL; case CONS_GETVERS: /* get version number */ *(int*)data = 0x103; /* version 1.3 */ @@ -750,13 +776,13 @@ int pcioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p) return 0; case KDENABIO: /* allow io operations */ - fp = (frametype *)p->p_md.md_regs; - fp->eflags |= PSL_IOPL; + fp = (struct trapframe *)p->p_md.md_regs; + fp->tf_eflags |= PSL_IOPL; return 0; case KDDISABIO: /* disallow io operations (default) */ - fp = (frametype *)p->p_md.md_regs; - fp->eflags &= ~PSL_IOPL; + fp = (struct trapframe *)p->p_md.md_regs; + fp->tf_eflags &= ~PSL_IOPL; return 0; case KDSETMODE: /* set current mode of this (virtual) console */ @@ -764,9 +790,9 @@ int pcioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p) case KD_TEXT: /* switch to TEXT (known) mode */ /* restore fonts & palette ! */ if (crtc_vga) { - load_font(0, 16, font_8x16); - load_font(1, 8, font_8x8); - load_font(2, 14, font_8x14); + copy_font(LOAD, 0, 16, font_16); + copy_font(LOAD, 1, 8, font_8); + copy_font(LOAD, 2, 14, font_14); load_palette(); } /* FALL THROUGH */ @@ -815,7 +841,10 @@ int pcioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p) case KDSETRAD: /* set keyboard repeat & delay rates */ if (*data & 0x80) return EINVAL; - kbd_cmd2(KB_SETRAD, *data); + i = spltty(); + kbd_cmd(KB_SETRAD); + kbd_cmd(*data); + splx(i); return 0; case KDSKBMODE: /* set keyboard mode */ @@ -926,48 +955,63 @@ int pcioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p) case PIO_FONT8x8: /* set 8x8 dot font */ if (!crtc_vga) return ENXIO; - bcopy(data, &font_8x8, sizeof(font_8x8)); - load_font(1, 8, font_8x8); + bcopy(data, font_8, 8*256); + fonts_loaded |= FONT_8_LOADED; + copy_font(LOAD, 1, 8, font_8); return 0; case GIO_FONT8x8: /* get 8x8 dot font */ if (!crtc_vga) return ENXIO; - bcopy(&font_8x8, data, sizeof(font_8x8)); - return 0; + if (fonts_loaded & FONT_8_LOADED) { + bcopy(font_8, data, 8*256); + return 0; + } + else + return ENXIO; case PIO_FONT8x14: /* set 8x14 dot font */ if (!crtc_vga) return ENXIO; - bcopy(data, &font_8x14, sizeof(font_8x14)); - load_font(2, 14, font_8x14); + bcopy(data, font_14, 14*256); + fonts_loaded |= FONT_14_LOADED; + copy_font(LOAD, 2, 14, font_14); return 0; case GIO_FONT8x14: /* get 8x14 dot font */ if (!crtc_vga) return ENXIO; - bcopy(&font_8x14, data, sizeof(font_8x14)); - return 0; + if (fonts_loaded & FONT_14_LOADED) { + bcopy(font_14, data, 14*256); + return 0; + } + else + return ENXIO; case PIO_FONT8x16: /* set 8x16 dot font */ if (!crtc_vga) return ENXIO; - bcopy(data, &font_8x16, sizeof(font_8x16)); - load_font(0, 16, font_8x16); + bcopy(data, font_16, 16*256); + fonts_loaded |= FONT_16_LOADED; + copy_font(LOAD, 0, 16, font_16); return 0; case GIO_FONT8x16: /* get 8x16 dot font */ if (!crtc_vga) return ENXIO; - bcopy(&font_8x16, data, sizeof(font_8x16)); - return 0; + if (fonts_loaded & FONT_16_LOADED) { + bcopy(font_16, data, 16*256); + return 0; + } + else + return ENXIO; case CONSOLE_X_MODE_ON: /* just to be compatible */ if (saved_console < 0) { saved_console = get_scr_num(); switch_scr(minor(dev)); - fp = (frametype *)p->p_md.md_regs; - fp->eflags |= PSL_IOPL; + fp = (struct trapframe *)p->p_md.md_regs; + fp->tf_eflags |= PSL_IOPL; scp->status |= UNKNOWN_MODE; scp->status |= KBD_RAW_MODE; return 0; @@ -975,12 +1019,12 @@ int pcioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p) return EAGAIN; case CONSOLE_X_MODE_OFF:/* just to be compatible */ - fp = (frametype *)p->p_md.md_regs; - fp->eflags &= ~PSL_IOPL; + fp = (struct trapframe *)p->p_md.md_regs; + fp->tf_eflags &= ~PSL_IOPL; if (crtc_vga) { - load_font(0, 16, font_8x16); - load_font(1, 8, font_8x8); - load_font(2, 14, font_8x14); + copy_font(LOAD, 0, 16, font_16); + copy_font(LOAD, 1, 8, font_8); + copy_font(LOAD, 2, 14, font_14); load_palette(); } scp->status &= ~UNKNOWN_MODE; @@ -999,7 +1043,7 @@ int pcioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p) */ if (data) sysbeep(TIMER_FREQ/((int*)data)[0], - ((int*)data)[1]*hz/3000); + ((int*)data)[1]*hz/1000); else sysbeep(scp->bell_pitch, scp->bell_duration); return 0; @@ -1018,7 +1062,8 @@ int pcioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p) } -void pcxint(dev_t dev) +void +pcxint(dev_t dev) { struct tty *tp = get_tty_ptr(dev); @@ -1032,9 +1077,9 @@ void pcxint(dev_t dev) } -void pcstart(struct tty *tp) +void +pcstart(struct tty *tp) { -#if defined(NetBSD) || defined(__FreeBSD__) struct clist *rbp; int i, s, len; u_char buf[PCBURST]; @@ -1042,7 +1087,7 @@ void pcstart(struct tty *tp) if (scp->status & SLKED) return; - s = spltty(); /* Isn't start always called at spltty? */ + s = spltty(); if (!(tp->t_state & (TS_TIMEOUT|TS_BUSY|TS_TTSTOP))) { tp->t_state |= TS_BUSY; splx(s); @@ -1069,58 +1114,11 @@ void pcstart(struct tty *tp) } } splx(s); - -#else /* __386BSD__ */ - - int c, s, len, i; - scr_stat *scp = get_scr_stat(tp->t_dev); - u_char buf[PCBURST]; - - if (scp->status & SLKED) - return; - s = spltty(); - if (!(tp->t_state & (TS_TIMEOUT|TS_BUSY|TS_TTSTOP))) { - for (;;) { - if (RB_LEN(tp->t_out) <= tp->t_lowat) { - if (tp->t_state & TS_ASLEEP) { - tp->t_state &= ~TS_ASLEEP; - wakeup((caddr_t)tp->t_out); - } - selwakeup(&tp->t_wsel); - } - if (RB_LEN(tp->t_out) == 0) - break; - if (scp->status & SLKED) - break; - len = 0; - while( len < PCBURST) { - buf[len++] = getc(tp->t_out); - if( RB_LEN(tp->t_out) == 0) - break; - } - tp->t_state |= TS_BUSY; - splx(s); - for(i=0;i<len;i++) - ansi_put(scp, buf[i]); - s = spltty(); - tp->t_state &= ~TS_BUSY; - } - tp->t_state |= TS_BUSY; - if( in_putc == 0) { - int i; - for(i=0;i<console_buffer_count;i++) { - scput(console_buffer[i]); - } - console_buffer_count = 0; - } - tp->t_state &= ~TS_BUSY; - } - splx(s); -#endif } -void pccnprobe(struct consdev *cp) +void +pccnprobe(struct consdev *cp) { int maj; @@ -1132,19 +1130,18 @@ void pccnprobe(struct consdev *cp) /* initialize required fields */ cp->cn_dev = makedev(maj, NCONS); cp->cn_pri = CN_INTERNAL; -#if defined(__386BSD__) && !defined(__FreeBSD__) - cp->cn_tp = CONSOLE_TTY; -#endif } -void pccninit(struct consdev *cp) +void +pccninit(struct consdev *cp) { scinit(); } -void pccnputc(dev_t dev, char c) +void +pccnputc(dev_t dev, char c) { if (c == '\n') scput('\r'); @@ -1162,7 +1159,8 @@ void pccnputc(dev_t dev, char c) } -int pccngetc(dev_t dev) +int +pccngetc(dev_t dev) { int s = spltty(); /* block scintr while we poll */ int c = scgetc(0); @@ -1171,11 +1169,15 @@ int pccngetc(dev_t dev) return(c); } -static void none_saver(int test) + +static void +none_saver(int test) { } -static void fade_saver(int test) + +static void +fade_saver(int test) { static int count = 0; int i; @@ -1205,7 +1207,9 @@ static void fade_saver(int test) } } -static void blank_saver(int test) + +static void +blank_saver(int test) { u_char val; if (test) { @@ -1220,21 +1224,14 @@ static void blank_saver(int test) } } -static u_long rand_next = 1; - -static int rand() -{ - return ((rand_next = rand_next * 1103515245 + 12345) & 0x7FFFFFFF); -} +#define NUM_STARS 50 /* * Alternate saver that got its inspiration from a well known utility - * package for an unfamous OS. + * package for an inferior^H^H^H^H^H^Hfamous OS. */ - -#define NUM_STARS 50 - -static void star_saver(int test) +static void +star_saver(int test) { scr_stat *scp = cur_console; int cell, i; @@ -1258,16 +1255,16 @@ static void star_saver(int test) scrn_blanked = 1; for(i=0; i<NUM_STARS; i++) { stars[i][0] = - rand() % (scp->xsize*scp->ysize); + random() % (scp->xsize*scp->ysize); stars[i][1] = 0; } } - cell = rand() % NUM_STARS; + cell = random() % NUM_STARS; *((u_short*)(Crtat + stars[cell][0])) = scr_map[pattern[stars[cell][1]]] | - colors[rand()%sizeof(colors)] << 8; - if ((stars[cell][1]+=(rand()%4)) >= sizeof(pattern)-1) { - stars[cell][0] = rand() % (scp->xsize*scp->ysize); + colors[random()%sizeof(colors)] << 8; + if ((stars[cell][1]+=(random()%4)) >= sizeof(pattern)-1) { + stars[cell][0] = random() % (scp->xsize*scp->ysize); stars[cell][1] = 0; } } @@ -1282,9 +1279,10 @@ static void star_saver(int test) } -static void snake_saver(int test) +static void +snake_saver(int test) { - const char saves[] = {"FreeBSD"}; + const char saves[] = {"FreeBSD-2.0"}; static u_char *savs[sizeof(saves)-1]; static int dirx, diry; int f; @@ -1320,11 +1318,11 @@ static void snake_saver(int test) f = (savs[0] - (u_char *)Crtat) / 2; if ((f % scp->xsize) == 0 || (f % scp->xsize) == scp->xsize - 1 || - (rand() % 50) == 0) + (random() % 50) == 0) dirx = -dirx; if ((f / scp->xsize) == 0 || (f / scp->xsize) == scp->ysize - 1 || - (rand() % 20) == 0) + (random() % 20) == 0) diry = -diry; savs[0] += 2*dirx + 2*diry; for (f=sizeof(saves)-2; f>=0; f--) @@ -1341,7 +1339,9 @@ static void snake_saver(int test) } } -static void cursor_shape(int start, int end) + +static void +cursor_shape(int start, int end) { outb(crtc_addr, 10); outb(crtc_addr+1, start & 0xFF); @@ -1351,7 +1351,8 @@ static void cursor_shape(int start, int end) #if !defined(FAT_CURSOR) -static void get_cursor_shape(int *start, int *end) +static void +get_cursor_shape(int *start, int *end) { outb(crtc_addr, 10); *start = inb(crtc_addr+1) & 0x1F; @@ -1361,7 +1362,8 @@ static void get_cursor_shape(int *start, int *end) #endif -static void cursor_pos(int force) +static void +cursor_pos(int force) { int pos; @@ -1381,7 +1383,8 @@ static void cursor_pos(int force) } -static void clear_screen(scr_stat *scp) +static void +clear_screen(scr_stat *scp) { move_crsr(scp, 0, 0); fillw(scp->term.cur_attr | scr_map[0x20], scp->crt_base, @@ -1389,12 +1392,9 @@ static void clear_screen(scr_stat *scp) } -static int switch_scr(u_int next_scr) +static int +switch_scr(u_int next_scr) { - if (in_putc) { /* delay switch if in putc */ - delayed_next_scr = next_scr+1; - return 0; - } if (switch_in_progress && (cur_console->proc != pfind(cur_console->pid))) switch_in_progress = 0; @@ -1412,7 +1412,10 @@ static int switch_scr(u_int next_scr) return EINVAL; } } - + if (in_putc) { /* delay switch if in putc */ + delayed_next_scr = next_scr+1; + return 0; + } switch_in_progress = 1; old_scp = cur_console; new_scp = &console[next_scr]; @@ -1446,7 +1449,8 @@ static int switch_scr(u_int next_scr) } -static void exchange_scr(void) +static void +exchange_scr(void) { struct tty *tp; @@ -1460,9 +1464,9 @@ static void exchange_scr(void) bcopy(new_scp->scr_buf, Crtat, new_scp->xsize * new_scp->ysize * 2); update_leds(new_scp->status); if ((old_scp->status & UNKNOWN_MODE) && crtc_vga) { - load_font(0, 16, font_8x16); - load_font(1, 8, font_8x8); - load_font(2, 14, font_8x14); + copy_font(LOAD, 0, 16, font_16); + copy_font(LOAD, 1, 8, font_8); + copy_font(LOAD, 2, 14, font_14); load_palette(); } if (old_scp->status & KBD_RAW_MODE || new_scp->status & KBD_RAW_MODE) @@ -1471,7 +1475,8 @@ static void exchange_scr(void) } -static void move_crsr(scr_stat *scp, int x, int y) +static void +move_crsr(scr_stat *scp, int x, int y) { if (x < 0 || y < 0 || x >= scp->xsize || y >= scp->ysize) return; @@ -1480,7 +1485,9 @@ static void move_crsr(scr_stat *scp, int x, int y) scp->crtat = scp->crt_base + scp->ypos * scp->xsize + scp->xpos; } -static void move_up(u_short *s, u_short *d, u_int len) + +static void +move_up(u_short *s, u_short *d, u_int len) { s += len; d += len; @@ -1488,13 +1495,17 @@ static void move_up(u_short *s, u_short *d, u_int len) *--d = *--s; } -static void move_down(u_short *s, u_short *d, u_int len) + +static void +move_down(u_short *s, u_short *d, u_int len) { while (len-- > 0) *d++ = *s++; } -static void scan_esc(scr_stat *scp, u_char c) + +static void +scan_esc(scr_stat *scp, u_char c) { static u_char ansi_col[16] = {0, 4, 2, 6, 1, 5, 3, 7, 8, 12, 10, 14, 9, 13, 11, 15}; @@ -1762,39 +1773,45 @@ static void scan_esc(scr_stat *scp, u_char c) break; case 'm': /* change attribute */ - if (scp->term.num_param == 0) - n = 0; - else - n = scp->term.param[0]; - switch (n) { - case 0: /* back to normal */ + if (scp->term.num_param == 0) { scp->term.cur_attr = scp->term.std_attr; break; - case 1: /* highlight (bold) */ - scp->term.cur_attr &= 0xFF00; - scp->term.cur_attr |= 0x0800; - break; - case 4: /* highlight (underline) */ - scp->term.cur_attr &= 0x0F00; - scp->term.cur_attr |= 0x0800; - break; - case 5: /* blink */ - scp->term.cur_attr &= 0xFF00; - scp->term.cur_attr |= 0x8000; - break; - case 7: /* reverse video */ - scp->term.cur_attr = scp->term.rev_attr; - break; - case 30: case 31: case 32: case 33: /* set fg color */ - case 34: case 35: case 36: case 37: - scp->term.cur_attr = (scp->term.cur_attr & 0xF0FF) - | (ansi_col[(n - 30) & 7] << 8); - break; - case 40: case 41: case 42: case 43: /* set bg color */ - case 44: case 45: case 46: case 47: - scp->term.cur_attr = (scp->term.cur_attr & 0x0FFF) - | (ansi_col[(n - 40) & 7] << 12); - break; + } + for (i = 0; i < scp->term.num_param; i++) { + switch (n = scp->term.param[i]) { + case 0: /* back to normal */ + scp->term.cur_attr = scp->term.std_attr; + break; + case 1: /* highlight (bold) */ + scp->term.cur_attr &= 0xFF00; + scp->term.cur_attr |= 0x0800; + break; + case 4: /* highlight (underline) */ + scp->term.cur_attr &= 0xFF00; + scp->term.cur_attr |= 0x0800; + break; + case 5: /* blink */ + scp->term.cur_attr &= 0xFF00; + scp->term.cur_attr |= 0x8000; + break; + case 7: /* reverse video */ + scp->term.cur_attr = scp->term.rev_attr; + break; + case 30: case 31: /* set fg color */ + case 32: case 33: case 34: + case 35: case 36: case 37: + scp->term.cur_attr = + (scp->term.cur_attr & 0xF8FF) + | (ansi_col[(n-30) & 7] << 8); + break; + case 40: case 41: /* set bg color */ + case 42: case 43: case 44: + case 45: case 46: case 47: + scp->term.cur_attr = + (scp->term.cur_attr & 0x8FFF) + | (ansi_col[(n-40) & 7] << 12); + break; + } } break; @@ -1923,7 +1940,8 @@ static void scan_esc(scr_stat *scp, u_char c) } -static void ansi_put(scr_stat *scp, u_char c) +static void +ansi_put(scr_stat *scp, u_char c) { if (scp->status & UNKNOWN_MODE) return; @@ -1995,7 +2013,9 @@ static void ansi_put(scr_stat *scp, u_char c) switch_scr(delayed_next_scr - 1); } -static void scinit(void) + +static void +scinit(void) { u_short volatile *cp = Crtat + (CGA_BUF-MONO_BUF)/sizeof(u_short), was; unsigned cursorat; @@ -2046,7 +2066,7 @@ static void scinit(void) console[0].border = BG_BLACK;; console[0].xsize = COL; console[0].ysize = ROW; - console[0].status = 0; + console[0].status = NLKED; console[0].pid = 0; console[0].proc = NULL; console[0].smode.mode = VT_AUTO; @@ -2063,7 +2083,8 @@ static void scinit(void) } -static void scput(u_char c) +static void +scput(u_char c) { scr_stat *scp = &console[0]; term_stat save; @@ -2081,13 +2102,14 @@ static void scput(u_char c) scp->term = save; --in_putc; } else { - if( console_buffer_count < CONSOLE_BUFFER_SIZE) + if( console_buffer_count < CONSOLE_BUFSIZE) console_buffer[console_buffer_count++] = c; } } -static u_char *get_fstr(u_int c, u_int *len) +static u_char +*get_fstr(u_int c, u_int *len) { u_int i; @@ -2101,8 +2123,10 @@ static u_char *get_fstr(u_int c, u_int *len) } -static void update_leds(int which) +static void +update_leds(int which) { + int s; static u_char xlate_leds[8] = { 0, 4, 2, 6, 1, 5, 3, 7 }; /* replace CAPS led with ALTGR led for ALTGR keyboards */ @@ -2112,17 +2136,22 @@ static void update_leds(int which) else which &= ~CLKED; } - kbd_cmd2(KB_SETLEDS, xlate_leds[which & LED_MASK]); + s = spltty(); + kbd_cmd(KB_SETLEDS); + kbd_cmd(xlate_leds[which & LED_MASK]); + splx(s); } /* - * scgetc(noblock) : get a character from the keyboard. - * If noblock = 0 wait until a key is gotten. Otherwise return NOKEY. + * scgetc(noblock) - get character from keyboard. + * If noblock = 0 wait until a key is pressed. + * Else return NOKEY. */ -u_int scgetc(int noblock) +u_int +scgetc(int noblock) { - u_char val, code, release; + u_char scancode, keycode; u_int state, action; struct key_t *key; static u_char esc_flag = 0, compose = 0; @@ -2132,132 +2161,136 @@ next_code: kbd_wait(); /* First see if there is something in the keyboard port */ if (inb(KB_STAT) & KB_BUF_FULL) - val = inb(KB_DATA); + scancode = inb(KB_DATA); else if (noblock) return(NOKEY); else goto next_code; if (cur_console->status & KBD_RAW_MODE) - return val; - - code = val & 0x7F; - release = val & 0x80; - + return scancode; +#if ASYNCH + if (scancode == KB_ACK || scancode == KB_RESEND) { + kbd_reply = scancode; + if (noblock) + return(NOKEY); + goto next_code; + } +#endif + keycode = scancode & 0x7F; switch (esc_flag) { case 0x00: /* normal scancode */ - switch(code) { - case 0x38: /* left alt (compose key) */ - if (release && compose) { + switch(scancode) { + case 0xB8: /* left alt (compose key) */ + if (compose) { compose = 0; if (chr > 255) { sysbeep(BELL_PITCH, BELL_DURATION); chr = 0; } } - else { - if (!compose) { - compose = 1; - chr = 0; - } + break; + case 0x38: + if (!compose) { + compose = 1; + chr = 0; } break; - case 0x60: - case 0x61: - esc_flag = code; + case 0xE0: + case 0xE1: + esc_flag = scancode; goto next_code; } break; - case 0x60: /* 0xE0 prefix */ + case 0xE0: /* 0xE0 prefix */ esc_flag = 0; - switch (code) { - case 0x1c: /* right enter key */ - code = 0x59; + switch (keycode) { + case 0x1C: /* right enter key */ + keycode = 0x59; break; - case 0x1d: /* right ctrl key */ - code = 0x5a; + case 0x1D: /* right ctrl key */ + keycode = 0x5A; break; case 0x35: /* keypad divide key */ - code = 0x5b; + keycode = 0x5B; break; case 0x37: /* print scrn key */ - code = 0x5c; + keycode = 0x5C; break; case 0x38: /* right alt key (alt gr) */ - code = 0x5d; + keycode = 0x5D; break; case 0x47: /* grey home key */ - code = 0x5e; + keycode = 0x5E; break; case 0x48: /* grey up arrow key */ - code = 0x5f; + keycode = 0x5F; break; case 0x49: /* grey page up key */ - code = 0x60; + keycode = 0x60; break; - case 0x4b: /* grey left arrow key */ - code = 0x61; + case 0x4B: /* grey left arrow key */ + keycode = 0x61; break; - case 0x4d: /* grey right arrow key */ - code = 0x62; + case 0x4D: /* grey right arrow key */ + keycode = 0x62; break; - case 0x4f: /* grey end key */ - code = 0x63; + case 0x4F: /* grey end key */ + keycode = 0x63; break; case 0x50: /* grey down arrow key */ - code = 0x64; + keycode = 0x64; break; case 0x51: /* grey page down key */ - code = 0x65; + keycode = 0x65; break; case 0x52: /* grey insert key */ - code = 0x66; + keycode = 0x66; break; case 0x53: /* grey delete key */ - code = 0x67; + keycode = 0x67; break; default: /* ignore everything else */ goto next_code; } break; - case 0x61: /* 0xE1 prefix */ + case 0xE1: /* 0xE1 prefix */ esc_flag = 0; - if (code == 0x1D) + if (keycode == 0x1D) esc_flag = 0x1D; goto next_code; /* NOT REACHED */ case 0x1D: /* pause / break */ esc_flag = 0; - if (code != 0x45) + if (keycode != 0x45) goto next_code; - code = 0x68; + keycode = 0x68; break; } if (compose) { - switch (code) { - case 0x47: - case 0x48: /* keypad 7,8,9 */ - case 0x49: - if (!release) - chr = (code - 0x40) + chr*10; + switch (scancode) { + /* key pressed process it */ + case 0x47: case 0x48: case 0x49: /* keypad 7,8,9 */ + chr = (scancode - 0x40) + chr*10; goto next_code; - case 0x4b: - case 0x4c: /* keypad 4,5,6 */ - case 0x4d: - if (!release) - chr = (code - 0x47) + chr*10; + case 0x4B: case 0x4C: case 0x4D: /* keypad 4,5,6 */ + chr = (scancode - 0x47) + chr*10; goto next_code; - case 0x4f: - case 0x50: /* keypad 1,2,3 */ - case 0x51: - if (!release) - chr = (code - 0x4e) + chr*10; + case 0x4F: case 0x50: case 0x51: /* keypad 1,2,3 */ + chr = (scancode - 0x4E) + chr*10; goto next_code; case 0x52: /* keypad 0 */ - if (!release) - chr *= 10; + chr *= 10; goto next_code; + + /* key release, no interest here */ + case 0xC7: case 0xC8: case 0xC9: /* keypad 7,8,9 */ + case 0xCB: case 0xCC: case 0xCD: /* keypad 4,5,6 */ + case 0xCF: case 0xD0: case 0xD1: /* keypad 1,2,3 */ + case 0xD2: /* keypad 0 */ + goto next_code; + case 0x38: /* left alt key */ break; default: @@ -2273,15 +2306,15 @@ next_code: state = (shfts ? 1 : 0 ) | (2 * (ctls ? 1 : 0)) | (4 * (alts ? 1 : 0)); if ((!agrs && (cur_console->status & ALKED)) || (agrs && !(cur_console->status & ALKED))) - code += ALTGR_OFFSET; - key = &key_map.key[code]; + keycode += ALTGR_OFFSET; + key = &key_map.key[keycode]; if ( ((key->flgs & FLAG_LOCK_C) && (cur_console->status & CLKED)) || ((key->flgs & FLAG_LOCK_N) && (cur_console->status & NLKED)) ) state ^= 1; /* Check for make/break */ action = key->map[state]; - if (release) { /* key released */ + if (scancode & 0x80) { /* key released */ if (key->spcl & 0x80) { switch (action) { case LSH: @@ -2379,11 +2412,7 @@ next_code: case NOP: break; case RBT: -#if defined(__FreeBSD__) shutdown_nice(); -#else - cpu_reset(); -#endif break; case DBG: #if DDB > 0 /* try to switch to console 0 */ @@ -2443,7 +2472,8 @@ next_code: } -int getchar(void) +int +getchar(void) { u_char thechar; int s; @@ -2474,12 +2504,15 @@ int getchar(void) } -u_int sgetc(int noblock) +u_int +sgetc(int noblock) { return (scgetc(noblock) & 0xff); } -int pcmmap(dev_t dev, int offset, int nprot) + +int +pcmmap(dev_t dev, int offset, int nprot) { if (offset > 0x20000) return EINVAL; @@ -2487,11 +2520,12 @@ int pcmmap(dev_t dev, int offset, int nprot) } -static void kbd_wait(void) +static void +kbd_wait(void) { - int i; + int i = 1000; - for (i=0; i<1000; i++) { /* up to 10 msec */ + while (i--) { if ((inb(KB_STAT) & KB_READY) == 0) break; DELAY (10); @@ -2499,43 +2533,43 @@ static void kbd_wait(void) } -static void kbd_cmd(u_char command) -{ - kbd_wait(); - outb(KB_DATA, command); -} - - -static void kbd_cmd2(u_char command, u_char arg) +static void +kbd_cmd(u_char command) { - int r, s = spltty(); + int retry = 5; do { - kbd_cmd(command); - r = kbd_reply(); - if (r == KB_ACK) { - kbd_cmd(arg & 0x7f); - r = kbd_reply(); + int i = 100000; + + kbd_wait(); +#if ASYNCH + kbd_reply = 0; + outb(KB_DATA, command); + while (i--) { + if (kbd_reply == KB_ACK) + return; + if (kbd_reply == KB_RESEND) + break; } - } while (r != KB_ACK); - splx(s); -} - - -static int kbd_reply() -{ - int i; - - kbd_wait(); - for (i=0; i<60000; i++) { /* at least 300 msec, 600 msec enough */ - if (inb(KB_STAT) & KB_BUF_FULL) - return ((u_char) inb(KB_DATA)); - DELAY (10); - } - return(-1); +#else + outb(KB_DATA, command); + while (i--) { + if (inb(KB_STAT) & KB_BUF_FULL) { + int val; + DELAY(10); + val = inb(KB_DATA); + if (val == KB_ACK) + return; + if (val == KB_RESEND) + break; + } + } +#endif + } while (retry--); } -static void set_mode(scr_stat *scp) +static void +set_mode(scr_stat *scp) { u_char byte; int s; @@ -2579,15 +2613,18 @@ static void set_mode(scr_stat *scp) } -static void set_border(int color) +static void +set_border(int color) { inb(crtc_addr+6); /* reset flip-flop */ outb(ATC, 0x11); outb(ATC, color); inb(crtc_addr+6); /* reset flip-flop */ - outb(ATC, 0x20); /* enable Palette */ + outb(ATC, 0x20); /* enable Palette */ } -static void load_font(int segment, int size, char* font) + +static void +copy_font(int direction, int segment, int size, char* font) { int ch, line, s; u_char val; @@ -2606,9 +2643,14 @@ static void load_font(int segment, int size, char* font) outb(GDCIDX, 0x06); outb(GDCREG, 0x05); /* addr = a0000, 64kb */ splx(s); for (ch=0; ch < 256; ch++) - for (line=0; line < size; line++) - *((char *)atdevbase+(segment*0x4000)+(ch*32)+line) = - font[(ch*size)+line]; + for (line=0; line < size; line++) + if (direction) + *((char *)atdevbase+(segment*0x4000)+(ch*32)+line) = + font[(ch*size)+line]; + else + font[(ch*size)+line] = + *((char *)atdevbase+(segment*0x4000)+(ch*32)+line); + /* setup vga for text mode again */ s = splhigh(); inb(crtc_addr+6); /* reset flip/flop */ @@ -2629,7 +2671,8 @@ static void load_font(int segment, int size, char* font) } -static void load_palette(void) +static void +load_palette(void) { int i; @@ -2641,7 +2684,9 @@ static void load_palette(void) outb(ATC, 0x20); /* enable palette */ } -static void save_palette(void) + +static void +save_palette(void) { int i; @@ -2652,7 +2697,8 @@ static void save_palette(void) } -static void change_winsize(struct tty *tp, int x, int y) +static void +change_winsize(struct tty *tp, int x, int y) { if (tp->t_winsize.ws_col != x || tp->t_winsize.ws_row != y) { tp->t_winsize.ws_col = x; |