GIGAMIX DM-SYSTEM2
DMシステム2のバイナリシステム
updated: Sep 28, 2000

  1. 概要
    1. バイナリシステムとは
    2. 連結するメリット

  2. DMシステム2からの利用方法
    1. ファイルを分類する
    2. ファイルを連結する
    3. フラグの設定
    4. バイナリシステムの宣言
    5. 連結したデータを復元する
    6. 写しモード
    7. 一気モード
    8. 自由に分離する

    9. まとめ

    10. バイナリシステム・仕様
      1. ヘッダ
      2. ディレクトリ
      3. 識別コード (ID)
      4. 機能依存フラグ

    第1章 概要

    1.1 バイナリシステムとは

     ディスク上に配置されているファイルを連結し、その連結したデータを加工無しに復元・利用する機構です。

     例えばLZH形式で圧縮されたアーカイブで、その中に格納されたファイルを展開作業なし(ファイルをディスク上に生成しない)にそのまま利用するようなものです。


    1.2 連結するメリット

     ファイルを連結することによって、ユーザーが恩恵を受けられるメリットは2点あります。

    1.転送(ロード)時間の短縮

     プログラムで使用する各種ファイルのサイズが数百バイト程度といった小さなものの場合、これらを普通に1つ1つディスクから読みだす(ロードする)と、1ファイル読むごとに移動するFDDのヘッダのおかげで大量の時間を消費してしまい、結果、ロードの待ち時間が長くなってしまいます。

     そこで、処理の区切り(場面)ごとに細かなファイルを連結して1ファイルに凝縮させ、VRAMに一括ロードしておきます。データを使う際には凝縮させたデータをRAMへ転送させたり、その場で利用・加工すれば、ディスクからのロード時間が省けてレスポンスが良くなるはずです。ファイルが沢山あるよりも1つのファイルを一気にロードしたほうがロード時間が短くなるからです。


    2.ディスク容量の最適化

     MSXのフロッピーディスクは128バイトで1クラスタを構成します。例え1バイトのファイルでも、32バイトでも、もちろん128バイトでも、ディスク上では1クラスタを利用します。よって、仮に1バイトのファイルを作成すると、余りの127バイトは空き領域になってしまいます。この領域はファイルを削除しない限り、絶対に活用することはできません。

     1バイトのファイルというのは確かに極論ですが、こういったクラスタ単位の無駄な領域は、128バイト単位で全てのファイルを構成しない限り、必ず存在します。ディスクの空き容量が全てのファイルサイズから計算しても、計算が合わないのはこのためです。

     いくつかのファイルを連結して1ファイルにすると、ファイルのクラスタ単位の余りがデータの連結により極力省け、結果的にディスクの占有量が減ることがあります。これは713KB、112ファイルしか保存できないMSXの2DDフロッピーディスクには大いに有効です。細かいファイルが多ければ多いほどこの効果が大きく、連結したほうが「得」と言えます。

     しかし連結することによるデメリットも確かに存在します。バランスの良い使い方を目指してください。


    第2章 DMシステム2からの使用方法

    2.1 ファイルを分類する

     ファイルをソフトの場面・目的別(その場面に必要な最低限のファイル群)に分類します。すべてのファイルを一度にメモリへ通さなければならない場合ならともかく、ほとんどの場合はファイルのロードに「区切り」が付けられるはずです。
      ex.) ゲームの場合→「オープニング」「タイトル」「キャラ選択」…

    2.2 ファイルを連結する

     分類したファイルを連結して1ファイルにまとめます。連結作業には、専用の連結エディタで連結します。

     連結するファイルにはDMシステム2のBPE圧縮ファイルも利用できます。BPE圧縮したファイルも普通のファイルと同様に連結でき、復元時にはDMシステム2が自動的に展開作業を行います。これにより連結するファイルのサイズをさらに縮めることができます。

      ※ BPE圧縮の方法はBPE圧縮ツールの説明書をご覧ください。

    連結エディタ (updated: Apr 3, 1998)
    LINK.LZH (15KB)

     バイナリシステム(連結エディタ)で対応するデータ形式は以下の通りです。

      No. データ形式の内容拡張子(デフォルト)

      0その他(RAMへ転送するベタデータ)下記以外の拡張子
      1BGMデータ.MGS .BGM
      2SEDRVに対応したSEテーブル.SE
      3RAMへ転送するバイナリーデータ.OBJ .BIN
      4DM-PALETに対応したパレットテーブル .PLn .BPn
      8VRAMへ転送するベタデータ.SCn .SRn
      9COPY形式のCGデータ.PIn .GLn
      10 PCMデータ.PCM .PCP

      ※ 64KBを越える連結はできませんので、容量オーバーの場合はさらに場面を分割する等の工夫が必要です。


    2.3 フラグの設定

     連結作業の際、各連結データにフラグを設定します。連結したそのデータはどのような種類で、DMシステム2ではどのように使われるべきなのかを情報として残すわけです。

     フラグは各種データの用途に合わせ、拡張命令(CALL BINLOAD)一つで自動的にそのデータを利用できるようにする為のものです。BGMなら演奏、PCMなら再生、マシン語ファイルなら実行…等々の処理に必要な情報をフラグとして連結エディタで設定します。

      ※ この情報を「機能依存フラグ」と呼ぶことにします。
     しかし、フラグは特に設定しなくても、後述のパラメータ指定で補完できます。

    2.4 バイナリシステムの宣言

     連結したファイル(バイナリテーブル)をVRAM上の自由な位置へ配置し、システムへ宣言します。
      CALL SETBIN (連結データの先頭アドレス)
     事前にバイナリテーブルを所定のアドレスへ配置しておく必要があります。配置されていない場合はエラーになります。
      ex.) _setbin (@&H8000) ← 8000h(screen 5でのページ1)へ配置
      _setbin (@98304!) ← 18000h (screen 5でのページ3)へ配置
      ※ RAMには配置できません。

      ※ アドレス指定は10進数でも16進数でも構いませんが、64KB以降のVRAM(screen 5/6でのページ2/3、screen 7以降のページ1)を宣言する場合は10進数で宣言してください(16進数ではOverflowエラーになります)。

      ※screen 4以下のスクリーンモードでは正常に動作しません。


    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は無し)。通常は格納番号と同時に各種モード(後述説明)を設定して、この命令を利用します。

     ちなみに特にモードを指定しない場合は、目的のデータのディレクトリ情報(8バイト)の獲得だけで処理を終了します。データ自体の転送はしないので、各種モードを指定しないとあまり意味がありません。その際のディレクトリ情報はDMシステム2のインフォメーションエリア (BINDIR:4300h+30)に格納されます。

      4300h +30ID
      +31機能依存フラグ
      +32〜3 データの格納アドレス (先頭からのオフセット)
      +34〜5 主にデータの展開先アドレス
      +36〜7 主にファイルサイズ

      ex.) _binload (3) ← 3番目の連結データの情報を得る

     ちなみに格納番号に0を指定すると、バイナリテーブルのヘッダの情報(8バイト)の転送だけで処理を終了します。

      ex.) _binload (0) ← バイナリテーブルのヘッダ情報を得る

    2.6 写しモード

     連結したデータを復元し、目的のアドレスへ転送します。
      CALL BINLOAD (64+格納番号)
     目的のアドレスへデータを写す意味から、これを「写しモード」と呼ぶことにします(こじつけ)。

     この命令でVRAMに配置した連結データをRAMやVRAM等、指定したアドレスへ転送(復元)します。特別なことでもない限り普通はデータの転送だけ行えれば問題ないので、写しモードを「基本」と覚えておきましょう。

     BPE圧縮された連結データは、自動的に展開します。

      ex.) _binload (64+3) ← 3番目の連結データを転送する

    2.7 一気モード

     連結したデータを復元し、即利用します。
      CALL BINLOAD (128+格納番号)
     データをいきなり利用することから、「一気モード」と呼ぶことにします。

     一気モードはデータを指定のアドレスへ転送した後、そのデータを自動的に活用します。BGMデータなら転送後いきなり演奏、マシン語ファイルなら転送後いきなり実行…。即利用の効果はデータ形式によって変わります。即利用に必要なパラメータは連結エディタで設定した機能依存フラグが利用されます。

     即利用の効果が無いデータ形式も存在します。そのようなデータを一気モードで即利用すると、写しモードと同様、データの転送のみとなります。

    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 (64+格納番号,機能依存,x座標,y座標) ※COPY形式
      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もメモリの一部ですからデータ転送は瞬時に終わりますし、連結することによりディスクの空き容量の節約にも繋がります。使いこなすにはちょっとパワーが必要になりますが、やっただけの見返りは十分に得られるものと確信しています。

     特に一気モードはDMシステム2の神髄とも言うべき便利な機能で、DMシステム2をよりダイナミックに活用できる役割を担っています。これを覚えてしまえばソフトに対するDMシステム2の効果は絶大なものとなるでしょう。DMシステム2を利用したプログラムの際にはぜひ「バイナリシステム」に挑戦してみてください。


    3.2 連結するデメリット

     バイナリシステムにはメリットもありますが、デメリットも生じます。利用目的を考慮して、ぜひ活用してください。

    1.VRAMが足りなくなる

     VRAMをデータタンクとする為、特にSCREEN 7以降のスクリーンモードではVRAMのやりくりに困るかもしれません。

     ビジュアルページにバイナリテーブルを配置するわけには行かない(=カッコ悪い)ですから、通常、バイナリテーブルは「裏画面」と呼ばれるVRAMの他のページに配置することになるのですが、SCREEN 7以降のような2画面しか持てないスクリーンモードでは、バイナリテーブルを裏画面に配置するだけで既にVRAMの空き容量を大幅に減らしているかもしれません。

     これにより、CG加工用のバッファが用意できなかったり、各種CGパーツが配置できなくなることがあります。

     対処方法としては、このようなアイデアが挙げられます。

    1. 連結するファイルを減らす (これが確実)
    2. VRAMへ転送するCGデータは連結しない
    3. 各種CGパーツもCOPY形式で連結してしまう
    4. SCREEN 5等、他のスクリーンモードを利用する

    2.デバッグが難しくなる

     もしバイナリテーブルを利用したプログラムにどこかバグが潜んでいたりすると、そのバグの特定が難しくなってしまいます。

     考えられるバグの出所はこんな感じです。

    1. 連結したファイルのデータにバグが残っていた
    2. BASICプログラムで、CALL BINLOADのパラメータ指定が間違っていた
    3. バイナリテーブルのディレクトリ領域の記述が間違っていた
     1のケースは、連結する前にそのデータを普通にロードして、正常動作するかをチェックしてみましょう。素の状態で正常に動作するのなら連結したバイナリテーブルに問題があるので、正常なファイルを連結するよう新たにテーブルを構築し直してください。

     2のケースは、プログラマの意図したアドレスにデータが転送されていなかったり、データ形式が違っているなど、プログラムの記述に問題があります。そこをチェックしてみてください。最悪の場合、DMシステム2の常駐領域にデータを間違えて転送してしまったおかげで、DMシステム2の動作が不安定になっていた、なんてこともあります。


    第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)
    
    [Back]
    Copyright (c) 1998 GIGAMIX, All rights reserved.