クロス開発 z88dk


https://github.com/z88dk/z88dk/wiki/Platform---MSX

 

z88dk は Z80 系の CPU で動作する
プラットフォームに対応したクロス開発ツールです。

様々なプラットフォームに対応していて、
その一つとして MSX も対応されています。

しかも MSX 向けは様々な出力手段が提供されていて、
すぐに実行ができるようになっています。

  • カセットテープイメージ(.cas → BLOAD"CAS:",R)
  • カセットテープ音声 WAVE ファイル(.wav)
  • BASIC 向けディスクファイル(.msx → BLOAD"~.MSX",R)
  • MSX-DOS・2 向け実行ファイル(.com)
  • ROM カートリッジイメージ(.rom)

このページでは MSX 向けに z88dk を使用する場合の情報を入れています。

 

MSX に限らないプラットフォーム共通の z88dk 情報は

個別サイト z88dk を使う。 でまとめています。

 

z88dk を使う。https://c-z88.dk.eu.org/


サンプルプログラム

z88dk/examples/msx に msx/gfx.h 関連のグラフィックを用いたサンプル(ex~)、
また z88dk/examples にあるプラットフォーム共通のサンプルも
MSX でビルドできます。

z88dk/examples/msx から make で作成して下さい。ex7 は .com 生成必須。
make からは ~.cas で作られます。BLOAD"CAS:",R で実行できます。

個別にビルドして、他の形式の生成も可能です。

 

プログラム名 解説
ex1・ex1b 星が手前に飛ぶような表示(グラフィック使用)
ex2 😃 キャラクターを画面いっぱいカラフルに表示
ex3 棒グラフのような表示
ex4 スプライトの表示・移動(4 文字をスプライトに設定)
ex5 線画
ex6

カーソルキーに合わせてキャラクターが動く

ex7 画面スクロール+機体スプライト
ex8 アルファベットのバナー表示?(.alf ファイルを用意)
ex9 星が手前に飛ぶような表示(スプライト使用)
ex10・ex10b ディザリング図形の表示
ex11 3D 図形の表示
dstar バズルゲーム。キー操作はソースに記載があります
microman ……なんか見た事があるゲームのような気がします……
othello MSX との対戦。縦横の順で数字入力します
snake スネークゲーム、2 人対戦
vpoke 「?」の表示・非表示
wall ブロック崩し
showlib3d 3D 図形の表示
ex1
ex1
ex2
ex2

ex3
ex3
ex4
ex4

ex5
ex5
ex6
ex6

ex7
ex7
ex10
ex10

ex10b
ex10b
dstar
dstar

globe
globe
microman
microman

othello
othello
showlib3d
showlib3d

snake
snake
vpoke
vpoke

wall
wall


zcc のオプション

zcc はいくつかのオプションを付加します。

 

オプション 意味
+msx ビルドするプラットフォーム。
MSX 関連は通常これを付けます。★
-lndos MSX-DOS コール・ディスクのライブラリを付加しません。
必要な場合は外します。
-lm math ライブラリを付加します。(浮動小数点型など)
整数型のみの場合は不要です。
-lmsxbios 内部ライブラリで VDP 関連の操作を行う場合に付けます。
-create-app プラットフォーム・オプションに適した出力を行います。
固定で付けると思って下さい。
-subtype=wav カセットテープの音を入れた .wav ファイルを生成します。
-subtype=disk BASIC の BLOAD"~",R で実行できる
.msx ファイルを生成します。※
-subtype=msxdos MSX-DOS1 向けの実行ファイル .com を生成します。
-subtype=msxdos2 MSX-DOS2 向けの実行ファイル .com を生成します。
階層ディレクトリ対応します。
-subtype=rom ROM カートリッジイメージ .rom ファイルを生成します。
-subtype=~ なし カセットイメージ .cas ファイルを生成します。
-bn ファイル名 出力するバイナリのファイル名を設定します。
ない場合は a.~ で生成します。
-o ファイル名 コンパイルを停止する最終的なファイル名を設定します。
-zorg=番地 開始番地・実行番地を指定します。☆

★ MSX-DOS・2 は CP/M 互換のシステムコールを持ちます。
  CP/M で使用できる実行ファイルとして +msx の代わりに +cpm を使用できます。

☆ 省略時は BASIC 関連が &H9C40 、MSX-DOS・2 実行ファイルは &H0100 です。
  16kb 以下の MSX1 で BASIC から実行する場合は必ず指定が必要になります。
  番地は 10 進数で指定して下さい。
  例えば開始番地が &HD000 であれば、-zorg=53248 となります。

※ 拡張子 .msx は z88dk 独特です。
  .bin の拡張子で使用するケースが多かったかと思います。 

 

