Sharp MZシリーズ CP/M v2.23 - 開発者ガイド

概要

この開発者ガイドは、Sharp MZシリーズコンピューター上のCP/M v2.23実装に関する包括的な技術リファレンスです。CCP、BDOS、CBIOSの内部アーキテクチャ、RFS(ROM Filing System)およびTZFS(tranZPUter Filing System)プラットフォームのメモリマップ、Disk Parameter Blockを含むディスクサブシステム、そして新しいディスクフォーマットの追加やシステムの変更に関するステップバイステップの手順を解説します。

このプロジェクトには2つの異なるCP/M実装が存在します:
  • RFS CP/M — RFS/RomDiskアップグレードボードを搭載したMZ-80Aで動作します。CBIOSはバンク切り替えROM(メイン1つ + ページドバンク4つ)に格納され、アプリケーションが利用できるTransient Program Area(TPA)を最大化します。
  • TZFS CP/M — tranZPUterボードを搭載した任意のSharp MZマシンで動作します。CBIOSはtranZPUterのメモリモード切り替えを使用して、完全な64KB RAMスペースと別の48KBバンクに拡張CBIOSロジックを提供します。5つのビルドバリアントが異なるマシンとディスプレイ構成をターゲットとしています。

CP/Mアーキテクチャ

CP/M v2.2(およびここで使用されるv2.23バリアント)は、それぞれ明確に定義された役割とインターフェースを持つ3つの階層モジュールで構成されています。いずれかのコンポーネントを変更する前に、この階層構造を理解することが不可欠です。

CCP — Console Command Processor

CCPはユーザー向けのコマンドラインシェルです。キーボードからコマンドを読み取り、解析し、組み込みコマンド(DIRRENERATYPESAVEUSER)を実行するか、ディスクから.COMトランジェントプログラムを読み込んで実行します。CCPは約2KBを占有し、CBASE(RFSでは0xA000、TZFSでは0xDA00)にロードされます。

CCPはDigital Researchの標準コード(Clark A. Calkinsにより1981年2月にメモリイメージから再構築)であり、通常は変更すべきではありません。CCPのメモリ空間を必要とするトランジェントプログラムはCCPを上書きすることがあります。プログラム終了時にウォームブートがCCPをディスクまたはROMから再読み込みします。

BDOS — Basic Disk Operating System

BDOSは、アドレス0x0005の単一エントリーポイントを介してアプリケーションにすべてのシステムサービスを提供します。アプリケーションはレジスタCにファンクション番号を設定し、CALL 5を呼び出します。BDOSはファイル操作(オープン、クローズ、読み取り、書き込み、検索、削除、リネーム)、コンソールI/O、およびディスク管理を処理します。

BDOSもDigital Researchの標準コードであり、この実装では変更されていません。CBASE + 0x0806から開始されます。

CBIOS — Custom Basic Input Output System

CBIOSはハードウェア抽象化レイヤーであり、異なるCP/Mマシン間で唯一変更されるコンポーネントです。BDOSとCCPがハードウェア操作を実行するために呼び出す17個の標準化されたエントリーポイント(ジャンプテーブル)を提供します。CBIOSはCBASE + 0x1600から開始されます。

このプロジェクトのCBIOSは、Sharp MZハードウェア向けにゼロから構築された実装です。CP/Mの最小要件をはるかに超え、割り込み駆動のキーボード入力、ANSIターミナルエミュレーター、リアルタイムクロック、SDカードおよびフロッピーディスクコントローラー、ROMディスクサポートを提供します。

メモリマップ

RFSメモリマップ

