DIYS API 仕様

名称変更の予告 070107
「Biz」という名称を使ってきましたが、BizとBrowserをあわせたものが存在するようなので(商標があるかどうかは見てませんが)いろいろ考えた末に
大豆
に変更することにしました。(?_?)

本当はDIYS [daiz] です。
自作パソコンに使うPC DIYを複数形にした造語です。
Do It YourselveS.
我々が自分の好きなように作っていく。そんな意味を考えました。
DIYS API
DIYS Browser

よって、これまで作成したプログラムだけでなく、本ページのすべてを作り変えていきます。
これまであったbiz.html やbiz_api.htmlのページは、ある日、消えてしまいます。
TOPページより、辿り直してください。
大豆は、TV番組「あるある何とか」で紹介されるような健康食品です。


概要
DIYS の描画APIは、FIFOメモリを使用したQVGAのハードウェア仕様にあわせていますが、低解像度のモノクロ液晶や中解像度のカラーグラフィックなど、さまざまな表示形態にも対応すべく、移植のやりやすさを考慮しています。
背景画像の上にマウスのカーソルやスプライトのような透過色を指定したイメージの重ね合わせも出来ます。
漢字表示については現在、Shift-JISコードをK12x10仕様(横12縦10ドット)の漢字もしくは半角ANK表示が可能ですが、近くFONTXを組み込んだ形にして、好きなFONTを用意すれば、使用できる構想も考えています。
GIF,JPEGデコードについては、ソース自身を提供する形はまだ時期(GIFのライセンスが無効となった今でも。。)を見ています。とりあえず、動作するものを用意することからはじめます。このあたりは、無償で協力していただける方の連絡をお待ちしています。

表示メモリの扱いについて
QVGAカードは、ブロックチャートに示すようにQVGAの表示FIFOメモリの特定のエリアだけを書き換えることが出来ません。表示を更新するには、1画面(1フレーム)すべてを書き換える(up_screen)ことになります。それでもDMA転送もしくはSH3のバスであれば、QVGA16ビット/ピクセルおよそ154KBのデータ量でも約10msほどの時間で転送が出来ます。
そもそもなぜそのような構成にしているかというと、マウスのような画像の張り合わせのための表示メモリの読み出しが関係してきます。
表示形態のバリエーションに対応すべく、ハードウェアにあわせて表示メモリの読み出し、特定領域への書き込みといったわずらわしいコントロールをやめてしまったのです。これらの処理はメインメモリより遅いデバイスへのアクセスなので、システムの処理の低下にもなります。
その代わり、メインメモリ側にいくつかの表示メモリのエリアを確保することになります。
たとえば、背景と浮き上がらせる2つのイメージを重ね合わせて1つのscreenというイメージを作る処理は以下のようになります。

DIYS_put_image2(image *screen ,image *frontimage ,image *backimage);
はscreenにfrontimageを貼り付けます。透過色frontimage->transparencycolorのピクセルは、backimageのピクセルが選ばれて書き込まれます。結果、screen上での透過色の指定ピクセルは背景色になります。frontimage ,backimage ,screenはメインメモリ上にあることが特徴です。
screenはup_screen関数によりFIFOメモリに転送しています。
以下の例ではfrontimageの透過色を白に指定して、白いピクセルは背景を透けて見えるようにしています。
put_image2.gif

この方法によれば、たとえば、モノクロの液晶を接続する場合でも、画面のサイズの指定(SCREEN_WIDTH,SCREEN_HEIGHTの変更)によってscreenやイメージのサイズを確保して
screenをハードウェア固有の表示メモリに転送するup_screen関数だけを用意すれば済んでしまいます。

描画関数
SCREEN_WIDTH 有効画面の幅 QVGAでは320
SCREEN_HIGHT 有効画面の高さ QVGAでは240
QVGA_SIZE SCREEN_WIDTH*SCREEN_HIGHT


typedef struct {
    int status;//(未使用)
    char name[16];// イメージをSDカードから読み込むときのファイル名など
    unsigned short *pointer;// イメージの先頭アドレス baseptrに変更される予定。
    unsigned short TransparencyColor;//イメージを重ね合わせるときに透過にする色
    int sx; // StartAxisX イメージの左隅のX座標
    int sy; // StartAxisY イメージの左隅のY座標
    int wx; // WidthX イメージの幅
    int hy; // HeightY イメージの高さ

} image;


image screen0; screen0を上記構造体メンバーとして扱います。

int DIYS_image_conflict(image *image0 ,image *image1);
image0とimage1の衝突を判定します。ブロック崩しに用意したもので、汎用性はありません。

