「MSXのVBLANK待機ルーチン」の版間の差分

提供:MonoBook
ページの作成:「 初代MSXのZ80アセンブリによる実装アプローチ。 ワークエリアの「JIFFY(0FC9EH)」が、垂直帰線割り込み毎にインクリメントされるので、それを待つ。 <source lang="asm"> ; VBLANK待機ルーチン WAITVBLNK: LD A,(JIFFY) WVBL1: LD B,A LD A,(JIFFY) CP B JR Z,WVBL1 RET </source> category: MSX
 
編集の要約なし
 
3行目: 3行目:
初代[[MSX]]のZ80アセンブリによる実装アプローチ。
初代[[MSX]]のZ80アセンブリによる実装アプローチ。


[[MSXのワークエリア|ワークエリア]]の「JIFFY(0FC9EH)」が、垂直帰線割り込み毎に[[インクリメント]]されるので、それを待つ。
== JIFFYカウンタを使う方法(標準ワークエリア利用) ==
[[MSX]]の[[MSXのワークエリア|BIOSワークエリア]]には、[[VBLANK]]ごとに[[インクリメント]]される JIFFY(アドレス $FC9E)があります。これを監視して値が変わるまでループするのが最も簡単です。
<source lang="asm">
<source lang="asm">
; VBLANK待機ルーチン
; VBLANK待機ルーチン
WAITVBLNK:
WAITVBLNK:
         LD      A,(JIFFY)
         LD      A,(0FC9EH)   ; 現在のJIFFY値を取得
WVBL1:  LD      B,A
WVBL1:   
         LD     A,(JIFFY)
         CP     (0FC9Eh)     ; 変化するまで待つ
        CP      B
         JR      Z,WVBL1
         JR      Z,WVBL1
         RET
         RET
</source>
BIOS依存なので機種差が少ない。
== VDPステータスレジスタを直接読む方法 ==
VDPポート $99(ステータスレジスタ)を読み、VBLANKフラグ(ビット7)を監視します。
<source lang="asm">
WAITVBLNK_VDP:
    IN  A,(99h)      ; VDPステータス読み出し
    RLA              ; ビット7をキャリーに
    JR  NC,WAITVBLNK_VDP
    RET
</source>
BIOSを経由せず高速に動作。
== 割り込みフラグ方式 ==
VBLANK割り込みでフラグを立て、メインループはそのフラグが立つまで待機する方法。 ゲームやデモではこの方式が多いです。
<source lang="asm">
; 割り込みハンドラ
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
</source>
</source>


[[category: MSX]]
[[category: MSX]]

2025年9月12日 (金) 06:34時点における最新版


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