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/SBC80系 128kBメモリーボード REV2

KZ80-CPUBやSBC80系のCPUボードとSBC8080バスでつながって動作する128kB SRAM&ROMボード KZ80-1MSRAMのREV2を作りました。

基板データ等配布先について

いつもどおりREV2に関するKiCADデータや関連ソフトウェアはgithubで公開しています。以下をご覧ください。
https://github.com/kuninet/Z80_1MRAMB/releases/tag/2.0
ちなみに、バンク切り替えイメージなどまとまった解説はgithub wikiに書いています。そちらも併せてご覧ください。
https://github.com/kuninet/Z80_1MRAMB/wiki

REV1からの改良点

REV1からの改良点は以下のとおりです。

  • 起動時、リセット時に初期バンク番号を バンク1へ固定
    • REV1では起動時、リセット時にメモリーバンク番号が不定でした。これは設計当初から固定RAM域(4000h-7FFFh)をあてにして機械語モニターを起動させ、ソフトウェアで初期バンク番号を決定するという方式を考えていたためです。
    • この方式だと、機械語モニターへ命令追加しないとCPUボードによって初期バンク番号が違ってしまうという状態でした。
    • そこで、メモリーバンクレジスタのICを74HC573(Octalラッチ)から74HC74(D-FF)へ変更しました。実験回路として検討したときの回路図は以下になります。
    • CPUリセット信号パルスを74HC74のDフリップフロップのリセット/セット端子へ与えることでメモリーバンク番号 “01”に初期設定されるようにしています。
  • 64kB フルRAM切替回路
    • いままでバンク0の指定はバンク01に読み替えることで意味がないものでしたが、そこを見直して64kB切り替えの指定としました。
    • 動作原理としては、上記 回路図のメモリーバンクレジスタの出力が “00”(つまり両方Lレベル)となった際の信号と、ROM/RAM選択の74HC139デコーダの信号をあわせてROM/SRAMの#CEへ供給することでフルRAM化を実現しています。(バンクレジスタが00だとSRAMしか選択されなくなります)
    • フルRAMに切り替わったことを確認できるようにLEDも追加しました。(バンク0=フルRAMなので無用かもですけど….^^)>)
  • バンクレジスタI/Oアドレス選択ジャンパ
    • いままでバンクレジスタのI/Oアドレスは80h固定でしたが、ジャンパにより00h、40h、80h、C0hの切り替えが可能となりました。
    • 基板スペース等の関係でアドレスデコーダを74HC138にできなかったのが心残りですが….

今後について

リセット時のRAM構成がハード的に安定したことと、フルRAM切り替え回路が作成できたので、CP/Mを動かしてみたいと思います。参考にするのはいつもお世話になっている以下のGrant氏のページです。
http://searle.hostei.com/grant/cpm/

KZ80-IOB REV1.1

KZ80-CPUB(CPUボード)や SBC8080 CPUルーズキットと組み合わせて動くI/O基板のREV1.1基板ができました。
githubで リリース1として固めました
https://github.com/kuninet/Z80_IOB/releases/tag/1

REV1.1基板の変更点

リリースノートにも書きましたが、以下のREV1基板の課題を修正しています。

  1. PPI(8255A)への入出力端子x2のポートA+C、ポートB+Cの組み合わせを修正しました。
    1. グループA : ポートA(PA7〜PA0)+ポートC(UPPER)(PC7〜PC4)
    2. グループB : ポートB(PB7〜PB0)+ポートC(LOWER)(PC3〜PC0)
  2. PPI(8255A)への入出力端子x2の物理配置間隔を修正、2×7ピンボックスヘッダを2つ並べて組み付け可能
  3. シリアル接続用L型 1×6ピンヘッダの端子説明シルク添付
  4. NOT回路用 トランジスタ(2SC1855)のランドパターン変更。
  5. ICのランドパターンと貫通ビアが接近部分修正。
  6. SBC8080バスの電源+5V、GNDの部分に電解コンデンサを装備。

