Gigamix Online

懐かしの8bitおもちゃPC「MSX」を骨までしゃぶり尽くそう。MSXの最新ニュース、ブログ、自作ソフトの配布など。

MSXでもZIPアーカイブを解凍したい!ネットで見つけたMSXで使えるUNZIPアプリまとめ

https://p.gigamix.jp/devmsx/cg/msx-unzip_title.jpg

 1990年代・パソコン通信全盛の時代、多くのユーザーはアプリケーションやフリーソフトウェアといった「デジタルコンテンツ」を複数のファイルをデータ圧縮して1ファイルに梱包した形(通称:アーカイブで流通させていました。日本国内のMSXシーンでは主に「PMArc(拡張子 .PMA)」と「LHA(拡張子 .LZH)」の2種類のデータ圧縮形式が使われていました。

 2023年現在、データ圧縮形式は国際的に「ZIP」が広く用いられています。MSXシーンにおいては実機用のZIP解凍アプリ(UNZIP)が長らく存在しませんでしたが、最近はようやくZIPアーカイブが利用できるようになってきました。

UNZIP(解凍)アプリ

 ここで挙げるアプリはどれもファイルの解凍は可能ですが、利用可能なOSと機能に違いがあります。表中の◯は対応、✕は非対応、△は一部対応の機能です。

アプリ名 OS ファイルサイズ タイムスタンプ サブディレクト ファイル属性
UNZIP-CPM-Z80 CP/M
TuNzIp DOS2
SofaUnZip DOS2

CP/M用:UNZIP-CPM-Z80

 CP/M用のUNZIPアプリです。CP/M用の外部コマンドは基本的にMSX-DOS(1)でも利用可能です。2023年現在も開発が進行中で、今後の機能アップやバグ修正にも期待が持てます。

↓ Webサイトはこちら ↓ github.com

 CP/M UNZIPの注意点は…

  • このアプリはMSX-DOS1でも動作しますが、解凍したファイルのタイムスタンプが反映されません(展開日時になってしまう)。
  • このアプリはMSX-DOS1でも動作しますが、解凍したファイルのサイズが増える可能性があります(128バイト単位になってしまう)。
  • ZIPアーカイブ内に含まれるサブディレクトリは無視されます。必ずカレントディレクトリに解凍されます。
  • ZIPアーカイブ内に含まれるファイルの属性は無視されますWindows等のPCではReadOnly等の属性が付いたファイルはそのまま解凍されるのですが、このアプリでは属性が反映されません。

その①UNZIP-CPM-Z80。ZIP解凍したファイルのタイムスタンプ反映されず、サブディレクトリ作成ならず、ファイル属性反映されず。とりあえず解凍はできるけど…まぁ仕方ないです。元々CP/M用だから… pic.twitter.com/nwMxSNIT3m — Takashi Kobayashi (@nf_ban) 2023年9月3日

CP/M用アプリはタイムスタンプとファイルサイズが可変してしまう!

 CP/M UNZIPの最大の注意点は、CP/M用であるが故の不具合が生じることです。その大きな不具合を2つ挙げます。

MSXでunzipが展開できるようになった。が…タイムスタンプが(以下略)。CP/M用のアプリだから仕方がない。Windowsで展開すればタイムスタンプは反映されるが展開後のファイル順序が自動ソートされてしまう、実機で展開すれば自動ソートされないがタイムスタンプが狂う。LZHで配れば両立できる。んー pic.twitter.com/zeHVnsPX9N — Takashi Kobayashi (@nf_ban) 2023年8月30日

 1つ目は、解凍したファイルのタイムスタンプが反映されませんMSX-DOSに慣れているとにわかに信じがたいのですが、かつて国際的に普及したCP/Mにはタイムスタンプの概念がありません(厳密に言うとCP/M ver.3ではタイムスタンプが実装されたそうですが普及しなかったそうです)。

 UNZIPに限らず、MSX-DOS上でCP/M用のアプリを起動して何らかのファイルを生成すると、タイムスタンプは「作成した日時」や「1980/01/01 00:00:00(FATファイルシステムの最古日時)」等になってしまいます。ZIPアーカイブには圧縮したファイルのタイムスタンプも情報として保存されているのですが…タイムスタンプの情報がフロッピーディスクへ記録されることはありません。

UNZIP-CPM-Z80。よく見ると、解凍したファイルのサイズが128バイトに増えている。元々CP/M用だから128バイト単位になってしまう。バイナリエディタで確認するとテキストの終了が1Ah(EOF)で埋まってる。テキストファイルの終端に1Ahを付けた理由はまさに昔この仕様があったからなんだろうけど今は困る! pic.twitter.com/ip58NnlTT5 — Takashi Kobayashi (@nf_ban) 2023年9月3日

 2つ目は、解凍したファイルは本来のデータ量を超えたファイルサイズで解凍される可能性がありますMSX-DOSに慣れているとにわかに信じがたいのですが、CP/Mはファイルサイズを128バイト単位でしか管理しないため、1バイトのファイルですら128バイトに増えた状態で解凍されてしまいます。

 UNZIPに限らず、MSX-DOS上でCP/M用のアプリを起動して何らかのファイルを生成すると128バイト単位で生成されます。ZIPアーカイブには圧縮したファイルのサイズも情報として保存されているのですが…。

CP/Mはセクタが128バイト固定だったらしくてファイルの入出力も128バイト単位で、MSX-DOSでCP/Mファンクションを使うと128バイトの余りに無意味なデータが詰められるという仕様がありました。BASICでそのファイルを読むと誤動作したりした。 — MSX研究所長 (@yoshimatsuTUQ) 2023年9月1日
128バイト/セクタだったのは、CP/Mの8インチ1Sのフォーマットがそうだったためです。ファイルシステムはセクタ数のみ把握し、バイト数は保持していません。テキストファイルの末尾にCtrl-Zを入れていたのはこのためです。 — Ohta Pro. (@ohta8801) 2023年9月1日

MSX-DOS2用:TuNzIp

 展開速度が速い、MSX-DOS2(Nextor)用のUNZIPアプリ。作者は、MSX-DOS2後継OS「Nextor」の開発にも携わるTNI(The New Image)。

タイムスタンプとサブディレクトリのサポートは計画中の機能です。人々が私のTuNzIpを使っているとは知らなかったです。 — spacemoai (@spacemoai) 2023年8月30日

↓ ダウンロードはこちら ↓ www.tni.nl

TNIのTuNzIpというunzipアプリ http://www.tni.nl/products/tunzip.html は展開スピードが速くて嬉しいのだがタイムスタンプは反映されず(実行日時になる)。惜しいなぁ。 pic.twitter.com/YdUPhEFiX3 — Takashi Kobayashi (@nf_ban) 2023年8月30日

 TuNzIpの注意点は…

  • MSX-DOS2専用アプリなのでMSX-DOS1は非対応です。
  • このアプリはMSX-DOS2専用ではありますが、UNZIP同様に 解凍したファイルのタイムスタンプが反映されません(展開日時になってしまう)。
  • ファイルサイズは適切に解凍されますが、一部のファイルが0バイトで解凍される可能性があります(原因調査中)。
  • ZIPアーカイブ内に含まれるサブディレクトリは無視されます。必ずカレントディレクトリに解凍されます。
  • ZIPアーカイブ内に含まれるファイルの属性は無視されますWindows等のPCではReadOnly等の属性が付いたファイルはそのまま解凍されるのですが、このアプリでは属性が反映されません。

その②TuNzIp。サブディレクトリが存在すると解凍処理が中断される。アーカイブの先頭がそれだと何もできない。ルートディレクトリだけにしたら0バイトで終了する謎現象。System属性が先頭だったからなのか、サイズが小さいから(非圧縮モード)なのか…。タイムスタンプと属性は無視される。 pic.twitter.com/zcrljapKYC — Takashi Kobayashi (@nf_ban) 2023年9月3日
TuNzIpでもZIPアーカイブによっては正常に解凍できる(ログでOkが出てる。テスト用では出ない)ので、テスト用ZIPアーカイブの内容に不具合のヒントがありそうだ。ノーマル属性のファイルがアーカイブの先頭だったならそれだけは正常解凍できたんじゃないかとか、ファイルサイズ◯◯バイト以上とか… pic.twitter.com/6NeqKRuBgr — Takashi Kobayashi (@nf_ban) 2023年9月3日

 一部のファイルの解凍が0バイトになる現象が見つかっています。

MSX-DOS2用:SofaUnZip(SUZ)

What about SofaUnzip? If there are issues with the time stamp, you can report here:https://www.msx.org/forum/msx-talk/software/sofaunzip-bug-report-thread — SD-Snatcher (@SnatcherAlpha) 2023年8月30日

 他のUNZIPアプリでは欠けていた、解凍したファイルのタイムスタンプが反映される、そしてファイルサイズが適切に保存される、今のところ唯一のUNZIPアプリ。作者は、仮想ROM・FDアプリ「SofaRun」でおなじみのLouthraxさん。

↓ ダウンロードはこちら ↓ https://louthrax.net/mgr/sofaunzip.htmllouthrax.net

 SofaUnZipの注意点は…

  • MSX-DOS2専用アプリなのでMSX-DOS1は非対応です。
  • ZIPアーカイブ内に含まれるサブディレクトリは無視されます。必ずカレントディレクトリに展開されます。
  • ZIPアーカイブ内に含まれるファイルの属性は無視されますWindows等のPCではReadOnly等の属性が付いたファイルはそのまま解凍されるのですが、このアプリでは属性が反映されません。

その③SofaUnZip(SUZ)。ZIP解凍したファイルのサイズOK、タイムスタンプ反映OK、サブディレクトリ作成ならず、ファイル属性反映されず。特にエラーも不具合も発生せず最低限の解凍処理が実現されていて、今までの中で一番出来がよい結果。これは普段遣いできそうですよ!👍 pic.twitter.com/kalZ5CzI5p — Takashi Kobayashi (@nf_ban) 2023年9月3日

UNZIPFIX(タイムスタンプ修正ツール)

 ZIPで解凍するとタイムスタンプが変わってしまう…安心してください。上記アプリで解凍したファイルのタイムスタンプを修正(復活)できる、痒いところに手が届くDOSアプリが登場です。

UNZIPで展開されたファイルのファイルサイズとタイムスタンプを補正するLSX-Dodgers/MSX-DOS/MSX-DOS2で動作するソフト作ってみました。unzipfix ZIPのファイル名 展開されたファイルのドライブ名: ダウンロードはこちらのunzipfix_100.zipから → https://github.com/tablacus/dosformsx/releases/tag/0.16 pic.twitter.com/L6RzRC1cTl — Gaku (@tablacus) 2023年9月1日

 作者は、国産8bitレトロPC向けCP/MMSX-DOS互換OS「LSX-Dodgers」やMSXのコンテンツをROM化する「Tablacus DISK ROM」シリーズでお馴染みのGakuさん。元々はLSX-Dodgers向けのアプリのようですがMSX-DOS1・DOS2(Nextor)にも対応しているので、MSXユーザーの皆様も安心してUNZIPが使えます!

個人的要望 ・DOSのアプリを名乗るならファイルサイズとタイムスタンプは正しく出力して欲しい ・DOS2ならできればサブディレクトリも作成して欲しい ・ファイル属性の反映はHiddenとSystemには不要(+セキュリティ的にあえて反映しないほうが良いのかもしれない)だけどReadOnlyは反映して欲しい — Takashi Kobayashi (@nf_ban) 2023年9月3日

UNZIP解凍テスト用ディスクイメージ

 ダウンロードはこちら ☞ https://p.gigamix.jp/devmsx/cg/20230904_unzip_test.dsk

ZIP(圧縮)アプリは、存在しない

 今のところ、MSXの実機でZIPアーカイブを作成できる環境は存在しないようです。WindowsなどPCを用いて作成したほうが速いかもしれません。

こぼれ話

過去に存在した、もう一つのZIPアーカイブ「ARJ形式」

MSXでZip解凍の話題があったけど、確かZipってすごい昔の規格ではCPU別に圧縮仕様が違うとかで(うろ覚えだけど)、機種をまたいで受け渡すのに向いてなかったような…。海外MSX界隈ではARJがよく使われてました。ほとんど記憶にないけど。 - MSX研究所長 (@yoshimatsuTUQ) 2023年9月5日
要するに、MSX用のunzipだとPC系で作られたアーカイブは解凍できないことがよくあったのです。 - MSX研究所長 (@yoshimatsuTUQ) 2023年9月5日

 今でも海外のWebサイトで拡張子 .ARJのZIPアーカイブが公開されていることがあります。これらはここで採り上げたUNZIPアプリでは解凍できませんのでご注意ください。

UNZIPFIX タイムスタンプこぼれ話

LSX-Dodgersでファイルのタイムスタンプを補正する場合は、ファイルのオープン(_FOPEN/$0F)→サイズ0でランダムブロック書き込み(_WRBLK/$26)→FCBにタイムスタンプをセット→ファイルのクローズ(_FCLOSE/$10) — Gaku (@tablacus) 2023年9月1日
MSX-DOS1でファイルのタイムスタンプを補正する場合は、ファイルのオープン(_FOPEN/$0F)→サイズ1でランダムブロック読み出し(_RDBLK/$26)しそれをランダムブロック書き込み(_WRBLK/$26)→FCBにタイムスタンプをセット→ファイルのクローズ(_FCLOSE/$10) — Gaku (@tablacus) 2023年9月1日
MSX-DOS2でファイルのタイムスタンプを補正する場合は、ファイルの日付および時刻の獲得・セット(_FTIME/$51)。タイムスタンプ辺りのFCBの仕様がMSX-DOS1とは異なっている。— Gaku (@tablacus) 2023年9月1日

 タイムスタンプを変更する処理が、OSごと3つに別れているのですね…手間かかってますね…

8bit OSにおけるCP/Mの普及度はどのくらいだったのか(感覚的に)

 CP/M用アプリを調査する際に偶然見つけたアンケート。

「CP/Mは8bit(i8080/Z80)のデファクトスタンダードなOS」ってのは分かるけど、当時「Z80等でFDD搭載されてた機種」を使ってた皆さんは、CP/Mって当時使ってましたか? — Ohta Pro. (@ohta8801) 2023年8月31日
結果出ました。ざっくり日常使いが1割、たまに使うが2割、使わないが4割、互換を使ってたが3割といった分布で。https://twitter.com/ohta8801/status/1697254325490426285 — Ohta Pro. (@ohta8801) 2023年9月1日

 MSXを使っているならCP/Mの存在は無視できない…MSXで育った人間だと「互換OSを使用」を選ばざるを得ない。

付録ディスク時代のMSXFAN読者だと必然的にMSXDOSユーザーになりますね https://t.co/HYSXRirg8x — Root (@rsd_rot) 2023年9月1日

 MSX-DOSのシステムファイル(MSXDOS.SYS および COMMAND.COM)はFDDの実物に対してバンドルされていて、DOS単体のパッケージ販売がありませんでした(MSX-DOS TOOLSは除く)が、MSX・FANの付録ディスクを介して配られているという事実も大きいかもしれず。

8bit OSにおけるMSX-DOSの普及度はどのくらいだったのか

MSX-DOSは、MSXホームパソコン以外に、パチンコ台の隠しOSとして大きな市場を獲得し、MSXの累計出荷台数500万台+パチンコ台の年間420万台の市場は、当時のパソコン用MS-DOSやTRONよりも大きな、日本におけるOSシェアの一番が実はMSX-DOSだった。1982年頃 — 古川 享 (@SamFURUKAWA) 2009年9月21日
MSX-DOSは、その後パチンコ台の標準OSとして広く採用(Z80互換CPUに外部アクセスが出来ないROMに焼き付け、MSX互換のCRTコントローラ)され、年間400万台以上の出荷を達成。当時提供の始まったMS-DOS1.25版の出荷数量を凌駕する市場を形成。 - 古川 享 (@SamFURUKAWA) 2013年11月25日
もしかして、組み込みMSXが存在した? #MSX30th QT @SamFURUKAWA: MSX-DOSは、その後パチンコ台の標準OSとして広く採用(Z80互換CPUに外部アクセスが出来ないROMに焼き付け、MSX互換のCRTコントローラ)され、年間400万台以上の出荷を達成。 - SASANO Takayoshi (@uaa) 2014年4月9日

 パチンコの遊技機で採用されているから普及度は地味に大きい。