ワンボードマイコンをつくろう!(パソコンの原点はここから始まった)
TK80ソフトコンパチブル!8080、Z80マシン語からBASICまでこれ1台でこなせます
当記事は2009年11月から「TTLでCPUをつくろう!」というタイトルの もとにほとんど毎日連載をしてきたものを再編集したものです。 |
2011.7.7 前へ 次へ 目次へ戻る ホームページトップへ戻る |
☆ルート計算プログラム ND80ZVをご購入いただいたお客様からTK−80応用プログラムを送っていただきました。 プログラムを解析する過程でND80ZV組立キットに附属しているZ80アセンブラ、Z80逆アセンブラを使います。それらのプログラムの使用例としても参考になると思います。 |
[第118回]
●ルート計算の仕組み
このところ、TK−80用に書かれたルート計算プログラムについて説明をしております。
ND80ZV組立キットをご購入いただいた北海道のM様から、TK−80応用プログラムとして送っていただいたプログラムです。
01〜99の範囲の整数のみですが、ルート(平方根)を求めるプログラムです。
1977年当時の雑誌「マイコン」に載っていた記事をもとに、M様がLED表示部分に改良を加えられたものだということです。
私は倍精度の浮動小数点演算機能をもつZB3BASICを作りましたのでZ80でルートの計算をさせるプログラムも書くことができます(といいましても、もうずいぶん昔に作ったものですから、ほとんど記憶にありませんが)。
浮動小数点の演算は2進数で行ないますし、かなり複雑なサブルーチン群から構成されています。
当然のことながら、ハンドアセンブルでできるような代物ではありません。アセンブラが必須になります。
ですから、M様からプログラムをメール添付で送っていただいたとき、その余りの短さに、驚きましたし、大いに疑問でもありました。
たとえ最大2桁の整数に対する平方根に限る、という制約付きであったとしても、これは余りに短すぎます。
ちょっと信じられない気持ちでした。
いったいどうやって計算をしているのだろう、と興味津々で、お送りいただいたプログラムを解析してみることにいたしました。
お送りいただいたのはマシン語のバイナリファイルでしたから、そのままではなかなか解読することが困難です。
そこでND80ZV組立キットに含まれている、Z80逆アセンブラ、Z80アセンブラなどのツールを使って、ルート計算プログラムを理解しやすい形に編集しなおしました。
というところまでが、前回までのお話です。
今回はいよいよ、そのルート計算の秘密にせまります。
(なんだか某番組のキメセリフのようです)
ルートの計算を行なっているのはプログラムの、以下の部分です。
信じられないほど簡単です。
; ;KEISAN START ; 8023 3E01 LD A,01 8025 32B382 LD (HIKUSU78),A 8028 CD7080 KEISAN_LOOP:CALL HIKIZAN 802B DA3780 JP C,KEISAN_END 802E CD8480 CALL KOTAE_ADD1 8031 CD9380 CALL HIKUSUADD2 8034 C32880 JP KEISAN_LOOP |
; ;TISU=TISU-HIKUSU ; 8070 21B382 HIKIZAN:LD HL,HIKUSU78 8073 11AF82 LD DE,TISU78 8076 0604 LD B,04 8078 AF XOR A 8079 1A HIKIZAN_2:LD A,(DE) 807A 9E SBC A,(HL) 807B 27 DAA 807C 12 LD (DE),A 807D 2B DEC HL 807E 1B DEC DE 807F 05 DEC B 8080 C27980 JP NZ,HIKIZAN_2 8083 C9 RET |
; ;KOTAE_ADD1 ; 8084 21B582 KOTAE_ADD1:LD HL,KOTAE34 8087 7E LD A,(HL) 8088 C601 ADD A,01 808A 27 DAA 808B 77 LD (HL),A 808C 2B DEC HL 808D 7E LD A,(HL) 808E CE00 ADC A,00 8090 27 DAA 8091 77 LD (HL),A 8092 C9 RET |
; ; HIKUSU=HIKUSU+2 ; 8093 0603 HIKUSUADD2:LD B,03 8095 21B382 LD HL,HIKUSU78 8098 7E LD A,(HL) 8099 C602 ADD A,02 809B 27 DAA 809C 77 LD (HL),A 809D 2B HIKUSUADD2_2:DEC HL 809E 7E LD A,(HL) 809F CE00 ADC A,00 80A1 27 DAA 80A2 77 LD (HL),A 80A3 05 DEC B 80A4 C29D80 JP NZ,HIKUSUADD2_2 80A7 C9 RET |