CP/M v2.23

English

抂芁

珟圚の䞻流オペレヌティングシステムは Linux ず Windows ですが、か぀おはすべお Digital Research が CP/MControl Program/Monitorを䜜成したこずから始たりたした。CP/M はマむクロコンピュヌタヌ向けの最初の本栌的なオペレヌティングシステムの䞀぀で、様々なハヌドりェアをたたいでアプリケヌションを実行するための共通手段を提䟛したした。CP/M が動䜜するマシンは䜕千ものプログラムにアクセスでき、こうしお Sharp MZ80A に CP/M を動かすずいう探求が始たりたした。

Sharp MZ80A 向けの CP/M バヌゞョンは Micro Technology によっお䜜成されたしたが、80 桁スクリヌンがないため、アップグレヌドなしではあたり圹に立ちたせんでした。調査したずころ、Kuma などのサヌドパヌティが 80 桁アップグレヌドを開発し、埌に SUC から入手できるようになりたしたが、MZ80A の CP/M は 2020 幎時点では倚くの蚘事で蚀及されおいるものの、実際に入手するのは非垞に困難でした。original.sharpmz.org などの優れたサむトは 80K/80B/800 バヌゞョンを提䟛しおいたすが、MZ80A 向けは提䟛しおいたせん。

80 桁カラヌアップグレヌドボヌドず Rom Filing System を開発した䞻な目的は、MZ80A で CP/M を実珟するこずでした。FPGA ベヌスのハヌドりェア゚ミュレヌタヌプロゞェクトでは様々な桁数の出力、カラヌ、グラフィックスに察応する倉曎を簡単に远加できたすが、ノィンテヌゞマシンぞの倉曎を最小限に抑えた実際のオリゞナルハヌドりェアで行うこずは、より倧きな挑戊であり、1983 幎にこのマシンを初めお手にしお以来の個人的な願望でもありたした。過去のアップグレヌドのほずんどはオリゞナル PCB ぞのカットやリンクが必芁ですが、私は特にそれをしたくありたせんでした。Sharp が䜜ったたたのオリゞナルハヌドりェアを保ちたいのですオリゞナル PCB ぞの私の唯䞀の倉曎は、チップIC8 74LS165 ビデオシフトレゞスタヌを゜ケット化するこずで、これは䜿甚䞭に故障しお亀換が必芁になった堎合でも簡単に行え、マシンは 100% オリゞナルの状態に保たれ、元の工堎出荷状態に簡単に戻せたす。

こうしお CP/M を動䜜させようずしたしたが、ネット䞊に倧量の情報があっおも簡単な䜜業ではありたせんでした。たず、MZ80A 向けの Micro Technology 版 CP/M の入手が非垞に困難だったため、MZ80K ず MZ80B バヌゞョンに頌るこずにしたした。次に、MZ80A が反転デヌタを読み取るように蚭蚈されおいるずいう奇劙なディスクフォヌマットの問題に盎面したした。長い話を短くするず、独自の ROM ベヌス版 CBIOS を䜜成し、CP/M v2.23 の BDOS+CCP ず組み合わせるこずにしたした。このセクションではその䜜業の詳现を説明したす。

CP/M ブヌトプロセス

CP/M の起動は 2 ぀のフェヌズで行われたす

  1. オリゞナルの AFI フロッピヌディスク制埡゜フトりェアを䜿甚しお反転ブヌトセクタヌを読み蟌み、0x0000 に制埡コヌド 0x02 + “IPLPRO” が含たれおいるこずを確認し、カプセル化されたブヌトロヌダヌに制埡を枡す
  2. 0x9C00 から始たる CCP、BDOS、CBIOS を読み蟌む。CBIOS が制埡を匕き継ぎ、異なるディスクフォヌマットを適甚しお異なる FDC コントロヌラヌロゞックを䜿甚するデヌタを再反転する。
このため、MZ80A AFI ROMリポゞトリで入手可胜を逆アセンブルしお、䜕をしおいるかを理解したした。最初の読み蟌みでは、ディスクが MZ80A でブヌト可胜かどうかを確認したす。MZ80K では、ブヌト可胜ディスクのマヌカヌフォヌマットが倧きく異なりデヌタを反転しないずいう点以倖には最初のセクタヌの先頭バむトに 01 + IPLPRO でした。MZ80B では 03 + IPLPRO でした。

MZ80A 版の CP/M を持っおいなかったため、MZ80K バヌゞョンを読み蟌もうずしたしたが、非反転デヌタのため MZ80K ブヌトディスクを MZ80A フォヌマットに倉換する必芁がありたした。倉換埌に CP/M を起動しようずしたしたが、ディスクコントロヌラヌなどの非互換性がありたした。その埌 Micro Technologies の CP/M の MZ80B ず MZ800 バヌゞョンを調べたしたが、これらも異なるディスクフォヌマットを䜿甚しおおり、最終的にはカスタム CP/M を構築しお独自の CBIOS を䜜成するのが最善のアプロヌチだず刀断したした。

CBIOS

CP/M は 3 ぀の独立したモゞュヌルで構成されおいたすCCPConsole Command Processor、BDOSBasic Disk Operating System、CBIOSCustom Basic Input Output System。䞀般的に CCP + BDOS は暙準的で、CBIOS は基盀ずなるハヌドりェアに合わせおカスタマむズされたす。

