goo blog サービス終了のお知らせ 

桂庵のブログ

鉄道模型を中心としています。特に自作DCC関連が多いです。

CP/Mを作ろう(3) CP /Mシステムをアセンブルする。 CP/M本体CCP/BDOS編

2024年01月27日 14時47分39秒 | CP/M
CP/Mシステム(ソフト)を作成します。
CP/Mは、ハードウェアに依存せず各機種に共通なCCP/BDOSの部分と個別ハードウェアに合わせるBIOS部分に分かれます。CCPはConsole Command Processor、BDOSはBasic Disk Operating System、BIOSはBasic I/O System です。詳しくは、下記のサイトにマニュアルがあります。
CP/Mのマニュアルは、Digital Research CP/M Operating System Manual です。第1章、5章、6章にCCP/BDOS, BIOSの記述があります。

今回はCP/M本体(CCP/BDOS)のアセンブルについてです。
CP/Mソフトは、Welcome to the unofficial CP/M web site 内のDigital Research Source Codeに公開されています。CP/M本体(CCP/BDOS)は、Digital Research Source Code内CP/M2.2ASMSOURCEをダウンロード解凍し、CPM22.Z80を使います。BIOSはCP/M2.2ORIGINALSOURCEをダウンロード解凍し、CBIOS.ASMを使います。

Windows上でアセンブルを行います。

Z80アセンブラは、AILZ80ASMを使用しました。他にz88dkがありましたが、z88dkはMSX等のパソコン向けのアセンブルが得意のようで、純粋にorg xxxx等のアセンブルには向いていないと思いました。AILZ80ASMは日本の方が現在でも活発に開発されております。
私は、実行形式をダウウンロードして使用しています。

CPM22.Z80をそのままAILZ80ASMでアセンブルしてみます。
CドライブにAILZ80ASMと作業のフォルダーを作成します。
AILZ80AMS用として、C:AILZ80ASM\binを作成し、ダウンロードしたAILZ80ASM.exe、AILZ80ASM.jsonを入れました。
作業用としてC:Projects\BDOSフォルダーを作成し、上記のCPM22.Z80を入れました。
コマンドプロンプトで以下のようにアセンブルを行います。出力はhex,lstファイルです。-iは入力ファイル、-fは出力ファイルの上書き指定です。
set path=%PATH%;C:\AILZ80ASM\bin
cd C:\Projects\BDOS
AILZ80ASM -i CPM22.Z80 -f -hex -lst 1>buildreport.txt

メモ帳でbuildreport.txtを開くと、

*** AILZ80ASM *** Z-80 Assembler, version 1.0.6.0
Copyright (C) 2023 by M.Ishino (AILight)
# Inputs
- Z80 filename [CPM22.Z80]
# Outputs
- LST filename [CPM22.LST]: Successful.
- HEX filename [CPM22.HEX]: Failed
# Error
CPM22.Z80:674 E0013: ラベルの指定が間違っています。記号や予約語や数値に変換できる文字列は使えません。
1 error(s), 0 warning(s), 0 information

とエラーになります。
これは、ラベルにHALTを使用したためで、HALTはZ80のニーモニックです。ラベルに使用したという事はジャンプ/コール命令でHALTを使用しているはずなので、エディターの検索でHALTを探してみると、367行目にありました。これらのHALTをhr_HALT(なんでも良いです、halt routineの頭文字を付けただけです)に変更し、再度アセンブルをすると、
*** AILZ80ASM *** Z-80 Assembler, version 1.0.6.0
Copyright (C) 2023 by M.Ishino (AILight)
# Inputs
- Z80 filename [CPM22.Z80]
# Assemble Status
- Expand (1/6)
- PreAssemble (2/6)
- AdjAssemble (3/6)
- MainAssemble (4/6)
- Validate (5/6)
- Complete (6/6)
# Outputs
- LST filename [CPM22.LST]: Successful.
- HEX filename [CPM22.HEX]: Failed
# Error
CPM22.Z80:2043 E0001: 無効な命令が指定されました。
CPM22.Z80:2168 E0001: 無効な命令が指定されました。
CPM22.Z80:3340 E0001: 無効な命令が指定されました。
CPM22.Z80:3343 E0001: 無効な命令が指定されました。
# List
CPM22.LST:2072 E0001: 無効な命令が指定されました。
CPM22.LST:2197 E0001: 無効な命令が指定されました。
CPM22.LST:3369 E0001: 無効な命令が指定されました。
CPM22.LST:3372 E0001: 無効な命令が指定されました。
4 error(s), 0 warning(s), 0 information

