- 追加された行はこのように表示されます。
- 削除された行は
このように表示されます。
,{t},{BSIZE:1 0|SIZE:100%}
,{BSIZE:0}←[[1章 PSGと音声出力]] ,{BSIZE:0|RIGHT}[[3章 キーボード I/F|3章 キーボード・インターフェイス]] →
カセットテープレコーダは、MSXの最も安価な外部記憶装置です。このカセットテープ上の情報をマシン語プログラム中で取り扱うためには、カセットインターフェイスの使用法を知らなくてはなりません。本章では、このために必要となる情報を説明します。
!!2.1 ボーレート
MSXのカセットインターフェイスは以下の2種類のボーレートを使用できます(表6.3)。なお、BASICのスタート時にはデフォルトで1200ボーが設定されています。
'''表6.3 MSXのボーレート'''
,{t},{BSIZE:2 0}
,{c},{BSIZE:1 0|SIZE:100},{BSIZE:1 0}
,ボーレート,特徴
,{c},{BSIZE:0},{BSIZE:0}
,1200ボー,低スピード/高信頼性
,2400ボー,高スピード/低信頼性
ボーレートの指定は、SCREEN命令の第4パラメータまたはCSAVE命令の第2パラメータで行います。一度指定すると以後そのボーレートが引き続いて使用されます。
SCREEN ,,,<ボーレート>
CSAVE "ファイル名",<ボーレート>
(<ボーレート>は両者とも、「1」で1200ボー、「2」で2400ボー)
!!2.2 1ビットの構成
入出力の基本となる1ビットのデータは図6.10のように記録されます。パルスの幅はCPUのT-STATEをカウントして決められるため、カセットインターフェイス作動中はすべての割り込みが禁止されています。
なお、カセットから入力されるビットデータは、汎用入出力インターフェイスのポートB(PSGのレジスタ#15)の第7ビットを通して読み取ることが可能です。サンプルプログラム「CFILES.MAC」の中で、この機能を使用していますので、参照して下さい。
{{svg 図6.10.svg}}
'''図6.10 1ビットの構成'''
!!2.3 1バイトの構成
1バイトのデータは図6.11のようなビット列で記録されます。スタートビットとして「0」のビットがひとつ、次にデータ本体が最下位ビットから最上位ビットの順で8ビット、最後にストップビットとして「1」のビットが2つ続き、合計11ビットを使用します。
{{svg 図6.11.svg}}
'''図6.11 1バイトの構成'''
!!2.4 ヘッダの構成
ヘッダとはセーブまたはロード時に、カセットテープが動き出してから回転が安定するまでの時間待ちや、ファイル間に区切りをつけるために、ある特定の周波数の信号を一定時間テープに記録させた部分のことです。ロングヘッダとショートヘッダの2種類があり、ロングヘッダはモータの回転が安定するまでの時間待ちに使用されます。また、テープリード時のボーレートは、ロングヘッダを読んで決定されます。ショートヘッダはファイルボディ間の区切りに使用されます。
'''表6.4 ヘッダの構成'''
,{t},{BSIZE:2 0}
,{c},{BSIZE:1 1 1 0|SIZE:100},{BSIZE:1 0|SIZE:150},{BSIZE:1 0}
,ボーレート,ヘッダの種類,ヘッダの構成
,{c},{BSIZE:0 1 0 0},{BSIZE:0},{BSIZE:0}
,1200ボー{ROWS 2},ロングヘッダ ,2400Hz×16000波(約6.7秒)
, ,ショートヘッダ ,2400Hz×4000波(約1.7秒)
,2400ボー{ROWS 2|BSIZE:1 1 0 0},ロングヘッダ{BSIZE:1 0 0 0},4800Hz×32000波(約6.7秒){BSIZE:1 0 0 0}
, ,ショートヘッダ ,4800Hz×8000波(約1.7秒)
!!2.5 ファイルのフォーマット
MSXのBASICは次の3タイプのカセットフォーマットのファイルをサポートしています。
'''1.BASICテキストファイル'''
CSAVE命令でバイナリセーブしたBASICプログラムは、このフォーマットにしたがって記録されます。なお、ファイルは前半のファイルヘッダと後半のファイルボディに分けられます。
{{svg 図6.12.svg}}
'''図6.12 バイナリファイルのフォーマット'''
ファイルヘッダは、ロングヘッダの後にOD3Hという値が10バイト続き、その後に6バイトのファイル名が置かれます。ファイルボディはショートヘッダの後にプログラム本体が続き、7バイトの00Hでファイルエンドを示します。
'''2.ASCIIテキストファイル'''
SAVE命令でアスキーセーブされたBASICプログラム、およびOPEN命令によって作られたデータファイルは、このフォーマットにしたがって記録されます。
ファイルヘッダは、ロングヘッダの後に0EAHという値が10バイト続き、その後に6バイトのファイル名が置かれます。
データ本体は256バイトごとのブロックに分けられ、それぞれのブロックの前にはショートヘッダが置かれます。ファイルエンドはCtrl-Z(1AH)で示されます。このため、1AHという値を含むデータファイルを作ることはできません。
{{svg 図6.13.svg}}
'''図6.13 アスキーファイルのフォーマット'''
'''(3)マシン語ファイル'''
BSAVE命令でセーブされたマシン語ファイルは、このフォーマットにしたがって記録されます。ファイルヘッダは、ロングヘッダの後に0D0Hという値が10バイト続き、その後ろに6バイトのファイル名が置かれます。
ファイルボディは、ショートヘッダの後に、先頭アドレス、最終アドレス、実行開始アドレスの順に3つのアドレスが記録され、その次にマシン語本体が続きます。データの量は先頭アドレスと最終アドレスから計算できますから、特別なファイルエンドマークはありません。実行開始アドレスとは、BLOAD命令のRオプション使用時に、プログラムが実行されるアドレスです。
{{svg 図6.14.svg}}
'''図6.14 マシン語ファイルのフォーマット'''
!!2.6 カセットファイルのアクセス
カセットファイルをアクセスするために、以下のBIOSルーチンが用意されています。
::TAPION (OOE1H/MAIN)
,{SIZE:100|CENTER}機能
読み込み用にファイルをオープンします。
,{SIZE:100|CENTER}コール手順
なし
,{SIZE:100|CENTER}戻り値
異常終了時はCYフラグON
,{SIZE:100|CENTER}変更レジスタ
すべて
,{SIZE:100|CENTER}解説
テープレコーダのモータを起動し、ロングヘッダまたはショートヘッダを読み込みます。同時にそのファイルが記録されたボーレートを判別し、ワークエリアをそれに合わせて設定します。割り込みは禁止されます。
::TAPIN (00E4H/MAIN)
,{SIZE:100|CENTER}機能
データを1バイト読み込みます。
,{SIZE:100|CENTER}コール手順
なし
,{SIZE:100|CENTER}戻り値
,{t},{BSIZE:0}
,{c},{BSIZE:0|SIZE:70},{BSIZE:0}
,A,読み込んだデータ
,異常終了時CYフラグ=ON{COLS:2},
,{SIZE:100|CENTER}変更レジスタ
すべて
,{SIZE:100|CENTER}解説
テープからデータを1バイト読み込み、Aレジスタに格納します。
::TAPIOF (00E7H/MAIN)
,{SIZE:100|CENTER}機能
読み込み用のファイルをクローズします。
,{SIZE:100|CENTER}コール手順
なし
,{SIZE:100|CENTER}戻り値
なし
,{SIZE:100|CENTER}変更レジスタ
なし
,{SIZE:100|CENTER}解説
テープからの読み込み動作を終了します。同時に割り込みは再開されます。
::TAPOON (00EAH/MAIN)
,{SIZE:100|CENTER}機能
書き出しようにファイルをオープンします。
書き出し用にファイルをオープンします。
,{SIZE:100|CENTER}コール手順
,{t},{BSIZE:0}
,{c},{BSIZE:0|SIZE:70},{BSIZE:0|SIZE:70},{BSIZE:0}
,A{ROWS:3},ヘッダの種類{COLS:2},
, ,0 ,ショートヘッダ
, ,0以外,ロングヘッダ
,{SIZE:100|CENTER}戻り値
異常終了時はCYフラグON
,{SIZE:100|CENTER}変更レジスタ
すべて
,{SIZE:100|CENTER}解説
テープレコーダのモータを起動し、Aレジスタで指定された種類のヘッダをテープに書き出す。なお、割り込みは禁止されます。
::TAPOUT (00EDH/MAIN)
,{SIZE:100|CENTER}機能
データを1バイト書き出します。
,{SIZE:100|CENTER}コール手順
,{t},{BSIZE:0}
,{c},{BSIZE:0|SIZE:70},{BSIZE:0}
,A,ヘッダの種類
,{SIZE:100|CENTER}戻り値
異常終了時はCYフラグON
,{SIZE:100|CENTER}変更レジスタ
すべて
,{SIZE:100|CENTER}解説
Aレジスタの内容をテープに書き込みます。
::TAPOOF (00F0H/MAIN)
,{SIZE:100|CENTER}機能
書き込み用のファイルをクローズします。
,{SIZE:100|CENTER}コール手順
なし
,{SIZE:100|CENTER}戻り値
なし
,{SIZE:100|CENTER}変更レジスタ
なし
,{SIZE:100|CENTER}解説
テープへの書き込み動作を終了します。同時に割り込みは再開されます。
::STMOTR (00F3H/MAIN)
,{SIZE:100|CENTER}機能
モーターの動作を指定します。
,{SIZE:100|CENTER}コール手順
,{t},{BSIZE:0}
,{c},{BSIZE:0|SIZE:70},{BSIZE:0|SIZE:70},{BSIZE:0}
,A{ROWS:4},動作の指定{COLS:2},
, ,0 ,停止
, ,1 ,起動
, ,255 ,現在と反対の状態
,{SIZE:100|CENTER}戻り値
なし
,{SIZE:100|CENTER}変更レジスタ
AF
,{SIZE:100|CENTER}解説
Aレジスタで指定した値にしたがって、モーターの動作状態を設定します。
これらのBIOSを使用してカセットファイルのREAD/WRITEルーチンを作成する際、なるべく無駄な動作をせずに、ただひたすらREADまたはWRITEのみに専念するようにしてください。たとえば、テープからデータを読み込みながらそのデータをCRTに表示させたりすると、READエラーを生じることがあります。
サンプルプログラム「CFILES.MAC」を参照して下さい。
,{t},{BSIZE:1 0|SIZE:100%}
,{BSIZE:0}←[[1章 PSGと音声出力]] ,{BSIZE:0|RIGHT}[[3章 キーボード I/F|3章 キーボード・インターフェイス]] →