|
往々にしてあることですが予想より修正が多岐に渡りました。
ただし運良くメモリに常駐するFM7DRV27_20181124については 予定以上の機能を88バイトで収めることができました。苦労として ヘッダに関するソフトHeader27_20181124をカセットバッファの $0600以降に展開して動かそうとしましたがカセットバッファ・PSG 以外でも使用されており、使えませんでした。他の領域を探して 自分は何とか$460-$4D8で使えることを確認しましたが、他の方も 同一の領域で使えることの保証は控えます。とは言え試行錯誤しま したのでコード自体は粉れた水準になったと認識してます。 Header27_20181124の使用領域を$460-$4D8として説明します。 またBASICは拡張してませんのでchain等の命令は使えません。 あくまでメモリに存在してるデータを保存したり保存したデータを メモリに展開するだけの機能です。 なお現在の自分の使い方として、FM7DRV27_20181124は カセットにセーブして、使用時にカセットからロードしてます。 Header27_20181124はLinux側に保存しており、使用する際に Linux側から転送しFM-7で受信して使ってます。 <データ転送ハードのおける対応ソフトの構成> FM7DRV27_20181124とHeader27_20181124で構成する。 ただしFM7DRV27_20181124、Header27_20181124とも 単一の機能ではなく複数の機能を有する。 二本のソフトにした理由はリニアな領域を確保できないから。 なお、$FC00-$FC57の領域を使うソフトには対応しません。 <速度について> 読み込みで7Kバイト/秒、買い込みで15Kバイト/秒程 <データを読む込む時の仕組みと各ルーチンの機能> FM7DRV27_20181124 常駐アドレス:$FC00-$FC57、使用バイト数:88バイト、 ワークエリア:$FC00-$FC07、下の(1)から(3)の機能を持つ FM7DRV27_20181124のプリミティブなデータ送受信ルーチンは ポジション・インディベンドですがヘッダ付きデータの受信機能を 使う時はサブルーチンから固定アドレスの$FC12を更にコールして ますのでアドレスの変更は不可です。 <補足> 前回はデータを読む込み機能のみメモリに常駐する予定でしたが 運良く読む込み機能以外にプリミティブなデータ送信ルーチンも メモリに常駐させても88バイトに収まりました。プリミティブな データ送信ルーチンもメモリに常駐してると細かなデータの保存 をする時に便利です。 (1)プリミティブなデータ受信ルーチン エントリ:$FC12、ワークエリアにデータを設定しコールする 機能:受信バッファのデータをメモリに展開する コールする前に下のアドレスにデータを(手動で)設定すること 先頭アドレスを$FC02からの2バイトに、終端+1を$FC04からの 2バイトに設定する <補足> 終了条件として二つの場合を想定してます。一つはXレジスタが [終端+1]になった時、もう一つは$FDFEの7ビット(最上位ビット) が[hi]になった時(受信バッファにデータがない)また後者で終了 した場合は、その時のXレジスタの内容を$FC06に書かない。 I/O操作をメモリを節約するためサブルーチン化したのでせめて、 速度低下を少しでも抑えようとした結果です。 (2)プリミティブなデータ送信ルーチン エントリ:$FC39、ワークエリアにデータを設定しコールする 機能:メモリの内容を送信バッファに送る コールする前に下のアドレスにデータを(手動で)設定すること 先頭アドレスを$FC02からの2バイトに、終端+1を$FC04からの 2バイトに設定する <補足> 終了条件はXレジスタが[終端+1]になった時この領域($FC00-$FC57) で使えるメモリが少なかったので終了時のXレジスタの内容を$FC06に 書き出す機能は省略する。 (3)ヘッダ付きデータの受信ルーチン エントリ:$FC51、ワークエリアにデータを設定しコールする 機能:ヘッダ付き受信データをメモリに展開する アドレス$FC02からの2バイトに#0460(16進数)を設定しアドレス $FC04からの2バイトに#04A0(16進数)を設定する。 また$FC54からの3バイトは[JSR $470]になってると思います。 ・第一段階でヘッダをメモリに展開する ファイルの先頭から64バイトのヘッダ情報を$460-$4A0に展開する。 第二段階で展開する領域(先頭アドレスと終端アドレス+1)は ヘッダにデータとして保有してるので、第二段階の下準備をする。 <注意>先頭アドレス及び終端アドレス+1はファイルにヘッダを 付加する際に固有値が書き込まれてる(か、あるいは書き込む)。 詳しくは、<データを送信(保存)する時の使い方>で説明します。 ・第二段階でヘッダ情報に基ずき、保存データを指定領域に展開する $FC51からサブルーチン($470)をコールした後に、($470から始まる) サブルーチンがデータ本体のメモリを展開する領域をヘッダ情報から 取得し、そのデータを$FC02、$FC04に設定して$FC12をコールする。 またbasicソフトの時は($33・$34)、($35・$36)の復元もします。 因みに、ここの作業はプログラムが自動的にします。 <補足> $FC51からサブルーチン($470)をコールする際に$FC02、$FC04に 設定したデータを作業の後に復元したかったのですがメモリが足り ませんでした。ですので$FC02、$FC04の値はデータを展開した アドレスに書き変わったままの状態です。$FC51を使う時にはコール する毎に$FC02、$FC04に、それぞれ#0460、#04A0を設定して下さい。 ・注意 BASICのアプリをメモリに展開し動かした後はアプリによってメモリ 使用領域に制限がかけられることがあります(例:clear命令等で) この場合、次のアプリを続けてEXEC命令で$FC51をコールしメモリに 展開しようとすると制御が戻らないことがあります。アプリの動作後は リセットして再度FM7DRV27_20181124を展開・設定して下さい。 <FM7DRV27_20181124.dat>と<Header27_20181124>のコード 及び、<データを送信(保存)する時のソフトと使い方>は 次回に投稿します。 |

>
- コンピュータとインターネット
>
- コンピュータ
>
- ソフトウェア






<速度の表記において、訂正>
×)読み込みで7Kバイト/秒、買い込みで15Kバイト/秒程
○)読み込みで7Kバイト/秒、書き込みで15Kバイト/秒程
[ shuji_akita2001 ]
2018/12/15(土) 午前 8:42