RFS CP/M実装は、RFS/RomDiskアップグレードボードがインストールされた標準的なMZ-80Aで動作します。CBIOSはROMに格納され、アプリケーションで利用可能なRAMを最大化しています。メモリレイアウトは以下の通りです:
アドレス範囲 内容
0x0000 - 0x00FF CP/Mページゼロ:ウォームブートベクター、IOBYTE、ドライブ/ユーザー、BDOSエントリー
0x0100 - 0x9FFF TPA(Transient Program Area) — アプリケーション用に約40KB使用可能
0xA000 - 0xA805 CCP(Console Command Processor)
0xA806 - 0xB5FF BDOS(Basic Disk Operating System)
0xB600 - 0xBFFF CBIOSスタブ + Disk Parameter Header + ディレクトリバッファ + ドライブアロケーションベクター
0xC000 - 0xCFFF CBIOSメイン(4KB MROM Bank 2) — ジャンプテーブル、初期化、ROMディスク、割り込み
0xD000 - 0xD7FF ビデオRAM(文字表示)
0xD800 - 0xDFFF アトリビュートRAM(カラー/属性)
0xE000 - 0xE7FF メモリマップドI/O(キーボード、PIO、CTC、サウンド)
0xE800 - 0xEFFF ページドUser ROM — CBIOS拡張用の4バンク:
    Bank 8: オーディオ、RTC、キーボード
    Bank 9: 画面I/O、ANSIターミナルパーサー
    Bank 10: SDカードコントローラー
    Bank 11: フロッピーディスクコントローラー
0xF000 - 0xFFFF FDC ROM領域(ディスクDMA操作中にアクティブ)

TZFSメモリマップ

TZFS CP/M実装は、tranZPUterボードのメモリモード切り替えを使用して、完全な64KB連続RAMスペースを提供します。CBIOSは2つのメモリモードを使用します:
  • Mode 16 — 全64KBがRAM。すべてのSharp MZハードウェアはページアウトされます。CP/Mアプリケーションはこのモードで動作します。
  • Mode 17 — 拡張CBIOSロジック用の48KB RAMバンクにアクセス可能で、I/O操作のためにSharpハードウェアが見える状態になります。
CBIOSジャンプテーブルはCP/Mアドレス空間の最上部に配置され、必要に応じてモード間を切り替えます。
アドレス範囲 Mode 16(CP/M) Mode 17(CBIOS拡張)
0x0000 - 0x00FF CP/Mページゼロ CBIOS拡張コード(cbiosII.asm)
0x0100 - 0xD9FF TPA — アプリケーション用に約55KB使用可能 CBIOS拡張コード + 変数
0xDA00 - 0xE205 CCP Sharpハードウェアが可視
0xE206 - 0xEFFF BDOS Sharpハードウェアが可視
0xF000 - 0xF7FF CBIOSコード(2KB) CBIOSコード(同一)
0xF800 - 0xFFFF CBIOS変数、バッファ、スタック(2KB) CBIOS変数(同一)
注意: アドレス0xF3C0-0xF3FFおよび0xF7C0-0xF7FFはFDCコントローラーのハードウェアベクター用に予約されており、CBIOSコードやデータには使用できません。

CBIOSジャンプテーブル

CBIOSはコード領域の先頭に標準的なCP/M 2.2ジャンプテーブルを提示します。BDOSとCCPはこれらのエントリーポイントを呼び出してすべてのハードウェア操作を実行します。
オフセット ラベル 機能 説明
+0 BOOT コールドブート ハードウェアの1回限りの初期化を行い、CCPにジャンプ
+3 WBOOT ウォームブート CCP+BDOSを再読み込みし、ハードウェア状態をリセットし、CCPにジャンプ
+6 CONST コンソールステータス キーが利用可能ならA=0xFF、そうでなければA=0x00を返す
+9 CONIN コンソール入力 文字を待ち、Aレジスタに返す(ANSI処理付き)
+12 CONOUT コンソール出力 Cレジスタの文字をディスプレイに出力(ANSIターミナルエミュレーター経由)
+15 LIST プリンター出力 Cレジスタの文字をリストデバイスに出力
+18 PUNCH パンチ出力 Cレジスタの文字をパンチデバイスに出力(未使用)
+21 READER リーダー入力 リーダーデバイスから文字を読み取り(未使用)
+24 HOME ホームシーク 選択されたディスクのヘッドをトラック0に移動
+27 SELDSK ディスク選択 Cレジスタのディスクを選択。HL=DPHアドレスまたはエラー時HL=0を返す
+30 SETTRK トラック設定 次の読み書き用にBCレジスタのトラック番号を設定
+33 SETSEC セクター設定 次の読み書き用にBCレジスタのセクター番号を設定
+36 SETDMA DMAアドレス設定 ディスクデータ転送用にBCレジスタのメモリアドレスを設定
+39 READ セクター読み取り 128バイトCP/Mセクターを読み取り。成功時A=0、エラー時A=1を返す
+42 WRITE セクター書き込み 128バイトCP/Mセクターを書き込み。成功時A=0、エラー時A=1を返す
+45 LISTST リストデバイスステータス リストデバイスが準備完了ならA=0xFF、そうでなければA=0x00を返す
+48 SECTRN セクター変換 テーブルDEを使用して論理セクターBCを変換。HL=物理セクターを返す
+51 (RFS: 未使用 / TZFS: DEBUG) RFS: NOP NOP RET。TZFS: デバッグフック
+54 BANKTOBANK バンク間コール(RFSのみ) バンク切り替えを伴う別のROMバンクの関数を呼び出し

