Z80 CPUに割り込みコントローラー8259をつなぐ

前回、80系割り込みコントローラー8259をSBC8080バスにつなぐボードを作りましたが、SBC8085とは正しく接続できるものの前々回のKZ80-CPUB(Z80 CPU)のINTA信号発生回路では割り込みコントローラー8259は正しく動作しませんでした。

8085CPUとZ80 CPUの割り込み動作の違い

Z80の解説本などの割り込みの章では「割り込み要求を受け付けた後、RST命令やCall命令をデータバスから読み込みます」という記載があるので、Z80と8080/8085の動作は同じだと思いこんでいました。
ところが、以下のz80.infoさんの資料(ザイログの資料っぽい)の3-132ページあたりを読むと…

http://www.z80.info/zip/ZilogProductSpecsDatabook129-143.pdf

要約すると以下のようなことのようです。

  • Z80とインテル8080の割り込みモード0(ゼロ)の動きはフルコンパチではない。
  • 8259割り込みコントローラーはINTA信号を3つ期待しているが、Z80は1回しか出さない。→これだとCall命令はCPUに渡るがCall先番地の2バイトの情報が渡らない
  • 同じような動作をさせるとしたら、8080 CPUの動き(割り込みアクノリッジサイクル)をシミュレートしてあげる追加回路が必要。

割り込みモード0(ゼロ)は8080/8085 CPUとフルコンパチと思い込んでいたのでちょっとショックでした。^^)

INTA信号追加回路

上記のz80.infoさんの情報にロジックICを組み合わせて作ったINTA信号追加の参考回路が出ていました。前々回のKZ80-CPUBへ追加した回路に更にICを3つ追加するとできそうです。ひとまずKiCADで回路図を引いてみました。

もともとINTA信号をつくるのにORゲート(74HC32)を追加済みでしたので、ANDゲート(74HC08)、Dフリップフロップ(74HC74)、DUAL 1-OF-4 DECODER(74HC155)があれば良い感じです。ちなみに元資料では74HC155(74LS155)の配線が間違ってる気がします…..

回路の説明もz80.infoさんの資料に出てましたが、わたしの言葉で意訳すると(間違ってるかも)こんな感じです。

  • 割り込みアクノリッジサイクルにはいると、ORゲートでデコードされたINTA信号が8259へ届くと同時に、74HC74フリップフロップをセットします。(つまり、出力端子QがHレベル、QがLレベルの出力になります)
  • つづくメモリー読み出しサイクルの際にこの回路で8259へのINTA信号が2つ出力されます。またメモリーへのRD信号はマスクされます。(これはHC155で止める形です)
  • つづいてメモリー書き込みサイクルにはいりWR信号によって74HC74フリップフロップがリセット(出力端子QがLレベル、QがHレベルの出力になります)されて割り込みアクノリッジサイクルが終了します。(Call命令なのでスタックプッシュが続けて発動することに依存している模様です)

Z80は割り込み要求を受け付けたあとINTA信号(割り込みアクノリッジ)を1つだけ出すので、前々回のような1バイトのCall命令であるRST命令であれば問題ありませんが、Call命令の場合はCall先アドレスをメモリーから取得しにいく挙動になってしまうようです。本来は8259割り込みコントローラーからCall先を取得したいのでINTA信号(割り込みアクノリッジ)を2つ出すように工夫した回路になっているということのようです。(メモリー読み出し信号をINTA信号(割り込みアクノリッジ)へ変換している)

試作してみた

前々回のKZ80-CPUBの裏側に74HC32 SOP(表面実装)タイプICを瞬間接着剤wではりつけたものに、追加で3つのICを貼り付けて回路図通り配線してみました。

実は、はんだ付け不良に気づかず一発ではうごかなかったのですが….
最終的にははんだ付け不良箇所をしっかりつけなおして安定稼働させることができました!!

KZ80-CPUB REV2を3月に発注したあとにこの事象に気づいたため、githubにあがっている リリース2.0 の回路図、プリントパターンは8259割り込みコントローラーでは動かず、ロジック回路版の割り込みコントロール回路(RST命令出力)にしか対応していないのでした。近日REV2.1を作成する際にはこの回路を取り込もうと思います。

