From 5e1a9795b7f6e6e3e93b5d0ffb4407a2a53090e3 Mon Sep 17 00:00:00 2001 From: Hiroaki Sakai Date: Fri, 3 Nov 2000 12:00:00 +0900 Subject: [PATCH] Create your own header file. It became compilable with only Wonx. Since there is a possibility that the Error () function will collide with libwonx.a when linking, It changed to Wonx_Error (). Added bios_exit (). sprite_set_char, sprite_get_char, palette number minus 8 Fixed bug that was not specified. font_set_monodata (), font_set_colordata (), font_get_data (), disp.c, The arguments of screen_set_char (), screen_get_char (), sprite_set_data () Changed from void * to appropriate type. Sample program and attached SpeedMac. I added a document. Version 0.3 beta - from wonx-b03.tar.gz --- HISTORY | 23 ++- Makefile | 36 +++- README | 350 +++++++++++++++++++++++--------- UNIXTimer.c | 6 +- WWCharacter.c | 36 ++-- WWCharacter.h | 1 + WWColorMap.c | 3 +- WWDisplay.c | 3 +- WWInterrupt.c | 12 +- WWInterrupt.h | 2 +- WWLCDPanel.c | 3 +- WWPalette.c | 3 +- WWScreen.c | 5 +- WWSprite.c | 3 +- WWText.c | 10 +- WWTimer.c | 4 +- WWTimer.h | 2 +- Wonx.c | 8 +- WonxDisplay.c | 6 +- WonxSystem.c | 23 ++- WonxText.c | 8 +- XDisplay.c | 17 +- XDisplay.h | 2 +- bank.c | 16 +- comm.c | 10 +- disp.c | 138 +++++++------ etc.c | 2 +- etc.h | 2 +- key.c | 2 +- makefile_for_smac | 38 ++++ sample1.c | 23 +++ sample2.c | 47 +++++ smac-b02.zip | Bin 0 -> 56988 bytes sound.c | 2 +- sys2wonx.pl | 14 ++ system.c | 56 ++--- text.c | 64 +++--- timer.c | 72 +++---- configure.h => wonx_configure.h | 10 +- wonx_include/bank.h | 39 ++++ wonx_include/bios.h | 13 ++ wonx_include/comm.h | 71 +++++++ wonx_include/disp.h | 112 ++++++++++ wonx_include/key.h | 42 ++++ wonx_include/service.h | 14 ++ wonx_include/sound.h | 26 +++ wonx_include/system.h | 58 ++++++ wonx_include/system_configure.h | 19 ++ wonx_include/text.h | 46 +++++ wonx_include/timer.h | 52 +++++ wonx_include/types.h | 46 +++++ 51 files changed, 1253 insertions(+), 347 deletions(-) create mode 100644 makefile_for_smac create mode 100644 sample1.c create mode 100644 sample2.c create mode 100644 smac-b02.zip create mode 100644 sys2wonx.pl rename configure.h => wonx_configure.h (58%) create mode 100644 wonx_include/bank.h create mode 100644 wonx_include/bios.h create mode 100644 wonx_include/comm.h create mode 100644 wonx_include/disp.h create mode 100644 wonx_include/key.h create mode 100644 wonx_include/service.h create mode 100644 wonx_include/sound.h create mode 100644 wonx_include/system.h create mode 100644 wonx_include/system_configure.h create mode 100644 wonx_include/text.h create mode 100644 wonx_include/timer.h create mode 100644 wonx_include/types.h diff --git a/HISTORY b/HISTORY index 3d89e1b..f3a6d38 100644 --- a/HISTORY +++ b/HISTORY @@ -1,4 +1,25 @@ -wonx-b02 +2000/11/13(月) + +wonx-b03 公開 + +ヘッダファイルを独自に作成.Wonx のみでコンパイル可能になった. +libwonx.a のリンク時に Error() 関数がぶつかる可能性があるので, +Wonx_Error() に変更した. +bios_exit() を追加. +sprite_set_char, sprite_get_char で,パレット番号が8を引いた値で +指定されていないバグを修正. +disp.c の font_set_monodata(), font_set_colordata(), font_get_data(), +screen_set_char(), screen_get_char(), sprite_set_data() の引数を +void * から適切な型に変更. +サンプルプログラムと SpeedMac を添付した. +ドキュメントを追加した. + + + + +2000/11/3(金) + +wonx-b02 公開 割り込み処理の追加.タイマ割り込みサポート. (UNIXTimer, WWInterrupt, WWTimer, WonxSystem 追加) diff --git a/Makefile b/Makefile index d10d43f..83ea141 100644 --- a/Makefile +++ b/Makefile @@ -2,11 +2,15 @@ XINCLUDEDIR = /usr/X11R6/include INCLUDEDIR = . XLIBDIR = /usr/X11R6/lib -VERSION = Wonx-b02 -PKGNAME = wonx-b02 +VERSION = Wonx-b03 +PKGNAME = wonx-b03 + +SMAC = smac-b02 OBJS = WWCharacter.o WWColorMap.o WWDisplay.o WWLCDPanel.o WWPalette.o WWScreen.o WWSprite.o WWText.o WWInterrupt.o WWTimer.o Wonx.o WonxDisplay.o WonxText.o WonxSystem.o XDisplay.o UNIXTimer.o bank.o comm.o disp.o text.o key.o sound.o system.o timer.o etc.o +CC = gcc + .SUFFIXES: .c .o all : libwonx.a @@ -16,16 +20,38 @@ libwonx.a : $(OBJS) # ranlib libwonx.a .c.o : $*.c - gcc -c $*.c -O -Wall -I$(INCLUDEDIR) -I$(XINCLUDEDIR) + $(CC) -c $*.c -O -Wall -I$(INCLUDEDIR) -I$(XINCLUDEDIR) clean : - rm -f libwonx.a *.o + rm -f libwonx.a sample1 sample2 *.o + +sample1 : libwonx.a sample1.o + $(CC) sample1.o -o sample1 \ + -L. -L/usr/X11R6/lib -lwonx -lX11 -lXt + +sample2 : libwonx.a sample2.o + $(CC) sample2.o -o sample2 \ + -L. -L/usr/X11R6/lib -lwonx -lX11 -lXt + +smac : libwonx.a + unzip $(SMAC).zip + cp -R wonx_include $(SMAC) + cp libwonx.a $(SMAC) + mv $(SMAC)/makefile $(SMAC)/makefile.orig + cp makefile_for_smac $(SMAC)/makefile + cp sys2wonx.pl $(SMAC) + echo "ここで止まったときは,sys2wonx.pl の1行目に適切なperlを指定してください" + cd $(SMAC) ; ./sys2wonx.pl *.[ch] + cd $(SMAC) ; $(MAKE) package : mkdir -p $(PKGNAME) rm -fR $(PKGNAME)/* + mkdir -p $(PKGNAME)/wonx_include cp COPYING COPYRIGHT HISTORY README OMAKE.jpn Makefile \ - *.h *.c $(PKGNAME) + makefile_for_smac sys2wonx.pl \ + *.h *.c smac*.zip $(PKGNAME) + cp wonx_include/*.h $(PKGNAME)/wonx_include tar cvzf $(PKGNAME).tar.gz $(PKGNAME) # End of Makefile. diff --git a/README b/README index f481a22..ae7e051 100644 --- a/README +++ b/README @@ -1,28 +1,27 @@ Wonx - WonderWitch on X. -■ αバージョン配布に当たって +■ 配布に当たって -Wonx はまだ不完全なαバージョンです.実装されていない機能や, -不完全な機能,おかしな動作をする部分などがいっぱいあります. +Wonx はまだ不完全です.実装されていない機能や,不完全な機能,おかしな +動作をする部分などがいっぱいあります. バグ情報やアドバイスがあれば,作者の坂井弘亮まで,どんどんメールください. アドレスは, sakai@seki.ee.kagu.sut.ac.jp hsakai@pfu.co.jp です. -また,リリース版ができるまでは,アップデートは頻繁に行っていきます. +また,坂井の気が向く限り,アップデートは随時行っていきます. http://www.seki.ee.kagu.sut.ac.jp/~sakai/WonderWitch/index.html で,随時公開していきます. 現在は坂井が一人で製作していますが,ひとりでは細かい点の整合性 (初期化しなかった場合の動作の違いなど.WonderWitch と Wonx では - 微妙に異なっていると思う)を追いきれないのが現状です. + 微妙に異なっている)を追いきれないのが現状です. とくにマニュアルに書いてない部分に関しては,WonderWitch ではどのように -動作するのか,ひとりではチェックしきれません. -情報をお待ち(ていうか期待)しています(そのためのα版配布です). +動作するのか,ひとりではチェックしきれません.(ていうか面倒) +情報をお待ち(ていうか期待)しています. いっしょに少しずつ,完全なものに仕上げていきましょう. -広く情報を募るために,早い段階でα版として公開します.ご意見,ご要望なども -歓迎します.どしどしお寄せください. +ご意見,ご要望なども歓迎します.どしどしお寄せください. (ただし,返事を書くとは限らないし,要望を反映するとも限りませんので その点はご容赦ください) @@ -47,29 +46,64 @@ Wonx ・描画速度は遅いが,デバッグ目的のためなので,速度を速くすることは あまり考えていない.(それよりも上記のデバッグ性を優先する) ・WonderWitch 用のプログラムを,X上で楽しむためのものではない. + また,エミュレーションが目的なのではない. あくまでデバッグ目的のもの.(そういうポリシーで開発を進める) + 従って,WonderWitch での動作を模倣することよりも,デバッグ情報を + 出力することや改造のしやすさを優先したような実装をする場合がある. -■ 足りないもの +■ 3分wonx -以下のものにはまだ対応してません.したがって,例えばサウンド関連の -関数を呼び出しても,何も起こりません.(空の関数になっている) +とりあえず,どんなものか見てみたいことでしょう.そんな人は, +サンプルプログラムをコンパイル・実行してみましょう. +以下のようにしてみてください. -・文字表示関連 (ターミナルにそのまま出力する) - とくに,文字だけでタイトル画面を書いてるゲームの場合などは, - なにも表示されないことになってしまうので注意してください. - (正常に動作していても,画面が真っ白で固まっているように見えてしまう) -・画面周りの細かいところ(ウインドウ機能など) -・サウンド -・シリアルポート -・割り込み処理関連 - 割り込みを使用している場合は注意してください.そのままではまともに - 動かないでしょう. - そのうちシグナル使ってなんとかサポートしたいと思います. +~>% tar xvzf wonx.tgz +(中略) +~>% cd wonx -■ 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 + +ウインドウが開いて,標準出力にメッセージが出力されます. +いったん p を押して画面描画を OFF にします.しばらくしたら +(メッセージの内容が変わったら) p を押して再び画面表示を ON にすると, +smac のタイトル画面が表示されます. +ここでスペースを押して,さらにまた p で画面表示を OFF にして, +しばらくしたら(メッセージの内容が変わったら) p で画面表示を ON にします. +どうですか? SpeedMac のゲーム画面が表示されているでしょうか? +カーソルキーで移動,スペースキーで射撃です. +ただし,キー入力はキー入力用関数が呼ばれたときしか有効ではないので, +キーは反応するまで長めに押してください. +p を押して頻繁に描画の ON, OFF を切替えるのは,描画が非常に遅いため, +ONのままだと画面クリアとかに異常に時間がかかるからです. + +■ Wonx 概要 Wonx は,WonderWitch の display_control() とか display_status() といった -関数(システムコール)と互換の関数を持っています. +関数(BIOS に対するシステムコール)と代替の関数を持っています. これらの関数は,X上にウインドウを開いて,そこで WonderWitch と互換の動作を するように書いてあります. @@ -78,18 +112,47 @@ Wonx 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 のコンパイルには,WonderWitch 付属のヘッダファイル(sys/disp.h とか)が - 必要なので,それらをコピーします. -・Wonx をコンパイルします.→ libwonx.a ができあがります. -・ヘッダファイル(sys/disp.h とか)と libwonx.a を,適切なディレクトリに - 置きます. - (アプリケーションのコンパイルには,WonderWitch 付属のヘッダファイルが必要) +対策として,Wonx では wonx_include というディレクトリの下にヘッダファイルを +格納してあります.(本当は sys というディレクトリにしたかったが, +上記の対策のため,このようにした) +WonderWitch 用プログラム中の, +#include +のような部分は,すべて, +#include +のように修正する必要があります. +(stdio.h や stdlib.h は,UNIX システム付属のものを使用するので, + そのままでかまいません) +(ただし,コンフリクトしないという絶対の自信があるなら,この限りではありません) +WonderWitch のプログラムの,#include は,すべて +#include に修正する必要がある,ということです. +(これをまとめて行うための perl スクリプトを添付してあります. + sys2wonx.pl *.[ch] を実行すると,ごっそりと書き換えてくれます) -インストールは,以下の手順で行います. +また,UNIXシステムによっては,/usr/include/sys/types.h で ushort, ulong を +定義しているものといないものがあります.よって,コンパイル中に +ulong が2重定義されているとおこられる場合があります. +このあたりの微調整には,wonx_include 以下のファイルを直接修正して +調整してください.wonx_include/system_configure.h を修正することにより, +調整できるようになってます. + +■ Wonx のコンパイル + +まず Wonx をコンパイルして,libwonx.a を作成する必要があります. +Wonx のコンパイルは,以下の手順で行います. 1. Wonx を展開する. @@ -97,40 +160,7 @@ WonderWitch ~>% cd wonx ~/wonx>% -2. WonderWitch 付属のヘッダファイルをコピーする. - -~/wonx>% mkdir sys -~/wonx>% cp ~/WWitch/include/bank.h sys -~/wonx>% cp ~/WWitch/include/comm.h sys -~/wonx>% cp ~/WWitch/include/disp.h sys -~/wonx>% cp ~/WWitch/include/key.h sys -~/wonx>% cp ~/WWitch/include/sound.h sys -~/wonx>% cp ~/WWitch/include/system.h sys -~/wonx>% cp ~/WWitch/include/text.h sys -~/wonx>% cp ~/WWitch/include/timer.h sys -~/wonx>% cp ~/WWitch/include/types.h sys - -3. 以下の内容のファイル(sys/service.h)を作成する. - -~/wonx>% emacs sys/service.h - -==== ここから ==== -#ifndef _service_h_INCLUDED_ -#define _service_h_INCLUDED_ - -#define far /* None */ -#define near /* None */ - -#endif -==== ここまで ==== - -sys/service.h は,disp.h などの中から, -#include -のようにしてインクルードされますが,コンパイル時には -I. でコンパイル -されるので,ばあいによっては,sys/sys/service.h にする必要があるかも -しれません.(未確認) - -4. Wonx を make する. +2. Wonx を make する. ~/wonx>% make gcc -c WWCharacter.c -O -I. -I/usr/X11R6/include @@ -142,61 +172,99 @@ ar ruc libwonx.a WWCharacter.o WWColorMap.o WWDisplay.o WWLCDPanel.o WWPalette.o libwonx.a ~/wonx>% -ここまでで,ライブラリとヘッダファイルの作成は終りです. +ここまでで,ライブラリの作成は終りです. ■ WonderWitch 用アプリケーションのコンパイル -拙作の SpeedMac をコンパイルしてみます. +次に,Wonx の利用の例として,拙作の SpeedMac という WonderWitch 用の +ゲームをコンパイルしてみます. +(SpeedMac はサンプルプログラムとして,Wonx に標準添付してあります) +SpeedMac は WonderWitch 用のゲームプログラムです.本来は WonderWitch を +使用してコンパイルし,WonderSwan 上でゲームを楽しむためのものです. +今回は例として,SpeedMac に Wonx をリンクして,X 上で動作する SpeedMac の +実行形式を作成してみます. 1. 展開する. -~/wonx>% cd -~>% unzip xvzf smac-b02.zip +~/wonx>% unzip smac-b02.zip ...(中略)... -~>% cd smac-b02 -~/smac-b02>% +~/wonx>% cd smac-b02 +~/wonx/smac-b02>% 2. ヘッダファイルと libwonx.a をコピーする. -~/smac-b02>% mkdir sys -~/smac-b02>% cp ~/wonx/sys/* ./sys -~/smac-b02>% cp ~/wonx/libwonx.a . -~/smac-b02>% +~/wonx/smac-b02>% cp -R ../wonx_include . +~/wonx/smac-b02>% cp ../libwonx.a . +~/wonx/smac-b02>% -3. Makefile を修正する. +3. makefile を修正する. -~/smac-b02>% emacs Makefile +~/wonx/smac-b02>% emacs makefile 以下のように修正します. ・gcc でコンパイルをするように修正する.このときに,コンパイルオプションに, - -I. -I/usr/X11R6/include -L. -L/usr/X11R6/lib -lwonx -lX11 -lXt + -I. -L. -L/usr/X11R6/lib -lwonx -lX11 -lXt を追加する. (必要なら,-g も追加する) ・mkfent によるファイルのコンバートなどがあったら,削除する. -4. make する. +修正後の makefile を添付してあるので,面倒なかたは手で編集するかわりに, -~/smac-b02>% make +~/wonx/smac-b02>% mv makefile makefile.orig +~/wonx/smac-b02>% cp ../makefile_for_smac ./makefile + +のようにしてコピーしてください. + +4. ソースを修正する. + +~/wonx/smac-b02>% emacs chara.c +~/wonx/smac-b02>% emacs dsp.c +... (ファイルをひとつひとつ修正する) + +ソース中の, +#include +#include +のような部分を, +#include "wonx_include/disp.h" +#include "wonx_include/key.h" +のように修正します. + +これをまとめてやるための perl スクリプト (sys2wonx.pl) を添付してあるので, +面倒なかたは, +~/wonx/smac-b02>% cp ../sys2wonx.pl . +~/wonx/smac-b02>% ./sys2wonx.pl *.[ch] +のようにしてください. +(sys2wonx.pl は,引数で指定したファイル自体を書き換えてしまうので注意) + +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 -~/smac-b02>% ls smac +~/wonx/smac-b02>% ls smac smac -~/smac-b02>% +~/wonx/smac-b02>% -5. smac を起動する. +6. smac を起動する. -~/smac-b02>% ./smac +~/wonx/smac-b02>% ./smac + +と,ここまでけっこう面倒ですが,実は, + +~/wonx>% make smac + +すると,これらの作業を全部やってくれるようになってます. ■ 操作 smac を起動すると,ウインドウが開きます.また,ターミナルには, 以下のデバッグ用の情報が表示されます. -・WonderWitch の互換関数が呼ばれると,引数と戻り値を表示します. +・WonderWitch の代替関数が呼ばれると,引数と戻り値を表示します. またここでは,以下の操作が行えます. @@ -211,9 +279,11 @@ smac ・F3 を押すと,キャラクターのデータをダンプ出力する. ・F4 を押すと,スプライトのデータをダンプ出力する. -標準ではなにか関数が呼ばれるたびに画面の再描画を行うため,非常に低速です. +デフォルトではなにか関数が呼ばれるたびに画面の再描画を行うため, +非常に低速です. たとえば,以下のようなことをやっていると,非常に低速になります. +/* 画面のクリア */ for (y = 0; y < 32; y++) for (x = 0; x < 32; x++) { screen_fill_char(0, x, y, 1, 1, 0x0000); /* ここで毎回再描画される */ @@ -236,8 +306,8 @@ smac > smac | grep "character\[10\]" -wonx は,メッセージを出力する再に,grep でフィルタリングできるように, -かならず行の先頭に統一性のある文字列を追加しています. +wonx は,メッセージを出力する際に,grep でフィルタリングできるように, +かならず出力メッセージの先頭に,統一性のある文字列を追加しています. たとえば,関数呼び出し時に表示されるメッセージには,先頭に必ず "call" という文字列が追加されてます.よって,grep -v call を通せば, 関数呼び出しのメッセージがごっそり出なくなる,というようになってます. @@ -249,10 +319,99 @@ wonx のようにして,ログをとるのも有効でしょう. +> smac > /dev/null + +だと,文字列を kterm などに表示しないぶん,高速になります. + +■ 足りないもの + +以下のものにはまだ対応してません.したがって,例えばサウンド関連の +関数を呼び出しても,何も起こりません.(空の関数になっている) + +・サウンド +・シリアル通信 +・その他いっぱい + +■ 注意しなければならないこと + +Wonx は,本来は WonderWitch 用として書かれた(もしくは,書かれる)プログラムを, +UNIX 上でコンパイル・リンクするためのライブラリであり,ハードウエアを +エミュレートするものではありません. +ですから,WonderWitch と UNIX 上のC言語のギャップのため,気をつけなければ +ならないことがいくつかあります.これらは Wonx の性質上,仕方の無いことです. + +以下のことは,意識することと,きれいなプログラムを書くことで, +かなり回避できると思います.(short int にすべきところでは,省略せずに +ちゃんと short int と明示するとか) + +まあ,Wonx の目的は論理的なバグを早い段階で無くすことにあるので,このへんは +そういうものだと割り切って使ってください. +Wonx を使う限り,なるべく機種依存を無くすように心がけましょう. +(とくに int のサイズにあまり依存しないようにしましょう) + +[コンパイルの問題] + +先にも書きましたが,コンパイルできないという障害が出たら,原因はたいていは +ヘッダファイルのコンフリクトです.とくに,WonderWitch で sys 以下の +ファイルをインクルードしている場合は注意してください. +ushort, ulong などは,sys/types.h で定義されているシステムもあるし, +そうでないシステムもあります.このへんは,wonx_include/system_configure.h で +調整してください. +(FreeBSD では ushort のみ定義されているが,RedHat Linux では, + uchort, ulong ともに定義されているので,そのままだとコンパイル中に + 2重定義のワーニングが出ます) + +[int 型の扱い] + +WonderWitch では sizeof(short int) == sizeof(int) < sizeof(long int) ですが, +UNIX ではふつう sizeof(short int) < sizeof(int) == sizeof(long int) です. +このことは,int 型を単なるカウンタとして使用するような場合には問題に +なりませんが,ビットマップの格納場所として使用するようなときには, +問題になります. +一番問題になりやすいのは,キャラクタのビットマップを扱う場合です. +font_set_colordata()などは,16*8 バイトのキャラクタデータを +short int 型の配列として引数に持ちます.WonderWitch では +sizeof(short int) == sizeof(int) なので,WonderWitch 用のプログラム上では, +キャラクタデータを short int とせずに,int 型の配列として定義してしまう +ことが考えられます.(当然 WonderWitch ならば問題は無いが,UNIX 上で +実行したら,キャラクタに妙な縞々が入るだろうと思われる) +このような場合には,UNIX 上でコンパイルするときには,short int に +修正する必要があります. + +[エンディアンの問題] + +WonderWitch の CPU は x86系です.SPARC などで使用する場合には, +エンディアンに注意する必要があります. +font_set_colordata()などは,short int 型の配列でキャラクタデータを受け取る +ので,char * で定義したキャラクタデータを short int * にキャストして +font_set_colordata()に渡すなどのことをしていると,画像がひっくり返る +ことが考えられます. +i386 系の PC-UNIX ならば,おそらく問題は無いでしょう. + +[割り込みの問題] + +WonderWitch にはタイマ割り込みがありますが,Wonx の動作は非常に遅いため, +WonderWitch の時間単位をそのまま UNIX に持ってきたら,割り込みが +かかりっぱなしになってしまいます.よってタイマ割り込みの時間単位は, +WonderWitch よりもかなり大きめにしてあります. +これは,wonx_configure.h で調整できます. +割り込みハンドラの中で,非常に時間のかかる画面描画などをしている +場合には,割り込みの時間単位を大きくしてください.でないと,ハンドラから +戻った瞬間にまたハンドラが呼ばれて,全然実行が先に進まない,ということに +なり得ます. + +[キー入力について] + +キー入力は,キー入力用関数が呼ばれたときのみ感知するので,長めに押してないと +反応しないことがあります. +反応しないからといってなんども押すのでなく,1回を長く確実に押すように +してください. + ■ 作者 -Wonx は,坂井弘亮が通勤電車の中で Libretto で書いた作品です. -GPLで配布します. +Wonx は,坂井弘亮がその大部分を往復3時間の通勤電車の中で Libretto で書いた, +「電車ソフトウエア」です.GPLで配布します. +作者については,添付の OMAKE.jpn を参照してください. 坂井弘亮の連絡先のメールアドレスは, sakai@seki.ee.kagu.sut.ac.jp @@ -260,5 +419,10 @@ 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 +ミラーサイトは,坂井が気が向いたときにアップデートするので,常に最新, +というわけではありません.あくまでバックアップ用です. ■ このファイルはここまで diff --git a/UNIXTimer.c b/UNIXTimer.c index 2ff91ea..7efb092 100644 --- a/UNIXTimer.c +++ b/UNIXTimer.c @@ -150,7 +150,7 @@ int UNIXTimer_Pause(UNIXTimer unix_timer) int UNIXTimer_Unpause(UNIXTimer unix_timer) { if (unix_timer->pause == 0) - Error("UNIXTimer_Unpause", "Duplicated unpause."); + Wonx_Error("UNIXTimer_Unpause", "Duplicated unpause."); if (unix_timer->pause == 1) { if (unix_timer->interrupt_in_pause > 0) { @@ -243,7 +243,7 @@ UNIXTimer UNIXTimer_Create(int auto_preset, int interval, void * parameter, unix_timer = (UNIXTimer)malloc(sizeof(_UNIXTimer)); if (unix_timer == NULL) - Error("UNIXTimer_Create", "Cannot allocate memory."); + Wonx_Error("UNIXTimer_Create", "Cannot allocate memory."); unix_timer->timer_on = 0; unix_timer->pause = 0; @@ -281,7 +281,7 @@ UNIXTimer UNIXTimer_Create(int auto_preset, int interval, void * parameter, UNIXTimer UNIXTimer_Destroy(UNIXTimer unix_timer) { if (unix_timer == NULL) - Error("UNIXTimer_Destroy", "Object is not created."); + Wonx_Error("UNIXTimer_Destroy", "Object is not created."); UNIXTimer_OFF(unix_timer); diff --git a/WWCharacter.c b/WWCharacter.c index 00a3290..37832aa 100644 --- a/WWCharacter.c +++ b/WWCharacter.c @@ -11,7 +11,7 @@ int WWCharacter_GetNumber(WWCharacter c) { - if (c == NULL) Error("WWCharacter_GetNumber()", "WWCharacter is NULL."); + if (c == NULL) Wonx_Error("WWCharacter_GetNumber()", "WWCharacter is NULL."); return (c->number); } @@ -19,7 +19,7 @@ int WWCharacter_GetNumber(WWCharacter c) int WWCharacter_SetNumber(WWCharacter c, int n) { if ((n < 0) || (n >= 512)) - Error("WWCharacter_SetNumber()", "Invalid range."); + Wonx_Error("WWCharacter_SetNumber()", "Invalid range."); return (c->number = n); } @@ -30,7 +30,7 @@ WWCharacter WWCharacter_Create(int number, unsigned char * bitmap) character = (WWCharacter)malloc(sizeof(_WWCharacter)); if (character == NULL) - Error("WWCharacter_Create", "Cannot allocate memory."); + Wonx_Error("WWCharacter_Create", "Cannot allocate memory."); WWCharacter_SetNumber(character, number); WWCharacter_SetBitmap(character, bitmap); @@ -41,17 +41,22 @@ WWCharacter WWCharacter_Create(int number, unsigned char * bitmap) WWCharacter WWCharacter_Destroy(WWCharacter character) { if (character == NULL) - Error("WWCharacter_Destroy()", "WWCharacter is NULL."); + Wonx_Error("WWCharacter_Destroy()", "WWCharacter is NULL."); free(character); return (NULL); } +unsigned char * WWCharacter_GetBitmap(WWCharacter character) +{ + return (character->bitmap); +} + int WWCharacter_SetBitmap(WWCharacter character, unsigned char * bitmap) { int i; if (character == NULL) - Error("WWCharacter_SetBitmap()", "WWCharacter is NULL."); + Wonx_Error("WWCharacter_SetBitmap()", "WWCharacter is NULL."); for (i = 0; i < 16; i++) { if (bitmap == NULL) { @@ -67,12 +72,12 @@ int WWCharacter_SetBitmap(WWCharacter character, unsigned char * bitmap) int WWCharacter_GetPixel(WWCharacter character, int x, int y) { if (character == NULL) - Error("WWCharacter_GetPixel()", "WWCharacter is NULL."); + Wonx_Error("WWCharacter_GetPixel()", "WWCharacter is NULL."); if ((x < 0) || (x > 7)) - Error("WWCharacter_GetPixel()", "x is invalid value."); + Wonx_Error("WWCharacter_GetPixel()", "x is invalid value."); if ((y < 0) || (y > 7)) - Error("WWCharacter_GetPixel()", "y is invalid value."); + Wonx_Error("WWCharacter_GetPixel()", "y is invalid value."); /* ビットマップは2ビットでぴとつのピクセルに対応する. */ /* 2ビットの値が,palette の色に対応する. */ @@ -86,14 +91,14 @@ int WWCharacter_SetPixel(WWCharacter character, int x, int y, int pixel) { unsigned char p; if (character == NULL) - Error("WWCharacter_SetPixel()", "WWCharacter is NULL."); + Wonx_Error("WWCharacter_SetPixel()", "WWCharacter is NULL."); if ((x < 0) || (x > 7)) - Error("WWCharacter_SetPixel()", "x is invalid value."); + Wonx_Error("WWCharacter_SetPixel()", "x is invalid value."); if ((y < 0) || (y > 7)) - Error("WWCharacter_SetPixel()", "y is invalid value."); + Wonx_Error("WWCharacter_SetPixel()", "y is invalid value."); if ((pixel < 0) || (pixel > 3)) - Error("WWCharacter_SetPixel()", "Invalid pixel."); + Wonx_Error("WWCharacter_SetPixel()", "Invalid pixel."); p = ((unsigned char)pixel) & 0x03; p = p << ((x % 4) * 2); @@ -111,7 +116,7 @@ int WWCharacter_CopyBitmap(WWCharacter dst, WWCharacter src) int WWCharacter_PrintData(WWCharacter character, FILE * f) { - int x, y, n; + int x, y, i, n; n = WWCharacter_GetNumber(character); @@ -120,6 +125,11 @@ int WWCharacter_PrintData(WWCharacter character, FILE * f) fprintf(f, "character[%d] :\tnumber = %d\n", n, WWCharacter_GetNumber(character)); + for (i = 0; i < 16; i++) { + fprintf(f, "character[%d] :\tbitmap[%d] = 0x%02x\n", + n, i, (int)(WWCharacter_GetBitmap(character)[i])); + } + for (y = 0; y < 8; y++) { fprintf(f, "character[%d] :\tbitmap : ", n); for (x = 0; x < 8; x++) { diff --git a/WWCharacter.h b/WWCharacter.h index 15c1f81..ddbb9a0 100644 --- a/WWCharacter.h +++ b/WWCharacter.h @@ -22,6 +22,7 @@ int WWCharacter_GetNumber(WWCharacter c); int WWCharacter_SetNumber(WWCharacter c, int n); WWCharacter WWCharacter_Create(int number, unsigned char * bitmap); WWCharacter WWCharacter_Destroy(WWCharacter character); +unsigned char * WWCharacter_GetBitmap(WWCharacter character); int WWCharacter_SetBitmap(WWCharacter character, unsigned char * bitmap); int WWCharacter_GetPixel(WWCharacter character, int x, int y); int WWCharacter_SetPixel(WWCharacter character, int x, int y, int pixel); diff --git a/WWColorMap.c b/WWColorMap.c index 7e5b4d4..fb2bba3 100644 --- a/WWColorMap.c +++ b/WWColorMap.c @@ -14,7 +14,8 @@ WWColorMap WWColorMap_Create(int * lcd_colors) WWColorMap color_map; color_map = (WWColorMap)malloc(sizeof(_WWColorMap)); - if (color_map == NULL) Error("WWColorMap_Create", "Cannot allocate memory"); + if (color_map == NULL) + Wonx_Error("WWColorMap_Create", "Cannot allocate memory"); WWColorMap_SetLCDColors(color_map, lcd_colors); diff --git a/WWDisplay.c b/WWDisplay.c index d0d8573..fb73d59 100644 --- a/WWDisplay.c +++ b/WWDisplay.c @@ -96,7 +96,8 @@ WWDisplay WWDisplay_Create(int lcd_panel_width, int lcd_panel_height, int i; display = (WWDisplay)malloc(sizeof(_WWDisplay)); - if (display == NULL) Error("WWDisplay_Create", "Cannot allocate memory."); + if (display == NULL) + Wonx_Error("WWDisplay_Create", "Cannot allocate memory."); WWDisplay_SetColorMap(display, WWColorMap_Create(NULL)); diff --git a/WWInterrupt.c b/WWInterrupt.c index 4fa5d10..9bf6f10 100644 --- a/WWInterrupt.c +++ b/WWInterrupt.c @@ -45,7 +45,7 @@ static WWInterruptVector WWInterruptVector_Create(int number) vector = (WWInterruptVector)malloc(sizeof(_WWInterruptVector)); if (vector == NULL) - Error("WWInterruptVector_Create", "Cannot allocate memory."); + Wonx_Error("WWInterruptVector_Create", "Cannot allocate memory."); WWInterruptVector_SetNumber(vector, number); WWInterruptVector_SetCallback(vector, NULL); @@ -58,7 +58,7 @@ static WWInterruptVector WWInterruptVector_Create(int number) static WWInterruptVector WWInterruptVector_Destroy(WWInterruptVector vector) { if (vector == NULL) - Error("WWInterruptVector_Destroy", "Object is not created."); + Wonx_Error("WWInterruptVector_Destroy", "Object is not created."); free(vector); return (NULL); } @@ -71,7 +71,7 @@ static WWInterruptVector WWInterrupt_GetVector(WWInterrupt interrupt, int number) { if ((number < 0) || (number > 7)) - Error("WWInterrupt_SetVector", "Invalid interrupt number."); + Wonx_Error("WWInterrupt_SetVector", "Invalid interrupt number."); return (interrupt->vector[number]); } @@ -80,7 +80,7 @@ static WWInterruptVector WWInterrupt_SetVector(WWInterrupt interrupt, WWInterruptVector vector) { if ((number < 0) || (number > 7)) - Error("WWInterrupt_SetVector", "Invalid interrupt number."); + Wonx_Error("WWInterrupt_SetVector", "Invalid interrupt number."); return (interrupt->vector[number] = vector); } @@ -313,7 +313,7 @@ WWInterrupt WWInterrupt_Create() interrupt = (WWInterrupt)malloc(sizeof(_WWInterrupt)); if (interrupt == NULL) - Error("WWInterrupt_Create", "Cannot allocate memory."); + Wonx_Error("WWInterrupt_Create", "Cannot allocate memory."); for (i = 0; i < 8; i++) WWInterrupt_SetVector(interrupt, i, WWInterruptVector_Create(i)); @@ -331,7 +331,7 @@ WWInterrupt WWInterrupt_Destroy(WWInterrupt interrupt) WWInterruptVector vector; if (interrupt == NULL) - Error("WWInterrupt_Destroy", "Object is not created."); + Wonx_Error("WWInterrupt_Destroy", "Object is not created."); for (i = 0; i < 8; i++) { vector = WWInterrupt_GetVector(interrupt, i); diff --git a/WWInterrupt.h b/WWInterrupt.h index a5a4cc8..be7877a 100644 --- a/WWInterrupt.h +++ b/WWInterrupt.h @@ -8,7 +8,7 @@ #include #include -#include "sys/system.h" +#include "wonx_include/system.h" /*****************************************************************************/ /* クラスの定義 */ diff --git a/WWLCDPanel.c b/WWLCDPanel.c index 6d5d3ea..cfe9132 100644 --- a/WWLCDPanel.c +++ b/WWLCDPanel.c @@ -92,7 +92,8 @@ WWLCDPanel WWLCDPanel_Create(int width, int height) int x, y, i; lcd_panel = (WWLCDPanel)malloc(sizeof(_WWLCDPanel)); - if (lcd_panel == NULL) Error("WWLCDPanel_Create", "Cannot allocate memory."); + if (lcd_panel == NULL) + Wonx_Error("WWLCDPanel_Create", "Cannot allocate memory."); WWLCDPanel_SetWidth( lcd_panel, width); WWLCDPanel_SetHeight(lcd_panel, height); diff --git a/WWPalette.c b/WWPalette.c index bbbc7b8..06f3252 100644 --- a/WWPalette.c +++ b/WWPalette.c @@ -21,7 +21,8 @@ WWPalette WWPalette_Create(int number, int * mapped_colors, int transparent) WWPalette palette; palette = (WWPalette)malloc(sizeof(_WWPalette)); - if (palette == NULL) Error("WWPalette_Create", "Cannot allocate memory"); + if (palette == NULL) + Wonx_Error("WWPalette_Create", "Cannot allocate memory"); WWPalette_SetNumber(palette, number); WWPalette_SetTransparent(palette, transparent); diff --git a/WWScreen.c b/WWScreen.c index 0d8d183..dc67ab7 100644 --- a/WWScreen.c +++ b/WWScreen.c @@ -41,7 +41,7 @@ static WWScreenCharacter WWScreenCharacter_Create(int horizontal, int vertical, screen_character = (WWScreenCharacter)malloc(sizeof(_WWScreenCharacter)); if (screen_character == NULL) - Error("WWScreenCharacter", "Cannot allocate memory."); + Wonx_Error("WWScreenCharacter", "Cannot allocate memory."); WWScreenCharacter_SetHorizontal(screen_character, horizontal); WWScreenCharacter_SetVertical(screen_character, vertical); @@ -200,7 +200,8 @@ WWScreen WWScreen_Create(int number, int x, y; screen = (WWScreen)malloc(sizeof(_WWScreen)); - if (screen == NULL) Error("WWScreen_Create", "Cannot allocate memory."); + if (screen == NULL) + Wonx_Error("WWScreen_Create", "Cannot allocate memory."); WWScreen_SetNumber(screen, number); WWScreen_SetWidth( screen, width); diff --git a/WWSprite.c b/WWSprite.c index 4adfca5..7728c2c 100644 --- a/WWSprite.c +++ b/WWSprite.c @@ -63,7 +63,8 @@ WWSprite WWSprite_Create(int number, int x, int y, WWSprite sprite; sprite = (WWSprite)malloc(sizeof(_WWSprite)); - if (sprite == NULL) Error("WWSprite_Create", "Cannot allocate memory."); + if (sprite == NULL) + Wonx_Error("WWSprite_Create", "Cannot allocate memory."); WWSprite_SetNumber(sprite, number); WWSprite_SetHorizontal(sprite, horizontal); diff --git a/WWText.c b/WWText.c index b21c52a..8401248 100644 --- a/WWText.c +++ b/WWText.c @@ -55,7 +55,7 @@ int WWText_SetTextWindow(WWText ww_text, int x, int y, c = WWText_GetBase(ww_text); for (ty = 0; ty < WWText_GetHeight(ww_text); ty++) { for (tx = 0; tx < WWText_GetWidth(ww_text); tx++) { - if (c >= 512) Error("WWText_SetTextWindow", "Over character."); + if (c >= 512) Wonx_Error("WWText_SetTextWindow", "Over character."); ww_character = WWDisplay_GetCharacter(ww_display, c); WWCharacter_SetBitmap(ww_character, NULL); WWScreen_SetCharacter(WWText_GetScreen(ww_text), @@ -74,7 +74,7 @@ int WWText_PutCharacter(WWText ww_text, int x, int y, int character, WWCharacter ww_character; if ((character < 0) || (character > 127)) - Error("WWText_PutCharacter", "Character number is out of range."); + Wonx_Error("WWText_PutCharacter", "Character number is out of range."); /* * テキスト表示は,text_window_init() で指定したテキストウインドウの @@ -83,7 +83,7 @@ int WWText_PutCharacter(WWText ww_text, int x, int y, int character, if ( (x < 0) || (x > WWText_GetWidth( ww_text) - 1) || (y < 0) || (y > WWText_GetHeight(ww_text) - 1) ) - Error("WWText_PutCharacter", "Position is out of range."); + Wonx_Error("WWText_PutCharacter", "Position is out of range."); #if 0 n = WWText_GetBase(ww_text) + @@ -119,7 +119,7 @@ WWText WWText_Create(WWScreen screen, int i; ww_text = (WWText)malloc(sizeof(_WWText)); - if (ww_text == NULL) Error("WWText_Create", "Cannot allocate memory."); + if (ww_text == NULL) Wonx_Error("WWText_Create", "Cannot allocate memory."); WWText_SetScreen(ww_text, screen); WWText_SetX(ww_text, 0); @@ -139,7 +139,7 @@ WWText WWText_Destroy(WWText ww_text) { int i; - if (ww_text == NULL) Error("WWText_Destroy", "Object is not created."); + if (ww_text == NULL) Wonx_Error("WWText_Destroy", "Object is not created."); for (i = 0; i < 128; i++) { if (WWText_GetFont(ww_text, i)) diff --git a/WWTimer.c b/WWTimer.c index f93cf86..44f31f1 100644 --- a/WWTimer.c +++ b/WWTimer.c @@ -81,7 +81,7 @@ WWTimer WWTimer_Create(int auto_preset, int preset) ww_timer = (WWTimer)malloc(sizeof(_WWTimer)); if (ww_timer == NULL) - Error("WWTimer_Create", "Cannot allocate memory."); + Wonx_Error("WWTimer_Create", "Cannot allocate memory."); WWTimer_OFF(ww_timer); WWTimer_SetAutoPreset(ww_timer, auto_preset); @@ -98,7 +98,7 @@ WWTimer WWTimer_Create(int auto_preset, int preset) WWTimer WWTimer_Destroy(WWTimer ww_timer) { if (ww_timer == NULL) - Error("WWTimer_Destroy", "Object is not created."); + Wonx_Error("WWTimer_Destroy", "Object is not created."); free(ww_timer); diff --git a/WWTimer.h b/WWTimer.h index 1715d0c..ada61b5 100644 --- a/WWTimer.h +++ b/WWTimer.h @@ -8,7 +8,7 @@ #include #include -#include "sys/timer.h" +#include "wonx_include/timer.h" /*****************************************************************************/ /* クラスの定義 */ diff --git a/Wonx.c b/Wonx.c index d0b7b7f..a461348 100644 --- a/Wonx.c +++ b/Wonx.c @@ -1,9 +1,9 @@ #include "WonxP.h" #include "etc.h" -#include "sys/disp.h" -#include "sys/text.h" -#include "sys/system.h" +#include "wonx_include/disp.h" +#include "wonx_include/text.h" +#include "wonx_include/system.h" /*****************************************************************************/ /* ディスプレイの確保 */ @@ -22,7 +22,7 @@ void Wonx_Create(void) WWPalette palette; wonx = (Wonx)malloc(sizeof(_Wonx)); - if (wonx == NULL) Error("Wonx_Create", "Cannot allocate memory."); + if (wonx == NULL) Wonx_Error("Wonx_Create", "Cannot allocate memory."); wonx->wonx_display = WonxDisplay_Create(LCD_PIXEL_WIDTH * 2, LCD_PIXEL_HEIGHT * 2, diff --git a/WonxDisplay.c b/WonxDisplay.c index 3ddfd02..08d91f3 100644 --- a/WonxDisplay.c +++ b/WonxDisplay.c @@ -29,17 +29,17 @@ WonxDisplay WonxDisplay_Create(int x_width, int x_height, wonx_display = (WonxDisplay)malloc(sizeof(_WonxDisplay)); if (wonx_display == NULL) - Error("WonxDisplay_Create", "Cannot allocate memory."); + Wonx_Error("WonxDisplay_Create", "Cannot allocate memory."); ww_display = WWDisplay_Create(ww_lcd_panel_width, ww_lcd_panel_height, ww_screen_width, ww_screen_height); if (ww_display == NULL) - Error("WonxDisplay_Create", "Cannot create WonderWitch display."); + Wonx_Error("WonxDisplay_Create", "Cannot create WonderWitch display."); WonxDisplay_SetWWDisplay(wonx_display, ww_display); x_display = XDisplay_Create(x_width, x_height); if (x_display == NULL) - Error("WonxDisplay_Create", "Cannot create X display."); + Wonx_Error("WonxDisplay_Create", "Cannot create X display."); WonxDisplay_SetXDisplay(wonx_display, x_display); return (wonx_display); diff --git a/WonxSystem.c b/WonxSystem.c index 130a80b..2ed6bc3 100644 --- a/WonxSystem.c +++ b/WonxSystem.c @@ -2,8 +2,9 @@ /* ここから */ /*****************************************************************************/ +#include "wonx_configure.h" + #include "WonxSystemP.h" -#include "configure.h" #include "etc.h" /*****************************************************************************/ @@ -79,29 +80,29 @@ WonxSystem WonxSystem_Create() wonx_system = (WonxSystem)malloc(sizeof(_WonxSystem)); if (wonx_system == NULL) - Error("WonxSystem_Create", "Cannot allocate memory."); + Wonx_Error("WonxSystem_Create", "Cannot allocate memory."); ww_interrupt = WWInterrupt_Create(); if (ww_interrupt == NULL) - Error("WonxSystem_Create", "Cannot create WonderWitch interrupt."); + Wonx_Error("WonxSystem_Create", "Cannot create WonderWitch interrupt."); WonxSystem_SetWWInterrupt(wonx_system, ww_interrupt); /* VBlank は WONX_VBLANK_INTERVAL * 0.1 秒毎とする */ ww_timer = WWTimer_Create(1, WONX_VBLANK_INTERVAL); if (ww_timer == NULL) - Error("WonxSystem_Create", "Cannot create WonderWitch VBlank timer."); + Wonx_Error("WonxSystem_Create", "Cannot create WonderWitch VBlank timer."); WonxSystem_SetWWVBlankTimer(wonx_system, ww_timer); ww_timer = WWTimer_Create(0, WONX_VBLANK_INTERVAL); if (ww_timer == NULL) - Error("WonxSystem_Create", - "Cannot create WonderWitch VBlank count up timer."); + Wonx_Error("WonxSystem_Create", + "Cannot create WonderWitch VBlank count up timer."); WonxSystem_SetWWVBlankCountUpTimer(wonx_system, ww_timer); ww_timer = WWTimer_Create(0, WONX_HBLANK_INTERVAL); if (ww_timer == NULL) - Error("WonxSystem_Create", - "Cannot create WonderWitch HBlank count up timer."); + Wonx_Error("WonxSystem_Create", + "Cannot create WonderWitch HBlank count up timer."); WonxSystem_SetWWHBlankCountUpTimer(wonx_system, ww_timer); WWTimer_Reset(WonxSystem_GetWWVBlankTimer( wonx_system)); @@ -113,10 +114,10 @@ WonxSystem WonxSystem_Create() WWTimer_OFF(WonxSystem_GetWWHBlankCountUpTimer(wonx_system)); /* タイマのインターバルは,0.1 秒単位とする */ - unix_timer = UNIXTimer_Create(1, WONX_TIMER_INTERVAL, wonx_system, + unix_timer = UNIXTimer_Create(1, WONX_TIMER_INTERVAL, wonx_system, (UNIXTimerCallBack)WonxTimer_Callback); if (unix_timer == NULL) - Error("WonxSystem_Create", "Cannot create UNIX timer."); + Wonx_Error("WonxSystem_Create", "Cannot create UNIX timer."); WonxSystem_SetUNIXTimer(wonx_system, unix_timer); UNIXTimer_ON(unix_timer); @@ -131,7 +132,7 @@ WonxSystem WonxSystem_Destroy(WonxSystem wonx_system) UNIXTimer unix_timer; if (wonx_system == NULL) - Error("WonxSystem_Destroy", "Object is not created."); + Wonx_Error("WonxSystem_Destroy", "Object is not created."); unix_timer = WonxSystem_GetUNIXTimer(wonx_system); diff --git a/WonxText.c b/WonxText.c index 641a640..cdc75b6 100644 --- a/WonxText.c +++ b/WonxText.c @@ -22,11 +22,11 @@ WonxText WonxText_Create(WWScreen screen, int x, int y, int width, int height, wonx_text = (WonxText)malloc(sizeof(_WonxText)); if (wonx_text == NULL) - Error("WonxText_Create", "Cannot allocate memory."); + Wonx_Error("WonxText_Create", "Cannot allocate memory."); ww_text = WWText_Create(screen, x, y, width, height, palette); if (ww_text == NULL) - Error("WonxText_Create", "Cannot create WonderWitch text."); + Wonx_Error("WonxText_Create", "Cannot create WonderWitch text."); WonxText_SetWWText(wonx_text, ww_text); return (wonx_text); @@ -35,10 +35,10 @@ WonxText WonxText_Create(WWScreen screen, int x, int y, int width, int height, WonxText WonxText_Destroy(WonxText wonx_text) { if (wonx_text == NULL) - Error("WonxText_Destroy", "Object is not created."); + Wonx_Error("WonxText_Destroy", "Object is not created."); if (WonxText_GetWWText(wonx_text)) - WonxText_SetWWText(wonx_text, + WonxText_SetWWText(wonx_text, WWText_Destroy(WonxText_GetWWText(wonx_text))); free(wonx_text); diff --git a/XDisplay.c b/XDisplay.c index c207940..39bdd50 100644 --- a/XDisplay.c +++ b/XDisplay.c @@ -2,15 +2,15 @@ /* ここから */ /*****************************************************************************/ +#include +#include +#include +#include + #include "XDisplayP.h" #include "Wonx.h" #include "etc.h" -#include -#include -#include -#include - /*****************************************************************************/ /* メンバ関数の定義 */ /*****************************************************************************/ @@ -55,7 +55,7 @@ static void quit(Widget w, XEvent * event, String * params, Cardinal * num) static void wm_protocols_proc(Widget w, XEvent * event, String * params, Cardinal * num) { - if ((event->type == ClientMessage) && + if ((event->type == ClientMessage) && (event->xclient.data.l[0] != wm_delete_window)) { XBell(XtDisplay(w), 0); } else { @@ -226,7 +226,8 @@ XDisplay XDisplay_Create(int width, int height) int i; x_display = (XDisplay)malloc(sizeof(_XDisplay)); - if (x_display == NULL) Error("XDisplay_Create", "Cannot allocate memory."); + if (x_display == NULL) + Wonx_Error("XDisplay_Create", "Cannot allocate memory."); x_display->width = width; x_display->height = height; @@ -405,7 +406,7 @@ int XDisplay_DrawLCDWindow(XDisplay x_display, WWLCDPanel ww_lcd_panel) rectangles[pixel] = (XRectangle *)malloc(sizeof(XRectangle) * num); } if (rectangles == NULL) - Error("XDisplay_DrawLCDWindow", "Cannot allocate memory."); + Wonx_Error("XDisplay_DrawLCDWindow", "Cannot allocate memory."); ww_lcd_width = WWLCDPanel_GetWidth( ww_lcd_panel); ww_lcd_height = WWLCDPanel_GetHeight(ww_lcd_panel); diff --git a/XDisplay.h b/XDisplay.h index 6a59ea3..566b08a 100644 --- a/XDisplay.h +++ b/XDisplay.h @@ -5,7 +5,7 @@ /* ここから */ /*****************************************************************************/ -#include "sys/key.h" +#include "wonx_include/key.h" #include "WWLCDPanel.h" diff --git a/bank.c b/bank.c index e70ece2..db4501a 100644 --- a/bank.c +++ b/bank.c @@ -5,7 +5,7 @@ #include #include -#include "sys/bank.h" +#include "wonx_include/bank.h" #include "Wonx.h" @@ -39,39 +39,39 @@ int bank_get_map(int bank) return (0); } -unsigned char bank_read_byte(int bank, unsigned int offset) +unsigned char bank_read_byte(int bank, unsigned int off) { return (0); } -void bank_write_byte(int bank, unsigned int offset, unsigned int data) +void bank_write_byte(int bank, unsigned int off, unsigned int data) { return; } -unsigned int bank_read_word(int bank, unsigned int offset) +unsigned int bank_read_word(int bank, unsigned int off) { return (0); } -void bank_write_word(int bank, unsigned int offset, unsigned int data) +void bank_write_word(int bank, unsigned int off, unsigned int data) { return; } -void bank_read_block(int bank, unsigned int offset, +void bank_read_block(int bank, unsigned int off, void * buffer, unsigned int size) { return; } -void bank_write_block(int bank, unsigned int offset, +void bank_write_block(int bank, unsigned int off, void * buffer, unsigned int size) { return; } -void bank_fill_block(int bank, unsigned int offset, +void bank_fill_block(int bank, unsigned int off, unsigned int size, unsigned int data) { return; diff --git a/comm.c b/comm.c index e44860a..fec0da4 100644 --- a/comm.c +++ b/comm.c @@ -5,7 +5,7 @@ #include #include -#include "sys/comm.h" +#include "wonx_include/comm.h" #include "Wonx.h" @@ -35,7 +35,7 @@ void comm_open(void) void comm_close(void) {} -int comm_send_char(unsigned char byte) +int comm_send_char(unsigned char c) { return (0); } @@ -65,11 +65,11 @@ int comm_receive_block(void * buffer, int size) return (0); } -void comm_set_timeout(int receive_timeout, int send_timeout) +void comm_set_timeout(int recv_timeout, int send_timeout) { } -void comm_set_baudrate(int speed) +void comm_set_baudrate(int baudrate) { } @@ -87,12 +87,10 @@ unsigned int comm_get_cancel_key(void) return (0); } -#if 0 int comm_xmodem(void * xmodem) { return (0); } -#endif /*****************************************************************************/ /* ここまで */ diff --git a/disp.c b/disp.c index 715aea8..ac4a5a7 100644 --- a/disp.c +++ b/disp.c @@ -5,7 +5,7 @@ #include #include -#include "sys/disp.h" +#include "wonx_include/disp.h" #include "Wonx.h" @@ -13,6 +13,11 @@ /* 互換関数の定義 */ /*****************************************************************************/ +/* + * void * でデータを渡す関数は,型を間違えるバグが入る可能性があるので, + * void * を適切な型に置き換えてある. + */ + /* * Xサーバとの同期の整合性がとれなくなるなどの問題が考えられるので, * 互換関数の内部は UNIXTimer_Pause(), UNIXTimer_Unpause() でくくり, @@ -72,7 +77,7 @@ void display_control(unsigned int flags) return; } -unsigned int display_status() +unsigned int display_status(void) { WWDisplay ww_display; unsigned short int ret; @@ -123,12 +128,16 @@ unsigned int display_status() return (ret); } -void font_set_monodata(unsigned int number, unsigned int count, void * data) +/* + * void * data だと,まちがって int * でデータを指定するようなバグが + * 入る可能性があるので,unsigned char * data にした. + */ +void font_set_monodata(unsigned int number, unsigned int count, + unsigned char * data) { WWCharacter c; int i, x, y, n, p; int f, b; - unsigned char * d; WWDisplay ww_display; if (!Wonx_IsCreated()) Wonx_Create(); @@ -137,20 +146,19 @@ void font_set_monodata(unsigned int number, unsigned int count, void * data) UNIXTimer_Pause(WonxSystem_GetUNIXTimer(Wonx_GetWonxSystem())); printf("call : font_set_monodata() : number = %u, count = %u, data = %p\n", - (int)number, (int)count, data); fflush(stdout); + (int)number, (int)count, (void *)data); fflush(stdout); ww_display = WonxDisplay_GetWWDisplay(Wonx_GetWonxDisplay()); - n = 0; - d = (unsigned char *)data; /* ひとつのキャラクタデータは8バイト */ f = WWDisplay_GetForegroundColor(ww_display); b = WWDisplay_GetBackgroundColor(ww_display); + n = 0; for (i = 0; i < count; i++) { c = WWDisplay_GetCharacter(ww_display, number + i); for (y = 0; y < 8; y++) { for (x = 0; x < 8; x++) { - p = (d[n] & (1 << (7 - x))) ? f : b; /*これでよいのか?*/ + p = (data[n] & (1 << (7 - x))) ? f : b; /*これでよいのか?*/ WWCharacter_SetPixel(c, x, y, p); } n++; @@ -168,12 +176,15 @@ void font_set_monodata(unsigned int number, unsigned int count, void * data) return; } -void font_set_colordata(unsigned int number, - unsigned int count, void * data) +/* + * void * data だと,まちがって int * でデータを指定するようなバグが + * 入る可能性があるので,unsigned char * data にした. + */ +void font_set_colordata(unsigned int number, unsigned int count, + unsigned char * data) { WWCharacter c; int i, x, y, n, p; - unsigned char * d; if (!Wonx_IsCreated()) Wonx_Create(); @@ -181,10 +192,9 @@ void font_set_colordata(unsigned int number, UNIXTimer_Pause(WonxSystem_GetUNIXTimer(Wonx_GetWonxSystem())); printf("call : font_set_colordata() : number = %u, count = %u, data = %p\n", - (int)number, (int)count, data); fflush(stdout); + (int)number, (int)count, (void *)data); fflush(stdout); n = 0; - d = (unsigned char *)data; /* ひとつのキャラクタデータは16バイト */ for (i = 0; i < count; i++) { c = WWDisplay_GetCharacter(WonxDisplay_GetWWDisplay(Wonx_GetWonxDisplay()), @@ -193,8 +203,8 @@ void font_set_colordata(unsigned int number, for (x = 0; x < 8; x++) { /*これでよいのか?*/ - p = ((d[n] & (1 << (7-x))) ? 2 : 0) - + ((d[n + 1] & (1 << (7-x))) ? 1 : 0); + p = ((data[n] & (1 << (7-x))) ? 2 : 0) + + ((data[n + 1] & (1 << (7-x))) ? 1 : 0); WWCharacter_SetPixel(c, x, y, p); } @@ -214,13 +224,16 @@ void font_set_colordata(unsigned int number, return; } -void font_get_data(unsigned int number, - unsigned int count, void * data) +/* + * void * data だと,まちがって int * でデータを指定するようなバグが + * 入る可能性があるので,unsigned char * data にした. + */ +void font_get_data(unsigned int number, unsigned int count, + unsigned char * data) { /* 関数の仕様がわからんので適当に書くぞ */ WWCharacter c; int i, x, y, n, p; - unsigned char * d; if (!Wonx_IsCreated()) Wonx_Create(); @@ -228,22 +241,21 @@ void font_get_data(unsigned int number, UNIXTimer_Pause(WonxSystem_GetUNIXTimer(Wonx_GetWonxSystem())); printf("call : font_get_data() : number = %u, count = %u, data = %p\n", - (int)number, (int)count, data); fflush(stdout); + (int)number, (int)count, (void *)data); fflush(stdout); n = 0; - d = (unsigned char *)data; /* ひとつのキャラクタデータは16バイト? */ for (i = 0; i < count; i++) { c = WWDisplay_GetCharacter(WonxDisplay_GetWWDisplay(Wonx_GetWonxDisplay()), number + i); for (y = 0; y < 8; y++) { - d[n ] = 0; - d[n+1] = 0; + data[n ] = 0; + data[n+1] = 0; for (x = 0; x < 8; x++) { p = WWCharacter_GetPixel(c, x, y); /* これでよいのか? */ - d[n ] |= (((unsigned char)p & 0x02) ? 1 : 0) << (7-x); - d[n+1] |= (((unsigned char)p & 0x01) ? 1 : 0) << (7-x); + data[n ] |= (((unsigned char)p & 0x02) ? 1 : 0) << (7-x); + data[n+1] |= (((unsigned char)p & 0x01) ? 1 : 0) << (7-x); } n++; n++; @@ -347,10 +359,14 @@ static void _screen_set_char1(int screen, int x, int y, return; } -void screen_set_char(int screen, int x, int y, int w, int h, void * data) +/* + * void * data だと,まちがって int * でデータを指定するようなバグが + * 入る可能性があるので,unsigned short int * data にした. + */ +void screen_set_char(int screen, int x, int y, int w, int h, + unsigned short int * data) { int i, j; - unsigned short int * d; if (!Wonx_IsCreated()) Wonx_Create(); @@ -358,15 +374,13 @@ void screen_set_char(int screen, int x, int y, int w, int h, void * data) UNIXTimer_Pause(WonxSystem_GetUNIXTimer(Wonx_GetWonxSystem())); printf("call : screen_set_char() : screen = %d, x = %d, y = %d, w = %d, h = %d, data = %p\n", - screen, x, y, w, h, data); + screen, x, y, w, h, (void *)data); fflush(stdout); - d = (unsigned short int *)data; - for (j = 0; j < h; j++) { for (i = 0; i < w; i++) { - _screen_set_char1(screen, x + i, y + j, *d); - d++; + _screen_set_char1(screen, x + i, y + j, *data); + data++; } } @@ -411,10 +425,14 @@ static unsigned int _screen_get_char1(int screen, int x, int y) return (ret); } -void screen_get_char(int screen, int x, int y, int w, int h, void * data) +/* + * void * data だと,まちがって int * でデータを指定するようなバグが + * 入る可能性があるので,unsigned short int * data にした. + */ +void screen_get_char(int screen, int x, int y, int w, int h, + unsigned short int * data) { int i, j; - unsigned short int * d; if (!Wonx_IsCreated()) Wonx_Create(); @@ -422,15 +440,13 @@ void screen_get_char(int screen, int x, int y, int w, int h, void * data) UNIXTimer_Pause(WonxSystem_GetUNIXTimer(Wonx_GetWonxSystem())); printf("call : screen_get_char() : screen = %d, x = %d, y = %d, w = %d, h = %d, data = %p\n", - screen, x, y, w, h, data); + screen, x, y, w, h, (void *)data); fflush(stdout); - d = (unsigned short int *)data; - for (j = 0; j < h; j++) { for (i = 0; i < w; i++) { - *d = _screen_get_char1(screen, x, y); - d++; + *data = _screen_get_char1(screen, x, y); + data++; } } @@ -535,20 +551,20 @@ void screen_fill_attr(int screen, int x, int y, int w, int h, return; } -void sprite_set_range(unsigned int sprite_start, unsigned int sprite_count) +void sprite_set_range(unsigned int start, unsigned int number) { if (!Wonx_IsCreated()) Wonx_Create(); /* タイマを一時停止する */ UNIXTimer_Pause(WonxSystem_GetUNIXTimer(Wonx_GetWonxSystem())); - printf("call : sprite_set_range() : start = %u, count = %u\n", - (int)sprite_start, (int)sprite_count); fflush(stdout); + printf("call : sprite_set_range() : start = %u, number = %u\n", + (int)start, (int)number); fflush(stdout); WWDisplay_SetSpriteStart(WonxDisplay_GetWWDisplay(Wonx_GetWonxDisplay()), - sprite_start); + start); WWDisplay_SetSpriteCount(WonxDisplay_GetWWDisplay(Wonx_GetWonxDisplay()), - sprite_count); + number); WonxDisplay_Flush(Wonx_GetWonxDisplay()); @@ -575,8 +591,10 @@ static void _sprite_set_char(unsigned int sprite_num, unsigned int data) WWSprite_SetPriority( s, (data >> 13) ? 1 : 0); WWSprite_SetClipping( s, (data >> 12) ? 1 : 0); + /* 8を引いた値でパレット番号が指定されるので,8を足してやる */ p = WWDisplay_GetPalette(WonxDisplay_GetWWDisplay(Wonx_GetWonxDisplay()), - (data >> 9) & 0x07); + ((data >> 9) & 0x07) + 8); + c = WWDisplay_GetCharacter(WonxDisplay_GetWWDisplay(Wonx_GetWonxDisplay()), data & 0x1ff); @@ -628,7 +646,9 @@ static unsigned int _sprite_get_char(unsigned int sprite_num) p = WWSprite_GetPalette(s); c = WWSprite_GetCharacter(s); - ret |= (WWPalette_GetNumber(p) & 0x07) << 9; + + /* 8を引いた値でパレット番号が指定されるので,8を引いてやる */ + ret |= ((WWPalette_GetNumber(p) - 8) & 0x07) << 9; ret |= WWCharacter_GetNumber(c); return (ret); @@ -794,10 +814,14 @@ unsigned long int sprite_get_char_location(unsigned int sprite_num) return (ret); } -void sprite_set_data(unsigned int sprite_num, unsigned int count, void * data) +/* + * void * data だと,まちがって int * でデータを指定するようなバグが + * 入る可能性があるので,unsigned long int * data にした. + */ +void sprite_set_data(unsigned int sprite_num, unsigned int count, + unsigned long int * data) { int i; - unsigned long int * n; if (!Wonx_IsCreated()) Wonx_Create(); @@ -805,15 +829,14 @@ void sprite_set_data(unsigned int sprite_num, unsigned int count, void * data) UNIXTimer_Pause(WonxSystem_GetUNIXTimer(Wonx_GetWonxSystem())); printf("call : sprite_set_data() : number = %u, count = %u, data = %p\n", - (int)sprite_num, (int)count, data); + (int)sprite_num, (int)count, (void *)data); fflush(stdout); - n = (unsigned long int *)data; for (i = 0; i < count; i++) { _sprite_set_char_location(sprite_num + i, - n[i] >> 16, - (n[i] >> 8) & 0xff, - n[i] & 0xff); + data[i] >> 16, + (data[i] >> 8) & 0xff, + data[i] & 0xff); } WonxDisplay_Flush(Wonx_GetWonxDisplay()); @@ -1019,8 +1042,7 @@ unsigned long int sprite_get_window(void) return (ret); } -void palette_set_color(unsigned int palette_num, - unsigned int colors) +void palette_set_color(unsigned int palette_num, unsigned int colors) { int mapped_colors[4]; WWPalette palette; @@ -1166,7 +1188,7 @@ unsigned long int lcd_get_color(void) return (ret); } -void lcd_set_segments(unsigned segments) +void lcd_set_segments(unsigned int segments) { if (!Wonx_IsCreated()) Wonx_Create(); @@ -1200,7 +1222,7 @@ unsigned int lcd_get_segments(void) return (0); } -void lcd_set_sleep(unsigned slp) +void lcd_set_sleep(unsigned int slp) { if (!Wonx_IsCreated()) Wonx_Create(); @@ -1234,7 +1256,7 @@ unsigned int lcd_get_sleep(void) return (0); } -void screen_set_vram(int screen, int locationID) +void screen_set_vram(int screen, int location_id) { if (!Wonx_IsCreated()) Wonx_Create(); @@ -1251,7 +1273,7 @@ void screen_set_vram(int screen, int locationID) return; } -void sprite_set_vram(int locationID) +void sprite_set_vram(int location_id) { if (!Wonx_IsCreated()) Wonx_Create(); diff --git a/etc.c b/etc.c index 677f43c..757580f 100644 --- a/etc.c +++ b/etc.c @@ -7,7 +7,7 @@ /* エラー処理 */ /*===========================================================================*/ -int Error(char * funcname, char * message) +int Wonx_Error(char * funcname, char * message) { fprintf(stderr, "%s(): %s\n", funcname, message); exit (1); diff --git a/etc.h b/etc.h index 04e3571..e3ca5e5 100644 --- a/etc.h +++ b/etc.h @@ -5,7 +5,7 @@ /* エラー処理 */ /*===========================================================================*/ -int Error(char * funcname, char * message); +int Wonx_Error(char * funcname, char * message); /*===========================================================================*/ /* "true", "false" の文字列を返す */ diff --git a/key.c b/key.c index c241be9..0d6f72f 100644 --- a/key.c +++ b/key.c @@ -5,7 +5,7 @@ #include #include -#include "sys/key.h" +#include "wonx_include/key.h" #include "Wonx.h" diff --git a/makefile_for_smac b/makefile_for_smac new file mode 100644 index 0000000..7de4dfe --- /dev/null +++ b/makefile_for_smac @@ -0,0 +1,38 @@ +SOURCES = chara.c game.c man.c mansub.c mansub2.c map.c mapsub.c menu.c monster.c picture.c player.c smac.c stage.c dsp.c etc.c + +# コマンドラインの長さには制限があるので,長さに注意すること +OBJS = 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 + +.SUFFIXES: .c .o + +all : smac + +smac : $(OBJS) + gcc -g -o smac $(OBJS) -lwonx -lX11 -lXt -L. -L/usr/X11R6/lib + +# xsmac + +#smac : smac.fx + +#smac.fx : smac.bin +# doscmd mkfent16 smac.cf + +#smac.bin : $(OBJS) +# echo $(OBJS) > objs +# doscmd lcc86 -o smac.bin -O @objs + +.c.o : $*.c + gcc -c $*.c -g -I. + +clean : + rm -f smac.fx smac.bin smac $(OBJS) + +package : smac.fx + rm -fR smac-b02 + mkdir -p smac-b02 + cp -R copying copyrigh readme history makefile doscmdrc *.c *.h \ + smac.bin smac.cf smac.fx pic8 \ + smac-b02 + zip -r smac-b02 smac-b02 + +xsmac : diff --git a/sample1.c b/sample1.c new file mode 100644 index 0000000..b0cca64 --- /dev/null +++ b/sample1.c @@ -0,0 +1,23 @@ +#include "wonx_include/text.h" +#include "wonx_include/key.h" + +main() +{ + text_screen_init(); + text_put_string(0, 1, " Wonx - WonderWitch on X. "); + text_put_string(0, 3, " This is test program "); + text_put_string(0, 4, " for Wonx. "); + text_put_string(0, 6, " Wonx is an emulator for "); + text_put_string(0, 7, " WonderWitch on X. It is "); + text_put_string(0, 8, " linked to program for "); + text_put_string(0, 9, " WonderWitch and behave as "); + text_put_string(0, 10, " WonderWitch. "); + text_put_string(0, 12, " Wonx Copyright (c) 2000 "); + text_put_string(0, 13, " Sakai Hiroaki. "); + text_put_string(0, 14, " All Rights Reserved. "); + text_put_string(0, 16, " Hit space key to exit. "); + + key_wait(); + + bios_exit(); +} diff --git a/sample2.c b/sample2.c new file mode 100644 index 0000000..c74c6a0 --- /dev/null +++ b/sample2.c @@ -0,0 +1,47 @@ +#include "wonx_include/disp.h" +#include "wonx_include/key.h" + +static unsigned char clear[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; +static unsigned char block[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; + +main() +{ + int x, y, f, k; + + display_control(DCM_SCR2 | DCM_SPR); + + lcd_set_color(0, 0xffff); + palette_set_color(0, 0); + palette_set_color(8, (0xf << 12)); + + font_set_color(0x03); + + font_set_monodata(0, 1, clear); + font_set_monodata(1, 1, block); + + sprite_set_char(0, + CFM_SPR_UPPER | + ((0 << 9) & CFM_SPR_PALETTE) | + (1 & CFM_FONT) + ); + + sprite_set_range(0, 1); + + x = 14; + y = 9; + f = 0; + + while (!f) { + sprite_set_location(0, x * 8, y * 8); + + k = key_hit_check(); + if (k & KEY_START) f = 1; + if (k & KEY_A) f = 1; + if ((k & KEY_LEFT1) && (x > 0)) x--; + if ((k & KEY_RIGHT1) && (x < LCD_PIXEL_WIDTH/8 - 1)) x++; + if ((k & KEY_UP1) && (y > 0)) y--; + if ((k & KEY_DOWN1) && (y < LCD_PIXEL_HEIGHT/8 - 1)) y++; + } + + bios_exit(); +} diff --git a/smac-b02.zip b/smac-b02.zip new file mode 100644 index 0000000000000000000000000000000000000000..63a59cc7006181d4090725c4f0042a1d54c3dbb7 GIT binary patch literal 56988 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 #include -#include "sys/sound.h" +#include "wonx_include/sound.h" #include "Wonx.h" diff --git a/sys2wonx.pl b/sys2wonx.pl new file mode 100644 index 0000000..0b899d1 --- /dev/null +++ b/sys2wonx.pl @@ -0,0 +1,14 @@ +#!/usr/bin/perl + +while ($FILENAME = shift(@ARGV)) { + open (RFILE, "< $FILENAME"); + open (WFILE, "> $FILENAME.tmp"); + while () { + s/^(\s*\#\s*include\s*)[\<\"]sys\/(.+\.h)[\>\"]/$1\"wonx_include\/$2\"/i; + print WFILE $_; + } + close (RFILE); + close (WFILE); + + system("mv $FILENAME.tmp $FILENAME"); +} diff --git a/system.c b/system.c index 7d047ae..9406b7f 100644 --- a/system.c +++ b/system.c @@ -2,9 +2,10 @@ /* ここから */ /*****************************************************************************/ +#include #include -#include "sys/system.h" +#include "wonx_include/system.h" #include "Wonx.h" @@ -28,8 +29,8 @@ * 引数の表示の問題もあるしね. */ -void sys_interrupt_set_hook(int type, intvector_t * intvector, - intvector_t * last_intvector) +void sys_interrupt_set_hook(int type, intvector_t * vector, + intvector_t * old_vector) { WWInterrupt ww_interrupt; @@ -38,18 +39,18 @@ void sys_interrupt_set_hook(int type, intvector_t * intvector, /* タイマを一時停止する */ UNIXTimer_Pause(WonxSystem_GetUNIXTimer(Wonx_GetWonxSystem())); - printf("call : sys_interrupt_set_hook() : type = %d, intvector = %p, last_intvector = %p\n", type, intvector, last_intvector); + printf("call : sys_interrupt_set_hook() : type = %d, vector = %p, old_vector = %p\n", type, vector, old_vector); fflush(stdout); ww_interrupt = WonxSystem_GetWWInterrupt(Wonx_GetWonxSystem()); - last_intvector->callback = WWInterrupt_GetCallback(ww_interrupt, type); - last_intvector->cs = WWInterrupt_GetCS(ww_interrupt, type); - last_intvector->ds = WWInterrupt_GetDS(ww_interrupt, type); + old_vector->callback = WWInterrupt_GetCallback(ww_interrupt, type); + old_vector->cs = WWInterrupt_GetCS(ww_interrupt, type); + old_vector->ds = WWInterrupt_GetDS(ww_interrupt, type); - WWInterrupt_SetCallback(ww_interrupt, type, intvector->callback); - WWInterrupt_SetCS(ww_interrupt, type, intvector->cs); - WWInterrupt_SetDS(ww_interrupt, type, intvector->ds); + WWInterrupt_SetCallback(ww_interrupt, type, vector->callback); + WWInterrupt_SetCS(ww_interrupt, type, vector->cs); + WWInterrupt_SetDS(ww_interrupt, type, vector->ds); printf("call : sys_interrupt_set_hook() : return value = none\n"); fflush(stdout); @@ -60,7 +61,7 @@ void sys_interrupt_set_hook(int type, intvector_t * intvector, return; } -void sys_interrupt_reset_hook(int type, intvector_t * last_intvector) +void sys_interrupt_reset_hook(int type, intvector_t * old_vector) { WWInterrupt ww_interrupt; @@ -69,14 +70,14 @@ void sys_interrupt_reset_hook(int type, intvector_t * last_intvector) /* タイマを一時停止する */ UNIXTimer_Pause(WonxSystem_GetUNIXTimer(Wonx_GetWonxSystem())); - printf("call : sys_interrupt_reset_hook() : type = %d, last_intvector = %p\n", type, last_intvector); + printf("call : sys_interrupt_reset_hook() : type = %d, old_vector = %p\n", type, old_vector); fflush(stdout); ww_interrupt = WonxSystem_GetWWInterrupt(Wonx_GetWonxSystem()); - WWInterrupt_SetCallback(ww_interrupt, type, last_intvector->callback); - WWInterrupt_SetCS(ww_interrupt, type, last_intvector->cs); - WWInterrupt_SetDS(ww_interrupt, type, last_intvector->ds); + WWInterrupt_SetCallback(ww_interrupt, type, old_vector->callback); + WWInterrupt_SetCS(ww_interrupt, type, old_vector->cs); + WWInterrupt_SetDS(ww_interrupt, type, old_vector->ds); printf("call : sys_interrupt_reset_hook() : return value = none\n"); fflush(stdout); @@ -87,7 +88,7 @@ void sys_interrupt_reset_hook(int type, intvector_t * last_intvector) return; } -void sys_wait(unsigned int time) +void sys_wait(unsigned int wait_time) { } @@ -104,29 +105,29 @@ void sys_set_sleep_time(int sleep_time) { } -int sys_get_sleep_time(void) +int sys_get_sleep_time(void) { return (0); } -void sys_set_awake_key(int awake_key_pattern) +void sys_set_awake_key(int pattern) { } -int sys_get_awake_key(void) +int sys_get_awake_key(void) { return (0); } -void sys_set_keepalive_int(int keepalive_pattern) +void sys_set_keepalive_int(int pattern) { } -void sys_get_ownerinfo(int size, char *buffer) +void sys_get_ownerinfo(int size, char * buffer) { } -int sys_suspend(int core) +int sys_suspend(int core) { return (0); } @@ -135,7 +136,7 @@ void sys_resume(int core) { } -void sys_set_remote(int remote_enable) +void sys_set_remote(int remote) { } @@ -144,7 +145,7 @@ unsigned int sys_get_remote(void) return (0); } -void * sys_alloc_iram(void *pointer, unsigned size) +void * sys_alloc_iram(void * p, unsigned int size) { return (NULL); } @@ -176,6 +177,13 @@ unsigned int sys_get_resume(void) return (0); } +void bios_exit() +{ + printf("call : bios_exit() : \n"); + fflush(stdout); + exit (0); +} + /*****************************************************************************/ /* ここまで */ /*****************************************************************************/ diff --git a/text.c b/text.c index 553a4a9..c351525 100644 --- a/text.c +++ b/text.c @@ -2,10 +2,11 @@ /* ここから */ /*****************************************************************************/ +#include #include #include -#include "sys/text.h" +#include "wonx_include/text.h" #include "Wonx.h" #include "WWText.h" @@ -30,7 +31,7 @@ * 引数の表示の問題もあるしね. */ -static void _text_window_init(int x, int y, int w, int h, unsigned font_base) +static void _text_window_init(int x, int y, int w, int h, unsigned int base) { WWText ww_text; WWDisplay ww_display; @@ -38,7 +39,7 @@ static void _text_window_init(int x, int y, int w, int h, unsigned font_base) ww_text = WonxText_GetWWText(Wonx_GetWonxText()); ww_display = WonxDisplay_GetWWDisplay(Wonx_GetWonxDisplay()); - WWText_SetTextWindow(ww_text, x, y, w, h, font_base, ww_display); + WWText_SetTextWindow(ww_text, x, y, w, h, base, ww_display); WWScreen_SetRollX(WWText_GetScreen(ww_text), 0); WWScreen_SetRollY(WWText_GetScreen(ww_text), 0); @@ -74,7 +75,7 @@ void text_screen_init(void) return; } -void text_window_init(int x, int y, int w, int h, unsigned int font_base) +void text_window_init(int x, int y, int w, int h, unsigned int base) { WWDisplay ww_display; @@ -83,12 +84,12 @@ void text_window_init(int x, int y, int w, int h, unsigned int font_base) /* タイマを一時停止する */ UNIXTimer_Pause(WonxSystem_GetUNIXTimer(Wonx_GetWonxSystem())); - printf("call : text_window_init() : x = %d, y = %d, width = %d, height = %d, base = %u\n", x, y, w, h, (int)font_base); + printf("call : text_window_init() : x = %d, y = %d, width = %d, height = %d, base = %u\n", x, y, w, h, (int)base); fflush(stdout); ww_display = WonxDisplay_GetWWDisplay(Wonx_GetWonxDisplay()); - _text_window_init(x, y, w, h, font_base); + _text_window_init(x, y, w, h, base); WonxDisplay_Flush(Wonx_GetWonxDisplay()); @@ -109,7 +110,7 @@ int text_get_mode(void) return (0); } -void _text_put_char(int x, int y, unsigned int c) +static void _text_put_char(int x, int y, unsigned int c) { WWText ww_text; WWDisplay ww_display; @@ -144,7 +145,7 @@ void text_put_char(int x, int y, unsigned int c) return; } -static int _text_put_string(int x, int y, char * s) +static int _text_put_string(int x, int y, char * string) { int i, len, ret; WWText ww_text; @@ -153,17 +154,17 @@ static int _text_put_string(int x, int y, char * s) ww_text = WonxText_GetWWText(Wonx_GetWonxText()); ww_display = WonxDisplay_GetWWDisplay(Wonx_GetWonxDisplay()); - len = strlen(s); + len = strlen(string); ret = 0; for (i = 0; i < len; i++) { - if (WWText_PutCharacter(ww_text, x + i, y, s[i], ww_display) >= 0) + if (WWText_PutCharacter(ww_text, x + i, y, string[i], ww_display) >= 0) ret++; } return (ret); } -int text_put_string(int x, int y, char * s) +int text_put_string(int x, int y, char * string) { int ret; @@ -172,10 +173,10 @@ int text_put_string(int x, int y, char * s) /* タイマを一時停止する */ UNIXTimer_Pause(WonxSystem_GetUNIXTimer(Wonx_GetWonxSystem())); - printf("call : text_put_string() : x = %d, y = %d, string = %s\n", x, y, s); + printf("call : text_put_string() : x = %d, y = %d, string = %s\n", x, y, string); fflush(stdout); - ret = _text_put_string(x, y, s); + ret = _text_put_string(x, y, string); WonxDisplay_Flush(Wonx_GetWonxDisplay()); @@ -188,7 +189,7 @@ int text_put_string(int x, int y, char * s) return (ret); } -int text_put_substring(int x, int y, char * s, int len) +int text_put_substring(int x, int y, char * s, int length) { int i, ret; WWText ww_text; @@ -199,14 +200,14 @@ int text_put_substring(int x, int y, char * s, int len) /* タイマを一時停止する */ UNIXTimer_Pause(WonxSystem_GetUNIXTimer(Wonx_GetWonxSystem())); - printf("call : text_put_substring() : x = %d, y = %d, string = %s, length = %d\n", x, y, s, len); + printf("call : text_put_substring() : x = %d, y = %d, string = %s, length = %d\n", x, y, s, length); fflush(stdout); ww_text = WonxText_GetWWText(Wonx_GetWonxText()); ww_display = WonxDisplay_GetWWDisplay(Wonx_GetWonxDisplay()); ret = 0; - for (i = 0; i < len; i++) { + for (i = 0; i < length; i++) { if (WWText_PutCharacter(ww_text, x + i, y, s[i], ww_display) >= 0) ret++; } @@ -222,7 +223,7 @@ int text_put_substring(int x, int y, char * s, int len) return (ret); } -void text_put_numeric(int x, int y, int len, int format, int number) +void text_put_numeric(int x, int y, int length, int format, int number) { char buf[20]; char f[20]; @@ -232,13 +233,13 @@ void text_put_numeric(int x, int y, int len, int format, int number) /* タイマを一時停止する */ UNIXTimer_Pause(WonxSystem_GetUNIXTimer(Wonx_GetWonxSystem())); - printf("call : text_put_numeric() : x = %d, y = %d, len = %d, format = %04x, number = %d\n", x, y, len, format, number); + printf("call : text_put_numeric() : x = %d, y = %d, length = %d, format = %04x, number = %d\n", x, y, length, format, number); fflush(stdout); strcpy(f, "%"); if (format & NUM_PADZERO) strcat(f, "0"); - sprintf(f + strlen(f), "%d", len); + sprintf(f + strlen(f), "%d", length); if (format & NUM_HEXA) strcat(f, "x"); else if (format & NUM_SIGNED) strcat(f, "d"); else strcat(f, "u"); @@ -258,11 +259,11 @@ void text_put_numeric(int x, int y, int len, int format, int number) return; } -void text_store_numeric(char * buffer, int len, int format, int number) +void text_store_numeric(char * buffer, int length, int format, int number) { } -void text_fill_char(int x, int y, int len, int code) +void text_fill_char(int x, int y, int length, int c) { int i; @@ -271,11 +272,11 @@ void text_fill_char(int x, int y, int len, int code) /* タイマを一時停止する */ UNIXTimer_Pause(WonxSystem_GetUNIXTimer(Wonx_GetWonxSystem())); - printf("call : text_fill_char() : x = %d, y = %d, length = %d, code = %d\n", x, y, len, code); + printf("call : text_fill_char() : x = %d, y = %d, length = %d, character = %d\n", x, y, length, c); fflush(stdout); - for (i = 0; i < len; i++) { - _text_put_char(x + i, y, code); + for (i = 0; i < length; i++) { + _text_put_char(x + i, y, c); } WonxDisplay_Flush(Wonx_GetWonxDisplay()); @@ -346,16 +347,15 @@ int text_get_palette(void) return (num); } -void text_set_ank_font(int font_base_num, int is_color, int font_count, - void * font) +void text_set_ank_font(int base, int color, int count, void * font) { } -void text_set_sjis_font(void * font_address) +void text_set_sjis_font(void * p) { } -void text_get_fontdata(int char_code, void * fontdata_buffer) +void text_get_fontdata(int c, void * buffer) { } @@ -416,7 +416,7 @@ int text_get_screen(void) return (n); } -void cursor_display(int cursor_enable) +void cursor_display(int flag) { } @@ -429,16 +429,16 @@ void cursor_set_location(int x, int y, int w, int h) { } -unsigned long cursor_get_location(void) +unsigned long int cursor_get_location(void) { return (0); } -void cursor_set_type(int palette_num, int blink_interval) +void cursor_set_type(int palette_num, int interval) { } -unsigned long cursor_get_type(void) +unsigned long int cursor_get_type(void) { return (0); } diff --git a/timer.c b/timer.c index 1966440..fcbb4a7 100644 --- a/timer.c +++ b/timer.c @@ -2,24 +2,15 @@ /* ここから */ /*****************************************************************************/ +#include #include #include -#include "sys/timer.h" +#include "wonx_include/timer.h" +#include "wonx_configure.h" #include "Wonx.h" #include "etc.h" -#include "configure.h" - -typedef struct { - unsigned char year; - unsigned char month; - unsigned char date; - unsigned char day_of_week; - unsigned char hour; - unsigned char minute; - unsigned char second; -} datetime_t; /* int tm_year; year - 1900 */ static int get_year(struct tm * tblock) { return (tblock->tm_year - 100); } @@ -56,10 +47,10 @@ static int get_second(struct tm * tblock) { return (tblock->tm_sec); } * 引数の表示の問題もあるしね. */ -void rtc_set_datetime(int field, unsigned int value) +void rtc_set_datetime(int type, unsigned int value) { - printf("call : rtc_set_datetime() : field = %d, value = %d\n", - field, (int)value); + printf("call : rtc_set_datetime() : type = %d, value = %d\n", + type, (int)value); fflush(stdout); /* 未サポート */ @@ -71,19 +62,19 @@ void rtc_set_datetime(int field, unsigned int value) return; } -unsigned int rtc_get_datetime(int field) +unsigned int rtc_get_datetime(int type) { unsigned int ret = 0; time_t timer; struct tm * tblock; - printf("call : rtc_get_datetime() : field = %d\n", field); + printf("call : rtc_get_datetime() : type = %d\n", type); fflush(stdout); time(&timer); tblock = localtime(&timer); - switch (field) { + switch (type) { case RTC_YEAR : ret = get_year( tblock); break; case RTC_MONTH : ret = get_month( tblock); break; case RTC_DATE : ret = get_day( tblock); break; @@ -91,7 +82,7 @@ unsigned int rtc_get_datetime(int field) case RTC_HOUR : ret = get_hour( tblock); break; case RTC_MIN : ret = get_minute(tblock); break; case RTC_SEC : ret = get_second(tblock); break; - default : Error("rtc_get_datetime", "Unknown parameter."); + default : Wonx_Error("rtc_get_datetime", "Unknown parameter."); } printf("call : rtc_get_datetime() : return value = %d\n", (int)ret); @@ -100,9 +91,9 @@ unsigned int rtc_get_datetime(int field) return (ret); } -void rtc_set_datetime_struct(void * buffer) +void rtc_set_datetime_struct(datetime_t * d) { - printf("call : rtc_set_datetime_struct() : buffer = %p\n", buffer); + printf("call : rtc_set_datetime_struct() : buffer = %p\n", (void *)d); fflush(stdout); /* 未サポート */ @@ -114,27 +105,24 @@ void rtc_set_datetime_struct(void * buffer) return; } -void rtc_get_datetime_struct(void * buffer) +void rtc_get_datetime_struct(datetime_t * d) { time_t timer; struct tm * tblock; - datetime_t * p; - printf("call : rtc_get_datetime_struct() : buffer = %p\n", buffer); + printf("call : rtc_get_datetime_struct() : buffer = %p\n", (void *)d); fflush(stdout); time(&timer); tblock = localtime(&timer); - p = (datetime_t *)buffer; - - p->year = get_year(tblock); - p->month = get_month(tblock); - p->date = get_day(tblock); - p->day_of_week = get_week(tblock); - p->hour = get_hour(tblock); - p->minute = get_minute(tblock); - p->second = get_second(tblock); + d->year = get_year(tblock); + d->month = get_month(tblock); + d->date = get_day(tblock); + d->day_of_week = get_week(tblock); + d->hour = get_hour(tblock); + d->minute = get_minute(tblock); + d->second = get_second(tblock); printf("call : rtc_get_datetime_struct() : return value = none\n"); fflush(stdout); @@ -170,7 +158,7 @@ void rtc_disable_alarm(void) return; } -void timer_enable(int type, unsigned int auto_preset, unsigned int preset) +void timer_enable(int type, unsigned int auto_preset, unsigned int count) { WWTimer ww_timer; @@ -179,8 +167,8 @@ void timer_enable(int type, unsigned int auto_preset, unsigned int preset) /* タイマを一時停止する */ UNIXTimer_Pause(WonxSystem_GetUNIXTimer(Wonx_GetWonxSystem())); - printf("call : timer_enable() : type = %d, auto_preset = %u, preset = %u\n", - type, (int)auto_preset, (int)preset); + printf("call : timer_enable() : type = %d, auto_preset = %u, count = %u\n", + type, (int)auto_preset, (int)count); fflush(stdout); /* @@ -193,11 +181,11 @@ void timer_enable(int type, unsigned int auto_preset, unsigned int preset) switch (type) { case TIMER_VBLANK: ww_timer = WonxSystem_GetWWVBlankCountUpTimer(Wonx_GetWonxSystem()); - WWTimer_SetPresetCounter(ww_timer, preset * WONX_VBLANK_INTERVAL); + WWTimer_SetPresetCounter(ww_timer, count * WONX_VBLANK_INTERVAL); break; case TIMER_HBLANK: ww_timer = WonxSystem_GetWWHBlankCountUpTimer(Wonx_GetWonxSystem()); - WWTimer_SetPresetCounter(ww_timer, preset * WONX_HBLANK_INTERVAL); + WWTimer_SetPresetCounter(ww_timer, count * WONX_HBLANK_INTERVAL); break; default: /* @@ -205,13 +193,13 @@ void timer_enable(int type, unsigned int auto_preset, unsigned int preset) * NULL に初期化する. */ ww_timer = NULL; - Error("timer_enable", "Invalid timer type."); + Wonx_Error("timer_enable", "Invalid timer type."); } switch (auto_preset) { case TIMER_ONESHOT: WWTimer_SetAutoPresetOFF(ww_timer); break; case TIMER_AUTOPRESET: WWTimer_SetAutoPresetON( ww_timer); break; - default: Error("timer_enable", "Invalid auto preset type."); + default: Wonx_Error("timer_enable", "Invalid auto preset type."); } WWTimer_Reset(ww_timer); @@ -251,7 +239,7 @@ void timer_disable(int type) * NULL に初期化する. */ ww_timer = NULL; - Error("timer_disable", "Invalid timer type."); + Wonx_Error("timer_disable", "Invalid timer type."); } WWTimer_OFF(ww_timer); @@ -291,7 +279,7 @@ unsigned int timer_get_count(int type) * NULL に初期化する. */ ww_timer = NULL; - Error("timer_get_count", "Invalid timer type."); + Wonx_Error("timer_get_count", "Invalid timer type."); } ret = WWTimer_GetCounter(ww_timer); diff --git a/configure.h b/wonx_configure.h similarity index 58% rename from configure.h rename to wonx_configure.h index 6fd8a2b..8dcc0a4 100644 --- a/configure.h +++ b/wonx_configure.h @@ -1,7 +1,7 @@ -/* configure.h for configuration of xfireworks */ +/* configure.h for configuration of wonx */ -#ifndef _WONX_CONFIGURE_H_INCLUDED_ -#define _WONX_CONFIGURE_H_INCLUDED_ +#ifndef _WONX_winx_configure_h_INCLUDED_ +#define _WONX_wonx_configure_h_INCLUDED_ /* Wonx でのタイマ割り込みの周期(単位はマイクロ秒) */ #define WONX_TIMER_INTERVAL 100000 /* 0.1 秒*/ @@ -10,6 +10,6 @@ #define WONX_HBLANK_INTERVAL ( 3 * 10) /* 3 秒毎 */ #define WONX_VBLANK_INTERVAL (20 * 10) /* 20 秒毎 */ -#endif /* _WONX_CONFIGURE_H_INCLUDED_ */ +#endif /* _WONX_wonx_configure_h_INCLUDED_ */ -/* End of configure.h */ +/* End of wonx_configure.h */ diff --git a/wonx_include/bank.h b/wonx_include/bank.h new file mode 100644 index 0000000..3fc27b0 --- /dev/null +++ b/wonx_include/bank.h @@ -0,0 +1,39 @@ +#ifndef _WONX_SYS_BANK_H_ +#define _WONX_SYS_BANK_H_ + +#include "service.h" + +/*****************************************************************************/ +/* 定数の定義 */ +/*****************************************************************************/ + +#define BANK_SRAM 0 +#define BANK_ROM0 1 +#define BANK_ROM1 2 + +#define sram_get_map() bank_get_map(BANK_SRAM) +#define rom0_get_map() bank_get_map(BANK_ROM0) +#define rom1_get_map() bank_get_map(BANK_ROM1) +#define sram_set_map(bank) bank_set_map(BANK_SRAM, bank) +#define rom0_set_map(bank) bank_set_map(BANK_ROM0, bank) +#define rom1_set_map(bank) bank_set_map(BANK_ROM1, bank) + +/*****************************************************************************/ +/* 互換関数の宣言 */ +/*****************************************************************************/ + +void bank_set_map(int bank, int bank_num); +int bank_get_map(int bank); +unsigned char bank_read_byte(int bank, unsigned int off); +void bank_write_byte(int bank, unsigned int off, unsigned int data); +unsigned int bank_read_word(int bank, unsigned int off); +void bank_write_word(int bank, unsigned int off, unsigned int data); +void bank_read_block(int bank, unsigned int off, + void * buffer, unsigned int size); +void bank_write_block(int bank, unsigned int off, + void * buffer, unsigned int size); +void bank_fill_block(int bank, unsigned int off, + unsigned int size, unsigned int data); +void bank_erase_flash(int bank); + +#endif diff --git a/wonx_include/bios.h b/wonx_include/bios.h new file mode 100644 index 0000000..b402cb4 --- /dev/null +++ b/wonx_include/bios.h @@ -0,0 +1,13 @@ +#ifndef _WONX_SYS_BIOS_H_ +#define _WONX_SYS_BIOS_H_ + +#include "bank.h" +#include "comm.h" +#include "disp.h" +#include "key.h" +#include "sound.h" +#include "system.h" +#include "text.h" +#include "timer.h" + +#endif diff --git a/wonx_include/comm.h b/wonx_include/comm.h new file mode 100644 index 0000000..e37f68d --- /dev/null +++ b/wonx_include/comm.h @@ -0,0 +1,71 @@ +#ifndef _WONX_SYS_COMM_H_ +#define _WONX_SYS_COMM_H_ + +#include "service.h" + +/*****************************************************************************/ +/* 定数の定義 */ +/*****************************************************************************/ + +#define COMM_SPEED_9600 0 +#define COMM_SPEED_38400 1 + +#define XMODE_SEND 0 +#define XMODE_RECEIVE 1 +#define XMODE_SEND_ENCRYPTED 2 +#define XMODE_RECEIVE_ENCRYPTED 3 +#define XMODE_AUTO_ERASE 4 + +#define ERR_SIO_OK 0x0000 +#define ERR_SIO_BUSY 0x8100 +#define ERR_SIO_TIMEOUT 0x8101 +#define ERR_SIO_OVERRUN 0x8102 +#define ERR_SIO_CANCEL 0x8103 +#define ERR_XM_STATECODE 0x8104 +#define ERR_XM_CANCELED 0x8105 +#define ERR_XM_BLOCK_LOST 0x8106 +#define ERR_XM_TOO_LARGE 0x8107 + +enum { + XM_START = 1, + XM_NEGO, + XM_BLOCK, + XM_BLOCK_RETRY, + XM_CLOSE, + XM_ABORT, + XM_DONE, + XM_ERASE_BANK +}; + +typedef struct { + int state; + char mode; + char retry_c; + int block_c; + int block_max; + int block_size; + int bank; + int offset; + int timeout_c; +} xmodeminfo; + +/*****************************************************************************/ +/* 互換関数の宣言 */ +/*****************************************************************************/ + +void comm_open(void); +void comm_close(void); +int comm_send_char(unsigned char c); +int comm_receive_char(void); +int comm_receive_with_timeout(int timeout); +int comm_send_string(char * string); +int comm_send_block(void * buffer, int size); +int comm_receive_block(void * buffer, int size); +void comm_set_timeout(int recv_timeout, int send_timeout); +void comm_set_baudrate(int baudrate); +int comm_get_baudrate(void); +void comm_set_cancel_key(unsigned int pattern); +unsigned int comm_get_cancel_key(void); +int comm_xmodem(void * xmodem); + +#endif diff --git a/wonx_include/disp.h b/wonx_include/disp.h new file mode 100644 index 0000000..4a6191a --- /dev/null +++ b/wonx_include/disp.h @@ -0,0 +1,112 @@ +#ifndef _WONX_SYS_DISP_H_ +#define _WONX_SYS_DISP_H_ + +#include "service.h" + +/*****************************************************************************/ +/* 定数の定義 */ +/*****************************************************************************/ + +#define SCREEN1 0 +#define SCREEN2 1 + +#define LCD_PIXEL_WIDTH 224 +#define LCD_PIXEL_HEIGHT 144 +#define SCREEN_PIXEL_WIDTH 256 +#define SCREEN_PIXEL_HEIGHT 256 +#define SCREEN_CHAR_WIDTH 32 +#define SCREEN_CHAR_HEIGHT 32 + +#define DCM_SCR1 (1 << 0) +#define DCM_SCR2 (1 << 1) +#define DCM_SPR (1 << 2) +#define DCM_SPR_WIN (1 << 3) +#define DCM_SCR2_WIN_INSIDE (1 << 5) +#define DCM_SCR2_WIN_OUTSIDE ((1 << 4) | (1 << 5)) +#define DCM_BORDER_COLOR ((1 << 8) | (1 << 9) | (1 << 10)) + +/* SPRITE_SET_CHAR, SCREEN_SET_CHAR で使用 */ +#define CFM_FLIP_V (1 << 15) +#define CFM_FLIP_H (1 << 14) +#define CFM_FONT 0x01FF /* 0〜8ビット目 */ + +/* SPRITE_SET_CHAR で使用 */ +#define CFM_SPR_UPPER (1 << 13) +#define CFM_SPRWIN_CLIP (1 << 12) +#define CFM_SPR_PALETTE ((1 << 9) | (1 << 10) | (1 << 11)) + +/* SCREEN_SET_CHAR で使用 */ +#define CFM_SCR_PALETTE ((1 << 9) | (1 << 10) | (1 << 11) | (1 << 12)) + +#define CFSFT_PALETTE 9 + +/* LCD_SET_SEGMENTS で使用 */ +#define LCDSEG_AUX3 (1 << 5) /* 予備マーク3 */ +#define LCDSEG_AUX2 (1 << 4) /* 予備マーク2 */ +#define LCDSEG_AUX1 (1 << 3) /* 予備マーク1 */ +#define LCDSEG_HORIZONTAL (1 << 2) /* 縦モードマーク */ +#define LCDSEG_VERTICAL (1 << 1) /* 横モードマーク */ +#define LCDSEG_SLEEP (1 << 0) /* 省電力マーク */ + +/* LCD_SET_SLEEP で使用 */ +#define LCD_SLEEP_ON 0 +#define LCD_SLEEP_OFF 1 + +#define lcd_on() lcd_set_sleep(LCD_SLEEP_OFF) +#define lcd_off() lcd_set_sleep(LCD_SLEEP_ON) + +/* 未実装 */ +void lcd_set_interrupt_line(unsigned char line); +unsigned char lcd_get_display_line(); + +/*****************************************************************************/ +/* 互換関数の宣言 */ +/*****************************************************************************/ + +void display_control(unsigned int flags); +unsigned int display_status(void); +void font_set_monodata(unsigned int number, unsigned int count, + unsigned char * data); +void font_set_colordata(unsigned int number, unsigned int count, + unsigned char * data); +void font_get_data(unsigned int number, unsigned int count, + unsigned char * data); +void font_set_color(unsigned int colors); +unsigned int font_get_color(void); +void screen_set_char(int screen, int x, int y, int w, int h, + unsigned short int * data); +void screen_get_char(int screen, int x, int y, int w, int h, + unsigned short int * data); +unsigned int screen_get_char1(int screen, int x, int y); +void screen_fill_char(int screen, int x, int y, int w, int h, + unsigned int data); +void screen_fill_attr(int screen, int x, int y, int w, int h, + unsigned int data, unsigned int mask); +void sprite_set_range(unsigned int start, unsigned int number); +void sprite_set_char(unsigned int sprite_num, unsigned int data); +unsigned int sprite_get_char(unsigned int sprite_num); +void sprite_set_location(unsigned int sprite_num, int x, int y); +unsigned int sprite_get_location(unsigned int sprite_num); +void sprite_set_char_location(unsigned int sprite_num, + unsigned int data, int x, int y); +unsigned long int sprite_get_char_location(unsigned int sprite_num); +void sprite_set_data(unsigned int sprite_num, unsigned int count, + unsigned long int * data); +void screen_set_scroll(int screen, int x, int y); +unsigned int screen_get_scroll(int screen); +void screen2_set_window(int x, int y, int w, int h); +unsigned long int screen2_get_window(void); +void sprite_set_window(int x, int y, int w, int h); +unsigned long int sprite_get_window(void); +void palette_set_color(unsigned int palette_num, unsigned int colors); +unsigned int palette_get_color(unsigned int palette_num); +void lcd_set_color(unsigned int colors0, unsigned int colors1); +unsigned long int lcd_get_color(void); +void lcd_set_segments(unsigned int segments); +unsigned int lcd_get_segments(void); +void lcd_set_sleep(unsigned int slp); +unsigned int lcd_get_sleep(void); +void screen_set_vram(int screen, int location_id); +void sprite_set_vram(int location_id); + +#endif diff --git a/wonx_include/key.h b/wonx_include/key.h new file mode 100644 index 0000000..311e005 --- /dev/null +++ b/wonx_include/key.h @@ -0,0 +1,42 @@ +#ifndef _WONX_SYS_KEY_H_ +#define _WONX_SYS_KEY_H_ + +#include "service.h" + +/*****************************************************************************/ +/* 定数の定義 */ +/*****************************************************************************/ + +#define KEY_START (1 << 1) +#define KEY_A (1 << 2) +#define KEY_B (1 << 3) +#define KEY_UP1 (1 << 4) +#define KEY_RIGHT1 (1 << 5) +#define KEY_DOWN1 (1 << 6) +#define KEY_LEFT1 (1 << 7) +#define KEY_UP2 (1 << 8) +#define KEY_RIGHT2 (1 << 9) +#define KEY_DOWN2 (1 << 10) +#define KEY_LEFT2 (1 << 11) + +#define KEY_X1 KEY_UP1 +#define KEY_X2 KEY_RIGHT1 +#define KEY_X3 KEY_DOWN1 +#define KEY_X4 KEY_LEFT1 +#define KEY_Y1 KEY_UP2 +#define KEY_Y2 KEY_RIGHT2 +#define KEY_Y3 KEY_DOWN2 +#define KEY_Y4 KEY_LEFT2 + +/*****************************************************************************/ +/* 互換関数の宣言 */ +/*****************************************************************************/ + +int key_press_check(void); +int key_hit_check(void); +int key_wait(void); +void key_set_repeat(int rate, int delay); +int key_get_repeat(void); +int key_hit_check_with_repeat(void); + +#endif diff --git a/wonx_include/service.h b/wonx_include/service.h new file mode 100644 index 0000000..69bb74f --- /dev/null +++ b/wonx_include/service.h @@ -0,0 +1,14 @@ +#ifndef _WONX_SYS_SERVICE_H_ +#define _WONX_SYS_SERVICE_H_ + +#include "types.h" + +#define MK_WORD(high,low) (((unsigned short int)(high) << 8) | ((unsigned short int)(low))) +#define MK_DWORD(high,low) (((unsigned long int)(high) << 16) | ((unsigned long int)(low))) +#define MK_FP(seg,off) ((void *)MK_DWORD(seg,off)) +#define FP_OFF(p) ((unsigned short int)((unsigned long int)(p) & 0xffff)) +#define FP_SEG(p) ((unsigned short int)((unsigned long int)(p) >> 16)) + +void bios_exit(); + +#endif diff --git a/wonx_include/sound.h b/wonx_include/sound.h new file mode 100644 index 0000000..afb2936 --- /dev/null +++ b/wonx_include/sound.h @@ -0,0 +1,26 @@ +#ifndef _WONX_SYS_SOUND_H_ +#define _WONX_SYS_SOUND_H_ + +#include "service.h" + +/*****************************************************************************/ +/* 互換関数の宣言 */ +/*****************************************************************************/ + +void sound_init(void); +void sound_set_channel(unsigned int flags); +unsigned int sound_get_channel(void); +void sound_set_output(unsigned int flags); +unsigned int sound_get_output(void); +void sound_set_wave(int channel, unsigned char * wave); +void sound_set_pitch(int channel, unsigned int frequency); +unsigned int sound_get_pitch(int channel); +void sound_set_volume(int channel, unsigned int volume); +unsigned int sound_get_volume(int channel); +void sound_set_sweep(int sweep, int step); +unsigned int sound_get_sweep(void); +void sound_set_noise(unsigned int flags); +unsigned int sound_get_noise(void); +unsigned int sound_get_random(void); + +#endif diff --git a/wonx_include/system.h b/wonx_include/system.h new file mode 100644 index 0000000..f7f1ad1 --- /dev/null +++ b/wonx_include/system.h @@ -0,0 +1,58 @@ +#ifndef _WONX_SYS_SYSTEM_H_ +#define _WONX_SYS_SYSTEM_H_ + +#include "service.h" + +/*****************************************************************************/ +/* 定数の定義 */ +/*****************************************************************************/ + +enum { + SYS_INT_SENDREADY = 0, + SYS_INT_KEY, + SYS_INT_CASETTE, + SYS_INT_RECEIVEREADY, + SYS_INT_DISPLINE, + SYS_INT_TIMER_COUNTUP, + SYS_INT_VBLANK, + SYS_INT_HBLANK_COUNTUP +}; + +typedef struct { + void (*callback)(void); + int cs; + int ds; + int reserve; +} intvector_t; + +/*****************************************************************************/ +/* 互換関数の宣言 */ +/*****************************************************************************/ + +void sys_interrupt_set_hook(int type, intvector_t * vector, + intvector_t * old_vector); +void sys_interrupt_reset_hook(int type, intvector_t * old_vector); +void sys_wait(unsigned int wait_time); +unsigned long int sys_get_tick_count(void); +void sys_sleep(void); +void sys_set_sleep_time(int sleep_time); +int sys_get_sleep_time(void); +void sys_set_awake_key(int pattern); +int sys_get_awake_key(void); +void sys_set_keepalive_int(int pattern); +void sys_get_ownerinfo(int size, char * buffer); +int sys_suspend(int core); +void sys_resume(int core); +void sys_set_remote(int remote); +unsigned int sys_get_remote(void); +void * sys_alloc_iram(void * p, unsigned int size); +void sys_free_iram(void * p); +void * sys_get_my_iram(void); +unsigned int sys_get_version(void); +int sys_swap(int core); +void sys_set_resume(unsigned int flags); +unsigned int sys_get_resume(void); + +void bios_exit(); + +#endif diff --git a/wonx_include/system_configure.h b/wonx_include/system_configure.h new file mode 100644 index 0000000..aaf0fa5 --- /dev/null +++ b/wonx_include/system_configure.h @@ -0,0 +1,19 @@ +/* configure.h for configuration of wonx */ + +#ifndef _WONX_system_configure_h_INCLUDED_ +#define _WONX_system_configure_h_INCLUDED_ + +/* + * 以下を有効にすると,ushort, ulong が typedef される. + */ + +#if 0 /* ushort は,普通は標準で /usr/include/sys/types.h で定義されている */ +#define TYPEDEF_USHORT +#endif +#if 1 +#define TYPEDEF_ULONG +#endif + +#endif /* _WONX_system_configure_h_INCLUDED_ */ + +/* End of system_configure.h */ diff --git a/wonx_include/text.h b/wonx_include/text.h new file mode 100644 index 0000000..ce1c2dc --- /dev/null +++ b/wonx_include/text.h @@ -0,0 +1,46 @@ +#ifndef _WONX_SYS_TEXT_H_ +#define _WONX_SYS_TEXT_H_ + +#include "service.h" + +#define NUM_PADSPACE 0 +#define NUM_ALIGN_RIGHT 0 +#define NUM_HEXA (1 << 0) +#define NUM_PADZERO (1 << 1) +#define NUM_ALIGN_LEFT (1 << 2) +#define NUM_SIGNED (1 << 3) +#define NUM_STORE (1 << 7) + +#define TEXT_MODE_ANK 0 +#define TEXT_MODE_ANK_SJIS 1 +#define TEXT_MODE_SJIS 2 + +#define TEXT_SCREEN_WIDTH 28 +#define TEXT_SCREEN_HEIGHT 18 + +void text_screen_init(void); +void text_window_init(int x, int y, int w, int h, unsigned int base); +void text_set_mode(int mode); +int text_get_mode(void); +void text_put_char(int x, int y, unsigned int c); +int text_put_string(int x, int y, char * string); +int text_put_substring(int x, int y, char * s, int length); +void text_put_numeric(int x, int y, int length, int format, int number); +void text_store_numeric(char * buffer, int length, int format, int number); +void text_fill_char(int x, int y, int length, int c); +void text_set_palette(int palette_num); +int text_get_palette(void); +void text_set_ank_font(int base, int color, int count, void * font); +void text_set_sjis_font(void * p); +void text_get_fontdata(int c, void * buffer); +void text_set_screen(int screen); +int text_get_screen(void); +void cursor_display(int flag); +int cursor_status(void); +void cursor_set_location(int x, int y, int w, int h); +unsigned long int cursor_get_location(void); +void cursor_set_type(int palette_num, int interval); +unsigned long int cursor_get_type(void); +int text_printf(int x, int y, const char *format, ...); + +#endif diff --git a/wonx_include/timer.h b/wonx_include/timer.h new file mode 100644 index 0000000..9b33cbd --- /dev/null +++ b/wonx_include/timer.h @@ -0,0 +1,52 @@ +#ifndef _WONX_SYS_TIMER_H_ +#define _WONX_SYS_TIMER_H_ + +#include "service.h" + +enum { + RTC_YEAR = 0, + RTC_MONTH, + RTC_DATE, + RTC_DAY_OF_WEEK, + RTC_HOUR, + RTC_MIN, + RTC_SEC +}; + +enum timer_type { + TIMER_HBLANK = 0, + TIMER_VBLANK +}; + +enum timer_preset_type { + TIMER_ONESHOT = 0, + TIMER_AUTOPRESET +}; + +#define rtc_set_year(year) rtc_set_datetime(RTC_YEAR, year) +#define rtc_set_month(month) rtc_set_datetime(RTC_MONTH, month) +#define rtc_set_date(date) rtc_set_datetime(RTC_DATE, date) +#define rtc_set_day_of_week(week) rtc_set_datetime(RTC_DAY_OF_WEEK, week) +#define rtc_set_hour(hour) rtc_set_datetime(RTC_HOUR, hour) +#define rtc_set_minute(min) rtc_set_datetime(RTC_MIN, min) +#define rtc_set_second(sec) rtc_set_datetime(RTC_SEC, sec) + +#define rtc_get_year() rtc_get_datetime(RTC_YEAR) +#define rtc_get_month() rtc_get_datetime(RTC_MONTH) +#define rtc_get_date() rtc_get_datetime(RTC_DATE) +#define rtc_get_day_of_week() rtc_get_datetime(RTC_DAY_OF_WEEK) +#define rtc_get_hour() rtc_get_datetime(RTC_HOUR) +#define rtc_get_minute() rtc_get_datetime(RTC_MIN) +#define rtc_get_second() rtc_get_datetime(RTC_SEC) + +void rtc_set_datetime(int type, unsigned int value); +unsigned int rtc_get_datetime(int type); +void rtc_set_datetime_struct(datetime_t * d); +void rtc_get_datetime_struct(datetime_t * d); +void rtc_enable_alarm(int hour, int minute); +void rtc_disable_alarm(void); +void timer_enable(int type, unsigned int auto_preset, unsigned int count); +void timer_disable(int type); +unsigned int timer_get_count(int type); + +#endif diff --git a/wonx_include/types.h b/wonx_include/types.h new file mode 100644 index 0000000..ddcdda0 --- /dev/null +++ b/wonx_include/types.h @@ -0,0 +1,46 @@ +#ifndef _WONX_SYS_TYPES_H_ +#define _WONX_SYS_TYPES_H_ + +#include "system_configure.h" + +#include /* for NULL definition */ + +#ifdef TYPEDEF_USHORT +typedef unsigned short int ushort; +#endif +#ifdef TYPEDEF_ULONG +typedef unsigned long int ulong; +#endif + +typedef unsigned char BYTE; +typedef unsigned short WORD; +typedef unsigned long DWORD; +typedef int BOOL; + +#ifndef far +#define far /* None */ +#endif + +#ifndef near +#define near /* None */ +#endif + +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + +typedef struct { + BYTE year; + BYTE month; + BYTE date; + BYTE day_of_week; + BYTE hour; + BYTE minute; + BYTE second; +} datetime_t; + +#endif