2014.8.28

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

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


[第25回]


●作ってしまった機械語のプログラムです

このところ本来のテーマからちょいと脱線して修理依頼品のMYCPU80の誤動作の原因の追及作業について書いております。
前回はCPLD(XC95144XL)を使ってMYCPU80の動作をリアルタイムに記録した膨大なデータを解析してやっと誤動作の現場をとらえました。
しかしCPLD(XC95144XL)から送られるデータを当社のBASIC制御ボードZB28Kで受けて、それを画面に表示したものをログファイルとして記録する、という簡便な方法をとったために、わずか320msのデータを記録するのに30分もかかってしまいます。
それじゃあとってもやってられませんということで、覚悟を決めまして、CPLD(XC95144XL)から受け取ったデータを直接バイナリファイルとして保存してしまうことにしました。
というところまでが前回の内容です。

お話の流れとしましては、そのようにして新たに作ったプログラムを使った結果、データの記録時間が大幅に短縮して、その結果分析作業も効率よく進み、ついに誤動作の原因も突き止めることができました、めでたしめでたし、というふうに進んでいくべきでありましょう。
なにしろ本題から脱線して久しいのですから、ここからさらに脱線して、その新たに作成する機械語プログラムの紹介まではしなくてもよいのでは、と私も思いました。
ここは素直にパスすべきと。

が、しかし、やっぱりご紹介申し上げることにいたしました。
どうせ脱線しておるのですから、この際やってしまいましょうというココロであります。
いえ。
機械語でバイナリファイルをセーブするというのはどうやるのだろう、と興味をもたれる方もおいでかと思いまして。
また毎々書いておりますように、当記事は私自身の備忘録を兼ねておりますので、その気持ちでもあります。

前置きはそのくらいにいたしまして、こちらが作成しました機械語のプログラムです。

2014/8/15  10:  mc80trc2.txt
END=408E
              ;;; mycpu80 tracer
              ; 14/8/12 8/15
              ;
                ORG $4004
              ;
                BIN=$0029
                BOUT=$0114
                SP1=$F7FA
              ;
4004 21FAF7     LD HL,SP1
4007 118840     LD DE,SPWK
400A 010600     LD BC,$0006
400D EDB0       LDIR
400F 3E09       LD A,09;extra code
4011 CD1401     CALL BOUT
4014 3E10       LD A,10;wfopen
4016 CD1401     CALL BOUT
4019 3EFF       LD A,FF
401B D382       OUT (82),A;send ready & mycpu80 reset off
401D 216C40     LD HL,RETADRS
4020 7D         LD A,L
4021 CD1401     CALL BOUT
4024 7C         LD A,H
4025 CD1401     CALL BOUT
4028 218E40     LD HL,BFTOP
402B 7D         LD A,L
402C CD1401     CALL BOUT
402F 7C         LD A,H
4030 CD1401     CALL BOUT
4033 218E40   LOOP:LD HL,BFTOP
4036 AF         XOR A
4037 47         LD B,A
4038 77       LOOP1:LD (HL),A;baffer clear
4039 23         INC HL
403A 10FC       DJNZ LOOP1
403C 218E40     LD HL,BFTOP
403F DB84     LOOP2:IN A,(84)
4041 FEFF       CP FF
4043 C26F40     JP NZ,END
4046 DB82       IN A,(82)
4048 B7         OR A
4049 FA3F40     JP M,LOOP2
404C DB80       IN A,(80)
404E 77         LD (HL),A
404F AF         XOR A
4050 D383       OUT (83),A;pc0=0
4052 DB82     LOOP3:IN A,(82)
4054 B7         OR A
4055 F25240     JP P,LOOP3
4058 3E01       LD A,01
405A D383       OUT (83),A;pc0=1
405C 23         INC HL
405D 10E0       DJNZ LOOP2
405F 3E09       LD A,09
4061 CD1401     CALL BOUT
4064 3E11       LD A,11;bfsave
4066 CD1401     CALL BOUT
4069 C32900     JP BIN;wait bfsave end
              ;
406C C33340   RETADRS:JP LOOP
              ;
406F 3E09     END:LD A,09
4071 CD1401     CALL BOUT
4074 3E12       LD A,12;wfclose
4076 CD1401     CALL BOUT
4079 218840     LD HL,SPWK
407C 11FAF7     LD DE,SP1
407F 010600     LD BC,$0006
4082 EDB0       LDIR
4084 31FAF7     LD SP,SP1
4087 C9         RET
4088 00       SPWK:NOP
4089 00         NOP
408A 00         NOP
408B 00         NOP
408C 00         NOP
408D 00         NOP
408E 00       BFTOP:NOP
              ;
BFTOP        =408E  BIN          =0029  BOUT         =0114  
END          =406F  LOOP         =4033  LOOP1        =4038  
LOOP2        =403F  LOOP3        =4052  RETADRS      =406C  
SP1          =F7FA  SPWK         =4088  

それほど長いプログラムではありません。
この程度の短いプログラムなのですが、何をやっているのかよくわかりませんでしょう。
システムに手をつっこんだちょいと特殊なプログラムです。
といいましてもWindowsのシステムではありません。
ZB28Kのシステムプログラムです。
ZB28Kの最下層にある原始的なコマンド、データをホスト(Windowsマシン)と交信するサブルーチンをCALLして使っています。
BIN、BOUTがそれです。
それだけではなくて、このプログラムにはXC95144XLから受け取ったデータをバッファに書き込むところだけあって、それを読み出すところはありません。
バッファはプログラムの最後、408Eから256バイトです。
バッファに書き込んでいるのはLOOP2の部分です。
その先頭のIN A,(84)は強制終了の信号入力をチェックです。
このプログラムはBASICプログラムのサブルーチンですが、データを受信し続ける終わりの無いプログラムですから終らせるには強制終了の仕組みが必要になります。
下が実際に実行中のログです。

DEBUG TOOL FOR KL5C8012
(C)Copyright CHUNICHIDENKO 2000,2001,2004,2005 Rev.1.4
02
t/0302
)Z
>H.
TEXT 5000-5058
ヘンスウ DFD3-DFFF
>.
    10 A=0
    20 OUT $83,$9A
    30 INPUT "OK?"YN$
    40 USR($4004)
>/LD MC80TRC2.BIN,4004
0076BYTES LOAD
>R.
OK?Y
>..................................................................>
>/EXIT 

それにしてもよくわからないプログラムでしょう。
バイナリファイルを作るためにはWindows側のプログラムが必要不可欠です。
いくらなんでもZ80マシンがWindowsのOSに手を突っ込んで、勝手にファイルを作ってしまう、なんてことは出来っこありませんでしょう?
ですので、実はファイル作成の本体部分はWindows側にあるのです。
ZB28KはWindows側のプログラムに、ファイルOPEN、ファイルSAVE、ファイルCLOSEのタイミングを知らせることしかできません。
それは通常は使われていない特殊なコードをWindows側のプログラムに送ることで行なわれます。
09・10がwritefile open、09・11がbuffer full(write file)、09・12がfile closeです。
あ。
これはあくまでWindows側のプログラムとの間だけで決めたローカルなルールです。
Windowsの機能などではありませんからお間違えなく。

説明の途中ですが、本日は時間がなくなってしまいました。
続きは次回にいたします。

MYCPU80でCP/Mを![第25回]
2014.8.28upload

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