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実装が存在します:
このプロジェクトには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はユーザー向けのコマンドラインシェルです。キーボードからコマンドを読み取り、解析し、組み込みコマンド(
CCPはDigital Researchの標準コード(Clark A. Calkinsにより1981年2月にメモリイメージから再構築)であり、通常は変更すべきではありません。CCPのメモリ空間を必要とするトランジェントプログラムはCCPを上書きすることがあります。プログラム終了時にウォームブートがCCPをディスクまたはROMから再読み込みします。
DIR、REN、ERA、TYPE、SAVE、USER)を実行するか、ディスクから.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にファンクション番号を設定し、
BDOSもDigital Researchの標準コードであり、この実装では変更されていません。
CALL 5を呼び出します。BDOSはファイル操作(オープン、クローズ、読み取り、書き込み、検索、削除、リネーム)、コンソールI/O、およびディスク管理を処理します。
BDOSもDigital Researchの標準コードであり、この実装では変更されていません。
CBASE + 0x0806から開始されます。
CBIOS — Custom Basic Input Output System
CBIOSはハードウェア抽象化レイヤーであり、異なるCP/Mマシン間で唯一変更されるコンポーネントです。BDOSとCCPがハードウェア操作を実行するために呼び出す17個の標準化されたエントリーポイント(ジャンプテーブル)を提供します。CBIOSは
このプロジェクトのCBIOSは、Sharp MZハードウェア向けにゼロから構築された実装です。CP/Mの最小要件をはるかに超え、割り込み駆動のキーボード入力、ANSIターミナルエミュレーター、リアルタイムクロック、SDカードおよびフロッピーディスクコントローラー、ROMディスクサポートを提供します。
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ハードウェアが見える状態になります。
| アドレス範囲 | 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がバンク番号を
異なるバンクの関数を呼び出すには、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ドライブ文字を動的に割り当てます。優先順位は以下の通りです:
- ROMドライブ — Flash ROMに格納された読み取り専用ドライブ(0、1、または2ドライブ)
- フロッピーディスク — FDCハードウェアが検出された場合(最大2ドライブ)
- SDカード — SPI/SDハードウェアが検出された場合(複数の16MBドライブ)
MAXDISKS定数(デフォルトは7)と、cpm_definitions.asmのCSVALVEND - 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コントローラー以外)を必要とする場合は、以下が必要です:
- CBIOS BOOTルーチンにコントローラー初期化コードを追加
- セクター読み書き関数を実装
- BOOTシーケンスの動的ドライブ割り当てに検出ロジックを追加
- RFSの場合:スペースが必要であれば新しいROMバンクを追加
- 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エスケープシーケンスは以下の通りです:
サポートされる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デブロッキングアルゴリズムを使用します。
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秒)動作してから自動的に停止します。
モーターは割り込みハンドラー内のカウントダウンタイマーで制御されます。最後のディスクアクセスの後、モーターは設定可能な期間(デフォルトで100タイマーティック = 10秒)動作してから自動的に停止します。
ROMディスク
ROMディスクは、RFSボードのFlash ROMバンクに格納された読み取り専用のCP/Mドライブです。各ROMドライブイメージは、連続した2KB User ROMバンクにパックされた生の240KB(設定可能)CP/Mファイルシステムです。CBIOSは、要求されたトラックとセクターからバンク番号とバンク内のオフセットを計算し、そのROMバンクに切り替えてデータをコピーすることでセクターを読み取ります。
ROMディスクは、SDカードやフロッピーディスクの状態に関係なく常に利用可能なCP/Mユーティリティ(アセンブラー、デバッガー、エディター)の永続的なセットを提供するのに有用です。
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.asmにBUILD_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_*.binとcpm223_*.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にはディスクの先頭にランダムなセクターを配置する既知のバグがあります。
注意: 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/ を参照してください。