「MSXのVBLANK待機ルーチン」の版間の差分
Administrator (トーク | 投稿記録) ページの作成:「 初代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」 |
Administrator (トーク | 投稿記録) 編集の要約なし |
||
| 3行目: | 3行目: | ||
初代[[MSX]]のZ80アセンブリによる実装アプローチ。 | 初代[[MSX]]のZ80アセンブリによる実装アプローチ。 | ||
[[MSXのワークエリア| | == JIFFYカウンタを使う方法(標準ワークエリア利用) == | ||
[[MSX]]の[[MSXのワークエリア|BIOSワークエリア]]には、[[VBLANK]]ごとに[[インクリメント]]される JIFFY(アドレス $FC9E)があります。これを監視して値が変わるまでループするのが最も簡単です。 | |||
<source lang="asm"> | <source lang="asm"> | ||
; VBLANK待機ルーチン | ; VBLANK待機ルーチン | ||
WAITVBLNK: | WAITVBLNK: | ||
LD A,( | LD A,(0FC9EH) ; 現在のJIFFY値を取得 | ||
WVBL1: | WVBL1: | ||
CP (0FC9Eh) ; 変化するまで待つ | |||
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]] | ||