30年以上ずっと未完成のまま放置していたラッピングで作ったZ80ボードを動くようにしてみました。
ラッピングと言っても今の人は分からないと思うので説明すると、足の長いICソケットなどにワイヤーを巻きつけて配線する方法になります。
最近は個人でもCADで回路を書いて、プリント基板が発注できる時代ですが、人と同じことをするのが嫌いな性分なので、ラッピングで完成させてみたいと思いました。
基板はサンハヤトのICB-97です。
以前はこの基板でCP/Mを動かしたいと思っていたのですが、CP/M 8266を作ったのでCP/Mではなく単純に起動することを目指します。
もともとクロックは水晶と74LS04で作っていたのですが、ストックに4Mの水晶発振器があったので、それを使うことにしました。またリセット回路はハムフェアーで手にいれたジャンク袋にはいっていた、MN1280を使うようにしました。発振回路とリセット回路はディスクリートで作ると結構トラブル多いです。
余談ですが、MN1280はもう一つあり、部品無しのAKI-80でS-8054の代わりに使ってみようと思います。
ROMは以前秋月で取り扱いのあったEN29F002T(Flash)を使用することにしました。
当初はROM 8KでSRAM 8Kくらいを考えていたと思うのですが、同じ28ピンの32KのSRAMがストックにありそれを使うことにしました。
Z80を使ったマイコンの製品はほとんどDRAMを使ったものでした。これはDRAMの方が安かったからです。しかしDRAMは取り扱いが面倒なので自作やキットではSRAMを使うことが多かったです。
またROMはFlashを使い前半の32K分にすることします。
ボードはDIP 28PinのソケットになっているのでPLCC32への変換基板をつくってみました。
オープンソースのflashromで焼きます。
I/Oを使わず簡単に動作確認する方法を考えてみました。
Z80にはHALT(18)という端子があり、これはHLT命令が実行されるとLowになります。
ORG 0
HLT
をアセンブルしてbinを作ってddコマンドでflashのサイズにして、焼いてみます。データはこんな感じです。
0000000 76 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
*
0040000
うまくいきません。調べてみたところメモリのソケットは二つ用意してあるのですが、A14のピンがROMとRAMで違いました。
これを直したところ、HALTがLowになりました。
自作のロジックテスターはマイコン雑誌のRAMで連載されいてたΛ-1の製作記事に掲載されいたものだったと思います。
めでたしめでたし。
ご丁寧にKELの64ピンの拡張コネクタまで付けてあります。本体が動いたら、なにか別のCPUを積もうとしていた様な記憶があります。
とりあえず空きのDIP 40Pinに8255乗っけてみました。80年台に秋葉原にあった三菱の代理店だった亜土電子で購入したものだったと思います。
この写真はビルの右側の側面のようです。
820400とあるので1982年4週の製造だと思われます。
80年代にすでに秋月はありましたが、この頃の秋月はジャンクやキット屋さんで、マイコンはやってなかったと思います。と思ったのですが、当時のマイコン誌にメモリチップなどのリストの広告があったので、若干は取り扱いがあったのかもしれません。とはいえ、当時はマイコン関係の取り扱いは亜土電子が一番だったと思います。
テストプログラムはこんな風にしました。asm8080を使うのでZ80のニモニックではなく8080のニモニックです。
Zilogが作ったZ80はIntelの8080の完全互換でしたが、アセンブラのニモニック(記述方式)は完全に違うものでした。おそらくZilogは命令体系にも特許が効くのではないかと考え、訴えられないようにしようとしたのかもしれません。昨今は命令自体に特許は存在しないという考え方になっているようです。今から考えると不思議な感じですが、マイコン初期の頃ゆえだったのかもしれません。
INTELニモニックでAレジスタに直値を入れるのは
MVI A, 80H
ですが、Zirogでは
LD A, 80H
となります。
とりあえず、INTELニモニックでPORTAの0につないだLEDでLチカしてみます。
ORG 0
LXI SP, 0FFFFH
MVI A, 80H
OUT 07H
LOOP1
MVI A, 1
OUT 04H
MVI D, 80H
CALL WAIT
MVI A, 0
OUT 04H
MVI D, 80H
CALL WAIT
JMP LOOP1
WAIT
DCR D
JNZ WAIT
RET
最初はSPを設定せずCALLも使用しないでROMだけで完結するプログラムを試して、うまくいったので上のようにSPを設定してCALLの時に戻りアドレスをRAMに保存してちゃんと動くかをテストしました。
電流を測ってみたところ115mAくらいでした。
ラッピングのワイヤーが30年前のもので経年変化か巻きつけると折れてしまうようになってしまい、あまり複雑なものは作れなそうです。
なぜかEN29F002やA29002Tの書き込みが異常に遅い。書けてはいるようなのですが、何か間違えているような気がします。
チップ | 種類 | 容量 | 書き込み | 備考 |
---|---|---|---|---|
EN29F002(A)(N)T | Flash | 256K | 3270秒 | |
W29C512A | Flash | 64K | 105秒 | |
SST29EE010 | EEPROM | 128K | 170秒 | UNTESTED |
A29002T | Flash | 256K | 12681秒 |
OpenSrouceでMacでも使えるZ80のクロスアセンブラは以下のようなものがあるようです。
Macro-80に一番近いようなのですが、単一ファイルしかバイナリにできません。複数ファイルで構成される場合それぞれを--relでアセンブリしてオブジェクトを作り以下のコマンドでリンクすることができます。
zasmはCP/M上のセルフのコマンドもありましたが、別物です。開発が続いていて、なんだかえらい大掛かりになってます。
-
sdasz80(sdcc)
http://sdcc.sourceforge.net/ -
The Macroassembler AS
http://john.ccac.rwth-aachen.de:8000/as/
Cコンパイラーなども含む開発キットでz80asmというアセンブラが入っています。CP/M上のz80asmとは別物のようです。
8080の命令に比べるとZ80で追加された命令は、ちょっとわかりにくいものがあります。パフォーマンスやプログラミングのために小細工した命令のようにも見えます。