広告

SBC80系 シリアル入力の2系統対応(2)〜8259編

前回の記事ではロジックICによるハードウェア割り込みコントローラーを構成しましたが、インテル80系にはプログラマブル割り込みコントローラー 8259がありますので、こんどはそちらでシリアル2系統化してみたいと思います。

回路について

ユニバーサルボードで試作した回路図は以下のような感じです。ほぼSBC8080バスに割り込みコントローラー8259とプログラマブルタイマー8254をぶら下げたかたちになっています。

  • 8259の割り込み入力のIR7とIR6へはシリアルA/Bを接続します。前回つくったロジックICの割り込み制御回路と互換性を維持するためです。(ROMをなるべくいじりたくなくて….) また、8254タイマーICの出力はIR5〜3へ接続しました。
  • 8259にはアドレスバスA0が接続されています。コマンドによってI/Oアドレス40hと41hを使い分けます。
  • アドレスデコーダーはいつもの74HC138で、今回はイネーブル端子(E1、E2、E3)にA7〜A6を入れてI/Oアドレス40h台に小さめに割り付けてみました。
  • 74HC74 Dフリップフロップは7.3728MHzを4分周するのにつかっています。プログラマブルタイマー8254のクロックにはそのくらいの周波数の方がいいかなと。
  • 8254のG端子(GATE)は全部10kΩでプルアップしちゃいました。これはPC-9801とかPC/ATとかでこんな感じの回路になっていたのを真似しました。(細かいコントロールはいらないかなと….)
  • ちなみに、今回実験したのはシリアルLSI 8251×2+割り込みコントローラー8259で2シリアルで動くかというところなので、8254を動かした記録は別記事でまとめる予定です。

割り込みコントローラー8259の動き

割り込みコントローラー8259は、割り込み入力ピンIR0〜IR7に割り込み要求(Hレベル)が来ると、CPUの割り込み要求(INT)をHレベルにします。

CPUは割り込みを受け付けるとINTA出力をLレベルにして応答してきます。8259はそれを受けると割り込み入力ピン(IR0〜IR7)に応じたCall命令(CDh)+Call先アドレス下位1バイト+Call先アドレス上位1バイトの3を順にデータバスに応答します。

CPUはデータバスよりCall命令とアドレスをフェッチして該当のアドレスをCallします。前回は1バイトのRST命令をロジックICでデータバスに載せましたが、8259はCall命令を乗せることができるので64kバイトのどこのアドレスでもジャンプできます。

ただし、「どこでも」と言いつつ後述するように起点となる割り込みベクタアドレスの上位ビットをプログラムでセットするので、ジャンプできる場所は割り込み入力に対して4バイト単位、8バイト単位の範囲に限定されます。自由自在にCallアドレスを決定できるわけではありません。アドレス上位ビットをすべて0(ゼロ)にして8バイト単位に割り込みベクタを設定した場合は以下のようなイメージとなります。

割り込みコントローラー8259の初期化

割り込みコントローラー8259はデータシートを見ていただけるとわかりますが、インテル社の他のペリフェラル同様 初期設定コマンドが必要です。
前回ロジックICで作った割り込みコントローラー同様、0番地からの8バイト単位のアドレスへCallするように仕込んでみたいと思います。

以下は初期設定コマンドICW1とICW2のパラメーターです

ICW1 (Initialization Command Word 1)

ビット位置説明今回の設定値
D0ICW4の有無0 : ICW4なし
(8086モード設定などに使う)
D1シングル/カスケード接続1 : シングル
D2Call アドレス間隔0 : 8バイト
D3トリガーモード0 : エッジトリガーモード
D5〜D6割り込みベクタアドレス
A7〜Z5
000 : 0番地からの8バイトおきの
アドレスへCallするため

ICW2 (Initialization Command Word 2)

ICW2は割り込みベクタアドレスの上位8ビット分ですので、今回は0番地からのアドレスに割り付けるので00hとします

8259初期化のASMコード例

上記の構成で8259へ初期化をする際は以下のようなZ80アセンブラコードとなります。前回2シリアル対応したGrant’s機械語モニターやCP/M BIOSの初期化部分に追加する必要があります。

