Kago

KAGO・UNKAGO ユーザーマニュアル

KAGOはアーカイブを作り、UNKAGOはアーカイブを一覧し、解凍します。どちらもMSX-DOS2(またはNextor)のもとで動き、ZIP、LZH(LHAとも呼ばれます)、PMAの3つの形式を扱います。このマニュアルでは、2つのツールができることをすべて説明します。インストールのしかたと簡単な紹介は、README.md(MSXではREADME.TXT)を見てください。

1. 使う前に

必要なもの。 MSX-DOS2またはNextorと、MSX-DOS2なら必ず備わっているメモリ・マッパーです。MSX-DOS1のもとでは、どちらのツールも「needs MSX-DOS2 or Nextor」と表示して終了します。

メモリ。 ツール自体は小さなプログラムですが、圧縮と解凍には作業用のメモリが必要です。このメモリはマッパーから、実行したときに空いている分だけ取ります。決まった量を前提にはしません。RAMディスクや常駐プログラムがあると、そのぶん少なくなります。それぞれのツールが必要とする量と、足りないときの動きは、2.6節と3.6節で説明します。

コマンドライン。 どちらのツールも、MSX-DOS2のプロンプトかバッチ・ファイルから実行します。

KAGO [switches] archive files...
UNKAGO [switches] archive [members...]
  • スイッチは/で始まる語で、大文字でも小文字でもかまいません。/Lと/lは同じです。スイッチはコマンドラインのどこに置いてもかまいません。
  • ツールが知らないスイッチがあると、何もする前に、MSX-DOS2自身のメッセージ*** Invalid optionを表示して終了します。
  • /?を付けるか、ツールの名前のあとに何も書かないと、使い方を表示します。/Vはバナー(名前、バージョン、著作権、Webアドレス)だけを表示します。
  • /Qがなければ、どちらのツールもまずバナーを表示し、空行に続けて本来の出力を表示します。/Q(quiet)を付けると、バナーと進み具合のパーセント表示を省きます。

形式と方式。

形式 拡張子 KAGOが書く方式 UNKAGOが読む方式
ZIP .ZIP deflate、無圧縮 deflate、無圧縮
LZH .LZH、.LHA -lh5-、-lh0-(無圧縮) -lh0-、-lh1-、-lh4-、-lh5-、-lh6-、-lh7-
PMA .PMA(自己解凍形式は.COM) -pm2-、-pm0-(無圧縮) -pm0-、-pm1-、-pm2-

LZHとLHAは同じ形式で、.LHAはAmigaで使われていた名前です。PMAはMSXのPMarcとPMARC2の形式で、PMEXTで解凍します。

2. KAGO:圧縮ツール

KAGO [switches] archive files...

KAGOはarchiveを作り、そのあとに書いたファイルとディレクトリを入れます。

スイッチ 働き
/A アーカイブに追加する。新しいファイルを入れ、同じパスのファイルは古いものと置き換える
/F:fmt 形式を指定する:/F:ZIP、/F:LZH、/F:PMA。指定しなければ、アーカイブの拡張子で決まる
/0 圧縮せずに格納する
/Y メモリが足りないとき、確認せずに進める
/Q 静かに:バナーも進み具合も表示しない
/V バナーだけを表示する
/? 使い方を表示する

2.1 形式

/F:ZIP、/F:LZH、/F:PMAを付けると、アーカイブの名前にかかわらず、その形式になります。/F:がなければ拡張子で決まります:.ZIP、.LZHまたは.LHA、.PMAです。どちらもないと、KAGOは形式の選び方を表示して終了します。

Which format? Name the archive .LZH, .LHA, .PMA or
.ZIP, or use /F:LZH, /F:PMA or /F:ZIP.

2.2 ファイルの指定

