Simply2
AKI-H8マザーボードVer2を使ったBASICマイコンは、自作としては初めてまともに動いたBASICマイコンだが、
表示部の解像度が128×64なので単独でプログラミングを楽しむのは難しい。
昔、子供の頃に体験した電源を入れたらすぐプログラムを楽しめる、あの感覚で使えるBASICマイコンを作ってみたい。
NTSC出力を2画面にして、それぞれの画面にプログラムの違う箇所を表示させたり、実行中に1画面にはデバッグ情報を表示させたりして、 単体でプログラムできるようにしたいと思う。
昔、子供の頃に体験した電源を入れたらすぐプログラムを楽しめる、あの感覚で使えるBASICマイコンを作ってみたい。
NTSC出力を2画面にして、それぞれの画面にプログラムの違う箇所を表示させたり、実行中に1画面にはデバッグ情報を表示させたりして、 単体でプログラムできるようにしたいと思う。
ハードウエア
仕様
- CPU・・・・H8/3064 25MHz
- 電源電圧・・・・単三3本
- 画面・・・・224×184dot 白黒NTSC 2画面
- サウンド・・・・beep 4チャンネル
回路図
設計時に考えたこと
画面更新にかかる時間について
NTSC信号は、1フレームを16.666msで操作して、1秒間に60フレームを出力する。
1フレームは、262.5ラインで構成され、1ラインは63.5usで走査される。
サブCPU(H8S/2128)のNTSC信号を出力するプログラムでは、現状226(=9+12+205)ラインまでは画面表示をしているので、 画面データの読み出しに使えるのは、36.5ライン分の処理時間になる。
63.5usのうち、読み出しに使えるのは40usと仮定して、1usで2ワード(16bit)分を更新すると考えると、1ライン分の時間で160バイトを読み出せる。
1画面は5152バイト(=224×184÷8)なので、33ライン分の処理時間で1画面分を読み出すことができる。
以上のことから、1〜2フレームで1画面を更新できることになる(1フレームの余裕時間が36.5ライン分で1画面の更新に必要な処理時間が33ライン分なので 余裕時間の最初から更新すれば1画面分、途中から更新が始まれば2画面分の処理時間がかかる)ので、17〜33msで画面更新ができると思われる。
この時間より短い間隔でメインCPUが画面の更新要求を発行すると、メインCPUが待たされることになる。
これより長い間隔で更新要求を発行していれば、メインCPUはFIFOにデータを書く時間(約2.6ms)で画面更新要求を処理できる。
30FPSで周期更新して、BASICプログラムには更新タイミングを管理させないことも考えられるが、 そうすると10%程度のCPUを画面更新に常時もっていかれることになり、 シューティングゲームなど速度を要求されるプログラムには負担になる。
BASICプログラムでも画面の更新タイミングをコントロールできるようにしよう。
1フレームは、262.5ラインで構成され、1ラインは63.5usで走査される。
サブCPU(H8S/2128)のNTSC信号を出力するプログラムでは、現状226(=9+12+205)ラインまでは画面表示をしているので、 画面データの読み出しに使えるのは、36.5ライン分の処理時間になる。
63.5usのうち、読み出しに使えるのは40usと仮定して、1usで2ワード(16bit)分を更新すると考えると、1ライン分の時間で160バイトを読み出せる。
1画面は5152バイト(=224×184÷8)なので、33ライン分の処理時間で1画面分を読み出すことができる。
以上のことから、1〜2フレームで1画面を更新できることになる(1フレームの余裕時間が36.5ライン分で1画面の更新に必要な処理時間が33ライン分なので 余裕時間の最初から更新すれば1画面分、途中から更新が始まれば2画面分の処理時間がかかる)ので、17〜33msで画面更新ができると思われる。
この時間より短い間隔でメインCPUが画面の更新要求を発行すると、メインCPUが待たされることになる。
これより長い間隔で更新要求を発行していれば、メインCPUはFIFOにデータを書く時間(約2.6ms)で画面更新要求を処理できる。
30FPSで周期更新して、BASICプログラムには更新タイミングを管理させないことも考えられるが、 そうすると10%程度のCPUを画面更新に常時もっていかれることになり、 シューティングゲームなど速度を要求されるプログラムには負担になる。
BASICプログラムでも画面の更新タイミングをコントロールできるようにしよう。
ハンドシェイク
CPUのポートの使い方
○メインCPU(H8/3064 モード5)
○サブCPU(H8S/2128 モード2)