トランジスタでCPUをつくろう!
トランジスタで8080をつくってしまおうというまさにびっくり仰天、狂気のプロジェクトです!
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
見事にできましたら、もちろんTK−80モニタを乗せて、それからBASIC、CP/Mを走らせましょう!
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
[第289回]
●プログラムのセーブ、ロード(2)
前回は「RAMにプログラムを書き込むBASICプログラム」を保存する、という方法について書きました。
「間接的な方法」とでも言いましょうか。
BASICを使う方法の利点は命令コードを書き込む行にコメント文でその命令のニーモニックを書くことができる点です。
しかしマシン語のプログラム(勿論MYCPU4の、です)に少し慣れてくるとBASICプログラムによる間接的なプログラミングはちょいともどかしく思えてくるかも知れません。
そこで今回はBASICプログラムを使わないで、ダイレクトにマシン語の命令コードを書き込んで、それをセーブ、ロードする方法について書くことにします。
といってもMYCPU4のRAMに直接命令コードを書くわけにはいきません。
先にND80Z3.5のRAMに命令コードを書いておいて、次にそれをMYCPU4のRAMに書き込む(コピーする)という方法になります。
ND80Z3.5のRAMからMYCPU4のRAMに命令コードをコピーするところはND80Z3.5のRAM上に置いたマシン語プログラムを実行します。
そこのところはやはり「間接的」ですがBASICプログラム方式よりはずっと「直接的」な感じになります。
具体例で説明をします。
今までのBASICプログラムのときと同じようにMYCPU4ボードとND80Z3.5の82C55入出力コネクタを接続してZB3BASICを起動します。
MYCPU4のRAMに書き込むプログラムは前回と同じです。
前回はBASICプログラムの中で記述しましたが今回はND80Z3.5のRAMに命令コードを書きます。
ND80Z3.5のRAMに命令コードを書き込むにはCMコマンドを使います。
書き込む先頭アドレスは8000番地です。
ND80Z3.5のRAMのアドレス8000がMYCPU4のRAMのアドレス00に対応します。
ND80Z3.5のRAMのアドレス8000〜80FFがMYCPU4のRAMのアドレス00〜FFに対応します。
CMコマンドでアドレス8000〜8004に前回と同じ命令コードをCMコマンドで書きました。
そのあと念のためにDMコマンドで確認しました。
念のために確認のためにDMコマンドを使いましたが、この部分は省略してしまっても構いません。
そのようにしてRAMに書き込んだMYCPU4のマシン語プログラムは/SVコマンドで名前をつけて保存しておくことができます。
ここでは
/SV MC4T2.BIN,8000,8004[Enter]
でMC4T2.BINという名前で保存しました。
ND80Z3.5のRAMのアドレス8000〜80FFに書かれた内容をMYCPU4のRAMのアドレス00〜FFにコピーするプログラムはMC4WR.BINです。
/LD MC4WR.BIN,9000[Enter]
でND80Z3.5のRAMのアドレス9000にロードします。
そのあと
JP 9000[Enter]
でMYCPU4のRAMのアドレス00〜FFにND80Z3.5のRAMのアドレス8000〜80FFの中身がコピーされます。
そこまででMYCPU4のRAMにプログラムを書き込む作業は終わりですが、ここでは動作確認のために今MYCPU4のRAMに書き込んだプログラムを読み出してND80Z3.5のRAMに書き込んでみます。
MYCPU4のRAMからND80Z3.5のRAMにコピーするプログラムはMC4RD.BINです。
/LD MC4RD.BIN,9100[Enter]
でND80Z3.5のRAMのアドレス9100にロードします。
MYCPU4のRAMのアドレス00〜FFの値を読み出してND80Z3.5のRAMの8000〜80FFに書き込みます。
そのままではMC4WR.BINとMC4RD.BINが正しく実行されたかどうかがわかりません。
そこで確認のためにCMコマンドで8000〜8002の内容をFFに書き換えてから
JP 9100[Enter]を実行しました。
JP 9100[Enter]を実行したあとの画面です。
DMコマンドで8000〜800Fの内容を確認しました。
上で8000〜8002の値をFFに書き換えましたが、最初にMYCPU4のRAMに送った命令コードに書き換わっています。
以上の操作でMC4WR.BINとMC4RD.BINが正しく働いたことが確認できました。
MC4RD.BINは動作確認のために作ったプログラムですから通常は必要ありません。
MC4WR.BINの実行によってMYCPU4のRAMに書き込んだプログラムはND80Z3.5に接続したまま今までのBASICプログラムによる方法を実行したあとと同じ手続きでステップ動作やSLOW、実クロック動作をさせることができます。
今までの回では
OT 83,92
OT 82,F4
のあと
OT 83,08
OT 83,09
でMYCPY4をリセットしたあと
OT 83,07
OT 83,06
を繰り返すことでステップ動作をさせました。
またこのときSP1の設定をSLOWまたはCLKにしておくことでSLOW動作や実CLOCKで実行させました。
それと同じこともできますが、上の画面のように
OT 83,92
OT 82,FC
と入力したあとMYCPU4のMEM/CLOCK回路基板のリセットスイッチを押してリセットし、(SP1をSTEPに設定していれば)ステップスイッチを押すことでステップ動作をさせることができます。
またSP1の設定をSLOWまたはCLKにしておけば、リセットスイッチを押したあとSLOW動作や実CLOCKで実行させることができます。
そういう使い方については今までは説明していませんでしたが今までの説明のようにBASICプログラムを使ってMYCPU4のRAMに命令コードを書き込んだ場合でも、BASICプログラムを実行したあとで
OT 83,92
OT 82,FC
と入力したあとMYCPU4のMEM/CLOCK回路基板のリセットスイッチやステップスイッチを操作してプログラムを実行させることができます。
今回使ったマシン語プログラムのアセンブルリストです。
こちらはMC4WRです。
2021/1/17 10:36 mc4wr.txt END=901A ;;; mycpu4 data copy(write) ;;; from nd80z3.5 ram to mycpu4 ram ; 21/1/17 ; ORG $9000 ; REENT=$1033 ADRS=$8000;to $80FF ; 9000 3E80 LD A,80;PA,PB,PC out 9002 D383 OUT (83),A 9004 210080 LD HL,ADRS 9007 7D LOOP:LD A,L 9008 D380 OUT (80),A 900A 7E LD A,(HL) 900B D381 OUT (81),A 900D 3E01 LD A,01 900F D383 OUT (83),A;data write 9011 3D DEC A 9012 D383 OUT (83),A 9014 2C INC L 9015 C20790 JP NZ,LOOP 9018 C33310 JP REENT ; ADRS =8000 LOOP =9007 REENT =1033 |
こちらはMC4RDです。
2021/1/17 10:43 mc4rd.txt END=9115 ;;; mycpu4 data copy(read) ;;; from mycpu4 ram to nd80z3.5 ram ; 21/1/17 ; ORG $9100 ; REENT=$1033 ADRS=$8000;to $80FF ; 9100 3E82 LD A,82;PA,PC out PB in 9102 D383 OUT (83),A 9104 210080 LD HL,ADRS 9107 7D LOOP:LD A,L 9108 D380 OUT (80),A 910A D381 OUT (81),A 910C DB81 IN A,(81) 910E 77 LD (HL),A 910F 2C INC L 9110 C20791 JP NZ,LOOP 9113 C33310 JP REENT ; ADRS =8000 LOOP =9107 REENT =1033 |
どちらもZ80アセンブラで作成しましたが8080でも実行できる命令のみで作成しましたので、アセンブル後のバイナリファイルは今回の説明と同じ操作でND8080でもロードして実行することができます。
今回のMC4WR、MC4RDを含めて、今までの回で説明をしてきましたBASICプログラムはすべてMYCPU4組立キットの附属CDROMに収録するつもりです。
それらのプログラムをND80Z3.5やND8080をUSB接続して使うときのWindowsのフォルダにコピーしていただければ、今まで各回で説明してきたことと同じことを簡単に実行して体験していただくことができると思います。
トランジスタでCPUをつくろう![第289回]
2021.1.19upload
前へ
次へ
ホームページトップへ戻る