SGDK学習メモ:No.1、Create Project時の補足+メガドライブのパレットの概要

*以下SGDKは記述時点で最新版のSGDK 1.70 (february 2022)を使用しています


*2022/12/02追記
低頻度ですがGens KModが暴走してOSの操作が困難になったことがあります。SGDKのチュートリアルでも「Gens KModにはいくつかのバグがあり、メモリリークしている」(it has some flaws, first it has some bugs / memory leaks)とありますが、そのバグの1つでしょうか。

タスクマネージャーの操作も非常に困難になる=タスクマネージャーからGensを強制終了させることも難しいので、以下のようなバッチファイルを用意しておき、暴走時に実行できるようにしておくといいかもしれません。

taskkill /IM gens.exe
pause

SGDK学習の際のメモです。
現在進行系で学習中の初心者かつ飲み込みが悪いため、冗長な点が非常に多いです。あらかじめご了承下さい。もし間違っている記述がある場合、コメントいただけると非常に嬉しいです。

Sega Genesis Development Kit/SGDK

SGDK is a free development kit allowing development of software in C language for the Sega Mega Drive

https://github.com/Stephane-D/SGDK

「C言語によるメガドライブ用の無料のソフトウェア開発キット」です。

GETTING STARTED

First, you need to know that SGDK uses the C language (assembly is also possible, but not necessary) so it's highly recommended to be familiar with C programming before trying to develop with SGDK. Learning C language at same time as learning 'Sega Mega Drive' programming is definitely too difficult and you will end up getting nowhere. It's also important to have, at least, a basic knowledge of the Sega Mega Drive hardware (specifically the video system).

https://github.com/Stephane-D/SGDK

「SGDKとC言語の同時学習は難しすぎて成果が得られないだろう」(意訳)という記載があるように、SGDKはC言語を学習済みであることを前提としています。また「メガドライブのハードウェアに関する基礎知識(特にビデオシステム周り)も大切」(意訳)とのことです。

私のSGDKの学習はAndrej PreradovicさんのMega Drive Tutorialsシリーズをベースにしています。

チュートリアル初回はこちら。
Megapong 1 - Hello Mega Drive World!

環境設定は上記Megapong1及び
Megapong 2 - Setting Up The Environment

が参考になります。
Megapong 2までの環境設定が完了するとVisual Studio Code(VS Code)とGenesis Code extensionによってコンパイル実行からエミュレータ起動までが、コマンドパレット(WindowsならCtrl-Shift-P)からのコマンド1回で実行できるようになります。

Genesis Code extensionによる"Genesis Code: Create Project"コマンドは作成直後コンパイルエラーになるので、includePathにSGDKのincフォルダとresフォルダを追加する必要があります。
私はSGDKのインストールフォルダを

C:\games\dev\sgdk170

としているので、

includeでエラーの波線が出るので電球マークをクリック、
表示されるQuick FixからEdit "includePath" settingを選択
インクルードパス(include path)に
C:/games/dev/sgdk170/inc
C:/games/dev/sgdk170/res

という記述になります。
*2024/04/27追記
Genesis Code 1.4.2でCreate Project時に生成されるsettings.jsonの内容が修正されinclude pathへの手動追記が不要になりました。ただし環境変数GDKの設定は必要です(settings.jsonで${env:GDK}を参照している)。

Genesis Codeを使用してのコンパイルエラーになる原因として、VSCode内のターミナルで使用するプロファイルとしてコマンドプロンプト以外(PowerShellなど)が選択されている場合があります。Megapong 2にも記載がありますが、コンパイルエラー発生時はCMD(Command Prompt)がデフォルトとして選択されていることを確認してください。

VSCodeインストール直後の初期値としてPowerShellがデフォルトとなっていることがありました、これはVS CodeやWindowsのバージョン等によって変わるかもしれません

チュートリアルを進めていたところ
・パレット
の話が出てきました。

これについてはラエルさんが作成したサイト中の

の説明がわかりやすいと感じました。引用させてもらうと

パレットについて

メガドライブは基本的に512色中64色を表示できます。
16色のパレットが4つ用意されていてBGとスプライト共有で使えます。
1番パレットの初めの色が背景色です。
2番パレット以降の初めの色が透明色です。
ハイライトシャドウ機能を有効にした場合は
4番パレットの最後の色がシャドウ色、最後の一つ前の色がハイライト色になります。

https://nendo16.jimdofree.com/%E7%94%BB%E5%83%8F%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%97%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86/

各パレットは16色指定可能ですがパレットの先頭には背景色(パレット0)または透明色(パレット1~3、背景色と同色)が存在するため
(4パレット * 15色) + 1色 = 61色
が同時発色可能数ということになります。なので俗説的に言われる「メガドラの同時発色は64色」は、厳密には間違っているとも言えます。

Gens KModでVDPを表示したところ、
4パレット存在するのが確認できる、
因みに上図パレットの色はデフォルトの状態(SGDKが設定する初期値のようです)

シャドウ、ハイライトについては今のところ「そのような機能がある」ということで、一旦保留としておきます。

