update console.c for more info about CGA and 6845 chip

This commit is contained in:
yuchen 2015-03-13 20:21:44 +08:00
parent 45472ee038
commit 7f8b5a20fa

View File

@ -53,29 +53,39 @@ static uint16_t crt_pos;
static uint16_t addr_6845;
/* TEXT-mode CGA/VGA display output */
// 显示器初始化CGA 是 Color Graphics Adapter 的缩写
// CGA显存按照下面的方式映射
// -- 0xB0000 - 0xB7777 单色字符模式
// -- 0xB8000 - 0xBFFFF 彩色字符模式及 CGA 兼容图形模式
// 6845芯片是IBM PC中的视频控制器
// CPU通过IO地址0x3B4-0x3B5来驱动6845控制单色显示通过IO地址0x3D4-0x3D5来控制彩色显示。
// -- 数据寄存器 映射 到 端口 0x3D5或0x3B5
// -- 索引寄存器 0x3D4或0x3B4,决定在数据寄存器中的数据表示什么。
static void
cga_init(void) {
volatile uint16_t *cp = (uint16_t *)CGA_BUF;
uint16_t was = *cp;
volatile uint16_t *cp = (uint16_t *)CGA_BUF; //CGA_BUF: 0xB8000 (彩色显示的显存物理基址)
uint16_t was = *cp; //保存当前光标所在值
*cp = (uint16_t) 0xA55A;
if (*cp != 0xA55A) {
cp = (uint16_t*)MONO_BUF;
addr_6845 = MONO_BASE;
cp = (uint16_t*)MONO_BUF; //黑白显示的显存基址 MONO_BUF 0xB0000
addr_6845 = MONO_BASE; //黑白显示控制的IO地址MONO_BASE: 0x3B4
} else {
*cp = was;
addr_6845 = CGA_BASE;
*cp = was; //还原原来的光标所在值
addr_6845 = CGA_BASE; // 彩色显示控制的IO地址 CGA_BASE: 0x3D4
}
// Extract cursor location
// 6845索引寄存器的index 0x0E及十进制的14== 光标位置(高位)
// 6845索引寄存器的index 0x0F及十进制的15== 光标位置(低位)
// 6845 reg 15 : Cursor Address (Low Byte)
uint32_t pos;
outb(addr_6845, 14);
pos = inb(addr_6845 + 1) << 8;
outb(addr_6845, 14);
pos = inb(addr_6845 + 1) << 8; //读出了光标位置(高位)
outb(addr_6845, 15);
pos |= inb(addr_6845 + 1);
pos |= inb(addr_6845 + 1); //读出了光标位置(低位)
crt_buf = (uint16_t*) cp;
crt_pos = pos;
crt_buf = (uint16_t*) cp; //crt_buf是CGA显存起始地址
crt_pos = pos; //crt_pos是CGA当前光标位置
}
static bool serial_exists = 0;