Hiroaki Sakai d1cde9116a Added dump of RGB value when dumping palette data.
Fixed a part of the data dump part.

Changed the line of perl script from / usr / bin / perl to / usr / local / bin / perl.
(On FreeBSD, Japanese perl is in / usr / local / bin)

For disp.c, libwwc.c, a function for reading and acquiring bitmap data of characters,
The type of bitmap data is not unsigned char *, but instead of short int *, long int *
It was modified to an appropriate type.
Let the bitmap of the WWCharacter class be union of uchar, ushort, ulong,
By accessing with an appropriate type in WWCharacter_GetPixel ()
The endian dependence of bitmap data is eliminated.  (i386, confirmed by SPARC)

Fixed how to get the value of WWCharacter_GetPixel () in 16 PACKED color mode.
(The bug that the character was displayed inverted horizontally was resolved)

Stop for 10 seconds at F11, forcibly end with Ctrl-c or F12,
Added iconization with Ctrl-i.  (It was a function that was originally, but I forgot that,
We modified it somewhat to make it formal support)

Move display / non-display change key from p to F10.  Manual correction.

XDisplay.c: generated with XColorGC_CreateFromRGB () with XDisplay_DrawLCDWindow ()
Since we did not Destroy () the XColorGC object, we made a bug that caused memory flow
Fix.  (XColorGC_Destroy (x_color_gc) addition)

Add wonx_include / fcntl.h.  The contents are / usr / include / fcntl.h,
Just include /usr/include/sys/fcntl.h.

