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

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


[第291回]



●BASICプログラムからのROM化

前回は短い簡単なプログラム(MC4T2.BIN)をROM化して動作テストを行ないました。
ROMに書いたのはアドレス00〜04のわずか5バイトだけです。
27C256は32KBのメモリサイズがありますが中日電工版4ビットCPU「MYCPU4」ではそのうちの先頭の0000〜00FFの256バイトだけがプログラムエリアになります(これは62256RAMでも同じです)。
もともとは4ビットのプログラムカウンタしかありませんから直接アクセスできるメモリ範囲としては0〜Fのわずか16バイトしかありません。
それではあまりに小さいので中日電工版4ビットCPU「MYCPU4」ではMMU回路によって上記のように00〜FFの256バイトの範囲にアクセスできるように考えました([第273回])。
そのMMU回路の動作テストのためのプログラムも作りました([第279回])。
それまでのテストプログラムと同じようにBASICプログラムを作ってMYCPU4の命令コードをMYCPU4のRAMに書き込んでからそれを実行しました。
MMU回路のテストのためのプログラムなので00〜FFの全範囲にプログラムを書き込みました。
その時点ではMYCPU4のRAM上で動くプログラムでしたが、それを前回と同じようにROM化して実行させてみたいと思います。

プログラムをROMに書き込むためには、まずはそのプログラム(命令コード)をND80Z3.5のRAMのアドレス8000〜80FFの範囲に書いておく必要があります。
前回は短いプログラムでしたからCMコマンドでその作業を行ないました。
今回はアドレス8000〜80FFの範囲に256バイト(本当は最後の部分はちょっと短いので256バイトよりは少しは短いですけれど)の命令コードを書かなければいけません。
昔でしたら256バイト程度のプログラムはCMコマンドを使ってでも書いたものでしたが、さすがに今それをやるかというと、もう少し楽にやりたいなあと思ってしまいます。
世の中便利になると人間はだんだん楽をしようと考えるようになります。
今までのBASICプログラムではA%にメモリアドレスを入れて、B%に命令コードを入れて、そこでサブルーチンをコールすることで82C55を介してMYCPU4のRAMに書き込んでいました。
そのサブルーチンの部分を書き換えれば、82C55にアクセスする代わりにND80Z3.5のRAMのアドレス8000〜80FFに命令コードを書き込むことができそうです。
そこでMMUテストのためのプログラムをROM化する前の第一段階として、もとのBASICプログラムの一部を書き換えてND80Z3.5のRAMに命令コードを書き込むように考えてみました。
その変更作業はND80Z3.5のZB3BASICを起動してもとのBASICプログラムをロードしてから、そのプログラムの一部を書き換えることで行ないましたが、プログラムが長いためにいつものようにわかりやすい形でその作業を画面コピーで見ていただくことができません。
そこで作業の過程を記録したログの一部を見ていただきながら説明をすることにします。

もとのBASICプログラム(MC4T11B.TXT)をロードしました。
logfile nd80zlog\01181428.txt open

ND80ZVに接続しました
0001 0000 - z
1000 00C3 - 
*** nd80z3 basic ****
ndwr2h.bin loaded,from E23F to E535
>/load mc4t11b.txt
    10 'mycpu4 test
    20 'memory write
    30 OUT $83,$80

/LOADを実行するとロードすると同時にプログラムリストが表示されます。
上は/LOAD実行によってリスト表示が開始された直後の部分です。
プログラムが長いと初めの部分はスクロールしてしまうので、このようにログでしか見ることができません。

サブルーチンに対してプログラムの変更作業を行なっているところです。
   500 B%=IN($81)
   510 PRINT HEX$(A%,2),HEX$(B%,2)
   520 RETURN 
data end
>.290-330
   290 OUT $80,A%
   300 OUT $81,B%
   310 OUT $83,1
   320 OUT $83,0
   330 RETURN 
>290poke $8000+a%,b%
>300
>310
>320
>/save mc4t11c.txt
    10 'mycpu4 test
    20 'memory write
    30 OUT $83,$80

MYCPY4のRAMに命令コードを書き込むサブルーチンは行番号290〜330です。
もとのプログラムでは82C55に対するOUT文になっています。
それをND80Z3.5のRAMのアドレス8000〜に書き込むようにPOKE文に変更しました。
行番号300〜320は不要ですから削除しました。
BASICのプログラム変更作業はそれだけで終わりです。
こういうときに「BASICは便利だなあ」とつくづく思います。
そのように変更したBASICプログラムはMC4T11C.TXTというファイル名で保存しました。
/SAVEの実行時もプログラムリストが表示されます。
上のログはその表示が始まった最初の部分までを取り出したものです。

そして今セーブしたばかりのBASICプログラムをもう一度あらためてロードしました。
   500 B%=IN($81)
   510 PRINT HEX$(A%,2),HEX$(B%,2)
   520 RETURN 
