例えばLZH形式で圧縮されたアーカイブで、その中に格納されたファイルを展開作業なし(ファイルをディスク上に生成しない)にそのまま利用するようなものです。
そこで、処理の区切り(場面)ごとに細かなファイルを連結して1ファイルに凝縮させ、VRAMに一括ロードしておきます。データを使う際には凝縮させたデータをRAMへ転送させたり、その場で利用・加工すれば、ディスクからのロード時間が省けてレスポンスが良くなるはずです。ファイルが沢山あるよりも1つのファイルを一気にロードしたほうがロード時間が短くなるからです。
1バイトのファイルというのは確かに極論ですが、こういったクラスタ単位の無駄な領域は、128バイト単位で全てのファイルを構成しない限り、必ず存在します。ディスクの空き容量が全てのファイルサイズから計算しても、計算が合わないのはこのためです。
いくつかのファイルを連結して1ファイルにすると、ファイルのクラスタ単位の余りがデータの連結により極力省け、結果的にディスクの占有量が減ることがあります。これは713KB、112ファイルしか保存できないMSXの2DDフロッピーディスクには大いに有効です。細かいファイルが多ければ多いほどこの効果が大きく、連結したほうが「得」と言えます。
しかし連結することによるデメリットも確かに存在します。バランスの良い使い方を目指してください。
連結するファイルにはDMシステム2のBPE圧縮ファイルも利用できます。BPE圧縮したファイルも普通のファイルと同様に連結でき、復元時にはDMシステム2が自動的に展開作業を行います。これにより連結するファイルのサイズをさらに縮めることができます。
バイナリシステム(連結エディタ)で対応するデータ形式は以下の通りです。
※ 64KBを越える連結はできませんので、容量オーバーの場合はさらに場面を分割する等の工夫が必要です。
フラグは各種データの用途に合わせ、拡張命令(CALL BINLOAD)一つで自動的にそのデータを利用できるようにする為のものです。BGMなら演奏、PCMなら再生、マシン語ファイルなら実行…等々の処理に必要な情報をフラグとして連結エディタで設定します。
※ アドレス指定は10進数でも16進数でも構いませんが、64KB以降のVRAM(screen 5/6でのページ2/3、screen 7以降のページ1)を宣言する場合は10進数で宣言してください(16進数ではOverflowエラーになります)。
※screen 4以下のスクリーンモードでは正常に動作しません。
ちなみに特にモードを指定しない場合は、目的のデータのディレクトリ情報(8バイト)の獲得だけで処理を終了します。データ自体の転送はしないので、各種モードを指定しないとあまり意味がありません。その際のディレクトリ情報はDMシステム2のインフォメーションエリア (BINDIR:4300h+30)に格納されます。
この命令でVRAMに配置した連結データをRAMやVRAM等、指定したアドレスへ転送(復元)します。特別なことでもない限り普通はデータの転送だけ行えれば問題ないので、写しモードを「基本」と覚えておきましょう。
BPE圧縮された連結データは、自動的に展開します。
一気モードはデータを指定のアドレスへ転送した後、そのデータを自動的に活用します。BGMデータなら転送後いきなり演奏、マシン語ファイルなら転送後いきなり実行…。即利用の効果はデータ形式によって変わります。即利用に必要なパラメータは連結エディタで設定した機能依存フラグが利用されます。
即利用の効果が無いデータ形式も存在します。そのようなデータを一気モードで即利用すると、写しモードと同様、データの転送のみとなります。
CALL BINLOAD (64+格納番号,機能依存,x座標,y座標) ※COPY形式
設定が必要ないパラメータは省略することができます。
特に一気モードはDMシステム2の神髄とも言うべき便利な機能で、DMシステム2をよりダイナミックに活用できる役割を担っています。これを覚えてしまえばソフトに対するDMシステム2の効果は絶大なものとなるでしょう。DMシステム2を利用したプログラムの際にはぜひ「バイナリシステム」に挑戦してみてください。
ビジュアルページにバイナリテーブルを配置するわけには行かない(=カッコ悪い)ですから、通常、バイナリテーブルは「裏画面」と呼ばれるVRAMの他のページに配置することになるのですが、SCREEN 7以降のような2画面しか持てないスクリーンモードでは、バイナリテーブルを裏画面に配置するだけで既にVRAMの空き容量を大幅に減らしているかもしれません。
これにより、CG加工用のバッファが用意できなかったり、各種CGパーツが配置できなくなることがあります。
対処方法としては、このようなアイデアが挙げられます。
考えられるバグの出所はこんな感じです。
2のケースは、プログラマの意図したアドレスにデータが転送されていなかったり、データ形式が違っているなど、プログラムの記述に問題があります。そこをチェックしてみてください。最悪の場合、DMシステム2の常駐領域にデータを間違えて転送してしまったおかげで、DMシステム2の動作が不安定になっていた、なんてこともあります。
第1章 概要
1.1 バイナリシステムとは
ディスク上に配置されているファイルを連結し、その連結したデータを加工無しに復元・利用する機構です。
1.2 連結するメリット
ファイルを連結することによって、ユーザーが恩恵を受けられるメリットは2点あります。
1.転送(ロード)時間の短縮
プログラムで使用する各種ファイルのサイズが数百バイト程度といった小さなものの場合、これらを普通に1つ1つディスクから読みだす(ロードする)と、1ファイル読むごとに移動するFDDのヘッダのおかげで大量の時間を消費してしまい、結果、ロードの待ち時間が長くなってしまいます。
2.ディスク容量の最適化
MSXのフロッピーディスクは128バイトで1クラスタを構成します。例え1バイトのファイルでも、32バイトでも、もちろん128バイトでも、ディスク上では1クラスタを利用します。よって、仮に1バイトのファイルを作成すると、余りの127バイトは空き領域になってしまいます。この領域はファイルを削除しない限り、絶対に活用することはできません。
第2章 DMシステム2からの使用方法
2.1 ファイルを分類する
ファイルをソフトの場面・目的別(その場面に必要な最低限のファイル群)に分類します。すべてのファイルを一度にメモリへ通さなければならない場合ならともかく、ほとんどの場合はファイルのロードに「区切り」が付けられるはずです。
ex.)
ゲームの場合→「オープニング」「タイトル」「キャラ選択」…
2.2 ファイルを連結する
分類したファイルを連結して1ファイルにまとめます。連結作業には、専用の連結エディタで連結します。
※ BPE圧縮の方法はBPE圧縮ツールの説明書をご覧ください。
連結エディタ (updated: Apr 3, 1998)
LINK.LZH (15KB)
No. データ形式の内容 拡張子(デフォルト)
0 その他(RAMへ転送するベタデータ) 下記以外の拡張子
1 BGMデータ .MGS .BGM
2 SEDRVに対応したSEテーブル .SE
3 RAMへ転送するバイナリーデータ .OBJ .BIN
4 DM-PALETに対応したパレットテーブル .PLn .BPn
8 VRAMへ転送するベタデータ .SCn .SRn
9 COPY形式のCGデータ .PIn .GLn
10 PCMデータ .PCM .PCP
2.3 フラグの設定
連結作業の際、各連結データにフラグを設定します。連結したそのデータはどのような種類で、DMシステム2ではどのように使われるべきなのかを情報として残すわけです。
※ この情報を「機能依存フラグ」と呼ぶことにします。
しかし、フラグは特に設定しなくても、後述のパラメータ指定で補完できます。
2.4 バイナリシステムの宣言
連結したファイル(バイナリテーブル)をVRAM上の自由な位置へ配置し、システムへ宣言します。
CALL SETBIN (連結データの先頭アドレス)
事前にバイナリテーブルを所定のアドレスへ配置しておく必要があります。配置されていない場合はエラーになります。
ex.)
_setbin (@&H8000)
← 8000h(screen 5でのページ1)へ配置
_setbin (@98304!)
← 18000h (screen 5でのページ3)へ配置
※ RAMには配置できません。
2.5 連結したデータを復元する(その前に…)
連結したデータを復元、利用します。1バイトの整数を代入しますが、これには重要な意味があります。
CALL BINLOAD (モード+格納番号)
b7 b6 b5 b4 b3 b2 b1 b0
A C n n n n n n
~~ ~~ ~~~~~~~~~~~~~~~~~ bit5〜0 格納番号 (1〜63)
| |
| ・------------------ bit6 写しモード(0:off 1:on)
|
・--------------------- bit7 一気モード(0:off 1:on)
格納番号はファイルを連結した順に1〜63となります(0は無し)。通常は格納番号と同時に各種モード(後述説明)を設定して、この命令を利用します。
ちなみに格納番号に0を指定すると、バイナリテーブルのヘッダの情報(8バイト)の転送だけで処理を終了します。
4300h
+30 ID
+31 機能依存フラグ
+32〜3 データの格納アドレス (先頭からのオフセット)
+34〜5 主にデータの展開先アドレス
+36〜7 主にファイルサイズ
ex.)
_binload (3)
← 3番目の連結データの情報を得る
ex.)
_binload (0)
← バイナリテーブルのヘッダ情報を得る
2.6 写しモード
連結したデータを復元し、目的のアドレスへ転送します。
CALL BINLOAD (64+格納番号)
目的のアドレスへデータを写す意味から、これを「写しモード」と呼ぶことにします(こじつけ)。
ex.)
_binload (64+3)
← 3番目の連結データを転送する
2.7 一気モード
連結したデータを復元し、即利用します。
CALL BINLOAD (128+格納番号)
データをいきなり利用することから、「一気モード」と呼ぶことにします。
No. データ形式 即利用の効果 相当する命令
0 その他(ベタRAM) なし
1 BGMデータ BGMを演奏 CALL BGMON
2 SEデータ SEテーブルとして登録 CALL SETSE
3 マシン語 マシン語として実行 BLOAD ,R
4 パレット パレットテーブルとして登録 CALL SETPLT
8 ベタVRAM なし
9 COPY形式CG なし
10 PCMデータ PCMを再生 CALL PCMON
ex.)
_binload (128+3) ← 3番目の連結データを即利用する
2.8 自由に転送する (上級者向け)
連結エディタで書き込まなくてはいけない各種情報は、プログラムの記述で補うことができます。
CALL BINLOAD (64+格納番号,機能依存,展開番地,size)
機能依存フラグ等のパラメータを直接プログラムで設定することにより、連結エディタで設定した内容とは別の動作をさせることも可能です。連結エディタで情報を設定してプログラムを簡潔に書くか、それとも連結作業を適当に済ませてプログラムで機能依存フラグを操作するか…。どちらが便利かはあなたの好み次第です。
CALL BINLOAD (128+格納番号,機能依存,展開番地,size)
CALL BINLOAD (128+格納番号,機能依存,x座標,y座標) ※COPY形式
ex.)
_binload (64+2,,&HC000)
← 2番目の連結データを&HC000へ転送
_binload (64+2,,24,106)
← 2番目(COPY形式)を(24,106)へ転送
第3章 補足
3.1 まとめ
このように「バイナリシステム」は、ディスクの代わりにVRAMを「データタンク」として利用します。VRAMもメモリの一部ですからデータ転送は瞬時に終わりますし、連結することによりディスクの空き容量の節約にも繋がります。使いこなすにはちょっとパワーが必要になりますが、やっただけの見返りは十分に得られるものと確信しています。
3.2 連結するデメリット
バイナリシステムにはメリットもありますが、デメリットも生じます。利用目的を考慮して、ぜひ活用してください。
1.VRAMが足りなくなる
VRAMをデータタンクとする為、特にSCREEN 7以降のスクリーンモードではVRAMのやりくりに困るかもしれません。
2.デバッグが難しくなる
もしバイナリテーブルを利用したプログラムにどこかバグが潜んでいたりすると、そのバグの特定が難しくなってしまいます。
1のケースは、連結する前にそのデータを普通にロードして、正常動作するかをチェックしてみましょう。素の状態で正常に動作するのなら連結したバイナリテーブルに問題があるので、正常なファイルを連結するよう新たにテーブルを構築し直してください。
第4章 バイナリシステム・仕様
DMシステム2で採用している連結フォーマットは「ヘッダ」「ディレクトリ」「実データ」の3部に分けられます。ヘッダには連結ファイルの総数、ディレクトリにはデータの内容や転送先などの重要な情報が格納されています。
1)ヘッダ (8 Bytes)
+0〜3 "DMBS" (認識用)
+4 連結ファイル数 (1〜64)
+5〜7 予約
2)ディレクトリ (8 bytes×連結ファイル数)
+0 識別コード (ID)
+1 機能依存フラグ
+2〜3 データの格納アドレス (ファイル先頭からのオフセット)
+4〜5 主にデータの展開先アドレス
+6〜7 主にファイルサイズ
3)識別コード (ID)
b7 b6 b5 b4 b3 b2 b1 b0
C S S S V n n n
~~ ~~~~~~~~ ~~~~~~~~~~~ bit3〜0 識別コード(0〜15)
| | 0 ベタRAMデータ (その他)
| | 1 BGMデータ (.MGS .BGM)
| | 2 SEデータ (.SE)
| | 3 マシン語 (.BIN .OBJ)
| | 4 パレットデータ (.PL? .BP?)
| | 5〜7 予約
| | 8 ベタVRAMデータ (.SC? .SR?)
| | 9 COPY形式CG (.GL? .PL?)
| | 10 PCMデータ (.PCM .PCP)
| | 11〜15 予約
| | ※b3はVRAMへ展開するフラグの意
| |
| +--------------- bit6〜4 スクリーンモード (5〜12:-5した値)
| VRAMのCGデータ(識別コード8,9)のみ有効
| sc4以下の場合は0(sc5)になる
| ※この情報は無くても可
|
+--------------------- bit7 非圧縮(0)/圧縮(1)の識別
元データがBPE圧縮されている場合は
DMシステム2側で展開作業を行う
4)機能依存フラグ
※1(BGM)
b7 b6 b5 b4 b3 b2 b1 b0
× × P O S L L L
~~ ~~ ~~ ~~~~~~~~ bit2〜0 ループ回数(0〜7)
| | |
| | +--------- bit3 SCCの使用フラグ (0:off 1:on)
| |
| +------------ bit4 OPLLの使用フラグ(0:off 1:on)
|
+--------------- bit5 PSGの使用フラグ (0:off 1:on)
※音源の使用フラグは無くても可
※8(ベタVRAM)
b7 b6 b5 b4 b3 b2 b1 b0
× × × × × × × V
~~ bit0 展開先アドレスの最上位ビット(bit16)
※9(COPY形式CG)
b7 b6 b5 b4 b3 b2 b1 b0
× × S S L L L L
~~~~~ ~~~~~~~~~~~ bit3〜0 ロジカルオペレーション
| (VDPコマンドと同様)
|
+-------------- bit5〜4 起点(0:左上 1:右上 2:左下 3:右下)
※10(PCM)
b7 b6 b5 b4 b3 b2 b1 b0
× × R R L L L L
~~~~~ ~~~~~~~~~~~ bit3〜0 ループ回数(0〜15)
|
+-------------- bit5〜4 サンプリングレート(0〜3)
(0:15.75KHz 1:7.875KHz 2:5.25KHz 3:3.937KHz)
Copyright (c) 1998 GIGAMIX, All rights reserved.