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-1MSRAM Rev.1 リリース0.9

以前 手配線でユニバーサルボードに試作した 128kBバンクRAM/ROMボードの基板を起こしてみました。

概要

  • SBC8080バスにつながる 128kBバンクメモリー+ROMボードです。
    • 名称の”1M”は1Mbitということで…^^) 1MBではありません。
    • 若干回路をみなおして リリース1.0にすると思います。(時期未定ですが…)
  • 本基板に関するKiCAD等の回路図/ガーバーデータ、機械語モニタ+TinyBASIC用 ソース、HEXデータはGirhubで管理しています。ご覧ください。
  • メモリーマップは以前の記事でも紹介したとおり、以下のようになっています。

回路について

  • 回路図はこちらです。
    • 回路図、ガーバーデータ等はgithubで管理しています。ご覧ください。
  • 74HC139でROM/RAMの切り替えとバンク切り替え用I/Oアドレスのデコードを行っています。
    • メモリーはROMが16kB、固定RAM域が16kB、バンクメモリ域が32kBとなっています。
  • 74HC573でバンクメモリー番号を保持しています。バンク番号はI/Oアドレス80hへ1、2,3のバンク番号を出力することで切り替えできます。(☆前回の試作のI/Oアドレスから変更しています。FM音源ボードとぶつかってしまって…(>_<))
    • 実際の128kBメモリーのアドレスバス A15、A16のコントロールは74HC543の出力をゲートICでデコードして接続しています。
    • バンク番号0(ゼロ)はバンク1へ読み替えて出力するようにしています。

部品組付けについて

  • 部品表はこちらにあります。OpenOffice等の表計算ソフトで読み込める形式となっています。
  • 1Mbit SRAMはHM628128、ROMは28C256型を想定しています。
    • 秋月電子で売っているSOPの1M bit SRAMでもDIP変換すれば使えるものがあります。☆ビンアサインがHM628128と異なるSRAMもあるようですので注意してください。

ソフトウェアについて

  • バンクメモリーの切り替えは、8080マシン語で書くと以下のようなコードとなります。
4000
MVI A,1  ← バンク番号を指定
OUT 80h
RET
EXEC 4000
8000
DEFINE 01,02,03   ← 適当な値を入力して 別々のRAMが選択されていることを確認
DUMP 8000
  • バンクメモリーの領域がSBC8080 SUBルーズキットのもともとのRAM領域となっているため、SBC8080データパックの機械語モニタ+TinyBASICなどのワークエリア、スタック域等を固定RAM域へズラす必要があります。
    • 参考として、機械語モニタ+TinyBASIC(PTBEXSA.ASM)のワークエリア、スタック域等の変更箇所は以下になります。
    • (10/21追記) こちらのソース/アセンブリ後のHEXファイルはgithubに添付しました。

[各種アドレスの変更]

FTOP    EQU 4000H
LTOP    EQU 5000H
VTOP    EQU 07000H
STACK   EQU 07E00H

[機械語モニタのTOPアドレス変更]

main:
    LXI H,-484
    DAD SP
    SPHL
    LXI H,482
    DAD SP
    XCHG;;
    LXI H,16384       ;<-- ココ
    CALL    CCPINT

こちらを変更した際のメモリーマップは以下のようになります。

想定している用途

  • わたしはバンク切り替えできるメモリーエリアにFM音源の演奏データを入れて、複数データを切り替えながら演奏してみたい! という用途で作りました。
  • 一時点でアクセスできるメモリーは64kBですが、64kBの壁を超えてメモリーにデータを置くことができますので、いろいろと楽しい使い方ができるのでは?と思っています。