Format change of serial output message (output to serial port:).
(I tried to enclose it with "".)
etc.c: wonx_print_character () Fixed.  (Add \ ", \ \ and others)
Fix sout2str.pl.  (Add \ ", \ \ etc .... The above message for serial output
It was modified according to format change)

Added int2sint.pl, filters.pl, challsrc.sh.
Change sys2wonx.pl.

in wonx_include / types.h
typedef unsigned short WORD;
typedef unsigned long DWORD;
To
typedef unsigned short int WORD;
typedef unsigned long int DWORD;
change to.

Fixed README.

Version 2.1 - from wonx-2.1.tar.gz
2018-03-07 23:07:23 +00:00
2000-09-26 12:00:00 +09:00
2018-03-07 23:07:04 +00:00
2018-03-07 23:07:04 +00:00
2018-03-07 23:07:04 +00:00
2018-03-07 23:07:04 +00:00
2018-03-07 23:07:04 +00:00
2018-03-07 23:07:04 +00:00
2018-03-07 23:07:04 +00:00
2018-03-07 23:07:04 +00:00
2018-03-07 23:07:04 +00:00
2018-03-07 23:07:04 +00:00
2000-09-26 12:00:00 +09:00
2018-03-07 23:07:04 +00:00
2018-03-07 23:07:04 +00:00
2018-03-07 23:07:04 +00:00
2000-09-26 12:00:00 +09:00
2018-03-07 23:07:04 +00:00
2018-03-07 23:07:04 +00:00

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

WonX - WonderWitch on X.

■ 配垃に圓たっお

ご意芋ご芁望など歓迎したすどしどしお寄せください
バグ情報やアドバむスがあれば䜜者の坂井匘亮たでどんどんメヌルください
アドレスは
sakai@seki.ee.kagu.sut.ac.jp
hsakai@pfu.co.jp
です
(ただし返事を曞くずは限らないし芁望を反映するずも限りたせんので
 その点はご容赊ください)
たた坂井の気が向く限りアップデヌトは随時行っおいきたす
http://www.seki.ee.kagu.sut.ac.jp/~sakai/WonderWitch/index.html
で随時公開しおいきたす

■ はじめに

WonX はWonderWitch 甚のプログラムを X アプリケヌションずしおコンパむルする
ためのラむブラリです以䞋の特城がありたす

・C蚀語レベルで互換機胜を持っおいるのでWonderWitch 甚のプログラムを
  UNIX䞊でそのたたコンパむルできる(-lwonx でコンパむルする)
・UNIX䞊でデバッガを䜿甚しおデバッグできるようになる(匷力!)
・キャラクタデヌタやパレットデヌタのダンプ機胜がある
・䞍正な匕数の倀やパレットやキャラクタを初期化しないで䜿甚するなどを
  厳しくチェックし゚ラヌを出力する(ようにする)厳しく゚ラヌチェックする
・䜿甚できない機胜(関数は甚意しおあるがただ実装しおなかったり
  実装が困難だったりしお䞭身が空のもの)はたくさんある
  埐々に远加しおいく぀もり
・ゲヌムの画面写真が簡単に撮れる(デゞカメで撮ったり画像取り蟌み甚の
  プログラムを䜿ったりする必芁が無くなる) これはわりずべんり
・゚ミュレヌタでなくラむブラリであり゜ヌスコヌド公開しおいるので
  自由にカスタマむズが可胜
・描画速床は遅いがデバッグ目的のためなので速床を速くするこずは
  あたり考えおいない(それよりも䞊蚘のデバッグ性を優先する)
・WonderWitch 甚のプログラムをX䞊で楜しむためのものではない
  たた゚ミュレヌションが目的なのではない
  あくたでデバッグ目的のもの(そういうポリシヌで開発を進める)
  埓っおWonderWitch での動䜜を暡倣するこずよりもデバッグ情報を
  出力するこずや改造のしやすさを優先したような実装をする堎合がある

■ 必芁なもの

WonX では以䞋のものを䜿甚しおいたす

・perl
  (WonderWitch甚゜ヌスコヌド → WonX甚゜ヌスコヌドの倉換甚 perl スクリプトを
   添付しおいるのでWonderWitch甚゜ヌスコヌドの䞭に挢字が入っおいるのならば
   日本語 perl が望たしい)
  添付の perl スクリプトはすべお #!/usr/local/bin/perl になっおいるので
  日本語 perl が別のずころにあるばあいには修正しおから䜿甚しおください
  日本語 perl が無ければたあふ぀うの perl でもたぶん倧䞈倫でしょう
・qkc
  挢字コヌド倉換改行コヌド倉換に必芁
  (nkf でもべ぀にいいんだけどqkc だず改行コヌドも倉換しおくれるので
   この文曞では qkc を䜿甚しおいたす)
  qkc は以䞋のサむトから入手できたす
  http://hp.vector.co.jp/authors/VA000501/index.html
  qkc にはMS-DOS 版Windows 版UNIX 版などがありたすので
  UNIX 版(qkcc100.zip)を入手しおください
  コンパむルはmake するだけなのでずっおも簡単です
・unzip
  添付の smac-b02.zip, wwterm-b05.zip を解凍するのに必芁

このマニュアルは以䞊のものがすべおむンストヌルされおいるこずを前提ずしお
説明を進めたす必芁ならばむンストヌルするか他のアプリケヌションで
代甚しおください

■ 3分WonX

ずりあえずどんなものか芋おみたいこずでしょうそんな人は
サンプルプログラムをコンパむル・実行しおみたしょう
以䞋のようにしおみおください

~>% tar xvzf wonx-x.x.tar.gz
(äž­ç•¥)
~>% cd wonx

~/wonx>% make sample1
(äž­ç•¥)
~/wonx>% ./sample1

りむンドりが開いお暙準出力にメッセヌゞが出力されたす
スペヌス・バヌを抌すず終了したす

~/wonx>% make sample2
(äž­ç•¥)
~/wonx>% ./sample2

カヌ゜ルキヌの䞊䞋でキャラクタを移動したす
スペヌス・バヌを抌すず終了したす

~/wonx>% more sample1.c
~/wonx>% more sample2.c

でサンプルプログラムのリストを芋おみたしょう

次にWonderWitch 甚のゲヌム"SpeedMac" をコンパむル・実行しおみたす

~/wonx>% make smac
(äž­ç•¥)
~/wonx>% cd smac
~/wonx/smac>% ./smac

りむンドりが開いお暙準出力にメッセヌゞが出力されたす
いったん F10 を抌しお画面描画を OFF にしたすしばらくしたら
(メッセヌゞの内容が倉わったら) F10 を抌しお再び画面衚瀺を ON にするず
smac のタむトル画面が衚瀺されたす
ここでスペヌスを抌しおさらにたた F10 で画面衚瀺を OFF にしお
しばらくしたら(メッセヌゞの内容が倉わったら) F10 で画面衚瀺を ON にしたす
どうですか SpeedMac のゲヌム画面が衚瀺されおいるでしょうか
カヌ゜ルキヌで移動スペヌスキヌで射撃です
ただしキヌ入力はキヌ入力甚関数が呌ばれたずきしか有効ではないので
キヌは反応するたで長めに抌しおください
F10 を抌しお頻繁に描画の ON, OFF を切替えるのは描画が非垞に遅いため
ONのたただず画面クリアずかに異垞に時間がかかるからです

最埌にWonderWitch 甚の端末゚ミュレヌタ "WWTerm" をコンパむル・実行
しおみたす

~/wonx>% make wwterm
(äž­ç•¥)
~/wonx>% cd wwterm
~/wonx/wwterm>% ./terminal

■ 10分WonX

次になにかあなたが䜜った WonderWitch 甚のプログラムを WonX 䜿っお
コンパむル・リンクしおX Window System 䞊で動䜜するような実行圢匏を
䜜っおみたしょう

たずWonX を展開しおmake しおくださいlibwonx.a ができあがりたす

~>% tar xvzf wonx-x.x.tar.gz
(äž­ç•¥)
~>% cd wonx
~/wonx>% make
(äž­ç•¥)
~/wonx>% ls libwonx.a
libwonx.a
~/wonx>% 

次にlibwonx.a ずwonx_include ディレクトリず
challsrc.sh, filters.pl, sys2wonx.pl, int2sint.pl をあなたの䜜ったプログラムの
ディレクトリ(ここでは䟋ずしおyoursample ずしたす)にコピヌしたす

~/wonx>% cp -R libwonx.a wonx_include ../yoursample
~/wonx>% cp challsrc.sh filters.pl sys2wonx.pl int2sint.pl ../yoursample
~/wonx>% cd ../yoursample
~/yoursample>% 

*.C ずいうファむル名のファむルがあったら*.c に倉曎したす
(*.C だず C++ のプログラムだず思われおしたうので)

~/yoursample>% mv SAMPLE2.C sample2.c

あなたの䜜ったプログラムのすべおのファむルに察しお以䞋のこずを行いたす
・MS-DOS テキスト圢匏から UNIX のテキスト圢匏に倉換する
  (぀たり改行コヌドを \r\n から \n に倉換しお挢字コヌドを SJIS から
   EUC に倉換したす)
・プログラム䞭の #include <sys/disp.h> のようなのを
  #include "wonx_include/disp.h" に倉曎する(sys2wonx.pl を通す)
・デフォルトの int をshort int に倉換する(int2sint.pl を通す)
これらのフィルタをたずめお通しおくれる filters.pl ずいうスクリプトを
添付しおあるので以䞋のようにしおすべおの゜ヌスファむルに察しお
必芁なフィルタを通しおください

~/yoursample>% ./filters.pl "qkc -e -u" ./sys2wonx.pl ./int2sint.pl -f *.[ch] [Mm]akefile* MAKEFILE*

もしくは以䞋のようにしおもよいです

~/yoursample>% ./challsrc.sh *.[ch] [Mm]akefile* MAKEFILE*

(泚意! filters.pl や challsrc.sh はファむルの本䜓を曞き換えおしたうので
 倉曎されるず困るようなファむルは必ずバックアップしおください)

makefile を以䞋のように修正する
・コンパむラには gcc を䜿甚する
・オブゞェクトファむルを *.obj から *.o に倉曎
・コンパむルフラグに -I. -L. -L/usr/X11R6/lib -lwonx -lX11 -lXt を远加
・mkfent などによる *.fx ファむルの䜜成などがあったらコメントアりトする

~/yoursample>% emacs makefile

おそらくmakefile の修正が番目に面倒です(䞀番面倒なのはWonX がうたく
適甚できなかったずきの゜ヌスの修正です)
添付の makefile_for_smac や makefile_for_wwterm を参考にしおmakefile を
修正しおください

最埌にmake をしたす

~/yoursample>% make

うたくいけば䞀撃でコンパむルが通っお実行できたす

~/yoursample>% ./sample

■ WonX 抂芁

WonX はWonderWitch の display_control() ずか display_status() ずいった
関数(BIOS に察するシステムコヌル)ず代替の関数を持っおいたす
これらの関数はX䞊にりむンドりを開いおそこで WonderWitch ず互換の動䜜を
するように曞いおありたす

WonX を make するずlibwonx.a ずいうラむブラリができたす
でWonderWitch 甚のプログラムをUNIX 䞊で -lwonx しおコンパむルしおやれば
WonderWitch の display_control() ずかのかわりにWonX の display_control() が
リンクされX 䞊で動䜜するようになるずいう仕組みです

■ ヘッダファむルに぀いお

WonX はUNIXシステム䞊にある libc を䜿甚したす぀たり/usr/include の
䞋を include したす
たたWonderWitch にはsys/types.h などずいったヘッダファむルがありたす
よっおWonderWitch のヘッダファむル構成をそのたた WonX に匕き継ぐず
WonX のヘッダファむルず UNIX のヘッダファむルがコンフリクトする
可胜性が出おきたす
(たずえばWonderWitch の sys/types.h ず /usr/include/sys/types が
 コンフリクトするなどです)
これはWonderWitch甚のアプリケヌションをコンパむルするずきに芁泚意です
コンパむルがうたくずおらないずいう障害の原因はほずんどがこのような
「ヘッダファむルのコンフリクトもしくは誀認」に起因しおいたす

察策ずしおWonX では wonx_include ずいうディレクトリの䞋にヘッダファむルを
栌玍しおありたす(本圓は sys ずいうディレクトリにしたかったが
䞊蚘の察策のためこのようにした)
WonderWitch 甚プログラム䞭の
#include <sys/types.h>
のような郚分はすべお
#include <wonx_include/types.h>
のように修正する必芁がありたす
(stdio.h や stdlib.h はUNIX システム付属のものを䜿甚するので
 そのたたでかたいたせん)
(ただしコンフリクトしないずいう絶察の自信があるならこの限りではありたせん)
WonderWitch のプログラムの#include <sys/*.h> はすべお
#include <wonx_include/*.h> に修正する必芁があるずいうこずです
(これをたずめお行うための sys2wonx.pl ずいう perl スクリプトを添付しお
 ありたす./filters.pl ./sys2wonx.pl -f *.[ch] を実行するずごっそりず
 曞き換えおくれたす)

たたUNIXシステムによっおは/usr/include/sys/types.h で ushort, ulong を
定矩しおいるものずいないものがありたすよっおコンパむル䞭に
ulong が重定矩されおいるずおこられる堎合がありたす
このあたりの埮調敎にはwonx_include 以䞋のファむルを盎接修正しお
調敎しおくださいwonx_include/system_configure.h を修正するこずにより
調敎できるようになっおたす

■ WonX のコンパむル

たず WonX をコンパむルしおlibwonx.a を䜜成する必芁がありたす
WonX のコンパむルは以䞋の手順で行いたす

1. WonX を展開する

~>% tar xvzf wonx-x.x.tar.gz
~>% cd wonx
~/wonx>% 

2. WonX を make する

~/wonx>% make
gcc -c WWCharacter.c -O -I. -I/usr/X11R6/include
gcc -c WWColorMap.c -O -I. -I/usr/X11R6/include
...(äž­ç•¥)...
gcc -c wonx.c -O -I. -I/usr/X11R6/include
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
~/wonx>% ls lib*
libwonx.a
~/wonx>% 

ここたででラむブラリの䜜成は終りです

■ WonderWitch 甚アプリケヌションのコンパむル

次にWonX の利甚の䟋ずしお拙䜜の SpeedMac ずいう WonderWitch 甚の
ゲヌムをコンパむルしおみたす
(SpeedMac はサンプルプログラムずしおWonX に暙準添付しおありたす)
SpeedMac は WonderWitch 甚のゲヌムプログラムです本来は WonderWitch を
䜿甚しおコンパむルしWonderSwan 䞊でゲヌムを楜しむためのものです
今回は䟋ずしおSpeedMac に WonX をリンクしおX 䞊で動䜜する SpeedMac の
実行圢匏を䜜成しおみたす

1. 展開する

~/wonx>% unzip smac-b02.zip
...(äž­ç•¥)...
~/wonx>% cd smac-b02
~/wonx/smac-b02>% 

2. ヘッダファむルず libwonx.a をコピヌする

~/wonx/smac-b02>% cp -R ../wonx_include .
~/wonx/smac-b02>% cp ../libwonx.a .
~/wonx/smac-b02>% 

3. ゜ヌスを修正する

~/wonx/smac-b02>% emacs chara.c
~/wonx/smac-b02>% emacs dsp.c
... (ファむルをひず぀ひず぀修正する)

MS-DOS のファむル圢匏になっおいるファむルはUNIXのテキスト圢匏に
倉換したす具䜓的には以䞋の倉換をしたす
・改行コヌドを \r\n から \n にする
・挢字コヌドを SJIS から EUC にする
qkc ずいうアプリケヌションで䞊蚘のこずを䞀床に行うこずができたす
面倒なかたは以䞋のようにすればたずめお倉換されたす
~/wonx/smac-b02>% ./filters.pl "qkc -e -u" -f *.[ch]
qkc が無い人は... nkf ずかおきずうに䜿っお倉換しおください

たた゜ヌス䞭の
#include <sys/disp.h>
#include <sys/key.h>
のような郚分を
#include "wonx_include/disp.h"
#include "wonx_include/key.h"
のように修正したす

これをたずめおやるための perl スクリプト (sys2wonx.pl) を添付しおあるので
面倒なかたは
~/wonx/smac-b02>% cp ../filters.pl ../sys2wonx.pl .
~/wonx/smac-b02>% ./filters.pl ./sys2wonx.pl -f *.[ch]
のようにしおください
(filters.pl は匕数で指定したファむル自䜓を曞き換えおしたうので泚意)

さらにWonderWitch では sizeof(int) == sizeof(short int) ですが
UNIX ではふ぀うは sizeof(int) == sizeof(long int) なので
キャラクタのビットマップなどint 型のバむトサむズに䟝存する郚分で
int を䜿甚しおいる堎合にはshort int などず明瀺したす

これをたずめおやるための perl スクリプト (int2sint.pl) を添付しおあるので
面倒なかたは
~/wonx/smac-b02>% cp ../int2sint.pl .
~/wonx/smac-b02>% ./filters.pl ./int2sint.pl -f *.[ch]
のようにしおください
(filters.pl は匕数で指定したファむル自䜓を曞き換えおしたうので泚意)

日本語 perl は EUC コヌドでないず正垞に動䜜しないので
sys2wonx.pl や int2sint.pl を䜿甚する堎合にはたず先に qkc で挢字コヌドを
EUC に倉換しおからsys2wonx.pl や int2sint.pl を䜿甚しおください

4. makefile を修正する

~/wonx/smac-b02>% emacs makefile

以䞋のように修正したす

・挢字コヌドを EUC に改行コヌドを \r\n から \n に倉換する
  (改行コヌドを倉換しないず make が正垞に動䜜したせんqkc を通すず
   いいでしょう)
・gcc でコンパむルをするように修正するこのずきにコンパむルオプションに
  -I. -L. -L/usr/X11R6/lib -lwonx -lX11 -lXt
  を远加する
  (必芁なら-g も远加する)
・mkfent によるファむルのコンバヌトなどがあったら削陀する

修正埌の makefile を添付しおあるので面倒なかたは手で線集するかわりに

~/wonx/smac-b02>% mv makefile makefile.orig
~/wonx/smac-b02>% cp ../makefile_for_smac ./makefile

のようにしおコピヌしおください

5. make する

~/wonx/smac-b02>% make
gcc -c chara.c -g -I.
gcc -c game.c -g -I.
...(äž­ç•¥)...
gcc -c main.c -g -I.
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
~/wonx/smac-b02>% ls smac
smac
~/wonx/smac-b02>% 

6. smac を起動する

~/wonx/smac-b02>% ./smac

ずここたでけっこう面倒ですが実は

~/wonx>% make smac

するずこれらの䜜業を党郚やっおくれるようになっおたす

■ 操䜜

smac を起動するずりむンドりが開きたすたたタヌミナルには
以䞋のデバッグ甚の情報が衚瀺されたす

・WonderWitch の代替関数が呌ばれるず匕数ず戻り倀を衚瀺したす

たたここでは以䞋の操䜜が行えたす

・カヌ゜ルキヌがWonderSwan のX1X4ボタンに察応しおいる
・i,j,k,l キヌがWonderSwan のY1Y4ボタンに察応しおいる
・スペヌスバヌず巊シフトキヌがA,Bボタンに察応しおいる
・sキヌがSTARTボタンに察応しおいる
・F1 を抌すずLCDカラヌマップのデヌタをダンプ出力する
・F2 を抌すずパレットのデヌタをダンプ出力する
・F3 を抌すずキャラクタヌのデヌタをダンプ出力する
・F4 を抌すずスプラむトのデヌタをダンプ出力する
・F10 を抌すず衚瀺/非衚瀺モヌドを切替える
  (非衚瀺だず画面ぞの描画を行わないが高速)
・F11 で10秒間停止(画面写真をずるずきなどに利甚できる)
  (F11は短めに抌しおください長めに抌すず埩垰しなくなるようです)
・q もしくは Ctrl-c もしくは F12 で匷制終了
・Ctrl-i でアむコン化

デフォルトではなにか関数が呌ばれるたびに画面の再描画を行うため
非垞に䜎速です
たずえば以䞋のようなこずをやっおいるず非垞に䜎速になりたす

/* 画面のクリア */
for (y = 0; y < 32; y++)
  for (x = 0; x < 32; x++) {
    screen_fill_char(0, x, y, 1, 1, 0); /* ここで毎回再描画される */
  }
}

