ZX81の回想禄

PR

×

プロフィール

ZX81

ZX81

カレンダー

コメント新着

コメントに書き込みはありません。

キーワードサーチ

▼キーワード検索

2026.04.07
XML

アセンブラ化を進めていきます。

まずは、全体を再描画するmap_drawを試してみます。

ーーーーーmap.cpp(変更点)
// ----------------------------------------------------------
// VRAM へ描画
//   start_y を先頭として、論理 0..RENDER_DY-1 を順に出力
// ----------------------------------------------------------
void map_draw(void)
{
/*
    int logical_row;
    int src_y;
    unsigned char *curr_bufp, *top_bufp;
    unsigned char *pos = getscrnaddr(0, 4);
    if (render_pos & 1)
    {
        src_y     = start_y;
        curr_bufp = &render_buf_odd[src_y][0];
        top_bufp  = &render_buf_odd[0][0];
    }
    else
    {
        src_y     = start_y;
        curr_bufp = &render_buf_even[src_y][0];
        top_bufp  = &render_buf_even[0][0];
    }
    for (logical_row = 0; logical_row < RENDER_DY; logical_row++)
    {
        memcpy(pos, curr_bufp, RENDER_DX);
        pos += D_DX;
        curr_bufp += RENDER_DX;
        src_y++;
        if (src_y >= RENDER_DY)
        {
            src_y     = 0;
            curr_bufp = top_bufp;
        }
    }
*/
    // 描画開始位置をHLレジスタに取得
    getscrnaddr(0, 4);
#asm
    ld      (_map_draw_scrnaddr),hl
    // 奇数判定のため最下位BITチェック
    ld      a,(_render_pos)
    bit     0,a
    jr      z,map_draw_setevenaddr
map_draw_setoddaddr:
    ld      hl,_render_buf_odd
    jr      map_draw_settopbuf
map_draw_setevenaddr:
    ld      hl,_render_buf_even
map_draw_settopbuf:
    ld      (_map_draw_topbuf),hl
map_draw_setsrcy:
    ld      a,(_start_y)
    ld      (_map_draw_srcy),a
map_draw_setcurrbuf:
    ; HL = start_y * RENDER_DX
    ld      d,0
    ld      e,a
    ld      hl,0
    add     hl, de          ; *1  0 0001
    add     hl, hl          ; *2  0 0010
    add     hl, hl          ; *4  0 0100
    add     hl, de          ; *5  0 0101
    add     hl, hl          ; *10 0 1010
    add     hl, de          ; *11 0 1011
    add     hl, hl          ; *22 1 0110
    ld      de,(_map_draw_topbuf)
    add     hl,de
;    ld      (_map_draw_currbuf),hl
map_draw_buf2scrn:
    ld      b,RENDER_DY
    ld      de,(_map_draw_scrnaddr)
;    ld      hl,(_map_draw_currbuf)
    ld      a,(_map_draw_srcy)
map_draw_linecopy:
    push    bc
    ld      bc,RENDER_DX
    ldir
    pop     bc
    inc     a
    cp      a,RENDER_DY
    jr      nz,map_draw_nextline
    ld      a,0
    ld      hl,(_map_draw_topbuf)
map_draw_nextline:
    push    hl
    ld      hl,D_DX-RENDER_DX
    add     hl,de
    ex      de,hl
    pop     hl
    djnz    map_draw_linecopy
    ret
._map_draw_scrnaddr     defw    0
._map_draw_topbuf       defw    0
;._map_draw_currbuf      defw    0
._map_draw_srcy         defb    0
#endasm
}

いつものように、下記でビルドします。
 zcc +zx81 map.c key.c main.c -createa-app​




28行スクロールにかかる時間が3秒→2秒になりました。
あまり期待していなかっただけに、正直嬉しい!

アセンブラ化は少々面倒ではありますが、
目に見えて速度が向上すると、 モチベーション が上がります!

特にZX81では顕著に差が出るので、この作業は病みつきになります。


さあ、皆さん!
今こそ、この言葉を思い出すときです!

Your Computer 誌「ZX81は喜びと失望の両方だ」
シンクレア ZX81 - Wikipedia






お気に入りの記事を「いいね!」で応援しよう

最終更新日  2026.04.07 18:28:12
コメントを書く
[ZX81C言語でのプログラム開発] カテゴリの最新記事


【毎日開催】
15記事にいいね!で1ポイント
10秒滞在
いいね! -- / --
おめでとうございます!
ミッションを達成しました。
※「ポイントを獲得する」ボタンを押すと広告が表示されます。
x
X

© Rakuten Group, Inc.
X
Design a Mobile Website
スマートフォン版を閲覧 | PC版を閲覧
Share by: