2014.9.16

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

MYCPU80でCP/Mを!
超巨大基板の8080互換HCMOS・CPUでCP/Mを走らせてしまおうという、なんとも狂気なプロジェクトです!


[第39回]


●ブレークポイントを設定して追跡してみました

前回の続きです。
テストプログラムのアドレス820Bと8221の間でおかしなことがおきている、というところまではわかりました。
正常ならばアドレス8221ではBレジスタとDレジスタが00になって、浮動小数点レジスタのRBレジスタの仮数部が6ビット右にシフトされるはずでした。
ところが結果はBレジスタは00になりましたが、DレジスタはFFで、RBレジスタの仮数部はゼロクリアされてしまいました。
しかしプログラムを見る限りではDレジスタがFFになるわけはありません。
どう考えても変です。
下は前回もお見せしたテストプログラムのその部分です。

              ;shift right RB & RBE++;till A=0
8206 47       RBFA4:MOV B,A
8207 3A10F1     LDA RB7
820A 57         MOV D,A
820B CD1D83     CALL FADSP
820E 210FF1   RBFA42:LXI H,RB6
8211 0E04       MVI C,04
8213 AF         XRA A;reset cf
8214 7E       RBFA43:MOV A,M
8215 1F         RAR
8216 77         MOV M,A
8217 2B         DCX H
8218 0D         DCR C
8219 C21482     JNZ RBFA43
821C 14         INR D
821D 05         DCR B
821E C20E82   JNZ RBFA42
8221 CD1D83     CALL FADSP
8224 7A         MOV A,D
8225 3210F1     STA RB7
8228 3AFFF1   RBFA5:LDA FA8

Bレジスタがループカウンタになって820Eから821Eの間を6回繰り返し実行されます。
その間にBレジスタは06,05,04,03,02,01,00と−1されていき、DレジスタはFA,FB,FC,FD,FE,FF,00と+1されていきます。
そこでブレークポイントを設定してBレジスタとDレジスタの変化を追跡してみました。
下がそのときのログです。

>bp 821c
>rt
820B 800052AEF000017801CC 00FA481075D1 FA95 0684 FA12 F200

A F  B C  D E  H L  PC   SP   SZ H P C
E845 0600 FA12 F10B 821C F7F0 01000101
>bp 821e
>rt

A F  B C  D E  H L  PC   SP   SZ H P C
E805 0500 FB12 F10B 821E F7F0 00000101
>bp 821c
>rt

A F  B C  D E  H L  PC   SP   SZ H P C
7444 0500 FB12 F10B 821C F7F0 01000100
>bp 821e
>rt

A F  B C  D E  H L  PC   SP   SZ H P C
7400 0400 FC12 F10B 821E F7F0 00000000
>bp 821c
>rt

A F  B C  D E  H L  PC   SP   SZ H P C
BA44 0400 FC12 F10B 821C F7F0 01000100
>bp 821e
>rt

A F  B C  D E  H L  PC   SP   SZ H P C
BA04 0300 FD12 F10B 821E F7F0 00000100
>bp 821c
>rt

A F  B C  D E  H L  PC   SP   SZ H P C
5D44 0300 FD12 F10B 821C F7F0 01000100
>bp 821e
>rt

A F  B C  D E  H L  PC   SP   SZ H P C
5D00 0200 FE12 F10B 821E F7F0 00000000
>bp 821c
>rt

A F  B C  D E  H L  PC   SP   SZ H P C
AE45 0200 FE12 F10B 821C F7F0 01000101
>bp 821e
>rt

A F  B C  D E  H L  PC   SP   SZ H P C
AE01 0100 FF12 F10B 821E F7F0 00000001
>bp 8211
>rt

A F  B C  D E  H L  PC   SP   SZ H P C
AE01 0100 FF12 F10F 8211 F7F0 00000001
>bp 821c
>rt

A F  B C  D E  H L  PC   SP   SZ H P C
D744 0100 FF12 F10B 821C F7F0 01000100
>bp 821e
>rt

A F  B C  D E  H L  PC   SP   SZ H P C
D794 FF00 0012 F10B 821E F7F0 10010100
>/exit

