CPU実験室

誰も見向きもしない古いCPUをいじって動かしてみようというプロジェクトです

ICUアセンブラ

いまのところ、MC14500のコーディングはExcelを使ったなんちゃってアセンブラでやっていてそれで十分用は足りていたのですが、先日uPD7810のコーディングで汎用アセンブラPROASMⅡのライブラリを見ていたらターゲットを追加するのは何でもないことに気付きました。

今回記述してみたMC14500用ライブラリ 14500.LIBの抜粋です

f:id:O3I:20210904095736j:plain

このボードの命令体系は16ビット長固定で上位4ビットが16種類のインストラクション、下位12ビットが実効アドレスというフォーマット1種類しかないのでマクロで記述するのは全く簡単です。

基本的に(インストラクションコード <<12) | (実効アドレス & 0xFFF)

をワードデータ定義DWに展開するだけで終わってしまいます。他に内部レジスタ、入出力ポートのアドレスを定義しておきました。最後のkillfrontPROASMⅡ独自の疑似命令です。PROASMⅡはネイティブではZ80アセンブラですが、LD/CALL/NOPなどZ80と被るニーモニックZ80側の検索を殺し(KILL)、尚且つZ80コード検索より前(FRONT)にマクロ定義を評価するための指示になります。

 

このライブラリを使用したプログラム例です。先頭の2バイトでコードサイズを埋め込んでいるのはモニタのロードコマンドがこれを見てローディング終了を検知している仕様のためで、他のボードのモニタと同じようにタイムアウトで抜けるように直せば、これは要らなくなります

f:id:O3I:20210904095807j:plain

それ以降、アセンブルのリスティングが表示されていますが、命令ワードがワードデータ定義に展開された結果、リトルエンディアンで表記されているのでちょっと違和感があります。内部表現では上位下位をスワップしておきモニタ側で順番を入れ替えてもいいのですが、当面は支障ありません。

 

ハードウェアの方は部品実装完了しました。パラレル出力のMC14599はたまたま手持ちにあったセラミックパッケージのものに交換してみました。CMOS標準ロジックのセラミック品というのはかなりレアではないでしょうか。1977年製造・・いまから45年も前のものです

f:id:O3I:20210904095821j:plain

古いICに時々見られるのですが1ピンを左下にした時、上の写真のように品番のマーキングの方向がひっくり返っていることがあります。マーキングを見て挿入すると逆刺しになってしまうので要注意です