mieki256's diary



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。

インストール。 :

公式サイトのリンクを辿って、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 を入手して使う場合が多いらしいけど…。今回は、バージョンがついてる版を選択してみた。

解凍して、任意のフォルダに置く。

環境変数を設定。
  • PATH に、z88dkインストールフォルダ\bin、を追加。
  • 環境変数 Z80_OZFILES を新規作成して、z88dkインストールフォルダ\lib、を指定。
  • 環境変数 ZCCCFG を新規作成して、z88dkインストールフォルダ\lib\Config、を指定。

以下の解説ページが参考になった。ありがたや。

_MSX用クロス開発のすすめ(z88dk) - 仮想と現実

コンパイル。 :

C言語のソースを書いて、コンパイル。例えば、hello.c をコンパイルして、MZ-80K/700用のバイナリを作るなら、以下の指定になる。
zcc +mz -lm -o hello -create-app hello.c
  • +mz : MZ-80K/700用をターゲットにする。
  • -lm : 謎。
  • -o xxxxx : 出力ファイル名
  • -create-app : アプリ作成
この指定で、いきなり .mzt が出力される。

_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 はコンパイルできたし、動いてくれた。

#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;
}
*/

参考ページ。 :


以上です。

過去ログ表示

Prev - 2019/05 - Next
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project