README 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428
  1. Wonx - WonderWitch on X.
  2. ■ 配布に当たって
  3. Wonx はまだ不完全です.実装されていない機能や,不完全な機能,おかしな
  4. 動作をする部分などがいっぱいあります.
  5. バグ情報やアドバイスがあれば,作者の坂井弘亮まで,どんどんメールください.
  6. アドレスは,
  7. sakai@seki.ee.kagu.sut.ac.jp
  8. hsakai@pfu.co.jp
  9. です.
  10. また,坂井の気が向く限り,アップデートは随時行っていきます.
  11. http://www.seki.ee.kagu.sut.ac.jp/~sakai/WonderWitch/index.html
  12. で,随時公開していきます.
  13. 現在は坂井が一人で製作していますが,ひとりでは細かい点の整合性
  14. (初期化しなかった場合の動作の違いなど.WonderWitch と Wonx では
  15. 微妙に異なっている)を追いきれないのが現状です.
  16. とくにマニュアルに書いてない部分に関しては,WonderWitch ではどのように
  17. 動作するのか,ひとりではチェックしきれません.(ていうか面倒)
  18. 情報をお待ち(ていうか期待)しています.
  19. いっしょに少しずつ,完全なものに仕上げていきましょう.
  20. ご意見,ご要望なども歓迎します.どしどしお寄せください.
  21. (ただし,返事を書くとは限らないし,要望を反映するとも限りませんので
  22. その点はご容赦ください)
  23. ■ はじめに
  24. Wonx は,WonderWitch 用のプログラムを X アプリケーションとしてコンパイルする
  25. ための,ライブラリです.以下の特徴があります.
  26. ・C言語レベルで互換機能を持っているので,WonderWitch 用のプログラムを
  27. UNIX上でそのままコンパイルできる.(-lwonx でコンパイルする)
  28. ・UNIX上でデバッガを使用してデバッグできるようになる.(強力!)
  29. ・キャラクタデータやパレットデータのダンプ機能がある.
  30. ・不正な引数の値や,パレットやキャラクタを初期化しないで使用するなどを
  31. 厳しくチェックし,エラーを出力する(ようにする).厳しくエラーチェックする.
  32. ・使用できない機能(関数は用意してあるが,まだ実装してなかったり,
  33. 実装が困難だったりして,中身が空のもの)はたくさんある.
  34. 徐々に追加していくつもり.
  35. ・ゲームの画面写真が簡単に撮れる.(デジカメで撮ったり,画像取り込み用の
  36. プログラムを使ったりする必要が無くなる) これはわりとべんり.
  37. ・エミュレータでなくライブラリであり,ソースコード公開しているので,
  38. 自由にカスタマイズが可能.
  39. ・描画速度は遅いが,デバッグ目的のためなので,速度を速くすることは
  40. あまり考えていない.(それよりも上記のデバッグ性を優先する)
  41. ・WonderWitch 用のプログラムを,X上で楽しむためのものではない.
  42. また,エミュレーションが目的なのではない.
  43. あくまでデバッグ目的のもの.(そういうポリシーで開発を進める)
  44. 従って,WonderWitch での動作を模倣することよりも,デバッグ情報を
  45. 出力することや改造のしやすさを優先したような実装をする場合がある.
  46. ■ 3分wonx
  47. とりあえず,どんなものか見てみたいことでしょう.そんな人は,
  48. サンプルプログラムをコンパイル・実行してみましょう.
  49. 以下のようにしてみてください.
  50. ~>% tar xvzf wonx.tgz
  51. (中略)
  52. ~>% cd wonx
  53. ~/wonx>% make sample1
  54. (中略)
  55. ~/wonx>% ./sample1
  56. ウインドウが開いて,標準出力にメッセージが出力されます.
  57. スペース・バーを押すと,終了します.
  58. ~/wonx>% make sample2
  59. (中略)
  60. ~/wonx>% ./sample2
  61. カーソルキーの上下で,キャラクタを移動します.
  62. スペース・バーを押すと,終了します.
  63. ~/wonx>% more sample1.c
  64. ~/wonx>% more sample2.c
  65. で,サンプルプログラムのリストを見てみましょう.
  66. 次に,WonderWitch 用のゲーム,"SpeedMac" をコンパイル・実行してみます.
  67. ~/wonx>% make smac
  68. (中略)
  69. ~/wonx>% cd smac
  70. ~/wonx/smac>% ./smac
  71. ウインドウが開いて,標準出力にメッセージが出力されます.
  72. いったん p を押して画面描画を OFF にします.しばらくしたら
  73. (メッセージの内容が変わったら) p を押して再び画面表示を ON にすると,
  74. smac のタイトル画面が表示されます.
  75. ここでスペースを押して,さらにまた p で画面表示を OFF にして,
  76. しばらくしたら(メッセージの内容が変わったら) p で画面表示を ON にします.
  77. どうですか? SpeedMac のゲーム画面が表示されているでしょうか?
  78. カーソルキーで移動,スペースキーで射撃です.
  79. ただし,キー入力はキー入力用関数が呼ばれたときしか有効ではないので,
  80. キーは反応するまで長めに押してください.
  81. p を押して頻繁に描画の ON, OFF を切替えるのは,描画が非常に遅いため,
  82. ONのままだと画面クリアとかに異常に時間がかかるからです.
  83. ■ Wonx 概要
  84. Wonx は,WonderWitch の display_control() とか display_status() といった
  85. 関数(BIOS に対するシステムコール)と代替の関数を持っています.
  86. これらの関数は,X上にウインドウを開いて,そこで WonderWitch と互換の動作を
  87. するように書いてあります.
  88. Wonx を make すると,libwonx.a というライブラリができます.
  89. で,WonderWitch 用のプログラムを,UNIX 上で -lwonx してコンパイルしてやれば,
  90. WonderWitch の display_control() とかのかわりに,Wonx の display_control() が
  91. リンクされ,X 上で動作するようになる,という仕組みです.
  92. ■ ヘッダファイルについて
  93. Wonx は,UNIXシステム上にある libc を使用します.つまり,/usr/include の
  94. 下を include します.
  95. また,WonderWitch には,sys/types.h などといったヘッダファイルがあります.
  96. よって,WonderWitch のヘッダファイル構成をそのまま Wonx に引き継ぐと,
  97. Wonx のヘッダファイルと UNIX のヘッダファイルがコンフリクトする
  98. 可能性が出てきます.
  99. (たとえば,WonderWitch の sys/types.h と /usr/include/sys/types が
  100. コンフリクトする,などです)
  101. これは,WonderWitch用のアプリケーションをコンパイルするときに,要注意です.
  102. コンパイルがうまくとおらないという障害の原因は,ほとんどがこのような,
  103. 「ヘッダファイルのコンフリクトもしくは誤認」に起因しています.
  104. 対策として,Wonx では wonx_include というディレクトリの下にヘッダファイルを
  105. 格納してあります.(本当は sys というディレクトリにしたかったが,
  106. 上記の対策のため,このようにした)
  107. WonderWitch 用プログラム中の,
  108. #include <sys/types.h>
  109. のような部分は,すべて,
  110. #include <wonx_include/types.h>
  111. のように修正する必要があります.
  112. (stdio.h や stdlib.h は,UNIX システム付属のものを使用するので,
  113. そのままでかまいません)
  114. (ただし,コンフリクトしないという絶対の自信があるなら,この限りではありません)
  115. WonderWitch のプログラムの,#include <sys/*.h> は,すべて
  116. #include <wonx_include/*.h> に修正する必要がある,ということです.
  117. (これをまとめて行うための perl スクリプトを添付してあります.
  118. sys2wonx.pl *.[ch] を実行すると,ごっそりと書き換えてくれます)
  119. また,UNIXシステムによっては,/usr/include/sys/types.h で ushort, ulong を
  120. 定義しているものといないものがあります.よって,コンパイル中に
  121. ulong が2重定義されているとおこられる場合があります.
  122. このあたりの微調整には,wonx_include 以下のファイルを直接修正して
  123. 調整してください.wonx_include/system_configure.h を修正することにより,
  124. 調整できるようになってます.
  125. ■ Wonx のコンパイル
  126. まず Wonx をコンパイルして,libwonx.a を作成する必要があります.
  127. Wonx のコンパイルは,以下の手順で行います.
  128. 1. Wonx を展開する.
  129. ~>% tar xvzf wonx.tar.gz
  130. ~>% cd wonx
  131. ~/wonx>%
  132. 2. Wonx を make する.
  133. ~/wonx>% make
  134. gcc -c WWCharacter.c -O -I. -I/usr/X11R6/include
  135. gcc -c WWColorMap.c -O -I. -I/usr/X11R6/include
  136. ...(中略)...
  137. gcc -c wonx.c -O -I. -I/usr/X11R6/include
  138. ar ruc libwonx.a WWCharacter.o WWColorMap.o WWDisplay.o WWLCDPanel.o WWPalette.o WWScreen.o WWSprite.o WonxDisplay.o XDisplay.o disp.o text.o key.o system.o timer.o etc.o wonx.o
  139. ~/wonx>% ls lib*
  140. libwonx.a
  141. ~/wonx>%
  142. ここまでで,ライブラリの作成は終りです.
  143. ■ WonderWitch 用アプリケーションのコンパイル
  144. 次に,Wonx の利用の例として,拙作の SpeedMac という WonderWitch 用の
  145. ゲームをコンパイルしてみます.
  146. (SpeedMac はサンプルプログラムとして,Wonx に標準添付してあります)
  147. SpeedMac は WonderWitch 用のゲームプログラムです.本来は WonderWitch を
  148. 使用してコンパイルし,WonderSwan 上でゲームを楽しむためのものです.
  149. 今回は例として,SpeedMac に Wonx をリンクして,X 上で動作する SpeedMac の
  150. 実行形式を作成してみます.
  151. 1. 展開する.
  152. ~/wonx>% unzip smac-b02.zip
  153. ...(中略)...
  154. ~/wonx>% cd smac-b02
  155. ~/wonx/smac-b02>%
  156. 2. ヘッダファイルと libwonx.a をコピーする.
  157. ~/wonx/smac-b02>% cp -R ../wonx_include .
  158. ~/wonx/smac-b02>% cp ../libwonx.a .
  159. ~/wonx/smac-b02>%
  160. 3. makefile を修正する.
  161. ~/wonx/smac-b02>% emacs makefile
  162. 以下のように修正します.
  163. ・gcc でコンパイルをするように修正する.このときに,コンパイルオプションに,
  164. -I. -L. -L/usr/X11R6/lib -lwonx -lX11 -lXt
  165. を追加する.
  166. (必要なら,-g も追加する)
  167. ・mkfent によるファイルのコンバートなどがあったら,削除する.
  168. 修正後の makefile を添付してあるので,面倒なかたは手で編集するかわりに,
  169. ~/wonx/smac-b02>% mv makefile makefile.orig
  170. ~/wonx/smac-b02>% cp ../makefile_for_smac ./makefile
  171. のようにしてコピーしてください.
  172. 4. ソースを修正する.
  173. ~/wonx/smac-b02>% emacs chara.c
  174. ~/wonx/smac-b02>% emacs dsp.c
  175. ... (ファイルをひとつひとつ修正する)
  176. ソース中の,
  177. #include <sys/disp.h>
  178. #include <sys/key.h>
  179. のような部分を,
  180. #include "wonx_include/disp.h"
  181. #include "wonx_include/key.h"
  182. のように修正します.
  183. これをまとめてやるための perl スクリプト (sys2wonx.pl) を添付してあるので,
  184. 面倒なかたは,
  185. ~/wonx/smac-b02>% cp ../sys2wonx.pl .
  186. ~/wonx/smac-b02>% ./sys2wonx.pl *.[ch]
  187. のようにしてください.
  188. (sys2wonx.pl は,引数で指定したファイル自体を書き換えてしまうので注意)
  189. 5. make する.
  190. ~/wonx/smac-b02>% make
  191. gcc -c chara.c -g -I.
  192. gcc -c game.c -g -I.
  193. ...(中略)...
  194. gcc -c main.c -g -I.
  195. gcc -g -o smac chara.o game.o man.o mansub.o mansub2.o map.o mapsub.o menu.o monster.o picture.o player.o smac.o stage.o dsp.o etc.o main.o -lwonx -lX11 -lXt -L. -L/usr/X11R6/lib
  196. ~/wonx/smac-b02>% ls smac
  197. smac
  198. ~/wonx/smac-b02>%
  199. 6. smac を起動する.
  200. ~/wonx/smac-b02>% ./smac
  201. と,ここまでけっこう面倒ですが,実は,
  202. ~/wonx>% make smac
  203. すると,これらの作業を全部やってくれるようになってます.
  204. ■ 操作
  205. smac を起動すると,ウインドウが開きます.また,ターミナルには,
  206. 以下のデバッグ用の情報が表示されます.
  207. ・WonderWitch の代替関数が呼ばれると,引数と戻り値を表示します.
  208. またここでは,以下の操作が行えます.
  209. ・カーソルキーが,WonderSwan のX1~X4ボタンに対応している.
  210. ・i,j,k,l キーが,WonderSwan のY1~Y4ボタンに対応している.
  211. ・スペースバーと左シフトキーが,A,Bボタンに対応している.
  212. ・sキーが,STARTボタンに対応している.
  213. ・p を押すと,表示/非表示モードを切替える.
  214. (非表示だと画面への描画を行わないが高速)
  215. ・F1 を押すと,LCDカラーマップのデータをダンプ出力する.
  216. ・F2 を押すと,パレットのデータをダンプ出力する.
  217. ・F3 を押すと,キャラクターのデータをダンプ出力する.
  218. ・F4 を押すと,スプライトのデータをダンプ出力する.
  219. デフォルトではなにか関数が呼ばれるたびに画面の再描画を行うため,
  220. 非常に低速です.
  221. たとえば,以下のようなことをやっていると,非常に低速になります.
  222. /* 画面のクリア */
  223. for (y = 0; y < 32; y++)
  224. for (x = 0; x < 32; x++) {
  225. screen_fill_char(0, x, y, 1, 1, 0x0000); /* ここで毎回再描画される */
  226. }
  227. }
  228. このような場合は,p を押して非表示モードにして,ループ処理が終ったら
  229. 再び p を押して表示モードに戻してください.
  230. F1 や F2 を押すと,データをダンプ出力するのですが,標準ではその他にも
  231. メッセージが大量に出力されているので,ふつうに F1 を押しただけでは,
  232. あっというまに大量のメッセージに流されてしまうことがあります.
  233. このようなときは,以下のようにして起動します.たとえばコンパイルして
  234. smac という実行形式ができているのなら,
  235. > smac | grep -v call
  236. もしもキャラクタ番号10番のキャラクタのデータだけが見たい場合には,
  237. 以下のように実行してから,F3 キーを押せば良いでしょう.
  238. > smac | grep "character\[10\]"
  239. wonx は,メッセージを出力する際に,grep でフィルタリングできるように,
  240. かならず出力メッセージの先頭に,統一性のある文字列を追加しています.
  241. たとえば,関数呼び出し時に表示されるメッセージには,先頭に必ず
  242. "call" という文字列が追加されてます.よって,grep -v call を通せば,
  243. 関数呼び出しのメッセージがごっそり出なくなる,というようになってます.
  244. 標準では大量のメッセージが出てくるので,grep をうまく使うようにしてください.
  245. もしくは,
  246. > smac | grep call > function_call.log
  247. のようにして,ログをとるのも有効でしょう.
  248. > smac > /dev/null
  249. だと,文字列を kterm などに表示しないぶん,高速になります.
  250. ■ 足りないもの
  251. 以下のものにはまだ対応してません.したがって,例えばサウンド関連の
  252. 関数を呼び出しても,何も起こりません.(空の関数になっている)
  253. ・サウンド
  254. ・シリアル通信
  255. ・その他いっぱい
  256. ■ 注意しなければならないこと
  257. Wonx は,本来は WonderWitch 用として書かれた(もしくは,書かれる)プログラムを,
  258. UNIX 上でコンパイル・リンクするためのライブラリであり,ハードウエアを
  259. エミュレートするものではありません.
  260. ですから,WonderWitch と UNIX 上のC言語のギャップのため,気をつけなければ
  261. ならないことがいくつかあります.これらは Wonx の性質上,仕方の無いことです.
  262. 以下のことは,意識することと,きれいなプログラムを書くことで,
  263. かなり回避できると思います.(short int にすべきところでは,省略せずに
  264. ちゃんと short int と明示するとか)
  265. まあ,Wonx の目的は論理的なバグを早い段階で無くすことにあるので,このへんは
  266. そういうものだと割り切って使ってください.
  267. Wonx を使う限り,なるべく機種依存を無くすように心がけましょう.
  268. (とくに int のサイズにあまり依存しないようにしましょう)
  269. [コンパイルの問題]
  270. 先にも書きましたが,コンパイルできないという障害が出たら,原因はたいていは
  271. ヘッダファイルのコンフリクトです.とくに,WonderWitch で sys 以下の
  272. ファイルをインクルードしている場合は注意してください.
  273. ushort, ulong などは,sys/types.h で定義されているシステムもあるし,
  274. そうでないシステムもあります.このへんは,wonx_include/system_configure.h で
  275. 調整してください.
  276. (FreeBSD では ushort のみ定義されているが,RedHat Linux では,
  277. uchort, ulong ともに定義されているので,そのままだとコンパイル中に
  278. 2重定義のワーニングが出ます)
  279. [int 型の扱い]
  280. WonderWitch では sizeof(short int) == sizeof(int) < sizeof(long int) ですが,
  281. UNIX ではふつう sizeof(short int) < sizeof(int) == sizeof(long int) です.
  282. このことは,int 型を単なるカウンタとして使用するような場合には問題に
  283. なりませんが,ビットマップの格納場所として使用するようなときには,
  284. 問題になります.
  285. 一番問題になりやすいのは,キャラクタのビットマップを扱う場合です.
  286. font_set_colordata()などは,16*8 バイトのキャラクタデータを
  287. short int 型の配列として引数に持ちます.WonderWitch では
  288. sizeof(short int) == sizeof(int) なので,WonderWitch 用のプログラム上では,
  289. キャラクタデータを short int とせずに,int 型の配列として定義してしまう
  290. ことが考えられます.(当然 WonderWitch ならば問題は無いが,UNIX 上で
  291. 実行したら,キャラクタに妙な縞々が入るだろうと思われる)
  292. このような場合には,UNIX 上でコンパイルするときには,short int に
  293. 修正する必要があります.
  294. [エンディアンの問題]
  295. WonderWitch の CPU は x86系です.SPARC などで使用する場合には,
  296. エンディアンに注意する必要があります.
  297. font_set_colordata()などは,short int 型の配列でキャラクタデータを受け取る
  298. ので,char * で定義したキャラクタデータを short int * にキャストして
  299. font_set_colordata()に渡すなどのことをしていると,画像がひっくり返る
  300. ことが考えられます.
  301. i386 系の PC-UNIX ならば,おそらく問題は無いでしょう.
  302. [割り込みの問題]
  303. WonderWitch にはタイマ割り込みがありますが,Wonx の動作は非常に遅いため,
  304. WonderWitch の時間単位をそのまま UNIX に持ってきたら,割り込みが
  305. かかりっぱなしになってしまいます.よってタイマ割り込みの時間単位は,
  306. WonderWitch よりもかなり大きめにしてあります.
  307. これは,wonx_configure.h で調整できます.
  308. 割り込みハンドラの中で,非常に時間のかかる画面描画などをしている
  309. 場合には,割り込みの時間単位を大きくしてください.でないと,ハンドラから
  310. 戻った瞬間にまたハンドラが呼ばれて,全然実行が先に進まない,ということに
  311. なり得ます.
  312. [キー入力について]
  313. キー入力は,キー入力用関数が呼ばれたときのみ感知するので,長めに押してないと
  314. 反応しないことがあります.
  315. 反応しないからといってなんども押すのでなく,1回を長く確実に押すように
  316. してください.
  317. ■ 作者
  318. Wonx は,坂井弘亮がその大部分を往復3時間の通勤電車の中で Libretto で書いた,
  319. 「電車ソフトウエア」です.GPLで配布します.
  320. 作者については,添付の OMAKE.jpn を参照してください.
  321. 坂井弘亮の連絡先のメールアドレスは,
  322. sakai@seki.ee.kagu.sut.ac.jp
  323. hsakai@pfu.co.jp
  324. です.また,本ソフトウエアの最新版を,
  325. http://www.seki.ee.kagu.sut.ac.jp/~sakai/WonderWitch/index.html
  326. で配布しています.
  327. 以下はミラーサイトです.
  328. http://hp.vector.co.jp/authors/VA014157/index.html
  329. http://www.people.or.jp/~hsakai/index.html
  330. ミラーサイトは,坂井が気が向いたときにアップデートするので,常に最新,
  331. というわけではありません.あくまでバックアップ用です.
  332. ■ このファイルはここまで