16ビットマイコンボードの製作
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
いつか使ってみるつもりで入手してそのまま置いてあった16ビットCPUのことを思い出しました。
AMD社のAM188です。
その名の通り、CPUコアは80188互換の16ビットCPUです。
そのAM188を使った16ビットマイコンボードの製作記事です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第43回]
●√2、√3問題の解決(1)
[第41回]で√2と√3の末尾3桁ほどがおかしいことに気が付きました。
実はもとのZ80版倍精度浮動小数点プログラムは、本来は仮数部7バイト(56ビット)のところ、計算精度を高めるためその下の桁まで計算をしていたのですが、やや冗長なので、今回の8086版倍精度浮動小数点プログラムではきっちり56ビットで演算を行なうように改めました。
そのためZ80版の計算結果と比べると末尾1桁程度の差が出る可能性はあります。
しかし3桁は大きすぎます。
どこかにプログラムミスがありそうです。
しかしそれをみつけるにはどうしたらよいでしょうか。
√の計算はけっこうしつこいプログラムなのです。
前から順にブレークポイントを設定しながら進んでいくことはできますが、しかし途中の計算結果はすべて2進数(の小数)ですから、そんなものをひとつひとつ換算していたら日が暮れてしまいます(日が暮れても終らないかも)。
いえ。
そもそもそういうデバッグ方法は精神衛生上極めてよろしくありませぬ。
もう考えただけで気が触れてしまいそうです。
必要は発明の母であります。
よいことを思いつきました。
現在作業中の8086版BASICプログラムは、ND80Z3.5のZ80版BASICプログラムを8086用に書き直したものです。
プログラムの命令はZ80に対して8086ですから全く異なりますが、プログラムの流れそのものは同じです。
そこでZ80と8086で同じ√2の計算をさせて、そのプログラムの途中に浮動小数点計算レジスタの内容を表示させるプログラムを組み込んでおけば、表示された値を比較することで、どこから値が食い違ってくるのかをみつけることができるはずです。
その程度のプログラムの組込み作業の手間を惜しんではいけません。
でも作業にかかる前に念のため。
8086のプログラムとZ80のプログラムとで、√2の計算結果が本当に違っていることを確認しておくべきです。
こちらが8086版です。
DFF0〜DFF7にB#の値が入っています。
こちらはZ80版です。
やっぱり末尾が異なっています。
末尾の17ビット分が違っています。
これは余りにおかしいです。
ということで、さっそく浮動小数点計算レジスタを表示するプログラム部分を作成して、√の計算プログラムに組み込んでみました。
下は8086版です。
[01911] 7CB3 53 FADSP:PUSH BX [01912] 7CB4 50 PUSH AX [01913] 7CB5 BBF7F1 MOV BX,*FAH0 [01914] 7CB8 B409 MOV AH,09 [01915] 7CBA 8A37 FADSP1:MOV DH,[BX] [01916] 7CBC E88C93 CALL HXDP2 <104B> [01917] 7CBF E87793 CALL SPDP <1039> [01918] 7CC2 43 INC BX [01919] 7CC3 FECC DEC AH [01920] 7CC5 75F3 JNZ FADSP1 <7CBA> [01921] 7CC7 E8B193 CALL CRLF <107B> [01922] 7CCA 58 POP AX [01923] 7CCB 5B POP BX [01924] 7CCC C3 RET [01568] ;;;EXP[X] [01569] 7995 E86EA6 EXP:CALL KAKKO <2006> [01570] 7998 893EC8F0 MOV [*DCNT],DI [01571] 799C A0FFF1 FEX0:MOV AL,[*FAH8] [01572] 799F 0AC0 OR AL,AL [01573] 79A1 9C PUSHF [01574] 79A2 32C0 XOR AL,AL [01575] 79A4 A2FFF1 MOV [*FAH8],AL [01576] 79A7 BE200B MOV SI,*EX87 [01577] 79AA E872FA CALL FCMPCS <741F> [01578] 79AD 780D JS FEX1 <79BC> [01579] 79AF 9D POPF [01580] 79B0 8B3EC8F0 MOV DI,[*DCNT] [01581] 79B4 7803 JS ACLRJP <79B9> [01582] 79B6 E9FF00 JMP ER34 <7AB8> [01583] 79B9 E915F5 ACLRJP:JMP ACLR;JS ACLR <6ED1> [01584] 79BC BE290B FEX1:MOV SI,*EX225 [01585] 79BF E85DFA CALL FCMPCS <741F> [01586] 79C2 790A JNS FEX2 <79CE> [01587] 79C4 9D POPF [01588] 79C5 BE000A FEX11:MOV SI,*FONE [01589] 79C8 E808FB CALL AGETCS <74D3> [01590] 79CB E9DD00 JMP FEXE <7AAB> [01591] 79CE BE750A FEX2:MOV SI,LN2 [01592] 79D1 E87BF7 CALL FDIVCS <714F> [01593] 79D4 E8DC02 CALL FADSP <7CB3> [01594] 79D7 BED0F0 MOV SI,*FB0 [01595] 79DA E8E6FA CALL APUT <74C3> [01596] 79DD E8DD00 CALL INTA <7ABD> [01597] 79E0 50 PUSH AX [01598] 79E1 BED0F0 MOV SI,*FB0 [01599] 79E4 E8F1F6 CALL FSUB <70D8> [01600] 79E7 E8C902 CALL FADSP <7CB3> [01601] 79EA 8036FFF180 XOR [*FAH8]B,80 [01602] 79EF BE750A MOV SI,LN2 [01603] 79F2 E8ECF6 CALL FMULCS <70E1> [01604] 79F5 E8BB02 CALL FADSP <7CB3> [01605] 79F8 BED0F0 MOV SI,*FB0 [01606] 79FB E8C5FA CALL APUT <74C3> [01607] 79FE BE320B MOV SI,*EXT16 [01608] 7A01 E8DDF6 CALL FMULCS <70E1> [01609] 7A04 E8AC02 CALL FADSP <7CB3> [01610] 7A07 BE3B0B MOV SI,*EXT15 [01611] 7A0A E823FD CALL ADMLCS <7730> [01612] 7A0D E8A302 CALL FADSP <7CB3> |
7CB3〜7CCCが表示プログラム(サブルーチン)です。
リストの下の方はその表示サブルーチンを組み込んだ、EXP関数プログラムです。
なぜ、√の計算なのにEXP関数なの?
その説明はちょっとお待ちください。
こちらはZ80版です。
全く同じことをしています。
7FBF DDE5 FADSP:PUSH IX 7FC1 C5 PUSH BC 7FC2 E5 PUSH HL 7FC3 F5 PUSH AF 7FC4 DD21F7F1 LD IX,FAH0 7FC8 0609 LD B,09 7FCA DD6600 FADSP1:LD H,(IX+00) 7FCD CD4B10 CALL HXDP2 7FD0 CD3910 CALL SPDP 7FD3 DD23 INC IX 7FD5 10F3 DJNZ FADSP1 7FD7 CD7B10 CALL CRLF 7FDA F1 POP AF 7FDB E1 POP HL 7FDC C1 POP BC 7FDD DDE1 POP IX 7FDF C9 RET ;;;EXP(X) 7BF1 CD0620 EXP:CALL KAKKO 7BF4 ED53C8F0 LD (DCNT),DE 7BF8 3AFFF1 FEX0:LD A,(FAH8) 7BFB B7 OR A 7BFC F5 PUSH AF 7BFD AF XOR A 7BFE 32FFF1 LD (FAH8),A 7C01 213E7D LD HL,EX87 7C04 CD7675 CALL FCMP 7C07 FA157C JP M,FEX1 7C0A F1 POP AF 7C0B ED5BC8F0 LD DE,(DCNT) 7C0F FA416F JP M,ACLR 7C12 C3B57F JP ER34 7C15 21477D FEX1:LD HL,EX225 7C18 CD7675 CALL FCMP 7C1B F2287C JP P,FEX2 7C1E F1 POP AF 7C1F 21F47D FEX11:LD HL,FONE 7C22 CD5176 CALL AGET 7C25 C30B7D JP FEXE 7C28 215E7A FEX2:LD HL,LN2 7C2B CDE672 CALL FDIV 7C2E CDBF7F CALL FADSP 7C31 21D0F0 LD HL,FB0 7C34 CD4376 CALL APUT 7C37 CD1B7D CALL INTA 7C3A F5 PUSH AF 7C3B 21D0F0 LD HL,FB0 7C3E CD5272 CALL FSUB 7C41 CDBF7F CALL FADSP 7C44 3AFFF1 LD A,(FAH8) 7C47 EE80 XOR 80 7C49 32FFF1 LD (FAH8),A 7C4C 215E7A LD HL,LN2 7C4F CD6072 CALL FMUL 7C52 CDBF7F CALL FADSP 7C55 21D0F0 LD HL,FB0 7C58 CD4376 CALL APUT 7C5B 21507D LD HL,EXT16 7C5E CD6072 CALL FMUL 7C61 CDBF7F CALL FADSP 7C64 21597D LD HL,EXT15 7C67 CDB678 CALL ADML 7C6A CDBF7F CALL FADSP |
それで。
両方のプログラムを実行した結果はどうなったのか?
ということと、√の計算なのになぜEXP関数なのか?
ということについてですが、本日も時間がありません。
この続きは次回に書くことにいたします。
16ビットマイコンボードの製作[第43回]
2018.6.26upload
前へ
次へ
ホームページトップへ戻る