2014.8.30

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

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

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