Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 23 Oct 1997 21:57:01 -0500
From:      Tony Overfield <tony@dell.com>
To:        hackers@FreeBSD.ORG
Subject:   fixes for syscons.c and daemon_saver.c
Message-ID:  <3.0.3.32.19971023215701.006dc4b0@bugs.us.dell.com>
In-Reply-To: <199710221007.MAA01578@curry.mchp.siemens.de>

next in thread | previous in thread | raw e-mail | index | archive | help

While playing with the Dancin' Daemon screen saver, I noticed 
three minor problems.

1.  On some video cards (S3 Trio64 based ones at least), there 
    is a continuous, but brief, video glitch that mars the beauty 
    of the screen saver.  It is caused by continuously updating 
    the border color, which briefly (for several pixel clocks) 
    sets the pixel data to the border color.  This should be a 
    black glitch, but for some reason, it's producing a short 
    blue glitch on the Trio64 based cards.

One possible fix (in set_border() (syscons.c)):
Change this:
    outb(ATC, 0x11); outb(ATC, color);
    inb(crtc_addr + 6);             /* reset flip-flop */
    outb(ATC, 0x20);                /* enable Palette */
to this:
    outb(ATC, 0x31); outb(ATC, color);

This keeps valid pixel data from being replaced by the contents 
of the overscan register.

Alternate (or additional) fix (in daemon_saver() (daemon_saver.c)):

Change code to call set_border(0) only once, like this:
        if (blank) {
                if (scrn_blanked == 0)
                        set_border(0);
                if (scrn_blanked++ < 2)
                        return;
                fillw( .... );
             /* set_border(0); */

2.  Switching video modes from VGA_80x50 to VGA_80x25 (and etc.) 
    can allow the Daemon and the hostname strings to wander far off 
    the edge of the screen, crashing the kernel after a short time.
    This happens because the dimensions of the screen can change 
    after the static position variables have been moved outside 
    the new screen dimensions.

Suggested fix:
Change the code (in daemon_saver() (daemon_saver.c)) to make 
inequality boundary crossing checks, 
like this:
          if (dxpos >= scp->xsize - DAEMON_MAX_WIDTH)
instead of:
          if (dxpos == scp->xsize - DAEMON_MAX_WIDTH)
(repeat this 7 more times)
 
The code should also force the txpos, typos, dxpos, dypos variables 
to all be in range, though this change will get them back in range 
fairly quickly.

The draw_string(... message ...) stuff doesn't work right when the 
message string is longer than the width of the screen, which is 
easy to do in VGA_40x25 mode.  The fix above doesn't fix this, but 
it prevents it from trashing the system.

3.  syscons.c does not maintain the border color correctly when 
    switching virtual terminals.

Suggested fix (in exchange_scr() (syscons.c)):
Add:
    set_border(new_scp->border);

-
Tony





Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?3.0.3.32.19971023215701.006dc4b0>