キャラクタの反転表示(左右、上下)


8×8ドットのキャラクタの反転表示

 このキャラクタ(8×8ドット)を縦反転表示します。

#include <sys/bios.h>

unsigned char bmp_m[] = {
    0x3C, 0x7E, 0x93, 0xDB, 0xFF, 0xFF, 0xFF, 0xDB 
};

void main()
{
    unsigned m[] = { 1 };
    font_set_monodata(2, 1, bmp_m);
    m[0] = m[0] | 0x8000 ;
    screen_set_char(SCREEN2, 1, 1, 1 , 1 , m);
    key_wait();
}


disp.hの中で

#define CFM_FLIP_V		0x8000
#define CFM_FLIP_H		0x4000

のように宣言されているので
    m[0] = m[0] | 0x8000  ;の部分は
    m[0] = m[0] | CFM_FLIP_V ;
と記述できます。
横反転の場合は
    m[0] = m[0] | CFM_FLIP_H ;
となります。



大きなキャラクタ(8×8以上)の反転表示

 このキャラクタ(32×32ドット)を反転表示します。
#include <sys/bios.h>

#include "witch.h"

unsigned witch[]={       /* 通常表示用 */
	 1, 2, 3, 4,
	 5, 6, 7, 8,
	 9,10,11,12,
	13,14,15,16
};

unsigned witch_R[]={     /* 左右反転表示用 */
	 4, 3, 2, 1,
         8, 7, 6, 5,
	12,11,10, 9,
	16,15,14,13
};

unsigned witch_U[]={     /* 上下反転表示用 */
	13,14,15,16,
	 9,10,11,12,
	 5, 6, 7, 8,
	 1, 2, 3, 4,
};

void main()
{
    int i;

    font_set_monodata(1, 4*4, bmp_witch);

    screen_set_char(SCREEN2,  0, 0, 4 , 4 , witch  ); /* 通常表示 */

    for(i=0;i<16;i++)
        witch_R[i] |= CFM_FLIP_H;  
    screen_set_char(SCREEN2,  5, 0, 4 , 4 , witch_R); /* 左右反転 */

    for(i=0;i<16;i++)
        witch_U[i] |= CFM_FLIP_V;  
    screen_set_char(SCREEN2, 10, 0, 4 , 4 , witch_U); /* 上下反転 */

    key_wait();
}

それぞれのキャラクタ(8×8ドット)の表示位置を計算式で 求めさせこともできますが、この例のようにしたほうがわかりやすい 場合もあります。

次の例のように、キャラクタの並びを2次元配列として設定しておき、 0〜2のパラメータによって反転表示させることもできます。




#include <sys/bios.h>

#include "witch.h"

unsigned witch[][16]={
    {1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16},  /* 通常表示用 */
    {4, 3, 2, 1, 8, 7, 6, 5,12,11,10, 9,16,15,14,13},  /* 左右反転用 */
    {13,14,15,16,9,10,11,12, 5, 6, 7, 8, 1, 2, 3, 4}   /* 上下反転用 */
};

void main()
{
    int i;

    font_set_monodata(1, 4*4, bmp_witch);

    for(i=0;i<16;i++)
        witch[1][i] |= CFM_FLIP_H;   /* 左右反転設定 */

    for(i=0;i<16;i++)
        witch[2][i] |= CFM_FLIP_V;   /* 上下反転設定 */

    screen_set_char(SCREEN2,  0, 0, 4 , 4 , witch[0] ); /* 通常 */
    screen_set_char(SCREEN2,  5, 0, 4 , 4 , witch[1] ); /* 左右反転 */
    screen_set_char(SCREEN2, 10, 0, 4 , 4 , witch[2] ); /* 上下反転 */

    key_wait();
}