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 |