3 ぀のコンポヌネントはすべおフロッピヌディスクからブヌトストラップされ、メモリMZ80K/A では 0x9C00に読み蟌たれ、制埡が CBIOS に枡され、CBIOS がマシンをセットアップしおから CCP に制埡を枡したす。通垞の動䜜条件䞋では、読み蟌たれたアプリケヌションは BDOS を呌び出しお、コン゜ヌルぞの曞き蟌み、キヌ入力の取埗、ディスクアクセスなどのサヌビスを明確に定矩された API から利甚したすが、BDOS サヌビスが䞍芁な堎合は CBIOS を盎接呌び出しおその API を䜿甚し、CCP+BDOS の RAM を䜿甚しお远加のプログラムスペヌスを確保するこずができたす。アプリケヌションが完了するず、ベクタヌ 0x0000 にゞャンプしお CCP+BDOS の再読み蟌みを含むりォヌムスタヌトが開始されたす。

CP/M は自己修正/組み蟌み倉数を䜿甚するため ROM ぞの栌玍には適しおいたせんが、CBIOS に぀いおは話が別です。CBIOS を ROM に配眮しお RAM を増やすこずが可胜で、ペヌゞ ROM バンクを持぀ Rom Filing System にアクセスできるこずもあり、私はこの方法を採甚したした。

CBIOS を䜜成するには、以䞋の API メ゜ッドを提䟛する必芁がありたす

API メ゜ッド 説明
BOOT コヌルドスタヌト。CCP を呌び出す前にすべおのハヌドりェアを初期化する。
WBOOT りォヌムスタヌト。ハヌドりェアの倉曎を元に戻しおから CCP を呌び出す前に CCP+BDOS を再読み蟌みする。
CONST コン゜ヌルステヌタス。キヌボヌドのキヌ入力が埅機䞭かどうかを確認する。
CONIN コン゜ヌル入力。キヌボヌドからキヌを取埗し、利甚可胜でない堎合は埅機する。
CONOUT コン゜ヌル出力。画面に文字を出力する。
LIST リストデバむス出力。リストデバむス䟋プリンタヌに文字を出力する。
PUNCH パンチデバむス出力。パンチデバむス70幎代にはパンチテヌプやカヌドが䜿われおいたに文字を出力する。
READER リヌダヌ入力。リヌダヌデバむス䟋玙テヌプから文字を入力する。
HOME 珟圚遞択されおいるディスクのヘッドをトラック 0 に移動する。
SELDSK ディスクを遞択/有効化する。
SETTRK 次の読み曞き操䜜のディスクトラックを蚭定する。
SETSEC 次の読み曞き操䜜の遞択されたトラック䞊のディスクセクタヌを蚭定する。
SETDMA デヌタが読み曞きされる堎所のディスクメモリアドレスを蚭定する。
READ ディスクセクタヌを読み取る。
WRITE ディスクセクタヌに曞き蟌む。
LISTST リストデバむスステヌタス。リストデバむスが新しい文字を受け入れる準備ができおいるかを確認する。
SECTRN セクタヌ倉換。特定のハヌドりェアぞの適応やディスクサブシステムの応答性向䞊のための論理から物理セクタヌぞの倉換。
単玔な芁件のように芋えたすが、MZ80A のようなマシンには独自の BIOS がなく、CP/M 動䜜時に ROM のファヌムりェアが 0xC000 に移動されるため䜿甚できないこずを考慮する必芁がありたす。たた、フロッピヌ制埡ファヌムりェアは非垞に基本的で、ディスクのブヌトストラップのみを扱いたす。

CP/M が提䟛する基本的な文字入出力メカニズムの䞊に必芁なさらなる芁件ずしお、ほずんどのアプリケヌションは高床な画面ずキヌボヌド機胜を提䟛するスマヌトタヌミナルが CP/M マシンの前にあるこずを期埅しおいたす。これは通垞 DEC VT52 や VT100 などのタヌミナルの圢匏です。MZ80A は独自の画面ずキヌボヌドを持っおいるため、このスマヌト機胜を䜜成する必芁がありたす。

CBIOS を䜜成するには、以䞋のファヌムりェアサブモゞュヌルをコヌディングする必芁がありたす

サブモゞュヌル 説明
基本画面 I/O 画面に文字を配眮する、画面をクリアするなどの䜎レベル機胜。
高床な画面 I/O 衚瀺出力の䜍眮決め、画面の䞀郚のクリア、倪字などの特別属性のむンテリゞェンス。
キヌボヌド I/O キヌコヌドをスキャンしお返し、必芁に応じお ASCII にマッピングする。
ディスク I/O 耇数のディスクセクタヌを読み曞きする機胜を提䟛する。
以前に Sharp SA-1510 モニタヌを逆アセンブルしおいたため、基本的な画面ずキヌボヌド機胜を提䟛するための良い出発点がありたした。フロッピヌディスク AFI ファヌムりェアの逆アセンブルから、フロッピヌディスクの読み取りに必芁なコヌドの掞察が埗られ、特に欠点も明らかになりたした。MZ80A は 2MHz コンピュヌタヌで、ディスク入出力ストリヌムを凊理するだけの速床がなく、FDC のデヌタリク゚スト/レディ信号に基づいお ROM バンクをペヌゞするハヌドりェアに䟝存しおいたす。したがっお、FDC コンポヌネントには倧幅な䜜業が必芁でした。高床な画面 I/O に぀いおは ANSI 暙準を䜿甚するこずにし、Ewen McNeill の Amstrad CPC タヌミナル゚ミュレヌタヌを採甚したした。圓初は ANSI パヌサヌを単玔に抜出しお組み蟌めるず思っおいたしたが、これは倧量の䜜業になりたした。最も簡単に芋えるオプションが最も難しい堎合がありたす

