2018.6.26
前へ
次へ
ホームページトップへ戻る


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

前へ
次へ
ホームページトップへ戻る