Apple IIで本体の描画タイミングをソフトウエアから知る方法

Youtubeで以下の動画を見つけた。

www.youtube.com動画ではローレゾリューショングラフィックスとハイレゾリューショングラフィックスが同時に描画されている。

手法としては、ハイレゾリューションまたはローレゾリューションのグラフィックスが表示されている途中で画面モードを切り替えてるのは想像がつく。先頭からローレゾリューションモードで描画して走査線が真ん中に来た時にハイレゾリューションモードに切り替えれば、両モードがミックスされた画像になるはず。こんな感じ。

f:id:k_igrs:20200508074527p:plain

しかしApple IIにはHSYNCやVSYNCのような同期信号をソフトウエアから判別する手段が無いので今どの位置の画面を描画しているのかを知るのは不可能なはず

…とこの動画とそのHomePageの説明を見るまでは思っていた。

この説明によるとその方法は、Apple IIは1MHzのクロックの前半でメモリからビデオデータを読み出し、後半でCPUがメモリをアクセスする。

ここでビデオデータ読み出された後、データバスには、読み出されたデータがフローティング状態(Hi-Z)で残っていて、CPUがDRAMやROM以外の書き込み専用ポートを読むと直前にシステムが読み出したビデオデータを読むことができる。

f:id:k_igrs:20200508081527p:plain

このことを利用し、画面の先頭アドレスにマーカーとなるデータを書いておき、そのデータが読み出されたらApple IIのシステムが画面を先頭から表示するタイミングだということがわかる。

後はプログラムの実行クロック数と表示タイミングに合わせて画面モードを切り替えることができる。だから動画タイトルがCycle-countingなんだね。

なんとも目からうろこな方法があったものです。