update console.c for more info about CGA and 6845 chip
This commit is contained in:
parent
45472ee038
commit
7f8b5a20fa
@ -53,29 +53,39 @@ static uint16_t crt_pos;
|
|||||||
static uint16_t addr_6845;
|
static uint16_t addr_6845;
|
||||||
|
|
||||||
/* TEXT-mode CGA/VGA display output */
|
/* 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
|
static void
|
||||||
cga_init(void) {
|
cga_init(void) {
|
||||||
volatile uint16_t *cp = (uint16_t *)CGA_BUF;
|
volatile uint16_t *cp = (uint16_t *)CGA_BUF; //CGA_BUF: 0xB8000 (彩色显示的显存物理基址)
|
||||||
uint16_t was = *cp;
|
uint16_t was = *cp; //保存当前光标所在值
|
||||||
*cp = (uint16_t) 0xA55A;
|
*cp = (uint16_t) 0xA55A;
|
||||||
if (*cp != 0xA55A) {
|
if (*cp != 0xA55A) {
|
||||||
cp = (uint16_t*)MONO_BUF;
|
cp = (uint16_t*)MONO_BUF; //黑白显示的显存基址 MONO_BUF: 0xB0000
|
||||||
addr_6845 = MONO_BASE;
|
addr_6845 = MONO_BASE; //黑白显示控制的IO地址,MONO_BASE: 0x3B4
|
||||||
} else {
|
} else {
|
||||||
*cp = was;
|
*cp = was; //还原原来的光标所在值
|
||||||
addr_6845 = CGA_BASE;
|
addr_6845 = CGA_BASE; // 彩色显示控制的IO地址, CGA_BASE: 0x3D4
|
||||||
}
|
}
|
||||||
|
|
||||||
// Extract cursor location
|
// Extract cursor location
|
||||||
|
// 6845索引寄存器的index 0x0E(及十进制的14)== 光标位置(高位)
|
||||||
|
// 6845索引寄存器的index 0x0F(及十进制的15)== 光标位置(低位)
|
||||||
|
// 6845 reg 15 : Cursor Address (Low Byte)
|
||||||
uint32_t pos;
|
uint32_t pos;
|
||||||
outb(addr_6845, 14);
|
outb(addr_6845, 14);
|
||||||
pos = inb(addr_6845 + 1) << 8;
|
pos = inb(addr_6845 + 1) << 8; //读出了光标位置(高位)
|
||||||
outb(addr_6845, 15);
|
outb(addr_6845, 15);
|
||||||
pos |= inb(addr_6845 + 1);
|
pos |= inb(addr_6845 + 1); //读出了光标位置(低位)
|
||||||
|
|
||||||
crt_buf = (uint16_t*) cp;
|
crt_buf = (uint16_t*) cp; //crt_buf是CGA显存起始地址
|
||||||
crt_pos = pos;
|
crt_pos = pos; //crt_pos是CGA当前光标位置
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool serial_exists = 0;
|
static bool serial_exists = 0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user