レトロマイコン86ボードの構想(その8)Cold Start LoaderでのCP/M-86の起動 [8086]
前回の記事に書いたようにCP/M本体をHexファイル化してHexファイルローダーでロードすることでCP/M-86が起動できたので今回はCP/MのコールドスタートローダーをHexファイルローダーで読込むことでCP/M-86を起動してみます。
CP/M-86の起動シーケンスは前回も書いたように
という流れです。
Cold Start LoaderはCP/Mのサブセット版なので専用のBIOSが必要になりますが、今回はBIOSをCP/M-86 System Guideに載っているサンプルを参考に作成しているので「loader_bios EQU false」の部分をtrueに変更することでLoader用のBIOSのHexファイルを生成できるようにしています。
loader_biosのEQU宣言を変更する度にBIOSのソースファイルのタイムスタンプが変わるのが嫌だったのでEQU宣言をPicBois.defファイルに移し、includeするようにしました。
include化したことで予想外のエラー(ソースにはない内容のエラーを検出)したので確認したところ、CPM86エミュレータはファイルのエンドにCP/MのEOFマークである01AHを渡していない模様で、PicBois.defファイルの末尾に01AHのコードを入れたらエラーは出なくなりました。
アセンブルした結果、生成されたBIOSのHexファイルをCP/M-86関連のダウンロードファイルに入っているCold Start Loader用のCP/MとBDOSのHexファイルと連結します。
連結方法としてシステムガイドには
PIP LOADER.H86=LDCPM.H86,LDBDOS.H86,LDBIOS.H86
と書いてあるのですが前回の記事で書いたようにms-dos player+cpm86.exeでのpip起動ではエラーになるのでエディタで連結しました。
連結したLOADER.H86をgencmdコマンドでコマンドに変換すればCold Start Loaderが完成します。
[A400]のスイッチはセグメントを0400Hにするためです。
生成されたLOADER.CMDを前回の記事で書いたようにCMDヘッダを削除しHexファイル化します(セグメントの値は0400H)。
Cold Start Loader用のBIOSのINIT処理のエントリは1200HなのでCold Start LoaderのHexファイルをHexファイルローダで読込み、0400:1200Hから実行するとCP/M-86が起動します。
Cold Start LoaderをHexファイルローダでロードしてCP/M-86を起動した際のサンプルログを貼っておきます。
CP/M本体のセグメントアドレスと最終オフセットが表示されていますが、これはCold StartLoaderが表示しているもので、もう少し見栄えを良くしたいのですがソースが無いのでまずはそのままにしておきます。
Cold Start LoaderのサイズはCP/M本体の半部以下なのでCP/M-86の起動が少し楽になりました。
Cold Start LoaderでのCP/M-86の起動
★2019/10/22 追記
Cold Start LoaderのCPM.SYS起動部のソース(LDCPM.A86)を見つけたのでメッセージを下記のように変更しました。
[TOP] [ 前へ ] 連載記事 [ 次へ ]
CP/M-86の起動シーケンスは前回も書いたように
- Bootstrap
最初のセクタ(128バイト)から読み込んだBootstrapをV20にのメモリにロードし、起動することで第2セクタ以降に格納されているCold Start Loader(simple version of CP/M-86)をメモリに読込む
- Cold Start Loader
DiskA内のCPM本体(CPM.SYS)をメモリに読込み起動することでCP/M自体が立ち上がる
という流れです。
Cold Start LoaderはCP/Mのサブセット版なので専用のBIOSが必要になりますが、今回はBIOSをCP/M-86 System Guideに載っているサンプルを参考に作成しているので「loader_bios EQU false」の部分をtrueに変更することでLoader用のBIOSのHexファイルを生成できるようにしています。
loader_biosのEQU宣言を変更する度にBIOSのソースファイルのタイムスタンプが変わるのが嫌だったのでEQU宣言をPicBois.defファイルに移し、includeするようにしました。
include化したことで予想外のエラー(ソースにはない内容のエラーを検出)したので確認したところ、CPM86エミュレータはファイルのエンドにCP/MのEOFマークである01AHを渡していない模様で、PicBois.defファイルの末尾に01AHのコードを入れたらエラーは出なくなりました。
アセンブルした結果、生成されたBIOSのHexファイルをCP/M-86関連のダウンロードファイルに入っているCold Start Loader用のCP/MとBDOSのHexファイルと連結します。
連結方法としてシステムガイドには
と書いてあるのですが前回の記事で書いたようにms-dos player+cpm86.exeでのpip起動ではエラーになるのでエディタで連結しました。
連結したLOADER.H86をgencmdコマンドでコマンドに変換すればCold Start Loaderが完成します。
C:¥picle¥V20¥asm¥bios¥cmd>msdos cpm86 gencmd loader 8080 CODE[A400] CP/M-86 emulator for DOS vers 1.3 - 11/30/97 Copyright (c) 1985, 1997 Jim Lopushinsky BYTES READ 1073 RECORDS WRITTEN 2C C:¥picle¥V20¥asm¥bios¥cmd> |
[A400]のスイッチはセグメントを0400Hにするためです。
生成されたLOADER.CMDを前回の記事で書いたようにCMDヘッダを削除しHexファイル化します(セグメントの値は0400H)。
Cold Start Loader用のBIOSのINIT処理のエントリは1200HなのでCold Start LoaderのHexファイルをHexファイルローダで読込み、0400:1200Hから実行するとCP/M-86が起動します。
Cold Start LoaderをHexファイルローダでロードしてCP/M-86を起動した際のサンプルログを貼っておきます。
CP/M本体のセグメントアドレスと最終オフセットが表示されていますが、これはCold StartLoaderが表示しているもので、もう少し見栄えを良くしたいのですがソースが無いのでまずはそのままにしておきます。
Cold Start LoaderのサイズはCP/M本体の半部以下なのでCP/M-86の起動が少し楽になりました。
|
★2019/10/22 追記
Cold Start LoaderのCPM.SYS起動部のソース(LDCPM.A86)を見つけたのでメッセージを下記のように変更しました。
... loading Pic24V20 ver0.02 CP/M-86 Version 1.1 Segment Address = 0040 Last Offset = 31FF System Generated by skyriver 2019/10/07 A> |
[TOP] [ 前へ ] 連載記事 [ 次へ ]
レトロマイコン86ボードの構想(その7)HexローダーでのCP/M起動に成功^^ [8086]
前回の記事で書いたようにPICのゆりかごの中で動作するV20(8088互換)の動作が安定になったのでCP/M-86のBIOSを作成し、CP/M-86の起動に先程、成功しました(^^)/
CP/M-86の起動は「3チップ構成68Kマイコンの構想(その8)ローダーによるCP/Mの起動」で書いたようなCP/M-68Kの起動シーケンスと同様で
のような起動シーケンスになります。
今回は「3チップ構成68Kマイコンの構想(その4)CP/M-68K 初ブート」の記事で書いたCP/M-68Kの時と同じようにCP/M本体をHexファイルローダーでV20のメモリ内にロードし、CP/M-86を起動しました。
起動手順の概要は次のとおりです。
[TOP] [ 前へ ] 連載記事 [ 次へ ]
CP/M-86の起動は「3チップ構成68Kマイコンの構想(その8)ローダーによるCP/Mの起動」で書いたようなCP/M-68Kの起動シーケンスと同様で
- Bootstrap
ROMまたは最初のセクタに格納されている最初に起動されるローダーでOS用にリザーブされたトラック(標準的な8インチディスクなら最初の2トラック)に格納されているCold Start Loaderを読込み起動する
- Cold Start Loader
CP/M本体のサブセット版(simple version of CP/M-86)でディスクA内にあるCP/M本体(CPM.SYS)をメモリに読込み起動する
のような起動シーケンスになります。
今回は「3チップ構成68Kマイコンの構想(その4)CP/M-68K 初ブート」の記事で書いたCP/M-68Kの時と同じようにCP/M本体をHexファイルローダーでV20のメモリ内にロードし、CP/M-86を起動しました。
起動手順の概要は次のとおりです。
- BIOSのアセンブル
次のコマンドで今回のハード(Pic24V20)用に作成したbiosのソースをアセンブルします。
C:¥picle¥V20¥asm¥bios¥cmd>msdos cpm86 asm86 picbios
CP/M-86 emulator for DOS vers 1.3 - 11/30/97
Copyright (c) 1985, 1997 Jim Lopushinsky
CP/M 8086 ASSEMBLER VER 1.1
END OF PASS 1
END OF PASS 2
END OF ASSEMBLY. NUMBER OF ERRORS: 0. USE FACTOR: 7%
C:¥picle¥V20¥asm¥bios¥cmd>
- CP/MとbiosのHexファイルの連結
ダウンロードしたCP/M-86関連ファイルに入っていたCPM.H86の末尾に上のbiosのアセンブルで生成されたBIOSのHexファイルを連結します。
PIPコマンドで連結してもいいようなのですが、私の環境(ms-dos playerでcpm86.exe経由でpip.cmdを起動)ではうまく連結できなかったので秀丸エディタで連結しました。連結したファイルはCPMX.HEXのファイル名でセーブします。
- CPM.SYSの作成
次のコマンドで上で連結したHexファイルからCPMX.CMDを作成します。CPMX.CMDはCPM.SYSにリネームすればCold Start LoaderからロードされるCP/M本体のファイルになります。
C:¥picle¥V20¥asm¥bios¥cmd>msdos cpm86 GENCMD CPMX 8080 CODE[A40]
CP/M-86 emulator for DOS vers 1.3 - 11/30/97
Copyright (c) 1985, 1997 Jim Lopushinsky
BYTES READ 2627
RECORDS WRITTEN 65
C:¥picle¥V20¥asm¥bios¥cmd>
- CMDファイルのヘッダ削除
CP/M-86のCMDファイルには128バイトのヘッダが付いているのでバイナリエディタを使って最初の128バイトを削除し、CPMX_NH.SYSのファイル名で保存します。
CPMX.CMDのヘッダ削除
- CPM_NH.SYSのHexファイル作成
バイナリファイルを0040セグメントから始まるhexファイルに変換し、CPM_NH.HEXのファイル名でセーブします。
hexファイル変換ツールでセグメント指定ができない場合は、先頭のセグメント指定の行として
:020000020040BC
を手動で追加します。
- CPM_NH.HEXのロードと起動
作成したHexファイルをHexファイルローダーを使ってV20のメモリにロードし、0040:2500H(BIOSの先頭部)番地から実行するとCP/M-86が起動します。
下記はHexファイルロードからCP/M-86起動までのログのサンプルです。
Hexファイルローダーを使ったCP/M-86の起動 :¥¥ +B000-BDBA # CP/M-86 boot 2019/08/23 +C000-CC8D #LibCpm CP/M86(PMP) v0.01 2019/08/17 +D000-DEEB #LibSpi SPI lib V0.04 for CP/M86 2019/08/16 +E000-EDC7 # Memory check executer 2019/08/18 +F000-FC43 # Pic24V20 HexLoader v0.02 2019/08/12 :¥<$F000 3139 :run HexLoader Start 2000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000001 :¥< 3514 :run System Generated by skyriver 2019/08/14 A>dir A: ASM86 CMD : ASSIGN CMD : CONFIG CMD : CPM SYS A: DATA PFK : DDT86 CMD : DSKMAINT CMD : ED CMD A: FUNCTION CMD : GENCMD CMD : HELP CMD : HELP HLP A: PIP CMD : PRINT CMD : SETUP CMD : STAT CMD A: SUBMIT CMD : TOD CMD A>ddt86 DDT86 1.2 -d 0000:0000 8F 25 40 00 36 08 66 7C 8F 25 40 00 2E 08 66 7C .%@.6.f|.%@...f| 0000:0010 8F 25 40 00 8F 25 40 00 8F 25 40 00 8F 25 40 00 .%@..%@..%@..%@. 0000:0020 8F 25 40 00 8F 25 40 00 8F 25 40 00 8F 25 40 00 .%@..%@..%@..%@. 0000:0030 8F 25 40 00 8F 25 40 00 8F 25 40 00 8F 25 40 00 .%@..%@..%@..%@. 0000:0040 8F 25 40 00 8F 25 40 00 8F 25 40 00 8F 25 40 00 .%@..%@..%@..%@. 0000:0050 8F 25 40 00 8F 25 40 00 8F 25 40 00 8F 25 40 00 .%@..%@..%@..%@. 0000:0060 8F 25 40 00 8F 25 40 00 8F 25 40 00 8F 25 40 00 .%@..%@..%@..%@. 0000:0070 8F 25 40 00 8F 25 40 00 8F 25 40 00 8F 25 40 00 .%@..%@..%@..%@. 0000:0080 8F 25 40 00 8F 25 40 00 8F 25 40 00 8F 25 40 00 .%@..%@..%@..%@. 0000:0090 8F 25 40 00 8F 25 40 00 8F 25 40 00 8F 25 40 00 .%@..%@..%@..%@. 0000:00A0 8F 25 40 00 8F 25 40 00 8F 25 40 00 8F 25 40 00 .%@..%@..%@..%@. 0000:00B0 8F 25 40 00 8F 25 40 00 8F 25 40 00 8F 25 40 00 .%@..%@..%@..%@. -^C A>
[TOP] [ 前へ ] 連載記事 [ 次へ ]
レトロマイコン86ボードの構想(その6)メモリチェックプログラムの製作 [8086]
前回の記事で書いたようにヘキサファイルをV20のメモリ内にダウンロードできるようになったのでプログラムを作って遊んでいます。
アセンブラはCP/M-86のASM86を使い、アセンブラから出力されるヘキサファイルをhexファイルローダーでV20内のメモリにダウンロードして動かしています。
環境としてはMS-DOS Player上でCP/M-86エミュレータ(cpm86.exe)を動かし、ASM86.CMDを起動しています。
しかし、プログラムを作成して動かしてみると、不安定であり、ブレッドボード上の配線のチェックを行ったところ、接続線が1本断線していましたorz
今回は2度目の配線なのでテスタで線材の導通を確認しながら配線したのですが、最後の方で一部チェックせずに配線した部分で問題が発生していました(手抜きは駄目ですね・・)^^;
状況は改善したものの例えばダミーのPUSH/POPを追加しただけで動作が変わることがあったり等、微妙に不安定な要素があったので手抜きせずにメモリチェックプログラムを作成して確認してみました。
理想を言えばメモリ上に変数を置かずにレジスタだけで動作する(CALLも使用しない)方がいいのですが、そこまで不安定ではないのでメモリ上の変数やCALLは許容することにして、アドレスバスやデータバスのエラーはきちんと検出したいので
ようにしました。
プログラム自体は0010:0000からに置き、0030:0000~7FFE:0000をチェック対象にしています(メモリ最後の部分はPICとのI/F用とリセット時のジャンプ命令で使用するのでチェック対象外)。
結果として、最初は結構すぐにエラーが発生する(例えばチェック1回目で「err 17E0:0000」が発生)状況でしたが、回路の抵抗値の調整等を行い少し安定になりました。
最終的には、安定化電源で供給していた電圧がブレッドボード上では0.2V程度低かったので、5.0Vにしたところ数十回の連続チェックも通るようになりました^^
★2019/08/30 変更 {
チェック処理中であることが判るように約1秒毎に'o'を表示するようにしました。
}
メモリチェックプログラム(アセンブラ)
アセンブル時のコマンドはこんな感じです。
アセンブルした結果、生成されたHexファイルをHexファイルローダーでダウンロードしている様子が下記です。
Hexファイルの内容をTeraTermにコピペするとデータタイプを表示しながらV20のメモリにロードされます。
安定化した後の確認結果も貼っておきます。
尚、途中でリセットして中断していますが、リセットしなければ永遠とメモリチェックを繰り返します。
メモリチェック結果
★2020/09/17 追記
アセンブラプログラムのコードを内包した一発起動のpicleソースを追記します。
メモリチェックソース(picle)
[TOP] [ 前へ ] 連載記事 [ 次へ ]
アセンブラはCP/M-86のASM86を使い、アセンブラから出力されるヘキサファイルをhexファイルローダーでV20内のメモリにダウンロードして動かしています。
環境としてはMS-DOS Player上でCP/M-86エミュレータ(cpm86.exe)を動かし、ASM86.CMDを起動しています。
しかし、プログラムを作成して動かしてみると、不安定であり、ブレッドボード上の配線のチェックを行ったところ、接続線が1本断線していましたorz
今回は2度目の配線なのでテスタで線材の導通を確認しながら配線したのですが、最後の方で一部チェックせずに配線した部分で問題が発生していました(手抜きは駄目ですね・・)^^;
状況は改善したものの例えばダミーのPUSH/POPを追加しただけで動作が変わることがあったり等、微妙に不安定な要素があったので手抜きせずにメモリチェックプログラムを作成して確認してみました。
理想を言えばメモリ上に変数を置かずにレジスタだけで動作する(CALLも使用しない)方がいいのですが、そこまで不安定ではないのでメモリ上の変数やCALLは許容することにして、アドレスバスやデータバスのエラーはきちんと検出したいので
- チェック書込みとチェック方法
チェック対象メモリ全体にチェックデータを書込んだ後に書き込んだデータが読込めるか確認する。
- 書き込みデータ
簡易的な乱数(合同法)を使って生成し、書込み開始時に乱数のseedを保存し、チェック開始時に乱数seedを復元する。
通常の合同法ではrand(n+1) = A x rand(n) + B(A,Bは素数が望ましい、Bは無い場合もある)ですが、LSBが固定されないように「A x rand(n)」の結果の特定ビットが1の場合、Bを加算する。
- 長期安定確認
上記の書込みとチェックを繰り返し動かし(乱数のseedは継続利用)、チェック開始時に何回目のチェックかを2バイトヘキサ表示する。
ようにしました。
プログラム自体は0010:0000からに置き、0030:0000~7FFE:0000をチェック対象にしています(メモリ最後の部分はPICとのI/F用とリセット時のジャンプ命令で使用するのでチェック対象外)。
結果として、最初は結構すぐにエラーが発生する(例えばチェック1回目で「err 17E0:0000」が発生)状況でしたが、回路の抵抗値の調整等を行い少し安定になりました。
最終的には、安定化電源で供給していた電圧がブレッドボード上では0.2V程度低かったので、5.0Vにしたところ数十回の連続チェックも通るようになりました^^
★2019/08/30 変更 {
チェック処理中であることが判るように約1秒毎に'o'を表示するようにしました。
}
|
アセンブル時のコマンドはこんな感じです。
C:¥picle¥V20¥asm¥bios¥cmd>msdos cpm86 asm86 Memchk CP/M-86 emulator for DOS vers 1.3 - 11/30/97 Copyright (c) 1985, 1997 Jim Lopushinsky CP/M 8086 ASSEMBLER VER 1.1 END OF PASS 1 END OF PASS 2 END OF ASSEMBLY. NUMBER OF ERRORS: 0. USE FACTOR: 2% C:¥picle¥V20¥asm¥bios¥cmd> |
アセンブルした結果、生成されたHexファイルをHexファイルローダーでダウンロードしている様子が下記です。
Hexファイルの内容をTeraTermにコピペするとデータタイプを表示しながらV20のメモリにロードされます。
:¥¥ +E000-EDC7 # Memory chack executer 2019/08/19 +F000-FC43 # Pic24V20 HexLoader v0.02 2019/08/12 :¥<$F000 3139 :run HexLoader Start e3aaaaaaaaaaaaa1 : |
安定化した後の確認結果も貼っておきます。
尚、途中でリセットして中断していますが、リセットしなければ永遠とメモリチェックを繰り返します。
|
★2020/09/17 追記
アセンブラプログラムのコードを内包した一発起動のpicleソースを追記します。
|
[TOP] [ 前へ ] 連載記事 [ 次へ ]
レトロマイコン86ボードの構想(その5)HEXファイルローダーの製作 [8086]
前回の記事で書いたように8088互換のV20とPICとのインターフェース部の動作確認が出来たので、今回はインテルヘキサファイルのローダーの製作について書いてみます。
インテルヘキサファイルのフォーマットに関してはネット上に色々あります(例えばIntel HEX)ので情報は豊富です。
レコードタイプは
に対応しました。メモリへのダウンロードが目的なのでタイプ3については空読みするようにしています。
★2019/08/12 追記
CP/M-86のASM86独自のレコードタイプ(81H~88H)に下記のソースも含めて対応しました。
HexLoader自体はアセンブリ言語で書き、nasmを使ってアセンブルしています。
アセンブルは下のようなバッチファイルで行い、アセンブルで生成されたたbinファイルを自作のbin2state(バイナリからpicleのステートメントへ変換するツール)で変換し、picleのソースに埋め込んでいます。
nasm -l %1.lst -o %1.bin %1.asm
bin2state <%1.bin >%1.txt
ソースは以下のとおりです。
HexLoaderのアセンブリソース
★2020/10/26 最新版に変更
テスト用のヘキサファイルは手で作るよりは一般的なツールで作った方がいいのでLASMを使いました。LASMはソースが100行以下であれば無料で使えます。
テスト用データ作成のためのLASM用ソース
上のソース内にアセンブルとリンクの方法をコメントで書いていますが、dsegの値を0030Hにしてリンクして生成されたヘキサファイルの内容はこんな感じです。
:020000020030CC
:10000000303132333435363738394142434445464E
:00000001FF
下記がHexLoaderのpicleのリスト表示後、実行し、上のヘキサファイルをTeraTermにコピペした際のログです。
スタートメッセージを表示後、「201」と表示されていますが、これはV20側の処理で受信したヘキサファイルのレコードタイプを出力しているものです(81H~88Hは'a'~'h'で表示)。
HexLoader実行時のログサンプル
★2020/09/02 最新版に変更
ヘキサファイルをダウンロード後のメモリ内容を確認した結果を以下に貼っておきます。
0x0300からのデータがヘキサファイル内容のように「0123・・・DEF」になっていることから正常にダウンロードできたものと判断できます。
ヘキサファイルロード結果の確認
★2019/08/12 追記
CP/M-86のasm86が出力するhexファイルの中にタイプが81H等のインテルヘキサファイルフォーマットに反するレコードがありました。
調べてみたところ、CP/M-86システムガイドの中にasm86だけが使う拡張タイプについて書いてありましたので貼っておきます。
[TOP] [ 前へ ] 連載記事 [ 次へ ]
インテルヘキサファイルのフォーマットに関してはネット上に色々あります(例えばIntel HEX)ので情報は豊富です。
レコードタイプは
- 00 : data record(CP/M-86独自の81H~84Hも含む)
- 01 : end of file
- 02 : segment(CP/M-86独自の85H~88Hも含む)
- 03 : start address
に対応しました。メモリへのダウンロードが目的なのでタイプ3については空読みするようにしています。
★2019/08/12 追記
CP/M-86のASM86独自のレコードタイプ(81H~88H)に下記のソースも含めて対応しました。
HexLoader自体はアセンブリ言語で書き、nasmを使ってアセンブルしています。
アセンブルは下のようなバッチファイルで行い、アセンブルで生成されたたbinファイルを自作のbin2state(バイナリからpicleのステートメントへ変換するツール)で変換し、picleのソースに埋め込んでいます。
nasm -l %1.lst -o %1.bin %1.asm
bin2state <%1.bin >%1.txt
ソースは以下のとおりです。
|
テスト用のヘキサファイルは手で作るよりは一般的なツールで作った方がいいのでLASMを使いました。LASMはソースが100行以下であれば無料で使えます。
|
上のソース内にアセンブルとリンクの方法をコメントで書いていますが、dsegの値を0030Hにしてリンクして生成されたヘキサファイルの内容はこんな感じです。
:020000020030CC
:10000000303132333435363738394142434445464E
:00000001FF
下記がHexLoaderのpicleのリスト表示後、実行し、上のヘキサファイルをTeraTermにコピペした際のログです。
スタートメッセージを表示後、「201」と表示されていますが、これはV20側の処理で受信したヘキサファイルのレコードタイプを出力しているものです(81H~88Hは'a'~'h'で表示)。
|
ヘキサファイルをダウンロード後のメモリ内容を確認した結果を以下に貼っておきます。
0x0300からのデータがヘキサファイル内容のように「0123・・・DEF」になっていることから正常にダウンロードできたものと判断できます。
|
★2019/08/12 追記
CP/M-86のasm86が出力するhexファイルの中にタイプが81H等のインテルヘキサファイルフォーマットに反するレコードがありました。
調べてみたところ、CP/M-86システムガイドの中にasm86だけが使う拡張タイプについて書いてありましたので貼っておきます。
asm86での拡張ヘキサファイルフォーマット |
|
[TOP] [ 前へ ] 連載記事 [ 次へ ]