バンク切り替え — RFS

RFS CBIOSは、メインMROMで利用可能な4KBを超えるためにハードウェアROMバンク切り替えを使用します。4つの2KBページドROMバンク(Bank 8〜11)がアドレス0xE800〜0xEFFFにマッピングされます。各バンクはバンク開始位置からオフセット0x0020にパブリックジャンプテーブルを持ちます。

異なるバンクの関数を呼び出すには、CBIOSがバンク番号をBNKSELUSERレジスタ(0xEFFE)に書き込み、関数アドレスにジャンプします。BANKTOBANK_ルーチン(ジャンプテーブルオフセット+54)は汎用的なバンク間コールメカニズムを提供します:
Input:  A[7:4] = Target bank number
        A[3:0] = Calling bank number
        HL     = Address of function to call
        AF     = On stack, passed to called function
Output: All registers preserved from called function

メモリモード切り替え — TZFS

TZFS CBIOSは、tranZPUterのメモリ管理ユニット(I/Oポート0x60のMMCFGレジスタ)を使用してメモリモードを切り替えます。CBIOSは通常、CP/Mアプリケーション用にMode 16(完全な64KB RAM、ハードウェアなし)で動作し、キーボード、画面、FDC、またはSDカードハードウェアにアクセスする必要がある場合にMode 17(ハードウェアが可視)に切り替えます。

cbiosII.asm内の拡張CBIOSコードは、Mode 17 RAMバンクのアドレス0x0000から配置されます。これにより、ANSIターミナルエミュレーター、キーボードドライバー、ディスクコントローラー、変数ストレージを含むCBIOSロジック用に約48KBのスペースが提供されます。

ディスクサブシステム

Disk Parameter Block

CP/Mのすべてのディスクフォーマットは、Disk Parameter Block(DPB)で記述されます。DPBは、論理操作(ファイルの読み書き)を物理ディスク操作(トラック/セクターI/O)にどのようにマッピングするかをBDOSに伝えます。新しいディスクフォーマットを追加するには、DPBの理解が不可欠です。

各DPBは以下のフィールドを含む16バイトで構成されます:

フィールド サイズ 説明
SPT 2バイト Sectors Per Track — トラックあたりの128バイト論理セクター数
BSH 1バイト Block Shift Factor — log2(block_size/128)。1KBの場合BSH=3、2KBの場合4、8KBの場合6
BLM 1バイト Block Mask — (2^BSH)-1。1KBブロックの場合BLM=7、2KBの場合15、8KBの場合63
EXM 1バイト Extent Mask — ディレクトリエントリーあたりのエクステント数を決定
DSM 2バイト Disk Size Maximum — アロケーションブロックの総数マイナス1
DRM 2バイト Directory Maximum — ディレクトリエントリーの総数マイナス1
AL0 1バイト Allocation Bitmapバイト0 — ディレクトリ用に予約されたブロックをマーク
AL1 1バイト Allocation Bitmapバイト1
CKS 2バイト Check Size — リムーバブルメディアの場合(DRM+1)/4、固定ディスクの場合0
OFF 2バイト Track Offset — 予約済み(システム)トラック数

