2014.8.18

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

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


[第17回]


●さらなる誤動作の追及を…

やっと誤動作の原因をつきとめて、一度はやれやれと安堵したのでありましたが、念のためあれこれ操作をしていますとポロリポロリと誤動作するときがあります。
リセットして表示がオール0のままにしてしばらく置いておきますと、知らないうちに表示が変わっていたり、レジスタLEDが勝手にカウントアップ表示をして7セグメントの表示もでたらめになってしまうこともあります。
やっぱりまだどこかがおかしいようです。
もうすこしZB28Kを使ってBASICプログラムで自動STEPを続けてみることにしました。
せっかくですので、もう少し記録データを見やすくするためBASICプログラムをちょっとばかり改良しました。

●改良したBASICプログラムです(ZB28K)

    10 A=0
    20 OUT $83,$9B
    30 OUT $87,$90:'A=IN B,C=OUT
    40 WAH%=$FF:WAL%=$FF:WD%=$FF
    50 OUT $86,$FF
    60 A%=IN($80)
    70 B%=IN($81)
    80 C%=IN($82)
    90 RW%=IN($84)
   100 MR%=BIT(RW%,7)
   110 MW%=BIT(RW%,6)
   120 IR%=BIT(RW%,2)
   130 IW%=BIT(RW%,3)
   140 A15%=BIT(B%,3)
   150 A14%=BIT(B%,2)
   160 A13%=BIT(B%,5)
   170 A12%=BIT(B%,4)
   180 A11%=BIT(B%,7)
   190 A10%=BIT(B%,6)
   200 A9%=BIT(C%,2)
   210 A8%=BIT(C%,3)
   220 A7%=BIT(C%,0)
   230 A6%=BIT(C%,1)
   240 A5%=BIT(C%,5)
   250 A4%=BIT(C%,4)
   260 A3%=BIT(C%,7)
   270 A2%=BIT(C%,6)
   280 A1%=BIT(B%,1)
   290 A0%=BIT(B%,0)
   300 D7%=BIT(A%,1)
   310 D6%=BIT(A%,0)
   320 D5%=BIT(A%,3)
   330 D4%=BIT(A%,2)
   340 D3%=BIT(A%,6)
   350 D2%=BIT(A%,7)
   360 D1%=BIT(A%,4)
   370 D0%=BIT(A%,5)
   380 IF MR%*MW%*IR%*IW%=1 GOTO 510
   390 AH%=A15%*128+A14%*64+A13%*32+A12%*16+A11%*8+A10%*4+A9%*2+A8%
   400 AL%=A7%*128+A6%*64+A5%*32+A4%*16+A3%*8+A2%*4+A1%*2+A0%
   410 D%=D7%*128+D6%*64+D5%*32+D4%*16+D3%*8+D2%*4+D1%*2+D0%
   420 IF AH%<>WAH% GOTO 450
   430 IF AL%<>WAL% GOTO 450
   440 IF D%=WD% GOTO 510
   450 PRINT HEX$(AH%,2);HEX$(AL%,2);" ";HEX$(D%,2);
   460 WAH%=AH%:WAL%=AL%:WD%=D%
   470 IF MR%=0 THEN PRINT 
   480 IF MW%=0 THEN PRINT "  MEMWR"
   490 IF IR%=0 THEN PRINT "  I/ORD"
   500 IF IW%=0 THEN PRINT "  I/OWR"
   510 OUT $86,0
   520 GOTO 50

制御信号を解読してMEMWR、I/ORD、I/OWRを表示するようにしました。
MEMRDは一番多いので表示なしとしました。
また同じデータが二重に表示されている点も対策をとりました。
下が改良後のプログラムで記録したデータです。
これで見易くなりました。

