1e8adebf2SKazutaka YOKOTA /*- 2e8adebf2SKazutaka YOKOTA * Copyright (c) 1997 Sandro Sigala, Brescia, Italy. 3068eabc6SKazutaka YOKOTA * Copyright (c) 1997 Chris Shenton 4e8adebf2SKazutaka YOKOTA * Copyright (c) 1995 S ren Schmidt 5e8adebf2SKazutaka YOKOTA * All rights reserved. 6e8adebf2SKazutaka YOKOTA * 7e8adebf2SKazutaka YOKOTA * Redistribution and use in source and binary forms, with or without 8e8adebf2SKazutaka YOKOTA * modification, are permitted provided that the following conditions 9e8adebf2SKazutaka YOKOTA * are met: 10e8adebf2SKazutaka YOKOTA * 1. Redistributions of source code must retain the above copyright 11e8adebf2SKazutaka YOKOTA * notice, this list of conditions and the following disclaimer 12e8adebf2SKazutaka YOKOTA * in this position and unchanged. 13e8adebf2SKazutaka YOKOTA * 2. Redistributions in binary form must reproduce the above copyright 14e8adebf2SKazutaka YOKOTA * notice, this list of conditions and the following disclaimer in the 15e8adebf2SKazutaka YOKOTA * documentation and/or other materials provided with the distribution. 16e8adebf2SKazutaka YOKOTA * 17e8adebf2SKazutaka YOKOTA * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 18e8adebf2SKazutaka YOKOTA * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 19e8adebf2SKazutaka YOKOTA * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20e8adebf2SKazutaka YOKOTA * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 21e8adebf2SKazutaka YOKOTA * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 22e8adebf2SKazutaka YOKOTA * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23e8adebf2SKazutaka YOKOTA * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24e8adebf2SKazutaka YOKOTA * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25e8adebf2SKazutaka YOKOTA * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26e8adebf2SKazutaka YOKOTA * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27e8adebf2SKazutaka YOKOTA * 28c3aac50fSPeter Wemm * $FreeBSD$ 29e8adebf2SKazutaka YOKOTA */ 30e8adebf2SKazutaka YOKOTA 31e8adebf2SKazutaka YOKOTA #include <sys/param.h> 32e8adebf2SKazutaka YOKOTA #include <sys/systm.h> 330640d357SPeter Wemm #include <sys/module.h> 34ce834215SKazutaka YOKOTA #include <sys/malloc.h> 35f4863d1aSKazutaka YOKOTA #include <sys/kernel.h> 36f4863d1aSKazutaka YOKOTA #include <sys/sysctl.h> 376e8394b8SKazutaka YOKOTA #include <sys/consio.h> 386e8394b8SKazutaka YOKOTA #include <sys/fbio.h> 39e8adebf2SKazutaka YOKOTA 4033b77e2dSBruce Evans #include <machine/pc/display.h> 41e8adebf2SKazutaka YOKOTA 426e8394b8SKazutaka YOKOTA #include <dev/fb/fbreg.h> 436e8394b8SKazutaka YOKOTA #include <dev/fb/splashreg.h> 446e8394b8SKazutaka YOKOTA #include <dev/syscons/syscons.h> 45068eabc6SKazutaka YOKOTA 46e8adebf2SKazutaka YOKOTA #define DAEMON_MAX_WIDTH 32 47e8adebf2SKazutaka YOKOTA #define DAEMON_MAX_HEIGHT 19 48e8adebf2SKazutaka YOKOTA 49ce834215SKazutaka YOKOTA static char *message; 50ce834215SKazutaka YOKOTA static int messagelen; 512ad872c5SKazutaka YOKOTA static int blanked; 52068eabc6SKazutaka YOKOTA 53068eabc6SKazutaka YOKOTA /* Who is the author of this ASCII pic? */ 54e8adebf2SKazutaka YOKOTA 55e8adebf2SKazutaka YOKOTA static char *daemon_pic[] = { 56e8adebf2SKazutaka YOKOTA " , ,", 57e8adebf2SKazutaka YOKOTA " /( )`", 58e8adebf2SKazutaka YOKOTA " \\ \\___ / |", 59e8adebf2SKazutaka YOKOTA " /- _ `-/ '", 60e8adebf2SKazutaka YOKOTA " (/\\/ \\ \\ /\\", 61e8adebf2SKazutaka YOKOTA " / / | ` \\", 62e8adebf2SKazutaka YOKOTA " O O ) / |", 63e8adebf2SKazutaka YOKOTA " `-^--'`< '", 64e8adebf2SKazutaka YOKOTA " (_.) _ ) /", 65e8adebf2SKazutaka YOKOTA " `.___/` /", 66e8adebf2SKazutaka YOKOTA " `-----' /", 67e8adebf2SKazutaka YOKOTA "<----. __ / __ \\", 68e8adebf2SKazutaka YOKOTA "<----|====O)))==) \\) /====", 69e8adebf2SKazutaka YOKOTA "<----' `--' `.__,' \\", 70e8adebf2SKazutaka YOKOTA " | |", 71e8adebf2SKazutaka YOKOTA " \\ / /\\", 72e8adebf2SKazutaka YOKOTA " ______( (_ / \\______/", 73e8adebf2SKazutaka YOKOTA " ,' ,-----' |", 74e8adebf2SKazutaka YOKOTA " `--{__________)", 75e8adebf2SKazutaka YOKOTA NULL 76e8adebf2SKazutaka YOKOTA }; 77e8adebf2SKazutaka YOKOTA 78e8adebf2SKazutaka YOKOTA static char *daemon_attr[] = { 79e8adebf2SKazutaka YOKOTA " R R", 80e8adebf2SKazutaka YOKOTA " RR RR", 81e8adebf2SKazutaka YOKOTA " R RRRR R R", 82e8adebf2SKazutaka YOKOTA " RR W RRR R", 83e8adebf2SKazutaka YOKOTA " RWWW W R RR", 84e8adebf2SKazutaka YOKOTA " W W W R R", 85e8adebf2SKazutaka YOKOTA " B B W R R", 86e8adebf2SKazutaka YOKOTA " WWWWWWRR R", 87e8adebf2SKazutaka YOKOTA " RRRR R R R", 88e8adebf2SKazutaka YOKOTA " RRRRRRR R", 89e8adebf2SKazutaka YOKOTA " RRRRRRR R", 90e8adebf2SKazutaka YOKOTA "YYYYYY RR R RR R", 91e8adebf2SKazutaka YOKOTA "YYYYYYYYYYRRRRYYR RR RYYYY", 92e8adebf2SKazutaka YOKOTA "YYYYYY RRRR RRRRRR R", 93e8adebf2SKazutaka YOKOTA " R R", 94e8adebf2SKazutaka YOKOTA " R R RR", 95e8adebf2SKazutaka YOKOTA " CCCCCCR RR R RRRRRRRR", 96e8adebf2SKazutaka YOKOTA " CC CCCCCCC C", 97e8adebf2SKazutaka YOKOTA " CCCCCCCCCCCCCCC", 98e8adebf2SKazutaka YOKOTA NULL 99e8adebf2SKazutaka YOKOTA }; 100e8adebf2SKazutaka YOKOTA 101068eabc6SKazutaka YOKOTA /* 102068eabc6SKazutaka YOKOTA * Reverse a graphics character, or return unaltered if no mirror; 103068eabc6SKazutaka YOKOTA * should do alphanumerics too, but I'm too lazy. <cshenton@it.hq.nasa.gov> 104068eabc6SKazutaka YOKOTA */ 105068eabc6SKazutaka YOKOTA 106068eabc6SKazutaka YOKOTA static char 107068eabc6SKazutaka YOKOTA xflip_symbol(char symbol) 108068eabc6SKazutaka YOKOTA { 109068eabc6SKazutaka YOKOTA static const char lchars[] = "`'(){}[]\\/<>"; 110068eabc6SKazutaka YOKOTA static const char rchars[] = "'`)(}{][/\\><"; 111068eabc6SKazutaka YOKOTA int pos; 112068eabc6SKazutaka YOKOTA 113068eabc6SKazutaka YOKOTA for (pos = 0; lchars[pos] != '\0'; pos++) 114068eabc6SKazutaka YOKOTA if (lchars[pos] == symbol) 115068eabc6SKazutaka YOKOTA return rchars[pos]; 116068eabc6SKazutaka YOKOTA 117068eabc6SKazutaka YOKOTA return symbol; 118068eabc6SKazutaka YOKOTA } 119e8adebf2SKazutaka YOKOTA 120e8adebf2SKazutaka YOKOTA static void 1216e8394b8SKazutaka YOKOTA clear_daemon(sc_softc_t *sc, int xpos, int ypos, int dxdir, int xoff, int yoff, 12202f2e93bSKazutaka YOKOTA int xlen, int ylen) 12302f2e93bSKazutaka YOKOTA { 12402f2e93bSKazutaka YOKOTA int y; 12502f2e93bSKazutaka YOKOTA 12602f2e93bSKazutaka YOKOTA if (xlen <= 0) 12702f2e93bSKazutaka YOKOTA return; 1286e8394b8SKazutaka YOKOTA for (y = yoff; y < ylen; y++) { 1296e8394b8SKazutaka YOKOTA sc_vtb_erase(&sc->cur_scp->scr, 1306e8394b8SKazutaka YOKOTA (ypos + y)*sc->cur_scp->xsize + xpos + xoff, 1316e8394b8SKazutaka YOKOTA xlen - xoff, 1326e8394b8SKazutaka YOKOTA sc->scr_map[0x20], (FG_LIGHTGREY | BG_BLACK) << 8); 1336e8394b8SKazutaka YOKOTA } 13402f2e93bSKazutaka YOKOTA } 13502f2e93bSKazutaka YOKOTA 13602f2e93bSKazutaka YOKOTA static void 1376e8394b8SKazutaka YOKOTA draw_daemon(sc_softc_t *sc, int xpos, int ypos, int dxdir, int xoff, int yoff, 13802f2e93bSKazutaka YOKOTA int xlen, int ylen) 139e8adebf2SKazutaka YOKOTA { 140e8adebf2SKazutaka YOKOTA int x, y; 14102f2e93bSKazutaka YOKOTA int px; 142e8adebf2SKazutaka YOKOTA int attr; 143e8adebf2SKazutaka YOKOTA 14402f2e93bSKazutaka YOKOTA for (y = yoff; y < ylen; y++) { 14502f2e93bSKazutaka YOKOTA if (dxdir < 0) 14602f2e93bSKazutaka YOKOTA px = xoff; 14702f2e93bSKazutaka YOKOTA else 14802f2e93bSKazutaka YOKOTA px = DAEMON_MAX_WIDTH - xlen; 14902f2e93bSKazutaka YOKOTA if (px >= strlen(daemon_pic[y])) 15002f2e93bSKazutaka YOKOTA continue; 15102f2e93bSKazutaka YOKOTA for (x = xoff; (x < xlen) && (daemon_pic[y][px] != '\0'); x++, px++) { 15202f2e93bSKazutaka YOKOTA switch (daemon_attr[y][px]) { 1536e8394b8SKazutaka YOKOTA #ifndef PC98 154e8adebf2SKazutaka YOKOTA case 'R': attr = (FG_LIGHTRED|BG_BLACK)<<8; break; 155e8adebf2SKazutaka YOKOTA case 'Y': attr = (FG_YELLOW|BG_BLACK)<<8; break; 156e8adebf2SKazutaka YOKOTA case 'B': attr = (FG_LIGHTBLUE|BG_BLACK)<<8; break; 157e8adebf2SKazutaka YOKOTA case 'W': attr = (FG_LIGHTGREY|BG_BLACK)<<8; break; 158e8adebf2SKazutaka YOKOTA case 'C': attr = (FG_CYAN|BG_BLACK)<<8; break; 159e8adebf2SKazutaka YOKOTA default: attr = (FG_WHITE|BG_BLACK)<<8; break; 1606e8394b8SKazutaka YOKOTA #else /* PC98 */ 1616e8394b8SKazutaka YOKOTA case 'R': attr = (FG_RED|BG_BLACK)<<8; break; 1626e8394b8SKazutaka YOKOTA case 'Y': attr = (FG_BROWN|BG_BLACK)<<8; break; 1636e8394b8SKazutaka YOKOTA case 'B': attr = (FG_BLUE|BG_BLACK)<<8; break; 1646e8394b8SKazutaka YOKOTA case 'W': attr = (FG_LIGHTGREY|BG_BLACK)<<8; break; 1656e8394b8SKazutaka YOKOTA case 'C': attr = (FG_CYAN|BG_BLACK)<<8; break; 1666e8394b8SKazutaka YOKOTA default: attr = (FG_LIGHTGREY|BG_BLACK)<<8; break; 1676e8394b8SKazutaka YOKOTA #endif /* PC98 */ 168e8adebf2SKazutaka YOKOTA } 169068eabc6SKazutaka YOKOTA if (dxdir < 0) { /* Moving left */ 1706e8394b8SKazutaka YOKOTA sc_vtb_putc(&sc->cur_scp->scr, 1716e8394b8SKazutaka YOKOTA (ypos + y)*sc->cur_scp->xsize 1726e8394b8SKazutaka YOKOTA + xpos + x, 1736e8394b8SKazutaka YOKOTA sc->scr_map[daemon_pic[y][px]], 1746e8394b8SKazutaka YOKOTA attr); 175068eabc6SKazutaka YOKOTA } else { /* Moving right */ 1766e8394b8SKazutaka YOKOTA sc_vtb_putc(&sc->cur_scp->scr, 1776e8394b8SKazutaka YOKOTA (ypos + y)*sc->cur_scp->xsize 1786e8394b8SKazutaka YOKOTA + xpos + DAEMON_MAX_WIDTH 1796e8394b8SKazutaka YOKOTA - px - 1, 1806e8394b8SKazutaka YOKOTA sc->scr_map[xflip_symbol(daemon_pic[y][px])], 1816e8394b8SKazutaka YOKOTA attr); 18202f2e93bSKazutaka YOKOTA } 183068eabc6SKazutaka YOKOTA } 184e8adebf2SKazutaka YOKOTA } 185e8adebf2SKazutaka YOKOTA } 186e8adebf2SKazutaka YOKOTA 187e8adebf2SKazutaka YOKOTA static void 1886e8394b8SKazutaka YOKOTA clear_string(sc_softc_t *sc, int xpos, int ypos, int xoff, char *s, int len) 18902f2e93bSKazutaka YOKOTA { 19002f2e93bSKazutaka YOKOTA if (len <= 0) 19102f2e93bSKazutaka YOKOTA return; 1926e8394b8SKazutaka YOKOTA sc_vtb_erase(&sc->cur_scp->scr, 1936e8394b8SKazutaka YOKOTA ypos*sc->cur_scp->xsize + xpos + xoff, len - xoff, 1946e8394b8SKazutaka YOKOTA sc->scr_map[0x20], (FG_LIGHTGREY | BG_BLACK) << 8); 19502f2e93bSKazutaka YOKOTA } 19602f2e93bSKazutaka YOKOTA 19702f2e93bSKazutaka YOKOTA static void 1986e8394b8SKazutaka YOKOTA draw_string(sc_softc_t *sc, int xpos, int ypos, int xoff, char *s, int len) 199e8adebf2SKazutaka YOKOTA { 200e8adebf2SKazutaka YOKOTA int x; 201e8adebf2SKazutaka YOKOTA 2026e8394b8SKazutaka YOKOTA for (x = xoff; x < len; x++) { 2036e8394b8SKazutaka YOKOTA sc_vtb_putc(&sc->cur_scp->scr, 2046e8394b8SKazutaka YOKOTA ypos*sc->cur_scp->xsize + xpos + x, 2056e8394b8SKazutaka YOKOTA sc->scr_map[s[x]], (FG_LIGHTGREEN | BG_BLACK) << 8); 2066e8394b8SKazutaka YOKOTA } 207e8adebf2SKazutaka YOKOTA } 208e8adebf2SKazutaka YOKOTA 2092ad872c5SKazutaka YOKOTA static int 2102ad872c5SKazutaka YOKOTA daemon_saver(video_adapter_t *adp, int blank) 211e8adebf2SKazutaka YOKOTA { 212e8adebf2SKazutaka YOKOTA static int txpos = 10, typos = 10; 213e8adebf2SKazutaka YOKOTA static int txdir = -1, tydir = -1; 214068eabc6SKazutaka YOKOTA static int dxpos = 0, dypos = 0; 215068eabc6SKazutaka YOKOTA static int dxdir = 1, dydir = 1; 216e8adebf2SKazutaka YOKOTA static int moved_daemon = 0; 21702f2e93bSKazutaka YOKOTA static int xoff, yoff, toff; 21802f2e93bSKazutaka YOKOTA static int xlen, ylen, tlen; 2196e8394b8SKazutaka YOKOTA sc_softc_t *sc; 2206e8394b8SKazutaka YOKOTA scr_stat *scp; 22102f2e93bSKazutaka YOKOTA int min, max; 222e8adebf2SKazutaka YOKOTA 2236e8394b8SKazutaka YOKOTA sc = sc_find_softc(adp, NULL); 2246e8394b8SKazutaka YOKOTA if (sc == NULL) 2256e8394b8SKazutaka YOKOTA return EAGAIN; 2266e8394b8SKazutaka YOKOTA scp = sc->cur_scp; 2276e8394b8SKazutaka YOKOTA 228e8adebf2SKazutaka YOKOTA if (blank) { 2292da199daSDag-Erling Smørgrav if (adp->va_info.vi_flags & V_INFO_GRAPHICS) 230f9e730bbSKazutaka YOKOTA return EAGAIN; 2312ad872c5SKazutaka YOKOTA if (blanked == 0) { 2326e8394b8SKazutaka YOKOTA #ifdef PC98 2336e8394b8SKazutaka YOKOTA if (epson_machine_id == 0x20) { 2346e8394b8SKazutaka YOKOTA outb(0x43f, 0x42); 2356e8394b8SKazutaka YOKOTA outb(0x0c17, inb(0xc17) & ~0x08); 2366e8394b8SKazutaka YOKOTA outb(0x43f, 0x40); 2376e8394b8SKazutaka YOKOTA } 2386e8394b8SKazutaka YOKOTA #endif /* PC98 */ 23902f2e93bSKazutaka YOKOTA /* clear the screen and set the border color */ 2406e8394b8SKazutaka YOKOTA sc_vtb_clear(&scp->scr, sc->scr_map[0x20], 2416e8394b8SKazutaka YOKOTA (FG_LIGHTGREY | BG_BLACK) << 8); 2426e8394b8SKazutaka YOKOTA (*vidsw[adp->va_index]->set_hw_cursor)(adp, -1, -1); 243a8445737SSøren Schmidt set_border(scp, 0); 24402f2e93bSKazutaka YOKOTA xlen = ylen = tlen = 0; 24502f2e93bSKazutaka YOKOTA } 2462ad872c5SKazutaka YOKOTA if (blanked++ < 2) 2472ad872c5SKazutaka YOKOTA return 0; 2482ad872c5SKazutaka YOKOTA blanked = 1; 249e8adebf2SKazutaka YOKOTA 2506e8394b8SKazutaka YOKOTA clear_daemon(sc, dxpos, dypos, dxdir, xoff, yoff, xlen, ylen); 2516e8394b8SKazutaka YOKOTA clear_string(sc, txpos, typos, toff, (char *)message, tlen); 25202f2e93bSKazutaka YOKOTA 253e8adebf2SKazutaka YOKOTA if (++moved_daemon) { 25402f2e93bSKazutaka YOKOTA /* 25502f2e93bSKazutaka YOKOTA * The daemon picture may be off the screen, if 25602f2e93bSKazutaka YOKOTA * screen size is chagened while the screen 25702f2e93bSKazutaka YOKOTA * saver is inactive. Make sure the origin of 25802f2e93bSKazutaka YOKOTA * the picture is between min and max. 25902f2e93bSKazutaka YOKOTA */ 26002f2e93bSKazutaka YOKOTA if (scp->xsize <= DAEMON_MAX_WIDTH) { 26102f2e93bSKazutaka YOKOTA /* 26202f2e93bSKazutaka YOKOTA * If the screen width is too narrow, we 26302f2e93bSKazutaka YOKOTA * allow part of the picture go off 26402f2e93bSKazutaka YOKOTA * the screen so that the daemon won't 26502f2e93bSKazutaka YOKOTA * flip too often. 26602f2e93bSKazutaka YOKOTA */ 26702f2e93bSKazutaka YOKOTA min = scp->xsize - DAEMON_MAX_WIDTH - 10; 26802f2e93bSKazutaka YOKOTA max = 10; 26902f2e93bSKazutaka YOKOTA } else { 27002f2e93bSKazutaka YOKOTA min = 0; 27102f2e93bSKazutaka YOKOTA max = scp->xsize - DAEMON_MAX_WIDTH; 27202f2e93bSKazutaka YOKOTA } 27302f2e93bSKazutaka YOKOTA if (dxpos <= min) { 27402f2e93bSKazutaka YOKOTA dxpos = min; 27502f2e93bSKazutaka YOKOTA dxdir = 1; 27602f2e93bSKazutaka YOKOTA } else if (dxpos >= max) { 27702f2e93bSKazutaka YOKOTA dxpos = max; 278e8adebf2SKazutaka YOKOTA dxdir = -1; 279e8adebf2SKazutaka YOKOTA } 280e8adebf2SKazutaka YOKOTA 28102f2e93bSKazutaka YOKOTA if (scp->ysize <= DAEMON_MAX_HEIGHT) { 28202f2e93bSKazutaka YOKOTA min = scp->ysize - DAEMON_MAX_HEIGHT - 10; 28302f2e93bSKazutaka YOKOTA max = 10; 284e8adebf2SKazutaka YOKOTA } else { 28502f2e93bSKazutaka YOKOTA min = 0; 28602f2e93bSKazutaka YOKOTA max = scp->ysize - DAEMON_MAX_HEIGHT; 287e8adebf2SKazutaka YOKOTA } 28802f2e93bSKazutaka YOKOTA if (dypos <= min) { 28902f2e93bSKazutaka YOKOTA dypos = min; 29002f2e93bSKazutaka YOKOTA dydir = 1; 29102f2e93bSKazutaka YOKOTA } else if (dypos >= max) { 29202f2e93bSKazutaka YOKOTA dypos = max; 29302f2e93bSKazutaka YOKOTA dydir = -1; 29402f2e93bSKazutaka YOKOTA } 29502f2e93bSKazutaka YOKOTA 29602f2e93bSKazutaka YOKOTA moved_daemon = -1; 29702f2e93bSKazutaka YOKOTA dxpos += dxdir; dypos += dydir; 29802f2e93bSKazutaka YOKOTA 29902f2e93bSKazutaka YOKOTA /* clip the picture */ 30002f2e93bSKazutaka YOKOTA xoff = 0; 30102f2e93bSKazutaka YOKOTA xlen = DAEMON_MAX_WIDTH; 30202f2e93bSKazutaka YOKOTA if (dxpos + xlen <= 0) 30302f2e93bSKazutaka YOKOTA xlen = 0; 30402f2e93bSKazutaka YOKOTA else if (dxpos < 0) 30502f2e93bSKazutaka YOKOTA xoff = -dxpos; 30602f2e93bSKazutaka YOKOTA if (dxpos >= scp->xsize) 30702f2e93bSKazutaka YOKOTA xlen = 0; 30802f2e93bSKazutaka YOKOTA else if (dxpos + xlen > scp->xsize) 30902f2e93bSKazutaka YOKOTA xlen = scp->xsize - dxpos; 31002f2e93bSKazutaka YOKOTA yoff = 0; 31102f2e93bSKazutaka YOKOTA ylen = DAEMON_MAX_HEIGHT; 31202f2e93bSKazutaka YOKOTA if (dypos + ylen <= 0) 31302f2e93bSKazutaka YOKOTA ylen = 0; 31402f2e93bSKazutaka YOKOTA else if (dypos < 0) 31502f2e93bSKazutaka YOKOTA yoff = -dypos; 31602f2e93bSKazutaka YOKOTA if (dypos >= scp->ysize) 31702f2e93bSKazutaka YOKOTA ylen = 0; 31802f2e93bSKazutaka YOKOTA else if (dypos + ylen > scp->ysize) 31902f2e93bSKazutaka YOKOTA ylen = scp->ysize - dypos; 32002f2e93bSKazutaka YOKOTA } 32102f2e93bSKazutaka YOKOTA 32202f2e93bSKazutaka YOKOTA if (scp->xsize <= messagelen) { 32302f2e93bSKazutaka YOKOTA min = scp->xsize - messagelen - 10; 32402f2e93bSKazutaka YOKOTA max = 10; 325e8adebf2SKazutaka YOKOTA } else { 32602f2e93bSKazutaka YOKOTA min = 0; 32702f2e93bSKazutaka YOKOTA max = scp->xsize - messagelen; 32802f2e93bSKazutaka YOKOTA } 32902f2e93bSKazutaka YOKOTA if (txpos <= min) { 33002f2e93bSKazutaka YOKOTA txpos = min; 33102f2e93bSKazutaka YOKOTA txdir = 1; 33202f2e93bSKazutaka YOKOTA } else if (txpos >= max) { 33302f2e93bSKazutaka YOKOTA txpos = max; 33402f2e93bSKazutaka YOKOTA txdir = -1; 33502f2e93bSKazutaka YOKOTA } 33602f2e93bSKazutaka YOKOTA if (typos <= 0) { 33702f2e93bSKazutaka YOKOTA typos = 0; 33802f2e93bSKazutaka YOKOTA tydir = 1; 33902f2e93bSKazutaka YOKOTA } else if (typos >= scp->ysize - 1) { 34002f2e93bSKazutaka YOKOTA typos = scp->ysize - 1; 34102f2e93bSKazutaka YOKOTA tydir = -1; 342e8adebf2SKazutaka YOKOTA } 343e8adebf2SKazutaka YOKOTA txpos += txdir; typos += tydir; 344e8adebf2SKazutaka YOKOTA 34502f2e93bSKazutaka YOKOTA toff = 0; 34602f2e93bSKazutaka YOKOTA tlen = messagelen; 34702f2e93bSKazutaka YOKOTA if (txpos + tlen <= 0) 34802f2e93bSKazutaka YOKOTA tlen = 0; 34902f2e93bSKazutaka YOKOTA else if (txpos < 0) 35002f2e93bSKazutaka YOKOTA toff = -txpos; 35102f2e93bSKazutaka YOKOTA if (txpos >= scp->xsize) 35202f2e93bSKazutaka YOKOTA tlen = 0; 35302f2e93bSKazutaka YOKOTA else if (txpos + tlen > scp->xsize) 35402f2e93bSKazutaka YOKOTA tlen = scp->xsize - txpos; 35502f2e93bSKazutaka YOKOTA 3566e8394b8SKazutaka YOKOTA draw_daemon(sc, dxpos, dypos, dxdir, xoff, yoff, xlen, ylen); 3576e8394b8SKazutaka YOKOTA draw_string(sc, txpos, typos, toff, (char *)message, tlen); 358e8adebf2SKazutaka YOKOTA } else { 3596e8394b8SKazutaka YOKOTA #ifdef PC98 3606e8394b8SKazutaka YOKOTA if (epson_machine_id == 0x20) { 3616e8394b8SKazutaka YOKOTA outb(0x43f, 0x42); 3626e8394b8SKazutaka YOKOTA outb(0x0c17, inb(0xc17) | 0x08); 3636e8394b8SKazutaka YOKOTA outb(0x43f, 0x40); 3646e8394b8SKazutaka YOKOTA } 3656e8394b8SKazutaka YOKOTA #endif /* PC98 */ 3662ad872c5SKazutaka YOKOTA blanked = 0; 367e8adebf2SKazutaka YOKOTA } 3682ad872c5SKazutaka YOKOTA return 0; 369e8adebf2SKazutaka YOKOTA } 370e8adebf2SKazutaka YOKOTA 371e8adebf2SKazutaka YOKOTA static int 3722ad872c5SKazutaka YOKOTA daemon_init(video_adapter_t *adp) 373e8adebf2SKazutaka YOKOTA { 374ce834215SKazutaka YOKOTA messagelen = strlen(hostname) + 3 + strlen(ostype) + 1 + 375ce834215SKazutaka YOKOTA strlen(osrelease); 376ce834215SKazutaka YOKOTA message = malloc(messagelen + 1, M_DEVBUF, M_WAITOK); 377ce834215SKazutaka YOKOTA sprintf(message, "%s - %s %s", hostname, ostype, osrelease); 3782ad872c5SKazutaka YOKOTA blanked = 0; 3792ad872c5SKazutaka YOKOTA return 0; 380e8adebf2SKazutaka YOKOTA } 381e8adebf2SKazutaka YOKOTA 382e8adebf2SKazutaka YOKOTA static int 3832ad872c5SKazutaka YOKOTA daemon_term(video_adapter_t *adp) 384e8adebf2SKazutaka YOKOTA { 385f4863d1aSKazutaka YOKOTA free(message, M_DEVBUF); 3862ad872c5SKazutaka YOKOTA return 0; 387e8adebf2SKazutaka YOKOTA } 388e8adebf2SKazutaka YOKOTA 3892ad872c5SKazutaka YOKOTA static scrn_saver_t daemon_module = { 3902ad872c5SKazutaka YOKOTA "daemon_saver", daemon_init, daemon_term, daemon_saver, NULL, 3912ad872c5SKazutaka YOKOTA }; 3922ad872c5SKazutaka YOKOTA 3932ad872c5SKazutaka YOKOTA SAVER_MODULE(daemon_saver, daemon_module); 394