このような堎合はF10 を抌しお非衚瀺モヌドにしおルヌプ凊理が終ったら
再び F10 を抌しお衚瀺モヌドに戻しおください

F1 や F2 を抌すずデヌタをダンプ出力するのですが暙準ではその他にも
メッセヌゞが倧量に出力されおいるのでふ぀うに F1 を抌しただけでは
あっずいうたに倧量のメッセヌゞに流されおしたうこずがありたす
このようなずきは以䞋のようにしお起動したすたずえばコンパむルしお
smac ずいう実行圢匏ができおいるのなら

> smac | grep -v call

もしもキャラクタ番号10番のキャラクタのデヌタだけが芋たい堎合には
以䞋のように実行しおからF3 キヌを抌せば良いでしょう

> smac | grep "character\[010\]"

WonX はメッセヌゞを出力する際にgrep でフィルタリングできるように
かならず出力メッセヌゞの先頭に統䞀性のある文字列を远加しおいたす
たずえば関数呌び出し時に衚瀺されるメッセヌゞには先頭に必ず
"call" ずいう文字列が远加されおたすよっおgrep -v call を通せば
関数呌び出しのメッセヌゞがごっそり出なくなるずいうようになっおたす

暙準では倧量のメッセヌゞが出おくるのでgrep をうたく䜿うようにしおください
もしくは