0000 C3
FFF8 D7
FFFD 01
0001 3B
0002 00
003B 21
FFFD 01
FFFA 0C
003C EC
003D FF
003E 06
FFFC 03
FFF9 F1
003F 0C
0040 AF
FFF9 F1
FFFF 8C
0041 77
FFFB 0C
FFF8 D7
FFEC 00  MEMWR
0042 23
FFF8 D7
FFFD 01
0043 05
FFFA 0C
FFFF 8C
0044 C2
FFFC 03
FFF9 F1
0045 41
0046 00
0041 77
FFF9 F1
FFFE FF
FFED 00  MEMWR
0042 23
FFFE FF
FFFC 03
0043 05
FFF8 D7
FFFE FF
0044 C2
FFFB 0C
FFF8 D7
0045 41
0046 00
0041 77
FFFF 8C
FFFD 01
FFEE 00  MEMWR
0042 23
FFFD 01
FFFA 0C
0043 05
FFFF 8C
FFFD 03
0044 C2
FFF9 F1
FFFF FF
0045 41
0046 00
0041 77
FFFE FF
FFFF FF
FFEF 00  MEMWR
0042 23
FFFC 03
FFF9 F1
0043 05
FFFE FF
FFFB FF
0044 C2
FFF8 D7
FFFD 01
0045 41
0046 00
0041 77
FFFD 01
FFFA 0C
FFF0 00  MEMWR
0042 23
FFFA 0C
FFFF 8C
0043 05
FFFC 03
FFF9 F1
0044 C2
FFFE FF
FFFB FF
0045 41
0046 00
0041 77
FFFB FF
FFF8 D7
FFF1 00  MEMWR
0042 23
FFF9 F1
FFFE FF
0043 05
FFFB FF
FFF8 D7
0044 C2
FFFD 01
FFFA 0C
0045 41
0046 00
0041 77
FFFA 0C
FFFF 8C
FFF2 00  MEMWR
0042 23
FFFF 8C
FFFD 01
0043 05
FFF9 F1
FFFF 8C
0044 C2
FFFF FF
FFF9 F1
0045 41
0046 00
0041 77
FFF8 D7
FFFE FF
FFF3 00  MEMWR
0042 23
FFFE FF
FFFB FF
0043 05
FFF8 D7
FFFD 01
0044 C2
FFFA 0C
FFFF 8C
0045 41
0046 00
0041 77
FFFF 8C
FFFC 03
FFF4 00  MEMWR
0042 23
FFFC 03
FFF9 F1
0043 05
FFFE FF
FFFC FF
0044 C2
FFF8 D7
FFFE FF
0045 41
0046 00
0041 77
FFFD 01
FFFB FF
FFF5 00  MEMWR
0042 23
FFFB FF
FFF8 D7
0043 05
FFFD 01
FFFA 0C
0044 C2
FFFF 8C
FFFC 03
0045 41
0046 00
0041 77
FFFC 03
FFF9 F1
FFF6 00  MEMWR
0042 23
FFF9 F1
FFFE FF
0043 05
FFFC 03
FFF9 F1
0044 C2
FFFE FF
FFFB FF
0045 41
0046 00
0041 77
FFFB FF
FFF8 D7
FFF7 00  MEMWR
0042 23
FFF8 D7
FFFD 01
0043 05
FFFA 0C
FFFB 8C
0044 C2
FFFC 03
FFFA 0C
0045 41
0046 00
0047 21
FFFB FF
FFF8 D7
0048 C7
0049 FF
004A 22
FFFA 0C
FFFF 8C
004B E2
004C FF
FFE2 C7  MEMWR
FFE3 FF  MEMWR
004D C3
FFF8 D7
FFFD 01
004E 51
004F 00
0051 3E
FFFD 01
FFFA 0C
0052 F7
0053 D3
FFFA 0C
FFFB 8C
0054 98
0098 F7  I/OWR
0055 31
FFF9 F1
FFFF 8C
0056 D1
0057 FF
0058 CD
FFF8 D7
FFFE 01
0059 C0
005A 01
FFD0 00  MEMWR
FFCF 5B  MEMWR
01C0 21
FFFF 8C
FFFC 03
01C1 F4

ところが随分長い時間、自動STEP動作を続けても異常が発生してくれません。
ひょっとするとSTEP動作では発生しない異常なのかもしれません。
そういうことになりますと、STEP動作ではなくて、普通にリアルタイムで実行させながら、システムバスや制御信号を継続して監視記録することを考えなくてはなりません。
もしも異常の発生がある特定の条件であることがわかっていて、しかも短時間で必ず発生する、ということでしたらカメレオンロジアナでシステムバスや制御信号を波形として記録して、それを解析するということもできそうです。
しかし今回の症状ではいつ異常が発生するかわかりませんから、カメレオンロジアナでは記録時間が短すぎて使えません。
それに波形から8ビットや16ビットのアドレス、データを読むのはとても大変なことで、もし長時間記録できたとしてもそれを解析するのは事実上無理というものです。

ここはやっぱりCPLDの出番でありましょう。

[2014.8.19追記]
今朝になってから上のログデータを見ていて気が付きました。
アドレスFFF8〜FFFFは7セグメント表示のためのDMAアクセスですからプログラムのデバッグには無関係です。
この範囲のアドレスデータは表示しないようにすればもっと見易くできましたですね。
もしまたこのプログラムを使うような機会がありましたら、そのように改良することにいたしましょう。

MYCPU80でCP/Mを![第17回]
2014.8.18upload
2014.8.19追記

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