部品実装例

部品実装例は以下になります。

80系機械語モニタ GWMON-80

8080/8085/Z80で稼働する機械語モニター GWMON-80を最近よく使わせてもらっています。

機械語モニタ GWMON-80について

  • 機械語モニタGWMON-80はgithubで公開されています。なんと2018年にメンテされている機械語モニターです。素晴らしい。
  • 機能は以下の通りで、シンプルなものとなっています。
    • Z80のクロスコンパイラなどで出力されるインテルHEX形式データのロード機能を持っています。
    • LEDチカチカさせたりZ80でI/Oポートをよく叩く私としてはIN/OUT命令が装備されているのがお気に入りです。
 
D XXXX YYYY Dump memory from XXXX to YYYY 
E XXXX Edit memory starting at XXXX (type an X and press enter to exit entry) 
G XXXX GO starting at address XXXX (JMP in, no RET) 
I XX Input from I/O port XX and display as hex 
O XX YY Output to I/O port XX byte YY 
L Load an Intel HEX file into memory 

ビルド方法について

ビルド用バッチファイル

  • README.mdを読んでいただけると分かりますが、ビルドはモニター本体(MONITOR.ASM)と自分の環境に合ったI/Oモジュール(xxxx.ASM)を1つのファイルへ合体させてCP/Mのアセンブラでアセンブルすることとなっています。ビルド方法はプロジェクト範囲外ということで好きにやってくださいってことでした。
  • そこでビルドについて検討して、Windows10 Pro環境で以下のツールを使うことでアセンブルができました。手作業で毎回ビルドするとコマンドを忘れがちなのでWindowsのバッチファイルを作成しました。gistにUPしています。
  • ちなみに、他のクロスアセンブラでも若干のソース修正が必要ですが可能です。The MacroAssembla(ASL)では ラベルに”$”が使えなかったり、文字列の指定を “(ダブルクォート)に変更することでアセンブリ可能でした。
  • このビルド用バッチではgithubからソース類をもってきて、スタートアドレス/スタックポインタアドレス等の変更を行った後、CP/M ExecuterでMAC.COM(マクロアセンブラ)を起動する流れとなっています。
  • 依存関係を元に必要なビルドだけを実施できるとカッコイイですが、そこはまた今後の課題ということで ^^)>
  • KZ80-CPUB+SBC8080 SUBやSBC8080+SUBボードで使用している8251用のI/Oモジュールを合体させるスクリプトになっています。
  • KZ80-1MSRAM用にスタックポインタをFFFFh→7FFFhへ変更したソースも生成しています。

バッチファイルを動作させるディレクトリ

  • バッチファイルを動作させるディレクトリは、以下の構造を想定しています。
.
│ build.bat
├─build\
│ [build terget Dir]
├─cpm32_04\
│ │ [CP/M Executer Dir]
│ ├─src
│ └─utl
├─glitchworks_monitor\ [GWMON-80 git checkout Dir]
│ └─io_modules
├─mac-b\ [ CP/M MacroAssembla MAC.COM]
└─src\ 
  • cpm32_04ディレクトリはCP/M program EXEcutor for Win32を展開したディレクトリ、mac-bディレクトリはMAC BINARY (8080 Macro Assembla)を展開したディレクトリです。

ビルドバッチファイルの実行

  • ビルドバッチファイルを実行すると build\ ディレクトリにモニターのソースが生成されMAC.COMでアセンブルされた リストファイル(.PRN)とインテルHEX形式のオブジェクト(.HEX)が生成されます。
 
> build.bat

動くとこんな感じ

  • 機械語モニターを動かすとこんな感じです。

つぎは…

ビルドができたので、つづいて別のシリアルチップ用にI/Oモジュールを書いてみたいと思います。Grant’s Z80コンピューターで使ってるモトローラMC6850チップ用のモジュールを作ってみたいと思っています。


