今回は、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)することで読込み出来ます。
出来てしまえば非常に単純で簡単でした。
次回、サンプル公開しますね。