2019年1月22日火曜日

Z80 SBCへの CPM 搭載(3)

 より理解を容易にするために、CP/MControl Program for Microcomputer) が作動しているときのメモリ・マップを左図に示します。

 メモリは、8080、Z80が直接アクセスできる、0000H番地からFFFFH番地までのいわゆる64kバイトのRAM(Random access memory) 領域が必要です。

 今回搭載した62k CP/MではDC00H~F1FFH番地に CCP (Console Command Processor) と BDOSBasic Disk Operating System)が入り、次いでF200H~F430H番地に BIOSBasic Input and Output System)が入ります。

 そしてこの状態で、F200H番地からプログラムをスタートさせればCP/Mがスタートするのです。(もちろん前回までに述べたDISK(CFCard)などが作動する環境で、、、、)


 ところがCP/Mを移植するに際して、大変ありがたいことに、CCPとBDOSを合体させたファイルが、CPM22.sys 62kCPM.sys など呼ばれて存在します。
 既述のCPUVille のサイトのCP/Mの項目( http://cpuville.com/Code/CPM-on-a-new-computer.html )でのべられているように、「The Nonofficial CP / M Web Site」にある http://www.cpm.z80.de/binary.html の CP/M 2.2 BINARY ファイル(左下図)がそれに相当します。


 このファイルをダウンロードすると cpm22-b というフォルダーが得られ、目的とした CPM.SYSのほか、CP/M80のアプリケーション・ソフトが沢山入っていて有益です。(またこれらのソフトは個人が趣味で使うかぎり問題はないようです。)

 このCPM.SYSは62kCP/M用で、かつハードに依存しないので、そのまま使うことが出来ますが、今回の場合あらかじめ、バイナリ・エディタを使って、0000H~15FFHにファイルの長さをそろえておく必要があります。(下図の下部にある青色の部分を消去)


 一方、個々のハードウェア依存部分はBIOSに集中されているので、この部分さえ修正すれば自作のボードでCP/M80を走らせることが出来るわけです。

 BIOSはオリジナルに雛形があり(A Skeletal CBIOS)、これにひとつひとつパラメータを入れていってもいいのですが、今回は
CPUVille のサイトで使われている z80_cbios.bin を使わせていただくことにしました。そうは言っても修正部分はありますが、ほんのわずかです。

Z80 SBC(シングルボード・コンピュータ)の製作 (6) モニタープログラムの搭載」で述べたように、このz80_cbios.bin中にある82C51
 Data Register address   を 02H -> 30H
 Control Register address を 03H -> 31H へ変更します。


 さらにz80_cbios.binファイルの先頭に、左図のように 00 00 00 00 とNOPをアドレスを整合させるため、4個挿入しておきます。

 このようにして出来た、新しいCPM.SYSz80_cbios.binをそれぞれCPM.SYSをDC00H~F1FFHに、z80_cbios.binをF200H~にメモリに置き、F200Hからプログラムをスタートさせれば a> とプロンプトが表示されるはずで、動作の確認が出来ます。(この段階では Copyright のクレジットは出ませんし、プロンプトも A> ではなく小文字です。DISKへのアクセスも出来ません)

さらにシステム全体を理解するために下図を示します。


 中央が前述した、メモリ領域をすべてRAMにしたメモリマップで、CP/Mはこの状態で走ります。

 ついでながらTPA(Transient Program Area)トランジェントコマンドがロードされるメモリ上の領域で0100H番地から始まりますし、0000H~00FFH番地はCP/Mのワークエリアです。


 そして、左側が0000H~3FFFHのROM領域(16kbyte)を表したもので、右に拡大したものを掲げました。

 Z80システムのスタート番地(0000H番地)にはZ80 SBC(シングルボード・コンピュータ)の製作 (6) モニタープログラムの搭載」で述べたモニタープログラムがあります。
 1C00H~3430H番地にはCCP+BDOS+BIOSが一体化して収めてありますので、Z80の便利なメモリ転送機能を利用してCP/Mをスタートさせることが出来ます。
 すなわち、

MOUNT_CPM:
   LD   HL, 1C00H  ;Start addrs cp/m on ROM
   LD   BC, 1380H  ;Program Length
   LD   DE,0DC00H  ;Addrs to transfer
   LDIR
;
   3E   01H       ;Memory Bank Change
   D3   38H
;
   JP   0F200H    ;Jp to CP/M Start Addrs


 しかしながら通常のCP/MスタートはDISK(CFCARD)から実行されます。

 左図はその説明図です。複数あるディスクの最初のディスク(DISK0またはDISK A)の最初のトラック(TRACK0)の最初のセクター(SECTOR0)の部分を示しています。

TRACK0、SECTOR0 には
  IPL( Initial Program Loader )

TRACK0、SECTOR2から26
および TRACK1、SECTOR1から25 には
  CCP+BDOS+BIOS

がそれぞれ記録してあります。

実施例で、この場合のCP/Mスタートを説明すると、
・ モニタープログラムからDISKのIPLを8000Hにロード
・ このIPL8000Hからスタートさせると、DISKにあるCCP+BDOS+BIOSDC00Hへロードし、
・ 次いで、メモリバンクをオールRAMに切り替え、F200HからCP/Mをスタート
となります。

 以上から分かるように、CP/Mを構成するためのファイルは、前述の
 CPM.SYS(修正版)z80_cbios.bin(修正版)にくわえて、
 IPL:プログラムの役割については既述
 PUTSYSDISK0の最初の部分にCPM.SYS(修正版)z80_cbios.bin(修正版)およびIPLを書き込む
 FORMATDISKの使用セクターのすべてにE5を書き込む
などがあり、それらを組み合わせて構築します。
 詳細は CPUVille http://cpuville.com/Code/CPM-on-a-new-computer.html を参照ください。


 以上はZ80 SBCへの CPM 搭載についての全体像の備忘記録で、マニュアルではありませんので整合性や誤解などについてはご容赦ください。

 とはいうもののこのCPUVilleの記事「 Setting up CP/M 2.2 on a New Z80 Computer」は本当に役に立ちました改めて Donn Stewart さんに感謝です。

 現在は自作のZ80 SBCでCP/M‐80が軽快に動いています。
 強いて気になる点は、DISKの1セクターが512バイトもある中で、128バイトしか使われていないので、128GBのCFカードでも243kバイトのDISK4台構成である点です。

 またZ80 SBCもAKI-80ボードを使えばよりシンプルになることを思いつき、これに Grant Searle さんのシステムを載せてみたいと考えています。

0 件のコメント: