■まあ、そんなダイソレタ記事はないです。ええ。とにかく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が生成されたら、手ごろなメガドラえみゅで
動作させよう。
HERE
(おうちの人にてつだってもらって、夏休みの自由工作をすすめよー)
あれえ?SEGADRIVEもpicodriveも実行できないや?なんでだろ。
(GensやGenecystは実行出来たケド...)
(2006-08/16、18:35)
■バイナリの後ろにダミーでーたーを付加し、んで128kbytesでカット(0x20000)。なんとか実機で動く。
(これでなんとか先生に怒られんで済みそー)
(2006-08/17、18:35)
この変なサンプル(註:ワタシの出した「SGLG_A00.zip」の方)。picodriveでは動く。(註:picodriveはPCM作ってないから鳴らない)
ケド、SEGADRIVEでは操作出来ない。キット「鋼鉄帝国」が動かないのも同じ理由かもにゃあ。つまり原因はこのサンプルで、
調査出来るのです。タブン。SEGADRIVEでPCMも鳴らないっぽい(?)これも直さな、あかんにゃあ。ソノウチ気が向いたら。
(2006-08/18、21:38)
■ここは記事であると同時に、実はワタシのメモ帳でもあるのです。そーゆー訳でメモ、メモ。
(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
より一部無断転載。
資料確認。なんだ一枚で出来るんじゃん。しかも「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)
■アメブロがさー、広告広告!センデンしてくれないと泣いちゃうからつ。...ってウルサイエエト、積極敵的だからさー。
ウザイナ積極テキですね、と思いキレテこの説教積極性にこたえねばとオモイふざとゆー訳で、
広告が五枠になった。(もうどーでもしてくれ)
<警告::このブログを読むと「お肌が荒れます」読んだらダメです。お肌が荒れてもワタシのせーではありえません>
(その為に5段ぶち抜きで警告しております。アメブロより)
とにかく、そりゃアメブロ界にイキル以上仕方がない。それをやってたら変なもん発見。
「アクセス解析」。初心者的にはヨクワカランデ放置だったんだが、ヨクワカランがヤッテミタ。役に立つのかどおかやった事無いから
ワカランモン。
そんで、(テストで)テキトーな所クリック。ワタシしかいないミタイなのに何故か「2人」になってる。変なの?と思い。しばらくしたら、
いつのまにか「3人」になってた。
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)
>下が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)