KZ80-IOB REV1

以前ユニバーサルボードに試作した 8255A(PPI)搭載ボードに、端末(PC/Mac)接続用シリアル(i8251)を一緒に搭載したI/Oボードのプリント基板を起こしてみました。SBC8080バスに接続できるので、KZ80-CPUB/SBC8080 CPUルーズキット等と一緒に使います。

☆端末(PC/Mac)接続用シリアル(i8251)はI/OアドレスによってはSBC8080 SUBルーズキットの8251とバッティングします。

概要

  • SBC8080バスにつながる I/Oボードです。
    • パラレルI/O(8255A)と端末(PC/Mac)接続用シリアルI/O(8251)を搭載しています。
    • 自作のFM音源チップ搭載Arduinoシールドを乗せるためのピンソケットが配備できるようになっています。(他の方は使いみちが無いかも….)
    • 若干回路をみなおして REV1.1 リリース1.0にすると思います。(時期未定ですが…)

回路について

  • 回路図はこちらです。
    • 回路図、ガーバーデータ等はgithubで管理しています。ご覧ください。
  • パラレルI/O(8255A)、シリアルI/O(8251)、FM音源の各チップのアドレスデコードは74HC138で実施しています。128kメモリーボード(KZ80-1MSRAM)のバンク切り替え用I/Oアドレスを80h番地固定にしていることと、SBC8080 SUBルーズキットとの互換性を考えて以下の設定が推奨です。基板上のジャンパピンを各1つ短絡することで設定できます。
    • パラレルI/O(8255A) ・・・・・・ C0h
    • シリアルI/O(8251) ・・・・・・ 00h
    • FM音源 ・・・・・・ 40h

  • シリアルI/O(8251)のクロック用に水晶振動子 4.9152MHzを74HC4060で32分周して153.5kHzを作り出しています。
  • パラレルI/O(8255A)の入出力端子としてポートA+ポートCの4ポート、ポートB+ポートCの4ポートを14ピンヘッダに出しています。
    • REV1では8255AのグループA/Bの組み合わせと合っていません。次のリビジョン(REV1.1)では変更する予定です。

部品組付けについて

  • 部品表はこちらにあります。OpenOffice等の表計算ソフトで読み込める形式となっています。
  • それほど変わった部品はありませんが、トランジスタ2SC1855は1回路分のNOT回路を構成するために使用しています。同等品であれば大丈夫だと思います。トランジスタのパターンが狭くてハンダ付けがしずらいと思います。すいません。

使用例

Lチカ

  • パラレルI/O(8251A)を使用したLEDチカチカをさせた例は以下になります。

  • LEDは以下のように配線してください。8255AのBポートへ出力する例となります。
    • BポートへLレベルを出力したLEDが光ります。

  • 以下がSBC8080データパック付属の機械語モニタで出力する際のプログラム例です。8255AのI/OアドレスはC0hとしています。
8000
MVI A,80
OUT C3
MVI A,AA
OUT C1
RET
EXEC 8000

FM音源装着

  • FM音源(YM2151)ボードを装着した例です。

使用する場合の注意

  • PC/Macを使ったシリアル通信はSBC8080 SUBルーズキットやSBCシリーズと同様 TTLレベルのUSB-シリアルコンバータで接続してください。GNDの位置がシルク上わかりずらいと思いますが「232C」と書かれた側がGNDです。
  • SBC8080 SUBルーズキットといっしょに使用する場合は、端末用シリアルI/O(8251)のI/Oアドレスをズラすか どちらかの8251を外して下さい。

これで、Z80 CPUボード(KZ80-CPUB)、メモリーボード(KZ80-1MSRAM)、I/Oボード(KZ80-IOB)がそろって、3枚一組でマイ・コンピューターとして動作できるようになりました。
ひとまず、このセットを KZ80-I (ケーゼットハチジュー・ワン)と命名したいと思っています。^^)/