リモート接続を終了しました
logfile closed at Mon Sep 01 21:51:28 2014

●とんでもないことがおきていました

Bレジスタの値にご注目ください。
信じられないことがおきていました。
Bレジスタはループカウンタですから06から始まって05,04,03…と−1ずつされていき、最後に00になるとループから抜け出します。
ところが。
なんと01の次は00になるはずのところ、突然FFになってしまいました。

なんとBレジスタが誤動作していたのでした。
その原因はちょっと置くとしまして、とにかくBレジスタが01から−1カウントダウンしたところで突然FFになってしまったものですから、本当ならそこでループから抜け出さなければならないのに、そのあとFF(255)回も余分にループが実行されてしまったようです。
その結果Dレジスタの値はFFになり、RBレジスタの仮数部は255ビットも余分に右シフトさせられたものですから、全ビットが0になってしまったということのようです。

実はこのテストプログラムの実行中に正常なはずの私のMYCPU80でも同様のおかしな現象がときどき発生しました。
どうやら今回の異常は修理依頼品のどこかに不良箇所があるということではなくて、MYCPU80の回路そのものに問題があるということのようです。

●犯人はBレジスタでした

おお、そういえば。
突然、思い出しました。

MYCPU80にZB3BASICを移植する作業中に、どういうことだったか詳細は忘れてしまいましたが、異常な動作が発生し、その原因がBレジスタの異常であることがわかりました。
そのときのノートにはBレジスタが異常なのでICを交換した、とのメモ書きがありました。
なんだか他人のノートみたいですけれど、自分で書いておいてすぐに忘れてしまうものですから、余程細かく書いておかないと、あとから見ても何がなんだかわかりません。
しかしノートに書く時点では面倒なので適当にはしょって書いてしまうものですから、困ったものです。

さてはBレジスタの回路に配線の間違いでもあるのか?
お、お、お。
じょーだんじゃありませんよお。
もう発売して5年にもなるのに今頃になって回路に間違いがあったなんてことになりましたら、どうしましょう。

それこそ冷や汗たらーり、でBレジスタ回路をじっくり確認してみましたが。
別に回路に間違いはありませんし、配線にもおかしいところはありません。

う。
いや。
あった、ありました。

ひょっとしたら。

この基板のアートワークをしておりますときに。
もうかすかな記憶しか残っておりませんが、配線をしながら、「ちょっとやばいなあ」と思いつつ、でもどうしようもないので「まあ、いいか」でやってしまったところがありました。
まあ、だいたいはよかったのですけれど、やっぱり今回のような特殊な状況では問題が発生してしまいました。

問題はBレジスタ近くのGNDにありました。
この部分のGNDは横方向には伸びているのですが、縦方向には通っていません。
通したかったのですが、ほかに通さなければならない信号線が多くて、ついにGNDを外さなくてはならなくなってしまったようです。
そのために信号の流れは縦方向なのにGNDは横方向に大きく迂回させられてしまいました。
それでも普通の動作では問題はおきなかったのですが、微妙な信号の変化具合が影響してこのプログラム部分に限って誤動作してしまったものと考えられます。

と。
そのように推測いたしました。
で。
ジャンパ配線で縦方向にGNDを通しました。



IC104のpin10とIC121のpin10を0.3SQ(AWG22)の被覆線でジャンパしました。

●やっと正常動作するようになりました

さっそく試してみましたところ。
おお。
やっと正常に動作するようになりました。

logfile nd80zlog\09012231.txt open
zb3dos3m 2014.3.31 by Chunichidenko

MYCPU80に接続しました

*** nd80z3 basic ****
>p.sid(30)
 0.5

>/load sqrtest.txt
    10 FOR A=0 TO 10
    20 PRINT "a=";A,"sqr(a)=";SQR(A)
    30 NEXT A
    40 PRINT "end"
