2014.9.2

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

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


[第28回]


●PCL(プログラムカウンタ)がおかしい?

修理依頼品のMYCPU80のアドレスバス、データバス信号をモニタした結果、ときどきJMP命令(JNZなども含む)で指定外のアドレスにジャンプするという現象が確認できました。
異常動作の現場を押さえることができたということは大きな成果なのですが、それだけでは解決したことにはなりません。

何が原因でそのような異常が発生するのかという、その原因を突き止める必要があります。
とにかくハードウェアがらみであることはほぼ間違いありませんでしょう。
ジャンプ命令の実行時に飛び先のアドレスを間違えるという誤動作から考えて、最初はPC(プログラムカウンタ)がおかしいのでは、と考えました。
レジスタは上下8ビットに分かれていますから、多分PCL(プログラムカウンタの下位8ビット)が怪しいことになります。

が、落ち着いて考えてみますと、PCLがおかしいと決め付けるのは早計のようです。
もしもプログラムカウンタに異常があるならば、もっとあちこちで暴走してもよさそうなものだからです。
データを沢山とって分析してみますと、どうも異常は決ってジャンプ命令のところでおきているようです。

あるいは、ひょっとしたらワークレジスタが原因かもしれません。
ワークレジスタはジャンプ命令やコール命令のように、アドレスデータをダイレクトにプログラムカウンタに書き込めない、というような場合のために用意されているレジスタでメモリから読み出したアドレスデータを一時的に蓄えておくなどの目的に使われます。

ジャンプ命令はOPコードの次の2バイトでアドレス情報を示します。
第2バイトがジャンプ先アドレス下位8ビットで第3バイトがアドレス上位8ビットです。
プログラムカウンタが第2バイトのアドレスを出力して、メモリからジャンプ先アドレス下位のデータを読み出したとき、それをいきなりPCL(プログラムカウンタの下位8ビット)に書き込んでしまうと、プログラムカウンタの値が変わってしまうので、次のジャンプ先アドレス上位のデータを読み取ることができなくなってしまいます。
そこでそういう場合の一時バッファとしてワークレジスタが必要になってくるのです。
そのワークレジスタ(特に下位レジスタ)も怪しいようです。

そこで今度は下位ワークレジスタと下位プログラムカウンタにターゲットをしぼって調べてみることにしました。
ついでにWKLrd(下位ワークレジスタリード信号)やクロックも読み取ってみることにしました。
カメレオンロジアナを利用したCPU信号の読み取りシステムはほとんど変更なしに使えます。
今まではアドレスバス16ビット、データバス8ビット、残りの8ビットでCPU制御信号を読み取っていました。
その代わりにOPコードレジスタ8ビット、内部バス8ビット、PCL8ビット、と残りの8ビットでPCLwr(下位プログラムカウンタライト)やWKLrd(下位ワークレジスタリード信号)やクロックを取得することにしました。
読み取るデータの対象は異なりますが、8ビットのデータであることは同じですから、その部分のVHDLは変更する必要はありません。
CPU制御信号のところだけを一部手直しするだけで済みました。

しかし、問題は信号を入力する端子部分です。
今までは26pinコネクタに出ているアドレスバス、データバス信号をそのままフラットケーブルで接続して読み取ればよかったのですが、今度はそういうわけにはいきません。
上記の信号はコネクタには出ていませんからICのピンから直接信号を取らなければなりません。
接続するだけでも一仕事です。
下はそのようにしてデータを取得しているところの写真です。



バイナリからテキストに変換するプログラムも少し変更しました。