; 8259 INIT
	LD A,00010010b
	OUT (PICRC),A
	XOR A
	OUT (PICRD),A

割り込みルーチンの考慮点(EOIコマンド発行)

8259割り込みコントローラーは割り込み要求を発行したのち、EOI(End of Interrupt)コマンド待ちとなります。よってシリアル割り込みルーチンなどの最後に8259割り込みコントローラーへ 20h(EOIコマンド)を出力して割り込み処理終了を知らせてあげる必要があります。

シリアルAの割り込み処理の最後にEOI命令を追加したソース例が以下になります。この割り込み処理ルーチン自体はSBC8080データパックのソースからいただいたものです。

SERINT_A:	PUSH	AF
	PUSH	HL
	IN	A,(UARTRC_A)
	AND	00000010B
	JP	Z,RTS0_A
	IN	A,(UARTRD_A)
	PUSH	AF
	LD	A,(SERCNT_A)
	CPI BUFSIZ
	JP	NZ,NOTFUL_A
	POP	AF
	JMP RTS0_A
NOTFUL_A:	LD	HL,(SERINP_A)
	INC	HL
	LD	A,L
	CPI SERINP_A & 0FFH
	JP	NZ,NOTWRP_A
	LD	HL,SERBUF_A
NOTWRP_A:	LD	(SERINP_A),HL
	POP	AF
	LD	(HL),A
	LD	A,(SERCNT_A)
	INC	A
	LD	(SERCNT_A),A
	CPI BUFFUL
	JP	C,RTS0_A
	LD	A,RTSHIG
	OUT	(UARTRC_A),A
RTS0_A:	
;
	LD A,00100000b
	OUT (PICRC),A
;
	POP	HL
	POP	AF
	EI
	RET

試作してみた

ユニバーサル基板でこの回路を試作してみました。SBC8080バスとほぼ直結ですので、地道に配線するのみです。特に注意点はありません。

そういえば回路図を手を抜いてバイパスコンデンサを省略していました。各LSI/ICごとにいつもの0.1μFのセラミックコンデンサをVcc端子近傍に装着するのが吉です。

上記写真のうち右側は今回の8259搭載ユニバーサル基板をSBC8085と組み合わせて稼働させてみたものとなります。(さんざんZ80のコード例を掲載しておきながらCPUは80系の8085ですが…..理由は後述します。)

写真に見える赤と青のケーブルはそれぞれシリアルA、Bの割り込み用結線となります。(実際は8251シリアルLSIのRxRDY信号(データ1バイト受信したよ信号)です。)

上記のようにTeraTERMを2枚開いて、それぞれでCP/Mの起動まで確認できました。前回のロジックICの場合も一緒ですが、Grant’s機械語モニター起動時にシリアルAかBをスペースバー押下して選択し、それ以降は選択したほうのシリアルで作業を実施します。同時に2シリアルが使えるわけではありません。

ハマったポイントについて

KiCADの回路図シンボルに注意!

いつものようにここまで順調に来たかのように書いてますが、試作したときにKiCADの回路図記号を鵜呑みにしてハマりました。

一緒にユニバーサル基板に搭載した8254タイマーICはIN/OUT命令に反応してきたのですが、8259割り込みコントローラーはIN命令にいつもFFhを返してくるので 当初はLSIが壊れているのかと疑っていました。

原因を調査すべく8259のデータシートを呆然と見ていて、違和感がありまして…..RDWRのピン番号逆ぢゃん!!! KiCAD標準でついてくる8259割り込みコントローラーの回路記号のRDとWRが逆になってました。

KiCAD4時代から治っていないらしいです。みなさん注意です。プリント基板作る前に気づいてラッキーでした。

Z80の簡易? INTA発生回路では8259はダメらしい

前回のロジック回路の割り込みコントローラーを作成したときもSBC8085と同様のINTA信号(割り込み受け付けたよ信号)を発生させる回路(ORゲート1つ追加)をKZ80-CPUBに取り付けました。Z80 CPUはペリフェラルLSIからの割り込み要求(INT)を受けるとM1信号とIOREQ信号を同時にLレベルにしてきます。それをOR回路であわせて出力するかたちとなっています。

