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
;
|