1年前にeBayで買ったまま積んであった4040があったので、これを使った基板を作ってみることにしました。4040は4004と互換性が高く、ピンの配置を変換するアダプタでも作ればそのまま4004実験ボードに搭載してそのまま動かすことができるはずなのですが、せっかくなので拡張された機能も使えるようにします。
ハードウェアに関連する主な拡張機能は次の3つ。
- 割り込み機能
- プログラムメモリ領域が2倍(4KB→8KB)
- シングルステップ実行
割り込みに関しては、通信ポートをポーリングではなく割り込みにするということも考えましたが、8251や6850のような通信用のLSIがあるわけでもなく面倒なので割り込みボタンを1つつけるだけにしました。
ROMのバンクを切り替えるための信号線CMROM1により、プログラムメモリ領域が2倍になりました。4004のときには8080エミュレータにしてもVTLにしても4KBのプログラム領域を使い切って足りなくなっていたのでかなりうれしいです。
シングルステップ実行は、アドレスやデータをラッチして表示したりしないと実用的じゃないし、使い道がいまいちイメージできなかったので信号線だけ出して未実装です。
ソフトウェアに関連する拡張機能には次のようなものがあります。
- サブルーチン用スタックが3段→7段に増加
- RPM命令によるプログラム領域のRAMの値の読み出し
- 論理演算命令(AND, OR)
4004ではサブルーチンのネストが3段しか出来ず、プログラムを書く際の大きな制約になっていたのですが、少しはマシになりそうです。とはいえ、7段では構文解析みたいながっつり再帰的なプログラムには足りそうもないので使い道は限定されますが。
4004では256byteバンク内のメモリ値しか読めなかったので、4004実験機ではあらかじめ全部のバンクの末尾にメモリ値を読むためのサブルーチンを書いておいてそこをコールして読むという曲芸的なことをやっていました。4040ではRPM命令によって4289配下のプログラム領域のメモリの値を読めるようになります。
論理演算も4004ではえらい長いプログラムでなんとか実装していましたが、4040では少しマシになりそうです。
基板を設計するにあたり考慮した点を順不同で書き連ねます。
- データRAMに4002-1を4つ使う構成はプログラムが書き難いので、4002-1と4002-2を各2つづつ使用。(切り替えジャンパは削除)
- UARTのインターフェース部分はフォトカプラではなくTTLに変更。
- 4201を使うとクロックとステップ実行の回路が簡単になるが、入手性が悪く、ステップ実行は実装しないので4004と同様にTTLを使用。
- プログラム領域のRAMはHM62256は入手性が悪いのでHM628128に変更。
- せっかくなので4004を搭載する用のソケットも用意しておく。
こんな方針で回路図を描いて基板を作ってみました。
さっそく組み立てて電源を入れてみたのですが、動かず。デバッグ開始です。
とりあえずクロックを見てみます。SYNC信号と2相クロックが綺麗に出ています。
次はメモリ回り。OEやCSはちゃんと出ていることが確認できたので、新規設計部分の拡張ROM領域関連が怪しい気がしてきました。
とりあえずA0とA12を見てみると、A12の幅が短い気がします。
A12は拡張ROM領域用のアドレス信号で、CMROM0=0のメモリアクセスのときに0、CMROM1=0のメモリアクセスときに1です。とりあえずCMROM0をそのまま出しておけばいいやと思って作っていたのですが、データシートを確認したところ、CMROM0はCPUサイクルのM1でしかアサートされないのでそこでラッチする必要があったのでした。
運良くNANDゲートが2つ余っていたので、CMROM=0で0、CMROM1=0で1になるようなRS-FFを作って修正。空中配線で配線しました。
電源を入れてみるとモニタプログラムが起動。4004に作ったVTLもそのまま動きました。
次は拡張機能部分の動作確認です。段階的に確認していきましたが、最終的に、
- プログラム領域のRAMの読み込みにRPM命令を使用。
- 割り込み時に拡張ROM領域に配置したプログラムにジャンプしてメッセージ表示。
というプログラムが動きました。動画はこちらです。VTLインタプリタでカウント表示ループを実行中にINTボタンで割り込みをかけて、拡張ROM領域に配置したプログラムで"*INT!*"というメッセージを表示しています。
回路図とガーバーデータはとりあえずGitHubに置いてあります。
最後に一言。
4040は確かに4004より強力で、プログラムも書き易そうではあるのですが、いろいろ作っていて感じたのは、4004のときほどのワクワク感は無いなあということでした。
というわけで、4040はこれでクローズして4004に戻ろうかと思います。