I/Oポートの40Hを読み込むと、5bit目に垂直帰線信号がセットされているので、それを監視する回数でFPSを制御します。
【参考】PC-8801覚え書き(外部サイト)
40Hをインポートし、その値が変化するまでwhile文で監視します。
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
void vblank()
{
while( inp( 0x40 ) & 0x20 ){} // 垂直帰線期間
while( !( inp( 0x40 ) & 0x20 ) ){} // 垂直表示期間
}
void main()
{
for( int i = 0; TRUE; i++ ){
for( int j = 0; j < 15; j++ ){ // 60/15=4FPS
vblank(); // 垂直帰線期間になるまで待つ
}
printf( "%d ", i );
}
}
vblank()関数を定義し、これを呼びたすと垂直帰線期間が開始されるまで待ちます。I/Oポート40Hの取得結果5bit目は、0:垂直表示期間、1:垂直帰線期間です。
最初の垂直帰線期間を待つ処理は要らないような感じもしますが、ごく短い間隔でこの関数を連続で呼ばれた際の対策です。
垂直帰線を15回待ったら、変数「i」がインクリメントされるため、フレームレートが正確に60であれば、60/15=4FPSとなります。が、実際のフレームレートの値は60ピッタリではないと思われます。
#020 【PC88,Z88DK】C言語で任意の座標に文字描画
#013 【PC88,Z88DK】C言語でHelloWorld
#010 【Z88DK】Z88DKの導入方法