2017-01-07 7 views
0

私はOSカーネルを開発しています。私は、拡張ASCII文字を画面に印刷する際に問題に直面しています。画面に文字を印刷しようとすると、一般的なASCII文字はWHITEの色で簡単に印刷されます。しかし、ブロック、シグマなどのような拡張ASCII文字を印刷しようとすると、黄色で印刷されます。むしろこれらの文字はcolor's number - 1で印刷されます。拡張ASCII文字は白色ではなく黄色で表示されます - OSDev

WHITE -> YELLOW 
YELLOW -> BRIGHT MAGENTA 
BRIGHT MAGENTA -> BRIGHT RED 
. 
. 
and so on 

誰が、なぜこれが起こっている言うと、私のこの問題の解決に役立つことはできますか?

putChar(0xdb,0,3,color(BLACK,BLACK)); 
putChar('A',2,3,color(WHITE,BLACK)); 

putChar(228,0,4,color(B_GREEN,BLUE)); 
putChar('A',2,4,color(B_GREEN,BLUE)); 

putChar(228,0,5,color(B_MAGENTA,BLUE)); 
putChar('A',2,5,color(B_MAGENTA,BLUE)); 

、出力がある - -

私のコードは、ある

The Output

私は色+ 1つのコードを使用することもできましたが、何も白の上にありません。どのように私は白でそれらを印刷できますか?

EDIT - putCharのコード

void putChar(char character, short col, short row, unsigned char attr) { 
    volatile unsigned char* vid_mem = (unsigned char *) VIDEO_MEM; 
    int offset = (row*80 + col)*2; 
    vid_mem += offset; 
    if(!attr) { 
     attr = default_color; 
    } 
    *(unsigned short int *)vid_mem = (attr<<8)+character; 
} 
+0

まあ、 'putChar()'には何がありますか? – duskwuff

+0

@duskwuff私はコード –

+0

を追加しました。それは単に符号拡張です - '文字'を 'unsigned char'にするか、' attr << 8'に追加する前に上位ビットをマスクしてください。 –

答えて

3

ほとんどの問題はここにある:タイプcharをgccのx86ので

(attr<<8)+character 

はデフォルトで署名されています。したがって、0x80 ... 0xFFのコードで文字を渡すと、それらは符号付きとして扱われ、加算前に符号が拡張されます。だから、あなたが効果的に得ているそれらの文字のため(attr<<8)+0xFFFFFF80 ... (attr<<8)+0xFFFFFFFF0xFF00(attr<<8)に加えると、attrから1が効果的に減算されます。

+0

はい、それは問題の原因です。私はそれを訂正して、今は動作します。 –

関連する問題