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

📄 video.c

📁 一个迷你操作系统gazos的源码
💻 C
字号:
/*GazOS Operating SystemCopyright (C) 1999  Gareth Owen <gaz@athene.co.uk>This program is free software; you can redistribute it and/ormodify it under the terms of the GNU General Public Licenseas published by the Free Software Foundation; either version 2of the License, or (at your option) any later version.This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with this program; if not, write to the Free SoftwareFoundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.*/#include "video.h"#include "io.h"unsigned char *VIDEO_MEMORY = (char *)0xB8000;void kprint(char *string)		/* Print text to the screen	*/{   unsigned int curchar, vidmem_off, i;   outportb(0x3d4, 0x0e);		/* Get cursor Y position	*/   vidmem_off = inportb(0x3d5);   vidmem_off <<= 8;   outportb(0x3d4, 0x0f);		/* And add cursor X position	*/   vidmem_off += inportb(0x3d5);   vidmem_off <<= 1;   while((curchar=*string++))		/* Loop through the string	*/   {      switch(curchar)			/* Is it a special character ?  */      {         case '\n':			/* Newline found		*/            vidmem_off = (vidmem_off/160)*160 + 160;            break;         case '\r':			/* Carriage return found	*/            vidmem_off = (vidmem_off/160)*160;            break;	case '\t':	    vidmem_off += 8;	    break;	 	case 8:/* Delete */	    vidmem_off-=2;	    VIDEO_MEMORY[vidmem_off] = 0x20;	    break;         default:			/* Normal character             */            VIDEO_MEMORY[vidmem_off++] = curchar;            VIDEO_MEMORY[vidmem_off++] = 0x07;            break;      }      if(vidmem_off >= 160*25)		/* Are we off-screen ?		*/      {         for(i = 0; i < 160*24; i++)	/* Scroll the screen up		*/         {            VIDEO_MEMORY[i] = VIDEO_MEMORY[i+160];         }         for(i = 0; i < 80; i++)	/* Empty the bottom row		*/         {            VIDEO_MEMORY[(160*24)+(i*2)] = 0x20;            VIDEO_MEMORY[(160*24)+(i*2)+1] = 0x07;         }         vidmem_off -= 160;		/* We're on the bottom row	*/      }   }   vidmem_off >>= 1;			/* Set the new cursor position  */   outportb(0x3d4, 0x0f);   outportb(0x3d5, vidmem_off & 0x0ff);   outportw(0x3d4, 0x0e);   outportb(0x3d5, vidmem_off >> 8);}void cls(void)				/* Clear the screen		*/{   unsigned int i;   for(i = 0; i < (80*25); i++)         /* Fill the screen with         */   {					/* background color		*/      VIDEO_MEMORY[i*2] = 0x20;      VIDEO_MEMORY[i*2+1] = 0x07;   }   outportb(0x3d4, 0x0f);		/* Set the cursor to the	*/   outportb(0x3d5, 0);			/* upper-left corner of the	*/   outportw(0x3d4, 0x0e);		/* screen			*/   outportb(0x3d5, 0);}void printlong(unsigned long i)  /* Convert a dword to a string  */{   unsigned char backstr[11], j=0, l=0, m=0;   unsigned char str[255];   do					/* Convert string one digit at	*/   {					/* a time			*/      backstr[j++] = (i % 10) + '0';	/* Put a digit in backstr	*/      i /= 10;				/* Next digit			*/   }					/* And continue until there are */   while(i);				/* no more digits left		*/   backstr[j] = '\0';			/* End of the string		*/   for(l=j-1; m<j; l--)			/* Backstr is backwards (last   */   {					/* digit first.)  Now we flip   */      str[m++] = backstr[l];		/* it around...			*/   }					/* ... and it's ready !!!	*/   str[j] = '\0';			/* Put the string end on it	*/   kprint(str);}

⌨️ 快捷键说明

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