diff options
author | sos <sos@FreeBSD.org> | 1996-09-30 23:00:58 +0000 |
---|---|---|
committer | sos <sos@FreeBSD.org> | 1996-09-30 23:00:58 +0000 |
commit | 1b6b2c9e3b2613c32aa390f7337514cd7cd0ef74 (patch) | |
tree | eb82a1732e293d4edc84a1260901a012266e0872 /sys/isa | |
parent | c8132b2e31d6c5dc8067b94e551d8618819697ff (diff) | |
download | FreeBSD-src-1b6b2c9e3b2613c32aa390f7337514cd7cd0ef74.zip FreeBSD-src-1b6b2c9e3b2613c32aa390f7337514cd7cd0ef74.tar.gz |
Fix a couble of nasties regarding mouse pointer and different
resolutions.
Allow middle mouse button to be used for pasting.
Also added the beginnings of support for a splash page.
Diffstat (limited to 'sys/isa')
-rw-r--r-- | sys/isa/syscons.c | 275 | ||||
-rw-r--r-- | sys/isa/syscons.h | 8 |
2 files changed, 180 insertions, 103 deletions
diff --git a/sys/isa/syscons.c b/sys/isa/syscons.c index cce50f0..73ec974 100644 --- a/sys/isa/syscons.c +++ b/sys/isa/syscons.c @@ -1,3 +1,4 @@ +#define SC_SPLASH_SCREEN /*- * Copyright (c) 1992-1996 Søren Schmidt * All rights reserved. @@ -25,7 +26,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $Id: syscons.c,v 1.170 1996/09/10 19:14:49 peter Exp $ + * $Id: syscons.c,v 1.171 1996/09/14 04:27:45 bde Exp $ */ #include "sc.h" @@ -181,12 +182,12 @@ static void draw_cursor_image(scr_stat *scp); static void remove_cursor_image(scr_stat *scp); static void ansi_put(scr_stat *scp, u_char *buf, int len); static u_char *get_fstr(u_int c, u_int *len); -static void update_leds(int which); static void history_to_screen(scr_stat *scp); static int history_up_line(scr_stat *scp); static int history_down_line(scr_stat *scp); static void kbd_wait(void); static void kbd_cmd(u_char command); +static void update_leds(int which); static void set_vgaregs(char *modetable); static void set_font_mode(void); static void set_normal_mode(void); @@ -202,6 +203,7 @@ static void remove_cutmarking(scr_stat *scp); static void save_palette(void); static void do_bell(scr_stat *scp, int pitch, int duration); static void blink_screen(scr_stat *scp); +static void toggle_splash_screen(scr_stat *scp); struct isa_driver scdriver = { scprobe, scattach, "sc", 1 @@ -329,9 +331,7 @@ scresume(void *dummy) static inline void draw_cursor_image(scr_stat *scp) { - u_short cursor_image, *ptr; - - ptr = Crtat + (scp->cursor_pos - scp->scr_buf); + u_short cursor_image, *ptr = Crtat + (scp->cursor_pos - scp->scr_buf); /* do we have a destructive cursor ? */ if (flags & CHAR_CURSOR) { @@ -365,15 +365,6 @@ draw_cursor_image(scr_stat *scp) static inline void remove_cursor_image(scr_stat *scp) { -/* - u_short cursor_image, *ptr; - - ptr = Crtat + (scp->cursor_oldpos - scp->scr_buf); - - cursor_image = scp->cursor_saveunder; - *ptr = cursor_image; -SOS */ - *(Crtat + (scp->cursor_oldpos - scp->scr_buf)) = scp->cursor_saveunder; } @@ -425,7 +416,7 @@ scattach(struct isa_device *dev) bcopyw(Crtat, scp->scr_buf, scp->xsize * scp->ysize * sizeof(u_short)); scp->cursor_pos = scp->cursor_oldpos = scp->scr_buf + scp->xpos + scp->ypos * scp->xsize; - scp->mouse_pos = scp->scr_buf; + scp->mouse_pos = scp->mouse_oldpos = scp->scr_buf; /* initialize history buffer & pointers */ scp->history_head = scp->history_pos = scp->history = @@ -456,6 +447,15 @@ scattach(struct isa_device *dev) printf("CGA/EGA"); printf(" <%d virtual consoles, flags=0x%x>\n", MAXCONS, flags); +#ifdef SC_SPLASH_SCREEN + /* + * Now put up a graphics image, and maybe cycle a + * couble of palette entries for simple animation. + * XXX should be in scinit, but but but.... + */ + toggle_splash_screen(cur_console); +#endif + #if NAPM > 0 scp->r_hook.ah_fun = scresume; scp->r_hook.ah_arg = NULL; @@ -537,8 +537,12 @@ scopen(dev_t dev, int flag, int mode, struct proc *p) else if (tp->t_state & TS_XCLUDE && p->p_ucred->cr_uid != 0) return(EBUSY); - if (minor(dev) < MAXCONS && !console[minor(dev)]) + if (minor(dev) < MAXCONS && !console[minor(dev)]) { console[minor(dev)] = alloc_scp(); +#ifdef SC_SPLASH_SCREEN + toggle_splash_screen(cur_console); +#endif + } return((*linesw[tp->t_line].l_open)(dev, tp)); } @@ -606,10 +610,9 @@ scintr(int unit) /* make screensaver happy */ scrn_time_stamp = time.tv_sec; - if (scrn_blanked) { + if (scrn_blanked && !(cur_console->status & UNKNOWN_MODE)) { (*current_saver)(FALSE); - cur_console->start = 0; - cur_console->end = cur_console->xsize * cur_console->ysize; + mark_all(cur_console); } c = scgetc(1); @@ -794,8 +797,8 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p) break; case MOUSE_ACTION: - /* this should maybe only be settable from /dev/mouse SOS */ - /* send out mouse event on /dev/mouse */ + /* this should maybe only be settable from /dev/consolectl SOS */ + /* send out mouse event on /dev/sysmouse */ if ((MOUSE_TTY)->t_state & TS_ISOPEN) { u_char buf[5]; int i; @@ -823,7 +826,7 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p) psignal(cur_console->mouse_proc, cur_console->mouse_signal); } else { - /* process button presses*/ + /* process button presses */ if (cur_console->mouse_buttons != mouse->u.data.buttons) { cur_console->mouse_buttons = mouse->u.data.buttons; if (!(scp->status & UNKNOWN_MODE)) { @@ -831,7 +834,8 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p) mouse_cut_start(cur_console); else mouse_cut_end(cur_console); - if (cur_console->mouse_buttons & RIGHT_BUTTON) + if (cur_console->mouse_buttons & RIGHT_BUTTON || + cur_console->mouse_buttons & MIDDLE_BUTTON) mouse_paste(cur_console); } } @@ -846,10 +850,9 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p) /* make screensaver happy */ if (scp == cur_console) { scrn_time_stamp = time.tv_sec; - if (scrn_blanked) { + if (scrn_blanked && !(scp->status & UNKNOWN_MODE)) { (*current_saver)(FALSE); - cur_console->start = 0; - cur_console->end = cur_console->xsize * cur_console->ysize; + mark_all(scp); } } return 0; @@ -929,8 +932,13 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p) scp->mode = cmd & 0xff; scp->status &= ~UNKNOWN_MODE; free(scp->scr_buf, M_DEVBUF); - scp->scr_buf = (u_short *)malloc(scp->xsize*scp->ysize*sizeof(u_short), - M_DEVBUF, M_WAITOK); + scp->scr_buf = (u_short *) + malloc(scp->xsize*scp->ysize*sizeof(u_short), M_DEVBUF, M_WAITOK); + scp->cursor_pos = scp->cursor_oldpos = + scp->scr_buf + scp->xpos + scp->ypos * scp->xsize; + scp->mouse_pos = scp->mouse_oldpos = + scp->scr_buf + ((scp->mouse_ypos/scp->font_size)*scp->xsize + + scp->mouse_xpos/8); free(cut_buffer, M_DEVBUF); cut_buffer = (char *)malloc(scp->xsize*scp->ysize, M_DEVBUF, M_NOWAIT); cut_buffer[0] = 0x00; @@ -955,16 +963,16 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p) return ENXIO; scp->mode = cmd & 0xFF; scp->status |= UNKNOWN_MODE; /* graphics mode */ - scp->xsize = (*(video_mode_ptr + (scp->mode*64))) * 8; - scp->ysize = (*(video_mode_ptr + (scp->mode*64) + 1) + 1) * + scp->xpixel = (*(video_mode_ptr + (scp->mode*64))) * 8; + scp->ypixel = (*(video_mode_ptr + (scp->mode*64) + 1) + 1) * (*(video_mode_ptr + (scp->mode*64) + 2)); set_mode(scp); /* clear_graphics();*/ - if (tp->t_winsize.ws_xpixel != scp->xsize - || tp->t_winsize.ws_ypixel != scp->ysize) { - tp->t_winsize.ws_xpixel = scp->xsize; - tp->t_winsize.ws_ypixel = scp->ysize; + if (tp->t_winsize.ws_xpixel != scp->xpixel + || tp->t_winsize.ws_ypixel != scp->ypixel) { + tp->t_winsize.ws_xpixel = scp->xpixel; + tp->t_winsize.ws_ypixel = scp->ypixel; pgsignal(tp->t_pgrp, SIGWINCH, 1); } return 0; @@ -1082,9 +1090,9 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p) case KD_TEXT1: /* switch to TEXT (known) mode */ /* no restore fonts & palette */ - scp->status &= ~UNKNOWN_MODE; if (crtc_vga && video_mode_ptr) set_mode(scp); + scp->status &= ~UNKNOWN_MODE; clear_screen(scp); return 0; @@ -1403,7 +1411,7 @@ sccnputc(dev_t dev, int c) current_default = &user_default; scp->term = save; s = splclock(); - if (/* timers_not_running && */ scp == cur_console) { + if (scp == cur_console && !(scp->status & UNKNOWN_MODE)) { if (scp->scr_buf != Crtat && (scp->start <= scp->end)) { bcopyw(scp->scr_buf + scp->start, Crtat + scp->start, (1 + scp->end - scp->start) * sizeof(u_short)); @@ -1594,12 +1602,6 @@ exchange_scr(void) } move_crsr(new_scp, new_scp->xpos, new_scp->ypos); if ((old_scp->status & UNKNOWN_MODE) && crtc_vga) { - if (fonts_loaded & FONT_8) - copy_font(LOAD, FONT_8, font_8); - if (fonts_loaded & FONT_14) - copy_font(LOAD, FONT_14, font_14); - if (fonts_loaded & FONT_16) - copy_font(LOAD, FONT_16, font_16); if (flags & CHAR_CURSOR) set_destructive_cursor(new_scp); load_palette(); @@ -2109,16 +2111,12 @@ ansi_put(scr_stat *scp, u_char *buf, int len) { u_char *ptr = buf; - if (scp->status & UNKNOWN_MODE) - return; - /* make screensaver happy */ if (scp == cur_console) { scrn_time_stamp = time.tv_sec; - if (scrn_blanked) { + if (scrn_blanked && !(scp->status & UNKNOWN_MODE)) { (*current_saver)(FALSE); - cur_console->start = 0; - cur_console->end = cur_console->xsize * cur_console->ysize; + mark_all(scp); } } write_in_progress++; @@ -2397,25 +2395,6 @@ static u_char } 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 */ - if (key_map.n_keys > ALTGR_OFFSET) { - if (which & ALKED) - which |= CLKED; - else - which &= ~CLKED; - } - s = spltty(); - kbd_cmd(KB_SETLEDS); - kbd_cmd(xlate_leds[which & LED_MASK]); - splx(s); -} - -static void history_to_screen(scr_stat *scp) { int i; @@ -2469,7 +2448,7 @@ scgetc(int noblock) next_code: kbd_wait(); - /* First see if there is something in the keyboard port */ + /* first see if there is something in the keyboard port */ if (inb(KB_STAT) & KB_BUF_FULL) scancode = inb(KB_DATA); else if (noblock) @@ -2477,6 +2456,7 @@ next_code: else goto next_code; + /* do the /dev/random device a favour */ add_keyboard_randomness(scancode); if (cur_console->status & KBD_RAW_MODE) @@ -2486,7 +2466,7 @@ next_code: switch (esc_flag) { case 0x00: /* normal scancode */ switch(scancode) { - case 0xB8: /* left alt (compose key) */ + case 0xB8: /* left alt (compose key) */ if (compose) { compose = 0; if (chr > 255) { @@ -2746,6 +2726,7 @@ next_code: switch (action) { /* LOCKING KEYS */ case NLK: + toggle_splash_screen(cur_console); /* SOS XXX */ if (!nlkcnt) { nlkcnt++; if (cur_console->status & NLKED) @@ -2811,6 +2792,11 @@ next_code: /* NON-LOCKING KEYS */ case NOP: break; + case SPSC: +#ifdef SC_SPLASH_SCREEN + toggle_splash_screen(cur_console); +#endif + break; case RBT: shutdown_nice(); break; @@ -2921,6 +2907,25 @@ kbd_cmd(u_char command) } while (retry--); } +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 */ + if (key_map.n_keys > ALTGR_OFFSET) { + if (which & ALKED) + which |= CLKED; + else + which &= ~CLKED; + } + s = spltty(); + kbd_cmd(KB_SETLEDS); + kbd_cmd(xlate_leds[which & LED_MASK]); + splx(s); +} + void set_mode(scr_stat *scp) { @@ -2933,22 +2938,22 @@ set_mode(scr_stat *scp) /* setup video hardware for the given mode */ switch (scp->mode) { case M_VGA_M80x60: - bcopyw(video_mode_ptr+(64*M_VGA_M80x25),&special_modetable, 64); + bcopyw(video_mode_ptr+(64*M_VGA_M80x25), &special_modetable, 64); goto special_80x60; case M_VGA_C80x60: - bcopyw(video_mode_ptr+(64*M_VGA_C80x25),&special_modetable, 64); + bcopyw(video_mode_ptr+(64*M_VGA_C80x25), &special_modetable, 64); special_80x60: special_modetable[2] = 0x08; special_modetable[19] = 0x47; goto special_480l; case M_VGA_M80x30: - bcopyw(video_mode_ptr+(64*M_VGA_M80x25),&special_modetable, 64); + bcopyw(video_mode_ptr+(64*M_VGA_M80x25), &special_modetable, 64); goto special_80x30; case M_VGA_C80x30: - bcopyw(video_mode_ptr+(64*M_VGA_C80x25),&special_modetable, 64); + bcopyw(video_mode_ptr+(64*M_VGA_C80x25), &special_modetable, 64); special_80x30: special_modetable[19] = 0x4f; special_480l: @@ -2963,21 +2968,21 @@ special_480l: goto setup_mode; case M_ENH_B80x43: - bcopyw(video_mode_ptr+(64*M_ENH_B80x25),&special_modetable, 64); + bcopyw(video_mode_ptr+(64*M_ENH_B80x25), &special_modetable, 64); goto special_80x43; case M_ENH_C80x43: - bcopyw(video_mode_ptr+(64*M_ENH_C80x25),&special_modetable, 64); + bcopyw(video_mode_ptr+(64*M_ENH_C80x25), &special_modetable, 64); special_80x43: special_modetable[28] = 87; goto special_80x50; case M_VGA_M80x50: - bcopyw(video_mode_ptr+(64*M_VGA_M80x25),&special_modetable, 64); + bcopyw(video_mode_ptr+(64*M_VGA_M80x25), &special_modetable, 64); goto special_80x50; case M_VGA_C80x50: - bcopyw(video_mode_ptr+(64*M_VGA_C80x25),&special_modetable, 64); + bcopyw(video_mode_ptr+(64*M_VGA_C80x25), &special_modetable, 64); special_80x50: special_modetable[2] = 8; special_modetable[19] = 7; @@ -2998,14 +3003,21 @@ setup_mode: /* set font type (size) */ if (scp->font_size < FONT_14) { + if (fonts_loaded & FONT_8) + copy_font(LOAD, FONT_8, font_8); outb(TSIDX, 0x03); outb(TSREG, 0x0A); /* font 2 */ } else if (scp->font_size >= FONT_16) { + if (fonts_loaded & FONT_16) + copy_font(LOAD, FONT_16, font_16); outb(TSIDX, 0x03); outb(TSREG, 0x00); /* font 0 */ } else { + if (fonts_loaded & FONT_14) + copy_font(LOAD, FONT_14, font_14); outb(TSIDX, 0x03); outb(TSREG, 0x05); /* font 1 */ } if (flags & CHAR_CURSOR) set_destructive_cursor(scp); + mark_all(scp); break; case M_BG320: case M_CG320: case M_BG640: @@ -3068,7 +3080,7 @@ set_vgaregs(char *modetable) outb(GDCREG, modetable[i+55]); } inb(crtc_addr+6); /* reset flip-flop */ - outb(ATC ,0x20); /* enable palette */ + outb(ATC, 0x20); /* enable palette */ splx(s); } @@ -3076,8 +3088,10 @@ static void set_font_mode() { /* setup vga for loading fonts (graphics plane mode) */ - inb(crtc_addr+6); - outb(ATC, 0x30); outb(ATC, 0x01); + inb(crtc_addr+6); /* reset flip-flop */ + outb(ATC, 0x10); outb(ATC, 0x01); + inb(crtc_addr+6); /* reset flip-flop */ + outb(ATC, 0x20); /* enable palette */ #if SLOW_VGA outb(TSIDX, 0x02); outb(TSREG, 0x04); outb(TSIDX, 0x04); outb(TSREG, 0x06); @@ -3096,31 +3110,64 @@ set_font_mode() static void set_normal_mode() { + char *modetable; int s = splhigh(); + switch (cur_console->mode) { + case M_VGA_M80x60: + case M_VGA_M80x50: + case M_VGA_M80x30: + modetable = video_mode_ptr + (64*M_VGA_M80x25); + break; + + case M_VGA_C80x60: + case M_VGA_C80x50: + case M_VGA_C80x30: + modetable = video_mode_ptr + (64*M_VGA_C80x25); + break; + + case M_ENH_B80x43: + modetable = video_mode_ptr + (64*M_ENH_B80x25); + break; + + case M_ENH_C80x43: + modetable = video_mode_ptr + (64*M_ENH_C80x25); + break; + + case M_VGA_C40x25: case M_VGA_C80x25: + case M_VGA_M80x25: + case M_B40x25: case M_C40x25: + case M_B80x25: case M_C80x25: + case M_ENH_B40x25: case M_ENH_C40x25: + case M_ENH_B80x25: case M_ENH_C80x25: + + case M_BG320: case M_CG320: case M_BG640: + case M_CG320_D: case M_CG640_E: + case M_CG640x350: case M_ENH_CG640: + case M_BG640x480: case M_CG640x480: case M_VGA_CG320: + modetable = video_mode_ptr + (cur_console->mode * 64); + + default: + modetable = video_mode_ptr + (64*M_VGA_C80x25); + } + /* setup vga for normal operation mode again */ - inb(crtc_addr+6); - outb(ATC, 0x30); outb(ATC, 0x0C); + inb(crtc_addr+6); /* reset flip-flop */ + outb(ATC, 0x10); outb(ATC, modetable[0x10+35]); + inb(crtc_addr+6); /* reset flip-flop */ + outb(ATC, 0x20); /* enable palette */ #if SLOW_VGA - outb(TSIDX, 0x02); outb(TSREG, 0x03); - outb(TSIDX, 0x04); outb(TSREG, 0x02); - outb(GDCIDX, 0x04); outb(GDCREG, 0x00); - outb(GDCIDX, 0x05); outb(GDCREG, 0x10); - if (crtc_addr == MONO_BASE) { - outb(GDCIDX, 0x06); outb(GDCREG, 0x0A); /* addr = b0000, 32kb */ - } - else { - outb(GDCIDX, 0x06); outb(GDCREG, 0x0E); /* addr = b8000, 32kb */ - } + outb(TSIDX, 0x02); outb(TSREG, modetable[0x02+4]); + outb(TSIDX, 0x04); outb(TSREG, modetable[0x04+4]); + outb(GDCIDX, 0x04); outb(GDCREG, modetable[0x04+55]); + outb(GDCIDX, 0x05); outb(GDCREG, modetable[0x05+55]); + outb(GDCIDX, 0x06); outb(GDCREG, modetable[0x06+55]); #else - outw(TSIDX, 0x0302); - outw(TSIDX, 0x0204); - outw(GDCIDX, 0x0004); - outw(GDCIDX, 0x1005); - if (crtc_addr == MONO_BASE) - outw(GDCIDX, 0x0A06); /* addr = b0000, 32kb */ - else - outw(GDCIDX, 0x0E06); /* addr = b8000, 32kb */ + outw(TSIDX, 0x0002 | (modetable[0x02+4]<<8)); + outw(TSIDX, 0x0004 | (modetable[0x04+4]<<8)); + outw(GDCIDX, 0x0004 | (modetable[0x04+55]<<8)); + outw(GDCIDX, 0x0005 | (modetable[0x05+55]<<8)); + outw(GDCIDX, 0x0006 | (modetable[0x06+55]<<8)); #endif splx(s); } @@ -3131,6 +3178,9 @@ copy_font(int operation, int font_type, char* font_image) int ch, line, segment, fontsize; u_char val; + /* dont mess with console we dont know video mode on */ + if (cur_console->status & UNKNOWN_MODE) + return; switch (font_type) { default: case FONT_8: @@ -3492,4 +3542,29 @@ blink_screen(scr_stat *scp) } } +#ifdef SC_SPLASH_SCREEN +static void +toggle_splash_screen(scr_stat *scp) +{ + static int toggle = 0; + static u_char save_mode; + int s = splhigh(); + + if (toggle) { + scp->mode = save_mode; + scp->status &= ~UNKNOWN_MODE; + set_mode(scp); + toggle = 0; + } + else { + save_mode = scp->mode; + scp->mode = M_VGA_CG320; + scp->status |= UNKNOWN_MODE; + set_mode(scp); + /* load image */ + toggle = 1; + } + splx(s); +} +#endif #endif /* NSC */ diff --git a/sys/isa/syscons.h b/sys/isa/syscons.h index 651510a..a0df98d 100644 --- a/sys/isa/syscons.h +++ b/sys/isa/syscons.h @@ -25,7 +25,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $Id: syscons.h,v 1.19 1996/06/26 13:04:53 sos Exp $ + * $Id: syscons.h,v 1.20 1996/09/01 18:16:06 sos Exp $ */ #ifndef _I386_ISA_SYSCONS_H_ @@ -140,8 +140,10 @@ typedef struct scr_stat { u_short *scr_buf; /* buffer when off screen */ int xpos; /* current X position */ int ypos; /* current Y position */ - int xsize; /* X size */ - int ysize; /* Y size */ + int xsize; /* X text size */ + int ysize; /* Y text size */ + int xpixel; /* X graphics size */ + int ypixel; /* Y graphics size */ int font_size; /* fontsize in Y direction */ int start; /* modified area start */ int end; /* modified area end */ |