アーカイブ名のあとの語は、それぞれファイルかディレクトリです。MSX-DOS2と同じように*と?を使えます:*.*、GAME?.ROM、B:\DOCS\*.TXT。

  • 不可視ファイルとシステム・ファイルも、ほかのファイルと同じように見つけて追加します。
  • ディレクトリは丸ごと追加します。まずディレクトリ自体の項目、次にその中のすべてを、どの深さまでも追加します。PROJECTと書けばPROJECTのツリー全体が、*.*と書けばカレント・ディレクトリのファイルとサブディレクトリが、中身ごと入ります。
  • パスは入力したとおりに、ドライブを除いて記録します。 KAGO A.ZIP WORK\*.TXTはWORK\NOTES.TXTを記録し、B:\WORK\*.TXTでも同じです。ドライブと先頭の\は除くので、アーカイブはどこにでも解凍できます。名前はMSX-DOS2が保存しているとおり、大文字で記録します。
  • パスの中の**..は拒否します**(..\OTHER\*.*)。解凍したときに、解凍先のディレクトリの外にファイルができてしまうからです。親ディレクトリに移って、そこから指定してください。
  • ワイルドカードが一致しても、アーカイブ自身は追加しません。2回指定したファイルは1回だけ追加します(2回目は「added already」)。
  • 何にも一致しない語は報告し(「Skipping X: File not found」)、ほかのファイルはそのまま追加します。何も追加しなかったときは、アーカイブを残しません:「Nothing to add: X was not written.」

ファイルごとに1行を表示します。

Adding WORK\NOTES.TXT OK

画面では、それぞれのファイルをどこまで処理したかをパーセントで表示します。

2.3 圧縮

ファイルはそれぞれの形式の方式(deflate、-lh5-、-pm2-)で圧縮します。小さくならないファイル、たとえばすでに圧縮されているもの(アーカイブや圧縮された画像)は、無圧縮で格納します。ですから、どのファイルもヘッダーの分より大きくなることはありません。空のファイルは無圧縮で格納します。

/0を付けると、圧縮を試さずにすべてのファイルを格納します。ずっと速く、すでに圧縮されているファイルにはこれが適しています。

ファイルの日付と時刻、読み出し専用・不可視・システムの属性はアーカイブに記録され、UNKAGOが元に戻します。

現代のコンピューターのツールと比べた圧縮率は、-lh5-はlhaとの差が0.5%以内、deflateはzip -6より2%ほど大きくなります。-pm2-はたいていのファイルを-lh5-より少しよく圧縮しますが、繰り返しの多い大きなファイルではやや劣ります。PMAの形式では、4 KBごとに新しい符号表を始めるためです。

2.4 すでにあるアーカイブ

KAGOはアーカイブを上書きしません。アーカイブがすでにあれば、手を付けずに終了します。

GAMES.ZIP already exists.

新しく作るなら先に削除するか、/Aで追加してください。

2.5 アーカイブへの追加(/A)

/Aを付けると、指定したファイルを既存のアーカイブに追加します。3つの形式のどれでもかまいません。同じパスのファイルがすでにあれば、古いメンバーを置き換え(「Adding」ではなく「Replacing」と表示)、ほかのメンバーは1バイトも変えずに残します。アーカイブがなければ作ります。

KAGOは新しいアーカイブを、古いものの隣に、同じ名前で拡張子が.$$$の一時ファイルとして書きます。それから古いアーカイブを削除し、新しいものの名前を変えて置き換えます。ですから作業中は、ディスクに両方が入る空きが必要です。途中で何か問題が起きても、古いアーカイブはそのまま残ります。名前の変更に失敗したときは、新しいアーカイブがどこにあるかを表示します。

指定した形式として読めないアーカイブは拒否し、そのまま残します。

2.6 メモリ

最大の圧縮には、KAGOは次の量の空きマッパー・メモリを必要とします。

形式 最大の圧縮 小さな窓での圧縮
LZH、PMA 64 KB 48 KB
ZIP 80 KB 64 KB

