PC-G850Vでプログラム その1

f:id:PocketGriffon:20210816091323j:plain

今回のPC-G850Vプログラムでは、解析にあまり重きをおいていない。

過去に結構調べた経緯があった事と、せっかくなのでもう少しプログラミングを楽しんでみたいという思いからだ。

 

で、プログラムの基本から…と思いつつも、なぜか最初に調べたのが割り込み系(^^;

過去のプログラムを見て、とても不自然に感じたことがあったので再調査したかったのだ。

 

過去の私は、1/30秒での割り込みをテストしていたようだ。

でも……これ、ホントに動いてたの?(^^;;

そもそもPC-G850シリーズにそういう事出来るんだろうか??

もうね、めいっぱい自分を疑って掛かるww

まずは当時の自分と同じ知識レベルまで追いついてみる!

 

PC-G850シリーズの割り込み

f:id:PocketGriffon:20210816153935j:plain

PC-G850シリーズは…というよりは、Z80では…と言った方が良い気がする(^^;

Z80ではNMI(Non Maskable Interrupt)が入ると0066hが呼び出されると決まっている。

まずはここから見ていこう。

 

0066: ED 45  RETN

 

……うん、何もしてなかった!(^^;;

 

別の割り込みも調べてみる。

Z80には割り込みモードが3つあり、PC-G850がどのモードを利用しているのか分からない。

試しにブートシーケンスを途中までハンド逆アセンブルしてみたけど、割り込みモードを設定するところが見つからなかった(事情ありそう)。

 

じゃあということで、割り込みモードは1と勝手に仮定して(そうしないと探すのが面倒)、0038hからを解析してみる。

f:id:PocketGriffon:20210816121517j:plain

お、それっぽいプログラムが入っている!

そして追いかけてみると、最後はRETIで終わっていた。

どうやらこれであってるっぽい!

 

f:id:PocketGriffon:20210816123325j:plain

f:id:PocketGriffon:20210816123349j:plain

この本↑にI/Oポートの情報が書かれていて、そこに「1S」というタイマーがあるらしい。

1Sって??1秒の事?1秒に1度割り込み入るの???

実際にどのくらいの頻度で割り込みが入っているのかを調べてみたい。

 

そう思って、まずは割り込み処理を横取り出来ないかと思いHookを探してみた。割り込みプログラムを(おそらく)全部見てみたけれども、どうもHookらしいものは存在しないようだ。

コレは…ユーザーから割り込みは利用できない仕様??

 

うーん、だって0038h付近はROMのはずなので(BOOTする関係上)、0038hのフックなんて書き換え出来ないし…。

そんな事を思いながら、BASICで書き換えのテストをしてみた。

f:id:PocketGriffon:20210816124538j:plain

あれ?!書き換えが出来た!!

え?どゆこと???このマシンはどうやってBOOTしてるの?(^^;;

 

もしかしたら起動時にのみ見えるROMがあって、起動が終わったら切り離されるとか?そこで割り込みモードの設定とかしてるから、BOOT後のリセットベクタを追いかけてもモード切替が見つからなかったのかも…と思った(完全なる想像)。

 

解析の結果は疑問だけが残ったけれども、0038hにある割り込みフックがRAMという事が分かったので、任意に書き換えが出来る。

ここを書き換えて自分のプログラムに処理を飛ばし、飛んできた回数をカウントする。

大雑把ではあるけれども、だいたいの数がわかるはずだ。

 

動画がなくて恐縮だが、5秒くらいの処理をしてみたところ、プログラムに飛んできた回数は6と出た。つまり、1S割り込みの名前の通り、どうやら1秒に1回呼び出される割り込みのようだ。ホントに???

…これだけ(1秒という)タイマー割り込みの間隔が広いと、何かに使うのは厳しいかも?

 

通常、この手の割り込みの間隔はソフトウェアで設定が可能な場合が多い。しかしそれを何の資料もなく調査するのは不可能に近い(T-T) ここはネットの力を活用しよう!

 

そしたら…とても有用な情報を調査公開してくださっているページがあった!

■とある言語の開発記録II / PC-G850の回路図とLCDの低レベル制御

この資料を見ると、どうやら"とある"LCDのコマンドを設定してやれば、1S割り込みの間隔が短くなるらしい。これは……なんだろう?本来ならばカーソル点滅速度とかで使われるモノ?

 

試しにI/Oポート 40hに 31hを入れてみたところ、割り込み間隔が短くなった!正確な間隔はわからないが、実験してみた感じでは1/30秒くらいの間隔のようだ。

システム的にどのような影響があるのか分からないので、プログラム終了後にはもとに戻すようにした。

 

割り込みの応用

せっかくなので、この割り込みカウンターを利用して速度チェックをしてみた。

一度、PC-G850シリーズの速度チェックをしてみたかったのだ(^-^)

方法としては……

・割り込み初期化

・BASICで適当な処理

・割り込み終了

・結果を表示

という、超簡単なモノ。

ベンチマーク的な処理をBASICで書けるので、時間稼ぎ処理?が手軽だ(^^;;

3D的なグラフィックの絵(↓こんな感じ)を表示させてみたかったのだが……

f:id:PocketGriffon:20210816152225j:plain

算数するのが面倒だったので、安直にPC-G850Vのマニュアルにあるプログラムを利用した(をぃ)。

 

結果はTwitterにも載せたけど、こちらにも。

f:id:PocketGriffon:20210816152912j:plain

f:id:PocketGriffon:20210816152935j:plain

f:id:PocketGriffon:20210816153005j:plain

画面上部に表示されている数字が、ベンチマーク実行中に呼び出された割り込み回数。数字が大きい方が時間がかかっている。そしてなぜかPC-G850Sだけ表示位置が違う…。

 

結果を見ると、PC-G850VとVSは誤差の範囲かなーと思うけれども、Sだけが2割近く遅い。

これは……割り込み間隔の変更プログラムの問題なのか、BASICインタプリタの実装上の違いなのか、それとも…なんなのかは分からない(-_-;;

ベンチマークプログラムも自分で作ったものを利用しないと状況が絞れない(^^;;

これはこの先、別のものを作っていこうかなーと思う。

 

あれ??今、先頭から読み返してみたら「解析に重きをおかない」って書いていたけど…汗

 

この先は、少し開発環境を今風に整えてみたい(^^)

ではまた次回!(^-^)ノ