2014.9.5

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

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


[第31回]


●BASICの関数演算でまさかのエラー発生

修理依頼品のMYCPU80の修理がやっと完了して、念のため数日間電源を入れたまま様子を見ましたが、全く正常に動作しています。
これなら大丈夫ということでお客様に返送しようと思ったのですが。

実はこのお客様はMYCPU80に自作の拡張メモリボードを取り付けてみえて、そのように拡張すると誤動作をする、という連絡を以前にいただいていました。
その時点ではMYCPU80単独では正しく動作していたとのことでした。
まあ、お客様が自作された拡張ボードを接続しての誤動作ということですから、それは私の守備範囲外でありまして、なんとも申し上げられません。

ましかし、そういうことも過去にはありましたので、この際念のため、ちょうど移植を進めておりましたMYCPU80用ZB3BASICを、まだ作業の途中ではありますが、できたところまでを修理済みのMYCPU80にロードして動作を確認してみるのもよいのではないか、と思いました。
こちらのほうも中日電工製の拡張メモリ基板をMYCPU80に増設します。
MYCPU80に拡張メモリ基板を増設しているところの写真は[第2回]でお見せしました。

下はそのようにして修理済みのMYCPU80でBASICプログラムを実行したときのログです。
ところが、ご覧の通りまさかのエラーが発生してしまいました。

logfile nd80zlog\08310922.txt open
zb3dos3m 2014.3.31 by Chunichidenko

MYCPU80に接続しました

*** nd80z3 basic ****
>/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
a= 3         sqr(a)= 2
a= 4         sqr(a)= 2
a= 5         sqr(a)= 2
a= 6         sqr(a)= 2
a= 7         sqr(a)= 2
a= 8         sqr(a)= 2
a= 9         sqr(a)= 2
a= 10        sqr(a)= 4
end

>.
    10 FOR A=0 TO 10
    20 PRINT "a=";A,"sqr(a)=";SQR(A)
    30 NEXT A
    40 PRINT "end"
>    20 PRINT "a=";A,"a/10=";a/10
>.
    10 FOR A=0 TO 10
    20 PRINT "a=";A,"a/10=";A/10
    30 NEXT A
    40 PRINT "end"
>r.
a= 0         a/10= 0
a= 1         a/10= 0.1
a= 2         a/10= 0.2
a= 3         a/10= 0.3
a= 4         a/10= 0.4
a= 5         a/10= 0.5
a= 6         a/10= 0.6
a= 7         a/10= 0.7
a= 8         a/10= 0.8
a= 9         a/10= 0.9
a= 10        a/10= 1
end

>.
    10 FOR A=0 TO 10
    20 PRINT "a=";A,"a/10=";A/10
    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"
>r.
a= 0         sid(a)= 0
a= 5         sid(a)= 0.872664E-1
a= 10        sid(a)= 0.174533
a= 15        sid(a)= 0.261799
a= 20        sid(a)= 0.349066
a= 25        sid(a)= 0.436332
a= 30        sid(a)= 0.523599
a= 35        sid(a)= 0.610865
a= 40        sid(a)= 0.698132
a= 45        sid(a)= 0.785398
a= 50        sid(a)= 0.872664
a= 55        sid(a)= 0.959931
a= 60        sid(a)= 1.0472
a= 65        sid(a)= 1.13446
a= 70        sid(a)= 1.22173
a= 75        sid(a)= 1.309
a= 80        sid(a)= 0.942582
a= 85        sid(a)= 0.939356
a= 90        sid(a)= 0.924833
end

>/exit

リモート接続を終了しました
logfile closed at Sun Aug 31 09:41:46 2014
試しに平方根を計算させてみたのですが、結果は整数値になってしまいました。
結果が全て整数で表示されたので、最初は実数(浮動小数点数)の値を表示するところでエラーが発生しているのか、と思ったのですが、その次に関数ではなくて普通の実数除算の結果を表示させてみましたところ、正しく表示されました。
次に三角関数SINの計算をさせたところ、やっぱり正しい結果が出ませんでした。

本当ならば、下のように正しく計算されるはずです。

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

こちらは正常なMYCPU80上で実行したときのログです。
あ。
説明があとになってしまいましたが、実は本テーマでありますMYCPU80へのZB3DOSの移植作業はここまで進んでいるのです。
ええ。
ルートもSINもCOSも、MYCPU80が計算しているのですよお。
どうです。
ちょいとすごいことでしょう。

あ。
そんなことを言っている場合ではありませんでした。
やっと修理が完了したと思いましたのに、今度はなんと浮動小数点演算の、しかも平方根や三角関数での計算エラーの発生です。
正直なところ、今度こそ本当にめげてしまいました。
どうやって、それを追求するとよいのだ…。

…だって、ねえ。
平方根の処理プログラムだって三角関数のプログラムだって、もう30年も前に書いたものなんですよお。
そんなもの、かけらほども記憶に残ってはおりませぬ。
えらいこっちゃあ。
どないしょお。

MYCPU80でCP/Mを![第31回]
2014.9.5upload

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