2014/8/14  22:5  mctrb2t3.txt
[00001]                     ;;; MYCPU80 TRACE BYNARY DATA FILE to TEXT FILE,,, from FILE DUMP 2014 1/4
[00002]                     ;2014/8/12 8/14
[00003]                     ;
[00004]                         ORG=100
[00005]                     ;;;
[00006]                         RHNDL=FF00
[00007]                         WHNDL=FF02
[00008]                         NAME2=FF04
[00009]                     ;
[00010] 0100  BC00FF            MOV SP,FF00
[00011] 0103  FC                CLD
[00012] 0104  B91000            MOV CX,10
[00013] 0107  BF8200            MOV DI,82
[00014] 010A  8BD7              MOV DX,DI
[00015] 010C  33C0              XOR AX,AX
[00016] 010E  A304FF            MOV [NAME2],AX
[00017] 0111  803D0D        RNM01:CMP [DI]B,0D
[00018] 0114  7411              JZ ROPEN01 <0127>
[00019] 0116  803D2E            CMP [DI]B,2E
[00020] 0119  7404              JZ RNM02 <011F>
[00021] 011B  47                INC DI
[00022] 011C  EBF390            JMP RNM01 <0111>
[00023] 011F  893E04FF      RNM02:MOV [NAME2],DI
[00024] 0123  47                INC DI
[00025] 0124  EBEB90            JMP RNM01 <0111>
[00026] 0127  C60500        ROPEN01:MOV [DI]B,0
[00027] 012A  A104FF            MOV AX,[NAME2]
[00028] 012D  0BC0              OR AX,AX
[00029] 012F  7504              JNZ ROPEN02 <0135>
[00030] 0131  893E04FF          MOV [NAME2],DI
[00031] 0135  B000          ROPEN02:MOV AL,0
[00032] 0137  B43D              MOV AH,3D;OPEN
[00033] 0139  CD21              INT 21
[00034] 013B  7303              JNC WOPEN01 <0140>
[00035] 013D  E98C00            JMP EREND <01CC>
[00036] 0140  A300FF        WOPEN01:MOV [RHNDL],AX
[00037] 0143  8B3E04FF          MOV DI,[NAME2]
[00038] 0147  C6052E            MOV [DI]B,2E
[00039] 014A  47                INC DI
[00040] 014B  C60554            MOV [DI]B,54;T
[00041] 014E  47                INC DI
[00042] 014F  C60558            MOV [DI]B,58;X
[00043] 0152  47                INC DI
[00044] 0153  C60554            MOV [DI]B,54;T
[00045] 0156  33C9              XOR CX,CX
[00046] 0158  B43C              MOV AH,3C;new open
[00047] 015A  CD21              INT 21
[00048] 015C  7303              JNC READ01 <0161>
[00049] 015E  EB6C90            JMP EREND <01CC>
[00050] 0161  A302FF        READ01:MOV [WHNDL],AX
[00051]                     ;   MOV DI,1000
[00052]                     ;   MOV [DI]B,00
[00053]                     ;   MOV DX,DI
[00054]                     ;   INC DX
[00055]                     ;   MOV CX,0FFE
[00056]                     ;   JMP READ022
[00057] 0164  BA0010        READ02:MOV DX,1000
[00058] 0167  B9FF0F            MOV CX,0FFF
[00059] 016A  51            READ022:PUSH CX
[00060] 016B  8B1E00FF          MOV BX,[RHNDL]
[00061] 016F  B43F              MOV AH,3F;READ
[00062] 0171  CD21              INT 21
[00063] 0173  7304              JNC READ03 <0179>
[00064] 0175  59                POP CX
[00065] 0176  EB5490            JMP EREND <01CC>
[00066] 0179  0BC0          READ03:OR AX,AX
[00067] 017B  5B                POP BX
[00068] 017C  7415              JZ END01 <0193>
[00069] 017E  8BC8              MOV CX,AX
[00070] 0180  3BC3              CMP AX,BX
[00071] 0182  7509              JNZ EREAD01 <018D>
[00072] 0184  E81900            CALL HEXSB <01A0>
[00073] 0187  E82C00            CALL WRSB <01B6>
[00074] 018A  EBD890            JMP READ02 <0164>
[00075] 018D  E81000        EREAD01:CALL HEXSB <01A0>
[00076] 0190  E82300            CALL WRSB <01B6>
[00077] 0193  B43E          END01:MOV AH,3E;close wfile
[00078] 0195  CD21              INT 21
[00079] 0197  8B1E00FF          MOV BX,[RHNDL]
[00080] 019B  CD21              INT 21
[00081] 019D  E92D01            JMP ENDDP <02CD>
[00082]                     ;
[00083] 01A0  BE0010        HEXSB:MOV SI,1000
[00084] 01A3  BF0020            MOV DI,2000
[00085] 01A6  E82900        HEXSB2:CALL LNDP <01D2>
[00086] 01A9  81F90700          CMP CX,7
[00087] 01AD  73F7              JNC HEXSB2 <01A6>
[00088] 01AF  B402              MOV AH,2
[00089] 01B1  B22E              MOV DL,2E
[00090] 01B3  CD21              INT 21
[00091] 01B5  C3                RET
[00092]                     ;
[00093] 01B6  8BCF          WRSB:MOV CX,DI
[00094] 01B8  81E90020          SUB CX,2000
[00095] 01BC  BA0020            MOV DX,2000
[00096] 01BF  8B1E02FF          MOV BX,[WHNDL]
[00097] 01C3  B440              MOV AH,40
[00098] 01C5  CD21              INT 21
[00099] 01C7  7302              JNC WRSB2 <01CB>
[00100] 01C9  7A01              JP EREND <01CC>
[00101] 01CB  C3            WRSB2:RET
[00102] 01CC  BFDD02        EREND:MOV DI,*ERRT
[00103] 01CF  E9FE00            JMP ENDDP2 <02D0>
[00104]                     ;;;
[00105] 01D2  57            LNDP:PUSH DI
[00106] 01D3  B61A              MOV DH,1A;26bytes
[00107] 01D5  C60520        LNDP1:MOV [DI]B,20;clear
[00108] 01D8  47                INC DI
[00109] 01D9  FECE              DEC DH
[00110] 01DB  75F8              JNZ LNDP1 <01D5>
[00111] 01DD  5F                POP DI
[00112] 01DE  8A4402            MOV AL,[SI+02];madrsH
[00113] 01E1  E8AA00            CALL HXDP2 <028E>
[00114] 01E4  8A4401            MOV AL,[SI+01];madrsM
[00115] 01E7  E8A400            CALL HXDP2 <028E>
[00116] 01EA  8A04              MOV AL,[SI];madrsL
[00117] 01EC  E89F00            CALL HXDP2 <028E>
[00118] 01EF  C60520            MOV [DI]B,20
[00119] 01F2  47                INC DI
[00120] 01F3  8A4403            MOV AL,[SI+03];opcode
[00121] 01F6  E89500            CALL HXDP2 <028E>
[00122] 01F9  C60520            MOV [DI]B,20
[00123] 01FC  47                INC DI
[00124] 01FD  8A4404            MOV AL,[SI+04];innerbus
[00125] 0200  E88B00            CALL HXDP2 <028E>
[00126] 0203  C60520            MOV [DI]B,20
[00127] 0206  47                INC DI
[00128] 0207  8A4405            MOV AL,[SI+05];PCL
[00129] 020A  E88100            CALL HXDP2 <028E>
[00130] 020D  C60520            MOV [DI]B,20
[00131] 0210  47                INC DI
[00132] 0211  8A4406            MOV AL,[SI+06];ctrldata
[00133] 0214  50                PUSH AX
[00134] 0215  E87600            CALL HXDP2 <028E>
[00135] 0218  C60520            MOV [DI]B,20
[00136] 021B  47                INC DI
[00137] 021C  58                POP AX
[00138] 021D  D0D8              RCR AL
[00139] 021F  D0D8              RCR AL
[00140] 0221  7321              JNC PCLWR <0244>
[00141] 0223  D0D8              RCR AL
[00142] 0225  7333              JNC WKLRD <025A>
[00143] 0227  E84700            CALL SPDP5 <0271>
[00144] 022A  C60520        LNDP6:MOV [DI]B,20
[00145] 022D  47                INC DI
[00146] 022E  2407              AND AL,07
[00147] 0230  E86A00            CALL HDP1 <029D>
[00148] 0233  C6050D            MOV [DI]B,0D
[00149] 0236  47                INC DI
[00150] 0237  C6050A            MOV [DI]B,0A
[00151] 023A  47                INC DI
[00152] 023B  81C60700          ADD SI,7
[00153] 023F  81E90700          SUB CX,7
[00154] 0243  C3                RET
[00155]                     ;
[00156] 0244  D0D8          PCLWR:RCR AL
[00157] 0246  7209              JC PCLWR2 <0251>
[00158] 0248  BB8802            MOV BX,*BOTHT
[00159] 024B  E81500            CALL TBLSV <0263>
[00160] 024E  EBDA90            JMP LNDP6 <022A>
[00161] 0251  BB7C02        PCLWR2:MOV BX,PCLT
[00162] 0254  E80C00            CALL TBLSV <0263>
[00163] 0257  EBD190            JMP LNDP6 <022A>
[00164]                     ;
[00165] 025A  BB8202        WKLRD:MOV BX,WKLT
[00166] 025D  E80300            CALL TBLSV <0263>
[00167] 0260  EBC890            JMP LNDP6 <022A>
[00168] 0263  8A27          TBLSV:MOV AH,[BX]
[00169] 0265  0AE4              OR AH,AH
[00170] 0267  7501              JNZ TBLSV2 <026A>
[00171] 0269  C3                RET
[00172] 026A  8825          TBLSV2:MOV [DI],AH
[00173] 026C  43                INC BX
[00174] 026D  47                INC DI
[00175] 026E  EBF390            JMP TBLSV <0263>
[00176]                     ;
[00177] 0271  B305          SPDP5:MOV BL,05
[00178] 0273  C60520        SPDP52:MOV [DI]B,20
[00179] 0276  47                INC DI
[00180] 0277  FECB              DEC BL
[00181] 0279  75F8              JNZ SPDP52 <0273>
[00182] 027B  C3                RET
[00183]                     ;
[00184] 027C  50434C5752    PCLT:"PCLWR
[00185] 0281  00                DB 00
[00186] 0282  574B4C5244    WKLT:"WKLRD
[00187] 0287  00                DB 00
[00188] 0288  50432F574B    BOTHT:"PC/WK
[00189] 028D  00                DB 00
[00190]                     ;
[00191] 028E  8AE0          HXDP2:MOV AH,AL
[00192] 0290  D0C0              ROL AL
[00193] 0292  D0C0              ROL AL
[00194] 0294  D0C0              ROL AL
[00195] 0296  D0C0              ROL AL
[00196] 0298  E80200            CALL HDP1 <029D>
[00197] 029B  8AC4              MOV AL,AH
[00198] 029D  240F          HDP1:AND AL,0F
[00199] 029F  0430              ADD AL,30
[00200] 02A1  3C3A              CMP AL,3A
[00201] 02A3  7202              JC HDP12 <02A7>
[00202] 02A5  0407              ADD AL,07
[00203] 02A7  8805          HDP12:MOV [DI],AL
[00204] 02A9  47                INC DI
[00205] 02AA  C3                RET
[00206]                     ;
[00207] 02AB  8AF0          DEDP:MOV DH,AL
[00208] 02AD  8A15          DEDP1:MOV DL,[DI]
[00209] 02AF  47            INC DI
[00210] 02B0  3AD6          CMP DL,DH
[00211] 02B2  7501          JNZ DEDP2 <02B5>
[00212] 02B4  C3            RET
[00213] 02B5  80FA0D        DEDP2:CMP DL,0D
[00214] 02B8  7407          JZ CRLF0 <02C1>
[00215] 02BA  B402          MOV AH,2
[00216] 02BC  CD21          INT 21
[00217] 02BE  EBED90        JMP DEDP1 <02AD>
[00218] 02C1  47            CRLF0:INC DI
[00219] 02C2  B402          CRLF:MOV AH,2
[00220] 02C4  B20D          MOV DL,0D
[00221] 02C6  CD21          INT 21
[00222] 02C8  B20A          MOV DL,0A
[00223] 02CA  CD21          INT 21
[00224] 02CC  C3            RET
[00225]                     ;
[00226] 02CD  BFD902        ENDDP:MOV DI,*ENDT2
[00227] 02D0  32C0          ENDDP2:XOR AL,AL
[00228] 02D2  E8D6FF        CALL DEDP <02AB>
[00229]                     ;
[00230] 02D5  B44C          REENT:MOV AH,4C
[00231] 02D7  CD21          INT 21
[00232]                     ;
[00233] 02D9  45            ENDT2:DB 45
[00234] 02DA  4E            DB 4E
[00235] 02DB  44            DB 44
[00236] 02DC  0D            DB 0D
[00237]                     ;
[00238] 02DD  45            ERRT:DB 45
[00239] 02DE  52                DB 52
[00240] 02DF  52                DB 52
[00241] 02E0  0D                DB 0D
[00242]                     ;
0100-02E0
BOTHT        =0288  CRLF         =02C2  CRLF0        =02C1  
DEDP         =02AB  DEDP1        =02AD  DEDP2        =02B5  
END01        =0193  ENDDP        =02CD  ENDDP2       =02D0  
ENDT2        =02D9  EREAD01      =018D  EREND        =01CC  
ERRT         =02DD  HDP1         =029D  HDP12        =02A7  
HEXSB        =01A0  HEXSB2       =01A6  HXDP2        =028E  
LNDP         =01D2  LNDP1        =01D5  LNDP6        =022A  
NAME2        =FF04  PCLT         =027C  PCLWR        =0244  
PCLWR2       =0251  READ01       =0161  READ02       =0164  
READ022      =016A  READ03       =0179  REENT        =02D5  
RHNDL        =FF00  RNM01        =0111  RNM02        =011F  
ROPEN01      =0127  ROPEN02      =0135  SPDP5        =0271  
SPDP52       =0273  TBLSV        =0263  TBLSV2       =026A  
WHNDL        =FF02  WKLRD        =025A  WKLT         =0282  
WOPEN01      =0140  WRSB         =01B6  WRSB2        =01CB  

