2010-01-26 104 views
0

我有一个功能,就是这个样子的屏幕打印字符:如何使用Const Char *打印ASCII扩展字符?

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

Eek。什么是魔术数字0xB8000? – GManNickG 2010-01-26 15:00:37

+3

嘿,这是Nathan操作系统的核心 - 不要剔除它。 – 2010-01-26 15:01:34

+0

是的,尼尔,这是我的核心操作系统。 – 2010-01-26 15:02:12

回答

3

嵌入用C的16进制字符串中的字符:

print(0x0f, 0, 0, "\xfe"); 

正如人们所指出的那样,你可能要漂亮了一下代码,也许对VGA framebuffer base address添加一个符号名。

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('?'); 
} 

希望这有助于 最好的问候, 汤姆。

+0

这太有帮助了!我将保存此代码以更好地观察。非常感谢! **: - )** – 2010-01-27 01:43:12

+0

@Nathan:我很好奇 - 为什么? :)那些旧的skool的东西给了我美好的回忆...... :) – t0mm13b 2010-01-27 01:44:59

+0

@Nathan:如果我可以挖出更多的代码,我可以提供更多的代码...在这里放下一行呃? :);) – t0mm13b 2010-01-27 01:45:57