o Restore removed hardware cursor support and make it _default_

case, software cursor now optional case. Driver must provide
  raw things (what hardware do for us, exactly) as default case,
  all driver features must be _optional_. Modern VGAs have internal
  configuration utilities to set cursor shape/blinking which stored
  into cards ROM, and syscons nuke out such features completely
  by forcing software cursor. Moreover, software cursor is hard
  to distinguish on standouted (or near standouted) fields and
  tends to disappearse from the screen.
  Set "flags 0x4" to enable software cursor now.

o Cleanup screen savers.

o Don't draw cursor if saver or blinker is active.

o Duplicated code moved to functons.

o Add more checks for blinker in progress, character lost otherwise
  when blinker restore old contents.

o Reduce blinking counter to 3, too slow in old variant.

o Fix timeout code in scrn_timer(), old variant can reenter iself,
  if action takes too long time.

o Disable visual bell for scroll lock mode, saved screen
  becomes overwritted otherwise.
This commit is contained in:
Andrey A. Chernov 1995-01-26 04:56:25 +00:00
parent 8eea120788
commit 5ddda58b2e
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=5920
3 changed files with 360 additions and 153 deletions

View file

@ -35,7 +35,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* $Id: syscons.c,v 1.92 1995/01/13 17:13:13 sos Exp $ * $Id: syscons.c,v 1.93 1995/01/20 08:35:32 sos Exp $
*/ */
#include "sc.h" #include "sc.h"
@ -99,7 +99,7 @@
/* configuration flags */ /* configuration flags */
#define VISUAL_BELL 0x00001 #define VISUAL_BELL 0x00001
#define BLINK_CURSOR 0x00002 #define BLINK_CURSOR 0x00002
#define CHAR_CURSOR 0x00004 #define SOFT_CURSOR 0x00004
/* video hardware memory addresses */ /* video hardware memory addresses */
#define VIDEOMEM 0x000A0000 #define VIDEOMEM 0x000A0000
@ -205,6 +205,9 @@ static scr_stat *cur_console;
static scr_stat *new_scp, *old_scp; static scr_stat *new_scp, *old_scp;
static term_stat kernel_console; static term_stat kernel_console;
static default_attr *current_default; static default_attr *current_default;
static char hw_cursor_start = -1;
static char hw_cursor_end = -1;
static int force_hw_cursor_pos = 1;
static char switch_in_progress = 0; static char switch_in_progress = 0;
static char blink_in_progress = 0; static char blink_in_progress = 0;
static char write_in_progress = 0; static char write_in_progress = 0;
@ -264,8 +267,10 @@ static scr_stat *get_scr_stat(dev_t dev);
static scr_stat *alloc_scp(); static scr_stat *alloc_scp();
static void init_scp(scr_stat *scp); static void init_scp(scr_stat *scp);
static int get_scr_num(); static int get_scr_num();
static void cursor_shape(int start, int end); static void cursor_shape(char start, char end);
static void get_cursor_shape(int *start, int *end); static void get_cursor_shape(char *start, char *end);
static void set_hw_cursor_pos(u_short pos);
static void update_hw_cursor_pos(void);
static void scrn_timer(); static void scrn_timer();
static void clear_screen(scr_stat *scp); static void clear_screen(scr_stat *scp);
static int switch_scr(scr_stat *scp, u_int next_scr); static int switch_scr(scr_stat *scp, u_int next_scr);
@ -453,6 +458,8 @@ scattach(struct isa_device *dev)
#endif #endif
console[0]->font = FONT_16; console[0]->font = FONT_16;
save_palette(); save_palette();
if (!(configuration & SOFT_CURSOR))
get_cursor_shape(&hw_cursor_start, &hw_cursor_end);
} }
/* get screensaver going */ /* get screensaver going */
scrn_timer(); scrn_timer();
@ -1255,7 +1262,7 @@ scstart(struct tty *tp)
u_char buf[PCBURST]; u_char buf[PCBURST];
scr_stat *scp = get_scr_stat(tp->t_dev); scr_stat *scp = get_scr_stat(tp->t_dev);
if (scp->status & SLKED) if (blink_in_progress || (scp->status & SLKED))
return; return;
s = spltty(); s = spltty();
if (!(tp->t_state & (TS_TIMEOUT|TS_BUSY|TS_TTSTOP))) { if (!(tp->t_state & (TS_TIMEOUT|TS_BUSY|TS_TTSTOP))) {
@ -1263,6 +1270,7 @@ scstart(struct tty *tp)
splx(s); splx(s);
rbp = &tp->t_outq; rbp = &tp->t_outq;
scp->cursor_protect = 1; scp->cursor_protect = 1;
if (configuration & SOFT_CURSOR)
undraw_cursor(scp); undraw_cursor(scp);
while (rbp->c_cc) { while (rbp->c_cc) {
#if 0 #if 0
@ -1274,6 +1282,7 @@ scstart(struct tty *tp)
ansi_put(scp, buf, len); ansi_put(scp, buf, len);
#endif #endif
} }
if (configuration & SOFT_CURSOR)
draw_cursor(scp); draw_cursor(scp);
scp->cursor_protect = 0; scp->cursor_protect = 0;
s = spltty(); s = spltty();
@ -1316,6 +1325,8 @@ pccnputc(dev_t dev, char c)
if (c == '\n') if (c == '\n')
scput('\r'); scput('\r');
scput(c); scput(c);
if (!(configuration & SOFT_CURSOR) && cur_console == console[0])
update_hw_cursor_pos();
} }
int int
@ -1346,6 +1357,7 @@ fade_saver(int test)
if (test) { if (test) {
scrn_blanked = 1; scrn_blanked = 1;
force_hw_cursor_pos = 1;
if (count < 64) { if (count < 64) {
outb(PIXMASK, 0xFF); /* no pixelmask */ outb(PIXMASK, 0xFF); /* no pixelmask */
outb(PALWADR, 0x00); outb(PALWADR, 0x00);
@ -1364,8 +1376,9 @@ fade_saver(int test)
} }
} }
else { else {
count = scrn_blanked = 0; count = 0;
load_palette(); load_palette();
scrn_blanked = 0;
} }
} }
@ -1375,13 +1388,14 @@ blank_saver(int test)
u_char val; u_char val;
if (test) { if (test) {
scrn_blanked = 1; scrn_blanked = 1;
force_hw_cursor_pos = 1;
outb(TSIDX, 0x01); val = inb(TSREG); outb(TSIDX, 0x01); val = inb(TSREG);
outb(TSIDX, 0x01); outb(TSREG, val | 0x20); outb(TSIDX, 0x01); outb(TSREG, val | 0x20);
} }
else { else {
scrn_blanked = 0;
outb(TSIDX, 0x01); val = inb(TSREG); outb(TSIDX, 0x01); val = inb(TSREG);
outb(TSIDX, 0x01); outb(TSREG, val & 0xDF); outb(TSIDX, 0x01); outb(TSREG, val & 0xDF);
scrn_blanked = 0;
} }
} }
@ -1391,17 +1405,18 @@ green_saver(int test)
u_char val; u_char val;
if (test) { if (test) {
scrn_blanked = 1; scrn_blanked = 1;
force_hw_cursor_pos = 1;
outb(TSIDX, 0x01); val = inb(TSREG); outb(TSIDX, 0x01); val = inb(TSREG);
outb(TSIDX, 0x01); outb(TSREG, val | 0x20); outb(TSIDX, 0x01); outb(TSREG, val | 0x20);
outb(crtc_addr, 0x17); val = inb(crtc_addr + 1); outb(crtc_addr, 0x17); val = inb(crtc_addr + 1);
outb(crtc_addr + 1, val & ~0x80); outb(crtc_addr + 1, val & ~0x80);
} }
else { else {
scrn_blanked = 0;
outb(TSIDX, 0x01); val = inb(TSREG); outb(TSIDX, 0x01); val = inb(TSREG);
outb(TSIDX, 0x01); outb(TSREG, val & 0xDF); outb(TSIDX, 0x01); outb(TSREG, val & 0xDF);
outb(crtc_addr, 0x17); val = inb(crtc_addr + 1); outb(crtc_addr, 0x17); val = inb(crtc_addr + 1);
outb(crtc_addr + 1, val | 0x80); outb(crtc_addr + 1, val | 0x80);
scrn_blanked = 0;
} }
} }
@ -1423,17 +1438,13 @@ star_saver(int test)
if (test) { if (test) {
if (!scrn_blanked) { if (!scrn_blanked) {
scrn_blanked = 1;
undraw_cursor(scp);
bcopyw(Crtat, scp->scr_buf, bcopyw(Crtat, scp->scr_buf,
scp->xsize * scp->ysize * 2); scp->xsize * scp->ysize * 2);
fillw((FG_LIGHTGREY|BG_BLACK)<<8 | scr_map[0x20], Crtat, fillw((FG_LIGHTGREY|BG_BLACK)<<8 | scr_map[0x20], Crtat,
scp->xsize * scp->ysize); scp->xsize * scp->ysize);
set_border(0); set_border(0);
i = scp->ysize * scp->xsize + 5;
outb(crtc_addr, 14);
outb(crtc_addr+1, i >> 8);
outb(crtc_addr, 15);
outb(crtc_addr+1, i & 0xff);
scrn_blanked = 1;
for(i=0; i<NUM_STARS; i++) { for(i=0; i<NUM_STARS; i++) {
stars[i][0] = stars[i][0] =
random() % (scp->xsize*scp->ysize); random() % (scp->xsize*scp->ysize);
@ -1469,6 +1480,8 @@ snake_saver(int test)
if (test) { if (test) {
if (!scrn_blanked) { if (!scrn_blanked) {
scrn_blanked = 1;
undraw_cursor(scp);
bcopyw(Crtat, scp->scr_buf, bcopyw(Crtat, scp->scr_buf,
scp->xsize * scp->ysize * 2); scp->xsize * scp->ysize * 2);
fillw((FG_LIGHTGREY|BG_BLACK)<<8 | scr_map[0x20], fillw((FG_LIGHTGREY|BG_BLACK)<<8 | scr_map[0x20],
@ -1481,12 +1494,6 @@ snake_saver(int test)
savs[f] = (u_char *)Crtat + 2 * savs[f] = (u_char *)Crtat + 2 *
(scp->xpos+scp->ypos*scp->xsize); (scp->xpos+scp->ypos*scp->xsize);
*(savs[0]) = scr_map[*saves]; *(savs[0]) = scr_map[*saves];
f = scp->ysize * scp->xsize + 5;
outb(crtc_addr, 14);
outb(crtc_addr+1, f >> 8);
outb(crtc_addr, 15);
outb(crtc_addr+1, f & 0xff);
scrn_blanked = 1;
} }
if (scrn_blanked++ < 4) if (scrn_blanked++ < 4)
return; return;
@ -1518,39 +1525,65 @@ snake_saver(int test)
} }
static void static void
cursor_shape(int start, int end) cursor_shape(char start, char end)
{ {
outb(crtc_addr, 10); outb(crtc_addr, 10);
outb(crtc_addr+1, start & 0xFF); outb(crtc_addr+1, start);
outb(crtc_addr, 11); outb(crtc_addr, 11);
outb(crtc_addr+1, end & 0xFF); outb(crtc_addr+1, end);
} }
#if !defined(FAT_CURSOR)
static void static void
get_cursor_shape(int *start, int *end) get_cursor_shape(char *start, char *end)
{ {
outb(crtc_addr, 10); outb(crtc_addr, 10);
*start = inb(crtc_addr+1) & 0x1F; *start = inb(crtc_addr+1) & 0x1F;
outb(crtc_addr, 11); outb(crtc_addr, 11);
*end = inb(crtc_addr+1) & 0x1F; *end = inb(crtc_addr+1) & 0x1F;
} }
#endif
static void
set_hw_cursor_pos(u_short pos)
{
outb(crtc_addr, 14);
outb(crtc_addr+1, pos >> 8);
outb(crtc_addr, 15);
outb(crtc_addr+1, pos & 0xff);
}
static void
update_hw_cursor_pos(void)
{
static int cur_hw_cursor_pos = -1;
int pos = cur_console->cursor_pos - cur_console->crt_base;
if (force_hw_cursor_pos || pos != cur_hw_cursor_pos) {
cur_hw_cursor_pos = pos;
force_hw_cursor_pos = 0;
set_hw_cursor_pos(pos);
}
}
static void static void
scrn_timer() scrn_timer()
{ {
timeout((timeout_func_t)scrn_timer, 0, hz/5);
if (cur_console->status & UNKNOWN_MODE) if (cur_console->status & UNKNOWN_MODE)
return; goto set_timeout;
if (!cur_console->cursor_protect && configuration & BLINK_CURSOR) { if (!cur_console->cursor_protect && !scrn_blanked && !blink_in_progress) {
if (!(configuration & SOFT_CURSOR))
update_hw_cursor_pos();
else if (configuration & BLINK_CURSOR) {
if (cur_console->cursor_saveunder) if (cur_console->cursor_saveunder)
undraw_cursor(cur_console); undraw_cursor(cur_console);
else else
draw_cursor(cur_console); draw_cursor(cur_console);
} }
}
if (scrn_blank_time && (time.tv_sec > scrn_time_stamp+scrn_blank_time)) if (scrn_blank_time && (time.tv_sec > scrn_time_stamp+scrn_blank_time))
SCRN_SAVER(1); SCRN_SAVER(1);
set_timeout:
timeout((timeout_func_t)scrn_timer, 0,
(configuration & SOFT_CURSOR) ? hz/5 : hz/20);
} }
static void static void
@ -2061,15 +2094,16 @@ scan_esc(scr_stat *scp, u_char c)
else else
configuration &= ~BLINK_CURSOR; configuration &= ~BLINK_CURSOR;
} }
#if 0 else if (crtc_vga &&
else if (scp->term.num_param == 2) { !(configuration & SOFT_CURSOR) &&
scp->term.num_param == 2
) {
scp->cursor_start = scp->term.param[0] & 0x1F; scp->cursor_start = scp->term.param[0] & 0x1F;
scp->cursor_end = scp->term.param[1] & 0x1F; scp->cursor_end = scp->term.param[1] & 0x1F;
if (scp == cur_console) if (scp == cur_console)
cursor_shape(scp->cursor_start, cursor_shape(scp->cursor_start,
scp->cursor_end); scp->cursor_end);
} }
#endif
break; break;
case 'F': /* set ansi foreground */ case 'F': /* set ansi foreground */
@ -2107,6 +2141,11 @@ scan_esc(scr_stat *scp, u_char c)
static void static void
undraw_cursor(scr_stat *scp) undraw_cursor(scr_stat *scp)
{ {
if (!(configuration & SOFT_CURSOR) && scp == cur_console) {
force_hw_cursor_pos = 1;
set_hw_cursor_pos(0xffff);
return;
}
if (scp->cursor_saveunder) { if (scp->cursor_saveunder) {
*scp->cursor_pos = scp->cursor_saveunder; *scp->cursor_pos = scp->cursor_saveunder;
scp->cursor_saveunder = 0; scp->cursor_saveunder = 0;
@ -2116,6 +2155,10 @@ undraw_cursor(scr_stat *scp)
static void static void
draw_cursor(scr_stat *scp) draw_cursor(scr_stat *scp)
{ {
if (!(configuration & SOFT_CURSOR) && scp == cur_console) {
update_hw_cursor_pos();
return;
}
scp->cursor_saveunder = *scp->cursor_pos; scp->cursor_saveunder = *scp->cursor_pos;
if ((scp->cursor_saveunder & 0x7000) == 0x7000) { if ((scp->cursor_saveunder & 0x7000) == 0x7000) {
*scp->cursor_pos &= 0x8fff; *scp->cursor_pos &= 0x8fff;
@ -2148,6 +2191,8 @@ ansi_put(scr_stat *scp, u_char *buf, int len)
} }
write_in_progress++; write_in_progress++;
outloop: outloop:
while (blink_in_progress) /* bell can come from keyboard handler */
;
if (scp->term.esc) { if (scp->term.esc) {
scan_esc(scp, *ptr++); scan_esc(scp, *ptr++);
len--; len--;
@ -2201,6 +2246,8 @@ ansi_put(scr_stat *scp, u_char *buf, int len)
} }
ptr++; len--; ptr++; len--;
} }
while (blink_in_progress) /* wait for bell finished before scroll */
;
/* do we have to scroll ?? */ /* do we have to scroll ?? */
if (scp->cursor_pos >= scp->crt_base + scp->ysize * scp->xsize) { if (scp->cursor_pos >= scp->crt_base + scp->ysize * scp->xsize) {
if (scp->history) { if (scp->history) {
@ -2266,10 +2313,8 @@ static char init_done = 0;
hw_cursor |= inb(crtc_addr+1); hw_cursor |= inb(crtc_addr+1);
/* move hardware cursor out of the way */ /* move hardware cursor out of the way */
outb(crtc_addr,14); if (configuration & SOFT_CURSOR)
outb(crtc_addr+1, 0xff); set_hw_cursor_pos(0xffff);
outb(crtc_addr,15);
outb(crtc_addr+1, 0xff);
/* is this a VGA or higher ? */ /* is this a VGA or higher ? */
outb(crtc_addr, 7); outb(crtc_addr, 7);
@ -2342,8 +2387,13 @@ init_scp(scr_stat *scp)
scp->term.rev_attr = current_default->rev_attr; scp->term.rev_attr = current_default->rev_attr;
scp->term.cur_attr = scp->term.std_attr; scp->term.cur_attr = scp->term.std_attr;
scp->border = BG_BLACK; scp->border = BG_BLACK;
if (!(configuration & SOFT_CURSOR)) {
scp->cursor_start = -1; scp->cursor_start = -1;
scp->cursor_end = -1; scp->cursor_end = -1;
} else {
scp->cursor_start = hw_cursor_start;
scp->cursor_end = hw_cursor_end;
}
scp->cursor_protect = 0; scp->cursor_protect = 0;
scp->cursor_saveunder = 0; scp->cursor_saveunder = 0;
scp->mouse_xpos = scp->mouse_ypos = 0; scp->mouse_xpos = scp->mouse_ypos = 0;
@ -2367,12 +2417,14 @@ scput(u_char c)
scp->term = kernel_console; scp->term = kernel_console;
current_default = &kernel_default; current_default = &kernel_default;
scp->cursor_protect = 1; scp->cursor_protect = 1;
if (configuration & SOFT_CURSOR)
undraw_cursor(scp); undraw_cursor(scp);
#if 0 #if 0
ansi_put(scp, c); ansi_put(scp, c);
#else #else
ansi_put(scp, &c, 1); ansi_put(scp, &c, 1);
#endif #endif
if (configuration & SOFT_CURSOR)
draw_cursor(scp); draw_cursor(scp);
scp->cursor_protect = 0; scp->cursor_protect = 0;
kernel_console = scp->term; kernel_console = scp->term;
@ -3002,6 +3054,18 @@ set_mode(scr_stat *scp)
set_vgaregs(modetable); set_vgaregs(modetable);
font_size = *(modetable + 2); font_size = *(modetable + 2);
if (!(configuration & SOFT_CURSOR)) {
/* change cursor type if set */
if (scp->cursor_start != -1 && scp->cursor_end != -1)
cursor_shape(
(scp->cursor_start >= font_size)
? font_size - 1
: scp->cursor_start,
(scp->cursor_end >= font_size)
? font_size - 1
: scp->cursor_end);
}
/* set font type (size) */ /* set font type (size) */
switch (font_size) { switch (font_size) {
case 0x10: case 0x10:
@ -3018,6 +3082,7 @@ set_mode(scr_stat *scp)
scp->font = FONT_8; scp->font = FONT_8;
break; break;
} }
force_hw_cursor_pos = 1;
break; break;
case M_BG320: case M_CG320: case M_BG640: case M_BG320: case M_CG320: case M_BG640:
@ -3286,12 +3351,12 @@ do_bell(scr_stat *scp, int pitch, int duration)
{ {
if (scp == cur_console) { if (scp == cur_console) {
if (configuration & VISUAL_BELL) { if (configuration & VISUAL_BELL) {
if (blink_in_progress) if (blink_in_progress || (scp->status & BUFFER_SAVED))
return; return;
blink_in_progress = 3;
undraw_cursor(scp); undraw_cursor(scp);
bcopy(scp->crt_base, scp->scr_buf, bcopy(scp->crt_base, scp->scr_buf,
scp->xsize * scp->ysize * sizeof(u_short)); scp->xsize * scp->ysize * sizeof(u_short));
blink_in_progress = 4;
timeout((timeout_func_t)blink_screen, scp, hz/10); timeout((timeout_func_t)blink_screen, scp, hz/10);
} }
else else
@ -3302,6 +3367,10 @@ do_bell(scr_stat *scp, int pitch, int duration)
static void static void
blink_screen(scr_stat *scp) blink_screen(scr_stat *scp)
{ {
if (scp != cur_console) {
blink_in_progress = 0;
return;
}
if (blink_in_progress > 1) { if (blink_in_progress > 1) {
if (blink_in_progress & 1) if (blink_in_progress & 1)
fillw(kernel_default.std_attr | scr_map[0x20], fillw(kernel_default.std_attr | scr_map[0x20],

View file

@ -35,7 +35,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* $Id: syscons.c,v 1.92 1995/01/13 17:13:13 sos Exp $ * $Id: syscons.c,v 1.93 1995/01/20 08:35:32 sos Exp $
*/ */
#include "sc.h" #include "sc.h"
@ -99,7 +99,7 @@
/* configuration flags */ /* configuration flags */
#define VISUAL_BELL 0x00001 #define VISUAL_BELL 0x00001
#define BLINK_CURSOR 0x00002 #define BLINK_CURSOR 0x00002
#define CHAR_CURSOR 0x00004 #define SOFT_CURSOR 0x00004
/* video hardware memory addresses */ /* video hardware memory addresses */
#define VIDEOMEM 0x000A0000 #define VIDEOMEM 0x000A0000
@ -205,6 +205,9 @@ static scr_stat *cur_console;
static scr_stat *new_scp, *old_scp; static scr_stat *new_scp, *old_scp;
static term_stat kernel_console; static term_stat kernel_console;
static default_attr *current_default; static default_attr *current_default;
static char hw_cursor_start = -1;
static char hw_cursor_end = -1;
static int force_hw_cursor_pos = 1;
static char switch_in_progress = 0; static char switch_in_progress = 0;
static char blink_in_progress = 0; static char blink_in_progress = 0;
static char write_in_progress = 0; static char write_in_progress = 0;
@ -264,8 +267,10 @@ static scr_stat *get_scr_stat(dev_t dev);
static scr_stat *alloc_scp(); static scr_stat *alloc_scp();
static void init_scp(scr_stat *scp); static void init_scp(scr_stat *scp);
static int get_scr_num(); static int get_scr_num();
static void cursor_shape(int start, int end); static void cursor_shape(char start, char end);
static void get_cursor_shape(int *start, int *end); static void get_cursor_shape(char *start, char *end);
static void set_hw_cursor_pos(u_short pos);
static void update_hw_cursor_pos(void);
static void scrn_timer(); static void scrn_timer();
static void clear_screen(scr_stat *scp); static void clear_screen(scr_stat *scp);
static int switch_scr(scr_stat *scp, u_int next_scr); static int switch_scr(scr_stat *scp, u_int next_scr);
@ -453,6 +458,8 @@ scattach(struct isa_device *dev)
#endif #endif
console[0]->font = FONT_16; console[0]->font = FONT_16;
save_palette(); save_palette();
if (!(configuration & SOFT_CURSOR))
get_cursor_shape(&hw_cursor_start, &hw_cursor_end);
} }
/* get screensaver going */ /* get screensaver going */
scrn_timer(); scrn_timer();
@ -1255,7 +1262,7 @@ scstart(struct tty *tp)
u_char buf[PCBURST]; u_char buf[PCBURST];
scr_stat *scp = get_scr_stat(tp->t_dev); scr_stat *scp = get_scr_stat(tp->t_dev);
if (scp->status & SLKED) if (blink_in_progress || (scp->status & SLKED))
return; return;
s = spltty(); s = spltty();
if (!(tp->t_state & (TS_TIMEOUT|TS_BUSY|TS_TTSTOP))) { if (!(tp->t_state & (TS_TIMEOUT|TS_BUSY|TS_TTSTOP))) {
@ -1263,6 +1270,7 @@ scstart(struct tty *tp)
splx(s); splx(s);
rbp = &tp->t_outq; rbp = &tp->t_outq;
scp->cursor_protect = 1; scp->cursor_protect = 1;
if (configuration & SOFT_CURSOR)
undraw_cursor(scp); undraw_cursor(scp);
while (rbp->c_cc) { while (rbp->c_cc) {
#if 0 #if 0
@ -1274,6 +1282,7 @@ scstart(struct tty *tp)
ansi_put(scp, buf, len); ansi_put(scp, buf, len);
#endif #endif
} }
if (configuration & SOFT_CURSOR)
draw_cursor(scp); draw_cursor(scp);
scp->cursor_protect = 0; scp->cursor_protect = 0;
s = spltty(); s = spltty();
@ -1316,6 +1325,8 @@ pccnputc(dev_t dev, char c)
if (c == '\n') if (c == '\n')
scput('\r'); scput('\r');
scput(c); scput(c);
if (!(configuration & SOFT_CURSOR) && cur_console == console[0])
update_hw_cursor_pos();
} }
int int
@ -1346,6 +1357,7 @@ fade_saver(int test)
if (test) { if (test) {
scrn_blanked = 1; scrn_blanked = 1;
force_hw_cursor_pos = 1;
if (count < 64) { if (count < 64) {
outb(PIXMASK, 0xFF); /* no pixelmask */ outb(PIXMASK, 0xFF); /* no pixelmask */
outb(PALWADR, 0x00); outb(PALWADR, 0x00);
@ -1364,8 +1376,9 @@ fade_saver(int test)
} }
} }
else { else {
count = scrn_blanked = 0; count = 0;
load_palette(); load_palette();
scrn_blanked = 0;
} }
} }
@ -1375,13 +1388,14 @@ blank_saver(int test)
u_char val; u_char val;
if (test) { if (test) {
scrn_blanked = 1; scrn_blanked = 1;
force_hw_cursor_pos = 1;
outb(TSIDX, 0x01); val = inb(TSREG); outb(TSIDX, 0x01); val = inb(TSREG);
outb(TSIDX, 0x01); outb(TSREG, val | 0x20); outb(TSIDX, 0x01); outb(TSREG, val | 0x20);
} }
else { else {
scrn_blanked = 0;
outb(TSIDX, 0x01); val = inb(TSREG); outb(TSIDX, 0x01); val = inb(TSREG);
outb(TSIDX, 0x01); outb(TSREG, val & 0xDF); outb(TSIDX, 0x01); outb(TSREG, val & 0xDF);
scrn_blanked = 0;
} }
} }
@ -1391,17 +1405,18 @@ green_saver(int test)
u_char val; u_char val;
if (test) { if (test) {
scrn_blanked = 1; scrn_blanked = 1;
force_hw_cursor_pos = 1;
outb(TSIDX, 0x01); val = inb(TSREG); outb(TSIDX, 0x01); val = inb(TSREG);
outb(TSIDX, 0x01); outb(TSREG, val | 0x20); outb(TSIDX, 0x01); outb(TSREG, val | 0x20);
outb(crtc_addr, 0x17); val = inb(crtc_addr + 1); outb(crtc_addr, 0x17); val = inb(crtc_addr + 1);
outb(crtc_addr + 1, val & ~0x80); outb(crtc_addr + 1, val & ~0x80);
} }
else { else {
scrn_blanked = 0;
outb(TSIDX, 0x01); val = inb(TSREG); outb(TSIDX, 0x01); val = inb(TSREG);
outb(TSIDX, 0x01); outb(TSREG, val & 0xDF); outb(TSIDX, 0x01); outb(TSREG, val & 0xDF);
outb(crtc_addr, 0x17); val = inb(crtc_addr + 1); outb(crtc_addr, 0x17); val = inb(crtc_addr + 1);
outb(crtc_addr + 1, val | 0x80); outb(crtc_addr + 1, val | 0x80);
scrn_blanked = 0;
} }
} }
@ -1423,17 +1438,13 @@ star_saver(int test)
if (test) { if (test) {
if (!scrn_blanked) { if (!scrn_blanked) {
scrn_blanked = 1;
undraw_cursor(scp);
bcopyw(Crtat, scp->scr_buf, bcopyw(Crtat, scp->scr_buf,
scp->xsize * scp->ysize * 2); scp->xsize * scp->ysize * 2);
fillw((FG_LIGHTGREY|BG_BLACK)<<8 | scr_map[0x20], Crtat, fillw((FG_LIGHTGREY|BG_BLACK)<<8 | scr_map[0x20], Crtat,
scp->xsize * scp->ysize); scp->xsize * scp->ysize);
set_border(0); set_border(0);
i = scp->ysize * scp->xsize + 5;
outb(crtc_addr, 14);
outb(crtc_addr+1, i >> 8);
outb(crtc_addr, 15);
outb(crtc_addr+1, i & 0xff);
scrn_blanked = 1;
for(i=0; i<NUM_STARS; i++) { for(i=0; i<NUM_STARS; i++) {
stars[i][0] = stars[i][0] =
random() % (scp->xsize*scp->ysize); random() % (scp->xsize*scp->ysize);
@ -1469,6 +1480,8 @@ snake_saver(int test)
if (test) { if (test) {
if (!scrn_blanked) { if (!scrn_blanked) {
scrn_blanked = 1;
undraw_cursor(scp);
bcopyw(Crtat, scp->scr_buf, bcopyw(Crtat, scp->scr_buf,
scp->xsize * scp->ysize * 2); scp->xsize * scp->ysize * 2);
fillw((FG_LIGHTGREY|BG_BLACK)<<8 | scr_map[0x20], fillw((FG_LIGHTGREY|BG_BLACK)<<8 | scr_map[0x20],
@ -1481,12 +1494,6 @@ snake_saver(int test)
savs[f] = (u_char *)Crtat + 2 * savs[f] = (u_char *)Crtat + 2 *
(scp->xpos+scp->ypos*scp->xsize); (scp->xpos+scp->ypos*scp->xsize);
*(savs[0]) = scr_map[*saves]; *(savs[0]) = scr_map[*saves];
f = scp->ysize * scp->xsize + 5;
outb(crtc_addr, 14);
outb(crtc_addr+1, f >> 8);
outb(crtc_addr, 15);
outb(crtc_addr+1, f & 0xff);
scrn_blanked = 1;
} }
if (scrn_blanked++ < 4) if (scrn_blanked++ < 4)
return; return;
@ -1518,39 +1525,65 @@ snake_saver(int test)
} }
static void static void
cursor_shape(int start, int end) cursor_shape(char start, char end)
{ {
outb(crtc_addr, 10); outb(crtc_addr, 10);
outb(crtc_addr+1, start & 0xFF); outb(crtc_addr+1, start);
outb(crtc_addr, 11); outb(crtc_addr, 11);
outb(crtc_addr+1, end & 0xFF); outb(crtc_addr+1, end);
} }
#if !defined(FAT_CURSOR)
static void static void
get_cursor_shape(int *start, int *end) get_cursor_shape(char *start, char *end)
{ {
outb(crtc_addr, 10); outb(crtc_addr, 10);
*start = inb(crtc_addr+1) & 0x1F; *start = inb(crtc_addr+1) & 0x1F;
outb(crtc_addr, 11); outb(crtc_addr, 11);
*end = inb(crtc_addr+1) & 0x1F; *end = inb(crtc_addr+1) & 0x1F;
} }
#endif
static void
set_hw_cursor_pos(u_short pos)
{
outb(crtc_addr, 14);
outb(crtc_addr+1, pos >> 8);
outb(crtc_addr, 15);
outb(crtc_addr+1, pos & 0xff);
}
static void
update_hw_cursor_pos(void)
{
static int cur_hw_cursor_pos = -1;
int pos = cur_console->cursor_pos - cur_console->crt_base;
if (force_hw_cursor_pos || pos != cur_hw_cursor_pos) {
cur_hw_cursor_pos = pos;
force_hw_cursor_pos = 0;
set_hw_cursor_pos(pos);
}
}
static void static void
scrn_timer() scrn_timer()
{ {
timeout((timeout_func_t)scrn_timer, 0, hz/5);
if (cur_console->status & UNKNOWN_MODE) if (cur_console->status & UNKNOWN_MODE)
return; goto set_timeout;
if (!cur_console->cursor_protect && configuration & BLINK_CURSOR) { if (!cur_console->cursor_protect && !scrn_blanked && !blink_in_progress) {
if (!(configuration & SOFT_CURSOR))
update_hw_cursor_pos();
else if (configuration & BLINK_CURSOR) {
if (cur_console->cursor_saveunder) if (cur_console->cursor_saveunder)
undraw_cursor(cur_console); undraw_cursor(cur_console);
else else
draw_cursor(cur_console); draw_cursor(cur_console);
} }
}
if (scrn_blank_time && (time.tv_sec > scrn_time_stamp+scrn_blank_time)) if (scrn_blank_time && (time.tv_sec > scrn_time_stamp+scrn_blank_time))
SCRN_SAVER(1); SCRN_SAVER(1);
set_timeout:
timeout((timeout_func_t)scrn_timer, 0,
(configuration & SOFT_CURSOR) ? hz/5 : hz/20);
} }
static void static void
@ -2061,15 +2094,16 @@ scan_esc(scr_stat *scp, u_char c)
else else
configuration &= ~BLINK_CURSOR; configuration &= ~BLINK_CURSOR;
} }
#if 0 else if (crtc_vga &&
else if (scp->term.num_param == 2) { !(configuration & SOFT_CURSOR) &&
scp->term.num_param == 2
) {
scp->cursor_start = scp->term.param[0] & 0x1F; scp->cursor_start = scp->term.param[0] & 0x1F;
scp->cursor_end = scp->term.param[1] & 0x1F; scp->cursor_end = scp->term.param[1] & 0x1F;
if (scp == cur_console) if (scp == cur_console)
cursor_shape(scp->cursor_start, cursor_shape(scp->cursor_start,
scp->cursor_end); scp->cursor_end);
} }
#endif
break; break;
case 'F': /* set ansi foreground */ case 'F': /* set ansi foreground */
@ -2107,6 +2141,11 @@ scan_esc(scr_stat *scp, u_char c)
static void static void
undraw_cursor(scr_stat *scp) undraw_cursor(scr_stat *scp)
{ {
if (!(configuration & SOFT_CURSOR) && scp == cur_console) {
force_hw_cursor_pos = 1;
set_hw_cursor_pos(0xffff);
return;
}
if (scp->cursor_saveunder) { if (scp->cursor_saveunder) {
*scp->cursor_pos = scp->cursor_saveunder; *scp->cursor_pos = scp->cursor_saveunder;
scp->cursor_saveunder = 0; scp->cursor_saveunder = 0;
@ -2116,6 +2155,10 @@ undraw_cursor(scr_stat *scp)
static void static void
draw_cursor(scr_stat *scp) draw_cursor(scr_stat *scp)
{ {
if (!(configuration & SOFT_CURSOR) && scp == cur_console) {
update_hw_cursor_pos();
return;
}
scp->cursor_saveunder = *scp->cursor_pos; scp->cursor_saveunder = *scp->cursor_pos;
if ((scp->cursor_saveunder & 0x7000) == 0x7000) { if ((scp->cursor_saveunder & 0x7000) == 0x7000) {
*scp->cursor_pos &= 0x8fff; *scp->cursor_pos &= 0x8fff;
@ -2148,6 +2191,8 @@ ansi_put(scr_stat *scp, u_char *buf, int len)
} }
write_in_progress++; write_in_progress++;
outloop: outloop:
while (blink_in_progress) /* bell can come from keyboard handler */
;
if (scp->term.esc) { if (scp->term.esc) {
scan_esc(scp, *ptr++); scan_esc(scp, *ptr++);
len--; len--;
@ -2201,6 +2246,8 @@ ansi_put(scr_stat *scp, u_char *buf, int len)
} }
ptr++; len--; ptr++; len--;
} }
while (blink_in_progress) /* wait for bell finished before scroll */
;
/* do we have to scroll ?? */ /* do we have to scroll ?? */
if (scp->cursor_pos >= scp->crt_base + scp->ysize * scp->xsize) { if (scp->cursor_pos >= scp->crt_base + scp->ysize * scp->xsize) {
if (scp->history) { if (scp->history) {
@ -2266,10 +2313,8 @@ static char init_done = 0;
hw_cursor |= inb(crtc_addr+1); hw_cursor |= inb(crtc_addr+1);
/* move hardware cursor out of the way */ /* move hardware cursor out of the way */
outb(crtc_addr,14); if (configuration & SOFT_CURSOR)
outb(crtc_addr+1, 0xff); set_hw_cursor_pos(0xffff);
outb(crtc_addr,15);
outb(crtc_addr+1, 0xff);
/* is this a VGA or higher ? */ /* is this a VGA or higher ? */
outb(crtc_addr, 7); outb(crtc_addr, 7);
@ -2342,8 +2387,13 @@ init_scp(scr_stat *scp)
scp->term.rev_attr = current_default->rev_attr; scp->term.rev_attr = current_default->rev_attr;
scp->term.cur_attr = scp->term.std_attr; scp->term.cur_attr = scp->term.std_attr;
scp->border = BG_BLACK; scp->border = BG_BLACK;
if (!(configuration & SOFT_CURSOR)) {
scp->cursor_start = -1; scp->cursor_start = -1;
scp->cursor_end = -1; scp->cursor_end = -1;
} else {
scp->cursor_start = hw_cursor_start;
scp->cursor_end = hw_cursor_end;
}
scp->cursor_protect = 0; scp->cursor_protect = 0;
scp->cursor_saveunder = 0; scp->cursor_saveunder = 0;
scp->mouse_xpos = scp->mouse_ypos = 0; scp->mouse_xpos = scp->mouse_ypos = 0;
@ -2367,12 +2417,14 @@ scput(u_char c)
scp->term = kernel_console; scp->term = kernel_console;
current_default = &kernel_default; current_default = &kernel_default;
scp->cursor_protect = 1; scp->cursor_protect = 1;
if (configuration & SOFT_CURSOR)
undraw_cursor(scp); undraw_cursor(scp);
#if 0 #if 0
ansi_put(scp, c); ansi_put(scp, c);
#else #else
ansi_put(scp, &c, 1); ansi_put(scp, &c, 1);
#endif #endif
if (configuration & SOFT_CURSOR)
draw_cursor(scp); draw_cursor(scp);
scp->cursor_protect = 0; scp->cursor_protect = 0;
kernel_console = scp->term; kernel_console = scp->term;
@ -3002,6 +3054,18 @@ set_mode(scr_stat *scp)
set_vgaregs(modetable); set_vgaregs(modetable);
font_size = *(modetable + 2); font_size = *(modetable + 2);
if (!(configuration & SOFT_CURSOR)) {
/* change cursor type if set */
if (scp->cursor_start != -1 && scp->cursor_end != -1)
cursor_shape(
(scp->cursor_start >= font_size)
? font_size - 1
: scp->cursor_start,
(scp->cursor_end >= font_size)
? font_size - 1
: scp->cursor_end);
}
/* set font type (size) */ /* set font type (size) */
switch (font_size) { switch (font_size) {
case 0x10: case 0x10:
@ -3018,6 +3082,7 @@ set_mode(scr_stat *scp)
scp->font = FONT_8; scp->font = FONT_8;
break; break;
} }
force_hw_cursor_pos = 1;
break; break;
case M_BG320: case M_CG320: case M_BG640: case M_BG320: case M_CG320: case M_BG640:
@ -3286,12 +3351,12 @@ do_bell(scr_stat *scp, int pitch, int duration)
{ {
if (scp == cur_console) { if (scp == cur_console) {
if (configuration & VISUAL_BELL) { if (configuration & VISUAL_BELL) {
if (blink_in_progress) if (blink_in_progress || (scp->status & BUFFER_SAVED))
return; return;
blink_in_progress = 3;
undraw_cursor(scp); undraw_cursor(scp);
bcopy(scp->crt_base, scp->scr_buf, bcopy(scp->crt_base, scp->scr_buf,
scp->xsize * scp->ysize * sizeof(u_short)); scp->xsize * scp->ysize * sizeof(u_short));
blink_in_progress = 4;
timeout((timeout_func_t)blink_screen, scp, hz/10); timeout((timeout_func_t)blink_screen, scp, hz/10);
} }
else else
@ -3302,6 +3367,10 @@ do_bell(scr_stat *scp, int pitch, int duration)
static void static void
blink_screen(scr_stat *scp) blink_screen(scr_stat *scp)
{ {
if (scp != cur_console) {
blink_in_progress = 0;
return;
}
if (blink_in_progress > 1) { if (blink_in_progress > 1) {
if (blink_in_progress & 1) if (blink_in_progress & 1)
fillw(kernel_default.std_attr | scr_map[0x20], fillw(kernel_default.std_attr | scr_map[0x20],

View file

@ -35,7 +35,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* $Id: syscons.c,v 1.92 1995/01/13 17:13:13 sos Exp $ * $Id: syscons.c,v 1.93 1995/01/20 08:35:32 sos Exp $
*/ */
#include "sc.h" #include "sc.h"
@ -99,7 +99,7 @@
/* configuration flags */ /* configuration flags */
#define VISUAL_BELL 0x00001 #define VISUAL_BELL 0x00001
#define BLINK_CURSOR 0x00002 #define BLINK_CURSOR 0x00002
#define CHAR_CURSOR 0x00004 #define SOFT_CURSOR 0x00004
/* video hardware memory addresses */ /* video hardware memory addresses */
#define VIDEOMEM 0x000A0000 #define VIDEOMEM 0x000A0000
@ -205,6 +205,9 @@ static scr_stat *cur_console;
static scr_stat *new_scp, *old_scp; static scr_stat *new_scp, *old_scp;
static term_stat kernel_console; static term_stat kernel_console;
static default_attr *current_default; static default_attr *current_default;
static char hw_cursor_start = -1;
static char hw_cursor_end = -1;
static int force_hw_cursor_pos = 1;
static char switch_in_progress = 0; static char switch_in_progress = 0;
static char blink_in_progress = 0; static char blink_in_progress = 0;
static char write_in_progress = 0; static char write_in_progress = 0;
@ -264,8 +267,10 @@ static scr_stat *get_scr_stat(dev_t dev);
static scr_stat *alloc_scp(); static scr_stat *alloc_scp();
static void init_scp(scr_stat *scp); static void init_scp(scr_stat *scp);
static int get_scr_num(); static int get_scr_num();
static void cursor_shape(int start, int end); static void cursor_shape(char start, char end);
static void get_cursor_shape(int *start, int *end); static void get_cursor_shape(char *start, char *end);
static void set_hw_cursor_pos(u_short pos);
static void update_hw_cursor_pos(void);
static void scrn_timer(); static void scrn_timer();
static void clear_screen(scr_stat *scp); static void clear_screen(scr_stat *scp);
static int switch_scr(scr_stat *scp, u_int next_scr); static int switch_scr(scr_stat *scp, u_int next_scr);
@ -453,6 +458,8 @@ scattach(struct isa_device *dev)
#endif #endif
console[0]->font = FONT_16; console[0]->font = FONT_16;
save_palette(); save_palette();
if (!(configuration & SOFT_CURSOR))
get_cursor_shape(&hw_cursor_start, &hw_cursor_end);
} }
/* get screensaver going */ /* get screensaver going */
scrn_timer(); scrn_timer();
@ -1255,7 +1262,7 @@ scstart(struct tty *tp)
u_char buf[PCBURST]; u_char buf[PCBURST];
scr_stat *scp = get_scr_stat(tp->t_dev); scr_stat *scp = get_scr_stat(tp->t_dev);
if (scp->status & SLKED) if (blink_in_progress || (scp->status & SLKED))
return; return;
s = spltty(); s = spltty();
if (!(tp->t_state & (TS_TIMEOUT|TS_BUSY|TS_TTSTOP))) { if (!(tp->t_state & (TS_TIMEOUT|TS_BUSY|TS_TTSTOP))) {
@ -1263,6 +1270,7 @@ scstart(struct tty *tp)
splx(s); splx(s);
rbp = &tp->t_outq; rbp = &tp->t_outq;
scp->cursor_protect = 1; scp->cursor_protect = 1;
if (configuration & SOFT_CURSOR)
undraw_cursor(scp); undraw_cursor(scp);
while (rbp->c_cc) { while (rbp->c_cc) {
#if 0 #if 0
@ -1274,6 +1282,7 @@ scstart(struct tty *tp)
ansi_put(scp, buf, len); ansi_put(scp, buf, len);
#endif #endif
} }
if (configuration & SOFT_CURSOR)
draw_cursor(scp); draw_cursor(scp);
scp->cursor_protect = 0; scp->cursor_protect = 0;
s = spltty(); s = spltty();
@ -1316,6 +1325,8 @@ pccnputc(dev_t dev, char c)
if (c == '\n') if (c == '\n')
scput('\r'); scput('\r');
scput(c); scput(c);
if (!(configuration & SOFT_CURSOR) && cur_console == console[0])
update_hw_cursor_pos();
} }
int int
@ -1346,6 +1357,7 @@ fade_saver(int test)
if (test) { if (test) {
scrn_blanked = 1; scrn_blanked = 1;
force_hw_cursor_pos = 1;
if (count < 64) { if (count < 64) {
outb(PIXMASK, 0xFF); /* no pixelmask */ outb(PIXMASK, 0xFF); /* no pixelmask */
outb(PALWADR, 0x00); outb(PALWADR, 0x00);
@ -1364,8 +1376,9 @@ fade_saver(int test)
} }
} }
else { else {
count = scrn_blanked = 0; count = 0;
load_palette(); load_palette();
scrn_blanked = 0;
} }
} }
@ -1375,13 +1388,14 @@ blank_saver(int test)
u_char val; u_char val;
if (test) { if (test) {
scrn_blanked = 1; scrn_blanked = 1;
force_hw_cursor_pos = 1;
outb(TSIDX, 0x01); val = inb(TSREG); outb(TSIDX, 0x01); val = inb(TSREG);
outb(TSIDX, 0x01); outb(TSREG, val | 0x20); outb(TSIDX, 0x01); outb(TSREG, val | 0x20);
} }
else { else {
scrn_blanked = 0;
outb(TSIDX, 0x01); val = inb(TSREG); outb(TSIDX, 0x01); val = inb(TSREG);
outb(TSIDX, 0x01); outb(TSREG, val & 0xDF); outb(TSIDX, 0x01); outb(TSREG, val & 0xDF);
scrn_blanked = 0;
} }
} }
@ -1391,17 +1405,18 @@ green_saver(int test)
u_char val; u_char val;
if (test) { if (test) {
scrn_blanked = 1; scrn_blanked = 1;
force_hw_cursor_pos = 1;
outb(TSIDX, 0x01); val = inb(TSREG); outb(TSIDX, 0x01); val = inb(TSREG);
outb(TSIDX, 0x01); outb(TSREG, val | 0x20); outb(TSIDX, 0x01); outb(TSREG, val | 0x20);
outb(crtc_addr, 0x17); val = inb(crtc_addr + 1); outb(crtc_addr, 0x17); val = inb(crtc_addr + 1);
outb(crtc_addr + 1, val & ~0x80); outb(crtc_addr + 1, val & ~0x80);
} }
else { else {
scrn_blanked = 0;
outb(TSIDX, 0x01); val = inb(TSREG); outb(TSIDX, 0x01); val = inb(TSREG);
outb(TSIDX, 0x01); outb(TSREG, val & 0xDF); outb(TSIDX, 0x01); outb(TSREG, val & 0xDF);
outb(crtc_addr, 0x17); val = inb(crtc_addr + 1); outb(crtc_addr, 0x17); val = inb(crtc_addr + 1);
outb(crtc_addr + 1, val | 0x80); outb(crtc_addr + 1, val | 0x80);
scrn_blanked = 0;
} }
} }
@ -1423,17 +1438,13 @@ star_saver(int test)
if (test) { if (test) {
if (!scrn_blanked) { if (!scrn_blanked) {
scrn_blanked = 1;
undraw_cursor(scp);
bcopyw(Crtat, scp->scr_buf, bcopyw(Crtat, scp->scr_buf,
scp->xsize * scp->ysize * 2); scp->xsize * scp->ysize * 2);
fillw((FG_LIGHTGREY|BG_BLACK)<<8 | scr_map[0x20], Crtat, fillw((FG_LIGHTGREY|BG_BLACK)<<8 | scr_map[0x20], Crtat,
scp->xsize * scp->ysize); scp->xsize * scp->ysize);
set_border(0); set_border(0);
i = scp->ysize * scp->xsize + 5;
outb(crtc_addr, 14);
outb(crtc_addr+1, i >> 8);
outb(crtc_addr, 15);
outb(crtc_addr+1, i & 0xff);
scrn_blanked = 1;
for(i=0; i<NUM_STARS; i++) { for(i=0; i<NUM_STARS; i++) {
stars[i][0] = stars[i][0] =
random() % (scp->xsize*scp->ysize); random() % (scp->xsize*scp->ysize);
@ -1469,6 +1480,8 @@ snake_saver(int test)
if (test) { if (test) {
if (!scrn_blanked) { if (!scrn_blanked) {
scrn_blanked = 1;
undraw_cursor(scp);
bcopyw(Crtat, scp->scr_buf, bcopyw(Crtat, scp->scr_buf,
scp->xsize * scp->ysize * 2); scp->xsize * scp->ysize * 2);
fillw((FG_LIGHTGREY|BG_BLACK)<<8 | scr_map[0x20], fillw((FG_LIGHTGREY|BG_BLACK)<<8 | scr_map[0x20],
@ -1481,12 +1494,6 @@ snake_saver(int test)
savs[f] = (u_char *)Crtat + 2 * savs[f] = (u_char *)Crtat + 2 *
(scp->xpos+scp->ypos*scp->xsize); (scp->xpos+scp->ypos*scp->xsize);
*(savs[0]) = scr_map[*saves]; *(savs[0]) = scr_map[*saves];
f = scp->ysize * scp->xsize + 5;
outb(crtc_addr, 14);
outb(crtc_addr+1, f >> 8);
outb(crtc_addr, 15);
outb(crtc_addr+1, f & 0xff);
scrn_blanked = 1;
} }
if (scrn_blanked++ < 4) if (scrn_blanked++ < 4)
return; return;
@ -1518,39 +1525,65 @@ snake_saver(int test)
} }
static void static void
cursor_shape(int start, int end) cursor_shape(char start, char end)
{ {
outb(crtc_addr, 10); outb(crtc_addr, 10);
outb(crtc_addr+1, start & 0xFF); outb(crtc_addr+1, start);
outb(crtc_addr, 11); outb(crtc_addr, 11);
outb(crtc_addr+1, end & 0xFF); outb(crtc_addr+1, end);
} }
#if !defined(FAT_CURSOR)
static void static void
get_cursor_shape(int *start, int *end) get_cursor_shape(char *start, char *end)
{ {
outb(crtc_addr, 10); outb(crtc_addr, 10);
*start = inb(crtc_addr+1) & 0x1F; *start = inb(crtc_addr+1) & 0x1F;
outb(crtc_addr, 11); outb(crtc_addr, 11);
*end = inb(crtc_addr+1) & 0x1F; *end = inb(crtc_addr+1) & 0x1F;
} }
#endif
static void
set_hw_cursor_pos(u_short pos)
{
outb(crtc_addr, 14);
outb(crtc_addr+1, pos >> 8);
outb(crtc_addr, 15);
outb(crtc_addr+1, pos & 0xff);
}
static void
update_hw_cursor_pos(void)
{
static int cur_hw_cursor_pos = -1;
int pos = cur_console->cursor_pos - cur_console->crt_base;
if (force_hw_cursor_pos || pos != cur_hw_cursor_pos) {
cur_hw_cursor_pos = pos;
force_hw_cursor_pos = 0;
set_hw_cursor_pos(pos);
}
}
static void static void
scrn_timer() scrn_timer()
{ {
timeout((timeout_func_t)scrn_timer, 0, hz/5);
if (cur_console->status & UNKNOWN_MODE) if (cur_console->status & UNKNOWN_MODE)
return; goto set_timeout;
if (!cur_console->cursor_protect && configuration & BLINK_CURSOR) { if (!cur_console->cursor_protect && !scrn_blanked && !blink_in_progress) {
if (!(configuration & SOFT_CURSOR))
update_hw_cursor_pos();
else if (configuration & BLINK_CURSOR) {
if (cur_console->cursor_saveunder) if (cur_console->cursor_saveunder)
undraw_cursor(cur_console); undraw_cursor(cur_console);
else else
draw_cursor(cur_console); draw_cursor(cur_console);
} }
}
if (scrn_blank_time && (time.tv_sec > scrn_time_stamp+scrn_blank_time)) if (scrn_blank_time && (time.tv_sec > scrn_time_stamp+scrn_blank_time))
SCRN_SAVER(1); SCRN_SAVER(1);
set_timeout:
timeout((timeout_func_t)scrn_timer, 0,
(configuration & SOFT_CURSOR) ? hz/5 : hz/20);
} }
static void static void
@ -2061,15 +2094,16 @@ scan_esc(scr_stat *scp, u_char c)
else else
configuration &= ~BLINK_CURSOR; configuration &= ~BLINK_CURSOR;
} }
#if 0 else if (crtc_vga &&
else if (scp->term.num_param == 2) { !(configuration & SOFT_CURSOR) &&
scp->term.num_param == 2
) {
scp->cursor_start = scp->term.param[0] & 0x1F; scp->cursor_start = scp->term.param[0] & 0x1F;
scp->cursor_end = scp->term.param[1] & 0x1F; scp->cursor_end = scp->term.param[1] & 0x1F;
if (scp == cur_console) if (scp == cur_console)
cursor_shape(scp->cursor_start, cursor_shape(scp->cursor_start,
scp->cursor_end); scp->cursor_end);
} }
#endif
break; break;
case 'F': /* set ansi foreground */ case 'F': /* set ansi foreground */
@ -2107,6 +2141,11 @@ scan_esc(scr_stat *scp, u_char c)
static void static void
undraw_cursor(scr_stat *scp) undraw_cursor(scr_stat *scp)
{ {
if (!(configuration & SOFT_CURSOR) && scp == cur_console) {
force_hw_cursor_pos = 1;
set_hw_cursor_pos(0xffff);
return;
}
if (scp->cursor_saveunder) { if (scp->cursor_saveunder) {
*scp->cursor_pos = scp->cursor_saveunder; *scp->cursor_pos = scp->cursor_saveunder;
scp->cursor_saveunder = 0; scp->cursor_saveunder = 0;
@ -2116,6 +2155,10 @@ undraw_cursor(scr_stat *scp)
static void static void
draw_cursor(scr_stat *scp) draw_cursor(scr_stat *scp)
{ {
if (!(configuration & SOFT_CURSOR) && scp == cur_console) {
update_hw_cursor_pos();
return;
}
scp->cursor_saveunder = *scp->cursor_pos; scp->cursor_saveunder = *scp->cursor_pos;
if ((scp->cursor_saveunder & 0x7000) == 0x7000) { if ((scp->cursor_saveunder & 0x7000) == 0x7000) {
*scp->cursor_pos &= 0x8fff; *scp->cursor_pos &= 0x8fff;
@ -2148,6 +2191,8 @@ ansi_put(scr_stat *scp, u_char *buf, int len)
} }
write_in_progress++; write_in_progress++;
outloop: outloop:
while (blink_in_progress) /* bell can come from keyboard handler */
;
if (scp->term.esc) { if (scp->term.esc) {
scan_esc(scp, *ptr++); scan_esc(scp, *ptr++);
len--; len--;
@ -2201,6 +2246,8 @@ ansi_put(scr_stat *scp, u_char *buf, int len)
} }
ptr++; len--; ptr++; len--;
} }
while (blink_in_progress) /* wait for bell finished before scroll */
;
/* do we have to scroll ?? */ /* do we have to scroll ?? */
if (scp->cursor_pos >= scp->crt_base + scp->ysize * scp->xsize) { if (scp->cursor_pos >= scp->crt_base + scp->ysize * scp->xsize) {
if (scp->history) { if (scp->history) {
@ -2266,10 +2313,8 @@ static char init_done = 0;
hw_cursor |= inb(crtc_addr+1); hw_cursor |= inb(crtc_addr+1);
/* move hardware cursor out of the way */ /* move hardware cursor out of the way */
outb(crtc_addr,14); if (configuration & SOFT_CURSOR)
outb(crtc_addr+1, 0xff); set_hw_cursor_pos(0xffff);
outb(crtc_addr,15);
outb(crtc_addr+1, 0xff);
/* is this a VGA or higher ? */ /* is this a VGA or higher ? */
outb(crtc_addr, 7); outb(crtc_addr, 7);
@ -2342,8 +2387,13 @@ init_scp(scr_stat *scp)
scp->term.rev_attr = current_default->rev_attr; scp->term.rev_attr = current_default->rev_attr;
scp->term.cur_attr = scp->term.std_attr; scp->term.cur_attr = scp->term.std_attr;
scp->border = BG_BLACK; scp->border = BG_BLACK;
if (!(configuration & SOFT_CURSOR)) {
scp->cursor_start = -1; scp->cursor_start = -1;
scp->cursor_end = -1; scp->cursor_end = -1;
} else {
scp->cursor_start = hw_cursor_start;
scp->cursor_end = hw_cursor_end;
}
scp->cursor_protect = 0; scp->cursor_protect = 0;
scp->cursor_saveunder = 0; scp->cursor_saveunder = 0;
scp->mouse_xpos = scp->mouse_ypos = 0; scp->mouse_xpos = scp->mouse_ypos = 0;
@ -2367,12 +2417,14 @@ scput(u_char c)
scp->term = kernel_console; scp->term = kernel_console;
current_default = &kernel_default; current_default = &kernel_default;
scp->cursor_protect = 1; scp->cursor_protect = 1;
if (configuration & SOFT_CURSOR)
undraw_cursor(scp); undraw_cursor(scp);
#if 0 #if 0
ansi_put(scp, c); ansi_put(scp, c);
#else #else
ansi_put(scp, &c, 1); ansi_put(scp, &c, 1);
#endif #endif
if (configuration & SOFT_CURSOR)
draw_cursor(scp); draw_cursor(scp);
scp->cursor_protect = 0; scp->cursor_protect = 0;
kernel_console = scp->term; kernel_console = scp->term;
@ -3002,6 +3054,18 @@ set_mode(scr_stat *scp)
set_vgaregs(modetable); set_vgaregs(modetable);
font_size = *(modetable + 2); font_size = *(modetable + 2);
if (!(configuration & SOFT_CURSOR)) {
/* change cursor type if set */
if (scp->cursor_start != -1 && scp->cursor_end != -1)
cursor_shape(
(scp->cursor_start >= font_size)
? font_size - 1
: scp->cursor_start,
(scp->cursor_end >= font_size)
? font_size - 1
: scp->cursor_end);
}
/* set font type (size) */ /* set font type (size) */
switch (font_size) { switch (font_size) {
case 0x10: case 0x10:
@ -3018,6 +3082,7 @@ set_mode(scr_stat *scp)
scp->font = FONT_8; scp->font = FONT_8;
break; break;
} }
force_hw_cursor_pos = 1;
break; break;
case M_BG320: case M_CG320: case M_BG640: case M_BG320: case M_CG320: case M_BG640:
@ -3286,12 +3351,12 @@ do_bell(scr_stat *scp, int pitch, int duration)
{ {
if (scp == cur_console) { if (scp == cur_console) {
if (configuration & VISUAL_BELL) { if (configuration & VISUAL_BELL) {
if (blink_in_progress) if (blink_in_progress || (scp->status & BUFFER_SAVED))
return; return;
blink_in_progress = 3;
undraw_cursor(scp); undraw_cursor(scp);
bcopy(scp->crt_base, scp->scr_buf, bcopy(scp->crt_base, scp->scr_buf,
scp->xsize * scp->ysize * sizeof(u_short)); scp->xsize * scp->ysize * sizeof(u_short));
blink_in_progress = 4;
timeout((timeout_func_t)blink_screen, scp, hz/10); timeout((timeout_func_t)blink_screen, scp, hz/10);
} }
else else
@ -3302,6 +3367,10 @@ do_bell(scr_stat *scp, int pitch, int duration)
static void static void
blink_screen(scr_stat *scp) blink_screen(scr_stat *scp)
{ {
if (scp != cur_console) {
blink_in_progress = 0;
return;
}
if (blink_in_progress > 1) { if (blink_in_progress > 1) {
if (blink_in_progress & 1) if (blink_in_progress & 1)
fillw(kernel_default.std_attr | scr_map[0x20], fillw(kernel_default.std_attr | scr_map[0x20],