Shadow/Highlight is a special VDP mode that allows for more colours to be displayed on-screen at once, about 3 times as much as the normal 512.

http://md.railgun.works/index.php?title=VDP#Shadow.2FHighlight

シャドウ、ハイライトにより通常より多く色が表示できるようです。軽く検索した感じではこれの取り扱いは難しいようです。シャドウ、ハイライトの映像についてはこのページを見るとイメージが掴めると思います。


メガドライブが表示できる色数は512色ですが、指定可能な値はメガドライブ版『ダライアス』の作者であるHidecadeさんの以下のページが分かりやすいです。

メガドライブで表示可能な512色です。各チャンネルが3ビットのRGBカラー(赤・緑・青それぞれが8段階)です。
(中略)
さらに、一つの絵に対して、この中から任意の15色(16色中1色は背景色になるので)を選ぶ必要があります。
EDGEなどの画像編集ソフトは8ビットのRGBカラー赤・緑・青それぞれが256段階)での編集が標準です。そこで、自分は各チャンネルの値を、
0 36 73 109 146 182 219 255
の8段階の値に限定して画像編集しています。

https://ameblo.jp/arcade-cabinet/entry-12270041723.html
*一部boldにしました

赤 8段階 * 緑 8段階 * 青 8段階 =512色となっているようです。

メガドライブ用の画像ファイルをドット絵エディター「EDGE」を使用して確認してみます。

先述のラエルさんのサイトでメガドライブ用のツタンカーメンの画像ファイルが配布されているので、これをEDGEで開いてみます。

カラーパレットの先頭の色

カラーパレットの先頭の色=背景色/透明色はすべて0=黒になっています。

カラーパレットの2番めの色

カラーパレットの2番めの色=赤:109、緑:146、青:146となっており、Hidecadeさんの説明通り
0 or 36 or 73 or 109 or 146 or 182 or 219 or 255
のいずれかに当てはまる値となっています。カラーパレット中の他の色も同様です。


少し話がそれますが
Megapong 3 - Importing Resources

でチュートリアルに使用する「bgtile.png」という画像ファイルが配布されています。
これをEDEGで開いてみるとHidecadeさんの説明に当てはまらない値が指定されています。

bgtile.pngをEDGEで開いて確認

赤:0、緑:32、青:44となっています。ですがこの画像は、少なくともメガドライブエミュレータ上では特に問題なく表示が行われます。

上記の画像をエミュレータで表示してペイントでRGB値を確認してみました。
Gens KModのスクリーンショットの場合

赤:0、緑:36、青:33

BlastEmのスクリーンショットの場合

赤:0、緑:49、青:49

Regen v0.972 (with debuggers)のVDP Debuggerでパレットをビットマップファイルに出力した場合

Regen v0.972 (with debuggers)は
パレット(厳密にはタイル、画像ファイルのパレットがタイル先頭に格納される模様)を
ビットマップファイルとして出力できます
赤:0、緑:32、青:32

結果としてどのエミュレータでも0 or 36 or 73 or 109 or 146 or 182 or 219 or 255に当てはまらない値が出てきます。

とりあえずここでは「色についてはSGDKが微調整してくれる」「エミュレータによって発色の具合は微妙に異なるようだ」ということにしておきます。

そもそも人間の目だと微細な色の違いを見分けることは困難なのですが、画像作成時、コード記述時は必要になるかと思って調べてみた次第です。

現在ファミコン/NES開発時に使用するエミュレータはMesenがデファクトスタンダードだと思うのですが、メガドライブの場合はどのエミュレータを使用するのがよいのでしょうか。
Tuto Introduction

でGens KModを使用したmessage logの記述があるので、少なくともSGDKの場合、
・コーディング/テスト時はGens KMod
・最終的な動作確認はGens KModより動作が正確なBlastEm
という感じ?


*2022/08/26追記
追加でパレットのことを調べていた所、以下のTweetが見つかりました。

SGTD !! Sega Genesis Tile Designer

には「Pallette Editor」という機能があり、スライダーで各RGBの値を変更、最終的な色と値を確認できます。

この機能で各RGBに指定できる値を確認すると

下限:0x1F
上限:0xFF
増減値:0x20

となっています。つまり
31(0x1F) or 47(0x3F) or 95(0x5F) or 127(0x7F) or 159(0x9F) or 191(0xBF) or 223(0xDF) or 255(0xFF)
でした。
これもHidecadeさんの説明とは異なります。
現時点ではRGBにどの値を設定するのがベター/ベストなのか不明ですが、一応調査した値を記述しておきます。


SGDKでは画像ファイル中のカラーパレットをメガドライブ上で表示するパレットに指定できます。
以下
Megapong 4 - Palettes

からの引用です。かなり端折りますが

VDP_setPalette(PAL1, bgtile.palette->data);

これによってパレット1に画像ファイルbgtileのパレットがセットされます。

*パレットをセットする方法は複数あります、これは方法の一つです

【了】

この記事が気に入ったらサポートをしてみませんか?