0

次のような文字を画面に印刷する機能があります。

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を10進数で印刷したいのですが、に保存されたものを使用する必要がありますconst char*print(0x0F, 0, 0, 0xFE);キャストせずにポインタのエラーが発生するため、試すことができません。どうすればよいですか?

4

2 に答える 2

3

Cの16進表記を使用して、文字列に文字を埋め込みます。

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

人々が指摘しているように、おそらくVGAフレームバッファのベースアドレスにシンボリック名を追加することで、コードを少しきれいにしたいと思うかもしれません。

于 2010-01-26T15:00:30.160 に答える
1

これはトピックから外れている、これの記憶ですが、私がこれを見つけたコードを掘り下げます:

/*グローバル変数*/
static Word far * ScrPtr;

/*ローカル変数*/
静的なWordVidSeg;
..。

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)
    {{
        ケースVGA:
        ケースMCGA:
        ケースEGA:
        ケースCGA:(単語)VidSeg = 0xB800;
                    壊す;
        ケースMDA:(単語)VidSeg = 0xB000;
                    壊す;
        場合 '?' :fprintf(stderr、"申し訳ありませんが不明なビデオアダプタ。\n");
                    fprintf(stderr、"このプログラムにはC/ E / MC / VGA、モノラルアダプタが必要です\ 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);
    戻る('?');
}

これがお役に立てば幸いです、よろしく、トム。

于 2010-01-26T15:18:05.317 に答える