2019/05/07(火) [n年前の日記]
#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; } */
◎ 参考ページ。 :
[ ツッコむ ]
以上です。