MYCPU80でCP/Mを!
超巨大基板の8080互換HCMOS・CPUでCP/Mを走らせてしまおうという、なんとも狂気なプロジェクトです!
[第27回]
●記録時間が約12分の1に短縮できました
機械語のプログラムを作って、それからWindows側のプログラムにもBSAVE(バイナリファイルセーブ)の機能を追加して、それでXC95144XLから送られてくるMYCPU80の監視データをバイナリファイルとして記録保存するように考えました。
実際にそのようにプログラムを作って試してみましたところ、速い!
いままで320msのデータを記録するのに30分もかかっていたところが今回の機械語のプログラムで受けるようにしたところ、なんと約150秒(2分半)に短縮されました。
これなら十分実用になりますでしょう。
●Windows側にもプログラムが必要です
時間が短縮できたのはよいのですが、今まではテキストイメージのログファイルでしたからTeraPadですぐに開くことができました。
しかし今回はバイナリファイルですから、そのままでは開くことができません。
そこでバイナリファイルを読み込んで、それをテキストファイルに変換するプログラムを作りました。
必要なものは何でも自分で作ってしまいます。
下がその変換プログラムです。
これも8086アセンブラで作成しました。
2014/8/12 22:40 mctr_b2t.txt [00001] ;;; MYCPU80 TRACE BINARY DATA FILE to TEXT FILE,,, from FILE DUMP 2014 1/4 [00002] ;2014/8/12 [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 E98A00 JMP EREND <01CA> [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 EB6A90 JMP EREND <01CA> [00050] 0161 A302FF READ01:MOV [WHNDL],AX [00051] 0164 BA0010 READ02:MOV DX,1000 [00052] 0167 8B1E00FF MOV BX,[RHNDL] [00053] 016B B9FF0F MOV CX,0FFF [00054] 016E B43F MOV AH,3F;READ [00055] 0170 CD21 INT 21 [00056] 0172 7303 JNC READ03 <0177> [00057] 0174 EB5490 JMP EREND <01CA> [00058] 0177 0BC0 READ03:OR AX,AX [00059] 0179 7416 JZ END01 <0191> [00060] 017B 8BC8 MOV CX,AX [00061] 017D 3DFF0F CMP AX,0FFF [00062] 0180 7509 JNZ EREAD01 <018B> [00063] 0182 E81900 CALL HEXSB <019E> [00064] 0185 E82C00 CALL WRSB <01B4> [00065] 0188 EBDA90 JMP READ02 <0164> [00066] 018B E81000 EREAD01:CALL HEXSB <019E> [00067] 018E E82300 CALL WRSB <01B4> [00068] 0191 B43E END01:MOV AH,3E;close wfile [00069] 0193 CD21 INT 21 [00070] 0195 8B1E00FF MOV BX,[RHNDL] [00071] 0199 CD21 INT 21 [00072] 019B E92601 JMP ENDDP <02C4> [00073] ; [00074] 019E BE0010 HEXSB:MOV SI,1000 [00075] 01A1 BF0020 MOV DI,2000 [00076] 01A4 E82900 HEXSB2:CALL LNDP <01D0> [00077] 01A7 81F90700 CMP CX,7 [00078] 01AB 73F7 JNC HEXSB2 <01A4> [00079] 01AD B402 MOV AH,2 [00080] 01AF B22E MOV DL,2E [00081] 01B1 CD21 INT 21 [00082] 01B3 C3 RET [00083] ; [00084] 01B4 8BCF WRSB:MOV CX,DI [00085] 01B6 81E90020 SUB CX,2000 [00086] 01BA BA0020 MOV DX,2000 [00087] 01BD 8B1E02FF MOV BX,[WHNDL] [00088] 01C1 B440 MOV AH,40 [00089] 01C3 CD21 INT 21 [00090] 01C5 7302 JNC WRSB2 <01C9> [00091] 01C7 7A01 JP EREND <01CA> [00092] 01C9 C3 WRSB2:RET [00093] 01CA BFD402 EREND:MOV DI,*ERRT [00094] 01CD E9F700 JMP ENDDP2 <02C7> [00095] ;;; [00096] 01D0 57 LNDP:PUSH DI [00097] 01D1 B618 MOV DH,18;24bytes [00098] 01D3 C60520 LNDP1:MOV [DI]B,20;clear [00099] 01D6 47 INC DI [00100] 01D7 FECE DEC DH [00101] 01D9 75F8 JNZ LNDP1 <01D3> [00102] 01DB 5F POP DI [00103] 01DC 8A4402 MOV AL,[SI+02];madrsH [00104] 01DF E8A300 CALL HXDP2 <0285> [00105] 01E2 8A4401 MOV AL,[SI+01];madrsM [00106] 01E5 E89D00 CALL HXDP2 <0285> [00107] 01E8 8A04 MOV AL,[SI];madrsL [00108] 01EA E89800 CALL HXDP2 <0285> [00109] 01ED C60520 MOV [DI]B,20 [00110] 01F0 47 INC DI [00111] 01F1 8A4405 MOV AL,[SI+05];cpuadrsH [00112] 01F4 E88E00 CALL HXDP2 <0285> [00113] 01F7 8A4404 MOV AL,[SI+04];cpuadrsL [00114] 01FA E88800 CALL HXDP2 <0285> [00115] 01FD C60520 MOV [DI]B,20 [00116] 0200 47 INC DI [00117] 0201 8A4403 MOV AL,[SI+03];cpudata [00118] 0204 E87E00 CALL HXDP2 <0285> [00119] 0207 C60520 MOV [DI]B,20 [00120] 020A 47 INC DI [00121] 020B 8A4406 MOV AL,[SI+06];ctrldata [00122] 020E 50 PUSH AX [00123] 020F E87300 CALL HXDP2 <0285> [00124] 0212 C60520 MOV [DI]B,20 [00125] 0215 47 INC DI [00126] 0216 58 POP AX [00127] 0217 D0D8 RCR AL [00128] 0219 D0D8 RCR AL [00129] 021B 7321 JNC OPSV <023E> [00130] 021D D0D8 RCR AL [00131] 021F 7323 JNC MRDSV <0244> [00132] 0221 D0D8 RCR AL [00133] 0223 7325 JNC MWRSV <024A> [00134] 0225 D0D8 RCR AL [00135] 0227 7327 JNC IORSV <0250> [00136] 0229 D0D8 RCR AL [00137] 022B 7329 JNC IOWSV <0256> [00138] 022D C6050D LNDP6:MOV [DI]B,0D [00139] 0230 47 INC DI [00140] 0231 C6050A MOV [DI]B,0A [00141] 0234 47 INC DI [00142] 0235 81C60700 ADD SI,7 [00143] 0239 81E90700 SUB CX,7 [00144] 023D C3 RET [00145] ; [00146] 023E BB6602 OPSV:MOV BX,OPCDT [00147] 0241 EB1690 JMP TBLSV <0259> [00148] 0244 BB6D02 MRDSV:MOV BX,MRDT [00149] 0247 EB1090 JMP TBLSV <0259> [00150] 024A BB7302 MWRSV:MOV BX,MWRT [00151] 024D EB0A90 JMP TBLSV <0259> [00152] 0250 BB7902 IORSV:MOV BX,IORT [00153] 0253 EB0490 JMP TBLSV <0259> [00154] 0256 BB7F02 IOWSV:MOV BX,IOWT [00155] 0259 8A27 TBLSV:MOV AH,[BX] [00156] 025B 0AE4 OR AH,AH [00157] 025D 74CE JZ LNDP6 <022D> [00158] 025F 8825 MOV [DI],AH [00159] 0261 43 INC BX [00160] 0262 47 INC DI [00161] 0263 EBF490 JMP TBLSV <0259> [00162] ; [00163] 0266 4F50434F4445 OPCDT:"OPCODE [00164] 026C 00 DB 00 [00165] 026D 4D454D5244 MRDT:"MEMRD [00166] 0272 00 DB 00 [00167] 0273 4D454D5752 MWRT:"MEMWR [00168] 0278 00 DB 00 [00169] 0279 492F4F5244 IORT:"I/ORD [00170] 027E 00 DB 00 [00171] 027F 492F4F5752 IOWT:"I/OWR [00172] 0284 00 DB 00 [00173] ; [00174] 0285 8AE0 HXDP2:MOV AH,AL [00175] 0287 D0C0 ROL AL [00176] 0289 D0C0 ROL AL [00177] 028B D0C0 ROL AL [00178] 028D D0C0 ROL AL [00179] 028F E80200 CALL HDP1 <0294> [00180] 0292 8AC4 MOV AL,AH [00181] 0294 240F HDP1:AND AL,0F [00182] 0296 0430 ADD AL,30 [00183] 0298 3C3A CMP AL,3A [00184] 029A 7202 JC HDP12 <029E> [00185] 029C 0407 ADD AL,07 [00186] 029E 8805 HDP12:MOV [DI],AL [00187] 02A0 47 INC DI [00188] 02A1 C3 RET [00189] ; [00190] 02A2 8AF0 DEDP:MOV DH,AL [00191] 02A4 8A15 DEDP1:MOV DL,[DI] [00192] 02A6 47 INC DI [00193] 02A7 3AD6 CMP DL,DH [00194] 02A9 7501 JNZ DEDP2 <02AC> [00195] 02AB C3 RET [00196] 02AC 80FA0D DEDP2:CMP DL,0D [00197] 02AF 7407 JZ CRLF0 <02B8> [00198] 02B1 B402 MOV AH,2 [00199] 02B3 CD21 INT 21 [00200] 02B5 EBED90 JMP DEDP1 <02A4> [00201] 02B8 47 CRLF0:INC DI [00202] 02B9 B402 CRLF:MOV AH,2 [00203] 02BB B20D MOV DL,0D [00204] 02BD CD21 INT 21 [00205] 02BF B20A MOV DL,0A [00206] 02C1 CD21 INT 21 [00207] 02C3 C3 RET [00208] ; [00209] 02C4 BFD002 ENDDP:MOV DI,*ENDT2 [00210] 02C7 32C0 ENDDP2:XOR AL,AL [00211] 02C9 E8D6FF CALL DEDP <02A2> [00212] ; [00213] 02CC B44C REENT:MOV AH,4C [00214] 02CE CD21 INT 21 [00215] ; [00216] 02D0 45 ENDT2:DB 45 [00217] 02D1 4E DB 4E [00218] 02D2 44 DB 44 [00219] 02D3 0D DB 0D [00220] ; [00221] 02D4 45 ERRT:DB 45 [00222] 02D5 52 DB 52 [00223] 02D6 52 DB 52 [00224] 02D7 0D DB 0D [00225] ; 0100-02D7 CRLF =02B9 CRLF0 =02B8 DEDP =02A2 DEDP1 =02A4 DEDP2 =02AC END01 =0191 ENDDP =02C4 ENDDP2 =02C7 ENDT2 =02D0 EREAD01 =018B EREND =01CA ERRT =02D4 HDP1 =0294 HDP12 =029E HEXSB =019E HEXSB2 =01A4 HXDP2 =0285 IORSV =0250 IORT =0279 IOWSV =0256 IOWT =027F LNDP =01D0 LNDP1 =01D3 LNDP6 =022D MRDSV =0244 MRDT =026D MWRSV =024A MWRT =0273 NAME2 =FF04 OPCDT =0266 OPSV =023E READ01 =0161 READ02 =0164 READ03 =0177 REENT =02CC RHNDL =FF00 RNM01 =0111 RNM02 =011F ROPEN01 =0127 ROPEN02 =0135 TBLSV =0259 WHNDL =FF02 WOPEN01 =0140 WRSB =01B4 WRSB2 =01C9 |
バイナリデータを読み込んでそれを8ビット→ASCIIコード2バイトの16進数表示に変換してテキストファイルの形で保存するプログラムです。
ついでにMEMRD、OPCODEなどの説明文字列も付加しました。
●誤動作が見つかりました
以上簡単に説明しました新しいプログラムを使ってMYCPU80の動作記録をとって、それを解析しましたところ、[第23回]でみつかった「おかしなところ」と同じ誤動作がみつかりました。
今回はスタートしてすぐに誤動作が発生しています。
16行〜19行は条件ジャンプ命令(C24100)です。
途中にアドレス0047 データFF が読み出されていますが、はてこれはなんでしょう?
ちょっと気にはなりますが、とりあえずは置いておくことにいたしましょう。
おかしいのはこの命令の次にアドレス007Bに飛んでしまっていることです。
これは[第23回]のときとよく似ています。
本当は次のアドレス0047番地か0041番地にジャンプするべきなのに、007B番地にジャンプしてしまっています。
やはりときどきこのような現象が発生するようです。
どうやらときどきCPU回路内部でジャンプ命令の飛び先アドレスの下位バイトが化けてしまうように思われます。
しかしこれだけでは情報不足です。
もっとデータが欲しい!
MYCPU80でCP/Mを![第27回]
2014.8.30upload
前へ
次へ
ホームページトップへ戻る