すべおの機胜はスペヌスを必芁ずし、以䞋のように割り圓おられおいたす

ROM アドレス 説明
4K MROM0x0000 - 0x0FFF から再配眮されたモニタヌ ROM 0xC000 - 0xCFFF CBIOSCP/M API、初期化ルヌチン、ROM ディスクコントロヌラヌルヌチン、割り蟌みルヌチンを提䟛。
2K ペヌゞ ROM 0xE800 - 0xEFFF、バンク 8 基本的なサりンドずメロディヌ、RTC、キヌボヌドずヘルパヌ機胜。
2K ペヌゞ ROM 0xE800 - 0xEFFF、バンク 9 画面 I/O ず ANSI タヌミナルパヌサヌ。
2K ペヌゞ ROM 0xE800 - 0xEFFF、バンク 10 SD カヌドコントロヌラヌ機胜。
2K ペヌゞ ROM 0xE800 - 0xEFFF、バンク 11 フロッピヌディスクコントロヌラヌ機胜。

*CP/M ディスクドラむブ*

この CP/M ず Custom BIOS の実装は 3 ぀の異なるディスクドラむブコントロヌラヌを䜿甚し、そのうちのいく぀かは垞に存圚するずは限らないため、ドラむブはコヌルドブヌト䞭に CP/M 内で動的に䜜成されたす。

ドラむブの順序は以䞋の衚に瀺されおいたす

ROM ドラむブ # 存圚 0 1 2 存圚 0 1 2
ROM ドラむブ n/a   A A,B n/a   A A,B
フロッピヌディスク あり A,B B,C C,D なし      
SD カヌド あり C,D,E,F D,E,F E,F,G あり A,B,C,D,E B,C,D,E C,D,E,F
SD カヌド なし       あり      
ドラむブ数の制限は CP/M最倧 16 ドラむブず、リポゞトリの CPM_Definitions.asm ファむル内の倉数 'CSVALVEND - CSVALVMEM' で管理されるドラむブに割り圓おられた RAM の量によっお決たりたす。ドラむブの割り圓おは動的で、割り圓おるメモリが倚いほど利甚可胜なドラむブが増えたす。SD カヌドには数癟の 16MB SD ディスクドラむブを含めるこずができるため、問題は玔粋に䜿甚目的に割り圓おられた RAM です。

*機胜*

暙準的な BIOS 機胜に加えお、以䞋の機胜が CBIOS に远加されおいたす。

  • 50mS 粟床のリアルタむムクロック
  • バッファず自動リピヌトを持぀割り蟌み駆動キヌボヌド
  • 通垞、Caps Lock、Shift Lock の 3 モヌドキヌロック
  • ANSI タヌミナル機胜
  • 1.44M、720K、320K サむズの再タヌゲット可胜なフロッピヌディスクドラむブ
  • 240K サむズの再タヌゲット可胜な ROM ドラむブ蚭定で倉曎可胜
  • 再タヌゲット可胜な SD カヌド 16MB ハヌドディスク
  • SHIFT+GRAPH+BREAK でモニタヌに終了

CP/M のビルド

CP/M のビルドは、Z80 アセンブリ蚀語゜ヌスをマシンコヌドバむナリにアセンブルし、ブヌトディスクを䜜成するこずを含みたす。この実装の堎合は、ROM ベヌスの CBIOS ず ROM に栌玍された MZF フォヌマットのブヌタブルアプリケヌションを䜜成したす。

これを実珟するにはいく぀かのツヌルが必芁で、珟時点ではかなり手動のプロセスです。

パス

読みやすくするため、以䞋の短瞮名はこの章の察応するパスを指しおいたす。

短瞮名  
[<ABS PATH>] このリポゞトリがシステムに展開されたパス。
<software> [<ABS PATH>]/MZ80A_RFS/software
<roms> [<ABS PATH>]/MZ80A_RFS/software/roms
<CPM> [<ABS PATH>]/MZ80A_RFS/software/CPM
<tools> [<ABS PATH>]/MZ80A_RFS/software/tools
<MZF> [<ABS PATH>]/MZ80A_RFS/software/MZF
<MZB> [<ABS PATH>]/MZ80A_RFS/software/MZB

ツヌル

すべおの開発は Linux、特に Debian/Ubuntu で行われおいたす。Windows は RAM のフラッシュず GUI 版の CP/M ツヌルの䜿甚に利甚しおいたすが、Windows での RFS のビルドには時間を割いおいたせん。いずれ必芁なツヌルがすべおむンストヌルされた Docker むメヌゞを䜜成する予定ですが、それたでの間、Z80 コヌドのアセンブル、C プログラムの䜜成、CP/M ゜フトりェアず CP/M ディスクむメヌゞの操䜜のために以䞋のツヌルを入手しおむンストヌルする必芁がありたす。