サポートされるディスクフォーマット

以下のディスクフォーマットがサポートされており、対応するDPB値を示します:

パラメータ MZ80A 320K ROM RFS 240K 1.44MB 3.5” 720K 3.5” 16MB SD Card
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
容量 320KB 240KB 1.44MB 720KB 16MB
ジオメトリ 40c/2h/16s/256B 15c/1h/128s/128B 80c/2h/36s/512B 80c/2h/36s/256B 1024c/1h/32s/512B
ブロックサイズ 2KB 1KB 2KB 2KB 8KB

動的ドライブ割り当て

コールドブート時に、CBIOSは利用可能なハードウェア(ROMドライブ、フロッピーディスクコントローラー、SDカード)を検出し、CP/Mドライブ文字を動的に割り当てます。優先順位は以下の通りです:
  1. ROMドライブ — Flash ROMに格納された読み取り専用ドライブ(0、1、または2ドライブ)
  2. フロッピーディスク — FDCハードウェアが検出された場合(最大2ドライブ)
  3. SDカード — SPI/SDハードウェアが検出された場合(複数の16MBドライブ)
最大ドライブ数はMAXDISKS定数(デフォルトは7)と、cpm_definitions.asmCSVALVEND - CSVALVMEM範囲で管理されるDisk Parameter Headerおよびアロケーションベクター用に割り当てられたRAMによって制限されます。割り当てメモリを増やすと、より多くのSDカードドライブが表示可能になります。

新しいディスクフォーマットの追加

新しいディスクフォーマット(例えば、カスタムフロッピージオメトリや異なるSDカードパーティションサイズ)を追加するには、以下の手順に従ってください:

ステップ1:DPBの設計

ディスクフォーマットのDPB値を計算します:

1. 物理ジオメトリを決定する:
   - Cylinders (C), Heads (H), Sectors per Track (S), Sector Size (bytes)
   - Total capacity = C x H x S x SectorSize

2. ブロックサイズを選択する(1KB、2KB、4KB、8KB、または16KBでなければならない):
   - 1KBブロック: BSH=3, BLM=7    (256KB未満の小さなディスクに適切)
   - 2KBブロック: BSH=4, BLM=15   (256KB〜1MBの中程度のディスクに適切)
   - 4KBブロック: BSH=5, BLM=31   (1MB〜8MBに適切)
   - 8KBブロック: BSH=6, BLM=63   (8MB〜16MBに適切)

3. SPT = (SectorsPerTrack x Heads x PhysicalSectorSize) / 128 を計算

4. DSM = (TotalCapacity - ReservedTracks * TrackSize) / BlockSize - 1 を計算

5. DRM(ディレクトリエントリー数)を選択:通常、小は64、中は128、大は512

6. DSMとブロックサイズに基づいてEXMを計算:
   - DSM < 256:  EXM = (BlockSize / 1024) - 1
   - DSM >= 256: EXM = (BlockSize / 2048) - 1

7. AL0/AL1を設定してディレクトリブロックを予約(通常128,0または192,0)

8. CKS = リムーバブルメディアの場合(DRM+1)/4、固定の場合0

9. OFF = 予約済みシステムトラック数を設定

ステップ2:CBIOSソースにDPBを追加

CBIOSソース(RFSの場合はcbios.asm、TZFSの場合はcbiosII.asm)で、既存のDPB定義を見つけ、新しいDPBを追加します。各DPBはDWおよびDBディレクティブのシーケンスとして定義されます:
; Example: Custom 4MB disk format
DPB_CUSTOM:     DW      128             ; SPT - sectors per track
                DB      5               ; BSH - block shift (4KB blocks)
                DB      31              ; BLM - block mask
                DB      1               ; EXM - extent mask
                DW      1023            ; DSM - total blocks - 1
                DW      255             ; DRM - directory entries - 1
                DB      240             ; AL0 - allocation bitmap 0
                DB      0               ; AL1 - allocation bitmap 1
                DW      64              ; CKS - check size
                DW      0               ; OFF - reserved tracks