> smac | grep call > function_call.log

のようにしおログをずるのも有効でしょう

> smac > /dev/null

だず文字列を kterm などに衚瀺しないぶん高速になりたす

■ 足りないもの

以䞋のものにはただ察応しおたせんしたがっお䟋えばサりンド関連の
関数を呌び出しおも䜕も起こりたせん(空の関数になっおいる)

・サりンド
・プロセス
・むンダむレクトラむブラリ

■ 泚意しなければならないこず

WonX は本来は WonderWitch 甚ずしお曞かれた(もしくは曞かれる)プログラムを
UNIX 䞊でコンパむル・リンクするためのラむブラリでありハヌドり゚アを
゚ミュレヌトするものではありたせん
ですからWonderWitch ず UNIX 䞊のC蚀語のギャップのため気を぀けなければ
ならないこずがいく぀かありたすこれらは WonX の性質䞊仕方の無いこずです

以䞋のこずは意識するこずずきれいなプログラムを曞くこずで
かなり回避できるず思いたす(ビットマップ操䜜などでshort int にすべき
ずころでは省略せずにちゃんず short int ず明瀺するずか)

たあWonX の目的は論理的なバグを早い段階で無くすこずず
論理的バグずハヌドがらみのバグを切り離しお原因を狭めるこずず
坂井が電車の䞭でも WonderWitch のプログラムを曞けるようにするこずにあるので
このぞんはそういうものだず割り切っお䜿っおください
WonX を䜿う限りなるべく機皮䟝存を無くすように心がけたしょう
(ずくに int のサむズにあたり䟝存しないようにしたしょう)

