|
アスキーのベンチマーク評価を上げる為、さらに高速化をしよう。
俺のBASICインタープリタは、根本的にMSとは違う。 仮に、前回のスキャンテストしても、一致する所はない。
それは、コモドアPETパソコンで、初めてBASICを知り、恥ずかしい話だが、ストリングって何?から始めた。。
逆アセンブルもせず・・、どん構造なら動くか?。 “想像して創造”した。 おじんギャグ? あっはっハッハ・・。
BASIC開発は、俺なりに、かなり苦しかった。 しかし、何とか、できたから、MZ80が誕生・存続 出来た。
BASIC開発のことは、今後 改めて、取り上げる。 ご期待を乞う・・。
さて、ベンチマークのポイントは、プログラムの実行時間を計るため、1000回等の繰り返しのループ。
ポイントは 回数をカウントする FOR・・NEXT文の高速化・・、
制御を移す、テキスト文の 行番号を効率的に見つける。
まず、FOR・NEXT文の高速化は、変数の加算・減算と大小判別。 浮動小数演算の高速化が 最重要だ。
当初の浮動小数演算は、指数・仮数部をメモリエリアに置き、教科書?通りチンタラチンタラ8ビット演算をしていた。
Z80は、インテル8080を基準に、レジスタを拡張したモノで、当初 どう使えば良いのか、迷っていた。
IC部門がZ80のライセンス契約した時、俺は『Z80はインテルの傘の下に咲いた アダ花』と発言し叱責された。
表裏のレジスタを増やし、インテルの電卓発想である8080を、更に 使い辛くするモノと思ったから・・。
でも、Z80は四則計算で電卓機能を最高に発揮した。 仮数部を、表裏のレジスタに全部 持ち込みレジスタ間で
16ビット加算・シフト命令を、実行させるとメチャクチャ早くなった。従来の計算の約3〜4倍のスピードアップ。
三角関数、対数、逆関数・・の高速化。 収斂関数で、近似値を求めるのだが、有効数字8桁以上となると、
何次まで掛け算やるのか?・・。以前は、ザツな計算法で、数学知識のレベルが乏しかった?。これ 反省。
再度、最適な収斂関数探し。数値の分割は多くても掛け算の回数が少ない方が有利。これは、大変な作業だ。
俺より数学に強いかな?〜と思われる W君(仮名)に、図書館通いをして、最適な収斂関数探しを命じた。
2週間後、W君(仮名)は、レポート用紙に、SIN、TAN,LOG・・各関数の、扱う数値範囲とその時の計算式が、ビッシリ書き込んでいた。 大体 4次以内の掛け算で、有効数字 9桁は取れる見込み。
テキスト文の行番号を早く見つける方法。 普通、GOTO、GOSUB文は、その行の以降に書く事が多いよね。
だから、行番号のサーチは、以降の行を、先ず調べる。無い時、最初の行から探す。これって、ズル・アイデア。
俺が小学生校の頃、知能IQテスト評価が有った。 俺って結構・・。 IQテストは 逆発想で、解くと早いよ。
問題のワナに引っかからないよう・・。 迷路問題など、出口から 逆に辿ると一発よ。 アイデア次第だね。
変数の使用時、変数エリア再配置と登録を行う。 よく使う単純名の変数、めったに使わない2次ストリングなど、
使用確率を考えて、再配置のメモリ転送作業が、より少なくなるよう、変数配置の順番・場所を考慮したことかな・・。
メインルーティン・サブルーティンで、かなりスタック処理をさわったかな・・。 ちょっと やりすぎたかな・・?。
スタックは、リカーシブな演算など、安全なデータエリアであり、また サブルーティンの帰り番地エリアでもある。
スタックの帰り番地を入れ替えると、RTNで、別の場所へ制御が移せる。(処理内容により、分岐命令として使う。)
また、 同じサブルーティンを、共用とスピードアップの為、前回、ハード?ソフト?で書いた様な方法、 即ち
プログラムは、RAM上で走っているのだから、前方の分岐条件JR命令、演算の為の定数を書き換えながら走るとか・・。
まあ、 逆アッセンブルして解析するには、かなり 苦労した人も、多かったと思う。
この 改良版BASICは、俺の出身地、和歌山県の主要な産物 有田ミカンに 因み・・。
紀伊国屋文左衛門がミカン船で、関東に乗り込んだ・・事に因んで、『オレンジBASIC』と名付け、デビューさせた。
他社の2倍以上のスピードアップが図れ、S−BASICは高速と評価されたのは、嬉しかった。
< つづく >
MZ−80開発記録は連載物です。 最初のページは、↓をクリック。
http://blogs.yahoo.co.jp/nagusa_kei/10285931.html?p=1&pm=c
|
あぁ、昔がよみがえってきました。$3E, $AF と書いておいて、$3Eに飛び込めばLD A,$AFだし、$AFに飛び込めばXOR Aなので、Accの内容が変わるというやり方を教えてもらったことがあります。あのころはプログラムが走りながら命令を生成して飛び込むなんてことはごく普通でした。ただ、いま考えてみるとそれで本当に効率が上がっているのかという検証はおろそかでした。
2006/8/27(日) 午後 10:34 [ かの ]
かのさんへ。RAM上のプログラムは、走りながら何時でも書き換え可能で、トリッキーな事、意味が有るのか無いのか・・戯れ事で・・楽しんでモノですね。 Z80の各レジスタは、個性があり、データをどのレジスタに置いたら、プログムの実行スピードが上がるか・・。HLペアレジスタは、16ビットの ァキュウムレイタみたいな動作もしましたね。まあ プログラマーの腕の見せ所・・でした。
2006/8/29(火) 午前 9:33 [ nag*sa_*ei ]
そうですね、個性あるレジスタ群をどう使うかはまさに腕の見せ所。高速化のためには裏レジスタもバンバン使いました。▼インデクスレジスタ(IX,IY)用の命令コードがHLレジスタ用のそれの頭に$DDか$FDを付けただけなのに気がつき、それならと試しにやってみたらHLレジスタがHとLに分けて使えるようにIX,IYを半分(上位/下位)ずつ操作することもできました。▼おもしろがって使ったこともありましたが、インデクスレジスタは遅いので、高速化には寄与してくれませんでした。▼いまではまったく使えない経験ですが、でもこのときにマニュアルをしっかり読むこと、諦めないでいろいろな方法を試してみること、押してもダメなら引いてみる、たまには後ろ側からも見てみる、そういう姿勢は身についたと思います。
2006/8/29(火) 午前 10:22 [ かの ]
かのさんへ。 今はCコンパイラ任せで、動作すれば良い。『 実行の遅いのは、マイコンのスピードが遅いんだ!』と、それで終わる人は、多いですね。▼でも、モータ制御、NTSC同期信号発生・・等、時間軸を重視する応用は、アセンブラで,、命令の実行時間を勘定に入れ、プログラムをすると、かなり 良いモノが出来ますよ。▼この様なプログラミングは、シニア世代の『名工?』の作業でしょうかね?。
2006/8/30(水) 午前 9:32 [ nag*sa_*ei ]
いまはマイコンの能力が上がり、開発環境が充実して、Cコンパイラでなんでも書けるような時代になりましたね。▼しかしアセンブラを知らず最初からCで入ってきた人たちは無謀なことをずいぶんやってくれますね。割り込み処理の中に時間のかかる計算を平気で入れる。LD SP, nnnnを書かないのでスタックというものに現実感がなく、32バイトしかないスタックに平気で巨大な構造体を乗せる。▼シニア世代の名工にやらせると、ひとつ性能の低いマイコンで間に合う。コストは下がるし、電力も食わない。それでいて性能は要求をちゃんと満たしている。すばらしい。
2006/8/30(水) 午前 10:47 [ かの ]