ステップ3:cpmtools diskdefの追加

cpmtoolsが新しいフォーマットでディスクイメージを作成・操作できるように、diskdefsファイルに一致する定義を追加します:
diskdef MY-CUSTOM-4MB
  seclen 512
  tracks 256
  sectrk 32
  blocksize 4096
  maxdir 256
  skew 0
  boottrk 0
  os 2.2
end

ステップ4:ドライブ検出の追加(新しいコントローラーの場合)

新しいフォーマットが新しいディスクコントローラー(既存のFDC、SD、ROMコントローラー以外)を必要とする場合は、以下が必要です:
  1. CBIOS BOOTルーチンにコントローラー初期化コードを追加
  2. セクター読み書き関数を実装
  3. BOOTシーケンスの動的ドライブ割り当てに検出ロジックを追加
  4. RFSの場合:スペースが必要であれば新しいROMバンクを追加
  5. TZFSの場合:Mode 17バンクのcbiosII.asmにコードを追加

ステップ5:ビルドとテスト

# Build the CP/M CBIOS with the new format
cd <project_root>
tools/assemble_cpm.sh

# Create a blank disk image in the new format
mkfs.cpm -f MY-CUSTOM-4MB blank_custom.img

# Add files to the new disk image
cpmcp -f MY-CUSTOM-4MB blank_custom.img local_file.com 0:FILE.COM

# Verify the disk contents
cpmls -f MY-CUSTOM-4MB blank_custom.img

コンソールI/O

キーボード処理

キーボードは、タイマーティックごと(100ms間隔)に実行される割り込み駆動のスキャンルーチンで処理されます。MZ-80Aのキーボードはマトリクススキャン方式を使用します:CBIOSがPort A(0xE000)にスキャンラインセレクトを書き込み、Port B(0xE001)からキーデータを読み取ります。すべてのキーを検出するために10本のスキャンラインがスキャンされます。

検出されたキー押下はリングバッファ(KEYBUF、RFSでは16バイト、TZFSでは64バイト)に格納されます。CONINルーチンはこのバッファから読み取り、空の場合は待機します。特殊なキーの組み合わせが検出されます:
  • SHIFT — 大文字や記号のキーコードを変更
  • CTRL — コントロール文字を生成(0x01〜0x1A)
  • GRAPH — グラフィックス文字コードを生成
  • SHIFT+GRAPH+BREAK — Sharp Monitor ROMへのウォームリブート
キーリピートは自動的に行われます:キーが複数のスキャンサイクルにわたって押し続けられると、初期遅延の後にバッファに再挿入されます。

ANSIターミナルエミュレーション

CONOUTルーチンは、ANSIエスケープシーケンスパーサー(Ewen McNeillのAmstrad CPC EwenTerm実装をベースに、Sharp MZハードウェア向けに大幅に改修)を通じて文字を処理します。これにより、VT52またはVT100ターミナルを期待するCP/Mアプリケーションが正しく動作します。

