今回は、Laboratoryテーマ??28「マシン語でフロッピーディスクを制御したい」その?@です。
完成品、未完成品含めすべてです。
フロッピーディスクからデータを読む必要がある時は、「 3Dダンジョンロールプレイングゲーム 」でやっていた通り、一旦BASICに戻っていました。
特にそれで不便を感じませんでしたし、不都合もありませんでした。
でも、やはりマシン語からBASICへ戻るには、コール内からは直接戻れないし、スタックポインタも全てクリアしないといけないなど制約が多いのも確か。
そこで、Laboratoryのテーマにあげました。
しかし、私自身知識が全くないので、あちこちのサイトやブログを探し回りましたが、フロッピーディスク制御に関して詳しく書かれたところは見つかりませんでした。
やむなく、「 MSX2 TEchnical Hand Book 」とにらめっこ。
今まで聞いたことのない専門用語が多く、本の解説も上級者向けの為、なかなか理解できませんでした。
それこそ「トライ&エラー」の連続でした。
そして何十回目かのトライで、これまでの努力が実り、やっと成功しました。
泣きそう…。
このロジックが「3Dダンジョンロールプレイングゲーム」や「無人島脱出アドベンチャーゲーム」で使えていれば、「BE」や「SC」、「SV」スクリプト命令がもっと簡単に組めていたかと思います。
今回はDISK-BASICから「FCB」(ファイルコントロールブロック)を利用して、ファイル名で読み書きできる方法を採用しました。
「FCB」は37バイトで、構成は下表の通り。
0
ドライブ番号
1〜8
ファイル名
9〜11
拡張子
12〜13
カレントブロック
14〜15
レコードサイズ(1〜65535)
16〜19
ファイルサイズ(1〜4294967296)
20〜21
日付
22〜23
時刻
24
デバイスID
25
ディレクトリロケーション
26〜27
ファイルの開始クラスタ番号
28〜29
最後にアクセスしたクラスタ番号
30〜31
ファイルの先頭クラスタからの相対位置
32
カレントレコード
33〜36
ランダムレコード
システムコールはファンクション番号をCレジスタに設定し、下表アドレスをコール
DISK-BASIC
&HF37D
MSX-DOS
&H0005
ファンクション番号は下表の通り。
&H00
システムリセット
&H01
コンソールから 1 文字入力 (入力待ちあり、エコーバックあり、コントロールコードチェックあり)
&H02
コンソールへ 1 文字出力
&H03
補助入力装置から 1 文字入力
&H04
補助出力装置へ 1 文字出力
&H05
プリンタへ 1 文字出力
&H06
コンソールから 1 文字入力 (入力待ちなし、エコーバックなし、コントロールコードチェックなし) / 1 文字出力
&H07
コンソールから 1 文字入力 (入力待ちあり、エコーバックなし、コントロールコードチェックあり)
&H08
コンソールから 1 文字入力 (入力待ちあり、エコーバックなし、コントロールコードチェックあり)
&H09
文字列出力
&H0A
文字列入力
&H0B
コンソールからの入力チェック
&H0C
バージョン番号の獲得
&H0D
ディスクリセット
&H0E
デフォルト・ドライブの選択
&H0F
ファイルのオープン
&H10
ファイルのクローズ
&H11
ワイルドカードに一致する最初のファイルの検索
&H12
ワイルドカードに一致する 2 番目以降のファイルの検索
&H13
ファイルの抹消
&H14
シーケンシャルなファイルの読み出し
&H15
シーケンシャルなファイルの書き込み
&H16
ファイルの作成
&H17
ファイル名の変更
&H18
ログイン・ベクトルの獲得
&H19
デフォルト・ドライブ名の獲得
&H1A
DMA アドレスの設定
&H1B
ディスク情報の獲得
&H1C〜&H20
無効
&H21
ランダムなファイルの読み出し
&H22
ランダムなファイルの書き込み
&H23
ファイルサイズの獲得
&H24
ランダムレコード・フィールドの設定
&H25
無効
&H26
ランダムブロック書き込み
&H27
ランダムブロック読みだし
&H28
ランダムなファイルの書き込み (不要部を 00H で埋める)
&H29
無効
&H2A
コンソールから 1 文字入力 (入力待ちあり、エコーバックあり、コントロールコードチェックあり)
&H01
日付の獲得
&H2B
日付の設定
&H2C
時刻の獲得
&H2D
時刻の設定
&H2E
ベリファイ・フラグの設定
&H2F
論理セクタの読み出し
&H30
論理セクタの書き込み
例えば、ファイル読込は一旦ファイル名を設定しシステムコール(&H0F)し、読込先アドレスを設定し再度システムコール(&H1A)、必要な設定を追加して三度システムコール(&H27)することで読込み出来ます。
出来てしまえば非常に単純で簡単でした。
次回、サンプル公開しますね。