3チップ構成68Kマイコンの構想(その10)XMODEMアプリの作成 [68K]
前回の「3チップ構成68Kマイコンの構想(その9)メモリ拡張」で書いたように自作68Kボードのメモリを512KBに拡張できたので、CP/M-68Kの一般的アプリが動く環境になりました。CP/M-68K用として公開されているソフトがCP/M-80程に豊富なわけではありませんが探せば色々見つかります。
ネットからダウンロードしたファイルを試してみたりする際にSDカードとのファイルのやり取りが手軽にできる環境がないと不便です。
ネット上でCP/M-68K用のkermitを見つけましたが、kermitのクライアントのようでパソコンとファイルの送受信をするためにはパソコン側にkermitのホストを立ち上げる必要があります。しかし、CP/M用のコンソールとしてTeraTermを使っているので切替えの手間が必要になります。
そこで「3チップ構成Pic24CPMマイコン(その5)XMODEMでファイル送受信」の記事で書いた自作のCP/M-80用のxmodemアプリをCP/M-68K用に移植しました。
CP/M-80で使った HI-TECH C コンパイラはプロトタイプ宣言やunionなどにも対応していて使い易かったのですが、CP/M-68KのC言語コンパイラはK&Rの構文なので結構使いづらい・・・
標準的なヘッダファイルもあまりないのでハマった点としてファイルオープン時のリターン値である stream address が符号拡張されて実装メモリ(MC68008のメモリ空間である1MBの前半部分)以外になり、(自作の68Kボードでは)実行が停止してしまう問題が発生しました。
対策としては fopenbを使用する前に FILE *fopenb(); のように簡易的なプロトタイプ宣言をする必要があります。()内の引数は型宣言付きで記述するとエラーになりますが型宣言無しで記述するとエラーは発生しません。しかし、コンパイラは無視するので引数の数チェックを期待してもコンパイラはチェックしませんでした。(意味を示す判り易い表現で引数を書いておいた方がbetterだとは思います)
68Kではアセンブラでアドレス用のレジスタ(A0~A7)の下位ワード(16bit)を設定した時等も上位ワードに符号拡張されるので注意が必要です。
DDTでのSend()処理の逆アセンブル
少し手間取りましたが、CP/M-68K用のxmodemアプリが完成し、ファイルのやり取りがメチャ楽になりました^^
xmodemができるまでは、pip xm16.c=con: のようにpipコマンドを使って TeraTerm のファイル送信機能(バイナリモードをON)を使っていましたが、シリアル通信速度が38400bpsではたまに取りこぼしが発生するので1キャラクタ毎に1msのウェイトを設定していて、転送に時間が掛かっていました。
(今回のMC68008は8MHz動作ですが、16MHzのZ80で動くPic24CPMではウェイト無しにTeraTermからの送信ができていた)
今回作成した CP/M-68K用の xmodemアプリのコンパイルと使用例のログを以下に貼っておきます。
冒頭で書いたように CP/M-68K のアプリはネットを探してもそれ程豊富ではない状況なので、今時 CP/M-68Kの新アプリを公開するサイトは希少だと思います。
まぁアクセス数の少ない極東のこのブログで公開しても見つける人の方が希少かもしれません・・w
xmodemアプリのコンパイル方法と使用例
上のログの末尾にあるヘルプメッセージからも判るように今回も '/p' オプションでBIOSに実装している puncher とreader を使った通信に対応しました。
reader からの受信ではBIOSの仕様上、受信データの有無を確認するためのステータス取得ができないので、受信データがない場合にはリターン値を 0xffff にするような拡張を行っています。
★2018/09/30 追記 {
CP/M-68Kのマニュアル上はpucher/readerではなく、Auxiliary Output/Input(汎用入出力)と記載されています。
}
下のキャプチャはCP/M-68Kからのファイル送信中のロジアナ波形で、下図からは判りませんが拡大して見るとシリアル通信(38400bps)もキャラクタ間に隙間なく送信できています。
尚、今回開発したxmodemのソースと実行ファイルは下記のURLからダウンロード可能です。営利目的以外であれば自由に使って構いません。
★2018/09/30 追記
今回作成したxmodemアプリでCP/Mとパソコン間でのバイナリも含めたファイルの送受信が手軽にできるようになったので「3チップ構成68Kマイコンの構想(その7)CP/Mのリロケート」の記事で書いたdump表示をTeraTermからコピペし、dump2binでバイナリ化後、Sレコード変換しなくても、CP/M上のsendc68コマンドでCP/M上のファイルをSレコード化してからxmodemでパソコンに持ってこれるようになりました。
例えば sendc68 - cpm0400.sys >cpm0400.sr でCP/M本体をSレコードしてからxmodemでパソコンに持ってくれば、万が一、CP/Mが立ち上がらない状況になった場合にも、パソコン側からSレコードローダーで68K内メモリにダウンロードすることで最初のころに行っていたようなSレコードダウンロード方式によるCP/Mの起動が可能となります。
[TOP] [ 前へ ] 連載記事 [ 次へ ]
ネットからダウンロードしたファイルを試してみたりする際にSDカードとのファイルのやり取りが手軽にできる環境がないと不便です。
ネット上でCP/M-68K用のkermitを見つけましたが、kermitのクライアントのようでパソコンとファイルの送受信をするためにはパソコン側にkermitのホストを立ち上げる必要があります。しかし、CP/M用のコンソールとしてTeraTermを使っているので切替えの手間が必要になります。
そこで「3チップ構成Pic24CPMマイコン(その5)XMODEMでファイル送受信」の記事で書いた自作のCP/M-80用のxmodemアプリをCP/M-68K用に移植しました。
CP/M-80で使った HI-TECH C コンパイラはプロトタイプ宣言やunionなどにも対応していて使い易かったのですが、CP/M-68KのC言語コンパイラはK&Rの構文なので結構使いづらい・・・
標準的なヘッダファイルもあまりないのでハマった点としてファイルオープン時のリターン値である stream address が符号拡張されて実装メモリ(MC68008のメモリ空間である1MBの前半部分)以外になり、(自作の68Kボードでは)実行が停止してしまう問題が発生しました。
対策としては fopenbを使用する前に FILE *fopenb(); のように簡易的なプロトタイプ宣言をする必要があります。()内の引数は型宣言付きで記述するとエラーになりますが型宣言無しで記述するとエラーは発生しません。しかし、コンパイラは無視するので引数の数チェックを期待してもコンパイラはチェックしませんでした。(意味を示す判り易い表現で引数を書いておいた方がbetterだとは思います)
68Kではアセンブラでアドレス用のレジスタ(A0~A7)の下位ワード(16bit)を設定した時等も上位ワードに符号拡張されるので注意が必要です。
|
少し手間取りましたが、CP/M-68K用のxmodemアプリが完成し、ファイルのやり取りがメチャ楽になりました^^
xmodemができるまでは、pip xm16.c=con: のようにpipコマンドを使って TeraTerm のファイル送信機能(バイナリモードをON)を使っていましたが、シリアル通信速度が38400bpsではたまに取りこぼしが発生するので1キャラクタ毎に1msのウェイトを設定していて、転送に時間が掛かっていました。
(今回のMC68008は8MHz動作ですが、16MHzのZ80で動くPic24CPMではウェイト無しにTeraTermからの送信ができていた)
今回作成した CP/M-68K用の xmodemアプリのコンパイルと使用例のログを以下に貼っておきます。
冒頭で書いたように CP/M-68K のアプリはネットを探してもそれ程豊富ではない状況なので、今時 CP/M-68Kの新アプリを公開するサイトは希少だと思います。
まぁアクセス数の少ない極東のこのブログで公開しても見つける人の方が希少かもしれません・・w
|
上のログの末尾にあるヘルプメッセージからも判るように今回も '/p' オプションでBIOSに実装している puncher とreader を使った通信に対応しました。
reader からの受信ではBIOSの仕様上、受信データの有無を確認するためのステータス取得ができないので、受信データがない場合にはリターン値を 0xffff にするような拡張を行っています。
★2018/09/30 追記 {
CP/M-68Kのマニュアル上はpucher/readerではなく、Auxiliary Output/Input(汎用入出力)と記載されています。
}
下のキャプチャはCP/M-68Kからのファイル送信中のロジアナ波形で、下図からは判りませんが拡大して見るとシリアル通信(38400bps)もキャラクタ間に隙間なく送信できています。
CP/M-68K側からxmodemでファイル送信中の波形例 |
|
尚、今回開発したxmodemのソースと実行ファイルは下記のURLからダウンロード可能です。営利目的以外であれば自由に使って構いません。
- xmodem68k_20181021_001d.zip
★2018/10/21 追記 受信時に32KB以上の場合、リトライする問題を対処
★2018/09/30 追記
今回作成したxmodemアプリでCP/Mとパソコン間でのバイナリも含めたファイルの送受信が手軽にできるようになったので「3チップ構成68Kマイコンの構想(その7)CP/Mのリロケート」の記事で書いたdump表示をTeraTermからコピペし、dump2binでバイナリ化後、Sレコード変換しなくても、CP/M上のsendc68コマンドでCP/M上のファイルをSレコード化してからxmodemでパソコンに持ってこれるようになりました。
例えば sendc68 - cpm0400.sys >cpm0400.sr でCP/M本体をSレコードしてからxmodemでパソコンに持ってくれば、万が一、CP/Mが立ち上がらない状況になった場合にも、パソコン側からSレコードローダーで68K内メモリにダウンロードすることで最初のころに行っていたようなSレコードダウンロード方式によるCP/Mの起動が可能となります。
[TOP] [ 前へ ] 連載記事 [ 次へ ]
3チップ構成68Kマイコンの構想(その9)メモリ拡張 [68K]
前回の「3チップ構成68Kマイコンの構想(その8)ローダーによるCP/Mの起動」の記事で書いたようにCP/M-68KがSDカードからブートできるようになったので今回はメモリの拡張を行います。
今まで128KBytesのM628128ALP-7を使っていましたがebayでポチった512KBytesのメモリ(K6T4008C1B-DB70)が手元にあるので交換しました。
いずれもアクセスタイムは70nsです。K6T4008C1BはM628128ALPのCS2(30番ピン)と未使用ピン(1番ピン)にそれぞれA17、A18が割り振られておりピンアサインはアッパーコンパチなので追加配線は楽です。
ソフトについてはメモリ容量の変更になるべく影響受けないように考慮していたのでBIOS内のgetseg用のテーブルのメモリサイズ情報のみの対応となります。
メモリが512KBになったので今までメモリ不足で動かなかったデジタルリサーチ社の CBASIC(コンパイラ) を動かしてみました。
Twiterでも紹介した「RetroBrew Computers Forum」の最後の方に書かれているアスキーアートを動かしてみました。
このForumにはベンチマーク結果の例がいくつか書かれていて68Kのものでは
CB68(compiled) (68k @ 6 MHz) 4:23 <== I can get it to work on one of my slower 68ks
となっています。
下記がasciiart.basのコンパイルから実行までのログです。
CBASICでASCIIART
気になる実行時間は・・・・5分32秒(332秒)でした orz
因みにMC68008のクロックは8MHzです。
あまりにも遅いので CBASIC について調べてみると製作者の Eubankさんが修士論文のプロジェクトとして開発したBASIC-Eが元版でこれをデジタルリサーチ社が商用化したもののようです。
浮動小数点を14桁の2進化10進数(BCD)演算として組み込んでいたことから非常に人気があったとのことです(マイクロソフト社のMBASICでは丸め誤差が発生するので経理計算では使いにくい)
BCD演算とバイナリ演算を比較するのは酷というものでしょう・・
また、コンパイル後のリンク方法としては下記のような方法でもいいようですが、出力される ASCIIART.68K のサイズが大きくなりました(実行時間は変わりませんでした)
別なリンク方法
ヘッダのリロケーションフラグを確認してみるとFFFFになっていないのでリロケーションフラグ(水色文字分)がアクティブ(ゼロ)になっていてASCIIART.RELと同じサイズなのでファイル名が".68K"となっていますが".REL"と同じもののようです(バイナリ比較まではしていません)。
asciiart.68kのヘッダ内容
[TOP] [ 前へ ] 連載記事 [ 次へ ]
今まで128KBytesのM628128ALP-7を使っていましたがebayでポチった512KBytesのメモリ(K6T4008C1B-DB70)が手元にあるので交換しました。
いずれもアクセスタイムは70nsです。K6T4008C1BはM628128ALPのCS2(30番ピン)と未使用ピン(1番ピン)にそれぞれA17、A18が割り振られておりピンアサインはアッパーコンパチなので追加配線は楽です。
ソフトについてはメモリ容量の変更になるべく影響受けないように考慮していたのでBIOS内のgetseg用のテーブルのメモリサイズ情報のみの対応となります。
メモリが512KBになったので今までメモリ不足で動かなかったデジタルリサーチ社の CBASIC(コンパイラ) を動かしてみました。
Twiterでも紹介した「RetroBrew Computers Forum」の最後の方に書かれているアスキーアートを動かしてみました。
このForumにはベンチマーク結果の例がいくつか書かれていて68Kのものでは
CB68(compiled) (68k @ 6 MHz) 4:23 <== I can get it to work on one of my slower 68ks
となっています。
下記がasciiart.basのコンパイルから実行までのログです。
|
気になる実行時間は・・・・5分32秒(332秒)でした orz
因みにMC68008のクロックは8MHzです。
あまりにも遅いので CBASIC について調べてみると製作者の Eubankさんが修士論文のプロジェクトとして開発したBASIC-Eが元版でこれをデジタルリサーチ社が商用化したもののようです。
浮動小数点を14桁の2進化10進数(BCD)演算として組み込んでいたことから非常に人気があったとのことです(マイクロソフト社のMBASICでは丸め誤差が発生するので経理計算では使いにくい)
BCD演算とバイナリ演算を比較するのは酷というものでしょう・・
また、コンパイル後のリンク方法としては下記のような方法でもいいようですが、出力される ASCIIART.68K のサイズが大きくなりました(実行時間は変わりませんでした)
|
ヘッダのリロケーションフラグを確認してみるとFFFFになっていないのでリロケーションフラグ(水色文字分)がアクティブ(ゼロ)になっていてASCIIART.RELと同じサイズなのでファイル名が".68K"となっていますが".REL"と同じもののようです(バイナリ比較まではしていません)。
|
[TOP] [ 前へ ] 連載記事 [ 次へ ]
3チップ構成68Kマイコンの構想(その8)ローダーによるCP/Mの起動 [68K]
前回の「3チップ構成68Kマイコンの構想(その7)CP/Mのリロケート」の記事でCP/Mのリロケートができたので、今回はCP/Mをローダーで起動できるようにします。
CP/M-68KはCP/M本体のサイズが大きくなり、当時記録媒体として一般的なフロッピーディスクのブート用に割当てた数トラックに収まらなくなったこともあり、CP/M本体のファイル(CPM.SYS)はAドライブ上に置き、CP/M本体を起動するために必要な最小限の機能に絞ったBDOS相当の機能を持ったものがCP/Mローダー(CPMLDR)です。
ネットで見つけた英語のマニュアル(CP/M-68K Operating System System Guide)には「CPMLDR is a miniature version of CP/M-68K」と書かれています。
CP/Mのブートの概要は
結局、CP/M本体がディスク上にあることには変わりないのでブート用トラックの本数を増やしてそこにCPM.SYSを格納すればいいじゃないかとも思えますが、CPM.SYSがファイルシステム上にあることでCP/MのBIOS変更等の作業がかなり楽になるという大きなメリットがあります。また、ブートトラック数を増やすと従来のディスクとの互換性が崩れます。
CPMLDRはミニチュアのCP/Mなので動かすためには専用のBIOSが必要になりますが、CP/M用のBIOSから機能を間引けばいいだけなので作業的には楽です。
1点だけ注意が必要で、CP/M用のBIOSはTRAPでコールされるので RTE でリターンしますが、CPMLDRからは_biosのラベルへのコールになるのでリターンは通常の RTS 命令になります。
CPMLDR用のBIOSに実装する(または間引く)機能はマニュアルに書いてありますが、今回作成したCPMLDR用BIOS(ldrbios.s)の一部を引用すると下記のような機能の実装にしています。
18番目の「Get MRT」(アプリで使えるメモリ範囲の情報を返す機能)はマニュアルには「Not used now, but may be used in future releases.」と書かれていますが現在は当時から見れば遠い未来なので実装していませんw
CPMLDR用BIOSソースの抜粋
CPMLDR用のbiosの準備が出来たら、アセンブルし、LDRLIBとリンクします。
CPMLDR用biosのアセンブルとリンク
CPMLDR.SYSができたので動作確認のために前回記事に書いた方法でパソコン側に持ってきてSレコードに変換し、Sレコードローダで68K内のメモリに展開して起動してみます。(その前に当然Aドライブ上に前回記事で作成したCP/MファイルをCPM.SYSのファイル名で入れておきます)
CPMLDRはサイズが小さいのでCP/Mの起動が楽になりました^^
CP/M本体の起動時はいきなりプロンプト("A>")が表示され、物静かなOSだなぁ~と思っていましたが、CPMLDRを起動するとバージョン等、色々表示されます。
CPMLDRでのCP/M起動
残りはCold Boot Loaderですが、これはSDカードの読込みの仕組みが解っていれば実装は簡単です。
アセンブル&リンク操作とアセンブル結果も貼っておきます。
boot68k.sのアセンブルとリンク
Cold Boot Loaderのリンク結果をSDカードの先頭ブロックに、次のブロック以降にCPMLDRを入れれば、SDカードからCP/Mがブート可能となり、CP/Mの起動が非常に楽になります^^
尚、アセンブルやリンクはCP/M-68Kシミュレータ上で行った方が作業的には楽だと思いますが、今回は昔のCP/M移植手順を楽しむという意味で敢えて実機上で行っています。
まぁインターネット上の豊富な情報や当時と比べれば処理能力が桁違いに高いパソコンを使ってはいるのですが・・w
Cold Boot LoaderによるCP/Mの起動
[TOP] [ 前へ ] 連載記事 [ 次へ ]
CP/M-68KはCP/M本体のサイズが大きくなり、当時記録媒体として一般的なフロッピーディスクのブート用に割当てた数トラックに収まらなくなったこともあり、CP/M本体のファイル(CPM.SYS)はAドライブ上に置き、CP/M本体を起動するために必要な最小限の機能に絞ったBDOS相当の機能を持ったものがCP/Mローダー(CPMLDR)です。
ネットで見つけた英語のマニュアル(CP/M-68K Operating System System Guide)には「CPMLDR is a miniature version of CP/M-68K」と書かれています。
CP/Mのブートの概要は
- Cold Boot Loaderの起動
1トラック目の最初のセクタ(128bytes)に保存したCold Boot LoaderをPIC側が68K内のメモリに展開し、起動する。
PIC側からアクセスできる68K側のメモリ範囲は狭い(最初の1KB(000000-0003FF)と最後の1KB)ので今回はベクターテーブル内ではありますが、0x0380を開始アドレスとしました。
- CPMLDRのメモリ展開
Cold Boot Loaderは2番目以降のセクタに記録されたCPMLDRをメモリに展開し、起動する。CPMLDRの開始アドレスは0x008000にしました。
- CP/Mの起動
CPMLDRがAドライブのファイルシステム上にあるCPM.SYSを起動し、CP/Mが立ち上がります。
結局、CP/M本体がディスク上にあることには変わりないのでブート用トラックの本数を増やしてそこにCPM.SYSを格納すればいいじゃないかとも思えますが、CPM.SYSがファイルシステム上にあることでCP/MのBIOS変更等の作業がかなり楽になるという大きなメリットがあります。また、ブートトラック数を増やすと従来のディスクとの互換性が崩れます。
CPMLDRはミニチュアのCP/Mなので動かすためには専用のBIOSが必要になりますが、CP/M用のBIOSから機能を間引けばいいだけなので作業的には楽です。
1点だけ注意が必要で、CP/M用のBIOSはTRAPでコールされるので RTE でリターンしますが、CPMLDRからは_biosのラベルへのコールになるのでリターンは通常の RTS 命令になります。
CPMLDR用のBIOSに実装する(または間引く)機能はマニュアルに書いてありますが、今回作成したCPMLDR用BIOS(ldrbios.s)の一部を引用すると下記のような機能の実装にしています。
18番目の「Get MRT」(アプリで使えるメモリ範囲の情報を返す機能)はマニュアルには「Not used now, but may be used in future releases.」と書かれていますが現在は当時から見れば遠い未来なので実装していませんw
|
CPMLDR用のbiosの準備が出来たら、アセンブルし、LDRLIBとリンクします。
|
CPMLDR.SYSができたので動作確認のために前回記事に書いた方法でパソコン側に持ってきてSレコードに変換し、Sレコードローダで68K内のメモリに展開して起動してみます。(その前に当然Aドライブ上に前回記事で作成したCP/MファイルをCPM.SYSのファイル名で入れておきます)
CPMLDRはサイズが小さいのでCP/Mの起動が楽になりました^^
CP/M本体の起動時はいきなりプロンプト("A>")が表示され、物静かなOSだなぁ~と思っていましたが、CPMLDRを起動するとバージョン等、色々表示されます。
|
残りはCold Boot Loaderですが、これはSDカードの読込みの仕組みが解っていれば実装は簡単です。
アセンブル&リンク操作とアセンブル結果も貼っておきます。
|
Cold Boot Loaderのリンク結果をSDカードの先頭ブロックに、次のブロック以降にCPMLDRを入れれば、SDカードからCP/Mがブート可能となり、CP/Mの起動が非常に楽になります^^
尚、アセンブルやリンクはCP/M-68Kシミュレータ上で行った方が作業的には楽だと思いますが、今回は昔のCP/M移植手順を楽しむという意味で敢えて実機上で行っています。
まぁインターネット上の豊富な情報や当時と比べれば処理能力が桁違いに高いパソコンを使ってはいるのですが・・w
|
[TOP] [ 前へ ] 連載記事 [ 次へ ]
3チップ構成68Kマイコンの構想(その7)CP/Mのリロケート [68K]
前回の記事「3チップ構成68Kマイコンの構想(その6)CPM400.SRの問題」でダウンロードしたCP/M-68Kのアーカイブファイルに入っていた0x0400から始まるCP/M本体のSレコードファイルであるCPM400.SRに問題があることを書きました。
今回は3チップ構成68Kボード用に作成済みのBIOSとリンクすることでCP/Mのアドレスを変更し、CPM.SYSファイルを作成してみます。
今回作成した3チップ構成68K基板用のCP/MのBIOSはアセンブラで作成済み(まだ変更する部分はありますが)なので、CP/Mのアセンブラでアセンブルし、リンカーでリンクします。
その後、リロケータで物理アドレスに変換します。
biosのアセンブルとCPMとのリンク
これでリロケータブルなCP/Mファイルが出来ました。
次にリロケータを使って実アドレス(前回記事で失敗した0x0400)用のファイルに変換します。
★追記 2022/01/25 {
アセンブラは最初に下記のコマンドで初期化する必要があります。
B>as68.rel -I AS68INIT
68000 assembler initialized
}
cpm.relファイルから実アドレスにリロケート
このファイル内容を「3チップ構成68Kマイコンの構想(その3)Sレコード簡易ローダーの製作」の記事で書いたSレコードローダを使って68KボードにロードしてCP/Mを立ち上げるためには、上で作った cpm.sys のSレコードファイルをパソコン上に準備する必要があります。
CP/M上のファイルをパソコンに持ってくるためにはcpmtoolで可能ですが、SDカードの抜き差しが必要となり面倒です。
今回はCP/M上のダンプリスト表示内容をバイナリファイルに変換するツールを作りました。
CP/M-68Kのファイルにはヘッダ情報があり、ヘッダの構成は下図のようになっています。
上で書いた操作ログにあるsize68コマンドはヘッダ情報を表示するツールです。
上記の操作で作成したcpm.sysのダンプ表示の最初の方のキャプチャが下図で、赤枠部分がヘッダ部です。
今回作成した Dump2Bin ツールは赤枠の次のデータ以降の値を読み取り、バイナリファイルとして書き出すものです。
尚、バイナリ to Sレコード変換はネットを探すと色々あるので自作していませんw
★2018/09/30 追記 {
「3チップ構成68Kマイコンの構想(その10)XMODEMアプリの作成」の記事に追記したようにCP/Mに標準で含まれている sendc68コマンドでCP/M上のヘッダ付きファイルをSレコードに変換できます。
}
具体的な操作としては
従来は CPM15000.SR と biosのSレコードファイルをSレコードローダで68Kボードにダウンロードしていましたが、今回作った CPM0400.SRだけをダウンロードすればCP/Mが立ち上がります(下記で'1'の連続部分がCPM0400.SRのダウンロード部です)
作成したCPM0400.SRによるCP/Mの起動
この流れだと次回はCP/Mローダのことを書くことになると思いますw
[TOP] [ 前へ ] 連載記事 [ 次へ ]
今回は3チップ構成68Kボード用に作成済みのBIOSとリンクすることでCP/Mのアドレスを変更し、CPM.SYSファイルを作成してみます。
今回作成した3チップ構成68K基板用のCP/MのBIOSはアセンブラで作成済み(まだ変更する部分はありますが)なので、CP/Mのアセンブラでアセンブルし、リンカーでリンクします。
その後、リロケータで物理アドレスに変換します。
|
これでリロケータブルなCP/Mファイルが出来ました。
次にリロケータを使って実アドレス(前回記事で失敗した0x0400)用のファイルに変換します。
★追記 2022/01/25 {
アセンブラは最初に下記のコマンドで初期化する必要があります。
B>as68.rel -I AS68INIT
68000 assembler initialized
}
|
このファイル内容を「3チップ構成68Kマイコンの構想(その3)Sレコード簡易ローダーの製作」の記事で書いたSレコードローダを使って68KボードにロードしてCP/Mを立ち上げるためには、上で作った cpm.sys のSレコードファイルをパソコン上に準備する必要があります。
CP/M上のファイルをパソコンに持ってくるためにはcpmtoolで可能ですが、SDカードの抜き差しが必要となり面倒です。
今回はCP/M上のダンプリスト表示内容をバイナリファイルに変換するツールを作りました。
CP/M-68Kのファイルにはヘッダ情報があり、ヘッダの構成は下図のようになっています。
CP/M-68Kファイル内ヘッダ情報 |
|
上で書いた操作ログにあるsize68コマンドはヘッダ情報を表示するツールです。
上記の操作で作成したcpm.sysのダンプ表示の最初の方のキャプチャが下図で、赤枠部分がヘッダ部です。
今回作成した Dump2Bin ツールは赤枠の次のデータ以降の値を読み取り、バイナリファイルとして書き出すものです。
尚、バイナリ to Sレコード変換はネットを探すと色々あるので自作していませんw
★2018/09/30 追記 {
「3チップ構成68Kマイコンの構想(その10)XMODEMアプリの作成」の記事に追記したようにCP/Mに標準で含まれている sendc68コマンドでCP/M上のヘッダ付きファイルをSレコードに変換できます。
}
cpm.sysファイルのヘッダ情報 |
|
具体的な操作としては
- PCへ持っていきたいファイルをCP/M上でダンプ表示する。
- TeraTermの画面表示からコピーしてパソコン上にダンプ表示部分のテキストファイルを作成する。
- Dump2Binツールでバイナリファイルに変換する。
- ネット上に公開されている バイナリファイルをSレコードファイルに変換するツールを使用してSレコード化(CPM0400.SR)する。
- Sレコードダウンローダを起動した状態で、上記で作成したCP/MとBIOSが一体化したSレコードファイルをTeraTerm画面にコピペする(ファイル送信操作でも可)。
従来は CPM15000.SR と biosのSレコードファイルをSレコードローダで68Kボードにダウンロードしていましたが、今回作った CPM0400.SRだけをダウンロードすればCP/Mが立ち上がります(下記で'1'の連続部分がCPM0400.SRのダウンロード部です)
|
この流れだと次回はCP/Mローダのことを書くことになると思いますw
[TOP] [ 前へ ] 連載記事 [ 次へ ]
3チップ構成68Kマイコンの構想(その6)CPM400.SRの問題 [68K]
「3チップ構成68Kマイコンの構想(その3)Sレコード簡易ローダーの製作」の記事で書いたように今回はCP/M-68K関連のファイルは
からダウンロードしたものを使っています。
CP/M-68K本体のSレコードファイルとしてCPM400.SRとCPM15000.SRがあり、それぞれのアドレスは下表のようになっています。(CP/Mのバージョンは1.3ですがバージョンにより下表のアドレスは異なるようです)
「3チップ構成68Kマイコンの構想(その4)CP/M-68K 初ブート」の記事でSレコードファイルのダウンロード方式によるCP/M-68Kのブートに成功したことを書きましたが、この時はCPM15000.SRを使っていました。
今回、メモリを128KBから512KBに増やすことを考慮してメモリ容量の変更でもCP/MやBIOSのアドレスが変わらないCPM400.SRに移行しようとしてハマりました^^;(まぁこういうことも含めて色々調べる過程も楽しいのですがw)
BIOS内のジャンプテーブルのアクセス動作が不穏な動きをします・・・
EASy68K Simulatorで動作を確認してみるとこんな感じです。
A0の値が $0060AC なのでステップ動作すればA2には $00615E が設定されるはずが・・
ステップ動作後のA2の値は何故か $007000 になっている・・・
何故でしょう?? EASy68Kのバグでしょうか?w
そうではありません。ブレッドボード上の実機で確認しても
Exception $0B at user address $00007000. Aborted.
こんなエラーが表示されます。
BIOSサービスから抜けた後もSTEP動作で動きを確認してみるとCPM内の処理でBIOSのテーブルの一部が書き換えられていますorz
CPM400.SRのマップファイル(CPM400.MAP)を見て納得がいきました。
BIOSの先頭に配置している _init のアドレスが $6000 ですが bss(初期化しないワークエリア)が $5D80 から $6150+FCBのサイズまで割り振られていて BIOS の領域とオーバーラップしています!!
これでは CPM400.SR は使えませんねぇ。
$006000 に _init へのjmp命令を配置してBIOS本体を $6174から始めるようにすれば動くと思います(jmp命令が_subfcbとオーバーラップしますが_initは最初の一回だけしかコールされないのでコール後ワークとして使用されても問題ないはず)が、そんなことをするよりは CPM15000.SR を使ってCP/M-68Kを立ち上げて、CP/M上でCP/Mをリロケートした方が早い。
CPM400.MAPからの抜粋
[TOP] [ 前へ ] 連載記事 [ 次へ ]
からダウンロードしたものを使っています。
CP/M-68K本体のSレコードファイルとしてCPM400.SRとCPM15000.SRがあり、それぞれのアドレスは下表のようになっています。(CP/Mのバージョンは1.3ですがバージョンにより下表のアドレスは異なるようです)
BDOS | _ccp | BIOS _init | |
CPM400.SR | $000400 | $0004BC | $006000 |
CPM15000.SR | $015000 | $0150BC | $01B000 |
「3チップ構成68Kマイコンの構想(その4)CP/M-68K 初ブート」の記事でSレコードファイルのダウンロード方式によるCP/M-68Kのブートに成功したことを書きましたが、この時はCPM15000.SRを使っていました。
今回、メモリを128KBから512KBに増やすことを考慮してメモリ容量の変更でもCP/MやBIOSのアドレスが変わらないCPM400.SRに移行しようとしてハマりました^^;(まぁこういうことも含めて色々調べる過程も楽しいのですがw)
BIOS内のジャンプテーブルのアクセス動作が不穏な動きをします・・・
EASy68K Simulatorで動作を確認してみるとこんな感じです。
A0の値が $0060AC なのでステップ動作すればA2には $00615E が設定されるはずが・・
EASy68K(1) |
|
ステップ動作後のA2の値は何故か $007000 になっている・・・
EASy68K(2) |
|
何故でしょう?? EASy68Kのバグでしょうか?w
そうではありません。ブレッドボード上の実機で確認しても
こんなエラーが表示されます。
BIOSサービスから抜けた後もSTEP動作で動きを確認してみるとCPM内の処理でBIOSのテーブルの一部が書き換えられていますorz
CPM400.SRのマップファイル(CPM400.MAP)を見て納得がいきました。
BIOSの先頭に配置している _init のアドレスが $6000 ですが bss(初期化しないワークエリア)が $5D80 から $6150+FCBのサイズまで割り振られていて BIOS の領域とオーバーラップしています!!
これでは CPM400.SR は使えませんねぇ。
$006000 に _init へのjmp命令を配置してBIOS本体を $6174から始めるようにすれば動くと思います(jmp命令が_subfcbとオーバーラップしますが_initは最初の一回だけしかコールされないのでコール後ワークとして使用されても問題ないはず)が、そんなことをするよりは CPM15000.SR を使ってCP/M-68Kを立ち上げて、CP/M上でCP/Mをリロケートした方が早い。
|
[TOP] [ 前へ ] 連載記事 [ 次へ ]