もう書ききれんから次のページ。(夏休み中なんでだらだらでし) | //www.旧型、PSP開発幼稚園.game.jp/(本館)

もう書ききれんから次のページ。(夏休み中なんでだらだらでし)

■まあ、そんなダイソレタ記事はないです。ええ。とにかくe氏のHPで、082(ソース付)が公開されたです。(GG+SMS追加)
まあ、これコンパイルして動いたとしても(本人が嫌がってるから)公開するのはやめよーな。が、見るのは自由で、
一部組み込むのもまあ、自由な模様。「え!?みゅれーたー」(機能上)MESSに近づいております。ってゆーか、
プライベートでMESSコンパイルする場合。大抵e氏の入れたゲーム機+メガドラになるとオモワレ。
あ、NEOポケはMESSにはないか。(確か?。WSはどーだっけ?)
(2006-08/16、03:33)

■あのさ、SOZOBON(註:とあるメガドラ用Cコンパイラ)とか使って、メガドラの自作ROMとか作ってた訳。 (註:意味はマッタクないから、夏休みの自由工作でし。無理やり理由つければメガドラエミュのテスト用ROMとか。...嘘っぽい) SOZOBONはだめでさ、まあSOZOBONはチミ達が生まれるより遥か前に作られた物だから、だめで当たり前なんだけど。 ってゆーかいつ頃作られた物なのか。全く判らない。ええと、あれは確か1996年グライ(正確には覚えてない)。ワタシは、当時 インターネットは学校でしか出来なかったから、学校の機械にFTPとかDLしてインストールしてさ。てきとーなさーばーに、 「anymous」でログインして、てきとーなファイルをDLしてた頃。ちなみにDLしたふぁいるは秋葉でタダで仕入れた FD(ふろっぴーでぃすく)に入れておうちへ ていくあうとしてた。なんだか元のさーばーの調子が悪いらしくって壊れたふぁいるがあつた訳。(さすがに学校では中身は見ない) バイナリえでいたーで中覗いたら、LHAふあいるがあった。(註:当時は外国のさーばーでLHAはあみが系以外はめずらしかった。普通はZIP) んで興味本位でLHAを開けてみた。中から出てきたのが「SOZOBON」。それが(生まれて)初めての「SOZOBON」との出会い。 (註:実話でし) あ~何の話かワカランくなつてきた。とにかく「SOZOBON」は古い。Genecystの最終版(VerX.XX)よりも確実に古い。それだけは確か。 んでMakefile書いてみた。んだけどDOS(註:Win98はDOSマシン)もタコなのな。あまりにタコなんでMakefile公開。見所はバスの 区切り記号。¥か¥¥か/は使い分けてる。酷過ぎ。 (註:¥はバックスラッシュ(\)で表示されてるが本当は¥マーク)
#sample make file # the project name for binary.bin PROJ=test2 #tools CC=hcc TOP=top AS=jas LD=ld RM=del INC= -I..\\include\\ -I.\\src\\ .SUFFIXES : .o .c .s OBJ = obj SOBJS = \ $(OBJ)/sega.o \ $(OBJ)/demo6.o all: $(PROJ) $(PROJ): $(SOBJS) $(LD) -g -o $(PROJ).bin $(SOBJS) clean: $(RM) $(OBJ)\*.o $(RM) $(OBJ)\*.s $(RM) $(PROJ).bin $(OBJ)/%.o: src/%.c @-echo "Compiling... $*.o" $(CC) $(INC) $< move src\\$*.S $(OBJ)\\$*.S $(TOP) $(OBJ)/$*.s $(OBJ)/$*.o $(AS) $(OBJ)/$*.s -o $(OBJ)/$*.o $(RM) $(OBJ)\$*.s $(OBJ)/%.o: src/%.s @-echo "Assembling... $*.o" $(AS) src/$*.s -o $(OBJ)/$*.o
ここまで(使い分けが)メンドイと、ばかなこ(SOZOBON)はかわいいとは、ゆえん気がする。 (2006-08/16、04:13)