>/load mc4t11c.txt,8100
    10 'mycpu4 test
    20 'memory write
    30 OUT $83,$80

上でも書きましたが/LOADを実行すると長々とリストが表示されます。
上のログはそのリストの表示が始まった最初のところだけを取り出したものです。
BASICプログラムを/LOADコマンドで普通にロードすると、そのプログラムはRAMのアドレス8000〜にロードされます。
上で書き換えて作成したBASICプログラムもその時点ではRAMのアドレス8000〜に書かれています。
そのようにして作成した新しいBASICプログラムはRAMの「8000〜80FF」にMYCPU4の命令コードを書き込むようにプログラム変更しました。
そのまま実行すると自分自身を破壊しながらプログラムを実行することになります。
意図的にそのような動作をするプログラムを書くこともありますが、意図的に考えたわけではないプログラムの場合多くはエラーで止まってしまいます。
それを避けるために一旦プログラムをセーブしたあと、同じプログラムを
/LOAD MC4T11C.TXT,8100[Enter]
で再ロードしました。
ファイル名の後ろにアドレスを記述すると指定したアドレスから後ろにプログラムがロードされます。
今回はアドレス8100から後ろにプログラムがロードされますので、それよりも前の8000〜80FFは空き領域になります。

ロード後に念のためHELPコマンド(H.はHELPの省略形です)でロードされたアドレスを確認しました。
   500 B%=IN($81)
   510 PRINT HEX$(A%,2),HEX$(B%,2)
   520 RETURN 
data end
>h.
TEXT 8100-8602
ヘンスウ 2008-DFFF
>r.

break in 270
>dm 8000,80ff
8000  00 10 CF 80 F0 AB CD EF-FF FF FF FF FF FF FF 10  ..マ..ォヘ.........
8010  61 DF 31 20 61 30 21 CF-32 00 02 00 42 F4 42 20  a゚1 a0!マ2...B.B 
8020  62 DF 31 20 61 30 21 CF-44 F4 43 25 00 90 04 30  b゚1 a0!マD.C%...0
8030  63 DF 31 20 61 30 21 CF-00 90 04 05 46 00 02 40  c゚1 a0!マ....F..@
8040  64 DF 31 20 61 30 21 CF-50 00 02 00 0A 00 0D 50  d゚1 a0!マP......P
8050  65 DF 31 20 61 30 21 CF-65 73 74 0D 10 14 00 60  e゚1 a0!マest....`
8060  66 DF 31 20 61 30 21 CF-77 72 69 74 65 0D 11 70  f゚1 a0!マwrite..p
8070  67 DF 31 20 61 30 21 CF-38 30 0D 0C 28 00 09 80  g゚1 a0!マ80..(...
8080  68 DF 31 20 61 30 21 CF-0C 32 00 1C F2 0C 00 90  h゚1 a0!マ.2......
8090  69 DF 31 20 61 30 21 CF-24 30 30 3A 82 22 01 A0  i゚1 a0!マ$00:.".
80A0  6A DF 31 20 61 30 21 CF-1F 37 00 1C F2 0C 00 B0  j゚1 a0!マ.7.....ー
80B0  6B DF 31 20 61 30 21 CF-24 31 30 3A 82 22 01 C0  k゚1 a0!マ$10:.".タ
80C0  6C DF 31 20 61 30 21 CF-1F 3C 00 14 F2 24 00 D0  l゚1 a0!マ.<...$.ミ
80D0  6D DF 31 20 61 30 21 CF-72 65 73 73 3D 6E 30 E0  m゚1 a0!マress=n0.
80E0  6E DF 31 20 61 30 21 CF-24 36 31 3A A2 41 44 F0  n゚1 a0!マ$61:「AD.
80F0  6F DF 31 20 61 30 21 CF-08 F2 3C 00 9A FA 00 03  o゚1 a0!マ..<.....
>/sv mc4t11c.bin,8000,80ff
0100(256)bytes saved

BASICプログラムがロードされたメモリ範囲はTEXTのところで8100−8602と表示されています。
ヘンスウというのはそのBASICプログラムが使用する変数領域です。
今回のプログラムのようにシステムが用意しているA%〜Z%しか使わない場合には正しく表示されませんがエラーではありません。
確認ができたのでRUNコマンドでBASICプログラムを実行しました。
R.はRUNの省略形です。
そのあとMYCPU4の命令コードが正しく書き込まれたかどうかDMコマンドで確認しました。
正しく作成されているようです。
作成されたMYCPU4のプログラムをMC4T11C.BINのファイル名で保存しました。
BASICプログラム(TEXTプログラム)のセーブ、ロードコマンドは/SAVE、/LOADです。
それに対してマシン語のプログラムやバイナリデータなどのためのセーブ、ロードコマンドは/SV、/LDです。

説明が長くなってしまいましたので本日はここまでといたします。
次回は今回作成したプログラムをROMに書き込んでそれをMYCPU4に実装して正しく実行されるかどうかを試してみます。

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

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