例えば次のようになります。

  • zcc +msx -create-app a.c
    カセットイメージ a.cas を生成します。
  • zcc +msx -create-app -subtype=wav a.c
    カセット音声が入った a.wav を生成します。
  • zcc +msx -subtype=msxdos -o balloon.com balloon.c
    MSX-DOS 実行ファイル balloon.com を生成します。
  • zcc +msx -create-app -subtype=disk -bn balloon balloon.c
    BASIC から BLOAD,R で実行できる balloon.msx を生成します。

ライブラリ

ここでは MSX 固有のライブラリを主に説明していきます。

 

このライブラリを Nightly Build で使用する場合、

zcc のオプションに -lmsxbios を付けて下さい。

 

MSX2 以降で追加されている機能はこれらのライブラリで
考慮されていない部分が多く、

そのまま使うと意図しない動作をする場合があります。

特に MSX2 以降向けは BIOS コール を実行する

関数を作る(ライブラリを整える)のが無難でしょう。

運営者が公開している C 言語ソースはこの方法で作ってあります。
プログラム 内を確認してみて下さい。
 

msx.h

https://www.z88dk.org/wiki/doku.php?id=library:msx

 

MSX 関連で最低限の機能が含まれています。

  • void msx_initpsg()
    PSG を初期化します。
  • void msx_sound(int reg, int val)
    PSG から音を出します。BASIC の SOUND に同等と思われます。
  • int msx_readpsg(int regno)
    レジスタの値を返します。
  • void msx_screen(int mode)
    スクリーンモードを設定します。MSX の SCREEN 値 1 にほぼ同じです。
  • int msx_screenmode()
    現在のスクリーンモードを得ます。
  • int msx_vpeek(int address)
    VRAM から値を得ます。BASIC の VPEEK に同じです。
  • void msx_vpoke(int address, int value)
    VRAM に値を設定します。BASIC の VPOKE に同じです。
  • void msx_text()
    テキストモードへ移行します。
  • void msx_blank()
    画面を非表示にします。
  • void msx_noblank()
    画面を表示します。
  • int msx_color(int foreground, int background, int border)
    色を設定します。BASIC の COLOR に同じです。
  • int msx_type()
    MSX の種類を得ます。(1=MSX1・2=MSX2 以降)
    ※ 2019/07/05 までは不具合があり、MSX2 以降は 770 を得ます。
      GitHub issue #1220
  • int msx_vram()
    VRAM のサイズを得ます。単位は KB です。
  • int msx_lpt()
    プリンターの状態を得ます。1=印刷可能・0=印刷不可
  • int msx_break()
    CTRL+STOP が押されているかを得ます。1=押されている・0=押されていない
  • void msx_clearkey()
    キーボードバッファをクリアします。
  • void msx_breakoff()
    CTRL+STOP を無効にします。
  • void msx_breakon()
    CTRL+STOP を有効にします。
  • extern unsigned char MSX2_SUBVER @0x002d
    MSX の種類を得ます。(0=MSX1・1=MSX2・2=MSX2+・3= MSX turbo R)
    ※ 2019/07/06 以降の Night Build で含まれています。

GFX ライブラリ

https://www.z88dk.org/wiki/doku.php?id=library:msx:gfx

http://jannone.org/gfxlib/

 

Rafael(Oliveira Jannone)による GFX ライブラリを
z88dk で動作するようにしたものです。
かなり修正が入り、z88dk ライブラリとして統合されている状態です。

この GFX ライブラリの使用しての不具合も必ず z88dk 側に報告して下さい。

 

msx.h よりも機能が豊富で、実際にこちらを使用する事が多いです。

数が多いので、特に使用すると思われる gfx.h と line.h を記載しています。

全機能と詳細は GFX ライブラリのドキュメントを参照して下さい。

 

msx/gfx.h

GFX ライブラリの中でも中心的な機能を持っている関数です。
関数が多いので、関連別にしています。