ここまででやっと準備完了です。
本当に大変な作業です。
とにかく準備はできましたのでさっそくデータを取って解析作業にかかりました。

●やっと少し見えてきました

さきほどの写真のようなちょいと大掛かりな準備をしてデータを取って、それを解析した結果、おかしなところがみつかりました。



左の6桁はデータを記録するメモリ(CY7C1347G)のアドレスです。
その次から右へ、OPコードレジスタ、内部バス、PCL、制御信号を含む8ビット、そして最後の1桁はCLOCKの下位3ビットです。
おかしいところは63行です。
OPコードはC2ですからJNZ命令です。
そのクロック4のところにWKLRD(下位ワークレジスタリード)信号が出ています。
これはおかしい!
ここはJNZ命令の第2バイトをメモリからWKLレジスタに読み込むところですから、MEMRDとWKLWRでなければならないはずです。
おそらくその2つの信号は出ているはずと思いますが、しかしここでWKLRDはありえない信号です。

おお!
読めました。
このとき内部バスの値は7Bになっています。
ここは本来は41のはずのところです。
それが7Bに化けてWKLに書き込まれたあと、PCLに転記されたため、そのあと007Bにジャンプしてしまっています。
なぜ41であるべきところが7Bになってしまったのでありましょうか?
そこのところが読めたのです。

このときWKLレジスタの値はその前に実行されたアドレス0000のJMP命令C33B00の3Bがそのまま残っていたはずです([第23回]の解析データ参照)。
それがWKLRD信号がアクティブになったために内部バスに読み出され、そこでメモリから読み出された41とぶつかっていたと考えられます。
3Bは00111011です。
41は01000001です。
1と0の信号がショートすると中間の値になりますが、このときはそれが誤って1として読み取られたようです。
それが01111011(7B)に化けた理由だと考えられます。
それではなぜ本来出るはずのないWKLRD信号が出されたのでしょうか?

今度はその原因を追究していかねばなりません。
まだまだつらい作業は続きます。

MYCPU80でCP/Mを![第28回]
2014.9.2upload

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