« オーボエ吹きの日記: やっぱり、できが違う! | トップページ | オケの練習 »

2009/09/18

WonderSwan 開発環境

アクセス解析を見てみたら、
『WonderSwan 無料 開発環境』
というワードで検索して辿り着いた人がいました。

現状、公式の開発環境は、
(1) メーカー(バンダイ)とライセンス契約を結んで入手する。
(2) Wonder Witchを購入する(約2万円/生産中止)。
があるわけで、公式には無料の開発環境は存在しないのですが…
まぁ、でも、やろうと思えば、ソフト開発できなくはないです。
無料で入手するとなると、用意するのは、
・ Microsoft Macro Assembler (アセンブラ)
・ LSI-C86 (C言語コンパイラ)(こっちは、無くてもいい。)


もしかして、この辺の解説すると、需要とかすごい有るのでしょうか?


基本的には、WonderWitchを使わない場合は、
アセンブリ言語が使えないと、アプリケーション開発無理です。
メーカーと契約結んで開発環境を入手する場合は、持ってないので知らないです。
が、やっぱり、こっちもアセンブリ言語ベースだと思う。
WonderWitchはアマチュア用の開発環境だから、C言語のみで出来るけど…。
(その代わり、制約は多い。)

C++!?
メモリに制約がある中で、そんな実行ファイルが大きくなるオブジェクト指向使うの?
8bit や 16bit CPUだったら、普通に手続き指向でいこうぜ。
64kByteの壁があるんだし。

『エミュレータで動かすROMイメージを自分で開発する』事を簡単に解説すると、ROMイメージのフォーマットは、ROMの内容そのまま。
WonderSwanのROMには、一番後ろ16Byteに次の内容が書いてあります。

0xFFFF0 任意のアドレスへのfarジャンプコード(5Byte)
0xFFFF5 リザーブ領域 (全てのbitを0にして下さい)
0xFFFF6 メーカーコード(2Byte)
0xFFFF8 タイトルコード(1Byte)
0xFFFF9 バージョン(1Byte)
0xFFFFA ROM容量(1Byte)
0xFFFFB RAM容量・EEPROM容量(1Byte)
0xFFFFC ROMウェイト数・ROMバス幅・縦横フラグ(1Byte)
0xFFFFD サブシステムLSI(1Byte)
0xFFFFE チェックサム(2Byte) 0x0000でもいい。特にチェックはしてなさそう。

カートリッジ内ROM容量(4bit)
------------------------------------
0x00 1Mbit
0x01 2Mbit
0x02 4Mbit
0x03 8Mbit
0x04 16Mbit
0x05 24Mbit
0x06 32Mbit
0x07 48Mbit
0x08 64Mbit
0x09 128Mbit

カートリッジ内RAM容量(4bit)
------------------------------------
0x?0 なし
0x?1 256Kbit
0x?2 1Mbit
0x?3 2Mbit

カートリッジ内EEPROM容量(4bit)
------------------------------------
0x0? なし
0x1? 1Kbit
0x2? 2Kbit
0x3? 4Kbit
0x4? 8Kbit
0x5? 16Kbit
0x6? 32Kbit
0x7? 64Kbit
0x8? 128Kbit

ROMウェイト数・ROMバス幅・縦横フラグ
------------------------------------
bit 0 : 横フラグ : 起動時のバンダイロゴを、縦横のどちらで表示するか
bit 2 : ROMカートリッジのバス幅 (0:8bit / 1:16bit)
bit 3 : ROMウェイト数 (1:カートリッジ内ROMアクセス時、1clockのwaitを追加する。)


この領域はi8086の 0xFFFF0~0xFFFFF 番地に配置される。
i8086(V30MZも同様)シリーズのCPUは、リセット時のレジスタは、
 CS = 0xFFFF
 IP = 0x0000