ビデオ関連
一部の関数は SCREEN 2(または SCREEN 1.5 )での使用を前提にしています。

  • #define MODE2_MAX(256 * 24)
    SCREEN 2 での最大バイト数を返します。
  • #define MODE2_ATTR(8192)
    SCREEN 2 でのアトリビュート開始アドレスを返します。
  • #define MODE2_WIDTH 256
    SCREEN 2 の横幅を返します。
  • #define MODE2_HEIGHT 192
    SCREEN 2 の縦幅を返します。
  • enum video_mode
    ビデオモードが入ります。
  • enum screen_map
    画面セクションが入ります。(3 マップ)
  • void set_mode (u_int mode)
    スクリーンモードを設定します。
    例えば set_mode(mode_2); で SCREEN 2 になります。
    MSX1 のスクリーンモード SCREEN 0~3 が有効です。
  • void set_mangled_mode ()
    SCREEN 1.5(SCREEN 1+2)へ設定します。
    ※ 2019年7月現在の Nightly Build では動作に不具合があります。
  • void set_color (u_char front, u_char back, u_char border)
    色を設定します。BASIC の COLOR に同等です。
  • void vfill (u_int addr, u_char value, u_int count)
    VRAM の番地 addr から value の値を count バイト埋めます。 
  • void vpoke (u_int addr, u_char value)
    VRAM に値を設定します。BASIC の VPOKE に同じです。
  • u_char vpeek (u_int addr)
    VRAM から値を得ます。BASIC の VPEEK に同じです。
  • void vmerge (u_int addr, u_char value)
    VRAM の番地にある現在の状態と value を OR(論理和)で反映します。
  • void vwrite (void *source, u_int dest, u_int count)
    メモリにある *source の内容を VRAM dest へ count バイト転送します。
  • void vread (u_int source, void *dest, u_int count)
    VRAM の番地 source の内容からメモリに確保した領域 *dest へ
    count バイト転送します。
  • void set_vdp (u_char reg, u_char value)
    VDP レジスタへ値を設定します。
  • u_char get_vdp (u_char reg)
    VDP レジスタから値を得ます。
  • void locate (u_char x, u_char y)
    カーソルを移動します。BASIC の LOCATE に同じです。
  • void fill_v (u_int addr, u_char value, u_char count)
    VRAM 番地 addr から値 calue を count 回下方向へ埋めます。
  • void pset (int x, int y)
    点を線画します。BASIC の PSET に同じですが、色は set_color を使います。
  • void set_char_form (char c, void *form, u_char place)
    画面領域 place のキャラクター c にデータ *form を設定します。
    パターンジェネレータテーブルへの書き込みに使用します。
  • void set_char_attr (char c, void *attr, u_char place)
    画面領域 place のキャラクター c に色情報 attr を設定します。
    カラーテーブルへの書き込みに使用します。
  • set_char_color (char c, u_char color, u_char place)
    画面領域 place のキャラクター c 8 行全体に色 color を設定します。
    カラーテーブルへの書き込みに使用します。
  • set_char (char c, void *form, void *attr, u_char color, u_char place)
    画面領域 place のキャラクター c へデータ *form、
    色情報 *attr または色 color を設定します。
    (set_char_form + attr または form + color を 1 行で実行します。
     attr が 0 の場合は color が実行されます)

PSG 関連

  • #define sound(reg, value) psg_set(reg, value)
    PSG に値を設定します。
    BASIC に慣れている人向けに別名を割り当ててあります。
  • #define psgT(hz) ((int)(111760.0 / (hz)))
    周波数の PSG 変換値です。
  • enum { chanNone = 0, chan0 = 1, chan1 = 2, chan2 = 4, chanAll = 7 }
  • enum { envD = 0, envU = 4, envDD = 8, envDUD = 10, envDH = 11, envUU = 12, envUH = 13, envUDUD = 14 }
    音量エンベローブの波形です。
  • void psg_set (u_char reg, u_char value)
    PSG レジスタに値を設定します。BASIC の SOUND に同じです。
  • u_char psg_get (u_char reg)
    PSG レジスタから値を得ます。
  • void psg_init ()
    PSG を初期化します。
  • void psg_tone (u_char channel, int period)
    PSG の channel(0~2)にトーンを設定します。
  • void psg_noise (u_char period)
    PSG のノイズを設定します。
  • void psg_volume (u_char channel, u_char volume)
    PSG の channel に音量を設定します。
  • void psg_envelope (u_char waveform, int period, u_char channels)
    PSG の channel に音量エンベローブ waveform を period 周期で設定します。
  • void psg_channels (u_char tone_channels, u_char noise_channels)
    PSG の channel にトーン・ノイズの割り当てを行います。
  • u_char psg_tone_channels ()
    トーンに割り当てている channel を得ます。
  • u_char psg_noise_channels ()
    ノイズに割り当てている channel を得ます。

スプライト関連
※ 2019年7月現在 Nightly Build では動作に不具合があります。

  • enum sprite_mode
    スプライトモードが入っています。
  • void set_sprite_mode (u_char mode)
    スプライトモードを設定します。
    モードは sprite_default, sprite_scaled, sprite_large のいずれかです。
  • void set_sprite_8 (u_char handle, void *data)
    8×8 のスプライト *data をスプライト番号 handle に割り当てます。
  • void set_sprite_16 (u_char handle, void *data)
    16×16 のスプライト *data をスプライト番号 handle に割り当てます。
  • void put_sprite_8 (u_char id, int x, int y, u_char handle, u_char color)
    8×8 のスプライト handle を id で座標 x,y 色 color で表示します。
  • void put_sprite_16 (u_char id, int x, int y, u_char handle, u_char color)
    16×16 のスプライト handle を id で座標 x,y 色 color で表示します。

