intel 8080A 搭載のマイコンボードですが、非常にゆっくりとではありますが、ちょこちょこ遊んでいます。microsoft basic で搭載したI2Cポートをたたいて、RTCを動かせることは確認したのですが、やはり機械語で読み取りをしたいな、ということで、このマイコンボードでのアセンブラやCのプログラミング環境を整えることにしました、(ら、はまってかなり時間が経ってしまった・・・)。
ハードウェアは、こんな感じで、

256kbit SRAMを、8000H-FFFFH, 256kbit EEPROM を0000H-7FFFH に配置しています。IOは0C0H に8251を、0E0HにPCF8574 (I2C interface)を配置しています。あとで、CP/Mを動かそうと思っているのですが、下位のROMをRAMに変更できないといけないんですが、どうやるかはこれから考えるところ。
(写真は、上に書いたもののどれも写ってない!)
CP/Mの開発環境を使うことを念頭に、下記のようなプログラム開発フローを作ろうと考えました。
1) こちらで紹介されているCP/M エミュレーターで、最初のテストを行う。
2) 開発環境は、CP/Mのツールを使う。(smallc など)
3) コンパイル等は、windowsで行い、エミュレーターでテストする。
4) コンパイルは、CP/M のバイナリーを生成するのと同時に、CP/Mと互換のBDOSをROMに書いた8080ボードでも動くようにバイナリーを生成し、Intel Hexをtera term でボードに送り込んで動かす。
このとき、4)のCP/M 互換のBDOSを8080CPUボードで動かすのは、こちらの8085モニターを8080で動くように変更してやることにしました。これは、8080のアセンブラ、逆アセンブラが付いていますので、8080のアセンブラを覚えていない私にとってはちょうどいい感じなので、これで。
このモニタープログラムを8080で動くようにするには、シリアル通信を受信割り込みをかけてやっているので、それをRST7の割り込みで行うように変更するだけでOKなんですが、元のプログラムですと、タイミング悪く受信割り込みがかかると、シリアル受信バッファーのインデックスがずれてしまう問題があったので、修正をしました。
また、私のボードは、割り込みがかかると、必ずRST7に飛んでしまう仕様になっているので、割り込み先をユーザープログラムで乗っ取ることができるようにするために、一旦RAMのアドレスに飛んで、そちらから割り込みハンドラー(シリアルデータ受信ルーチン)にJMPするようにしました。
それから、もとのモニタープログラムでは、Intel Hexのロードはできるようにはなっていませんので、モニタープログラムのsmallcのソースを変更して、load コマンドでIntel Hexの読み込みができるようにしました。
さらに、I2Cインターフェースのチェックなどに便利?と、モニターにIOポートの読み書きコマンド(out, inp) を実装しました。これを実装するときに、Z80と8080の違いを勉強したんですが、8080は、IO関係の命令でレジスタ間接アドレッシングができないので、ROMに命令を置くと、読み書きするIOアドレスが変えられないとわかって、ちょっと不便だな、と思いました。相対ジャンプ命令もないし・・・
プログラム開発環境整備を試行錯誤しつつ、モニタープログラムを書きつつ、デバッグしつつ、で結構時間がかかってしまいましたが一応動くようになりました。
ROMに書き込むプログラムのアセンブルは、zasm オンラインアセンブラーでやっています。8080の命令以外を使っていないかチェックできるし、8080の二モニックに対応しているし、Intel Hexを吐けるしで、結構便利。
ということで、一応できたので、ここにモニターのアセンブラコードをおいておきます。っと思ったんだけど、添付の仕方がわからん・・・
MON80_ASM
これでいいかな?

これはIntel Hexをロードしているところ。チェックサムは一応見ていて、おかしな行が出てきたらアボートし、メモリのどこをいじくったかわかるようにしてます。XON/XOFFのフロー制御は一応うまく動いているようで、エラーは出ませんけど(処理に無駄が多く、速度が200bytes/secぐらいしか出ませんが!)。

これは、IO input, output を試しているところ。