MSXのVBLANK待機ルーチン

提供:MonoBook


初代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