3チップ構成68Kマイコンの構想(その12)Blocking/Deblocking [68K]
前回の記事でプリント基板化のためのパターン設計について書きましたが、プリント基板製造をSeeedさんに注文し待ち状態です^^
今回はCP/M-68KのSDカードアクセス時のブロッキング/デブロッキング処理を追加しました。
3チップ構成のCP/M-80の時はCP/Mのメモリサイズを最大の64KBにしたいこともあってSDカードアクセス処理でブロッキング/デブロッキング処理には対応していませんでした。
今回のCP/M-68KではBIOSのメモリサイズをあまり気にしなくてもいいこと、及びコマンドのサイズがCP/M-80と比較して大きめなのでコマンド実行時に少し待ち時間が発生してしまうのでブロッキング/デブロッキング処理に対応しました。
SDカードのブロック長は512バイトなのでCP/Mのセクタ(128バイト)の4つ分に該当します。
今回の対応で変更したワークエリアは
の変更を行いました。
BIOS内のWriteSectorコール時にD1レジスタに下記の情報が渡されます。
WriteSector処理での追加処理としては最初にSDバッファがヒット(今回の書込みセクタが含まれている)場合はSDの先読みは不要で含まれていない場合は変更フラグがオンならSDバッファをSDに書き込み後、先読みが必要か判断します。
3)の場合は先読み不要でそれ以外の場合は先読みが必要になります。
DMAの内容をSDバッファに書き込み、変更フラグをオンにし、2)の場合は即座にSDバッファ内容をSDに書き込みます(変更フラグはオフにする)。
ReadSector処理に関してはSDバッファにヒットしている場合はSDバッファからセクタ内容を読み取り、ヒットしない場合は変更フラグがオンの場合SDバッファを書込んだ後、必要なSDブロックの内容をSDバッファに読込みます。
SDバッファにヒットした場合、変更フラグがオンでもSDへの書込みは不要ですが、今回は長時間変更フラグがオンになる(その間、電源断等が発生すると書込み情報が失われる)のを避けるため、ReadSector処理ではありますがSDへの書込みを行うようにしました。
文章で書くと少しややこしいですが、プログラム的には若干の追加で対応可能です。
(ワークエリアはSDバッファが4倍に増えるけどプログラムコードのサイズはあまり増えない)
参考に今回対応したBIOSのReadSectorとWriteSectorの部分の抜粋を以下に貼っておきます。
BIOS内ブロッキング/デブロッキング処理
ブロッキング/デブロッキング対処後の動作例として「XMODEMアプリの作成」の記事で載せたxmodemでのファイル送信中のロジアナ波形のbefore/Afterを貼っておきます。
対処後は下図の赤丸部分に示すようにSDカードのアクセス回数が減少しています。
★2018/10/17 追記
コメントに書いたようにCP/MからBIOSのWriteSectorには新たに確保したブロックの最初のセクタ書込み(D1レジスタ=2)であるという情報が渡されています。
今回はCP/Mのブロックサイズを2048バイトにしているので、この情報からSDカードの4ブロック分(SDカードのブロックサイズは512バイト)、先読み無しで書込んでも問題ないはずなので改善してみました。
ワークエリアとして新たに先読み不要カウンタと先読み無しで書込んだブロック番号の保存用ワークを追加して、念のためにSDカードのブロック番号が連番であることも確認するようにしています。
また、ワークエリアを絶対アドレス指定でアクセスするとコード効率が悪くなるのでアドレスレジスタとのオフセットでアクセスするように一部変更しました。
CP/Mの2ブロック分をバイナリモードで単純に書き込むテストプログラムを作りSDカードへの書込み動作を確認してみました。新規ファイルへの書込み動作のみを確認するためにファイルオープン後の書込み開始前と書込み終了後のファイルクローズ前にキー入力処理を入れることでファイルへの書込み中の波形をロジアナで確認しました。
下のキャプチャがロジアナ波形のBefore/After比較になります。
対処前はCP/Mブロックの最初の書込みだけ先読みがない状態なのでSDへの書込みの4回に3回は先読みが発生しています。
改善後は新規書込みの場合、常に先読み無しでSDカードへの書込みが行われていて想定通りの動作になっています。
今回、CPM.SYSを何度か変更して評価するにあたり、CP/M-68Kで採用されているCP/Mローダのおかげで、AドライブのCPM.SYSファイルを入れ替えてCP/Mを再立ち上げするだけでいいので効率的に作業が出来ました。
CP/Mのファイルセットに含まれているサイズが大きめのDDT68000.68K(431セクタ、54KB)のファイルをpipコマンドで空ディスクにコピーする時間を計ってみたところ 5.2秒から4.9秒に改善されました(あまり変わらないですねw)
[TOP] [ 前へ ] 連載記事 [ 次へ ]
今回はCP/M-68KのSDカードアクセス時のブロッキング/デブロッキング処理を追加しました。
3チップ構成のCP/M-80の時はCP/Mのメモリサイズを最大の64KBにしたいこともあってSDカードアクセス処理でブロッキング/デブロッキング処理には対応していませんでした。
今回のCP/M-68KではBIOSのメモリサイズをあまり気にしなくてもいいこと、及びコマンドのサイズがCP/M-80と比較して大きめなのでコマンド実行時に少し待ち時間が発生してしまうのでブロッキング/デブロッキング処理に対応しました。
SDカードのブロック長は512バイトなのでCP/Mのセクタ(128バイト)の4つ分に該当します。
今回の対応で変更したワークエリアは
- PICと68K間のSDデータ渡し用の領域(SDバッファ)を128バイトから512バイトに変更
- SDバッファ内のデータがSDに書き込み済みでない場合の変更フラグを追加
- SDバッファの属性としてsector番号での管理をSDのブロック番号の管理に変更
の変更を行いました。
BIOS内のWriteSectorコール時にD1レジスタに下記の情報が渡されます。
- d1.w = 0 : normal write
- d1.w = 1 : write to a directory sector
- d1.w = 2 : write to first sector of new block
WriteSector処理での追加処理としては最初にSDバッファがヒット(今回の書込みセクタが含まれている)場合はSDの先読みは不要で含まれていない場合は変更フラグがオンならSDバッファをSDに書き込み後、先読みが必要か判断します。
3)の場合は先読み不要でそれ以外の場合は先読みが必要になります。
DMAの内容をSDバッファに書き込み、変更フラグをオンにし、2)の場合は即座にSDバッファ内容をSDに書き込みます(変更フラグはオフにする)。
ReadSector処理に関してはSDバッファにヒットしている場合はSDバッファからセクタ内容を読み取り、ヒットしない場合は変更フラグがオンの場合SDバッファを書込んだ後、必要なSDブロックの内容をSDバッファに読込みます。
SDバッファにヒットした場合、変更フラグがオンでもSDへの書込みは不要ですが、今回は長時間変更フラグがオンになる(その間、電源断等が発生すると書込み情報が失われる)のを避けるため、ReadSector処理ではありますがSDへの書込みを行うようにしました。
文章で書くと少しややこしいですが、プログラム的には若干の追加で対応可能です。
(ワークエリアはSDバッファが4倍に増えるけどプログラムコードのサイズはあまり増えない)
参考に今回対応したBIOSのReadSectorとWriteSectorの部分の抜粋を以下に貼っておきます。
|
ブロッキング/デブロッキング対処後の動作例として「XMODEMアプリの作成」の記事で載せたxmodemでのファイル送信中のロジアナ波形のbefore/Afterを貼っておきます。
Before |
|
対処後は下図の赤丸部分に示すようにSDカードのアクセス回数が減少しています。
After |
|
★2018/10/17 追記
コメントに書いたようにCP/MからBIOSのWriteSectorには新たに確保したブロックの最初のセクタ書込み(D1レジスタ=2)であるという情報が渡されています。
今回はCP/Mのブロックサイズを2048バイトにしているので、この情報からSDカードの4ブロック分(SDカードのブロックサイズは512バイト)、先読み無しで書込んでも問題ないはずなので改善してみました。
ワークエリアとして新たに先読み不要カウンタと先読み無しで書込んだブロック番号の保存用ワークを追加して、念のためにSDカードのブロック番号が連番であることも確認するようにしています。
また、ワークエリアを絶対アドレス指定でアクセスするとコード効率が悪くなるのでアドレスレジスタとのオフセットでアクセスするように一部変更しました。
CP/Mの2ブロック分をバイナリモードで単純に書き込むテストプログラムを作りSDカードへの書込み動作を確認してみました。新規ファイルへの書込み動作のみを確認するためにファイルオープン後の書込み開始前と書込み終了後のファイルクローズ前にキー入力処理を入れることでファイルへの書込み中の波形をロジアナで確認しました。
下のキャプチャがロジアナ波形のBefore/After比較になります。
対処前はCP/Mブロックの最初の書込みだけ先読みがない状態なのでSDへの書込みの4回に3回は先読みが発生しています。
Before |
|
改善後は新規書込みの場合、常に先読み無しでSDカードへの書込みが行われていて想定通りの動作になっています。
After |
|
今回、CPM.SYSを何度か変更して評価するにあたり、CP/M-68Kで採用されているCP/Mローダのおかげで、AドライブのCPM.SYSファイルを入れ替えてCP/Mを再立ち上げするだけでいいので効率的に作業が出来ました。
CP/Mのファイルセットに含まれているサイズが大きめのDDT68000.68K(431セクタ、54KB)のファイルをpipコマンドで空ディスクにコピーする時間を計ってみたところ 5.2秒から4.9秒に改善されました(あまり変わらないですねw)
[TOP] [ 前へ ] 連載記事 [ 次へ ]
3チップ構成68Kマイコンの構想(その11)回路図整理とパターン設計 [68K]
前回の記事で書いたようにCP/M-68K用のXMODEMを作り、ネットで公開されているCP/M-68Kのアプリで容易に遊べるようになったので回路図の整理とプリント基板のパターンを設計してみました。
今回の回路はCP/M-80が動く3チップ構成のPic24CPMと回路構成は共通点が多いです。
今回は最初からPCB製造をメーカーに出すことを前提にしたのでCNCでの作成のための条件であった「Via処理後はViaが基板面から出っ張るのでTQFPの半田付け作業の邪魔にならないようにTQFPの直下にはViaを打たない」という縛りを無くしました。
この結果、Pic24CPMの回路と比較し、MC68008(48ピン)はZ80(40ピン)よりピン数が多いですが、CP/M-80の時よりボードサイズを数ミリ小さくできました(基板サイズは96 x 66[mm])。
回路図は下図のとおりで使用しているICは
の3チップです。
次にパターン図ですが、上述したように今回はCNCでの基板作成は考慮せず、CNCのための条件もないので自由にパターンを作成しました。
TQFP直下にviaを打ってもいいのでTQFP周辺の反対面(bottom面)のパターンも結構込み入っています。
細い斜めの線はこの時点ではパターン化していないグランドの結線です。グランドをベタパターン化する際に接続される予定です。
下図がグランドベタ化後のトップ面のパターンです。
パターンが込み合っているため、グランドをベタパターンにしても孤立した部分(茶色の部分)が多く発生し、グランドに接続できていなかった端子が何個か生じました。このため数個のviaを追加してトップ面とボトム面を接続することでグランドへのパスが出来るようにしています。
下図はボトム面のパターンです。
おまけでDesignSparkPCBで3D表示した画面を貼っておきます。(上記のトップ面とボトム面接続用のvia追加前のものです)
512KBのSRAM等、3Dデータがないものは直方体になっています。
3チップ構成と言いながら4チップあるように見えますが、右端のICのようなものはSDカードホルダです。w
こんな小さなワンボード基板でCP/M-68Kが動くんですよ^^
★2019/11/25 追記
完成したプリント基板を「3チップ構成68Kマイコンの構想(その13)プリント基板完成」の記事に掲載しました。
[TOP] [ 前へ ] 連載記事 [ 次へ ]
今回の回路はCP/M-80が動く3チップ構成のPic24CPMと回路構成は共通点が多いです。
今回は最初からPCB製造をメーカーに出すことを前提にしたのでCNCでの作成のための条件であった「Via処理後はViaが基板面から出っ張るのでTQFPの半田付け作業の邪魔にならないようにTQFPの直下にはViaを打たない」という縛りを無くしました。
この結果、Pic24CPMの回路と比較し、MC68008(48ピン)はZ80(40ピン)よりピン数が多いですが、CP/M-80の時よりボードサイズを数ミリ小さくできました(基板サイズは96 x 66[mm])。
回路図は下図のとおりで使用しているICは
- MC68008P10
10MHz版のバスが8bit幅の68Kチップ。PICからクロックを供給する関係で8MHzで動作。
- K6T4008C1B-DB70
512KBのSRAM。アクセスタイムは70ns。
- PIC24FJ64GA004
16bitPICマイコン。セルフコンパイラの独自言語picleを使って制御。
の3チップです。
3チップ構成の68Kマイコンボードの回路図 |
★2018/10/31 追記 R3は+5Vにプルアップするつもりでしたが3.3Vへのプルアップでも動作することを確認しました^^; |
次にパターン図ですが、上述したように今回はCNCでの基板作成は考慮せず、CNCのための条件もないので自由にパターンを作成しました。
TQFP直下にviaを打ってもいいのでTQFP周辺の反対面(bottom面)のパターンも結構込み入っています。
細い斜めの線はこの時点ではパターン化していないグランドの結線です。グランドをベタパターン化する際に接続される予定です。
パターン図(GNDベタ化前) |
|
下図がグランドベタ化後のトップ面のパターンです。
パターンが込み合っているため、グランドをベタパターンにしても孤立した部分(茶色の部分)が多く発生し、グランドに接続できていなかった端子が何個か生じました。このため数個のviaを追加してトップ面とボトム面を接続することでグランドへのパスが出来るようにしています。
トップ面 |
|
下図はボトム面のパターンです。
ボトム面 |
|
おまけでDesignSparkPCBで3D表示した画面を貼っておきます。(上記のトップ面とボトム面接続用のvia追加前のものです)
512KBのSRAM等、3Dデータがないものは直方体になっています。
3チップ構成と言いながら4チップあるように見えますが、右端のICのようなものはSDカードホルダです。w
トップ面 |
|
ボトム面 |
|
こんな小さなワンボード基板でCP/M-68Kが動くんですよ^^
★2019/11/25 追記
完成したプリント基板を「3チップ構成68Kマイコンの構想(その13)プリント基板完成」の記事に掲載しました。
[TOP] [ 前へ ] 連載記事 [ 次へ ]
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] [ 前へ ] 連載記事 [ 次へ ]