#2
xzlxzlxzl2015-04-26 16:34
|
pc上电以后 利用 bios 10H中断 2号功能调用设置显示模式 80 * 25 16色 文本,然后 需要跳转到 保护 模式,我把中断 关了,然后 0x0000~0x1400用作他用 ,于是 我就把 这段内存 0 填充了,可是后面 代码 我还需要答应 字符 ,直接利用 IO端口指令操作 VGA 来显示 字符 可以吗?
程序代码:
movw $0x02, %ax
int $0x10 /*利用bios中断设置了显示模式*/
cli
call setpage
/*后面还能打印字符么?*/
call main
setpage 的实现如下。
程序代码:
void setpage( )
{
long *begin;
int i = 0;
int j = 0;
begin = (long *)0x00000000;
for(i = 0; i < 5; i++ )
for(j = 0; j < 1024 ; j++)
*(begin++) = 0x00000000;
}
main 的实现如下。
程序代码:
void mian()
{
mc_putc('a');
}
/*******************************************/
#define VGA_ADDR 0xb8000
#define VGA_MEM_H 0x0c
#define VGA_MEM_L 0x0d
#define VGA_CUR_H 0x0e
#define VGA_CUR_L 0x0f
#define VGA_CMD 0x3d4
#define VGA_DAT 0x3d5
#define VGA_PER_CNT 2000
#define VGA_PER_SIZ 4000
#define VGA_TAB_SIZ 8
#define VGA_COL_SIZ 80
#define VGA_BLACK_WHITE 0x0700
/********************************************/
void mc_putc(char c)
{
uint pos;
outb(VGA_CUR_H, VGA_CMD);
pos = inb(VGA_DAT);
outb(VGA_CUR_L, VGA_CMD);
pos = (pos << 8) | inb(VGA_DAT);
switch(c){
case '\n':
pos += VGA_COL_SIZ - pos % VGA_COL_SIZ;
break;
case '\t':
pos += VGA_TAB_SIZ - pos % VGA_TAB_SIZ;
break;
default:
term[pos++] = c | VGA_BLACK_WHITE;
break;
}
if(pos == VGA_PER_CNT){
memmove((uchar *)term, (uchar *)(term + VGA_COL_SIZ), (VGA_PER_CNT - VGA_COL_SIZ) * 2);
pos -= VGA_COL_SIZ;
memset((uchar*)(term + pos), 0, VGA_COL_SIZ * 2);
}
outb(VGA_CUR_H, VGA_CMD);
outb((uchar)(pos >> 8), VGA_DAT);
outb(VGA_CUR_L, VGA_CMD);
outb((uchar)(pos), VGA_DAT);
term[pos] = ' ' | VGA_BLACK_WHITE;
}
/********************************************/
static inline void outb(uchar val, ushort port)
{
asm volatile("outb %1, %0" : : "d"(port), "a"(val));
}
/********************************************/
static inline uchar inb(ushort port)
{
uchar val;
asm volatile("inb %1, %0" : "=a"(val) : "d"(port));
return val;
}
[ 本帖最后由 乾坤洞主 于 2015-4-27 15:36 编辑 ]