最大の圧縮に足りなければ、そのことを表示し、何かを書く前に確認します。

Full packing needs 64 KB of mapper memory, but only 48 KB are free.
Pack with less? (Y/N)

少ないメモリでの圧縮では、8 KBではなく4 KBの窓を探します。アーカイブは少し大きくなりますが、正しいアーカイブであることに変わりはありません。それより少なければ、代わりに無圧縮で格納するかを尋ねます(「Store the files? (Y/N)」)。Nと答えると、何も書かずに終了します。

/Yを付けると、確認せずに「はい」と答えます。KAGOはメモリが許す限りよく圧縮するか、無圧縮で格納します。バッチ・ファイルではこれを使ってください。

2.7 PMAアーカイブ

PMAアーカイブはPMARC2と同じように書き、PMEXTで解凍できます。この形式には2つの制限があります。

  • ディレクトリは入りません。 ワイルドカードで見つかったディレクトリは、1行表示して飛ばします(「Skipping SUB: PMA archives have no directories.」)。コマンドラインで指定したディレクトリや、ディレクトリを含むパス(WORK\A.TXT)があると、KAGOは何かを書く前に終了します。あるディレクトリのファイルをPMAアーカイブにまとめるには、先にそのディレクトリに移ってください。
  • 空のファイルは入りません。 PMEXTは空のメンバーを解凍できないので、PMARC2と同じように、1行表示して飛ばします。

PMEXTは解凍したファイルを、CP/Mと同じように1Ahのバイトで128バイトの倍数まで埋めます。UNKAGOは正確なサイズで元に戻します。

2.8 LZHアーカイブの日付

LZHアーカイブは時刻をUTCで記録しますが、MSXは自分のタイムゾーンを知りません。そこでKAGOは、MSXの時刻をそのまま記録します。UNKAGOは同じ時刻で戻しますが、現代のコンピューターのlhaでは、タイムゾーンの分だけずれて表示されます。ZIPとPMAのアーカイブは現地時刻を記録するので、このずれはありません。

3. UNKAGO:解凍ツール

UNKAGO [switches] archive [members...]

UNKAGOはアーカイブのメンバーをカレント・ディレクトリに解凍するか、一覧します。形式は、アーカイブの名前にかかわらず自分で判別します。

スイッチ 働き
/L アーカイブを一覧する。解凍はしない
/D:path pathに解凍する。なければ作る
/O すでにあるファイルを上書きする
/Q 静かに:バナーも進み具合も表示しない
/V バナーだけを表示する
/? 使い方を表示する

3.1 一覧(/L)

A>UNKAGO /L PROJECT.LZH
    Packed   Original Method Date             Name
---------- ---------- ------ ---------------- ------------
         0          0 -lhd-  2026-10-07 10:00 PROJECT\
      4310      11873 -lh5-  2026-10-07 09:58 PROJECT\MAIN.AS
       212        388 -lh5-  2026-10-07 09:12 PROJECT\README.TXT
---------- ---------- ------                  ------------
      4522      12261        3 files

メンバーごとに1行で、圧縮後のサイズ、元のサイズ、方式、日付と時刻、パスを表示します。ディレクトリは\で終わります。最後の行は合計です。ZIPの方式はdeflatとstoredと表示します。

方式からは解凍に必要なメモリが(3.6節)、元のサイズの合計からは必要なディスクの空きがわかります。

3.2 解凍

/Lがなければ、すべてのメンバーを解凍し、それぞれ1行を表示します。

Extracting PROJECT\MAIN.AS OK
  • メンバーのパスにあるディレクトリは、必要になったときに作ります。ディレクトリのメンバーは、空でも作ります。
  • 日付、時刻、属性(読み出し専用・不可視・システム)を元に戻します。
  • ファイルごとにCRCを検査します。 CRCが一致しないファイルは削除し、その行はCRC errorで終わります。
  • /Oを付けない限り、すでにあるファイルは置き換えません。代わりに飛ばします(「Skipping X: it already exists」)。/Oを付けると上書きします。
  • UNKAGOが解凍できないメンバー(対応していない方式や、暗号化されたZIPのメンバー)は、1行表示して飛ばし、ほかのメンバーは解凍します。

