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

トランジスタでCPUをつくろう!
トランジスタで8080をつくってしまおうというまさにびっくり仰天、狂気のプロジェクトです!
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
見事にできましたら、もちろんTK−80モニタを乗せて、それからBASIC、CP/Mを走らせましょう!
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆


[第276回]



●MMU回路(3)動作テスト(その2)全メモリ範囲を対象にしたテストプログラム

[第274回]では簡単なテストプログラムを作ってMMU回路の動作テストを行ないました。
中日電工版のHCMOSIC版4ビットCPU回路ではCPUの外に32KBのSRAMを配置しています。
PC(プログラムカウンタ)が4ビットなので、メモリをアクセスできるアドレスは0〜Fのわずか16バイトしかありません。
それではあまりにさびしいのでMMU回路によってRAMのアドレス0000〜00FFの256バイトをアクセスできるように考えました。
上位8ビットは00なのでこれは単純にRAMのアドレスA14〜A8をGNDに落としてあります。
CPU回路のPCからA3〜A0を出力します。
MMU回路からはその上位のA7〜A4を出力します。
つまりMMU回路によってRAMアドレスの0X〜FXの16バンクを切り換えることで00〜FFのメモリ範囲にCPUがアクセスできる仕組みです。
[第274回]のテストではリセット後にバンク0のアドレス0からスタートしたあとプログラムによってバンク1にアクセスしたところまでをステップ動作でテストしました。
うまくメモリバンクの切換えが行なわれましたのでそれでとりあえずは動作のテストはできたことになります。
しかしそのほかのバンク2〜バンクFについてもうまく切り換えてアクセスできるかどうかまでテストしたわけではありません。
多分大丈夫でしょう、ということなのですが。
念には念を入れて、ということでもありますし、せっかく256バイトのメモリ範囲までならプログラムできるはずですから、もう少し複雑なプログラムを作って16バイト×16バンクの全体をアクセスしてみることにしました。

下の左側のリストはいつものようにND80Z3.5のZB3BASICを使ってRAMにテストプログラムを書き込むための「プログラム」です。

ちょっと見ただけでは何をやっているのかわかりにくいと思いますのでまずはどういうプログラムなのかという説明をします。
最初にAレジスタを0クリアしてバンク0からスタートします。
CPUをリセットすると必ずバンク0のアドレス0からプログラムがスタートします。
次にアドレス0Fにジャンプします。
アドレス0Fにはバンクを切り換えるためのアドレスデータとして10を書いておきます。
そこでバンク1に切り換わってアドレス10の命令が実行されます。
アドレス10にはADD A,1の命令コードを書いておきます。
アドレス11にはアドレス1FへのJMP命令(命令としてはJMP F)を書いておきます。
アドレス1Fにはバンクを切り換えるためのアドレスデータとして20を書いておきます。
そこでバンク2に切り換わってアドレス20の命令が実行されます。
アドレス20にはADD A,2の命令コードを書いておきます。
アドレス21にはアドレス2FへのJMP命令(命令としてはJMP F)を書いておきます。
アドレス2Fにはバンクを切り換えるためのアドレスデータとして30を書いておきます。
アドレス30にはADD A,3の命令コードを書いておきます。
以下同様にしてバンクFまでプログラム命令を書いていきます。
アドレスF0にはADD A,Fの命令コードを書いておきます。
アドレスF1にはアドレスFFへのJMP命令(命令としてはJMP F)を書いておきます。
アドレスFFには0バンクに戻るためのアドレスデータとして02を書いておきます。
アドレス02にはOUT Aを、そしてアドレス03にはHLTを書いておきます。
このプログラムを実行するとAレジスタには1+2+3+4+…+E+Fの計算結果(の下位4ビット)が入れられ、最後にそれがOUTポートに出力されます。
1+2+3+4+…+E+Fは1+2+3+4+…+14+15ですからその計算結果は120(78H)になります。
ですからプログラムが正しく実行されればAレジスタには8が入るはずです。

正攻法でプログラムを書くならば上記の説明の通りに各メモリアドレスにそれぞれの命令コードを書いていくことになるのですが、せっかくBASICを使ってメモリに命令コードを書いていますから、生真面目に1バイトずつメモリに命令コードを書くのではなくてメモリアドレスごとに対応する命令コードをBASICプログラムを使って生成してメモリに書き込むようにしました。
最初のバンク0だけは他のバンクと異なりますから1バイトずつ書いています。
バンク1〜バンクFまでは行番号140〜250のプログラムループで書き込んでいます。

本日は時間がなくなってしまいました。
次回にそのようにしてRAMに書き込んだプログラムを実際に実行したところをお見せすることにいたします。

トランジスタでCPUをつくろう![第276回]
2020.12.11upload

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