data end
>r.
a= 0         sqr(a)= 0
a= 1         sqr(a)= 1
a= 2         sqr(a)= 1.41421
a= 3         sqr(a)= 1.73205
a= 4         sqr(a)= 2
a= 5         sqr(a)= 2.23607
a= 6         sqr(a)= 2.44949
a= 7         sqr(a)= 2.64575
a= 8         sqr(a)= 2.82843
a= 9         sqr(a)= 3
a= 10        sqr(a)= 3.16228
end

>.
    10 FOR A=0 TO 10
    20 PRINT "a=";A,"sqr(a)=";SQR(A)
    30 NEXT A
    40 PRINT "end"
>    10 FOR A=0 TO 90 step 5
>   20 PRINT "a=";A,"sid(a)=";sid(A)
>.
    10 FOR A=0 TO 90 STEP 5
    20 PRINT "a=";A,"sid(a)=";SID(A)
    30 NEXT A
    40 PRINT "end"
>/save sidtest.txt
    10 FOR A=0 TO 90 STEP 5
    20 PRINT "a=";A,"sid(a)=";SID(A)
    30 NEXT A
    40 PRINT "end"
>r.
a= 0         sid(a)= 0
a= 5         sid(a)= 0.871557E-1
a= 10        sid(a)= 0.173648
a= 15        sid(a)= 0.258819
a= 20        sid(a)= 0.34202
a= 25        sid(a)= 0.422618
a= 30        sid(a)= 0.5
a= 35        sid(a)= 0.573576
a= 40        sid(a)= 0.642787
a= 45        sid(a)= 0.707107
a= 50        sid(a)= 0.766044
a= 55        sid(a)= 0.819152
a= 60        sid(a)= 0.866025
a= 65        sid(a)= 0.906308
a= 70        sid(a)= 0.939692
a= 75        sid(a)= 0.965926
a= 80        sid(a)= 0.984808
a= 85        sid(a)= 0.996194
a= 90        sid(a)= 1
end

>.
    10 FOR A=0 TO 90 STEP 5
    20 PRINT "a=";A,"sid(a)=";SID(A)
    30 NEXT A
    40 PRINT "end"
>    20 PRINT "a=";A,"cod(a)=";cod(A)
>.
    10 FOR A=0 TO 90 STEP 5
    20 PRINT "a=";A,"cod(a)=";COD(A)
    30 NEXT A
    40 PRINT "end"
>r.
a= 0         cod(a)= 1
a= 5         cod(a)= 0.996195
a= 10        cod(a)= 0.984808
a= 15        cod(a)= 0.965926
a= 20        cod(a)= 0.939693
a= 25        cod(a)= 0.906308
a= 30        cod(a)= 0.866025
a= 35        cod(a)= 0.819152
a= 40        cod(a)= 0.766044
a= 45        cod(a)= 0.707107
a= 50        cod(a)= 0.642788
a= 55        cod(a)= 0.573577
a= 60        cod(a)= 0.5
a= 65        cod(a)= 0.422618
a= 70        cod(a)= 0.34202
a= 75        cod(a)= 0.258819
a= 80        cod(a)= 0.173648
a= 85        cod(a)= 0.871559E-1
a= 90        cod(a)= 0
end

>/exit

リモート接続を終了しました
logfile closed at Mon Sep 01 22:34:11 2014

やっと、一件落着、なのでありますが。
うーん。
こういうことがあるのですねえ。
アナログ回路ではありませんからGNDは離れていてもたいていは大丈夫、だったのですけれど、これだけ大きな基板ともなりますと、余りに離れておりますと、やっぱり大丈夫ではありませんでした。

ということになりますと。
今までにご購入いただきましたMYCPU80についても、本当は上記のようにジャンパ配線が必要…なのでありますが。
今回の浮動小数点演算ではじめて異常が発生することが確認されただけで、そのほかのところでは特におかしい動作をしたわけではありませんから(と思います)、まあ、そのままお使いいただいても多分問題はないと思います。
あ。
勿論こういうことになりましたので、いずれMYCPU80用のCP/M互換DOSセットの供給を開始いたしましたときには、セットをご購入いただきますときに、上記のジャンパ配線をしていただきますよう説明書に明記するつもりでおります。

MYCPU80でCP/Mを![第39回]
2014.9.16upload

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