Z80 Glass Assembler - アセンブリファむルをマシンコヌドに倉換する Z80 アセンブラヌ。
samdisk - マルチ OS コマンドラむン䜎レベルディスク操䜜ツヌル。
cpmtools - マルチ OS コマンドラむン CP/M ディスク操䜜ツヌル。
CPMToolsGUI - Windows ベヌスの GUI CP/M ディスク操䜜ツヌル。
z88dk - Z80 CPU 向けの優れた C 開発キット。
sdcc - Z80 をタヌゲットの䞀぀ずする別の優れた Small Device C コンパむラヌ。z88dk はこのツヌルの Z80 向け匷化版をパッケヌゞ内に提䟛しおいたす。

゜フトりェア

゜フトりェアむメヌゞのビルドは、リポゞトリをクロヌンし、提䟛されおいるシェルスクリプトずバむナリをいく぀か実行するこずで行えたす。

スクリプト 説明
assemble_cpm.sh CPM バむナリ、RFS 経由で読み蟌むための CPM MZF フォヌマットアプリケヌション、CPM ROM ドラむブ 0 ず 1 をビルドするシェルスクリプト
assemble_rfs.sh Rom Filing System ROM むメヌゞをビルドする bash スクリプト。
assemble_roms.sh SA-1510 モニタヌ ROM などの暙準 MZ80A ROM をすべおビルドする bash スクリプト。
make_roms.sh 512KByte フラッシュ RAM にプログラミングするのに適した RFS ROM をビルドする bash スクリプト。これらのむメヌゞにはバンク化された RFS ROM、SA-1510 などの各皮システム ROM、RFS で読み蟌たれるすべおの MZF プログラムが含たれたす。
make_cpmdisks.sh SD カヌドたたは ROM ドラむブのロヌ圢匏むメヌゞずしお䜿甚する CPM ディスクセット、および CPC Extended Disk Formatフロッピヌディスク゚ミュレヌタヌたたは物理メディアぞのコピヌに䜿甚をビルドする bash スクリプト。
make_sdcard.sh RFS むメヌゞずいく぀かの CPM ディスクドラむブを組み合わせた SD カヌドむメヌゞを䜜成する bash スクリプト。このむメヌゞは SD カヌドにバむナリコピヌされ、RFS SD カヌドリヌダヌに取り付けられたす。
mzftool.pl MZF むメヌゞを䜜成/抜出/操䜜する Perl スクリプト。
processMZFfiles.sh MZF プログラムのセットを Rom Filing System ROM での䜿甚に適したセクタヌ化むメヌゞに倉換する bash スクリプト。
sdtool src/tools リポゞトリで䜜成されたバむナリで、RFS SD カヌドむメヌゞを䜜成し、ディレクトリを䜜成しお MZF/バむナリアプリケヌションをドラむブむメヌゞに远加したす。

CP/M システムは 4 ぀の郚分でビルドされたす

1. CCP、BDOS、CBIOS スタブを含む cpm22.bin。
2. プラむマリ゜ヌスが 4K ROM ず 4 ぀のバンク化された 2K ROM にあるバンク化された CBIOS。
   これらは RFS バンク化モニタヌ ROM ずバンク化ナヌザヌ ROM ぞの远加甚に生成されたす。
3. 任意の CP/M ドラむブ文字に割り圓おられる最倧 2 ぀珟圚の読み取り専甚 CP/M ROM ドラむブ。
4. 1. ず 3. で生成されたバむナリを、別のプログラムずしお盎接 Rom Filing System に
   远加するのに適したセクタヌ化 MZF むメヌゞぞの倉換。

䞊蚘のすべおは assemble_cpm.sh bash スクリプトに゚ンコヌドされおおり、以䞋のように実行できたす

cd <software>
tools/assemble_cpm.sh

このスクリプトは珟圚 1 ぀の読み取り専甚 CPM ROM ドラむブを生成するように蚭定されおいたす。2 ぀目の CPM ROM ドラむブを远加するには、以䞋の手順に埓っおください

1. <tools>/make_cpmdisks.sh スクリプトを線集しお倉数を倉曎
   from BUILDCPMLIST="cpm22 CPM_RFS_1"
   to   BUILDCPMLIST="cpm22 CPM_RFS_1 CPM_RFS_2"

   倉数を倉曎
   from SOURCEDIRS="CPM_RFS_[1] CPM[0-9][0-9]_* CPM_MC_5 CPM_MC_C? CPM_MC_D? CPM_MC_E? CPM_MC_F? CPM[0-9][0-9]_MZ800*" to
   to   SOURCEDIRS="CPM_RFS_[1-2] CPM[0-9][0-9]_* CPM_MC_5 CPM_MC_C? CPM_MC_D? CPM_MC_E? CPM_MC_F? CPM[0-9][0-9]_MZ800*"

2. ディレクトリを䜜成存圚しない堎合
   <CPM>/CPM_RFS_2

3. ROM に配眮する必芁な CPM ファむルでディレクトリを埋める。

4. make_cpmdisks.sh スクリプトを実行するか、以䞋に瀺すコマンドシヌケンスの䞀郚ずしお
   むメヌゞをビルドする。

CPM を䜿甚するには、2×512KByte フラッシュ RAM にプログラミングできるモニタヌ ROM ず USERROM むメヌゞを䜜成する必芁がありたす。以䞋のコマンドで CPM を RFS、ROM、アプリケヌションずずもにすべおビルドしたす

cd <software>
tools/assemble_cpm.sh
tools/assemble_rfs.sh
tools/assemble_roms.sh
tools/make_cpmdisks.sh
tools/make_roms.sh
tools/make_sdcard.sh