8259割り込みコントローラーもそのINTA信号発生回路で行けると思い込んでいたのですが、どうも8085 CPUとZ80 CPUではINTA信号の発生挙動に違いがあるようです。いろいろなZ80の書物で「ペリフェラルは割り込み(INT)要求の後、データバスにRST命令かCall命令を載せ….」と書いているので完璧に信じ込んでました。

Z80 CPUが割り込み受付時にM1IOREQの信号線をLレベルにするのは1発だけらしいのです。これだとCall命令はフェッチできてもCall先アドレスはRAMからフェッチしてしまって思った通りの挙動になりません。(X_X)>

この対応はまたちょっと一工夫必要ですので。次回 説明できたらと思います……

SBC80系 シリアル入力の2系統対応(1)

SBC8085やわたしのKZ80-CPUBでシリアルを2系統にしてみようと思い立った記録です。その(1)は割り込みコントロール部分をロジックICで組んでみたパターンです。

発端

発端は、tomi9さんのAKI80PlusCFボードを頂いて作成したことから始まります。AKI80PlusCFボードは秋月電子で販売されているZ80互換CPUボードでZ80 CPU+CTC+SIOなどなどを搭載している豪奢な構成のボードです

このボード Z80 SIO/2相当が入っているため、なんとシリアルA/Bを装備なのです。Grant氏がCP/Mを動かした構成もSIOなので2シリアル。Grant氏の機械語モニターも、CP/M用BIOSも もともとは2シリアル対応となっています。
これはちょっと憧れる構成でした。幸い手元にKZ80-IOB(I/Oボード)のプリント基板も予備がありまして、シリアルLSI 8251×2つの構成にしたら同じように2シリアルにできるのではと思いつきました

割り込みコントローラの回路

