[Mona] ldについて
monacをうまく使えないだろうか。
[Mona] テトリスが来た
遂に Mona にテトリスが登場しました。作者はsouさん。
BayGUIを起動して、テトリスを開始します。
キー操作はEnterでゲーム開始。矢印キーで移動。 x, z キーで回転です。
実際プレイしてみましたが、その完成度の高さに驚きました。
良い意味で「普通に」違和感なく、テトリスとしてプレイできます。
自分が Mona でテトリスをプレイしているのではなくて、Windows版のテトリスをプレイしていると錯覚してしまうほどです。
先日のマインスイーパーもそうですが、遂にここまでのアプリが出てきたんだなぁとしみじみと思いました。
BayGUIをここまで持ってきた、id:Baysideさんと、ゲーム作者の方のコラボレーションですね。
より多くの方々に遊んで欲しいので、これらのゲームを収録した FDイメージファイルをどこかで公開してもらえるとうれしいですね。(QEMU同梱で)
ゲーム作りのセンス・ノウハウ
自分には、ゲーム作りのセンス・ノウハウがない事を悟りました。
プログラムがある程度できても、人に遊んでもらえる作品を作れるとは限りません。やはり、それなりのセンス・ノウハウが必要だと思います。
ノウハウの部分では、ゲームならではのテクニック、ゲームであるからこそ要求されるスペック等々、一朝一夕では身につかないものがあるのではないでしょうか。
センスの部分では、OSやWebアプリケーションと違った部分のセンスが要求されると思います。(操作性・エンターテインメント性など)
ということを書いていて思ったのですが、これはid:yaneuraoさんの得意分野かもしれない。
[Mona] GOの続き
GOの作者のKさんからいろいろフォローいただきました。とりあえず exe形式まで作る事ができたのでその手順を。
go_0020s, go_0020w, go_0023pを用意する
- go_0020wディレクトリにある*.exeをgo_0020s\toolw32にコピーする
- go_0023pディレクトリにある*.exeをgo_0020s\toolw32にコピーする
- go_0023pディレクトリ以下にあるディレクトリをgo_0020sディレクトリにコピーする
- go_0020sディレクトリを go に名前変更
- \goにおいて、コマンド setmode go とする。
- \go\func\m_gasnas.c を編集する
"4incl INC", "2incw INC",
の下に
"1int INT", を追加
- \go\toolw32において make する
- gas2nask.exe 等が新しくビルドされているはず。
- \go\toolw32\hello.c
#define SYSTEM_CALL_PRINT (0x0001) #define SYSCALL_1(syscall_number, result, arg1) \ asm volatile("movl $%c1, %%ebx \n" \ "movl %2 , %%esi \n" \ "int $0x80 \n" \ "movl %%eax, %0 \n" \ :"=m"(result) \ :"g"(syscall_number), "m"(arg1) \ :"ebx", "esi" \ ); int print(const char* msg) { int result; SYSCALL_1(SYSTEM_CALL_PRINT, result, msg); return result; } void _user_start() { print("Hello"); }
- cc1 -I. -Os -quiet -o helloc4.s helloc4.c
- \go\toolw32\hello.s を編集 空白をなくす
movl 8(%ebp) , %esi ⇒movl 8(%ebp),%esi
- gas2nask -a hello.s hello.nas
- nask hello.nas hello.obj hello.lst
- ld -nTtext 0xA0000000 -e __user_start -Bstatic hello.obj -o hello.exe
このhello.exe を Monaで実行したところアドレスエラーで異常終了してしまいました。
obj2bim3, bim2bin3等々を使った方が良いのだろうか。
追記:ld --Mapオプションで出力してみた。
Memory Configuration Name Origin Length Attributes *default* 0x00000000 0xffffffff Linker script and memory map 0x00400000 __image_base__ = 0x400000 0x00000000 __dll__ = 0x0 0x00001000 __section_alignment__ = 0x1000 0x00000200 __file_alignment__ = 0x200 0x00000004 __major_os_version__ = 0x4 0x00000000 __minor_os_version__ = 0x0 0x00000001 __major_image_version__ = 0x1 0x00000000 __minor_image_version__ = 0x0 0x00000004 __major_subsystem_version__ = 0x4 0x00000000 __minor_subsystem_version__ = 0x0 0x00000003 __subsystem__ = 0x3 0x00200000 __size_of_stack_reserve__ = 0x200000 0x00001000 __size_of_stack_commit__ = 0x1000 0x00100000 __size_of_heap_reserve__ = 0x100000 0x00001000 __size_of_heap_commit__ = 0x1000 0x00000000 __loader_flags__ = 0x0 Address of section .text set to 0xa0000000 LOAD hello.obj .text 0xa0000000 0x200 *(.init) *(.text) .text 0xa0000000 0x2a hello.obj 0xa000001b _user_start 0xa0000000 print *(SORT(.text$*)) *(.glue_7t) *(.glue_7) 0xa000002a ___CTOR_LIST__ = . 0xa000002a __CTOR_LIST__ = . 0xa000002a 0x4 LONG 0xffffffff *(SORT(.ctors.*)) *(.ctors) *(.ctor) 0xa000002e 0x4 LONG 0x0 0xa0000032 ___DTOR_LIST__ = . 0xa0000032 __DTOR_LIST__ = . 0xa0000032 0x4 LONG 0xffffffff *(SORT(.dtors.*)) *(.dtors) *(.dtor) 0xa0000036 0x4 LONG 0x0 *(.fini) *(.gcc_exc) 0xa000003a etext = . *(.gcc_except_table) .data 0xa0001000 0x200 0xa0001000 __data_start__ = . *(.data) .data 0xa0001000 0x6 hello.obj *(.data2) *(SORT(.data$*)) 0xa0001006 __data_end__ = . *(.data_cygwin_nocopy) .rdata *(.rdata) *(SORT(.rdata$*)) *(.eh_frame) .pdata *(.pdata) .bss 0xa0002000 0x0 0xa0002000 __bss_start__ = . *(.bss) *(COMMON) 0xa0002000 __bss_end__ = . .edata *(.edata) /DISCARD/ *(.debug$S) *(.debug$T) *(.debug$F) *(.drectve) .idata 0xa0002000 0x200 SORT(*)(.idata$2) SORT(*)(.idata$3) 0xa0002000 0x4 LONG 0x0 0xa0002004 0x4 LONG 0x0 0xa0002008 0x4 LONG 0x0 0xa000200c 0x4 LONG 0x0 0xa0002010 0x4 LONG 0x0 SORT(*)(.idata$4) SORT(*)(.idata$5) SORT(*)(.idata$6) SORT(*)(.idata$7) .CRT *(SORT(.CRT$*)) .endjunk 0xa0003000 0x0 0xa0003000 end = . 0xa0003000 _end = . 0xa0003000 __end__ = . .rsrc *(.rsrc) *(SORT(.rsrc$*)) .reloc *(.reloc) .stab *(.stab) .stabstr *(.stabstr) OUTPUT(hello.exe pei-i386)
そろそろ正規表現を
最近まで正規表現は、簡単なものしか使ったことがありませんでした。Perl&Emacsを良く使うようになったこともあり、以前勉強した以下の本で今週末は復習をしようかと。
複雑な正規表現を使った置換とか結構あこがれますヽ(´ー`)ノ(違
- 作者: Jeffrey E.F. Friedl,田和勝
- 出版社/メーカー: オライリー・ジャパン
- 発売日: 2003/05/26
- メディア: 単行本
- 購入: 4人 クリック: 241回
- この商品を含むブログ (106件) を見る
入門GNU Emacs (UNIX text processing)
- 作者: デボラキャメロン,エリックレイモンド,ビルローゼンブラッド,Debra Cameron,Eric Raymond,Bill Rosenblatt,福崎俊博
- 出版社/メーカー: オライリー・ジャパン
- 発売日: 1999/09
- メディア: 単行本
- 購入: 4人 クリック: 293回
- この商品を含むブログ (30件) を見る
そういえばオライリーの本は読み返す良書が多いですね。
[Mona] GO続き2
HELLO.EXEは、Monaで動いた。
BayGUIやMonaForms、MonAPIに頼らないC言語による最小構成Hello Worldは以下のようになります。
アセンブラで書いたらもっともっと短いです。
次は ld のソースを眺めることにします。