䞊蚘コマンドの出力は ROM むメヌゞ <roms>/MROM_256.bin ず <roms>/USER_ROM.256.bin で、512KByte フラッシュ RAM にフラッシュしお RFS アダプタヌの゜ケットに取り付ける必芁がありたす。

CPM ディスクむメヌゞは <CPM>/1M44/RAWロヌ圢匏たたは <CPM>/1M44/DSKCPC Extended フォヌマットにありたす。これらのむメヌゞは <CPM> のディレクトリから䜜成され、CPM* で始たる各ディレクトリは 1 ぀の 1.44MB ドラむブむメヌゞにパッケヌゞされたす。たた、察応するディレクトリの他のすべおのサポヌトディスクフォヌマットのむメヌゞにもパッケヌゞされたす䟋16MB SD カヌドドラむブむメヌゞ甚の <CPM>/SDC16M。

SD カヌドむメヌゞは <roms>/SHARP_MZ80A_RFS_CPM_IMAGE_1.img にあり、<roms>/SHARP_MZ80A_RFS_IMAGE_1.img で始たり、䞊蚘のように <CPM>/SDC16M/RAW に栌玍された 7 ぀の CPM フォヌマットドラむブむメヌゞが続きたす。これらのむメヌゞは <CPM> のディレクトリからビルドされたすが、make_cpmdisks.sh スクリプトにハヌドコヌドされお最終むメヌゞに手動で远加されたす。

ROM ドラむブに栌玍されるアプリケヌションは <MZF> ディレクトリにありたす。このディレクトリに必芁なアプリケヌションをコピヌし、以䞋のコマンドを実行しおセクタヌ䞞めむメヌゞに倉換しお <MZB> ディレクトリに保存したす

cd <software>
tools/processMSFfiles.sh

ROM にビルドされる実際のアプリケヌションは <tools>/make_roms.sh スクリプトで遞択されたす。このスクリプトは必芁なすべおのアプリケヌションをリストし、スペヌスが蚱す限り ROM にパックしたす。アプリケヌションを ROM に確実に含めるには、リストの先頭に远加したす.MZF 拡匵子なしのファむル名のみ

ファむル <tools>/make_roms.sh を線集
行を探す: ROM_INCLUDE=
この行の䞋に、フォヌマット: ROM_INCLUDE+="${MZBPATH}/<YOUR APPLICATION>.${SECTORSIZE}.bin" でアプリケヌションを远加
䟋: ROM_INCLUDE+="${MZB_PATH}/A-BASIC_SA-5510.${SECTORSIZE}.bin:"
ファむルを保存しお䞊蚘のコマンドを実行しお MonitorROM ず USERRROM をビルドする。

ディスクフォヌマット

わかったこずですが、CP/M ディスクフォヌマットは数癟もあり、Sharp シリヌズだけでもマシンごずに 2〜3 皮類実装されおいたす。この CP/M 実装に䜿甚するフォヌマットを決定するにあたり、既存のフォヌマットを調べたした。オリゞナルの Sharp MZ80A ディスクを入手できず、反転された非暙準フォヌマットを䜿甚しおいるこず、MZ80B が MZ80A に䌌おやや倧容量であるこず、MZ800 がハむブリッドであるこず、MZ80K が䜎容量であるこずから、1.44MB、720K の 3.5” フロッピヌの暙準フォヌマットSharp MZ80A ディスクず同じ物理フォヌマットず ROM ベヌスの 240K ROM ドラむブを䜿甚するこずにしたした。

䜿甚しおいるフォヌマットは以䞋の diskdefs 定矩を䜿甚しお cpmtools で操䜜できたす。以䞋を cpmtools たたは CPMToolsGUI の diskdefs ファむルに远加しお䜿甚しおください

   # MZ80A 甹 320K ディスク - MZ800 ず同じフォヌマットだが
   # シリンダヌを均䞀な方法で実装1 cyl = 1 track × 2(heads)、
   # MZ800 は 160 トラック、80 × ヘッド 1 0->79、次に 80 × ヘッド 2 80->159 ずしお実装。
   diskdef MZ80A-A
     seclen 256
     tracks 40
     sectrk 32
     blocksize 2048
     maxdir 64
     skew 0
     boottrk 1
     os 2.2
   end

   # MZ80A 甚暙準 1.44Mb フロッピヌフォヌマット
   diskdef MZ80A-1440
     seclen 512
     tracks 80
     sectrk 36
     blocksize 2048
     maxdir 128
     skew 0
     boottrk 0
     os 2.2
   end

   # MZ80A 甚暙準 720K フロッピヌフォヌマット。
   diskdef MZ80A-720
     seclen 256
     tracks 80
     sectrk 36
     blocksize 2048
     maxdir 128
     skew 0
     boottrk 0
     os 2.2
   end

   # 240K Rom Filing System ROM ドラむブむメヌゞ。
   diskdef mz80a-rfs
     seclen 128
     tracks 15
     sectrk 128
     blocksize 1024
     maxdir 32
     skew 0
     boottrk 0
     os 2.2
   end

   # 16MB 固定ディスク SD カヌドむメヌゞ。
   diskdef MZ80A-SDC16M
     seclen 512
     tracks 1024
     sectrk 32
     blocksize 8192
     maxdir 512
     skew 0
     boottrk 0
     os 2.2
   end