3.3 一部のメンバーだけ

アーカイブ名のあとに書いた名前で、一覧や解凍するメンバーを選べます。名前はメンバーのパス全体と、大文字・小文字を区別せずに照合します。

  • *はドットや\も含めた任意の文字の並びに、?は任意の1文字に一致します。ですから*.TXTはどの深さの.TXTファイルにも一致し、*だけならすべてに、*.*はドットを含む名前だけに一致します。
  • ディレクトリの名前を書くと、その下のすべてが選ばれます。UNKAGO A.ZIP PROJECT\SRCは、ディレクトリPROJECT\SRCとその中身をすべて解凍します。
  • 何にも一致しない名前は報告します(「Not in the archive: X」)。
A>UNKAGO GAMES.LZH *.ROM README.TXT

3.5節の検査では、選んだメンバーだけを数えます。

3.4 別の解凍先(/D)

/D:pathを付けると、カレント・ディレクトリではなくpathに解凍します。

/D:B: ドライブB:のカレント・ディレクトリ
/D:B:\GAMES ドライブB:のディレクトリ\GAMES
/D:\TEMP カレント・ドライブの\TEMP
/D:TEMP\FILES カレント・ディレクトリの下のTEMP\FILES

解凍先がなければ、3.5節の検査に通ったあとで、上のディレクトリも含めて作ります。

3.5 ディスクの空き

UNKAGOは何かを書く前に、メンバーが使う領域を、新しいディレクトリも含めてクラスタ単位で合計し、解凍先のドライブの空きと比べます。収まらなければ、必要な量と空いている量を表示し、何も書きません。

Extracting this archive would take 412 KB on disk, but only 287 KB are free
on A:.

一部のメンバーだけを解凍するか(3.3節)、別のディスクに解凍してください(3.4節)。

それでもディスクがいっぱいになったとき(ファイルを上書きするときや、フロッピーのルート・ディレクトリの項目が尽きたとき)は、UNKAGOは書いていたファイルを削除して終了し、解凍しなかったメンバーを表示します。それまでに解凍したファイルは残ります。

3.6 メモリ

方式ごとに、解凍には次の量の空きマッパー・メモリが必要です。

方式 メモリ
無圧縮(-lh0-、-pm0-、ZIPのstored)、ディレクトリ 不要
-lh1-、-lh4-、-lh5-、-pm2- 32 KB
-lh6-、-pm1-、deflate 48 KB
-lh7- 80 KB

UNKAGOは選んだメンバーが必要とする最大の量を求め、それだけ空いていなければ、何かを書く前にそのことを表示します。

Extracting this archive needs 80 KB of mapper memory, but only 48 KB are
free.

メモリを空けるか(RAMディスクを小さくする、常駐プログラムを減らす)、必要なメモリが少ないメンバーを解凍してください。

3.7 長いファイル名

現代のコンピューターで作ったアーカイブには、MSX-DOSの8.3形式に収まらない名前がよくあります。UNKAGOはWindowsがMS-DOS向けに長い名前を短くするのと同じ方法で短くし、そのことを表示します。

Extracting longfilename.txt as LONGFI~1.TXT OK
Extracting my file.c as MYFILE~1.C OK
Extracting Long Directory Name\ as LONGDI~1\ OK

名前は6文字に切り詰めて~と番号を付け、拡張子は3文字に切り詰めます。空白と余分なドットは除き、MSX-DOSで使えない文字は_にします。番号は、アーカイブの同じディレクトリのほかの名前と重ならなくなるまで増やします。ですから同じアーカイブからは、いつも同じ名前ができます。すでに収まる名前は、大文字にしてそのまま使います。