もともといままでのKZ80-IOBやSBC8080 SUBルーズキットは割り込みをかけてくるのは8251のみだったため、複数の割り込みをコントロールしていませんでした。80系のCPUは割り込みがかかった際(#INT信号がきたら) データバスから命令を読み込む仕様となっています。割り込み時には周辺チップ側で、RSTxx命令やCall命令を発生させることで割り込みルーチンへジャンプする動きとなります。

ちなみにSBC8085、KZ80-CPUBはデータバスをプルアップしていまして、割り込みがかかったのち データバスに 16進数でいうとFFh、80系のインストラクションでいうと RST 7 (RST 38h)が発生したように挙動するようになっています。つまりシリアル割り込みがかかると 38h番地へのCallが発生して割り込み処理ルーチンが走りシリアル入力の文字をリングバッファへ保存する動きとなっています。
(SBC8080 CPUルーズキットだと8228の#INTAが+12Vにプルアップされていて同様の挙動をするようになっています。….と「古典電脳伝説」で読みました^^)>)

今回は8251×2つで2シリアル対応にしたいので、複数の8251の割り込み信号(シリアルだと「データが1バイト届いたよ」という信号)をうまいことデータバスに「命令」として乗せてあげるコントロール回路が必要となります。いろんな参考書にこの動作をする回路が出ていまして、それを参考に作ってみた回路図が以下のものです。
シリアルAからの割り込みの場合は RST 7(RST 38h)、シリアルBからの割り込みの場合はRST 6 (RST 30h)を発生させる回路です

74HC148はプライオリティエンコーダーというロジックICで、Lレベルとなった入力端子にあわせて3bitの出力を出してくれます。入力端子7番が一番プライオリティが高く、入力端子0番が一番低くなっていて、プライオリティの高い番号がバイナリ3bitで出力されます。また割り込み信号がどこかの入力端子に届いたときにEO端子がHレベルになりますので、CPUへのINT信号として使用します。
80系のCPUのRST命令を2進数でみると以下のようになっています。上位2bit、最下位3bitが 1 になっていて、真ん中の3bitが 0〜7に変化しています。この3bit分をデータバスへ出力してあげればRST命令になります。

ニーモニック命令コード(2進数)Callアドレス
RST 0 (RST 00h)1100011100h
RST 1 (RST 08h)1100111108h
RST 2 (RST 10h)1101011110h
RST 3 (RST 18h)1101111118h
RST 4 (RST 20h)1110011120h
RST 5 (RST 28h)1110111128h
RST 6 (RST 30h)1111011130h
RST 7 (RST 38h)1111111138h

74HC148プライオリティエンコーダーの出力は負論理(Lレベルが 1 )なので74HC04 NOTゲートで反転させます。それを74HC541 スリーステートバッファへ入れます。74HC541 スリーステートバッファの入力端子をすべてプルアップしているためプライオリティエンコーダーの出力がつながっていない端子は H つまり “1” となります。
ただ、いつでもデータバスにRST命令を流していると他のLSIの出力とぶつかるため、CPUからの#INTA(割り込み受付)をトリガーにしてRST命令を流すようにします。

ちなみに、KZ80-CPUBはSBC8085ルーズキットのように#INTA(割り込み受付)信号を出していませんでしたので、上記のように#M1(マシンサイクル1)信号と#IOREQ(I/O要求)信号のORをとって出力するように細工しました。Z80の場合は割り込みを受け付けるとその2つの信号線がLレベルになるのです。

試作してみた

上記の回路でユニバーサル基板を作成し、KZ80-IOB x2枚を使って試作してみました。KZ80-IOBの割り込み信号はパターンカットして、SBC8080バスとは別経路でユニバーサル基板へつなぐ作戦です。

CPUボードの方は、SBC8085ルーズキットはそのまま使えますが、KZ80-CPUBは#INTA(割り込み受付)信号をつくる必要がありますので、基板裏にSOPの74HC32をはりつけて配線してみました。

Grant’s機械語モニター、CP/Mの対応箇所

いままではハードウェア対応の話でしたが…..
2シリアル対応にするために、Grant’s機械語モニターとCP/Mに2シリアル対応を入れる必要があります。基本的には以前の移植手順のシリアル部分を2シリアル対応に戻すことになります。
8251×1(シリアルA)対応したルーチンをコピペしてシリアルB用ルーチンを作成します。(きっともっと良い書き方があるはずですが…..ちょっと今回は手抜き)

機械語モニターの対応箇所

  • 割り込みシリアル入力処理は 従来のアドレス38hからジャンプした先のルーチンはシリアルA用、アドレス30hからジャンプする先にはシリアルAの割り込み入力処理をCOPYしてシリアルB用にします。(データ保存バッファとしてリングバッファも2つ準備します)
  • INIT(初期化)処理でどちらかのシリアルからスペースバー入力されたらそちらを主シリアルと判断するルーチンを復活させます。ここで、primaryIOというワークエリアにシリアルAなら00h、シリアルBなら01hをセットします。
  • conin(シリアル入力)、conout(シリアル出力)、CKINCHAR(入力文字チェック)はprimaryIOに 00hが入っていたらシリアルAの処理、01hが入っていたらシリアルBの処理を実行するようにします。

CP/Mの対応箇所

CP/Mは従来同様 BIOSのシリアル入力部分を対応します。

  • 機械語モニター同様にserialInt(割り込み受信)、const(シリアル状況)、conin(シリアル入力)、conout(シリアル出力)の各ルーチンを2シリアル分用意します。
  • popAndRunルーチンで機械語モニターからのCP/M起動時にAレジスタで渡ってくるprimaryIOの情報(00h/01h)をもとにCP/MのIOByteを設定するルーチンを復活させます。
  • gocpmルーチンで 38hにシリアルA用割り込み処理のジャンプ命令をセットしていますので、それを真似て30hにシリアルB用割り込み処理へのジャンプ命令をセットします。

稼働確認

ハードウェアとソフトウェアの準備ができたら、稼働確認です。

Tweetをたどっていただけるとわかりますが、実はすんなりとは行かなくて(当初の回路図は考慮漏れだらけだったり….)ハマりましたが当初の予定どおり、機械語モニター起動時にシリアルAかBを選択(スペースバーを押したほうが使われます)後、CP/Mがどちらのシリアルポートでも稼働しました。

i8080/8085用に移植したGrant’s機械語モニターをさらに2シリアル対応したため、メモリーの予備エリアを食いつぶしてしまいました。もっと良いコードに今後修正していけたらと思っています。

KZ80-CF コンパクトフラッシュボードとCP/M 2.2

128kB メモリーボードで64kBフルRAM化が可能となったので、SBC8080バスにつながるコンパクトフラッシュボードを作成してCP/M 2.2を動かしてみたいと思います。

コンパクトフラッシュボード(KZ80-CF) について

KZ80-CFはGrant氏の CP/M on breadboard で 紹介されているCFカードの情報をもとにSBC8080バスへCFカードを直結するボードです。
詳しい回路説明等はgithubのwikiをご覧ください。
https://github.com/kuninet/Z80_CF/wiki

CFカードはパラレルバスを持っていて、かつTrueIDEモードに対応したカードだと特定のピン(9番ピン(#ATA))をGNDに落とすだけでIDEドライブとして使用できるということでパラレルI/Oをもったマイコンからの操作が容易です

CP/M 2.2を稼働させる準備

CFカードの準備(128M/64M)

KZ80-CFに装着したCFカードをFDにみたててCP/Mを起動してみることにします。この際、”TrueIDE”対応の128M/64MバイトCFカードが必要です

メーカー型番備考
バッファローRCF-X 128M RCF-XシリーズはメーカーFAQで”TrueIDE”対応と出ています
I/OデータCFS-128M
ハギワラシスコムCFI-128MDG
ハギワラシスコムNFD10-256B

アセンブリ環境の準備

今回のCP/M稼働はGrant氏の以下のページで紹介されている手順で実施します。
http://searle.hostei.com/grant/cpm

Grant氏提供のCP/M関係アセンブラソースzipファイルにTASM(A Table Driven Cross Assembler for the MSDOS* Environment)が添付されてきます。MS-DOSで動作するクロスアセンブラです。私はMac上のWin2000で実行しました。Macだと仮想マシンでDOS環境を動かすかDOSBoxを使うのが環境準備としては容易です。Windows環境だとMS-DOS Playerが良いかもです。

ROM機械語モニターの移植

最初に、Grant氏が公開しているROM機械語モニターのシリアル部分をKZ80/SBC80系で動くように移植します。Grant’sモニターは機能は少ないですがCP/Mのロード機能を持っているので今後の運用に便利です。(その部分だけ別モニターに移植しても良いですが….)

Grant氏の公開しているモニターは、シリアル通信にZ80 SIOを前提にZ80 CPUの割り込みモード2を使用していますが、KZ80/SBC80系で動かすためには8251シリアルLSIを割り込みモード0または1で動かすように変更します。
移植の手順は以下のgithub wikiに詳細をまとめました。
https://github.com/kuninet/KZ80_CPM/wiki/KZ80%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA%E3%80%81SBC8080-8085%E3%81%A7CP-M

基本的にはSBC8080データパックのソースを参考に 初期化ロジック、シリアル入力/出力、シリアル割り込み入力などを移植します。各ルーチンの入出力インターフェースが似ていますので移植は容易です。

CP/M 機種依存部分の移植

CP/Mに関してWikipediaを見ると以下の記載があります。

CP/Mは、シェルであるCCP (Console Command Processor)、OSの本体であるBDOS(ビードス、Basic Disk Operating System)、入出力を処理する下位プログラムの集合体であるBIOS(バイオス、Basic Input and Output System)で構成される[2]。ハードウェア依存部分はBIOSに集中させてあるので、BIOSだけを変更することで大抵のハードウェアに移植可能となっていた。BIOSの機能はシステムの初期化、CCPのリブート(アプリ実行の終了とシェルの再起動)、コンソールなどのキャラクタデバイスリダイレクト付入出力、フロッピーディスク/ハードディスク等の1セクタ単位の入出力だけである。

https://ja.wikipedia.org/wiki/CP/M

上記のとおりCP/MはBIOSを移植することで80系システムへ移植が可能とのことで、Grant氏提供ソースの “cbios128.asm” や “cbios64.asm”をカスタマイズすることでKZ80/SBC80系システムで稼働できそうです。

Grant氏のBIOSソースのカスタマイズポイントを以下のgithub wikiにまとめました。
https://github.com/kuninet/KZ80_CPM/wiki/KZ80%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA%E3%80%81SBC8080-8085%E3%81%A7CP-M
ほぼROM機械語モニターの移植と同様です。シリアル入出力関係の部分、メモリーの64kフルRAM切り替えについてのカスタマイズが必要です。
注意点は以下になります。

  • KZ80-1MSRAMを使用した場合のメモリー64kフルRAM切り替えは、バンクレジスタへ 00hを出力すること。(3箇所あります)
  • シリアル1文字出力ルーチンではCレジスタで出力文字が渡ってくることに注意。

CP/M 2.2を起動する

CP/M 2.2を起動するための手順詳細は以下のGrant氏の ページや、わたしのgithub wikiページの下の方にあります。

大雑把に言うとROMモニターで起動し、CFをform128プログラムなどでフォーマット実施、CP/M本体+BIOSをインテルHEX形式で一旦メモリーへロードしたものをputsysプログラムでCFの先頭セクターへ書き込みすると完成です。

環境は若干違いますがYouTubeにそのあたりを実演した動画をUPされている方がいました。以下の動画です。実演動画は分かりやすいです。この動画をみて、私もCP/M起動できるかもと思ったという….

違いはRC2014コンピューターはROMが7FFFhまであるみたいでputsysやform128プログラムを8000h番地以降にロードしている?ようでした。ここはKZ80-1MSRAMをお使いの場合はGrant氏の手順どおり実行できます。

以下のようにシリアル端末の画面にプロンプト “A>” が表示されればCP/M起動成功です。おめでとうございます
これで様々なCP/M対応のプログラム(テキストエディタ、CやPASCAL、BASICなどの開発言語、ゲーム…etc)が動くようになります。

SBC8080/8085でCP/M 2.2を動かす場合

上記手順で移植したソースの場合、Grant氏提供のBIOSなどのソース類にZ80固有命令(DJNZ、LDIR…etc)が含まれているためSBC8080/8085ではCP/Mが起動しません。

わたしはThe Macroassembler AS の8080CPU用アセンブリ機能のZ80ニーモニックを使用するモードを使用して、機械語ROMモニター、BIOSなどのソースに含まれるZ80命令を8080命令へ置換することでCP/M起動に成功しました。(インテルニーモニックが苦手だったもので….)

https://github.com/kuninet/KZ80_CPM/wiki/Z80-ASM(TASM)%E3%82%928080-ASM%E3%81%B8%E7%A7%BB%E6%A4%8D%E3%81%99%E3%82%8B

CP/M本体(CCP/BDOS)は8080の機械語だけで構成されているため、ROMモニターやBIOSさえインテル8080で動作するように対応すればOKです!!

KZ80-CPUB Rev.1

以前 ユニバーサル基板で作った Z80 CPUボード(SBC8080バス直結) のプリント基板を起こしました。

githubにガーバーデータを含めたデータを公開しています。
また、オレンジピコさんでも基板を販売していただけることとなりました。

概要

  • SBC8080バスにつながる Z80 CPUボードです
    • ☆SBC8080との完全互換ではありません。
    • 外部リセット端子がつながってません
    • DMA関係の配線がされてません。(#BUSREQ/#BUSACK未配線や#IOR/W、#MEMR/WのHiZ未対応とか…)
  • 単体ではメモリー/ROM/シリアル等がありませんので、SBC8080 SUBルーズキット等と組み合わせてご使用下さい。

回路図について

  • 以前ユニバーサルボードで作成したときと回路は一緒です。プリント基板化に伴いバイパスコンデンサ、電源端子等も正しく書き加えました。

部品組み付けについて

  • 部品表はこちらに OpenOffice等の表計算ソフトデータとしてUPしてありますのでご覧ください。
  • Z80 CPUは CMOSタイプの Z84C0020PEC で動作確認しています。
  • ロジックICのインバータのみCMOSタイプ(74HC04 or 74HCU04)必須です。
  • 電解コンデンサは極性にご注意。(タンタルだと爆発の危険も…)

ソフトウェアについて

基板のデータ等

各種ライセンス等

  • girhubの方のライセンス文書にも書きましたが、MIT License のもとで公開します。

KiCADの回路図描きの練習から始めて、プリントパターンエディタの使い方の練習、オートルーターのセッティングなど色々とありましたので、今後じわじわとBLOGにまとめて行ければと思っています。