30日でできる! OS自作入門 6日目:チラチラ解消 @ Blog - Linux Life

30日でできる! OS自作入門 6日目:チラチラ解消

2008/04/16 ( n ) < HariboteOS >

カウントアップアプリケーションを作成して表示をしてみると 画面がチラチラすることが判明したので、描画まわりの改善をとりあえず始めてみる。
途中で、本の map の使い方が気に入らなかったので自分方式に変更。

void sheet_refreshsub( struct SHTCTL* ctl, int vx0, int vy0, int vx1, int vy1, int h0 )
{
    int h, bx, by, vx, vy, bx0, by0, bx1, by1;
    unsigned char *buf, c, *vram = ctl->vram;
    struct SHEET* sht;
    if( vx0 < 0 ) vx0 = 0;
    if( vy0 < 0 ) vy0 = 0;
    if( vx1 > ctl->xsize ) vx1 = ctl->xsize;
    if( vy1 > ctl->ysize ) vy1 = ctl->ysize;
    // init map
    for( vy = vy0; vy <= vy1; vy++ )
    {
        for( vx = vx0; vx <= vx1; vx++ )
        {
            ctl->map[vy * ctl->xsize + vx ] = 0;
        }
    }
    for( h = ctl->top; h >= h0; h-- )
    {
        sht = ctl->sheets[h];
        buf = sht->buf;
        bx0 = vx0 - sht->vx0;
        by0 = vy0 - sht->vy0;
        bx1 = vx1 - sht->vx0;
        by1 = vy1 - sht->vy0;
        if( bx0 < 0 ) bx0 = 0;
        if( by0 < 0 ) by0 = 0;
        if( bx1 > sht->bxsize ) bx1 = sht->bxsize;
        if( by1 > sht->bysize ) by1 = sht->bysize;
        for( by = by0; by < by1; by++ )
        {
            vy = sht->vy0 + by;
            for( bx = bx0; bx < bx1; bx++ )
            {
                vx = sht->vx0 + bx;
                c = buf[by * sht->bxsize + bx];
                if( ctl->map[vy * ctl->xsize + vx] == 0 && c != sht->col_inv )
                {
                    vram[vy * ctl->xsize + vx] = c;
                    ctl->map[vy * ctl->xsize + vx] = 1;
                }
            }
        }
    }
}

一番上のレイヤーから描画していって、描画済みの部分にフラグをたてて、下位のレイヤーでは描画しないようにした。

次はタイマの作成。
IRQ0 の割り込み。仕様は見ていないけど、実装は難しくない。
割り込みハンドラの最適化も頑張って改善。アルゴリズム系はそんなに難しくない。

さらに高解像度に挑戦。
相変わらず BIOS 関係のアセンブラが登場すると理解ができない。
どのレジスタが何のためにあるのか、どういう風に使う(使える)のかが分かってないのが問題かなぁ。

で、適当にキー入力に対応して、マウスでウィンドウを動かせるようにしたところで、 14日目の分が終了。やっと半分。

ちょっと冷静に考えてみると、実質7日でこんなにOSらしく動いているのはすごい。

カテゴリ

スポンサードリンク

Copyright © 2025 Linux-Life.net