Chinaunix首页 | 论坛 | 博客
  • 博客访问: 521763
  • 博文数量: 118
  • 博客积分: 3995
  • 博客等级: 中校
  • 技术积分: 1276
  • 用 户 组: 普通用户
  • 注册时间: 2005-11-15 12:15
文章分类

全部博文(118)

文章存档

2014年(1)

2013年(1)

2010年(6)

2009年(27)

2008年(10)

2007年(33)

2006年(38)

2005年(2)

我的朋友

分类: LINUX

2009-02-27 23:04:38

//CGA 是 Color Graphics Adapter 的缩写,信号类型为 TTL,最多能显示 16 色,显示卡端的接口为 9 针母插座

void cga_init(void)
{
  volatile uint16_t *cp;
  uint16_t was;
  unsigned pos;

 cp = (uint16_t*) (KERNBASE + CGA_BUF); 
/*
CGA_BUF: 0xB8000 (物理地址)
为了使地址转换后(-KERNBASE)还是0xB8000,那么就需要+KERNBASE
*/
was = *cp; //保存当前光标所在值
*cp = (uint16_t)0xA55A; // ?? *********
if (*cp != 0xA55A) {
 cp = (uint16_t*)(KERNBASE + MONO_BUF);
 addr_6845 = MONO_BASE; /* CGA_BASE: 0x3B4 */
}else {
  *cp = was; // 还原原来的值
  addr_6845 = CGA_BASE; /* CGA_BASE: 0x3D4 */
  }
  /* Extract cursor location */
  outb(addr_6845, 14); // 写控制寄存器,0x0E:获得cursor location high,其值在下一个寄存器
  pos = inb(addr_6845 + 1) << 8; 
  outb(addr_6845, 15); // 写控制寄存器,0x0F:获得cursor location low,其值在下一个寄存器
  pos |= inb(addr_6845 + 1);

  crt_buf = (uint16_t*) cp; //临时变量赋值给全局变量
  crt_pos = pos;    //保存当前光标位置
}


阅读(1653) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~