サポートされるANSIエスケープシーケンスは以下の通りです:
シーケンス 機能
ESC [nA カーソルをn行上に移動
ESC [nB カーソルをn行下に移動
ESC [nC カーソルをn列前に移動
ESC [nD カーソルをn列後ろに移動
ESC [r;cH カーソル位置を設定(行;列)
ESC [2J 画面クリア
ESC [K 行末までクリア
ESC [nm グラフィックスモード設定(太字、下線、反転など)
ESC [6n カーソル位置の報告
ESC [?25h カーソル表示
ESC [?25l カーソル非表示

ストレージコントローラー

SDカード — SPIインターフェース

SDカードはSPI(Serial Peripheral Interface)バスを介してアクセスされます。RFSボードv2.0以降では、PCB上にハードウェアSPIが直接搭載されています。以前のボードでは、バンク制御レジスタを介したビットバングSPIが使用されます。tranZPUterでは、K64FプロセッサーのSPIインターフェースが使用されます。

SDカードは16MB論理ディスクのセットとして表示されます。各ディスクはSDカードの連続した領域を占有し、ディスク番号がLBA(Logical Block Address)オフセットに変換されます。CBIOSの読み書きルーチンは、128バイトCP/Mセクターを512バイトSDカードセクターに変換するために、標準的なCP/Mデブロッキングアルゴリズムを使用します。

フロッピーディスクコントローラー — MB8866

Sharp MZ-80Aは、Western Digital WD1772/WD2793ファミリーとレジスタ互換の富士通MB8866フロッピーディスクコントローラー(FDC)を使用しています。FDCはI/Oポート0xD8〜0xDFを占有します:
ポート レジスタ
0xD8 コマンド/ステータスレジスタ
0xD9 トラックレジスタ
0xDA セクターレジスタ
0xDB データレジスタ
0xDC ドライブセレクト + モーター制御(bit 7 = モーターオン、bits 2:0 = ドライブ)
0xDD サイドセレクト(bit 0 = サイド)
MZ-80Aにはハードウェアの制限があります:2MHz Z80 CPUは、連続セクター転送のためにFDCのデータリクエストを十分な速度で処理できません。ハードウェアにはアドレス0xF3FEおよび0xF7FEのROMページングメカニズムが含まれており、FDCがデータリクエストを発信するとROMバンクを自動的に切り替えます。CBIOSのFDCルーチン(RFSではBank 11、TZFSではcbiosII.asm内)は、このハードウェア支援転送を慎重に管理します。

モーターは割り込みハンドラー内のカウントダウンタイマーで制御されます。最後のディスクアクセスの後、モーターは設定可能な期間(デフォルトで100タイマーティック = 10秒)動作してから自動的に停止します。

ROMディスク

ROMディスクは、RFSボードのFlash ROMバンクに格納された読み取り専用のCP/Mドライブです。各ROMドライブイメージは、連続した2KB User ROMバンクにパックされた生の240KB(設定可能)CP/Mファイルシステムです。CBIOSは、要求されたトラックとセクターからバンク番号とバンク内のオフセットを計算し、そのROMバンクに切り替えてデータをコピーすることでセクターを読み取ります。

ROMディスクは、SDカードやフロッピーディスクの状態に関係なく常に利用可能なCP/Mユーティリティ(アセンブラー、デバッガー、エディター)の永続的なセットを提供するのに有用です。

ビルドシステム

GLASS Z80アセンブラー

すべてのZ80アセンブリソースは、フラットバイナリ出力を直接生成する(リンクステップ不要)JavaベースのアセンブラーであるGLASS Z80 Assemblerを使用してコンパイルされます。GLASSは以下のように起動します:
java -jar glass.jar input.asm output.obj output.sym -I include_dir/
.objファイルはバイナリ出力(ROMプログラミングや連結にそのまま使用可能)です。.symファイルにはデバッグ用のシンボルテーブルが含まれます。

ビルドスクリプト

RFSとTZFSの両プロジェクトは、マスターbuild.shで管理される一連のシェルスクリプトを使用します。後のスクリプトは前のスクリプトの成果物に依存するため、ビルド順序が重要です。

RFSビルド順序:

ステップ スクリプト 生成物
1 (cpmtools compile) cpmcp, cpmls, mkfs.cpm, fsck.cpm(cpmtools/ソースから)
2 assemble_rfs.sh rfs.rom, rfs_mrom.rom(RFSカーネル)
3 assemble_cpm.sh cbios.rom, cbios_bank1-4.rom, cpm22.rom(CP/M CBIOS)
4 assemble_roms.sh Monitor ROM、MS BASICバリアント、IPL、ユーティリティ
5 make_roms.sh MROM_256.bin, USER_ROM.256.bin(Flash ROMイメージ)
6 make_cpmdisks.sh CP/Mディスクイメージ:1.44MBフロッピー + 16MB SDカード + ROMドライブ
7 make_sdcard.sh RFSドライブ + CP/Mディスクを含む完全なSDカードイメージ

TZFSビルド順序:

ステップ スクリプト 生成物
1 (cpmtools compile) cpmcp, cpmls, mkfs.cpm, fsck.cpm(cpmtools/ソースから)
2 assemble_tzfs.sh tzfs.rom(TZFSカーネル)
3 assemble_cpm.sh 5つのバリアントバイナリ:cpm223*.bin + cpm223*.mzf
4 assemble_roms.sh Monitor ROM、MS BASICバリアント、ユーティリティ
5 make_cpmdisks.sh CP/Mディスクイメージ:1.44MBフロッピー + 16MB SDカード

TZFSビルドバリアント

TZFS CP/Mは、異なるマシンとディスプレイ構成をターゲットとする5つのバリアントでビルドされます。バリアントはビルド時にcpm_buildversion.asmBUILD_VERSION値を書き込むことで選択されます:
バージョン ファイル拡張子 マシン ディスプレイ 説明
0 mz700_80c MZ-700 80桁 Video Module搭載のMZ-700、80桁ディスプレイ
1 mz80a_80c MZ-80A 80桁 Video Moduleまたは40/80 Colour Board搭載のMZ-80A
2 mz80a_40c MZ-80A 40桁 MZ-80A標準40桁ディスプレイ
3 mz700_40c MZ-700 40桁 MZ-700標準40桁ディスプレイ
4 mz1500_40c MZ-1500 40桁 MZ-1500標準40桁ディスプレイ
assemble_cpm.shスクリプトは5つのバリアントすべてをループし、それぞれに対して個別のcpm223_*.bincpm223_*.mzfを生成します。MZFファイルにはhdr/ディレクトリからのマシン固有のヘッダーが含まれ、TZFSを介して直接読み込むことができます。

ソースファイルリファレンス

RFS CP/Mソースファイル

ファイル 場所 サイズ 説明
cbios.asm asm/ 192KB メインCBIOS:ジャンプテーブル、初期化、ROMディスク、割り込み
cbios_bank1.asm asm/ 21KB オーディオ、RTC、キーボード(User ROM Bank 8)
cbios_bank2.asm asm/ 58KB 画面I/O、ANSIターミナル(User ROM Bank 9)
cbios_bank3.asm asm/ 45KB SDカードコントローラー(User ROM Bank 10)
cbios_bank4.asm asm/ 34KB フロッピーディスクコントローラー(User ROM Bank 11)
cpm22.asm asm/ 111KB CP/M v2.23 CCP + BDOSカーネル
cpm_definitions.asm asm/include/ 40KB ハードウェアアドレス、メモリレイアウト、定数
cpm_buildversion.asm asm/include/ <1KB ビルドバージョンセレクター(自動生成)
macros.asm asm/include/ 9KB Z80アセンブラーマクロ

TZFS CP/Mソースファイル

ファイル 場所 サイズ 説明
cbios.asm asm/ 66KB CBIOSフック:ジャンプテーブル、タイマーISR、キーボードスキャン
cbiosII.asm asm/ 160KB 拡張CBIOS:変数、ディスクI/O、画面、ANSI
cpm22.asm asm/ 154KB CP/M v2.23 CCP + BDOSカーネル
cpm_definitions.asm asm/include/ 40KB ハードウェアアドレス、メモリモード、定数
cpm_buildversion.asm asm/include/ <1KB ビルドバージョンセレクター(バリアントごとに自動生成)
macros.asm asm/include/ 9KB Z80アセンブラーマクロ

主要なインクルードファイル定義

cpm_definitions.asmファイルには、すべての設定可能な定数が含まれています。カスタマイズにおいて最も重要なものは以下の通りです:
定数 RFS値 TZFS値 説明
CBASE 0xA000 0xDA00 CCPの開始位置(TPAサイズを決定)
CBIOSSTART 0xC000 0xF000 CBIOSコードの開始位置
MAXDISKS 7 7 CP/Mドライブの最大数
KEYBUFSIZE 16 64 キーボードリングバッファサイズ(2の累乗でなければならない)
COLW 40 or 80 40 or 80 ディスプレイ幅(BUILD_80Cフラグで設定)
ROW 25 25 ディスプレイ高さ
TMRTICKINTV 5 5 タイマーティック間隔(5 x 0.01ms = 100ms)
MTROFFMSECS 100 100 FDCモーターオフタイマー(100ティック = 10秒)
HSTSIZ 512 512 ホストディスク物理セクターサイズ
HSTSPT 32 32 ホストディスクのトラックあたりセクター数

CI/CDパイプライン

CP/Mのビルドは、GiteaのRFSまたはTZFSリポジトリへのプッシュをトリガーとするJenkinsパイプラインで自動化されています。パイプラインはRFSとTZFSの両方のCP/Mバリアントをビルドし、成果物をパッケージ化し、両方のリポジトリでタグ付きリリースを作成します。

パイプラインステージ:

ステージ アクション
Prepare Build Image Java JRE、GCC、make、perl、python3、samdiskを含むDockerイメージをビルド
Checkout RFS GiteaからMZ80A_RFSリポジトリをクローン
Checkout TZFS GiteaからTZFSリポジトリをクローン
Determine Version 最新のGiteaリリースタグからバージョンを自動インクリメント
Build RFS CP/M cpmtoolsをコンパイル、CBIOS + CCP/BDOSをアセンブル、ROMとディスクイメージをビルド
Build TZFS CP/M cpmtoolsをコンパイル、5つのCBIOSバリアントをアセンブル、ディスクイメージをビルド
Package Releases tar.gzアーカイブを作成:CPM-RFS、CPM-TZFS、CPM-Complete
Create Gitea Releases MZ80A_RFSとTZFSの両リポジトリでタグ付けとリリース
Dockerビルドイメージにはすべての必要なツールが含まれています:OpenJDK 17(GLASS Z80アセンブラー用)、GCC/Make(cpmtoolsのソースからのコンパイル用)、perl(mzftool.pl用)、python3(ディスク処理スクリプト用)、samdisk v3.8.8(生のディスクイメージをAmstrad CPC Extended DSKフォーマットに変換するため)。

注意: samdiskは必ずv3.8.8を使用してください — バージョン4にはディスクの先頭にランダムなセクターを配置する既知のバグがあります。

クレジット

サードパーティの設計をベースにしたコンポーネントや使用したコンポーネントについては、ヘッダー内に原著者の著作権表示を含めるか、適切なクレジットを記載しています。すべてのサードパーティソフトウェアは、私の知る限り調査した範囲では、オープンソースであり自由に使用可能です。ライセンス制限のあるコンポーネントが見つかった場合は、このリポジトリから削除し、適切なリンク/設定を提供します。
  • CP/M v2.2 — Digital Research Inc.、Clark A. Calkinsにより再構築
  • ANSIターミナルパーサー — Ewen McNeillのAmstrad CPC EwenTermをベースに、大幅に改修
  • CP/Mデブロッキングアルゴリズム — SuperFabiusのZ80-MBC2プロジェクトの一部を使用
  • cpmtools — Michael Haardt作(lipro-cpm4lフォーク)
  • samdisk — Simon Owen作
  • GLASS Z80 Assembler — Grauw作

ライセンス

この設計(ハードウェアおよびソフトウェア)は、GNU Public Licence v3の下でライセンスされています。

GNU General Public License v3

このプロジェクトでGPL v3としてマークされたソースおよびバイナリファイルはフリーソフトウェアです:Free Software Foundationが発行したGNU General Public Licenseのバージョン3、またはそれ以降のバージョンの条件の下で、再配布および/または変更することができます。

ソースファイルは有用であることを期待して配布されていますが、商品性または特定の目的への適合性の黙示的保証を含め、いかなる保証もありません。詳細についてはGNU General Public Licenseを参照してください。

このプログラムとともにGNU General Public Licenseのコピーを受け取っているはずです。受け取っていない場合は、http://www.gnu.org/licenses/ を参照してください。