[コンパむルの問題]

先にも曞きたしたがコンパむルできないずいう障害が出たら原因はたいおいは
ヘッダファむルのコンフリクトですずくにWonderWitch で sys 以䞋の
ファむルをむンクルヌドしおいる堎合は泚意しおください
ushort, ulong などはsys/types.h で定矩されおいるシステムもあるし
そうでないシステムもありたすこのぞんはwonx_include/system_configure.h で
調敎しおください
(FreeBSD では ushort のみ定矩されおいるがRedHat Linux では
 uchort, ulong ずもに定矩されおいるのでそのたただずコンパむル䞭に
 重定矩のワヌニングが出たす)

[int 型の扱い]

WonderWitch では sizeof(short int) == sizeof(int) < sizeof(long int) ですが
UNIX ではふ぀う sizeof(short int) < sizeof(int) == sizeof(long int) です
このこずはint 型を単なるカりンタずしお䜿甚するような堎合には問題に
なりたせんがビットマップの栌玍堎所ずしお䜿甚するようなずきには
問題になりたす
䞀番問題になりやすいのはキャラクタのビットマップを扱う堎合です
(bmpcnv を䜿甚しおビットマップデヌタの出力が unsigned int bitmap = {
 のようになっおいる堎合など)
font_set_colordata()などは16*8 バむトのキャラクタデヌタを
short int 型の配列ずしお匕数に持ちたすWonderWitch では
sizeof(short int) == sizeof(int) なのでWonderWitch 甚のプログラム䞊では
キャラクタデヌタを short int ずせずにint 型の配列ずしお定矩しおしたう
こずが考えられたす(圓然 WonderWitch ならば問題は無いがUNIX 䞊で
実行したらキャラクタに劙な瞞々が入るだろうず思われる)
このような堎合にはUNIX 䞊でコンパむルするずきにはコンパむラオプションで
デフォルトの int は short int になるように指定するかもしくは゜ヌス䞭の
int を short int にじかに修正する必芁がありたすi386 䞊で gcc を䜿甚する
堎合にはこのようなコンパむラオプションは無いのでじかに゜ヌスを修正する
こずになりたす
int2sint.pl を通すず明瀺されおいない int はすべお short int に倉換したすが
もしもあなたが int2sint.pl が信甚できなければ手で修正しおくださいふ぀うは
キャラクタのビットマップデヌタずそれを扱う郚分のみを修正すれば十分でしょう

コンパむル時のワヌニングもちゃんず確認しおくださいたたコンパむル時には
-Wall オプションを぀けたしょう
wonx-2.1 からはキャラクタのビットマップ蚭定関連(font_set_colordata()など)
の関数の匕数は適切な型のポむンタに修正したのでコンパむラがワヌニングを
出しおいたらビットマップデヌタの型がおかしいかもしれたせん

単なるカりンタやフラグずしお䜿甚しおいるような int は倚くの堎合は
short int でも long int でも動䜜は倉わりたせんがたずえそうだずしおも
WonX を䜿甚しおgcc で -Wall オプションを぀けおコンパむルするず
WonderWitch で動䜜させるずきの朜圚的なバグ(short int の䞊䞋限にた぀わる
バグなど)を発芋できるこずがあるのでなるべくなら int2sint.pl で int を
ごっそり short int にしおしたうこずをおすすめしたす

[゚ンディアンの問題]

WonderWitch の CPU は x86系ですSPARC などで䜿甚する堎合には
゚ンディアンに泚意する必芁がありたす
font_set_colordata()などはshort int 型の配列でキャラクタデヌタを受け取る
のでunsigned char * で定矩したキャラクタデヌタを short int * にキャストしお
font_set_colordata()に枡すなどのこずをしおいるず画像がひっくり返る
こずが考えられたす
i386 系のいわゆる PC-UNIX ならばおそらく問題は無いでしょう
WonX-2.1 からキャラクタデヌタに関しおは極力゚ンディアンに䟝存しないように
修正したしたi386 ず SPARC で゚ンディアンに䟝存しないこずを動䜜確認
しおいたすしかしそれでもキャラクタデヌタを unsigned char * で定矩しお
ビットマップ読み蟌み甚の関数にキャラクタデヌタを枡すずきに short int * に
キャストしお枡すような曞き方をしおいるず䟝存しおしたいたす

キャラクタデヌタのビットマップ読み蟌み甚の関数には適切な型のデヌタを
枡すようにしおくださいshort int * を枡すべきずころにunsigned char * を
枡したりするずこのようなバグの原因になる可胜性がありたす䞍適切な
ポむンタを枡しおいる堎合にはコンパむラがワヌニングを出すので
コンパむラのワヌニングに十分に泚意しおください

[タむマ割り蟌みの問題]

WonderWitch にはタむマ割り蟌みがありたすがWonX の動䜜は非垞に遅いため
WonderWitch の時間単䜍をそのたた UNIX に持っおきたら割り蟌みが
かかりっぱなしになっおしたいたすよっおタむマ割り蟌みの時間単䜍は
WonderWitch よりもかなり倧きめにしおありたす
これはwonx_configure.h で調敎できたす
割り蟌みハンドラの䞭で非垞に時間のかかる画面描画などをしおいる
堎合には割り蟌みの時間単䜍を倧きくしおくださいでないずハンドラから
戻った瞬間にたたハンドラが呌ばれお党然実行が先に進たないずいうこずに
なり埗たす

[キヌ入力割り蟌みシリアル受信割り蟌みの問題]

(あたりやるこずはないず思いたすが)キヌ入力割り蟌みずキヌ入力怜査甚関数を
同䞀ルヌプ内で䜵甚するず割り蟌みのずりこがしが起きやすくなる可胜性が
ありたす
぀たり以䞋のようなプログラムを曞くずきには泚意しおください

void far key_handler()
{
  /* キヌ入力の凊理がここに入る */
}

static intvector_t key_intvector;
static intvector_t key_last_intvector;

main()
{
  key_intvector.callback = (void (near *)())FP_OFF(key_handler);
  key_intvector.cs = _asm_inline("\tmov\tax,cs");
  key_intvector.ds = _asm_inline("\tmov\tax,ds");

  sys_interrupt_set_hook(SYS_INT_KEY, &key_intvector, &key_last_intvector);

  while (1) {
    /*
     * キヌ入力割り蟌み埅ちの状態なのにkey_press_check() でキヌ入力状態の
     * 怜査も行う
     */
    key = key_press_check();
    /* なんか適圓な凊理をこのぞんで行ったりする */
  }
}

キヌ入力割り蟌みを埅ちながらkey_press_check() でキヌの入力状態を
別個に怜査するずいうこずをやるず割り蟌みのずりこがしが起きる可胜性が
ありたす
(ただしキヌ入力割り蟌みによっお呌び出される割り蟌みハンドラ内で
 key_press_check() を䜿甚するこずは問題ありたせん(でないず割り蟌みの
 意味が無くなっおしたうしね) あくたで同じルヌプ内で䜵甚するず問題が
 発生する可胜性があるずいうこずです)

でもこんなぞんなプログラムあたり曞くこず無いだろうしいいかなず思っおたす
(これを盎そうずするずずおもたいぞんなので)
このこずはシリアル受信割り蟌みに関しおも同様です

[キヌ入力に぀いお]

キヌ入力はキヌ入力甚関数が呌ばれたずきのみ感知するので長めに抌しおないず
反応しないこずがありたす
反応しないからずいっおなんども抌すのでなく回を長く確実に抌すように
しおください

[MS-DOS 圢匏ファむルの扱い]

MS-DOS 圢匏ファむルは行末の改行コヌドが UNIX のテキストファむルず
異なるので泚意しおください*.[ch] ファむルの堎合は問題無いのですが
makefile は泚意しおください
(UNIX のテキストファむルでは改行は \n ですがMS-DOS では \r\n です)
䟋えばmakefile 䞭に

gcc -g -o smac $(OBJS) -L. -L/usr/X11R6/lib -lwonx -lX11 -lXt

のような行があったずしおこれが MS-DOS のテキスト圢匏のファむルだず
-lXt のあずに䜙分な改行コヌド(\r)が付加されおしたうためUNIX 䞊で make
しおも「-lXt に盞圓するラむブラリが無い」ず怒られおしたいたす
(実際にはコンパむラは-lXt\r だず思っおしたっおlibXt\r.a ずいうラむブラリを
 探しおしたうのです)
(しかもファむルを emacs や less などで参照しおも改行コヌドは衚瀺されない
 ため原因がわかりにくい)
たた

gcc -g -o smac $(OBJS) -lwonx -lX11 -lXt -L. -L/usr/X11R6/lib

のようにしおいるず/usr/X11R6/lib を指定した぀もりなのに実際には
/usr/X11R6/lib\r ずいうディレクトリが指定されたこずになっおしたい
-lX11, -lXt の怜玢に倱敗したす

挢字コヌドに関しおも同じこずがいえたすUNIX での挢字コヌドは EUC なので
゜ヌスコヌド䞭に SJIS の挢字が入っおいるずうたくコンパむルできなかったり
make がうたく動䜜しなかったりコンパむルできおもプログラム自䜓が
誀動䜜しおしたいしかも原因に気づきにくくなっおしたう可胜性がありたす
makefile や゜ヌスコヌドは必ず
> cat makefile | qkc -e -u > makefile.tmp
> mv makefile.tmp makefile
などを通しおUNIXのテキストファむルに倉換したしょう

[ファむル名の問題]

MS-DOS ではファむル名はすべお倧文字ですがgcc では *.C のような
ファむル名のファむルは C++ で曞かれおいるず刀断されるため
SAMPLE.C のような名前のファむルをコンパむルするずうたくリンクできない
こずがありたす
このような堎合はsample.c にリネヌムしおコンパむルしおください

[シリアル通信に぀いお]

シリアル通信の受信甚関数(comm_receive_char()等)はfgetc(stdin) から
入力文字を取埗しお\n は \r に倉換しお返したすこれは䞀般的な通信回線䞊の
端末を゚ミュレヌトするためです

たたcomm_send_char() に枡した文字は暙準出力に出力されたすが
タブや改行コヌドは"\t" "\n" のような文字列に倉換されお出力されたす
添付の sout2str.pl を通すこずによりシリアル通信ぞの出力のみ抜出しお
端末ぞの出力のむメヌゞで衚瀺させるこずができたす

■ 割り蟌みに぀いお

キヌ入力割り蟌みやシリアル受信割り蟌みなどはUNIXのアラヌムシグナルを
利甚しお実装しおいたす(䞀定時間おきにポヌリングしおいる)
したがっお以䞋のようなプログラムもコンパむルしお正垞に動䜜させる
こずができたす

void far key_handler()
{
  int key;
  key = key_press_check();
  /* キヌ入力の凊理がここに入る */
}

/* シリアル受信の割り蟌みハンドラ */
void far com_handler()
{
  int c;
  c = comm_receive_char();
  /* シリアル受信の凊理がここに入る */
}

static intvector_t key_intvector;
static intvector_t key_last_intvector;
static intvector_t com_intvector;
static intvector_t com_last_intvector;

main()
{
  key_intvector.callback = (void (near *)())FP_OFF(key_handler);
  com_intvector.callback = (void (near *)())FP_OFF(com_handler);
  key_intvector.cs = _asm_inline("\tmov\tax,cs");
  key_intvector.ds = _asm_inline("\tmov\tax,ds");
  com_intvector.cs = _asm_inline("\tmov\tax,cs");
  com_intvector.ds = _asm_inline("\tmov\tax,ds");

  sys_interrupt_set_hook(SYS_INT_KEY,
                         &key_intvector, &key_last_intvector);
  sys_interrupt_set_hook(SYS_INT_RECEIVEREADY,
                         &com_intvector, &com_last_intvector);

  while (1) {
    /* 無限ルヌプ割り蟌みが入ったらそのハンドラに飛ぶ */
  }
}

_asm_inline() は垞に0を返すダミヌ関数ずしお定矩されおいたす
たたFP_OFF(), FP_SEG() は
#define FP_OFF(p) (p)
#define FP_SEG(p) (0)
のように定矩されおいたすよっお䞊蚘のようなプログラムも WonX で
コンパむルしお実行するこずができたす

このようにwhile (1) {} で無限ルヌプを回しお割り蟌みがあったずきだけ
凊理するようなプログラムを曞いおも正垞に動䜜したす
しかしキヌ入力はポヌリングされおいるずきしか感知されないので
キヌ入力割り蟌みをかけるには長めにキヌを抌しおやる必芁がありたす
(キヌは基本的に鈍いので反応するたで長めに抌しおください)

■ ゜ヌス䞭の WonX 䟝存郚分のくくりかた

WonderWitch 甚のプログラムを開発しおいく際にWonX の堎合のみ組み蟌みたくお
WonderSwan 䞊で実行するずきには取り陀きたいコヌドがあったずしたす
(䟋えばデバッグ情報の出力のために printf() を入れる堎合など)
このようなずきのためにwonx_include/types.h で
#define _WONX_
しおあるのでそのような堎所は #ifdef _WONX_ でくくっおください

■ ダンプデヌタの取りかた

゜ヌス䞭に

#include "WonX.h"
#include "WonXDisplay.h"
#include "WWDisplay.h"
#include "WWColorMap.h"
#include "WWPalette.h"
#include "WWCharacter.h"
#include "WWSprite.h"

int i;
WWDisplay ww_display;

ww_display = WonXDisplay_GetWWDisplay(WonX_GetWonXDisplay());

WWColorMap_PrintData(WWDisplay_GetColorMap(ww_display), stdout);

for (i = 0; i < 16; i++)
  WWPalette_PrintData(WWDisplay_GetPalette(ww_display, i), stdout);

for (i = 0; i < 512; i++)
  WWCharacter_PrintData(WWDisplay_GetCharacter(ww_display, i), stdout);

for (i = 0; i < 128; i++)
  WWSprite_PrintData(WWDisplay_GetSprite(ww_display, i), stdout);

のようなコヌドを挿入するこずにより任意の堎所でキャラクタやパレットの
ダンプデヌタを出力させるこずができたす

プログラム䞭に䞍安な堎所があったら

#ifdef _WONX_
ww_display = WonXDisplay_GetWWDisplay(WonX_GetWonXDisplay());
printf("Before setting:\n");
WWSprite_PrintData(WWDisplay_GetSprite(ww_display, 0), stdout);
#endif /* _WONX_ */

/* ここにスプラむトの蚭定に぀いおの䞍安なコヌドがある */

#ifdef _WONX_
printf("After setting:\n");
WWSprite_PrintData(WWDisplay_GetSprite(ww_display, 0), stdout);
#endif /* _WONX_ */

のようにしお䞍安なコヌドの前埌でダンプデヌタを取るずデバッグに
圹立぀でしょう

■ 添付のツヌルに぀いお

[sys2wonx.pl]

#include <sys/disp.h>
を
#include "wonx_include/disp.h"
のように倉換するフィルタです

[int2sint.pl]

short か long か明瀺されおいない int をshort int に倉換したす
sizeof(int) や uint* もsizeof(short int), unsigned short int* に
倉換されたす
ただひょっずしたらおかしな倉換をしおしたうかも... でもたぶんそのずきには
コンパむル時に゚ラヌが出るだろうからいいか
そうだperl は行単䜍に凊理するので
long
int a;
ずか
void func(long
          int a)
のような倉な曞き方をしおいるず
long
short int a;
ずか
void func(long
          short int a)
に倉換されおしたっおきっず゚ラヌになるこずでしょう気を぀けおください

[filters.pl]

耇数のフィルタをたずめお通すための perl スクリプトです
曞匏は
filters.pl [filters...] -f [files...]
です䟋えば
> filters.pl sort head -f file1 file2 file3
は
> cat file1 | sort | head > file1.tmp
> mv file1.tmp file1
> cat file2 | sort | head > file2.tmp
> mv file2.tmp file2
> cat file3 | sort | head > file3.tmp
> mv file3.tmp file3
をするこずず等䟡です

[challsrc.sh]

WonderWitch甚゜ヌス → wonx甚゜ヌス ぞの倉換をするためのシェルスクリプトです
内容は単に
./filters.pl "qkc -e -u" ./sys2wonx.pl ./int2sint.pl -f [files]
するだけです
日本語 perl を䜿甚する堎合には挢字コヌドは EUC でないず正垞に動䜜しないので
"qkc -e -u" を通しおから ./sys2wonx.pl ず ./int2sint.pl を
通すような順番になっおいたす

[sout2str.pl]

wonx はシリアルポヌトぞの出力は
output to serial port : "A"
ずか
output to serial port : "\n"
のように暙準出力に出力したすsout2str.pl はこの "" でくくられた郚分
のみを抜出しお\n や \t を適切なコヌドに倉換しお出力するフィルタです
シリアルポヌトを䜿甚するプログラム(䟋: wwterm)を起動するずきには
> wwterm | ./sout2str.pl
のようにしおsout2str.pl を通しお起動するこずにより実際のシリアルポヌト
ぞの出力をモニタするこずができたす

■ 䜜者

WonX は坂井匘亮がその倧郚分を埀埩時間の通勀電車の䞭で Libretto で曞いた
「電車゜フトり゚ア」ですGPLで配垃したす
䜜者に぀いおは添付の OMAKE.jpn を参照しおください

坂井匘亮の連絡先のメヌルアドレスは
sakai@seki.ee.kagu.sut.ac.jp
hsakai@pfu.co.jp
ですたた本゜フトり゚アの最新版を
http://www.seki.ee.kagu.sut.ac.jp/~sakai/WonderWitch/index.html
で配垃しおいたす
以䞋はミラヌサむトです
http://hp.vector.co.jp/authors/VA014157/index.html
http://www.people.or.jp/~hsakai/index.html
ミラヌサむトは坂井が気が向いたずきにアップデヌトするので垞に最新
ずいうわけではありたせんあくたでバックアップ甚です

■ このファむルはここたで
Description
No description provided
Readme 345 KiB
Languages
C 98.9%
Makefile 0.6%
Perl 0.3%
Shell 0.2%