MYCPU80でCP/Mを!
超巨大基板の8080互換HCMOS・CPUでCP/Mを走らせてしまおうという、なんとも狂気なプロジェクトです!
[第40回]
●SIN関数のプログラム
4日ぶりの更新です。
相変わらずやらなければならないことが目白押しでずっと多忙なのですが、ここ数日はちょいとまた解決できないことがらに出くわしてしまいまして、それでホームページの更新をするゆとりがなかったのです。
いえ。
今回はトラブルではありません。
ただちょっと気になることが出てきてしまいましたのです。
ずっと本題から脱線して書いておりました修理依頼品のMYCPU80についても前回でやっと無事修理完了というところまできましたので、ここらで本題に復帰しなければならないところなのですけれど。
脱線ということもありまして途中説明をはしょりながら書いてきましたところなどがありまして、私自身の備忘録を補完するためにも、この際もう少し詳しく書いておきましょう、と思ってしまったのでありました。
ああ。
もちろん浮動小数点演算のプログラムについても詳しく説明するとよろしいのですけれど。
しかしそれは説明を始めますといつ終るかわからないほど濃い内容でありますから、ちょいと簡単にはいきませんです。
まあ、でも、そのうち時間をみつけまして、ときどき脱線しながら説明できたらいいかなあと思います。
今回ひっかかっておりましたのは、そこではありません。
このところ説明をしてきましたテストプログラムでは三角関数SINの演算プログラムがコアになっておりました。
テストプログラムのリストは[第33回]でお見せしました。
異常動作の原因を追究するために、浮動小数点演算レジスタやCPUレジスタを表示するサブルーチン(FADSP)を途中の要所要所に挿入しておりますが、もとになるプログラムはZB3BASICプログラムに実際に組み込まれているSIN演算ルーチンをほとんどそのまま抜き出して、RAM上で独立して動作するように最低限のアレンジを加えたものです。
もとはZ80用に書かれたものですが、それを8080の命令だけで実行できるように書き改めてあります。
お見せしましたプログラムは実際にSIN()を計算するプログラムそのものです。
ただ基本的な浮動小数点演算のためのサブルーチンはZB3BASICのシステムプログラムとして組み込まれているものをそのままCALLしていますから、このプログラムだけでは実行できませんけれど。
それはともかく、SINを計算するコアなところはそのままですから、このプログラムでSINの計算ができることには間違いはありません。
しかしプログラムリストを見ただけでは、一体何をやっているのか、さっぱりわかりませんでしょう。
そこでそのあたりのところを、ざっと簡単に説明いたしましょう、というつもりで説明のための下準備に入ったのでありますが。
説明するどころか、私自身が納得できなくて、さっそくつかえてしまいました。
定数の根拠がわかりません。
[第33回]のプログラムリストでは定数はプログラムの終わりのところにまとめてあります。
その部分だけを取り出してお見せしましょう。
; 8391 60 PI6:DB 60;PI/6=30(degree) 8392 48 DB 48 8393 05 DB 05 8394 43 DB 43 8395 00 DB 00 8396 00 DB 00 ;;;FPI2 8397 ED FPI2:DB ED 8398 87 DB 87 8399 64 DB 64 839A 01 DB 01 839B 00 DB 00 ;;;FPAI 839C ED FPAI:DB ED 839D 87 DB 87 839E 64 DB 64 839F 02 DB 02 83A0 00 DB 00 ;;;F2PI 83A1 ED F2PI:DB ED 83A2 87 DB 87 83A3 64 DB 64 83A4 03 DB 03 83A5 00 DB 00 ;;;SIT1 83A6 DD SIT1:DB DD 83A7 6B DB 6B 83A8 4F DB 4F 83A9 F4 DB F4 83AA 00 DB 00 ;;;SIT2 83AB 32 SIT2:DB 32 83AC 93 DB 93 83AD 4C DB 4C 83AE F9 DB F9 83AF 80 DB 80 ;;;SIT3 83B0 2C SIT3:DB 2C 83B1 9A DB 9A 83B2 51 DB 51 83B3 FD DB FD 83B4 00 DB 00 ;;;SIT4 83B5 F0 SIT4:DB F0 83B6 AE DB AE 83B7 52 DB 52 83B8 00 DB 00 83B9 80 DB 80 ;;;0.2E-5 83BA DE FLMT:DB DE 83BB 1B DB 1B 83BC 43 DB 43 83BD EE DB EE 83BE 00 DB 00 ; |