コントローラ関連

  • u_char get_stick (u_char id)
    ジョイスティック id より状態を得ます。BASIC の STICK に同じです。
  • bool get_trigger (u_char id)
    ジョイスティックボタン id の状態を得ます。
    true で押している状態。BASIC の STRIG 相当です。

乱数関連

  • seed_rnd (int seed)
    乱数を生成するための元値 seed を設定します。
  • u_char get_rnd ()
    乱数を得ます。(例えば get_rnd()%5 で 0~4 の値になります)

line.h

線画を実現するライブラリです。

  • #define DITHER(I, Y) (dithpat[I][Y & 1])
    画面のライン Y に強度 I のディザリングを得ます。
  • void surface_line (surface_t *, int x1, int y1, int x2, int y2)
    surface 上に線を描きます。
  • void line (int x1, int y1, int x2, int y2)
    画面上に線を描きます。
  • void line_slow (int x1, int y1, int x2, int y2)
    画面上にスローで(遅く)線を描きます。
  • void calculate_side (int x1, int y1, int x2, int y2, int low[], int high[])
  • void hline (int x1, int y1, int x2, u_char value)
  • void surface_hline (surface_t *s, int x1, int y1, int x2, u_char value)

3d.h

3D を線画するライブラリです。

 

defs.h

様々な定義・ユーティリティーが含まれています。


モノクログラフィック・モノクロスプライト

MSX に限らず、z88dk が対応している様々なプラットフォームで動作する

モノクログラフィック・モノクロスプライトライブラリがあります。

MSX の場合は SCREEN 2・COLOR 1,15,15(白背景・黒線画)です。

256✕192 ドット表示という事になります。


2019年6月27日以降の Nightly Build から動作するようになったようです。
このライブラリを使用する場合は zcc オプションに -lmsxbios を付けて下さい。

clg() 関数 で SCREEN・COLOR を直接 BIOS コールで設定しているため、

正常に動作している事を確認しています。 

 

詳細とライブラリについては z88dk で使う で紹介しています。

 

モノクログラフィック | z88dk で使う

モノクロスプライト | z88dk で使う


注意事項

2019年7月現在、z88dk Nightly Build では
MSX を含むいくつかのプラットフォームで共通したライブラリにしてあります。
(-lmsxbios を付加するようになって理由がこれです)

このライブラリでは VRAM を MSX が本来使う領域と異なる番地で
初期化するところがあります。

例えば内蔵ライブラリで初期化して、
自前で VRAM を操作する場合、この点に注意して下さい。

直接 BIOS や VDP から初期化するようにした場合は
MSX 標準の領域で初期化されますが、

この場合の線画も直接 BIOS・VDP を直接実行する必要がある
必要が生じる場合があります。

これはグラフィックの線画に加えてスプライトの操作も該当します。

 

z88dk はテキスト関連で ANSI・VT100 互換のターミナル互換にしている
プラットフォームが多いですが、

2019年7月現在、MSX はそもそも対応していないので、
エスケープシーケンスは対応していません。
MSX が本来扱っているエスケープシーケンスは使用可能です。
フォント・キャラクター に記載しています。


確認している不具合

最新の Night Build で次の問題を確認できています。

 

画面がおかしくなる・表示されず暴走する

Nightly Build で msx.h および msx/gfx.h を使用している場合、
スプライトなどの動作でおかしくなる事を確認していましたが、

Nightly Build 20191012 までに改善された事を確認できています。

 

2019年6月付近から、新たに zcc のオプションで
-lmsxbios を付けるようになりました。

これで一部の動作は改善できる場合があります。
(examples/msx/make はすでに付加されています)


z88dk で作ったものを WebMSX で公開したい場合

ROM カートリッジイメージ(.rom)にすると、
WebMSX 軽量 C-BIOS 版で動作可能です。

C-BIOS 版を使用する事により、MSX の版権問題を回避して使用できます。

MSX JAPAN▉ では z88dk 制作の C 言語版を
WebMSX 軽量 C-BIOS 版で動作するようにしています。

パラメータを指定して自動起動が可能です。
また、Web・ブログ上に貼り付ける事もできます。
(貼り付けた場合、ページを表示した時に起動してしまう事にご注意下さい)

 

z88dk で作ったものを MSX の版権を心配せずに WebMSX で公開。| ふうせん🎈 Fu-sen.