日本の国旗を描く

昔懐かしいグラフィックモードで日本の国旗を描きます。

前田稔の超初心者のプログラム入門

プログラムの説明

  1. このプログラムは Windows 98 & Visual C++ ver 1.5 で作成しました。
    Visual C++ の現在のバージョンや、WindowsXP 以降では動かないかも知れません。
    グラフィックモードが動く環境が無くなりそうなので、今のうちに記録に残そうと取り上げました。
  2. グラフィックモードを使うときは graph.h をインクルードします。
    Graphic Mode に切り替えるコードです。
    プログラムの最初で実行して下さい。
    if (!_setvideomode(_VRES16EXCOLOR)) return(-1);
  3. 白で矩形を描きます。
    _setcolor(15); が色(白)の設定です。
    100,5 が左上の座標で、500,350 が右下の座標です。
    _setcolor(15);
    _rectangle(_GFILLINTERIOR,100,50,500,350);
  4. 赤で円を描きます。
    _setcolor(12); が色(赤)の設定です。
    200,100 が左上の座標で、400,300 が右下の座標で、矩形に内接する円を描きます。
    長方形を指定すると楕円になります。
    _setcolor(12);
    _ellipse(_GFILLINTERIOR,200,100,400,300);
  5. Graphic Mode を終了して通常のモードに切り替えるコードです。
    _setvideomode(_DEFAULTMODE);
  6. 全ソースコードです。
    /*★ ドットを描画    前田 稔 ★*/
    #include <stdio.h>
    #include <conio.h>
    #include <graph.h>
    
    //★ MAIN ★
    int     main(void)
    {   int i;
        if (!_setvideomode(_VRES16EXCOLOR)) return(-1);
        _setcolor(15);
        _rectangle(_GFILLINTERIOR,100,50,500,350);
        _setcolor(12);
        _ellipse(_GFILLINTERIOR,200,100,400,300);
        _getch();
        _setvideomode(_DEFAULTMODE);
    }
    

【NOTE】

実は _setcolor(12); などで設定した色は、固定されている訳ではありません。
DOS/Vでは、色の設定にパレットレジスタとカラーレジスタを使用します。
パレットレジスタは16個あり _setcolor() で指定するのは、パレットレジスタの番号です。
パレットレジスタには、次のようにカラーレジスタの番号が格納されています。
00010203 04051407 38393A3B 3C3D3E3F 00
00 から 05 のパレットレジスタには 00 から 05 のカラーレジスタの番号が格納されています。
08 から 0F のパレットレジスタには 38 から 3F のカラーレジスタの番号が格納されています。
カラーレジスターに色を設定することにより、自由に色を変更することが出来ます。
最後の 00 は背景色の指定です。

【以下は私の覚書です】

DOS/V パレットレジスタの形式

※パレットレジスタ

16個のレジスタで構成され、一度に16色を選択できる。
パレットレジスタには、カラーレジスタの番号が格納される。

※カラーレジスタ

64個のレジスタで構成され、RGB それぞれ6ビットの組み合わせで色を設定する。
3色(RGB)*6ビット= 262144 色中から64色を選択できる。

パレットレジスタの一括読み取り

次の表は PREG[17] を16進表示したものです。
00010203 04051407 38393A3B 3C3D3E3F 00
「0~5と7」はパレットレジスタとカラーレジスタの番号は同じですが「6と8~15」は違っていました。
u_char  PREG[17];
u_char  *PT= PREG;

//パレットレジスタの一括読み取り
void    get_preg()
{
    _asm
    {   push    DS
        push    ES
        les     dx,PT           //ES:DX= PREG
        mov     ax,1009H        //get palet register
        int     10H
        pop     ES
        pop     DS
    }
}

カラーレジスタに色を設定

カラーレジスタの番号と、RGB それぞれ6ビットの組み合わせで色を設定します。
//カラーレジスタに色を設定する
void    set_colour(u_char n, u_char r, u_char g, u_char b)
{
    _asm
    {   push    DS
        push    ES
        mov     bl,n            //BX= colour register
        mov     bh,0
        mov     dh,r
        mov     ch,g
        mov     cl,b
        mov     ax,1010H        //set colour register
        int     10H
        pop     ES
        pop     DS
    }
}

Sample Program

/*★ 矩形を表示して、カラーレジスタに色を設定する    前田 稔 ★*/
#include "my.h"

// パレット番号とカラーレジスタの対応を格納する領域
u_char  PREG[17];
u_char  *PT= PREG;

// プロトタイプ宣言
static  void    get_preg(void);
static  void    set_colour(u_char, u_char, u_char, u_char);

//★ MAIN PROGRAM ★
int     main(void)
{
    //スクリーンの表示モードの設定
    if (!_setvideomode(_VRES16EXCOLOR))  exit(1);
    get_preg();                 //パレットレジスタの一括読み取り
Xtype(PREG, 17);

    _setcolor(1);
    _rectangle(_GFILLINTERIOR,50,110,150,130);
    _setcolor(2);
    _rectangle(_GFILLINTERIOR,50,140,150,160);
    _setcolor(3);
    _rectangle(_GFILLINTERIOR,50,170,150,190);
    _getch();

    set_colour(PREG[1],0x3f,0,0);
    set_colour(PREG[2],0,0x3f,0);
    set_colour(PREG[3],0,0,0x3f);
    _getch();

    _setvideomode(_DEFAULTMODE);
}

//パレットレジスタの一括読み取り
void    get_preg()
{
    _asm
    {   push    DS
        push    ES
        les     dx,PT           //ES:DX= PREG
        mov     ax,1009H        //get palet register
        int     10H
        pop     ES
        pop     DS
    }
}

//カラーレジスタに色を設定する
void    set_colour(u_char n, u_char r, u_char g, u_char b)
{
    _asm
    {   push    DS
        push    ES
        mov     bl,n            //BX= colour register
        mov     bh,0
        mov     dh,r
        mov     ch,g
        mov     cl,b
        mov     ax,1010H        //set colour register
        int     10H
        pop     ES
        pop     DS
    }
}

色の設定

Sample Program では矩形を描いてから色を変更しましたが、本来は次の手順で描画します。
  1. 使用する色(最大16色)をパレットレジスタに割り当てます。
  2. パレットレジスタに対応するカラーレジスタに色を設定します。
  3. パレットレジスタを指定して、矩形や円や星を描画します。

超初心者のプログラム入門(C/C++)