CP/M 内でこれらの物理ディスクフォヌマットはディスクパラメヌタヌブロックで以䞋のように衚されたす。通垞はこれらの蚭定や䞊蚘の diskdefs を気にする必芁はありたせんが、独自のカスタムフォヌマットを远加する必芁がある堎合に圹立ちたす
定矩 MZ80A 320K Rom Filing System 1.44MB 3.5” 720K 3.5” 16MB SD カヌドむメヌゞ
SPT 64 128 144 72 128
BSH 4 3 4 4 6
BLM 15 7 15 15 63
EXM 1 0 0 0 3
DSM 155 240 719 359 2047
DRM 63 31 127 127 511
AL0 128 128 192 192 192
AL1 0 0 0 0 0
CKS 16 8 32 32 0
OFF 1 0 0 0 0
既存の Sharp CP/M プログラムを䜿甚するには、ディスクからプログラムを抜出しおこの実装が認識するフォヌマットに远加する必芁がありたす。以䞋のセクションでは、各マシンのディスクからデヌタを抜出する方法を説明したす。

CP/M ディスクの䜜成

開発には Sharp MZ80-AFI むンタヌフェヌスカヌドに接続した Lotharek HxC フロッピヌ゚ミュレヌタヌを䜿甚したした。この構成により、Sharp MB8866 フロッピヌディスクコントロヌラヌが通信できる任意のディスクドラむブを゚ミュレヌトできたす。これが 3.5" フォヌマットに至り、テストした方法です。これらのドラむブはただ入手可胜で、ほずんどの CP/M 操䜜に十分な容量がありたす。

この CP/M 実装で Sharp MZ80A 䞊で䜿甚できる CP/M ディスクを䜜成するには、䞊蚘の定矩を cpmtools の diskdefs ファむルに远加する必芁がありたす。远加埌、\<CPM\>/BLANKFD にある空癜むメヌゞの 1 ぀を新しい名前にコピヌしおタヌゲットディスクずしお䜿甚するか、ディスク定矩を䜿甚しお CPMTools 内からディスクを䜜成したす。次に、CPMToolsGUI ではドラッグアンドドロップで新しいディスクに必芁なプログラムを远加したす。

新しいロヌの CP/M むメヌゞをフロッピヌ゚ミュレヌタヌたたは実際のフロッピヌディスクドラむブで䜿甚するには、ロヌむメヌゞをほずんどのフロッピヌディスクツヌルがフロッピヌに読み曞きできるフォヌマットに倉換する必芁がありたす。Lotharek フロッピヌ゚ミュレヌタヌの堎合は、HxCFloppyEmulator v2.2.2.1 ツヌルを䜿っお Load ず Export to HFE で実際のフロッピヌを暡倣する適切な SD むメヌゞが生成されたす。

むメヌゞを倉換するには以䞋のいずれかを䜿甚しおください

1.44MB ドラむブ甚
./samdisk copy <RAW IMAGE FILE, ie. CPM00_SYSTEM.RAW> <DSK IMAGE FILE, ie.CPM00_SYSTEM.DSK> --cyls=80 --head=2 --gap3=78 --sectors=36 --interleave=4
Samdisk はファむルのサむズ1474560 バむトからフォヌマットを自動認識したす。

720K ドラむブ甚
./samdisk copy <RAW IMAGE FILE, ie. CPM00_SYSTEM.RAW> <DSK IMAGE FILE, ie.CPM00_SYSTEM.DSK> --cyls=80 --head=2 --gap3=78 --sectors=36 --size=2 --interleave=4
Samdisk はファむルのサむズ737280 バむトからフォヌマットを自動認識したす。

MZ80A 320K ドラむブ甚
./samdisk copy CPM00_320K_SYSTEM.RAW CPM00_320K_SYSTEM.DSK --cyls=40 --gap3=78 --head=2 --sectors=16
Samdisk はファむルのサむズ327680 バむトからフォヌマットを自動認識したす。

RFS ROM ドラむブは倉換䞍芁です。RFS 機胜はロヌむメヌゞを前提ずしおいたす。

泚意: Samdisk v4 は䜿わないでください。ディスクの先頭にランダムなセクタヌを配眮するバグがありたす。
このバグにより䜕時間ものデバッグ時間が倱われたした。v3.8.8 を䜿甚するこずをお勧めしたす。

䞊蚘の samdisk コマンドは Amstrad CPC Extended DSK フォヌマットむメヌゞを䜜成したす。これは Lotharek HxCFloppyEmulator たたは物理フロッピヌに曞き蟌むツヌルで読み曞きできたす。

MZ80A CP/M ディスクの抜出

Sharp MZ-80A はフロッピヌディスクデヌタを反転フォヌマットで保存したす — ディスク䞊のすべおのバむトは実際のデヌタバむトのビット単䜍の補数です。これは MZ-80A のフロッピヌディスクコントロヌラヌのハヌドりェア特性であり、たずすべおのバむトを反転させないず CPMTools でロヌディスクむメヌゞを盎接読み取るこずができたせん。

オンラむンで入手可胜なほずんどの MZ-80A CP/M ディスクむメヌゞは EDSKAmstrad CPC Extended DSKフォヌマットです。ディスクゞオメトリは 40 シリンダヌ、2 ヘッド、トラックあたり 16 セクタヌ、セクタヌあたり 256 バむト合蚈 320KBです。

EDSK むメヌゞをフラット RAW むメヌゞに倉換するには samdisk を䜿甚しおください

  samdisk copy <MZ80A DISK NAME>.DSK <MZ80A DISK NAME>.RAW --cyls=40 --head=2 --sectors=16 --size=256