Shift-JISの日本語の名前は、収まればそのまま使います。

3.8 UNKAGOが読むもの

  • レベル0、1、2のヘッダーのLZHアーカイブ。LHarc、LHA、現代のコンピューターのlha、KAGOで作ったもの。レベル3のヘッダーは拒否します。
  • PMarc(-pm1-)とPMARC2(-pm2-)で作ったPMAアーカイブと、自己解凍形式のPMAファイル(.COM)。UNKAGOは自己解凍形式のファイルを実行せずに一覧・解凍し、付いている解凍プログラムは除きます。
  • 無圧縮とdeflateのメンバーのZIPアーカイブ。サイズがデータのあとに記録されたものも読みます。読まないもの:ZIP64(4 GBを超えるもの)、分割アーカイブ、暗号化されたメンバー。

どれでもないファイルは拒否します:「Not an LZH or ZIP archive.」

4. メッセージ

不足を知らせるメッセージは、いつも必要な量と使える量を示します。量はKBで、1024 KBからはMBで表示します。

メッセージ 意味
X already exists. KAGO:アーカイブがすでにある。削除するか/Aを使う
Nothing to add: X was not written. KAGO:ファイルが1つも見つからなかった
Skipping X: File not found KAGO:語が何にも一致しなかった
X: a path with .. cannot be stored KAGO:2.2節を参照
X: PMA archives have no directories. KAGO:2.7節を参照
Full packing needs ... KAGO:2.6節を参照
Skipping X: it already exists UNKAGO:上書きするには/Oを使う
Extracting X CRC error UNKAGO:メンバーが壊れている。ファイルは削除した
Not in the archive: X UNKAGO:名前がどのメンバーにも一致しなかった
Extracting this archive would take ... UNKAGO:3.5節を参照
Extracting this archive needs ... UNKAGO:3.6節を参照
*** Invalid option ツールが受け付けないスイッチ
*** Missing parameter アーカイブだけでファイルのないKAGO、アーカイブのないUNKAGO /L、パスのない/D

ディスクのそのほかのエラー(Disk full、Write protected diskなど)は、MSX-DOS2自身のいつものメッセージです。

5. 使用例

KAGO GAMES.ZIP *.*                  ここにあるすべてをZIPアーカイブに
KAGO DOCS.LZH *.TXT                 テキスト・ファイルをLZHアーカイブに
KAGO TOOLS.PMA EDIT.COM EDIT.DOC    2つのファイルをPMAアーカイブに
KAGO PROJECT.ZIP PROJECT            ディレクトリのツリー全体を
KAGO WORK.LZH B:\WORK\*.*           別のドライブのツリーを
KAGO /A GAMES.ZIP README.TXT        ファイルを1つ追加または置き換え
KAGO /F:LZH BACKUP.DAT *.*          名前にかかわらずLZHで
KAGO /0 PICS.ZIP *.SC8              圧縮せずに格納
KAGO /Y /Q BACKUP.LZH A:\WORK       バッチ・ファイル用

UNKAGO /L GAMES.ZIP                 一覧
UNKAGO GAMES.ZIP                    ここに解凍
UNKAGO /D:B:\GAMES GAMES.ZIP        B:\GAMESに解凍
UNKAGO /O GAMES.ZIP                 解凍し、すでにあるファイルは置き換え
UNKAGO DOCS.LZH *.DOC               .DOCファイルだけ
UNKAGO PROJECT.ZIP PROJECT\SRC      ツリーのディレクトリを1つだけ
UNKAGO TOOLS.COM                    自己解凍形式のPMAファイル

6. このソフトウェアについて

KAGO・UNKAGO 1.0.1。Copyright 2026 Javier Lavandeira。Apache License, Version 2.0のもとで公開しています。https://kago.tools