4つほどエラーが出ました。
2043行は 、CHKSUM1:ADD    A,M        ;and compute sum ignoring carries.
2168行は、SBC    A,M        ;set carry if no more names.
3340行は、SBC    A,M
3343行は、SBC    A,M
上記の4つのニーモニックは、i8080とZ80のニーモニックが入り混じった表示となっています。上記4か所のMを(HL)に変更し、再度アセンブルします。
*** AILZ80ASM *** Z-80 Assembler, version 1.0.6.0
Copyright (C) 2023 by M.Ishino (AILight)
# Inputs
- Z80 filename [CPM22.Z80]
# Assemble Status
- Expand (1/6)
- PreAssemble (2/6)
- AdjAssemble (3/6)
- MainAssemble (4/6)
- Validate (5/6)
- Complete (6/6)
# Outputs
- LST filename [CPM22.LST]: Successful.
- HEX filename [CPM22.HEX]: Successful.
0 error(s), 0 warning(s), 0 information

アセンブルが成功しました。しかし、これでOKではありません。
このCPM22.Z80の最後の部分で、BIOS JUMP TABLEがあります。このテーブルには、;NOTE WE USE FAKE DESTINATIONS と記述されており、FAKEなのです。このテーブルは、CCP/BDOSからBIOS機能を呼び出すためのテーブルで、実際にはBIOS側に実装されるものです。ただし、CCP/BDOSはこのアドレスを知る必要があります。このため、BIOS JUMP TABLEを以下のように書き換えました。
;**************************************************************
;*
;* B I O S J U M P T A B L E
;*
;**************************************************************
CCP EQU (MEM-7)*1024
BIOS EQU CCP + 0x1600
;
BOOT EQU BIOS
WBOOT EQU BIOS+3
CONST EQU BIOS+6
CONIN EQU BIOS+9
CONOUT EQU BIOS+12
LIST EQU BIOS+15
PUNCH EQU BIOS+18
READER EQU BIOS+21
HOME EQU BIOS+24
SELDSK EQU BIOS+27
SETTRK EQU BIOS+30
SETSEC EQU BIOS+33
SETDMA EQU BIOS+36
READ EQU BIOS+39
WRITE EQU BIOS+42
PRSTAT EQU BIOS+45
SECTRN EQU BIOS+48
;
変更したBIOS JUMP TABLEコードのMEMは、CP/Mのメモリーサイズです。CPM22.Z80コードの最初の方に62と指定されています。これは62k CP/Mにするという意味です。私は64k CP/Mにしているので、このMEMは64にしています。CCPはCCPの始まるアドレスを示しており、BIOSも同様にBIOSが始まるアドレスを示しています。このようにCP/Mにおいては、CP/Mのメモリーサイズを決めるとCCPの位置、BIOSの位置が確定します。BIOS=CCP+0x1600なので、CCP/BDOSのサイズは0x1600=5632byteです。
注:Z80アセンブラにAILZ80ASMを使用させて頂いたので、16進表示を0x1600等にできますが、通常は1600Hになると思います。

AILZ80ASMによるアセンブルは使用頻度が高くなるため、以下のような簡易プロジェクトアプリを作成しています。鉄道模型のソフト制作にWinAVRを使用していた時に作成したアプリを少し変更したもので、単純ですが便利なアプリです。入力された情報(ディレクトリ、ソースファイル、オプション等)からbatファイルを生成しています。前記コマンドプロンプトでの実行は、このアプリで生成したbatファイルの内容です。




最新の画像もっと見る

コメントを投稿

サービス終了に伴い、10月1日にコメント投稿機能を終了させていただく予定です。
ブログ作成者から承認されるまでコメントは反映されません。