我有一个在屏幕上打印字符的功能,如下所示:
void print(int colour, int y, int x, const char *string)
{
volatile char *video=(volatile char*)0xB8000 + y*160 + x*2;
while(*string != 0)
{
*video=*string;
string++;
video++;
*video=colour;
video++;
}
}
我想要打印字符254 in decimal,但我需要使用存储在const char*
上。我无法尝试print(0x0F, 0, 0, 0xFE);
,因为这会抛出一个没有强制转换的指针错误,那么我该怎么办呢?
答案 0 :(得分:3)
使用C的十六进制表示法将字符嵌入字符串中:
print(0x0f, 0, 0, "\xfe");
正如大家所指出的那样,您可能希望稍微提高代码,可能是为VGA framebuffer base address添加符号名称。
答案 1 :(得分:1)
这是一个偏离主题的记忆,但是我发现了这个代码:
/* Global Variables */ static Word far *ScrPtr; /* Local Variables */ static Word VidSeg; ... int WinScreenHeight(void) { return (*(unsigned char far *) 0x484) + 1; } int WinScreenWidth(void) { return (*(unsigned int far *) 0x44A); } void WinInit(){ SetMode(AdapterType()); ScrPtr = (Word far *) CreateFarPtr(VidSeg, 0x0000); } static void SetMode(int VideoAddress) { switch(VideoAddress) { case VGA : case MCGA: case EGA : case CGA : (Word) VidSeg = 0xB800; break; case MDA : (Word) VidSeg = 0xB000; break; case '?' : fprintf(stderr, "Sorry Unknown Video Adapter.\n"); fprintf(stderr, "This program requires C/E/MC/VGA, Mono Adapter\n"); exit(1); } } static int AdapterType(void) { char far *VidMode; char blreg, alreg; VidMode = (char far *) 0x00000449L; asm mov ax, 0x1a00; asm push bp; asm int 0x10; asm pop bp; asm mov blreg, bl; asm mov alreg, al; if (alreg == 0x1a && blreg >= 9) return(MCGA); if (alreg == 0x1a && blreg >= 7 && blreg <= 9) return(VGA); if (blreg == 4 || blreg == 5) return(EGA); if (*VidMode == 3) return(CGA); if (*VidMode == 7) return(MDA); return('?'); }
希望这有帮助, 最好的祝福, 汤姆。