■一方、こんどはGCC(註:とあるメガドラ用Cコンパイラ)を試す。(注:DOS専用(?)らしい) (DOS==Win95,Win98ではOK。他は知らん) (:他は知らん:Xpは互換モード要るか試してないから判らん) (:他は知らん:linuxとかは動くかもしんないケド、ワカラン) (:他は知らん:MACとかでも「コンソールアプリ」だから、えみゅで、モシカシテ?でもシラネ) (註:非常に意味不明の夏休みの自由工作でし) http://home.hiwaay.net/~eubanks/index.htmlの 「 Gnu Tools for Sega - Gnu 68k C-Compiler, ported to the Sega Genesis.」 直リンは、http://home.hiwaay.net/~eubanks/68k-Dev-All.zip こっちなら「seggalaga」とかゆー怪しいサンプルが付いてる。 直リンは、http://home.hiwaay.net/~eubanks/seggala_src.zip (ソース) 直リンは、http://home.hiwaay.net/~eubanks/Bugs.bin(バイナリ)
まずこれをコンパイルしてみよー。 えっとインストールREADME。判りにくいちゅーの。 まず、「68k-Dev-All.zip」を展開。んで中から出てきたZIPを「C:¥xgcc」以下にディレクトリ(註:フォルダ)付で展開。 つまりc:¥xgcc¥以下は、 68K <DIR> 06-08-16 15:51 68K BIN <DIR> 06-08-16 15:51 BIN GNU <DIR> 06-08-16 15:55 GNU INFO <DIR> 06-08-16 15:55 INFO LANG <DIR> 06-08-16 15:56 LANG MAN <DIR> 06-08-16 15:56 MAN MANIFEST <DIR> 06-08-16 15:55 MANIFEST TMP <DIR> 06-08-16 15:56 TMP COPYING DJ 1,997 98-08-27 11:23 COPYING.DJ DJGPP ENV 2,402 99-02-11 17:59 DJGPP.ENV COPYING 17,982 95-11-02 0:08 COPYING COPYING LIB 25,265 95-11-01 23:08 COPYING.LIB XGCC BAT 54 00-01-29 16:03 XGCC.BAT README 1ST 13,684 98-12-02 20:26 README.1ST XGCC_ORG BAT 418 99-02-11 17:59 XGCC_org.BAT こんな感じ。 ところで展開前の「XGCC.BAT」と展開後の「XGCC.BAT」おんなじで迷うが、中身は同じ。 ただし、 展開前の「XGCC.BAT」は改行が「DOS用」 展開後の「XGCC.BAT」は改行が「linux用」 エディターで編集しなおせば、どっちも同じだが「そのまま使う」なら、展開前の奴でないと動作しない。 (展開後の「XGCC.BAT」は改行がなく総てコメント扱いになり、動作しない) 「XGCC.BAT」カレントに置けとか書いてあるが、使う前に実行するなら、何処に置いても同じ。 (XGCC.BATがちゃんと実行されたか確認は、DOSで「SET↓」で環境変数のパスをみる)
□んで次に「seggalaga」を展開して、「C:¥xgcc¥segalaga¥」に入れてみた。 んで(XGCC.BATを実行した後で)「make↓」 標準ライブラリのヘッダ「include\sys\types.h」が見えてない模様。 って事は、GCCENV(註:ファイル名はDJGPP.ENV)がちゃんと設定できてないっぽい。 これは「DJGPP.ENV」を書き換えりゃいいんだろーケド。しろーとなんでヨクワカラン(と云って直ぐにゴマカス...) まあいいや。 それから「genesis.h」は「何処にもない」。 結局「SOZOBON」から盗んでこよう(それでいいみたい)。 んで「genesis.h」の最終行に以下を追記する。
typedef unsigned short ushort;
これで「include\sys\types.h」の問題は解決。(ushortしか使ってない)
(追記:makefileで標準インクルード禁止してるみたい、で「include\sys\types.h」が見えないらしい。(だからGCCENVは関係ない) 良く見たら、#include"types.h"で、#include<types.h>ではない。しかも、「types.h」って名前でファイルあるし、 でも、「ushort」は、ないので結局、上の解決方法で正しいのです。 2006-08/18)
んでごちゃごちゃやればコンパイルできる筈。BUGS.BINが生成されたら、手ごろなメガドラえみゅで 動作させよう。 segalaga3gensHERE (おうちの人にてつだってもらって、夏休みの自由工作をすすめよー) あれえ?SEGADRIVEもpicodriveも実行できないや?なんでだろ。 (GensやGenecystは実行出来たケド...) (2006-08/16、18:35)
■バイナリの後ろにダミーでーたーを付加し、んで128kbytesでカット(0x20000)。なんとか実機で動く。 segala_psp (これでなんとか先生に怒られんで済みそー) (2006-08/17、18:35)
この変なサンプル(註:ワタシの出した「SGLG_A00.zip」の方)。picodriveでは動く。(註:picodriveはPCM作ってないから鳴らない) ケド、SEGADRIVEでは操作出来ない。キット「鋼鉄帝国」が動かないのも同じ理由かもにゃあ。つまり原因はこのサンプルで、 調査出来るのです。タブン。SEGADRIVEでPCMも鳴らないっぽい(?)これも直さな、あかんにゃあ。ソノウチ気が向いたら。 (2006-08/18、21:38)
■ここは記事であると同時に、実はワタシのメモ帳でもあるのです。そーゆー訳でメモ、メモ。 chrdat (2006-08/17、23:23)
■なーんかmyPCのHDD不安定で今にも壊れそう(?)なんで別館にこのしょーもない奴(めがどら用自作ROM)UPしといたです。 (ソース+バイナリ)でっす。PSPが無くても、試せるのです。しかし、...しょーもな。 ソース+バイナリ、入りなのに約53kbytesしかない、一般的なアイコン画像とかよりサイズがチイサイ。 世の中の不条理も感じたりする今日この頃。 (2006-08/18、18:00)
■とうとうMyPen0.266なNOTE君。起動しなくなった。ありがとー。君の事はワスレルヨ。安心してお星になつてね。 とゆーわけで、今度のPCはDTPなPenⅢ0.566な奴。無線LANのインストールに多少苦労したが出来たからここに書いてる。 あーめんどかった。 (2006-08/19、05:00)
■またまた、全然かんけーない話。てゆうか妄想なんだケド。32MBのコンパクトフラッシュx2枚は完全に余ってる。 (別に壊れてもかまわねー)これにコンパクトフラッシュのリーダーx2を買ってきてさ。(つまり壊す用)分解してコネクタを外す。 コンパクトフラッシュはDOSから直接セクタがアクセス出来るよな(註:DOSに専用のモードがあるにょ。知ってた?) つまり32MBのコンパクトフラッシュの後半16MBに直接バイナリのデーターを書くのは、一般的なライターで出来る。 一枚は奇数番地。もう一枚は偶数番地。あとはメガドラのROMばりっと書いて直結式で実機動かんかな-? (註:「DOSでコマンド入れるとDOS(~W98)が直書き許可する。(XPは判らん)」:INT13ユニット:HDD直書きツールを使う) (註:PS2のメモカ(8MB)やSDカード(mini、micro)、メモリースティック(Duo)、xDピクチャー、SSFDC等は、 みーんなシリアルデバイスだから、しろーとに工作は難しい。が、CFだけは唯一パラレル。直結でイケないかな~?) (2006-08/19、22:04) ■と、おもったんで「ハギワラシスコム」ヘ行って http://www.hscjpn.co.jp/corporat/c_download/download.html の http://www.hscjpn.co.jp/download/file/CFI-xxxDG_Specifications_J_Rev1_02.pdf より一部無断転載。 CF_BUS_01 CF_BUS_02 資料確認。なんだ一枚で出来るんじゃん。しかも「ATA」って16ビットI/Oのディスクだった訳ね。オ、面白そーデハある。 こっちのほーが、夏休みの自由工作っぽいな。(でももう夏休み終わっちゃうよ) (2006-08/19、23:07) と思ったけど、何でA10までしかないんだろ?ワカラン。32MBとかどうやってるんだろ?(それが、わかんなければ絶対出来ない) だってA00からA10で11本。2の10乗は、1024だから。16ビットなら(2[もう1本分]x2[16ビットだから]==4)倍で、 4kBytes?32MBまで(でさえ)あと5000倍は差があるし。???。ワカラン。 □VccとGND(のピン配置)は逆挿ししても大丈夫なよーに配慮されてるんだな。でも作るときは間違える可能性大だな。 (2006-08/20、00:30)

■HazeMDの動かし方、ワカッタです。PCが動かなくなったりなんだりで、結構イソガシカッタが、ふともう一度チャレンジして試た。 だって、「グラナダ」は確か、「1バイトも違わなかった筈」(過去日記参照せよ)だからグラナダが動かない事はアリエナイ。 えっと基礎知識:HazeMD02は現状、アルファ版の上に (註:「This is just a test build, more of a personal backup.」、 訳:「これはちょっとテストでコンパイルしてみた奴、個人的なバックアップちう感じ」 通常の60倍以上のレンダーをしているので(つまり1ドットに60ドット以上打つ)、重いに決まってる。)(前回の日記を読め) まあバイナリはテストって所。 とにかく使い方。 hazemd002で使う「ファイル名」を調べる必要がある。hazemd002はMAMEでいうFUZZYCOMPAREなので、 GRANADA調べたかったら、「hazemd gra↓」(註:「gra」はてきとう)とか打って調べる。例えば、こんなん。
C:\hazemd002a>hazemd gra "gra" approximately matches the following supported games (best match first): g_gran Granada (JU) (REV01) [!] g_gste Grand Slam Tennis (E) [!] g_gstenj Grand Slam Tennis (J) [!] g_gran00 Granada (JU) (REV00) [!] g_gcm Great Circus Mystery, The - Starring Mickey & Minnie (U) [!] g_raid Raiden Trad (JU) [!] g_smgp Super Monaco Grand Prix (W) (M2) (REV02) [!] g_tyra Tyrants - Fight Through Time (U) [!] g_stra Street Racer (E) [c][!] g_gdog Greendog - The Beached Surfer Dude (UE) [!] C:\hazemd002a>
グラナダ「2バージョン」ありんすね。独自の別調査によると「3バージョン」あった。が、「ハックROM」の可能性あるしヨクワカラン。 とにかく「g_gran00.bin」はハックROMではない。なぜならワタシが吸い出した物と「1バイトも違わず一致」してるからな。そーゆー 訳でウチは「g_gran00.bin」。他は知らんから、そのツモリで。 「吸い出したROM」を「g_gran00.bin」にリネーム。それを圧縮ソフトでZIP圧縮「g_gran00.zip」にする。HazeMDはBIN形式は受け付けない。 ZIP圧縮形式のみ受け付ける。よく考えりゃ最近のMAMEなんだから、当たり前だな。ものがメガドラなんでツイうっかりしてた。 これはMAMEであってMESSやその他のメガドラえみゅじゃないからさ。 次、「hazemd -cc」で標準コンフィグファイル「HAZEMD.ini」を出力させる。これは要するに「MAME.ini」だな。 んで、差し当たり直そう。最新のPCの人は直さなくてもいいかもしれん。とにかく直す所。
video d3d 「標準の場合」(ウチでは動かなかった。註:DirectX9.0c@Win98SE。後述のVER8に設定してもダメ) video ddraw ウチでは動いたがPCによっては不明(註:DirectX9.0c@Win98SE。後述のVER8に設定) video gdi      確実に動くだろ、但しとても遅い(が、最も安全)
d3dversion 9 「標準の場合」 d3dversion 8 (仮にDirectX9が入ってても、こっちの方が安全。速度は原理上9と変わらない)
あと必須ではないが直したほーがよさそうな所は、 samplerate 48000 「標準の場合」48kHzサポート出来ないPCはありそう。 samplerate 44100 どんなにタコなPCでも間違いなくこれはサポートしてる筈 samplerate 22050 samplerate 11025   この辺迄の低解像はタブン安全。てゆうかこれ以下は(ハードウェアーであっても)MAMEが跳ねる。
んでZIP圧縮したROMはHazeMDと同じ場所に「roms」ディレクトリを作ってその中に入れる。 例えば「C:\hazemd002a\roms\g_gran00.zip」って訳。 したら動くと思うよ。(初回はMAMEと同じで「左、右」で。(カーソルキー)) あー、それから「hazemdd.exe」っての付いてるケド、これはさらにデバッグ用だって。(試してないが、タブンMAMEデバッガ付き) (2006-08/20、08:45)


■しょーもないめがどら自作ROMに音を追加する実験。まずは76496.あくまでテストであって、単に鳴るダケだが取り敢えず、音が出た。ソースは、(main.cに追記)
<略> /*----(サウンドテスト部分、できとーに上の方に追加)----*/ #define SNDREG_TONE0_HIGH (0x00) #define SNDREG_TONE1_HIGH (0x20) #define SNDREG_TONE2_HIGH (0x40) #define SNDREG_TONE0_LOW 0x80|(0x00) #define SNDREG_VOL0 0x80|(0x10) #define SNDREG_TONE1_LOW 0x80|(0x20) #define SNDREG_VOL1 0x80|(0x30) #define SNDREG_TONE2_LOW 0x80|(0x40) #define SNDREG_VOL2 0x80|(0x50) #define SNDREG_mode 0x80|(0x60) #define SNDREG_noise 0x80|(0x70) static short sound_pos; static char sound_data[]={ 0, (SNDREG_VOL0 |0x00), (SNDREG_TONE0_LOW |0x00),(SNDREG_TONE0_HIGH |0x00), (SNDREG_TONE0_LOW |0x00),(SNDREG_TONE0_HIGH |0x03), (SNDREG_TONE0_LOW |0x02),(SNDREG_TONE0_HIGH |0x03), (SNDREG_TONE0_LOW |0x04),(SNDREG_TONE0_HIGH |0x03), (SNDREG_TONE0_LOW |0x06),(SNDREG_TONE0_HIGH |0x03), (SNDREG_TONE0_LOW |0x07),(SNDREG_TONE0_HIGH |0x03), (SNDREG_VOL0 |0x05), (SNDREG_mode |0x04) }; static void poke_sound(char poke_data){ char *sound_io; sound_io=(void *)0x00c00011; *sound_io=poke_data; } static void sound_effect(char dummy){ sound_pos=16; } static void sound_main(void){ sound_pos--; if(sound_pos==0){ sound_pos=1; }else{ poke_sound(sound_data[sound_pos]); } } /*--------*/ <略> <static void MoveBullets(void)のへん> case 1: /* check to see if the trigger is pulled. If the ship is in the process of blowing up, don't bother */ if (sprite[0].flags != DYING) { if ((sys_key & 0x40) != 0x40) // if the button is UP, then reset the flag AisDown = 0; if (sys_key != 0) { if (((sys_key & 0x40) == 0x40) && (AisDown == 0)) {sound_effect(1);//←ここのみ、追加(ショット撃ったら音出す) AisDown = 1; bulletData[i].xPos = sprite[0].xAxis; bulletData[i].yPos = 320; bulletData[i].state = 2; } } } break; <略> <int main(void)のへん> // VSYNC処理(VSYNC内でパッド読み込む) sound_main();//←ここのみ、追加 wait_vsync(); <略>
テストだけど(このまま拡張する予定はない)、音出すのって、めんどいのな。 (註:めがどら自作ROMの76496とFMは音の出るサンプルが、何処にも無い) (2006-08/21、06:06)
■さて「segalagaA00sound_test」。PSPで実行してみる。 picodriveでは、変な音が鳴る。なんか遅い。 SEGADRIVE。いきなりロードすると、えみゅごと死ぬ。しかし、なんかダミーで読ませた後なら起動可能。(とゆー事が解かっていた) ダミーで読ませるROMは今まで「BURNING FORCE(バーニングフォース)」にしてたんだけど、それだと正常動作しない。(Aボタンが使えない) 「シャイニング・オブ・ザ・ダグネス(シャイダグ)」を先に読ませる(音出す)と、正常動作する事を発見。 SEGADRIVEは初期化がダメなのか?...チェックになるなあ。 なんか「テストROMとしての職責」をはたしてくれるあたり、責任感あるんすね。(期待してないのに...) (2006-08/21、08:12)
■e氏の082cになっておりんすね。SMSもSMSplusになつておりんす。SMSplusたんはムカーシ弄った記憶があるよーな? なんかギガ昔すぎてオボエテないケド600fpsとか出して遊んだ記憶がアル。(最近のPC(Celeron2.6G)で遊んだら1000fps超えたよーな記憶が...?) ガンガレe氏。ワタシはなんにもデキナイけれど、草葉の陰からミマモッテルじぇー。 (2006-08/22、20:27)
気になったんで、ちとちぇっく。SMS+探したが、「P3_0.733」にも「C0.566」にも「C2.66」にも見つからない。んで、古そうな奴が NOTE、P0.166にあった。げっとれでぃーなアレで、100fpsぐらい。ここに持ってきて、「C0.566@BUS0.066」で160fpsぐらい。 意外と伸びないんだなw。ワタシが最後に(あの音声を出す為に)弄ったのは2002年で、0.93。e氏のは0.94.多分参考になるよーな事はないだろな~。残念。 (追記、註:アレおかしいな?K6-2_0.375@BUS0.075で最悪200fps以上(最大瞬間300fpsぐらい)とかゆーメモが残ってる。不思議) (2006-08/22、21:55) SMS+、FMが0.93。→0.94。で、さとうFMから、おかざきFMにかわってるのな?げっとれでぃーなアレは解決したんだろうか? ワタシハ、力技でやっつけたが。「2001 01-17 : Version 0.32 -- LPF implemented.」めちゃめちゃあやしー。 (2006-08/22、22:47) (註:力技:最近のPCは知りませんが(盲腸のよーに残ってると聞いた)、サウンドブラスタ等に本物のOPL(確かOPLL2だっけ?) が載ってるので、そちらを使えばリアルなアレが楽しめる(?)のです。FM音もデジタル44100より、キレイなのです。理由は判らん)
気になったんで、e氏のWin32版実行してみた。もちろん「おかざきFM」のげっとれでぃーなアレ。 LPFはかかってるとは言えんが、(つまり変なパルス音)一応、デジタルFMで音出るのな。ここは改善する必要があるな。 素直にフィルター入れるか、出力波形の差分が一定以上ならごにょごにょ。とかやるとか。まあ外野の気分なんで雑音ですが。ジビビ。 (2006-08/22、23:23)
■アメブロがさー、広告広告!センデンしてくれないと泣いちゃうからつ。...ってウルサイエエト、積極的だからさー。 ウザイナ積極テキですね、と思いキレテこの説教積極性にこたえねばとオモイふざとゆー訳で、 広告が五枠になった。(もうどーでもしてくれ) <警告:WARNING:このブログを読むと「お肌が荒れます」読んだらダメです。お肌が荒れてもワタシのせーではありえません> (その為に5段ぶち抜きで警告しております。アメブロより) とにかく、そりゃアメブロ界にイキル以上仕方がない。それをやってたら変なもん発見。 「アクセス解析」。初心者的にはヨクワカランデ放置だったんだが、ヨクワカランがヤッテミタ。役に立つのかどおかやった事無いから ワカランモン。 そんで、(テストで)テキトーな所クリック。ワタシしかいないミタイなのに何故か「2人」になってる。変なの?と思い。しばらくしたら、 いつのまにか「3人」になってた。 haze_san Hazeさんだつ!な、夏休みだし、日本の夏は、あ。あつスギるし、あ亜熱帯は熱いじぇー。もとい暑いです。ええ。 しょ、しょーがないGCC(DOSV用)でも入れるかな? (2006-08/23、01:55) ■おっとお、HazeMD。0.04aにぱわーあっぷしてる!! August 21st, 2006 HazeMD 0.04a Haze Megadrive Emu 0.04a
Added a callback to the 68k TAS instruction, this allows Gargoyles and Ex-Mutants to work again and is cleaner than the previous solution of simply hacking out the TAS writeback in all cases. (m68のTAS命令でコールバック(つまり特殊処理やね)するよーにしたら、 「Gargoyles」と「Ex-Mutants(亀忍者かなww?)」(ガーゴイルとEXミュータント?) ちうゲームが、以前の奴(HazeMD0.03a)に比べて、ちゃんとキレイに動くよーになったでつ。 「TAS命令」すべての場合の「TAS命令の書き戻し」のタイミングで、ごにょごにょやるよーに、ちょっと簡単に実装してみたでつ。) Also added a couple more parent-clone relationships. (したがって、これらのゲームの「クローン」もちゃんと動く筈でし) Here (ここにあるにょ。註:「リンク」のページから行けるようにしときました)
そゆー事かwwwwwww。(註:(現時点で)Hazeさんの過去ページからワザワザうちに来る第三者が現れる確率は非常に低い。 つまり「Hazeさん本人」の確率が非常に高い。「串」はちゃんととおってるし、「Gecko」だし、「32ビット色」だし。反証する理由の方が少ない。 つまり「日本のワタシのブログに書いちゃったでつ」が気になって来たとゆー事だね。モチロン第三者の可能性もある。その場合は人気でウレシー)
差し当たり何の事やらワカラン。TAS命令は、「テスト&セット(Test And Set)」ビットテストして、 んで条件により値をセットしてくれる命令だった気がする。(ワスレマシタナ) んで調べてみた。X68000ぷにぐらまーだと気が付かなかったが、「本来マルチプロセッサーの同期を取る為の命令」らしい。 ナルホド。X68000は「シングルプロセッサ」だったからカンケーネーが、めがどらは「Z80」とで「マルチプロセッサー」の設計に なってるかもしれんもんな。Read_cycle→Modify_cycle→Write_cycleって進むミタイ。うーん、そーすみたほーがハヤそう。 (2006-08/23、03:30) TAS→TASマニア→TAZまにあ物語。思い出したZO。ありゃバイト調べてびっと7をセットしてくれる便利な命令ちう認識だったな。 だってOh!X(民明書房日本ソフトバンク刊1995-07/01,p046)にそー書いてあったし。 (註:TAS:マニア命令、げーむのプログラムをDISるよーなマニア程何故か知ってる。TAS知ってるか(即答するか)でマニア度が測れる。 便利な命令。) (2006-08/23、04:00)


■「ギャラガ」について。 「ギャラガ」。知ってるかな?原作は、まあ、今となっては「プチゲーム」、「ミニゲーム」だが、オモシロイ。「凄く」ではなくて、「チョット」。 まあハマレバ「凄く」なんだが、それでも「プチゲーム」である事には変わらない。べ、別に「AC」じゃなくても、 「ファミコン」でも「PSP」でも「PS」でも、まあ(ほぼ原作っぽい奴を)知ってるんじゃあナイかな? それらでも(拘らなければ)オモシロさの本質は変わらない。 さて、別館のsegalaga。比べる事すら、おこがましいが、それらに比べて100000倍はツマラン。 そりゃともかく、もしあれを拡張して、んで頑張ったとしても。「本家のように面白くなる可能性は無い」のです。その話。 え?何で?と思うかも知れない。ワタシだって本家をプログラムしたり、あるいはDISったりして言ってる訳ではないのです。 だって根本的に、オカシイモン。大体「別館のsegalaga」。せっかくソースあるのに、ちゃんと読んですらない。 読む気を無くす根本的におかしな点が、 主に2点。 1.固定少数を使え。 2.ターゲット誘導方式にせよ。 1番の「固定少数」それは単に実装方法であって、とにかく原理的に「小数点以下の座標を管理してくれ」って事。 ギャラガはナムコの超初期の作品。その頃のPCは「8ビットPC」。「8ビットPC」ってのは基本的にunsigned char(0~255)を 使うのは簡単だけど、unsigned short(0~65535)を使うのは、「めんどい」か「時間がかかるんでなるべく避ける」という時代。 さてギャラガの前にはパックマン(やラリーX)があった。これはハードウェアー上でOBJ(スプライト)が(縦)256x(横)256の 範囲に制限されてたから、どんな値を書いても必ず画面のどこかに表示された。(パックマン、単に横が256ドットだからであって、 「ワープ処理」など「存在しない」のです) ギャラガは横はそれらと同じ、縦は多分違う。まあそれにしたって。(縦)512以内x(横)256の範囲だろう。(画面端、左右の 雑魚/ボムはワープする) んじゃあ画面のドット解像度が256だし、移動量(VX)とか(VY)とかも0~255の値で持てば良いのか? (例えば、「ヒトコマ(後述)」の移動量を、X←X+VX。つまりX=X+VX;あるいはX+=VX;) それは「違う」。 ゲームは約(1/60)秒、単位で動いてる。それはPSPだってDSだって同じだし、PS3だって同じだし、当時のPCやギャラがの 基盤にしたって、同じ事。まあ多少の例外はあっても基本的に約1/60秒単位で動く。(ワザと無視しする方式も一応ある) 「約1/60秒単位」って事は、言い換えれば「1秒間に60枚絵を書くチャンスがある」って事。アクションやシューティングゲームは 「パラパラ漫画」つまり「アニメ」と同じ原理(註:表示原理のみの話)なので、間のコマがちゃんとつながってないと面白くない。 仮に今、「ヒトコマの移動量」を、1ドット。上記の方式で、VX=1;としたと仮定しよう。その場合1秒間で60ドット進むな? ギャラガの1キャラは大体16x16ドット。16を4倍すると64だから、一秒間で4キャラ分進む。それが最小単位では、いくらなんでも、 大雑把すぎないか? そんで、別館の奴は「ウェイト」をかける事にした。(註:元の作者が決めた)「ウェイト」ってのは要するに「動い」たり「動かなかった」り、 して「なんとか調整」する。とゆーもの。別館の奴は「プログラム全体がウェイトだらけ」になって「破綻(後述)」している。 ワタシが見ても「なにがなんやら判らない」し、元の作者も「なにがなんやら判らない」んで。元の作者は「ワタシは忙しい」と 「屁理屈」を付けて、ほっぽらかしてあるのが、「別館の奴」もしくは「元のサイトの奴」。 「破綻」っていうのは、仮に一面はあれで良くても、「2面」、「3面」、...と、同じ方式でやったら(作るのめんどくて)「続かないだろ」。 昨今のシューテングでは、規模が大きい(メモリに乗らん)から、「一面のプログラム」→(ディスクからロード)→ 「二面のプログラム」→(ディスクからロード)→「三面のプログラム」→...となっているが、(例えばPSのR-TYPE⊿とかプログラムが、 分れてるから、改造が大変。但しこの方式は完全に「分業可能」なメリットがある。「一面」は俺。「二面」はあんた。「三面」はあいつ。 納期までの時間がもったいないから「同時に作ろうぜ」。これは「ゲームのイメージ」(例えばR-TYPE)が「共通概念」だから出来る技だな) 当時は、「規模が小さい」から全部メモリにロード。「全面共用のプログラム」+「全面分のデーター」勿論プログラマーは一人。 んでACの大きさはヨクシランが、「ファミコン」だの「MSX」だのに「移植」されてる。あれらのROM容量は良く知らんが、 32kBytesだの64kBytesだののレベルの筈。 まあ、メガドラは16ビットだから「使用効率が二倍悪い」としても、64kBytesだの128kBytesだののレベルで全面分、出来なければ、オカシイ。 つまり考え方が根本的にオカシイ、すなわち「破綻してる」。
さて「細かい方の単位が一ドット単位では荒すぎる」という話は解かったとして。んじゃあ「荒い方の単位は何ドットなら適切なんだ?」 ギャラガは一面では、それ程高速には敵が動かないが、面が進むと「加速ポイント」から「加速して敵が移動」する。 その最大の速さは何ドットあれば足りるんだろう? 何ドットかはワカラナイから、仮に「最高16ドット」だと決め付けて考えてみよう。もし、1/60秒に、16ドット動くのなら、 一秒で16x60=960ドット進む。ギャラガの画面の縦に長い方の長さが320ドットだとして、960ドットっていうのは丁度、三画面分。 人間の反射神経。初めて見えた瞬間からアクションを起こすまでの時間が最高でも0.3秒程度かかると工学的に測定されてる。 (オリンピックではフライングになっちゃう) 大体10代で0.5秒程度。ジジイは0.7秒とか。これは、運転免許取りに教習所にいけば「空走距離」で習う。 慣れないペダル操作+余裕分を考慮して1.0秒として習う筈。 もし、「教本」があるなら調べてみよう。「空走距離」の表と「1秒間に進む距離」の表。値がまったく一緒。 (時速60kmの場合約17m=16.66)(時速60km==分速1km==分速1000m。つまり秒速(1000/60)m=16.66) ええ?ワタシは「ストップウォッチ」0.01秒単位で止められる。し、連続押しでも、0.01で止まったよ。 それは意味が違う。前者は人間に「測る機能」があるから「反射」ではない。後者は痙攣してるだけで「考えて行動してない」 つまり、両方「神経の伝達速度」と関係のない次元の話。 とにかく、仮に上からOBJ(スプライト)が流れてくる。として、ボタンを押して止める。とする。320ドット通過時間が0.3秒。 どういうタイミングで流れてくるか解からないとして、これは「オリンピックの選手でも止められない」。(註:予めタイミングが予期出来れば別、 その為。「一般的なシューティングゲーム」等では、これをプレイヤーに感知させる為、ボスが「極太レーザー」打つ前には、 ビカビカ光って、「お知らせ」する。「ゲーマー」はこれを見て行動する。「へたくそ」は「見てない」から「行動出来ない」。 その為面白くないと文句をたれる。従って「ポケモン規制」に引っかかるぐらいに派手にヤル必要がある) そーゆー訳で、最大16ドットで「問題なさそうだ」と理解して頂けますでしょうか?
さて、unsigned char。0~255だけど、「16進数」で表すと00~FF。ちなみに「16段階」を「16進数」で表すと00~0F。 半分で足りますな。半分ってつまり、「16段階」かける「16段階」は「256段階」。 unsigned char。すなわちFFの上半分が「16段階」。下半分が「16段階」と思ってやれば。上半分=整数部。下半分=小数部。 これを「固定小数点」方式っていいます。これは「4.4の固定小数点形式」です。(整数部4ビット.小数部4ビット)
つまりギャラガは「4.4の固定小数点形式」なんでねー?と思うのです。(4+4=8、8ビット=unsigned char) もし、この方式ならば1秒間に60ドットではなくて(60/16)ドット、つまり3.75ドットです。 ギャラガで、止まってる物は、速度0だから別として(例えば爆発物は速度0)1秒間に3.75ドットの精度があれば大体良いような... 不満なら最大速度は落ちるケド「3.5の固定小数点形式」にするか、素直に2バイト(8.8の固定少数形式とゆーふーに考える) 使うか。まあ本物が2バイト使ってるかもしんないですケド。
ギャラガ精度まとめ。(予想==妄想値) 表示画面:横256(X)x縦320(Y):単位は[ドット]:(註:ギャラガはACで元々「縦画面」ゲーム) 仮想画面精度:横256(X)x縦512(Y):単位は[ドット]:(註:「ザコ」が画面下から戻ってくるの「は仮想画面の精度」がある為) 1/60単位でのOBJ精度(仮想座標単位系)(すべてのOBJ共通、但し「陽動」は特殊(専用のVX,VY)があるかもしれない) Xベクトル(VX)加算量:8ビット(「4.4固定少数」)(16ビット「8.8かもね」) X絶対量:16ビット(「8.8固定少数」) Yベクトル(VY)加算量:8ビット(「4.4固定少数」)(16ビット「8.7かもね」) Y絶対量:16ビット(「(1+8).7固定少数」) YYYYYYYY.SSSSSSSY 76543210 -------8(←小数部の最後が「Y8ビット」) 実座標(画面表示時)は「OBJ表示」に整数部分のみ使う。が累積精度はあくまで少数演算。 総て妄想(調べてない)ですが、大体こんな感じでないかな? 他にも、「ターゲット誘導」の関係上。 Xベクトル積算(VVX)加算量:8ビット(「4.4固定少数」)(16ビット「8.8かもね」) Yベクトル積算(VVY)加算量:8ビット(「4.4固定少数」)(16ビット「8.7かもね」) こゆーのもあるかもな。
「固定小数点形式」解からなくても、プログラム作れますし。「現代のPC」ならまず間違いなく。「浮動小数点形式」(float) 若しくは「倍精度浮動小数点形式」(double)に、すればすむ話です。 ゲームプログラムに限れば、「浮動小数点形式」(float)は必要だけど、「倍精度浮動小数点形式」(double)は、 (例えば3Dポリゴンで座標計算するとして)どーしても必要な場所は滅多にない。です。それでも、「速度が変わらないのなら(double) しか知らなくても良い」とも言えますが、「PSPは速度が変わるんだから(float)しか知らなくても大抵困らない」とも言えます。 現在のMAMEとかは、一部無茶してるんで、精度の関係上一部に絶対(double)が必要だったり(64ビット整数が必要だったり)します。 それでも「1999年頃(前世紀)のMAMEは(float)だけで動いていた」んで、(float)だけで、ソコソコの精度のえみゅが作れない訳ではない。 ですが、「ターゲットに拠っては余計面倒になったり」します。
2.ターゲット誘導方式にせよ。 やっと2です。もう、すっかり忘れてたかも知れないケド。こっちの方がより(本質的に)重要な話。 そうそう話はギャラガだっけ。「別館の奴」がダメなのは、「ターゲット誘導方式」とゆー考え方が「全く無い」。 えっと、「別館の奴」。「src\dat\」以下に怪しげなデーターがある。作者曰く「flight record data」(飛ぶ軌跡のデーター)だそーです。 要はMAMEリプレイと同じような「軌跡データー」という考え方です。(註:MAMEはパッドのデーター、これはXY座標のデーター) いづれにしろ、こーゆー「考え方」をギャラガは「していない」です。 A>ギャラガでは「デュアルファイター」になります。 B>マイシップが「キャプチャーされる」とき16方向に弾が発射でき、かつ敵が殺せます。 C>二面から敵が「二列縦隊」で飛行してきます。 D>後半面は「加速ポイント」からザコキャラが「加速して移動」します。 E>雑魚の出現位置は、右、上(右より)、上(左より)、左。の4ヶ所で、「それ以外からは出現しません」。 F>後半の「チャレンジングステージ」では、ザコが出現後、仮想の「回転中心」へ向かって「渦巻状に円の動き」をします。 G>「隊列」を組んでいる雑魚は、「一つ前の雑魚へ向かって移動」してます。 これだけ例を挙げれば、まー解かるでしょう。「指定座標へ向かう」というアルゴリズムはありますが、 「予め決められた座標を次々変えながら進む」という、シーンは一つもないです。つまり、「軌跡データー」という考え方は存在しない ので、その方法で無理やり作ると「破綻」してしまいます。 「別館の奴」は一面分しかないのに、「あれだけ沢山」データーがあり、しかも「精度が悪く」立派に破綻してます。 あれを、拡張して、二面の「二列縦隊」のプログラムを加えたら「なお一層破綻が進みます」
(A>)「デュアルファイター」は一元管理されています。「デュアル」つまり16x16OBJのOBJが「2枚一編に動く」。片方のOBJを 「基準」とした場合、もう一方のデーターは「水平時」で16ドットずれる訳ですね。ギャラガは「水平時」以外にも「16段階の方向」を 取る可能性(B>)がありますから、(掛け算を廃止する為に)差分が「16個のテーブルになってる可能性は高い」です。 (つまり、XとYで32個(多分32バイト)) (C>)の「二列縦隊」は「一列縦隊のアルゴリズム」に前項「2枚一編に動く」のテーブル座標値を合算し、座標を算出してるでしょうね。 (D>)の加速は素直に考えれば「掛け算」ですが、「加速状態は」はせいぜい三段階もあれば十分なので、これも足し算にする為に、 テーブルになってる可能性が高いですね。前項「2枚一編に動く」のテーブルと同じ物です。初期化時に予め掛け算を計算しておく、 可能性もありますがテーブル容量(X差分)(Y差分)(16方向)(4加速状態)(2x2x16x4)==256[バイト]から言って、 予め計算してある可能性が高いですね。 ここまで説明した総てのテーブル容量は256バイトです。(「加速0のテーブル」==「2枚一編に動くのテーブル」)
(B>)「キャプチャーされる」場合の自機の動き。これは「回転パターンは見ないで純粋な軌跡を見ます」。単に「ギャラボスの16ドット下」へ 「自機が(誘導されて)移動するだけ」ですね。指定位置に自機がきたら「キャプチャー終了(状態へ変更)」あるいは、 「キャプチャー開始からの経過時間で終了」。どっちかだと思います。
(F>)ギャラガを理解するには、この状態を再現するプログラムを真っ先に作って試る。これが近道かも知れません。 「仮想の回転中心」、「仮想の半径」、そしてその半径の先にある「仮想の餌」。先頭の雑魚は「仮想の餌」に向かって飛行してるだけ、 ですね。
さて、ギャラガにおける「円の動き」これはどおやってると思います?ワタシは、(仮想の回転中心の)「上下左右のポイントに 単純に餌を配置するだけ」だと、思います。「sin、cosテーブルは必要ない」です。
1/60単位の処理。例えば「X←X+VX」とします。「X」も「VX」も「変数」です。 ちなみに「X」は変数。「VX」は定数の場合は、「一般的な1次関数」すなわち「放物線」の動きをします。 (註:例えばザコの座標が(X,Y)) ここで「VX」を定数から変数に代えて、「VVX」(定数)を加算する場合を考えます。さらにXとYで2次元に拡張します。 1/60単位の処理は、 「VX←VX+VVX」 // vx+=vvx; 「X←X+VX」 // x+=vx; 「VY←VY+VVY」 // vy+=vvy; 「Y←Y+VY」 // y+=vy; になります。この時、(VVX,VVY)を(0,1)→(1,0)→(0,-1)→(-1,0)→(0,1)「註:はじめに戻る」 と、誘導座標(TX,TY)の線上に交わった場合に、換えてやれば、そりゃ結果的に(数学的にも)「円の動きそのもの」です。 「誘導座標線上に交わった場合」でなくても「仮想餌」に「ぶつかった場合」でも全く同じ事ですね。 (註:誘導座標(TX,TY)は、仮想の回転中心の事です。例えば「餌」の位置が(TX,TY)+(0,1)で、(TX+0,TY+1)になったり する訳です。(0,1)は仮に半径1の場合です。) これは、「円の関数の定義そのもの」ですし、同時に「sin、cos関数の定義そのもの」でもあります。「微分の仕組み」でもあるし、 「sinとcosで位相が90度ずれているというのは、実はこういう仕掛け」なんです。(角度を廃止すると実はこのような仕掛けになっています)
(G>)考え方、そのものです。

(F>)には、もうひとつ重要なポイントがあります。それは「何時誘導が始まって」。「何時誘導が終わるのか」。 つまり、ギャラガにおける軌跡パターンというのは、「軌跡座標のデーター等はなく」。 1:誘導種類 1A:単一(特定)座標へ「ジェミニ式」誘導。(註:XEVIOUSのジェミニ誘導と同じ) 1B:(F>)のタイプの移動(上下左右に餌を自動配置?) 2:時間 3:誘導座標 ==(1:)で使う座標。(TX,TY)

galaga_vcp >下がY+、右がX+とする。 >敵の出現ポイントは、s1~s4の4ヶ所のみ。 1:s2から出現。出現時の(VX,VY)=(0,1)「打ち出し速度」 2:p1へ向かう。 3:p2へ向かう。 4:p3へ向かう。 5:p4へ向かう。 6:p4で「編隊分離」。自分の指定席(ポイント)へ向かう。
「編隊」 >先頭から順番にb1~b8とする。 >「b0」ならば、(時間で行動) 初期編隊、配列データー 1:b1(親)はb0を追う。 2:b2はb1を追う。 3:b3はb2を追う。 4:b4はb3を追う。 5:b5はb4を追う。 6:b6はb5を追う。 7:b7はb6を追う。 8:b8はb7を追う。 ここで、b1とb5が撃墜されると、 1:b1(親)はb0を追う。(撃墜) 2:b2はb1を追う。「b2はb0を追う。」 3:b3はb2を追う。 4:b4はb3を追う。 5:b5はb4を追う。(撃墜) 6:b6はb5を追う。「b6はb4を追う。」 7:b7はb6を追う。 8:b8はb7を追う。 撃墜された場合は、配列を書き換えないで、(撃墜)マークを付け、そのまま使う。
したがって要るものは、(撃墜)されたかどうかのフラグのみ。 このデーターをビットで表すと、1バイトあれば良い。 (2006-08/23、23:03)
■息抜きにPSPのナムコミュージアムのギャラガを遊んでみる。「オリジナル版」の方。中身はエミュレーターにきまってるので、 これはACのギャラガ。 不思議な事に、意外と面白くない。中身は完璧なACのギャラガなのに。見せ方が悪いのかな?解像度が小さすぎると楽しくないのかな? コントローラーのせいかな?AC版よりFC版の方が、楽しいポイントがあったのかな?(ワタシの記憶がおかしいのかな?) <面白い><面白くない> という一線は、何処で決まるのだろう。この見せ方の問題は、深くエミュレーター全般に関わると思う。 (2006-08/24、09:04)