Deleted Added
full compact
1/*-
2 * Copyright (c) 1992-1998 S�ren Schmidt
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 11 unchanged lines hidden (view full) ---

20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 *
28 * $Id$
28 * $Id: syscons.c,v 1.278 1998/09/15 18:16:37 sos Exp $
29 */
30
31#include "sc.h"
32#include "apm.h"
33#include "opt_ddb.h"
34#include "opt_devfs.h"
35#include "opt_vesa.h"
36#include "opt_vm86.h"

--- 79 unchanged lines hidden (view full) ---

116 union {
117 struct old_mouse_data data;
118 struct mouse_mode mode;
119 } u;
120} old_mouse_info_t;
121
122/* XXX use sc_bcopy where video memory is concerned */
123extern void generic_bcopy(const void *, void *, size_t);
124extern void generic_bzero(void *, size_t);
125
126static default_attr user_default = {
127 (FG_LIGHTGREY | BG_BLACK) << 8,
128 (FG_BLACK | BG_LIGHTGREY) << 8
129};
130
131static default_attr kernel_default = {
132 (FG_WHITE | BG_BLACK) << 8,

--- 156 unchanged lines hidden (view full) ---

289static void draw_mouse_image(scr_stat *scp);
290static void remove_mouse_image(scr_stat *scp);
291static void draw_cutmarking(scr_stat *scp);
292static void remove_cutmarking(scr_stat *scp);
293static void do_bell(scr_stat *scp, int pitch, int duration);
294static timeout_t blink_screen;
295#ifdef SC_SPLASH_SCREEN
296static void scsplash_init(scr_stat *scp);
297static void scsplash_term(scr_stat *scp);
298static void scsplash_saver(int show);
299#define scsplash_stick(stick) (sticky_splash = (stick))
300#else
301#define scsplash_stick(stick)
302#endif
303
304struct isa_driver scdriver = {
305 scprobe, scattach, "sc", 1

--- 17 unchanged lines hidden (view full) ---

323};
324
325/*
326 * These functions need to be before calls to them so they can be inlined.
327 */
328static void
329draw_cursor_image(scr_stat *scp)
330{
329 u_short cursor_image, *ptr = Crtat + (scp->cursor_pos - scp->scr_buf);
331 u_short cursor_image;
332 u_short *ptr;
333 u_short prev_image;
334
335 if (ISPIXELSC(scp)) {
336 sc_bcopy(scp, scp->scr_buf, scp->cursor_pos - scp->scr_buf,
337 scp->cursor_pos - scp->scr_buf, 1);
338 return;
339 }
340
341 ptr = (u_short *)(get_adapter(scp)->va_window)
342 + (scp->cursor_pos - scp->scr_buf);
343
344 /* do we have a destructive cursor ? */
345 if (flags & CHAR_CURSOR) {
346 prev_image = scp->cursor_saveunder;
347 cursor_image = *ptr & 0x00ff;
348 if (cursor_image == DEAD_CHAR)
349 cursor_image = prev_image & 0x00ff;
350 cursor_image |= *(scp->cursor_pos) & 0xff00;
351 scp->cursor_saveunder = cursor_image;

--- 32 unchanged lines hidden (view full) ---

384 *ptr = cursor_image;
385}
386
387static void
388remove_cursor_image(scr_stat *scp)
389{
390 if (ISPIXELSC(scp))
391 sc_bcopy(scp, scp->scr_buf, scp->cursor_oldpos - scp->scr_buf,
386 scp->cursor_oldpos - scp->scr_buf, 0);
392 scp->cursor_oldpos - scp->scr_buf, 0);
393 else
388 *(Crtat + (scp->cursor_oldpos - scp->scr_buf)) = scp->cursor_saveunder;
394 *((u_short *)(get_adapter(scp)->va_window)
395 + (scp->cursor_oldpos - scp->scr_buf))
396 = scp->cursor_saveunder;
397}
398
399static void
400move_crsr(scr_stat *scp, int x, int y)
401{
402 if (x < 0)
403 x = 0;
404 if (y < 0)

--- 10 unchanged lines hidden (view full) ---

415static int
416scprobe(struct isa_device *dev)
417{
418 if (!scvidprobe(dev->id_unit, dev->id_flags)) {
419 if (bootverbose)
420 printf("sc%d: no video adapter is found.\n", dev->id_unit);
421 return (0);
422 }
415 (*biosvidsw.diag)(bootverbose);
423
424#if defined(VESA) && defined(VM86)
425 if (vesa_load())
426 return FALSE;
419 (*biosvidsw.diag)(bootverbose);
427#endif
428
429 (*biosvidsw.diag)(bootverbose);
430
431 sc_port = dev->id_iobase;
432 if (sckbdprobe(dev->id_unit, dev->id_flags))
433 return (IO_KBDSIZE);
434 else
435 return ((dev->id_flags & DETECT_KBD) ? 0 : IO_KBDSIZE);
436}
437
438/* probe video adapters, return TRUE if found */

--- 228 unchanged lines hidden (view full) ---

667 sc_alloc_cut_buffer(scp, FALSE);
668
669 /* initialize history buffer & pointers */
670 sc_alloc_history_buffer(scp, sc_history_size, 0, FALSE);
671
672#if defined(VESA) && defined(VM86)
673 if ((flags & VESA800X600)
674 && ((*biosvidsw.get_info)(scp->adp, M_VESA_800x600, &info) == 0)) {
675#ifdef SC_SPLASH_SCREEN
676 scsplash_term(scp);
677#endif
678 sc_set_graphics_mode(scp, NULL, M_VESA_800x600);
679 sc_set_pixel_mode(scp, NULL, COL, ROW, 16);
680 initial_video_mode = M_VESA_800x600;
681#ifdef SC_SPLASH_SCREEN
682 scsplash_init(scp);
683#endif
684 }
685#endif /* VESA && VM86 */
686
687 /* initialize cursor stuff */
688 if (!ISGRAPHSC(scp))
689 draw_cursor_image(scp);
690
691 /* get screen update going */

--- 1628 unchanged lines hidden (view full) ---

2320 return 0;
2321}
2322
2323static void
2324exchange_scr(void)
2325{
2326 move_crsr(old_scp, old_scp->xpos, old_scp->ypos);
2327 cur_console = new_scp;
2313 if (old_scp->mode != new_scp->mode || ISUNKNOWNSC(old_scp)) {
2314 if (adp_flags & V_ADP_MODECHANGE)
2315 set_mode(new_scp);
2316 }
2328 if (old_scp->mode != new_scp->mode || ISUNKNOWNSC(old_scp))
2329 set_mode(new_scp);
2330 move_crsr(new_scp, new_scp->xpos, new_scp->ypos);
2331 if (ISTEXTSC(new_scp) && (flags & CHAR_CURSOR))
2332 set_destructive_cursor(new_scp);
2333 if (ISGRAPHSC(old_scp))
2334 load_palette(new_scp, palette);
2335 if (old_scp->status & KBD_RAW_MODE || new_scp->status & KBD_RAW_MODE ||
2336 old_scp->status & KBD_CODE_MODE || new_scp->status & KBD_CODE_MODE)
2337 shfts = ctls = alts = agrs = metas = accents = 0;
2338 set_border(new_scp, new_scp->border);
2339 update_leds(new_scp->status);
2340 delayed_next_scr = FALSE;
2341 mark_all(new_scp);
2329
2330 /* FIXME: the screen size may be larger than a 64K segment. */
2331 if (ISPIXELSC(new_scp))
2332 bzero(Crtat, new_scp->xpixel*new_scp->ypixel/8);
2342}
2343
2344static void
2345scan_esc(scr_stat *scp, u_char c)
2346{
2347 static u_char ansi_col[16] =
2348 {0, 4, 2, 6, 1, 5, 3, 7, 8, 12, 10, 14, 9, 13, 11, 15};
2349 int i, n;

--- 150 unchanged lines hidden (view full) ---

2500 n = scp->term.param[0];
2501 switch (n) {
2502 case 0: /* clear form cursor to end of line */
2503 fillw(scp->term.cur_color | scr_map[0x20],
2504 scp->cursor_pos,
2505 scp->xsize - scp->xpos);
2506 mark_for_update(scp, scp->cursor_pos - scp->scr_buf);
2507 mark_for_update(scp, scp->cursor_pos - scp->scr_buf +
2499 scp->xsize - scp->xpos);
2508 scp->xsize - 1 - scp->xpos);
2509 break;
2510 case 1: /* clear from beginning of line to cursor */
2511 fillw(scp->term.cur_color | scr_map[0x20],
2512 scp->cursor_pos - scp->xpos,
2513 scp->xpos + 1);
2514 mark_for_update(scp, scp->ypos * scp->xsize);
2515 mark_for_update(scp, scp->cursor_pos - scp->scr_buf);
2516 break;
2517 case 2: /* clear entire line */
2518 fillw(scp->term.cur_color | scr_map[0x20],
2519 scp->cursor_pos - scp->xpos,
2520 scp->xsize);
2521 mark_for_update(scp, scp->ypos * scp->xsize);
2513 mark_for_update(scp, (scp->ypos + 1) * scp->xsize);
2522 mark_for_update(scp, (scp->ypos + 1) * scp->xsize - 1);
2523 break;
2524 }
2525 break;
2526
2527 case 'L': /* Insert n lines */
2528 n = scp->term.param[0]; if (n < 1) n = 1;
2529 if (n > scp->ysize - scp->ypos)
2530 n = scp->ysize - scp->ypos;

--- 28 unchanged lines hidden (view full) ---

2559 n = scp->xsize - scp->xpos;
2560 dst = scp->cursor_pos;
2561 src = dst + n;
2562 count = scp->xsize - (scp->xpos + n);
2563 bcopy(src, dst, count * sizeof(u_short));
2564 src = dst + count;
2565 fillw(scp->term.cur_color | scr_map[0x20], src, n);
2566 mark_for_update(scp, scp->cursor_pos - scp->scr_buf);
2558 mark_for_update(scp, scp->cursor_pos - scp->scr_buf + n + count);
2567 mark_for_update(scp, scp->cursor_pos - scp->scr_buf + n + count - 1);
2568 break;
2569
2570 case '@': /* Insert n chars */
2571 n = scp->term.param[0]; if (n < 1) n = 1;
2572 if (n > scp->xsize - scp->xpos)
2573 n = scp->xsize - scp->xpos;
2574 src = scp->cursor_pos;
2575 dst = src + n;
2576 count = scp->xsize - (scp->xpos + n);
2577 bcopy(src, dst, count * sizeof(u_short));
2578 fillw(scp->term.cur_color | scr_map[0x20], src, n);
2579 mark_for_update(scp, scp->cursor_pos - scp->scr_buf);
2571 mark_for_update(scp, scp->cursor_pos - scp->scr_buf + n + count);
2580 mark_for_update(scp, scp->cursor_pos - scp->scr_buf + n + count - 1);
2581 break;
2582
2583 case 'S': /* scroll up n lines */
2584 n = scp->term.param[0]; if (n < 1) n = 1;
2585 if (n > scp->ysize)
2586 n = scp->ysize;
2587 bcopy(scp->scr_buf + (scp->xsize * n),
2588 scp->scr_buf,

--- 19 unchanged lines hidden (view full) ---

2608
2609 case 'X': /* erase n characters in line */
2610 n = scp->term.param[0]; if (n < 1) n = 1;
2611 if (n > scp->xsize - scp->xpos)
2612 n = scp->xsize - scp->xpos;
2613 fillw(scp->term.cur_color | scr_map[0x20],
2614 scp->cursor_pos, n);
2615 mark_for_update(scp, scp->cursor_pos - scp->scr_buf);
2607 mark_for_update(scp, scp->cursor_pos - scp->scr_buf + n);
2616 mark_for_update(scp, scp->cursor_pos - scp->scr_buf + n - 1);
2617 break;
2618
2619 case 'Z': /* move n tabs backwards */
2620 n = scp->term.param[0]; if (n < 1) n = 1;
2621 if ((i = scp->xpos & 0xf8) == scp->xpos)
2622 i -= 8*n;
2623 else
2624 i -= 8*(n-1);

--- 402 unchanged lines hidden (view full) ---

3027 /* set up the first console */
3028 current_default = &user_default;
3029 console[0] = &main_console;
3030 init_scp(console[0]);
3031 cur_console = console[0];
3032
3033 /* copy screen to temporary buffer */
3034 if (ISTEXTSC(console[0]))
3026 generic_bcopy(Crtat, sc_buffer,
3027 console[0]->xsize * console[0]->ysize * sizeof(u_short));
3035 generic_bcopy((ushort *)(get_adapter(console[0])->va_window), sc_buffer,
3036 console[0]->xsize * console[0]->ysize * sizeof(u_short));
3037
3038 console[0]->scr_buf = console[0]->mouse_pos = console[0]->mouse_oldpos
3039 = sc_buffer;
3040 if (col >= console[0]->xsize)
3041 col = 0;
3042 if (row >= console[0]->ysize)
3043 row = console[0]->ysize - 1;
3044 console[0]->xpos = col;

--- 952 unchanged lines hidden (view full) ---

3997 * Always use the font page #0 on the video plane 2.
3998 * Somehow we cannot show the font in other font pages on
3999 * some video cards... XXX
4000 */
4001 (*biosvidsw.show_font)(scp->adp, 0);
4002 }
4003 mark_all(scp);
4004 }
4005
4006 if (scp->status & PIXEL_MODE)
4007 generic_bzero((u_char *)(adp->va_window), scp->xpixel*scp->ypixel/8);
4008 set_border(scp, scp->border);
4009
4010 /* move hardware cursor out of the way */
4011 (*biosvidsw.set_hw_cursor)(scp->adp, -1, -1);
4012
4013 return 0;
4014}
4015
4016void
4017set_border(scr_stat *scp, int color)
4018{
4019 u_char *p;
4020 int xoff;
4021 int yoff;
4022 int xlen;
4023 int ylen;
4024 int i;
4025
4026 (*biosvidsw.set_border)(scp->adp, color);
4027
4028 if (scp->status & PIXEL_MODE) {
4029 outw(GDCIDX, 0x0005); /* read mode 0, write mode 0 */
4030 outw(GDCIDX, 0x0003); /* data rotate/function select */
4031 outw(GDCIDX, 0x0f01); /* set/reset enable */
4032 outw(GDCIDX, 0xff08); /* bit mask */
4033 outw(GDCIDX, (color << 8) | 0x00); /* set/reset */
4034 p = (u_char *)(get_adapter(scp)->va_window);
4035 xoff = scp->xoff;
4036 yoff = scp->yoff*scp->font_size;
4037 xlen = scp->xpixel/8;
4038 ylen = scp->ysize*scp->font_size;
4039 if (yoff > 0) {
4040 generic_bzero(p, xlen*yoff);
4041 generic_bzero(p + xlen*(yoff + ylen),
4042 xlen*scp->ypixel - xlen*(yoff + ylen));
4043 }
4044 if (xoff > 0) {
4045 for (i = 0; i < ylen; ++i) {
4046 generic_bzero(p + xlen*(yoff + i), xoff);
4047 generic_bzero(p + xlen*(yoff + i) + xoff + scp->xsize,
4048 xlen - xoff - scp->xsize);
4049 }
4050 }
4051 outw(GDCIDX, 0x0000); /* set/reset */
4052 outw(GDCIDX, 0x0001); /* set/reset enable */
4053 }
4054}
4055
4056void
4057copy_font(scr_stat *scp, int operation, int font_size, u_char *buf)
4058{
4059 /*
4060 * FONT KLUDGE:
4061 * This is an interim kludge to display correct font.
4062 * Always use the font page #0 on the video plane 2.
4063 * Somehow we cannot show the font in other font pages on
4064 * some video cards... XXX

--- 304 unchanged lines hidden (view full) ---

4369 }
4370}
4371
4372static void
4373draw_mouse_image(scr_stat *scp)
4374{
4375 u_short buffer[32];
4376 u_short xoffset, yoffset;
4325 u_short *crt_pos = Crtat + (scp->mouse_pos - scp->scr_buf);
4377 u_short *crt_pos = (u_short *)(get_adapter(scp)->va_window)
4378 + (scp->mouse_pos - scp->scr_buf);
4379 u_char *font_buffer;
4380 int font_size;
4381 int i;
4382
4383 if (scp->font_size < 14) {
4384 font_buffer = font_8;
4385 font_size = 8;
4386 } else if (scp->font_size >= 16) {

--- 55 unchanged lines hidden (view full) ---

4442 }
4443 mark_for_update(scp, scp->mouse_pos - scp->scr_buf);
4444 mark_for_update(scp, scp->mouse_pos + scp->xsize + 1 - scp->scr_buf);
4445}
4446
4447static void
4448remove_mouse_image(scr_stat *scp)
4449{
4397 u_short *crt_pos = Crtat + (scp->mouse_oldpos - scp->scr_buf);
4450 u_short *crt_pos;
4451
4452 if (!ISTEXTSC(scp))
4453 return;
4454
4455 crt_pos = (u_short *)(get_adapter(scp)->va_window)
4456 + (scp->mouse_oldpos - scp->scr_buf);
4457 *(crt_pos) = *(scp->mouse_oldpos);
4458 *(crt_pos+1) = *(scp->mouse_oldpos+1);
4459 *(crt_pos+scp->xsize) = *(scp->mouse_oldpos+scp->xsize);
4460 *(crt_pos+scp->xsize+1) = *(scp->mouse_oldpos+scp->xsize+1);
4461 mark_for_update(scp, scp->mouse_oldpos - scp->scr_buf);
4462 mark_for_update(scp, scp->mouse_oldpos + scp->xsize + 1 - scp->scr_buf);
4463}
4464
4465static void
4466draw_cutmarking(scr_stat *scp)
4467{
4468 u_short *crt_pos;
4469 u_short *ptr;
4470 u_short och, nch;
4471
4472 crt_pos = (u_short *)(get_adapter(scp)->va_window);
4473 for (ptr=scp->scr_buf; ptr<=(scp->scr_buf+(scp->xsize*scp->ysize)); ptr++) {
4416 nch = och = *(Crtat + (ptr - scp->scr_buf));
4474 nch = och = *(crt_pos + (ptr - scp->scr_buf));
4475 /* are we outside the selected area ? */
4476 if ( ptr < (scp->mouse_cut_start > scp->mouse_cut_end ?
4477 scp->mouse_cut_end : scp->mouse_cut_start) ||
4478 ptr >= (scp->mouse_cut_start > scp->mouse_cut_end ?
4479 scp->mouse_cut_start : scp->mouse_cut_end)) {
4480 if (ptr != scp->cursor_pos)
4481 nch = (och & 0xff) | (*ptr & 0xff00);
4482 }

--- 5 unchanged lines hidden (view full) ---

4488 if (flags & CHAR_CURSOR)
4489 nch = (och & 0x88ff)|(*ptr & 0x7000)>>4|(*ptr & 0x0700)<<4;
4490 else
4491 if (!(flags & BLINK_CURSOR))
4492 nch = (och & 0xff) | (*ptr & 0xff00);
4493 }
4494 }
4495 if (nch != och)
4438 *(Crtat + (ptr - scp->scr_buf)) = nch;
4496 *(crt_pos + (ptr - scp->scr_buf)) = nch;
4497 }
4498}
4499
4500static void
4501remove_cutmarking(scr_stat *scp)
4502{
4503 scp->mouse_cut_start = scp->mouse_cut_end = NULL;
4504 scp->status &= ~MOUSE_CUTTING;

--- 32 unchanged lines hidden (view full) ---

4537 blink_in_progress = FALSE;
4538 mark_all(scp);
4539 if (delayed_next_scr)
4540 switch_scr(scp, delayed_next_scr - 1);
4541 }
4542 else {
4543 if (blink_in_progress & 1)
4544 fillw(kernel_default.std_color | scr_map[0x20],
4487 Crtat, scp->xsize * scp->ysize);
4545 (u_short *)(get_adapter(scp)->va_window),
4546 scp->xsize * scp->ysize);
4547 else
4548 fillw(kernel_default.rev_color | scr_map[0x20],
4490 Crtat, scp->xsize * scp->ysize);
4549 (u_short *)(get_adapter(scp)->va_window),
4550 scp->xsize * scp->ysize);
4551 blink_in_progress--;
4552 timeout(blink_screen, scp, hz / 10);
4553 }
4554}
4555
4556void
4557sc_bcopy(scr_stat *scp, u_short *p, int from, int to, int mark)
4558{
4559 u_char *font;
4500 u_char *d, *e;
4560 u_char volatile *d;
4561 u_char *e;
4562 u_char *f;
4563 int font_size;
4564 int line_length;
4565 int xsize;
4566 u_short bg;
4567 int i, j;
4568 u_char c;
4569
4570 if (ISTEXTSC(scp)) {
4508 generic_bcopy(p+from, Crtat+from, (to-from+1)*sizeof (u_short));
4571 generic_bcopy(p + from, (u_short *)(get_adapter(scp)->va_window) + from,
4572 (to - from + 1)*sizeof(u_short));
4573 } else /* if ISPIXELSC(scp) */ {
4574 if (mark)
4575 mark = 255;
4576 font_size = scp->font_size;
4577 if (font_size < 14)
4578 font = font_8;
4579 else if (font_size >= 16)
4580 font = font_16;
4581 else
4582 font = font_14;
4583 line_length = scp->xpixel/8;
4584 xsize = scp->xsize;
4521 d = (u_char *)Crtat
4585 d = (u_char *)(get_adapter(scp)->va_window)
4586 + scp->xoff + scp->yoff*font_size*line_length
4587 + (from%xsize) + font_size*line_length*(from/xsize);
4588
4589 outw(GDCIDX, 0x0005); /* read mode 0, write mode 0 */
4590 outw(GDCIDX, 0x0003); /* data rotate/function select */
4591 outw(GDCIDX, 0x0f01); /* set/reset enable */
4592 bg = -1;
4593 for (i = from ; i <= to ; i++) {
4525 e = d;
4594 /* set background color in EGA/VGA latch */
4595 if (bg != (p[i] & 0xf000)) {
4596 bg = (p[i] & 0xf000);
4597 outw(GDCIDX, (bg >> 4) | 0x00); /* set/reset */
4598 outw(GDCIDX, 0xff08); /* bit mask */
4599 *d = 0;
4600 c = *d; /* set the background color in the latch */
4601 }
4602 /* foreground color */
4603 outw(GDCIDX, (p[i] & 0x0f00) | 0x00); /* set/reset */
4604 e = (u_char *)d;
4605 f = &font[(p[i] & 0x00ff)*font_size];
4606 for (j = 0 ; j < font_size; j++, f++) {
4528 *e = mark^*f;
4607 outw(GDCIDX, ((*f^mark) << 8) | 0x08); /* bit mask */
4608 *e = 0;
4609 e += line_length;
4610 }
4611 d++;
4612 if ((i % xsize) == xsize - 1)
4613 d += scp->xoff*2 + (font_size - 1)*line_length;
4614 }
4615 outw(GDCIDX, 0x0000); /* set/reset */
4616 outw(GDCIDX, 0x0001); /* set/reset enable */
4617 outw(GDCIDX, 0xff08); /* bit mask */
4618
4619#if 0 /* VGA only */
4620 outw(GDCIDX, 0x0305); /* read mode 0, write mode 3 */
4621 outw(GDCIDX, 0x0003); /* data rotate/function select */
4622 outw(GDCIDX, 0x0f01); /* set/reset enable */
4623 outw(GDCIDX, 0xff08); /* bit mask */
4624 bg = -1;
4625 for (i = from ; i <= to ; i++) {
4626 /* set background color in EGA/VGA latch */
4627 if (bg != (p[i] & 0xf000)) {
4628 bg = (p[i] & 0xf000);
4629 outw(GDCIDX, 0x0005); /* read mode 0, write mode 0 */
4630 outw(GDCIDX, (bg >> 4) | 0x00); /* set/reset */
4631 *d = 0;
4632 c = *d; /* set the background color in the latch */
4633 outw(GDCIDX, 0x0305); /* read mode 0, write mode 3 */
4634 }
4635 /* foreground color */
4636 outw(GDCIDX, (p[i] & 0x0f00) | 0x00); /* set/reset */
4637 e = (u_char *)d;
4638 f = &font[(p[i] & 0x00ff)*font_size];
4639 for (j = 0 ; j < font_size; j++, f++) {
4640 *e = *f^mark;
4641 e += line_length;
4642 }
4643 d++;
4644 if ((i % xsize) == xsize - 1)
4645 d += scp->xoff*2 + (font_size - 1)*line_length;
4646 }
4647 outw(GDCIDX, 0x0005); /* read mode 0, write mode 0 */
4648 outw(GDCIDX, 0x0000); /* set/reset */
4649 outw(GDCIDX, 0x0001); /* set/reset enable */
4650#endif /* 0 */
4651 }
4652}
4653
4654#ifdef SC_SPLASH_SCREEN
4655
4656static void
4657scsplash_init(scr_stat *scp)
4658{
4659 video_info_t info;
4660
4545 /*
4546 * We currently assume the splash screen always use
4547 * VGA_CG320 mode and abort installation if this mode is not
4548 * supported with this video card. XXX
4549 */
4550 if ((*biosvidsw.get_info)(scp->adp, M_VGA_CG320, &info))
4551 return;
4552
4661 if (scsplash_load(scp) == 0 && add_scrn_saver(scsplash_saver) == 0) {
4662 default_saver = scsplash_saver;
4663 scrn_blank_time = DEFAULT_BLANKTIME;
4664 run_scrn_saver = TRUE;
4665 if (!(boothowto & (RB_VERBOSE | RB_CONFIG))) {
4666 scsplash_stick(TRUE);
4667 scsplash_saver(TRUE);
4668 }
4669 }
4670}
4671
4672static void
4673scsplash_term(scr_stat *scp)
4674{
4675 default_saver = none_saver;
4676 scsplash_stick(FALSE);
4677 remove_scrn_saver(scsplash_saver);
4678 scsplash_unload(scp);
4679}
4680
4681static void
4682scsplash_saver(int show)
4683{
4684 if (show)
4685 scsplash(TRUE);
4686 else if (!sticky_splash)
4687 scsplash(FALSE);
4688}
4689
4690#endif /* SC_SPLASH_SCREEN */
4691
4692#endif /* NSC */