なので、つまり、そういう事。
far jump命令あたりを書いておけばいい。
たぶん、アセンブラやコンパイラじゃ無理なんで、実行ファイル作ったら余った所を0x00とかでfillして、最後16byteにこの辺のバイナリーを自力で書くと。
まぁ、それか、*.comや*.exeファイルを、*.wscのROMイメージに変換するソフト作るか。
自分は、small-modelの*.exe実行ファイルを、*.wscに変換するソフト作りました。

セグメントの管理は、MS-DOSとかと違うので、compact-modelや、large-modelはWonderSwanじゃ駄目だと思う。
*.exeってその辺の実行ファイルが64kByteを超えるモデルだと、セグメント間far call/far jump命令のアドレスを、実行時に解決しないといけないし。
まぁ・・・、Wonder SwanにMS-DOSを移植すれば大丈夫なんだけど。
同じ8086系CPUだし!!
・・・flat-model!? Wonder Swanは、16bitデスヨ??


PC98や、AT互換機と違うのは、WonderSwanには、バンクセレクトという概念が有る事で、実メモリ空間が、そのへんのパソコンと違っている事。

0x00000~0x03FFF 本体内のRAM(モノクロWonder Swan)
0x04000~0x0FFFF Wonder Swan Color 以降の、本体RAM
※本体RAMは、V-RAMも兼ねている。

0x10000~0x1FFFF カートリッジ内のS-RAM
0x20000~0x2FFFF カートリッジ内のROM Bank 1
0x30000~0x3FFFF カートリッジ内のROM Bank 2
0x40000~0xFFFFF カートリッジ内のROM

ROM Bank1,2 は、初期はROMの一番最後64Kbyteが配置されている。
0x40000~0xFFFFFは、ROMの一番最後が配置。

ROM容量が 128kByteだったら、ROMの0x000000~0x01FFFF番地が、実機の0xE0000~0xFFFFF番地に配置される。

ROM容量が 16MByteだったら、ROMの0xF40000~0xFFFFFF番地が、実機の0x40000~0xFFFFFに配置されて、バンク切り替えして、それ以前のアドレスのROMにアクセスしなければならない。

上の通り、MS-DOSとは違った形で、64kByteの壁があるので、基本、small-modeでソフトを作成して、何らかのBIOS/OSを自作して、ファイルシステムを設計しないと、64kByteを超えるアプリケーション開発は難しいとおもう。

基本的に、メーカー製ゲームは、一番最後の64kbyteにBIOS/OSを設計してあって、ROM Bank 1 と ROM bank 2に実行したいコードがあるバンクを配置して、そのコードのアドレスをfar callしているようです。
BGM制御、効果音制御をするタイマー割り込みの割り込み先も、一番最後64Kbyteの所。
ROM Bankの所に割り込み先を配置したら・・・バンク切り替えしたら暴走するし。

とりあえず、自力でROMイメージを作っている例はありますので、参照。

拙作のWTD(Wonder Swan Total Sound Driver)の、以下のフォルダ
 WTD\DEVELOP\SRC\ROM_IMG\
 WTD\DEVELOP\SRC\WSMAK\

Wonder Swan、ラスタスクロール用ライブラリのサンプルフォルダ
 ROMイメージを自力で作っているサンプルと、Wonder Witch用のサンプルがあります。

自分が使っているのは、LSI-C86 for Wonder Witchなので、従来のLSI-C86とは仕様が違っているので注意です。
(WW版は、関数の引数がスタックに入ります。Turbo-CやMSの仕様です。)
(従来のLSI-C86は、引数がレジスタに入る。)
(また、従来のLSI-C86よりも、WonderSwan用にライブラリが特化している。)

WonderSwan関係

|

« オーボエ吹きの日記: やっぱり、できが違う! | トップページ | オケの練習 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/36969/46242134

この記事へのトラックバック一覧です: WonderSwan 開発環境:

« オーボエ吹きの日記: やっぱり、できが違う! | トップページ | オケの練習 »