うんちくを垂れる嫌な日記

FC版ソーサリアン(もどき)の画面構成が仕組みがわかった。

文字がでるところ

文字が徐々にでてくるのは Charcter RAM の機能を使って徐々にキャラクタを書き込んでいく技法。このため TGROM を採用したようだ。

アーケードのグラディウス(初代とIII)にも Charcter RAM が載っているのでこの技法が使える。アーケード基板では Charcter は ROM にするのが普通なので、III はこれを再現するためにわざわざ Charcter RAM を搭載した気がする。

タイトル画面の BG

あの画面は4つの領域にわかれていて、画面表示中に3回の IRQ を出している。

重要なのが上から2番目の領域で、BG のキャラクタエリアを変更している。他のソフトは詳しくないけど、ここはあまりいじらないレジスタ。これを切り替えることによって BG では1画面で 0x100 通りしか選べないデータを 0x200 個 BG として使える。

charcter ROM のバンクを描画途中で切り替えるのは常套手段なのだが、キャラクタをフェードアウト/フェードインをする都合で charcter RAM なのでそれは選べない。そこで BG/Sprite アドレスを切り替えている。*1

3つ目の領域でスクロールレジスタを変えてるのは、変えなくてもできるので理由はよくわからない。



タイトル画面の sprite

色が足りなかったり、変則的な形はスプライトにしている。アドレスが切り替わるのでデータ構成に注意する必要がある。これは nametable view をみて、ないものがスプライトと思えばよい。

*1:これが常套手段だったら知ったかがうんちく垂れてると思って嫌がらせしてください

エッジコネクタについて熱く語る

kazzo を生産するときにエッジコネクタが入手困難だろうとおもったら、digi-key であっさり見つかったので買う人は型番をメモっておくといいだろう。

  • 製品検索
  • カードエッジ、エッジボードコネクタ (155,310 items)
    • ジェンダ - 雌
    • ポジション数 - 60 or 72
    • ピッチ - 2.54mm
  • フィルタを適用
  • 一覧を見る

リストにずらーと出るが写真とか、在庫数量を絞ると3つぐらいになる。

60 pin

  • Tyco Electronics (耳なし)
    • 1-5530843-8
    • 5530843-7
  • EDAC 395-060-520-202 (耳あり)
  • Sullins Connector Solutions ECC30DJBN (耳なし)
  • 野口電子工業 S-60M-2.54.5 (日本の会社っぽい名前を使ってるが China の会社)

72 pin

  • Tyco Electronics 5530843-8 (60pin と 72pin の型番が紛らわしいので要注意)
  • Sullins Connector Solutions
    • ECC36DJWN
    • ECC36DJBN

digi-key はちょっと... という人も chip1stop あたりで型番を直接入れると扱っているので欲しい人はチェックしてみて。

mmc1 系スクリプト

他のスクリプトにも問題があったり、 flash script のエラーが index error に吸われてわからないとかいろいろあるので更新できない... ので先に mmc1 だけ。

mmc1_slrom.af の cpu_transfer() を下記に変更してください。

function cpu_transfer(d, start, end, cpu_banksize)
{
	local i = 0;
	for(i = start; i < end - 2; i += 2){
		mmc1_write(d, 0x8000, 0x1c);
		mmc1_write(d, 0xe000, i | 0);
		cpu_program(d, 0x8000, cpu_banksize);
		
		mmc1_write(d, 0x8000, 0x18);
		mmc1_write(d, 0xe000, i | 1);
		cpu_program(d, 0xc000, cpu_banksize);
	}
	mmc1_write(d, 0x8000, 0x1c);
	mmc1_write(d, 0xe000, i);
	cpu_program(d, 0x8000, cpu_banksize);
	cpu_program(d, 0xc000, cpu_banksize);
}

mmc1_surom.af も同様。

function cpu_transfer(d, start, end, cpu_banksize)
{
	for(local k = 0; k < 0x20; k += 0x10){
		mmc1_write(d, 0xa000, k);
		for(local i = 0; i < 0x10; i += 2){
			//even page
			mmc1_write(d, 0x8000, 0x0c);
			mmc1_write(d, 0xe000, i);
			cpu_program(d, 0x8000, 0x4000);
			
			//odd page
			mmc1_write(d, 0x8000, 0x08);
			mmc1_write(d, 0xe000, i | 1);
			cpu_program(d, 0xc000, 0x4000);
		}
	}
}

コマンドアドレスの定義が完全に蛇足でした... この間違いに1年間気づきませんでした。いままで mmc1 系はコマンドアドレス A10-A0 type でだけかけてました。確認しなくてごめんなさい。