2019/05/07(火) [n年前の日記]
#1 [pc] MZTファイルのヘッダ情報を確認するツールを書いてみたり
MZ-80K/700等のエミュレータでは、カセットテープに入ったプログラムのイメージを模した、MZTファイルという形式が使われるのだけど。その MZTファイルのヘッダ情報を確認するツールを Python を使って書いてみたり。
_mieki256/pymztinfo
動作確認環境は、Windows10 1809 x64 + Python 2.7.16。
Pythonスクリプトだけではなく、py2exe で exe化したファイルも一応置いておいた。
使い方は以下。
以下のような出力になる。
_mieki256/pymztinfo
動作確認環境は、Windows10 1809 x64 + Python 2.7.16。
Pythonスクリプトだけではなく、py2exe で exe化したファイルも一応置いておいた。
使い方は以下。
python pymztinfo.py MZT_FILE or pymztinfo.exe MZT_FILE
以下のような出力になる。
> pymztinfo.exe S-BASIC_1Z007B.MZT
Input file : S-BASIC_1Z007B.MZT
0x00 : File mode = 0x01 (Binary)
0x01-0x11: Filename = S-BASIC
0x12-0x13: File size = 0x6C80 (27776)
0x14-0x15: Load Address = 0x1200
0x16-0x17: Exec Address = 0x7E0F
0x18-0x3F: 11 30 11 CD 09 00 CD 15
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
0x40-0x43: Patch Enable
Adrs=0x1221 , Size=0x0C (12) , Data (Hex)=ED F4 03 ED F4 04 ED F4 01 ED F4 02
body length: 0x6C80 (27776)
◎ MZTファイルのフォーマット仕様をメモ。 :
あちこちのページを眺めて把握した範囲で、一応、MZTファイルのフォーマット仕様をメモ。
ヘッダ部分の内容は以下。
ファイルの種類については、どうやら以下が決まってるように見えた。
パッチデータ1つ分のフォーマットは以下。
パッチの個数分、このデータ列が並ぶ。アドレス値に 0xFFFF が入っていたら、そこでパッチは終了。
- 0x00 - 0x7F : ヘッダ部分。
- 0x80 - : 実データ
ヘッダ部分の内容は以下。
| 0x00 | ファイルの種類。アトリビュート。 |
| 0x01 - 0x11 | ファイル名。0x0Dが終端文字。残りは0x20 でパディングされる。 |
| 0x12 - 0x13 | 実データのサイズ |
| 0x14 - 0x15 | ロード・格納アドレス |
| 0x16 - 0x17 | 実行開始アドレス |
| 0x18 - 0x3F | 謎データ。FD使用時に絡んだデータが入ってるらしい? |
| 0x40 - 0x43 | ファイルにパッチを当てる場合、'PAT:' が入ってる。 |
| 0x44 - 0x7F | パッチデータ |
| 0x80 - | 実データ |
ファイルの種類については、どうやら以下が決まってるように見えた。
| 0x01 | バイナリ |
| 0x02 | BASICのプログラム。SP-5030 / Hu-BASIC等 |
| 0x05 | BASICのプログラム。MZ-700 S-BASIC |
| 0xC8 | CMU-800用のデータ |
パッチデータ1つ分のフォーマットは以下。
| 2 byte | パッチを当てるアドレス値。0xFFFFが入ってたらパッチデータは終了。 |
| 1 byet | パッチのサイズ |
| N byte | サイズ分、パッチデータが並ぶ。 |
◎ 参考ページ。 :
_MZ のテープを活用しよう - アルゴの記憶 (Internet Archive)
_MZ700WIN FAQ (Internet Archive)
_ReadMe.TXT - MZF-Studio
_MZ700WIN FAQ (Internet Archive)
_ReadMe.TXT - MZF-Studio
◎ 不明点。 :
0x18 - 0x3F に入ってるデータの意味が分からない。.mztファイルを作成するツールに、各BASIC用のヘッダファイルが同梱されていたりするのだけれど、中を覗くと、該当部分には、たしかに何かが入ってる。しかし、どういう意味のデータが入っているのか、記述したページが見つからず。
ファイルの種類(アトリビュート)に入ってる、0x02 と 0x05 の使い分けが、ちょっと自信がない。手元の .mzt をいくつか確認した感じでは、SP-5030 / Hu-BASIC用のプログラムには 0x02 が、MZ-700用S-BASIC用のプログラムには 0x05 が入っていたけれど、本当にその分類でいいのだろうか…?
テープのイメージファイルとしては、.mzt 以外にも .mzf というファイルが存在するのだけれど。.mzf は、先頭に 'mz20' の文字列が入ってるという情報を見かけたものの、Web上で公開されていた各種 .mzf を入手して中を覗いてみたところ、そういう文字列が入ってるファイルは見当たらなかった。拡張子が .mzf でも、フォーマットが異なるものが存在している、ということだろうか…。
ファイルの種類(アトリビュート)に入ってる、0x02 と 0x05 の使い分けが、ちょっと自信がない。手元の .mzt をいくつか確認した感じでは、SP-5030 / Hu-BASIC用のプログラムには 0x02 が、MZ-700用S-BASIC用のプログラムには 0x05 が入っていたけれど、本当にその分類でいいのだろうか…?
テープのイメージファイルとしては、.mzt 以外にも .mzf というファイルが存在するのだけれど。.mzf は、先頭に 'mz20' の文字列が入ってるという情報を見かけたものの、Web上で公開されていた各種 .mzf を入手して中を覗いてみたところ、そういう文字列が入ってるファイルは見当たらなかった。拡張子が .mzf でも、フォーマットが異なるものが存在している、ということだろうか…。
この記事へのツッコミ
[ ツッコミを読む(1) | ツッコむ ]
#2 [prog] z88dkでMZ-700用のプログラムを作ってみたり
以前、Z80用のバイナリを作ってくれるCコンパイラ、SDCC を使って、MZ-700用のプログラムを作れるのか確認したことがあるのだけど。
_mieki256's diary - Z80用のバイナリを生成できるCコンパイラ SDCCを試用
ググってみたら、z88dk なるCコンパイラでも、MZ-80K/700用のバイナリが作れるらしいと知り、試用してみたり。環境は Windows10 x64 1809 + MZ700WIN 0.56。
_mieki256's diary - Z80用のバイナリを生成できるCコンパイラ SDCCを試用
ググってみたら、z88dk なるCコンパイラでも、MZ-80K/700用のバイナリが作れるらしいと知り、試用してみたり。環境は Windows10 x64 1809 + MZ700WIN 0.56。
◎ インストール。 :
公式サイトのリンクを辿って、sourceforge から、z88dk-win32-1.99C.zip を入手。
_z88dk
_Z88 Development Kit - Browse Files at SourceForge.net
_Nightly CVS snapshots and win32 builds of z88dk
一般的には Nightly builds 版、z88dk-win32-latest.zip を入手して使う場合が多いらしいけど…。今回は、バージョンがついてる版を選択してみた。
解凍して、任意のフォルダに置く。
環境変数を設定。
以下の解説ページが参考になった。ありがたや。
_MSX用クロス開発のすすめ(z88dk) - 仮想と現実
_z88dk
_Z88 Development Kit - Browse Files at SourceForge.net
_Nightly CVS snapshots and win32 builds of z88dk
一般的には Nightly builds 版、z88dk-win32-latest.zip を入手して使う場合が多いらしいけど…。今回は、バージョンがついてる版を選択してみた。
解凍して、任意のフォルダに置く。
環境変数を設定。
- PATH に、z88dkインストールフォルダ\bin、を追加。
- 環境変数 Z80_OZFILES を新規作成して、z88dkインストールフォルダ\lib、を指定。
- 環境変数 ZCCCFG を新規作成して、z88dkインストールフォルダ\lib\Config、を指定。
以下の解説ページが参考になった。ありがたや。
_MSX用クロス開発のすすめ(z88dk) - 仮想と現実
◎ コンパイル。 :
C言語のソースを書いて、コンパイル。例えば、hello.c をコンパイルして、MZ-80K/700用のバイナリを作るなら、以下の指定になる。
_Platform Sharp MZ - z88dk/z88dk Wiki
_platform:sharpmz [z88dk]
しかし、-lm の意味が分からない…。zcc --help をしてみたけど…。-l -m を指定してるということなのかな…。
※ 2019/05/08追記。-lm オプションは、「Link in the generic Z80 maths library」だそうで。数学ライブラリをリンクしてくれるのだろう。たぶん。
_Tool zcc - z88dk/z88dk Wiki
zcc +mz -lm -o hello -create-app hello.c
- +mz : MZ-80K/700用をターゲットにする。
- -lm : 謎。
- -o xxxxx : 出力ファイル名
- -create-app : アプリ作成
_Platform Sharp MZ - z88dk/z88dk Wiki
_platform:sharpmz [z88dk]
しかし、-lm の意味が分からない…。zcc --help をしてみたけど…。-l -m を指定してるということなのかな…。
※ 2019/05/08追記。-lm オプションは、「Link in the generic Z80 maths library」だそうで。数学ライブラリをリンクしてくれるのだろう。たぶん。
_Tool zcc - z88dk/z88dk Wiki
◎ 結果。 :
Hello World はコンパイルできたし、動いてくれた。
しかし、 _先日 SDCC で試したソース は、コンパイルはできたけど動かない。画面が真っ暗なまま。ただ、何故か、unsigned char のポインタを char のポインタにすると動く。
#include <stdio.h>
int main(void) {
printf("\n-- HELLO WORLD --\n");
}
しかし、 _先日 SDCC で試したソース は、コンパイルはできたけど動かない。画面が真っ暗なまま。ただ、何故か、unsigned char のポインタを char のポインタにすると動く。
#include <stdio.h>
#define DISPADRS 0xd000
#define ATTRADRS 0xd800
int main(void)
{
for (int c = 0; c <= 255; c++)
{
char d = c;
for (int y = 0; y < 25; y++)
{
int x = 30;
char *p;
char *q;
p = (void *)(DISPADRS + y * 40 + x);
q = (void *)(ATTRADRS + y * 40 + x);
while (x < 40)
{
*p++ = d; // display code
*q++ = 0x40; // attrib
x++;
}
d++;
}
}
return 0;
}
/*
int init(void)
{
return 0;
}
*/
◎ 最新版にしたら動いた。 :
Nightly builds版の z88dk-win32-latest.zip を入手して使ってみたところ、unsigned char のポインタを記述しても動くようになった。1.99c 版はそのあたりにバグがあった、ということだろうか…。
#include <stdio.h>
#define DISPADRS 0xd000
#define ATTRADRS 0xd800
int main(void)
{
for (int c = 0; c <= 255; c++)
{
unsigned char d = c;
for (int y = 0; y < 25; y++)
{
int x = 30;
unsigned char *p;
unsigned char *q;
p = (unsigned char *)(DISPADRS + y * 40 + x);
q = (unsigned char *)(ATTRADRS + y * 40 + x);
while (x < 40)
{
*p++ = d; // display code
*q++ = 0x40; // attrib
x++;
}
d++;
}
}
return 0;
}
/*
int init(void)
{
return 0;
}
*/
◎ 参考ページ。 :
[ ツッコむ ]
以上、1 日分です。
CMTだと05、QD RAM FDだと02みたいですね
https://original.sharpmz.org/filetypes.htm