以䞋のコマンドを実行しお RAW むメヌゞの各バむトを反転させ、MZ-80A の反転フォヌマットを CPMTools が凊理できる暙準デヌタに倉換したす

  python3 -c "import sys; sys.stdout.buffer.write(bytes(~b & 0xFF for b in open('<MZ80A DISK NAME>.RAW','rb').read()))" > <MZ80A DISK NAME>_normal.RAW

CPMTools で MZ80A-A diskdef䞊蚘のディスク定矩セクションで定矩を䜿甚しお、凊理されたむメヌゞのファむルを䞀芧衚瀺・抜出したす

  # ディスク䞊のファむルを䞀芧衚瀺
  cpmls -f MZ80A-A <MZ80A DISK NAME>_normal.RAW

  # すべおのファむルをロヌカルディレクトリにコピヌ
  cpmcp -f MZ80A-A <MZ80A DISK NAME>_normal.RAW 0:*.* /output/directory/
抜出埌、プログラムは CPMTools を䜿甚しおこの CP/M 実装でサポヌトされおいるフォヌマットMZ80A-1440、MZ80A-720、MZ80A-A たたは mz80a-rfsの新しいディスクむメヌゞに配眮でき、䞊蚘の「CP/M ディスクの䜜成」セクションで説明した通り samdisk でフロッピヌ゚ミュレヌタヌむメヌゞに倉換できたす。物理的な MZ-80A フォヌマットディスクに曞き戻す際は、バむト反転を逆に適甚する必芁があるこずに泚意しおください。

MZ80K CP/M ディスクの抜出

Sharp MZ-80K はフロッピヌディスクに暙準非反転デヌタを䜿甚するため、ビット反転は䞍芁です。ただしディスクフォヌマットは MZ-80A ず異なり、容量が少なくなっおいたす — MZ-80K は 5.25" シングルデンシティシングルサむドドラむブを察象ずしお蚭蚈されたした。MZ-80K CP/M ディスクのブヌトセクタヌは、最初のセクタヌの先頭にマヌカヌバむト 01h ずそれに続く ASCII 文字列 IPLPRO で識別されたす。

MZ-80K CP/M ディスクむメヌゞは通垞 EDSK たたはロヌ圢匏で入手できたす。ディスクゞオメトリは 40 シリンダヌ、1 ヘッド、トラックあたり 18 セクタヌ、セクタヌあたり 128 バむト玄 90KBです。

EDSK ゜ヌスからロヌむメヌゞを抜出するには samdisk を䜿甚しおください

  samdisk copy <MZ80K DISK NAME>.DSK <MZ80K DISK NAME>.RAW --cyls=40 --head=1 --sectors=18 --size=128
バむト反転は䞍芁です。MZ-80K フォヌマット甚の適切な diskdef を䜿甚しお CPMTools で RAW むメヌゞを盎接読み取るこずができたす。MZ-80K フォヌマットはこの CP/M 実装でネむティブに䜿甚されおいないため、ファむルを抜出したら RFS たたは TZFS システムで䜿甚するためにサポヌトされおいる MZ-80A フォヌマットMZ80A-1440 や MZ80A-720 などの 1 ぀に配眮する必芁がありたす。
  # ファむルを䞀芧衚瀺diskdef 名を MZ-80K diskdef ゚ントリヌに合わせお調敎
  cpmls -f mz80k <MZ80K DISK NAME>.RAW

  # すべおのファむルを抜出
  cpmcp -f mz80k <MZ80K DISK NAME>.RAW 0:*.* /output/directory/

MZ80B CP/M ディスクの抜出

Sharp MZ-80B は MZ-80A ず同様に、フロッピヌディスクデヌタを反転フォヌマットで保存したす — ディスク䞊のすべおのバむトが実際のデヌタのビット単䜍の補数です。MZ-80B のブヌトセクタヌは最初のセクタヌの先頭にマヌカヌバむト 03h ずそれに続く IPLPRO で識別され、MZ-80A01hや MZ-80K01hず区別されたす。

MZ-80B の容量は MZ-80A よりやや倧きく、40 シリンダヌ、2 ヘッド、トラックあたり 18 セクタヌ、セクタヌあたり 256 バむト玄 368KBを䜿甚したす。ほずんどの入手可胜なディスクむメヌゞは EDSK フォヌマットです。

EDSK むメヌゞをフラット RAW むメヌゞに倉換するには samdisk を䜿甚しおください

  samdisk copy <MZ80B DISK NAME>.DSK <MZ80B DISK NAME>.RAW --cyls=40 --head=2 --sectors=18 --size=256

MZ-80A ず同様のバむト反転を適甚しお反転デヌタを暙準フォヌマットに倉換したす

  python3 -c "import sys; sys.stdout.buffer.write(bytes(~b & 0xFF for b in open('<MZ80B DISK NAME>.RAW','rb').read()))" > <MZ80B DISK NAME>_normal.RAW
適切な MZ-80B diskdef を䜿甚しお CPMTools で凊理された RAW むメヌゞからファむルを䞀芧衚瀺・抜出したす。抜出埌、「CP/M ディスクの䜜成」セクションで説明した通り RFS たたは TZFS での䜿甚のためにサポヌトされおいる MZ-80A フォヌマットのディスクむメヌゞにプログラムをコピヌしたす。
  # ファむルを䞀芧衚瀺diskdef 名を MZ-80B diskdef ゚ントリヌに合わせお調敎
  cpmls -f mz80b <MZ80B DISK NAME>_normal.RAW

  # すべおのファむルを抜出
  cpmcp -f mz80b <MZ80B DISK NAME>_normal.RAW 0:*.* /output/directory/

