MSXのVBLANK待機ルーチン

2025年9月12日 (金) 06:34時点におけるAdministrator (トーク | 投稿記録)による版
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)


初代MSXのZ80アセンブリによる実装アプローチ。

JIFFYカウンタを使う方法(標準ワークエリア利用) 編集

MSXBIOSワークエリアには、VBLANKごとにインクリメントされる JIFFY(アドレス $FC9E)があります。これを監視して値が変わるまでループするのが最も簡単です。

; VBLANK待機ルーチン
WAITVBLNK:
        LD      A,(0FC9EH)   ; 現在のJIFFY値を取得
WVBL1:  
        CP      (0FC9Eh)     ; 変化するまで待つ
        JR      Z,WVBL1
        RET

BIOS依存なので機種差が少ない。

VDPステータスレジスタを直接読む方法 編集

VDPポート $99(ステータスレジスタ)を読み、VBLANKフラグ(ビット7)を監視します。

WAITVBLNK_VDP:
    IN   A,(99h)      ; VDPステータス読み出し
    RLA               ; ビット7をキャリーに
    JR   NC,WAITVBLNK_VDP
    RET

BIOSを経由せず高速に動作。

割り込みフラグ方式 編集

VBLANK割り込みでフラグを立て、メインループはそのフラグが立つまで待機する方法。 ゲームやデモではこの方式が多いです。

; 割り込みハンドラ
VBLANK_INT:
    LD   A,1
    LD   (VBLFlag),A
    EI
    RETI

; メインループ
MainLoop:
    LD   A,(VBLFlag)
    OR   A
    JR   Z,MainLoop
    XOR  A
    LD   (VBLFlag),A
    ; --- ここで画面更新処理 ---
    JP   MainLoop