@hatsugaiさんのFenestra6502。既存の6502にレジスタウィンドウ的なメカニズムを外付けして、関数呼び出しでの引数/結果の受け渡しに関わるコストを劇的に改善している。
引数の受け渡しおよびローカルな作業エリアはダイレクトページ上に確保し、関数呼び出しとリターンに対応するJSR/RTS命令でこれらの領域がずれて割当てられる。256バイトのダイレクトページは以下の割当て。
%i $00-$3F 呼び出し元からの引数。RTSでもどる前に結果をここに置く。
%l $40-$7F ローカル作業エリア。
%o $80-$BF JSRで呼び出す先の引数を与える。JSR先では%iで参照。
%g $C0-$FF グローバルエリア JSR/RTSで割当ては変化せず。
%i,%l,%o,%gはSPARCアーキテクチャのレジスタウィンドウに合わせた分類で、役割も同様。
JSR前の$80-$BFが飛び先では$00-$3Fに対応する。
他にレジスタウィンドウを持つアーキテクチャはAMD Am29000、Intel i960、Intel Itanium、クヌースのMMIX。HITACHI H16も似たようなメカニズムを持つ。
Fenestra6502の仕組みについて。128Kバイトのメモリについて、$100C0~$1FFFFを65C02のアドレス空間に割り当てている。65C02の$0000~$00BF(192バイト)については外付けの回路でアドレス変換を行い、$00000~をダイレクトページ領域として割り当てている。
アドレス変換はJSR命令で+1、RTS命令で-1するアップダウンカウンタを持ち、ダイレクトページをアクセスするアドレス$0000-$00BFとこのカウンタの値(7bitオフセット:x128)を加算し128Kバイトのメモリ$00000~に変換する。
カウンタは65C02のスタックが256バイトしかないので、0~127の7bitで充分。(JSR命令で2バイトのアドレスをスタックに積むため)
Fenestra6502のハードウェアはW65C02Sと制御用のATMEGA164P、128Kx8 SRAM 628128。GAL 22V10 x2、LS74、LS191 x2、LS283 x2、LS257 x2。10cm x 10cmの基板に収めるのはちょっときびしい気がする。GALを活用すればさらに石の数を減らせるんじゃないかと検討してみた。
Fenestra6502の回路図。(2020/10/14 Rev, 1.2)
検討1:U6 LS74の削減
INSTDEC(GAL 22V10)はJSR/RTS命令をデコードして次段のLS191に対しカウントアップ/ダウンの指示をしている。このカウンターへの指示はLS74で1サイクル分保持されている。この程度ならINSTDECに吸収できそうだ。
FFの初期化のためのRESETを追加。これでU6 LS74をなくすことができる。
検討2:デコーダとカウンタの統合
カウンターは7bitあればよい。これと命令デコード部分を1つのGALでできないか?
SYNC信号は命令フェッチのタイミングを示す。この立ち下がりのタイミングでデータバスに乗る命令をデコードし、そのままカウンタのアップ/ダウンを指示すればいけそうな気がする。SYNC信号を反転してその立ち上がりで動かせばよさそう。こういうのは昔の汎用ロジックの使い方っぽい。SYNC信号は!SYNCOUTとして反転出力し、それをGAL 22V10のCLK入力に与える。
命令デコードは8bitのデータバスを扱うためこれをそのままカウンタ回路につなごうとすると項数オーバーでパンクしてしまう。そこでデコード結果はいったんDU,CTEN出力として割り当て、フィードバックループでぐるっと回して入力信号に与える。
これで命令デコーダとカウンタはGAL 1個に入った。検討1での代わりに使うとLS74、LS191 x2の計3個を削減できる。そのかわりWR/RDなどの信号が扱えなくなるがこれは後で別のGALに追い出す。
検討3:加算器をインクリメンタに変更
カウンタの出力7bitはアドレスA[13:7]に対応する。これにゼロページの変換対象となるアドレス$0000~$00BFが加算されるが、この下7bit A[6:0]はそのままスルーでA[7]のみカウンタの値と加算される。これは全加算器ではなく+1インクリメンタで充分。
A[14]はカウンタの値が繰り上がった時に'1'だけど実質常に'0'。A[15]は常に'0'。
SRAMに与えるアドレスYA7はGALのU4 ADDRDECで生成しているRA7と同等のもの。端子が空いていたので配線の都合がよいように定義しただけ。
インクリメンタが出力するアドレスY15~Y8(ついでにY7)はOEでアウトプットイネーブルの制御を行う。これに65C02からのA15~A8を接続したLS245(新規追加)の出力をSEL信号で選択することによりアドレス変換/無変換後のアドレスをSRAMに与えることができ、LS257 x2を削減できる。
これで従来の加算器とアドレスセレクタはLS283 x2とLS257 x2の4個を削減、GAL +1、LS245+1。
検討4:その他の論理
検討2ではみ出てしまった RAM OEとRAM WEをGAL ADDRDEC(22V10)に押し込む。
これで最終的にGAL 22V10 x3、LS245 x1になった。あとはレイアウトの都合で端子の配置を手直しすればよさそう。
※これは机上での検討のみで実際には作っていませんのでご注意ください。
えっamazonにあるの?


![宇宙空母ギャラクティカ(劇場版1978年) [Blu-ray]](https://m.media-amazon.com/images/I/51BB+TM6wSL._SL160_.jpg)