void DIYS_screen_clear(image *image0 ,unsigned short fillcolor);
画面image0全体をfillcolorで埋めます。

void DIYS_put_image(image *screen ,image *image0);
screenにimage0->sx,image0->sy,image0->wx,image0->hyで示される矩形範囲を貼り付けます。

void DIYS_put_image2(image *screen ,image *frontimage ,image *backimage);
screenにfrontimageを貼り付けます。透過色frontimage->transparencycolorのピクセルは、backimageのピクセルが書き込まれます。

void DIYS_image_copy(image *screen0 ,image *screen1 ,int sx ,int sy ,int wx ,int hy);
screen0の(sx,sy)にscreen1の幅wx,高さhyの矩形範囲をコピーして、貼り付けます。

int DIYS_load_bmp(image *image0);
image0にSDカードからビットマップ画像を読み込みます。
幅image->width、高さimage->hightの情報はビットマップファイルのヘッダー情報から得られます。


int DIYS_up_screen(image *screen);
screenは幅(SCREEN_WIDTH +2)ピクセル 高さSCREEN_HIGHTピクセルで構成されます。
表示FIFOメモリーにscreenの内容を転送します。
ハードウェアの都合上、(SCREEN_WIDTH +2)*SCREEN_HIGHTのピクセルが転送されます。

int cap_image(image *screen0);
screen0をキャプチャして、screen->nameで示すファイル名で保存します。


***** 表示例 *****
screenにracketを貼り付ける。
DIYS_put_image(&screen ,&racket);

ballをimage0を透過色の背景として、screenに貼り付ける。
DIYS_put_image2(&screen ,&ball ,&image0);

screenを表示FIFOに転送する。
DIYS_up_screen(&screen);

/* clear image on screen */
screenのラケットを貼り付けた範囲をimage0で書き直す。(ラケットが消える)
DIYS_image_copy(&screen ,&image0 ,racket.sx ,racket.sy ,racket.wx ,racket.hy);

screenのボールを貼り付けた範囲をimage0で書き直す。(ボールが消える)
DIYS_image_copy(&screen ,&image0 ,ball_x ,ball_y ,ball.wx ,ball.hy);


文字フォントの制御(のちに1部の機能がFONTXに対応します)
FONT 構造体


typedef struct{
    char ank;// 半角-1 全角-0
    char type;// S-JIS JIS EUCを示す
    unsigned char table_x ,table_y;// K12x10.binイメージのX,Y座標
    unsigned short code;// 漢字コード 8ビットの場合は上位8ビットを0とする。
    unsigned char *base_address;// K12x10.binイメージの先頭アドレス
    unsigned char *char_address;// FONTの先頭アドレス
    unsigned char raw_image[15];// FONTの描画イメージ
}font;


int load_font(font *fnt ,char *fname);
フォントイメージk12x10.binをメモリにロードします。

void put_char(image *screen ,font *fnt ,int x ,int y ,unsigned short color);
screenの指定座標(x,y)に指定色colorでfnt->raw_image配列で示す1文字のフォントパターンを描画します。
screenの原点(0,0)のアドレスはscreen->pointerで示されます。


void pset(image *screen ,unsigned short color ,int x ,int y);
screenの指定座標(x,y)に指定色colorでドットを描画します。

void jis2addr(font *fnt);
fnt->codeからfnt->char_address FONTの先頭アドレスを得ます。

void addr2dim(font *fnt);
fnt->char_address FONTの先頭アドレスからfnt->raw_image[15] (FONTの描画イメージ)を得ます。
半角(fnt->ank=1)のときは、raw_image[0]〜raw_image[9]の10バイトのみが有効です。

int ar_jiscode(font *fnt);
漢字コードをJISコードに変換します。
fnt->typeにSJIS,EUC,JIS(無変換)のいずれかをセットします。
fnt->typeによって、sjis2jis、euc2jisいずれかの関数が呼ばれます。

int sjis2jis(font *fnt);
SJISコードをJISコードに変換します。

int euc2jis(font *fnt);
EUCコードをJISコードに変換します。



PS2マウス制御
#define PS2MOUSETYPE 0x03 //Expected Mouse type is wheel mouse.


typedef struct {
    int status;
    unsigned char mdev;
    unsigned char signs;
    int movx;
    int movy;
    int movz;// 061229
    unsigned char btn45;
} ps2mouse;



void DIYS_ps2mouse_initialize(void);

int DIYS_ps2mouse_restart(void);

int DIYS_ps2mouse_ready(void);

int DIYS_ps2mouse_getdata(ps2mouse *mouse);