MZ800 CP/M ディスクの抜出

MZ800 シリヌズコンピュヌタヌは、ブヌトトラックが反転デヌタを䜿甚し CP/M トラックが暙準デヌタを䜿甚する混合フォヌマットのディスクを䜿甚したす。さらに悪いこずに、トラックの順序はヘッド 0 がトラック 0-39、ヘッド 1 がトラック 40-79 ずいう構造です。これらのディスクを䜿甚するには、デヌタを抜出しお私が䜜成したフォヌマットの 1 ぀にコピヌするのが最善です。この奇劙なフォヌマットに察応するための远加コヌドを远加する意矩を感じないためです。

samdisk を䜿甚しお EDSKAmstrad CPC マシン甚に䜜成された Extended DSK フォヌマット、ほずんどの MZ800 ディスクはこのフォヌマットのようですを RAW むメヌゞに倉換したす。

  samdisk copy <MZ800 DISK NAME>.DSK <MZ800 DISK NAME>.RAW --cyls=40 --head=2 --sectors=8 --size=256

䞊蚘で取埗した RAW フォヌマットのディスクを CPMTools で読み取れる圢匏に倉換するために以䞋の bash コマンドを実行したす。

   mv <MZ800 DISK NAME>.RAW workingfile.raw
   > total
   dd if=workingfile.raw of=total count=8192 bs=1
   for i in $(seq 8192 8192 327680); do
     dd if=workingfile.raw of=blob skip=$i bs=1 count=4096
     cat blob >> total
     echo $i
   done
   for i in $(seq 12288 8192 327680); do
     dd if=workingfile.raw of=blob skip=$i bs=1 count=4096
     cat blob >> total
     echo $i
   done
   mv total <MZ800 DISK NAME>.RAW

凊理された RAW むメヌゞのデヌタを読み取るには以䞋の diskdefs 定矩が必芁です。

   # MZ800 CP/M ブヌトディスクの定矩。予玄
   # トラックは反転デヌタフォヌマットですが CPM Tools ではスキップされたす。
   diskdef mz800-BOOT
     seclen 256
     tracks 80
     sectrk 16
     blocksize 2048
     maxdir 64
     skew 0
     boottrk 1
     os 2.2
   end

   # MZ800 CP/M デヌタディスクの定矩。予玄トラックなし。
   diskdef mz800-DATA
     seclen 256
     tracks 80
     sectrk 16
     blocksize 2048
     maxdir 64
     skew 0
     boottrk 0
     os 2.2
   end

CP/M アヌカむブ

CP/M アヌカむブはファむルの保存/アヌカむブには適切な堎所ではないため Gitea から削陀したした。必芁な堎合はzip ファむルをダりンロヌドしおリポゞトリの <repo>/software ディレクトリに解凍しおください。

アヌカむブ内のファむルは厳遞されたプログラムで、様々な CP/M アヌカむブから集められ、呜名芏則 CPM[0-9[0-9]_<Contents> のディレクトリに敎理されおいたす。たたアヌカむブを敎理した圌の䜜業に適切なクレゞットず著䜜暩を付しおGrant Searle の MultiComp コンピュヌタヌ耇数のコンピュヌタヌを 1 ぀に、たたは耇数の CPU タむプを持ち、そのモヌドの 1 ぀が CP/M を実行するからのアヌカむブも含たれおいたす。Grant のアヌカむブは優れおおり、MZ80A で CP/M を䜿甚するための理想的な基盀ずなりたす。

3.5” ドラむブたたはフロッピヌ゚ミュレヌタヌでの䜿甚に適した 1.4MB フロッピヌむメヌゞのセットにアヌカむブをビルドするには、以䞋のコマンドを実行したす

cd <software>
tools/make_cpmdisks.sh

ディスクはディレクトリ <CPM>/1M44/DSK に䜜成されたす。

このスクリプトはアヌカむブの組み合わせを䜿甚しお 16MB SD カヌドドラむブむメヌゞもビルドしたす。この組み合わせはスクリプト内にハヌドコヌドされおいたす。

CP/M マニュアル

マニュアル 説明
ナヌザヌマニュアル CP/M v2.2 ナヌザヌマニュアル。
SID シンボリック呜什デバッガヌナヌザヌガむド。
ED ゚ディタヌナヌザヌガむド。
MAC マクロアセンブラヌナヌザヌガむド。
ASM Z80/8080 アセンブラヌナヌザヌガむド。
DDT 動的デバッグツヌルナヌザヌガむド。

開発者ガむド

Sharp MZ 䞊の CP/M の内郚アヌキテクチャの理解、CBIOS の倉曎、新しいディスクフォヌマットの远加、゜ヌスからのビルドに぀いおは、包括的なCP/M 開発者ガむドをご芧ください。CCP/BDOS/CBIOS のレむダリング、RFS ず TZFS 䞡プラットフォヌムのメモリマップ、ディスクパラメヌタブロック、ANSI タヌミナル゚ミュレヌタ、ストレヌゞコントロヌラ、ビルドシステム、CI/CD パむプラむンを網矅しおいたす。