VTLを実装しようとプログラムを書き始めたのですが、メモリが足りない気がしてきました。もともと、6800や8080で768byte~1KBというようなプログラムなので、8bitの比較にすら数バイトかかる4004では2~3KBぐらいは欲しいところです。
軽微な(とはいっても数日かかりましたが)修正でメモリを増やす余地があることはわかっていたので、先にそちらをやることにしました。急がば回れです。
先日の記事(Intel 4004 (その9) メモリ領域へのアクセス)に書いたように、プログラムメモリのRAM領域が思ったように使えていませんでした。原因は、メモリ書き込み命令(WPM)が256byteのページ内に限定されていることです。
RAM領域にバンク切り替えを実装して、空いた空間をROM領域にするための改修を行いました。
まずは予備実験。4002のポートから3bit取り出して6116のA8~10に継げてみました。4004のポートはデータシートによるとH("0")が+5V、L("1")が-1.5~-7V。実測してみると-4Vぐらいなので、クランプ用ダイオード1N4148と電流制限用の10kΩの抵抗を付けました。1N4148のVfが実測で0.6Vぐらいあって、Lが-0.6Vぐらいになります。6116の定格がmin-0.5Vなのでちょと気になったのですが、このぐらいなら大丈夫なようでした。あと、"0"、"1"のHLが逆ですがRAMへのアドレス入力なのでまあいいでしょう。
![](https://blogimg.goo.ne.jp/user_image/04/ba/81893b8e5e3d31101048c9c74a662e70.png)
動作しているところの写真を撮り忘れましたが、すんなり256byte x 8バンクで動作しました。
これでAddress=F00H~FFDH、BANK=0~7の物理RAM領域が出来たのですが、BANK=0~Fにできると、アドレスのbitの順番を入れ替えて000~FD0Hの論理的なメモリ領域を作り易いです。(実は、そのようなことをVTLの移植中に気がついたので、メモリ周りの改修を始めた次第です。)
6116(2048x8bit)はアドレスバスが11bitしかないので、16バンクにするにはもう1組増設する必要があります。一方、4289との接続が4bitなので8bit幅の半分を使わないというもったいない使い方をしています。
調べてみると、HM6268という4096 x 4bitのメモリがあることがわかりました。アドレス12bit、データ4bitなので、これ2つに置き替えれば無駄無く綺麗に作れそうです。
![](https://blogimg.goo.ne.jp/user_image/75/30/7032fa58cd3ab6d0943022597e92980f.png)
良く見ると~OEがありません。I/OをHi-Zにするのは~WEで済ませるようです。そんなので大丈夫かなあと不安になったのですが無いものは仕方ありません。大丈夫なのでしょう。
アドレスバスの順番が6116とだいぶ違うのですが、ブレッドボードの既存の配線を利用するためにバスは順不同で継げました。バンク指定も下位bitのA0~3とかになっています。まあ、RAM (=Random Access Memory)なので動作に問題は無いですが、気持ちが悪いので基板を作るときに修正するつもり。今の接続はこんな感じです。
![](https://blogimg.goo.ne.jp/user_image/70/5b/1a3287a9b14915a30e42cc1ad3c0712a.png)
次はROM領域の拡大。C3(アドレスのMSB)をチップセレクトに使って、000H~7FFHをROM、800H~FFFHがRAMにしていたのを、000H~EFFHをROM、F00H~FFFHをRAMに変更します。
2716(or 28C16)では容量が足りなくなるので2764/256、28C64/C256を使うことにしました。容量的には2732で十分なのですが、部品の入手性(特にEEPROMの)を考えると64や256の方が良さそうだったので28pin対応にしました。
ROM周辺の回路図はこんな感じ。ROMの1番ピンが部品によって違っていて、
2764/256はVpp(+5V)、28C64はBUSY出力、28C64BはNC、28C256はA14
なのですが、4KBしか使わないのでデフォルトでプルダウン、2764/256はVpp=5Vにジャンパ接続します。27番ピン27256だとA14、その他は~WEか~PGMなので、デフォルトでプルアップ、27256のときだけGNDに落とすようにします。
![](https://blogimg.goo.ne.jp/user_image/6c/63/fc883d0ba0dc9e569c0a2ec3abe2e90a.png)
~CS_ROMと~CS_RAMの生成でインバーターが1個だけ足りなくなってしまったのでLS04を1個追加。場所が無いので小さい基板で増築。ついでなのでLS02のNORをインバーターに使っていたのをLS04に付け替えました。
メモリ周辺の回路全体はこんな感じになりました。
![](https://blogimg.goo.ne.jp/user_image/27/c0/43c740d908e9d31e1636d34634542e2a.png)
これに従ってブレッドボード上を改築したのが冒頭の画像です。
動くかどうか心配だったのですが、意外にもすんなり動きました。簡易にテストするプログラムを書いて確認。ROM領域は256byte毎の15ページにプログラムを配置して実行。RAM領域はバンクを切り替えながら同じアドレスに違う値を書き込んで、ちゃんと正しい値が(上書きされずに)書かれていることを確認をしました。この画像は16byte×16バンクを表示したもので、全体ではこの16倍のRAMがあります。
![](https://blogimg.goo.ne.jp/user_image/28/28/eefdc874e75758c804fd66f36a182a98.jpg)
3.75KBのROM領域、4KBのRAM領域が確保できました。ここのRAMは主に入力バッファやVTLのプログラム領域(VTL言語で書かれたプログラムを格納する領域という意味です)とし、変数や演算用のメモリは4002の方のデータ領域(レジスタ)を使って作る予定です。
軽微な(とはいっても数日かかりましたが)修正でメモリを増やす余地があることはわかっていたので、先にそちらをやることにしました。急がば回れです。
先日の記事(Intel 4004 (その9) メモリ領域へのアクセス)に書いたように、プログラムメモリのRAM領域が思ったように使えていませんでした。原因は、メモリ書き込み命令(WPM)が256byteのページ内に限定されていることです。
RAM領域にバンク切り替えを実装して、空いた空間をROM領域にするための改修を行いました。
まずは予備実験。4002のポートから3bit取り出して6116のA8~10に継げてみました。4004のポートはデータシートによるとH("0")が+5V、L("1")が-1.5~-7V。実測してみると-4Vぐらいなので、クランプ用ダイオード1N4148と電流制限用の10kΩの抵抗を付けました。1N4148のVfが実測で0.6Vぐらいあって、Lが-0.6Vぐらいになります。6116の定格がmin-0.5Vなのでちょと気になったのですが、このぐらいなら大丈夫なようでした。あと、"0"、"1"のHLが逆ですがRAMへのアドレス入力なのでまあいいでしょう。
![](https://blogimg.goo.ne.jp/user_image/04/ba/81893b8e5e3d31101048c9c74a662e70.png)
動作しているところの写真を撮り忘れましたが、すんなり256byte x 8バンクで動作しました。
これでAddress=F00H~FFDH、BANK=0~7の物理RAM領域が出来たのですが、BANK=0~Fにできると、アドレスのbitの順番を入れ替えて000~FD0Hの論理的なメモリ領域を作り易いです。(実は、そのようなことをVTLの移植中に気がついたので、メモリ周りの改修を始めた次第です。)
6116(2048x8bit)はアドレスバスが11bitしかないので、16バンクにするにはもう1組増設する必要があります。一方、4289との接続が4bitなので8bit幅の半分を使わないというもったいない使い方をしています。
調べてみると、HM6268という4096 x 4bitのメモリがあることがわかりました。アドレス12bit、データ4bitなので、これ2つに置き替えれば無駄無く綺麗に作れそうです。
![](https://blogimg.goo.ne.jp/user_image/75/30/7032fa58cd3ab6d0943022597e92980f.png)
良く見ると~OEがありません。I/OをHi-Zにするのは~WEで済ませるようです。そんなので大丈夫かなあと不安になったのですが無いものは仕方ありません。大丈夫なのでしょう。
アドレスバスの順番が6116とだいぶ違うのですが、ブレッドボードの既存の配線を利用するためにバスは順不同で継げました。バンク指定も下位bitのA0~3とかになっています。まあ、RAM (=Random Access Memory)なので動作に問題は無いですが、気持ちが悪いので基板を作るときに修正するつもり。今の接続はこんな感じです。
![](https://blogimg.goo.ne.jp/user_image/70/5b/1a3287a9b14915a30e42cc1ad3c0712a.png)
次はROM領域の拡大。C3(アドレスのMSB)をチップセレクトに使って、000H~7FFHをROM、800H~FFFHがRAMにしていたのを、000H~EFFHをROM、F00H~FFFHをRAMに変更します。
2716(or 28C16)では容量が足りなくなるので2764/256、28C64/C256を使うことにしました。容量的には2732で十分なのですが、部品の入手性(特にEEPROMの)を考えると64や256の方が良さそうだったので28pin対応にしました。
ROM周辺の回路図はこんな感じ。ROMの1番ピンが部品によって違っていて、
2764/256はVpp(+5V)、28C64はBUSY出力、28C64BはNC、28C256はA14
なのですが、4KBしか使わないのでデフォルトでプルダウン、2764/256はVpp=5Vにジャンパ接続します。27番ピン27256だとA14、その他は~WEか~PGMなので、デフォルトでプルアップ、27256のときだけGNDに落とすようにします。
![](https://blogimg.goo.ne.jp/user_image/6c/63/fc883d0ba0dc9e569c0a2ec3abe2e90a.png)
~CS_ROMと~CS_RAMの生成でインバーターが1個だけ足りなくなってしまったのでLS04を1個追加。場所が無いので小さい基板で増築。ついでなのでLS02のNORをインバーターに使っていたのをLS04に付け替えました。
メモリ周辺の回路全体はこんな感じになりました。
![](https://blogimg.goo.ne.jp/user_image/27/c0/43c740d908e9d31e1636d34634542e2a.png)
これに従ってブレッドボード上を改築したのが冒頭の画像です。
動くかどうか心配だったのですが、意外にもすんなり動きました。簡易にテストするプログラムを書いて確認。ROM領域は256byte毎の15ページにプログラムを配置して実行。RAM領域はバンクを切り替えながら同じアドレスに違う値を書き込んで、ちゃんと正しい値が(上書きされずに)書かれていることを確認をしました。この画像は16byte×16バンクを表示したもので、全体ではこの16倍のRAMがあります。
![](https://blogimg.goo.ne.jp/user_image/28/28/eefdc874e75758c804fd66f36a182a98.jpg)
3.75KBのROM領域、4KBのRAM領域が確保できました。ここのRAMは主に入力バッファやVTLのプログラム領域(VTL言語で書かれたプログラムを格納する領域という意味です)とし、変数や演算用のメモリは4002の方のデータ領域(レジスタ)を使って作る予定です。