diff -bu display.c.old display.c --- display.c.old Tue Sep 16 17:39:11 1997 +++ display.c Sun Sep 21 17:38:47 1997 @@ -251,6 +251,329 @@ set_col(); } + + +/*** Linux GGI & Penguin Logo ***/ + +#define DEF_LINES_PER_CHAR 16 /* ie. char height in 80x25 mode */ + + +#define BUZZ_HT 3 +#define BUZZ_WD 25 + +unsigned short buzz_logo_attrs[BUZZ_HT*BUZZ_WD] = +{ + 0x70c6, 0x70b5, 0x7020, 0x7c80, 0x7020, 0x7020, 0x7020, 0x7020, 0x7020, + 0x7020, 0x7020, 0x7020, 0x71d6, 0x71d2, 0x71b7, 0x71d5, 0x71cd, + 0x71b8, 0x7020, 0x7181, 0x7020, 0x70da, 0x0ec4, 0x70bf, 0x7020, + + 0x7020, 0x7082, 0x7083, 0x7c84, 0x70c9, 0x70cb, 0x70d1, 0x70ce, 0x70bb, + 0x70cc, 0x70b9, 0x7085, 0x7186, 0x7020, 0x7187, 0x7188, 0x7020, + 0x7189, 0x7020, 0x718a, 0x7020, 0x70c3, 0x70c5, 0x70b4, 0x7020, + + 0x70de, 0x70d4, 0x70be, 0x7c8b, 0x70c8, 0x70ca, 0x70cf, 0x70d8, 0x70bc, + 0x70c7, 0x70b6, 0x7020, 0x71d3, 0x71d0, 0x71bd, 0x71dc, 0x71db, + 0x71df, 0x7020, 0x718c, 0x70c0, 0x0ec1, 0x70d7, 0x0ec2, 0x70d9 +}; + +#define BUZZ_FIRST 128 +#define BUZZ_LAST 255 + +unsigned char buzz_logo_char_data[128*8] = +{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, /* 0x80 */ + 0x00, 0x00, 0x00, 0x00, 0xf8, 0xfc, 0x7c, 0x78, + 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x1f, 0x1e, 0x1e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, + 0x7e, 0xfc, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, + 0x3c, 0x1c, 0x00, 0x00, 0xfc, 0x7c, 0x3c, 0x3c, + 0x1f, 0x3f, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, + 0x0f, 0x07, 0x00, 0x00, 0x3f, 0x1f, 0x0f, 0x0f, + 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0x3e, 0x3c, 0x3c, 0x7e, 0x00, 0x00, 0x00, 0x00, + 0x78, 0x78, 0xf8, 0xfc, 0x7e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xe0, 0xf0, 0xf8, 0x7c, 0x7e, 0x7e, 0x7e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xfc, 0xf8, + 0xe0, 0xf0, 0xf8, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xf0, 0xf8, 0xf8, + 0x00, 0x00, 0x00, 0x00, 0xe0, 0xfc, 0xfe, 0x3e, + 0x00, 0xfc, 0x78, 0xf8, 0xe0, 0xc0, 0x80, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x60, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf8, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0xfc, 0xfc, 0xf8, 0xc0, 0x00, 0x00, 0x00, + 0x07, 0x0f, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, + + 0x00, 0x01, 0x03, 0x03, 0x03, 0x01, 0x00, 0x00, /* 0xc0 */ + 0x78, 0xfc, 0xfe, 0xff, 0xff, 0xff, 0x1f, 0x00, + 0x84, 0xcc, 0xfc, 0xff, 0xff, 0xfe, 0xf0, 0x00, + 0x03, 0x06, 0x0c, 0x18, 0x18, 0x30, 0x70, 0x70, + 0x00, 0x00, 0x00, 0xcc, 0x44, 0xf8, 0xfc, 0x70, + 0x71, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, + 0x3f, 0x78, 0xf8, 0x70, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x07, 0x0f, 0x07, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x1f, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x83, 0x83, 0xc7, 0xe3, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x8e, 0xff, 0xff, 0xc3, 0x83, 0x83, 0x83, + 0x00, 0xf8, 0x7c, 0x3c, 0x1f, 0x0f, 0x07, 0x1f, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xe0, + 0x00, 0xc0, 0xe3, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xc1, 0xc1, 0xe0, 0xf0, 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, /* 0xd0 */ + 0x00, 0x00, 0x87, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x80, + 0x7c, 0x3f, 0x1f, 0x07, 0x00, 0x00, 0x00, 0x00, + 0xf8, 0xf8, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x1f, 0x3f, + 0x00, 0x00, 0x01, 0x83, 0xc7, 0xff, 0xe7, 0x81, + 0xe0, 0xe1, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0xc0, 0xc0, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x00, 0xc0, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, + 0x1f, 0x0f, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0x3f, 0xff, 0xfe, 0xf0, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static uchar previous_font_chars[128][32]; + + +/* This font code is from the IBM vga driver */ + +#include +#include + +typedef struct text16_font_reg_s { + uchar SR2,SR4; + uchar GR4,GR5,GR6; +} text16_font_reg; + +static inline void text16_font_enter(text16_font_reg *regs) +{ + IS_CRITICAL; + + ENTER_CRITICAL; + regs->SR2 = inbSEQ(0x02); + regs->SR4 = inbSEQ(0x04); /* save register state */ + regs->GR4 = inbGRC(0x04); + regs->GR5 = inbGRC(0x05); + regs->GR6 = inbGRC(0x06); + + outbSEQ(SR02_PLANE2, 0x02); /* font data goes to plane 2 */ + outbSEQ(SR04_256K_ACCESS | SR04_NO_ODDEVEN, 0x04); + + outbGRC(2, 0x04); /* read plane 2 */ + outbGRC(GR5_WRITEMODE0, 0x05); + outbGRC(GR6_MAP_A0_64 | GR6_GRAPHMODE, 0x06); + LEAVE_CRITICAL; +} + +static void inline text16_font_leave(text16_font_reg *regs) +{ + IS_CRITICAL; + + ENTER_CRITICAL; + outbSEQ(regs->SR2, 0x02); + outbSEQ(regs->SR4, 0x04); /* Restore registers */ + outbGRC(regs->GR4, 0x04); + outbGRC(regs->GR5, 0x05); + outbGRC(regs->GR6, 0x06); + LEAVE_CRITICAL; +} + +static inline void direct_text16_font_read(int chr,uchar *charcell) +{ + memcpy(charcell,(uchar *)(phys_to_virt(0xA0000))+(chr<<5),32); +} + +static inline void direct_text16_font_write(int chr,uchar *charcell) +{ + memcpy((uchar *)(phys_to_virt(0xA0000))+(chr<<5),charcell,32); +} + +static void set_penguin_font(uint sizey) +{ + /* sizey is the font height */ + + + int i, y; + + text16_font_reg regs; + + + text16_font_enter(®s); + + for (i=0; i < 128; i++) { + + uchar charcell[32]; + + direct_text16_font_read(128 + i, + &previous_font_chars[i][0]); + + for (y=0; y < 32; y++) { + + int line = y * 8 / sizey; + + charcell[y] = (line < 8) ? + buzz_logo_char_data[i*8+line] : 0; + } + + direct_text16_font_write(128 + i, charcell); + } + + text16_font_leave(®s); +} + +static void reset_penguin_font(void) +{ + int i; + + text16_font_reg regs; + + + text16_font_enter(®s); + + for (i=0; i < 128; i++) { + direct_text16_font_write(128 + i, + &previous_font_chars[i][0]); + } + + text16_font_leave(®s); +} + +static void poll_wait_one_screen(void) +{ + while (inb_p(0x3DA) & 8); + while (! (inb_p(0x3DA) & 8)); +} + +static void show_penguin(ushort *fb, uint sizex, uint sizey) +{ + int line = 0, firstcol = (sizex - BUZZ_WD); + + for (line=0; line < BUZZ_HT; line++) { + + int col; + ushort *p = fb + firstcol; + + for (col = 0; col < BUZZ_WD; col++) { + *p++ = buzz_logo_attrs[line*BUZZ_WD+col]; + + } + + fb += sizex; + } +} + +static void wait_penguin(void) +{ + int i; + + for (i = 0; i < 200; i++) { + poll_wait_one_screen(); + } +} + +static void hide_penguin(ushort *fb, uint sizex, uint sizey) +{ + int line = 0, firstcol = (sizex - BUZZ_WD); + + for (line=0; line < BUZZ_HT; line++) { + + int col; + ushort *p = fb + firstcol; + + for (col = 0; col < BUZZ_WD; col++) { + *p++ = 0x0000; + } + + fb += sizex; + } +} + #endif /* #ifdef TELL_THE_TRUTH */ /* ----------------------------------------------------------------------------- @@ -791,28 +1114,13 @@ int cnt = ORIG_VIDEO_COLS*(ORIG_VIDEO_LINES - 1); - #ifdef TELL_THE_TRUTH - - ushort *d = boot_fb; - ushort *s = boot_fb+ORIG_VIDEO_COLS; - - while (cnt--) { - - *d = (*d & 0xFF00) | (*s & 0x00FF); - d++; s++; - } - - cnt = ORIG_VIDEO_COLS; - while (cnt--) { - - *(d++) &= 0xFF00; - } - - #else - memcpy(boot_fb, boot_fb + ORIG_VIDEO_COLS, cnt*2); memset(boot_fb + cnt, 0, ORIG_VIDEO_COLS*2); + #ifdef TELL_THE_TRUTH + + show_penguin(boot_fb, ORIG_VIDEO_COLS, ORIG_VIDEO_LINES); + #endif } else { @@ -864,15 +1172,17 @@ #ifdef TELL_THE_TRUTH - boot_fb[boot_pos] = *s | (boot_fb[boot_pos] & 0xFF00); + if ((ORIG_X < (ORIG_VIDEO_COLS - BUZZ_WD)) || + (ORIG_Y >= BUZZ_HT)) { + boot_fb[boot_pos] = *s | boot_attr; + } /* slow down to be able to read early boot messages ** even when they scroll up. */ - if (ORIG_VIDEO_ISVGA && !(boot_pos & 0x3)) { + if (ORIG_VIDEO_ISVGA && !(boot_pos & 0x1)) { - while (inb(0x3DA) & 8); - while (!(inb(0x3DA) & 8)); + poll_wait_one_screen(); } #else @@ -956,7 +1266,8 @@ if (ORIG_VIDEO_ISVGA) { - show_msg(boot_fb, ORIG_VIDEO_COLS, ORIG_VIDEO_LINES); + set_penguin_font(DEF_LINES_PER_CHAR); + show_penguin(boot_fb, ORIG_VIDEO_COLS, ORIG_VIDEO_LINES); } #endif @@ -1023,7 +1334,8 @@ if (ORIG_VIDEO_ISVGA) { - hide_msg(boot_fb, ORIG_VIDEO_COLS, ORIG_VIDEO_LINES); + hide_penguin(boot_fb, ORIG_VIDEO_COLS, ORIG_VIDEO_LINES); + reset_penguin_font(); } #endif