レトロマイコン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] [ 前へ ] 連載記事 [ 次へ ]