⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scrn.c.svn-base

📁 SImple Microkernel Distributed Operating System
💻 SVN-BASE
字号:
/* bkerndev - Bran's Kernel Development Tutorial*  By:   Brandon F. (friesenb@gmail.com)*  Desc: Screen output functions for Console I/O**  Notes: No warranty expressed or implied. Use at own risk. */#include <stdio.h>#include <string.h>#include <system.h>/* These define our textpointer, our background and foreground*  colors (attributes), and x and y cursor coordinates */unsigned short *textmemptr;unsigned attrib = 0x0F;unsigned csr_x  = 0;unsigned csr_y  = 0;/* Scrolls the screen */void scroll(void){    unsigned blank, temp;    /* A blank is defined as a space... we need to give it    *  backcolor too */    blank = 0x20 | (attrib << 8);    /* Row 25 is the end, this means we need to scroll up */    if(csr_y >= 25)    {        /* Move the current text chunk that makes up the screen        *  back in the buffer by a line */        temp = csr_y - 25 + 1;        memcpy (textmemptr, textmemptr + temp * 80, (25 - temp) * 80 * 2);        /* Finally, we set the chunk of memory that occupies        *  the last line of text to our 'blank' character */        memsetw (textmemptr + (25 - temp) * 80, blank, 80);        csr_y = 25 - 1;    }}/* Updates the hardware cursor: the little blinking line*  on the screen under the last character pressed! */void move_csr(void){    unsigned temp;    /* The equation for finding the index in a linear    *  chunk of memory can be represented by:    *  Index = [(y * width) + x] */    temp = csr_y * 80 + csr_x;    /* This sends a command to indicies 14 and 15 in the    *  CRT Control Register of the VGA controller. These    *  are the high and low bytes of the index that show    *  where the hardware cursor is to be 'blinking'. To    *  learn more, you should look up some VGA specific    *  programming documents. A great start to graphics:    *  http://www.brackeen.com/home/vga */    outportb(0x3D4, 14);    outportb(0x3D5, temp >> 8);    outportb(0x3D4, 15);    outportb(0x3D5, temp);}/* Clears the screen */void cls(){    unsigned blank;    int i;    /* Again, we need the 'short' that will be used to    *  represent a space with color */    blank = 0x20 | (attrib << 8);    /* Sets the entire screen to spaces in our current    *  color */    for(i = 0; i < 25; i++)        memsetw (textmemptr + i * 80, blank, 80);    /* Update out virtual cursor, and then move the    *  hardware cursor */    csr_x = 0;    csr_y = 0;    move_csr();}/* Puts a single character on the screen */int putchar(int c){    unsigned short *where;    unsigned att = attrib << 8;    /* Handle a backspace, by moving the cursor back one space */    if(c == 0x08)    {        if(csr_x != 0) csr_x--;    }    /* Handles a tab by incrementing the cursor's x, but only    *  to a point that will make it divisible by 8 */    else if(c == 0x09)    {        csr_x = (csr_x + 8) & ~(8 - 1);    }    /* Handles a 'Carriage Return', which simply brings the    *  cursor back to the margin */    else if(c == '\r')    {        csr_x = 0;    }    /* We handle our newlines the way DOS and the BIOS do: we    *  treat it as if a 'CR' was also there, so we bring the    *  cursor to the margin and we increment the 'y' value */    else if(c == '\n')    {        csr_x = 0;        csr_y++;    }    /* Any character greater than and including a space, is a    *  printable character. The equation for finding the index    *  in a linear chunk of memory can be represented by:    *  Index = [(y * width) + x] */    else if(c >= ' ')    {        where = textmemptr + (csr_y * 80 + csr_x);        *where = c | att;	/* Character AND attributes: color */        csr_x++;    }    /* If the cursor has reached the edge of the screen's width, we    *  insert a new line in there */    if(csr_x >= 80)    {        csr_x = 0;        csr_y++;    }    /* Scroll the screen if needed, and finally move the cursor */    scroll();    move_csr();    return 1;}/* Uses the above routine to output a string... */int puts(const char *s){    int i;    for (i = 0; i < strlen(s); i++){        putchar(s[i]);    }    return 1;}/* Sets the forecolor and backcolor that we will use */void settextcolor(unsigned char forecolor, unsigned char backcolor){    /* Top 4 bytes are the background, bottom 4 bytes    *  are the foreground color */    attrib = (backcolor << 4) | (forecolor & 0x0F);}/* Sets our text-mode VGA pointer, then clears the screen for us */void init_video(void){    textmemptr = (unsigned short *)0xB8000;    cls();}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -