x86_videomem.c

来自「Simple Operating Systems (简称SOS)是一个可以运行在」· C语言 代码 · 共 128 行

C
128
字号
/* Copyright (C) 2004  David Decotigny   This program is free software; you can redistribute it and/or   modify it under the terms of the GNU General Public License   as published by the Free Software Foundation; either version 2   of 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 of   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   GNU General Public License for more details.      You should have received a copy of the GNU General Public License   along with this program; if not, write to the Free Software   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,   USA. */#include <sos/klibc.h>#include <hwcore/ioports.h>#include "x86_videomem.h"/* The text video memory starts at address 0xB8000. Odd bytes are the   ASCII value of the character, even bytes are attribute for the   preceding character. */#define VIDEO   0xb8000/* Console screen size */#define LINES   25#define COLUMNS 80/** The structure of a character element in the video memory. @see    http://webster.cs.ucr.edu/AoA DOS edition chapter 23 */typedef struct {  unsigned char character;  unsigned char attribute;} __attribute__ ((packed)) x86_video_mem[LINES*COLUMNS];/** The base pointer for the video memory */static volatile x86_video_mem *video = (volatile x86_video_mem*)VIDEO;sos_ret_t sos_x86_videomem_setup(void){  /*   * Hide cursor. @see Ralf Brown's interrupt (and port) list   * http://www-2.cs.cmu.edu/~ralf/files.html   */#define CRT_REG_INDEX 0x3d4#define CRT_REG_DATA  0x3d5  /* CRT index port => ask for access to register 0xa ("cursor     start") */  outb(0x0a, CRT_REG_INDEX);  /* (RBIL Tables 708 & 654) CRT Register 0xa => bit 5 = cursor OFF */  outb(1 << 5, CRT_REG_DATA);  return SOS_OK;}sos_ret_t sos_x86_videomem_cls(unsigned char attribute){  /* Clears the screen */  int i;  for(i = 0 ; i < LINES*COLUMNS ; i++)    {      (*video)[i].character = 0;      (*video)[i].attribute = attribute;    }  return SOS_OK;  }sos_ret_t sos_x86_videomem_putstring(unsigned char row, unsigned char col,				     unsigned char attribute,				     const char *str){  unsigned video_offs = row*COLUMNS + col;  if (video_offs >= LINES*COLUMNS)    return -SOS_EINVAL;    for ( ; str && *str && (video_offs < LINES*COLUMNS) ; str++, video_offs++)    {      (*video)[video_offs].character = (unsigned char)*str;      (*video)[video_offs].attribute = attribute;    }  return SOS_OK;}sos_ret_t sos_x86_videomem_putchar(unsigned char row, unsigned char col,				   unsigned char attribute,				   unsigned char c){  unsigned video_offs = row*COLUMNS + col;  if (video_offs >= LINES*COLUMNS)    return -SOS_EINVAL;    (*video)[video_offs].character = c;  (*video)[video_offs].attribute = attribute;  return SOS_OK;}sos_ret_t sos_x86_videomem_printf(unsigned char row, unsigned char col,				  unsigned char attribute,				  const char *format, /* args */...){  char buff[256];  va_list ap;    va_start(ap, format);  vsnprintf(buff, sizeof(buff), format, ap);  va_end(ap);    return sos_x86_videomem_putstring(row, col, attribute, buff);}

⌨️ 快捷键说明

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