プロジェクト エフがまた何やらするらしい。


トップページには気になる文句が…。


キミのBASICがカセットに「ファミベカセット」展示中


Project-F
http://projectfonline.com/


作り方は近日公開とのこと。
吉祥寺にある雑貨屋メテオの催し物、「わたしのファミカセ展 2008」で
現在現物が展示されてるらしい。
ザックナーIIが遊べるようになってるところを見ると
ファミベのよっしん氏も技術方面で絡んでる?


わたしのファミカセ展 2008
http://famicase.com/


作り方も重要だけど、6502アセンブラ読めるようになった今としては
どんな原理で実現してるのかが一番知りたい。

ファミベ本また買った。


任天堂ファミリーベーシック大百科


ケイブンシャも出してた!
無いようで意外と存在する。>ファミベ本


Beepファミマガベーマガ掲載の記事も見て見たい!<キリがない
バッ活、ファミ改、ファミコン風雲児単行本なんかにも乗ってた。


ついでに買っちゃった(てへっ)。


ソフト
・ドラゴンボールZ3 悟空伝
グーニーズ2 -フラッテリー最後の挑戦-
・がんばれペナントレース!


ハード
・旧ファミコン本体 2台
ファミリーベーシック(キーボード、黒カセット) 1セット
・旧ファミコンIコン 1個
・旧ファミコンIIコン 1個
・井出洋介名人の実践麻雀II 専用コントローラー 1個

立ち仕事キツイ。


これは慣れるまで待つとして…。
むしろ腰が痛いの。超やばい!


あとしばらく会社の俺のパソコンがネットに繋がらないの。orz
いいですよーだ!
ファミコンプログラム机上でコーディングするもん!
紙に書いたやつお家帰って実装するんだもんね!

第二弾。


始めた。
この前作ってみたテストプログラムから
パッド周りの処理とか初期化関係とか、持ってこれるとこを持ってきたり、
汎用的にすべきとこなどを手直ししたり。
ケルトンプログラムはすぐ出来そう。


で、何となく必要かと思ってたゼロサプレスはよくよく考えてみると
今やろうと思ってるプログラムの場合、
トータルの数値を1回ポーンとゼロサプするわけじゃないので
インクリメント発生の度にそんなことしてたら
IRQで後々苦労しそうなので
(処理が終わらず画面が破壊されることで悩むのはもうイヤだw)。
データは1桁1バイトで単純に定義してみる。
10になったら1桁繰り上げ。
作ろうと思ってるのは千の位までで事足りるのでそれで4バイトつーことで。


最初はシーン(ゲームステージ?)毎に1つのNESファイルとして作業してく。
でもって全部組み終えたら最終的に1本のNESへビルドする(そうできるようなフラグも持っとくこと)。
シーン固有のルーチンはシーンソースの最下へ。
共通利用するルーチンはサブルーチンソースへ。見やすく。綺麗にを心がけること。


ソース込みで公開できるようなコードを目指してみる!


あ、
後PPUスクロール値の初期化は毎度実行するようにしてみようか。

麻雀コントローラ用テストプログラム。


RGKT-FC-HMBR-001(5)


とりあえずの目処付けて公開しとく。


UNLICENSE HVC CHECK CASETTE
http://akiba.geocities.jp/consolehomebrewprogramming/download/index.html#UNLHVCCC



実機でも動作確認してみた。



EP-ROM焼くと後でイレースすんのがメンドイから自作のRAMカードでチェック。
ソフトリセットによる水着変更もOK。
でもNestopiaでは水着切替が働かない。
リセット割り込み以降、RAM領域の値が予想されるデータと違うのが原因かと。


1、電源投入後、水着変更フラグをゼロセットする(初期化)。
2、以降のコードをソフトリセット割り込み直後の処理に割り込みベクタ設定。
3、初期化した水着変更フラグをYレジスタに待避させてからRAM領域($00-$7FF)初期化
  (XレジスタでループさせてAレジスタで0を書き込み)。
4、Yレジスタからゼロページへ待避した値を戻す。
5、待避した値を0か1かで比較させ、
  0ならブラジル水着、1ならビキニ水着へ変更
  (スプライト領域とBG領域のアドレスを切り替えてる)。
6、現在のフラグが0なら1をセットし、1なら0をセット。
7、画面描画。
8、以降リセットボタンが押下(ソフトリセット)される毎に2、の処理に戻る。


NNNesterJ、VirtuaNES、G-NESでは実機と同じく正常動作した。
ゼロページでタイマー処理とか、全然問題なく動いてるし、
例えばシューティングゲームのハイスコア処理とか同じような方法だと思うし、
だとしたら、しょっぱなの初期化がどうもいかんのかも。Nestopia的には。


見所(謎)
任天堂株式会社宇治工場技術部作の、HVC検査カセットという検査ソフトのリスペクト
 (カセット持ってないのでネットで見つけた画像で想像しながら作ったよー)
・Iコン、IIコン(旧ファミコンならマイク、NEWファミコンならスタート・セレクトに対応)に反応
・井出洋介名人の実践麻雀 専用コントローラー、専用コントローラーIIに反応
・リセット押下毎にコスチューム(水着)切替
・瞬きアニメーションと、しばらく放置してると画面上のキャラクタが寝むりだす
おっぱい星人な人向け(俺のことかー!)


…でも音楽無いのは淋しいかも。(−−;

アクセス手続き。アセンブラ編。


ASM保存して、インクルードすれば直ぐ利用可能なコード。
擬似命令RSSETでゼロページ$20から12バイトを変数領域としてる。
キー押→離、離→押状態までとりあえず保存。


コピペが億劫な人向けにアセンブリソースもUPしといたす。


井出洋介名人の実践麻雀、実践麻雀II 専用コントローラー - NESASM用サブルーチンソース
http://akiba.geocities.jp/consolehomebrewprogramming/fc/index.html#MJPAD


NESASM用。
違う6502アセンブラでビルドする場合、読み替えて解釈する必要あり。
テストプログラム書いて動作確認済み。


(ゼロページ参照の'<'は省いてる。無くてもビルド可能。)

;井出洋介名人の実践麻雀、井出洋介名人の実践麻雀II
;専用コントローラーアクセスルーチン
;
;
;Ide Yosuke Meijin no Jissen Mahjong,
;Ide Yosuke Meijin no Jissen Mahjong 2
;Special Controller access routine.
;
;
;Mar 30,2008 - Apr 06,2008
;ANALYZED BY. GOCCHI
;
;this web site.
;(c)都立城北高等学校 レトロゲーム活用研究同好会 (レゲ活)
; - Console/Homebrew Programming - 
;http://akiba.geocities.jp/consolehomebrewprogramming/
;
;
;ロン = Ron(RN)
;リーチ = Reach(RC)
;チー = Chii(CH)
;ポン = Pon(PO)
;カン = Kan(KA)
;スタート = Start(ST)
;セレクト = Select(SL)
;
;
	.rsset	$20
;
				;I/O $4017 OUTPUT CYCLE
				;1, 2, 3, 4, 5, 6, 7, 8
				;MSB                LSB
				;7, 6, 5, 4, 3, 2, 1, 0 bit
MJPAD1_ON	.rs	1		;H, G, F, E, D, C, B, A
MJPAD2_ON	.rs	1		;0, 0, N, M, L, K, J, I
MJPAD3_ON	.rs	1		;0,WN,RC,CH,PN,KN,ST,SL
MJPAD1_OLD	.rs	1	;MJPAD1 old mahjong pad data.
MJPAD2_OLD	.rs	1	;MJPAD2 old mahjong pad data.
MJPAD3_OLD	.rs	1	;MJPAD3 old mahjong pad data.
MJPAD1_TRG	.rs	1	;MJPAD1 now flame up edge(0 -> 1) trigger data.
MJPAD2_TRG	.rs	1	;MJPAD2 now flame up edge(0 -> 1) trigger data.
MJPAD3_TRG	.rs	1	;MJPAD3 now flame up edge(0 -> 1) trigger data.
MJPAD1_RLS	.rs	1	;MJPAD1 now flame down edge(1 -> 0) release data.
MJPAD2_RLS	.rs	1	;MJPAD2 now flame down edge(1 -> 0) release data.
MJPAD3_RLS	.rs	1	;MJPAD3 now flame down edge(1 -> 0) release data.
;
MJPAD_ON	.equ	MJPAD1_ON
MJPAD_OLD	.equ	MJPAD1_OLD
MJPAD_TRG	.equ	MJPAD1_TRG
MJPAD_RLS	.equ	MJPAD1_RLS
;
;
;
MJPADGET:
;
;1st initialize.
;
	LDA	#$05
	STA	$4016
	AND	#$FE
	STA	$4016
	LDX	#$00
	JSR	.MJPADGET
;
;2nd initialize.
;
	LDA	#$03
	STA	$4016
	AND	#$FE
	STA	$4016
	INX
	JSR	.MJPADGET
;
;3rd initialize.
;
	LDA	#$07
	STA	$4016
	AND	#$FE
	STA	$4016
	INX
;
.MJPADGET:
;
;old input data backup.
;
	LDA	MJPAD_ON,X
	STA	MJPAD_OLD,X
;
;now input data read.
;
	LDY	#$08
.LOOP
	PHA
	LDA	$4017
	LSR	A
	LSR	A
	PLA
	ROL	A
	DEY
	BNE	.LOOP
	STA	MJPAD_ON,X
;
;get now flame up edge(0 -> 1) trigger data(PAD_TRG).
;get now flame down edge(1 -> 0) release data(PAD_RLS).
;
	LDA	MJPAD_ON,X
	EOR	MJPAD_OLD,X
	TAY
	AND	MJPAD_ON,X
	STA	MJPAD_TRG,X
	TYA
	AND	MJPAD_OLD,X
	STA	MJPAD_RLS,X
;
	RTS
;


(*´Д`)。o○(誰かファミコンで萌え萌えな麻雀ゲームを!希望!)

麻雀コントローラのアクセス手続き。


4月最初に調べたもの。
3月半ばから只管アセンブラだけの毎日で
3週間目にしてやっとアセンブラをソラで読書きできるようになってきたとき。


゚Д゚)…スイマセンデシタ!
1年前に実は挫折して高級言語に逃げたのでしたw
だからここも放置プレイっつーわかりやすい有様。
このだめ虫!


自分の場合、高級言語でそれなりにプログラムかじったからこそ
やっとアセンブラを理解することができたんだと思う。


でもねでもね?
ゲームが組めないのよーw
ムズイす;;
ゲームプログラミングの素養が非無だからなぁ…。

●麻雀コントローラのアクセス手続き

ファミコンの麻雀コントローラには以下に記す手順でアクセスを行う。
21ボタンは8bitずつ3グループ(2bit)で管理されている。
全ての入力データを取得するのに、3度のイニシャライズどキーリードが必要である。


イニシャライズ
I/O $4016 の bit2, bit0 をセット(1)する。
I/O $4016 の bit0 をクリア(0)する。

キーデータリード
入力をチェックしたいボタンになるまでI/O $4017 の bit2 を連続で読み込む。 


読込回数	ボタン
1	H
2	G
3	F
4	E
5	D
6	C
7	B
8	A


イニシャライズ
I/O $4016 の bit1, bit0 をセット(1)する。	
I/O $4016 の bit0 をクリア(0)する。	

キーデータリード	
入力をチェックしたいボタンになるまでI/O $4017 の bit2 を連続で読み込む。 	

読込回数	ボタン
1	未使用
2	未使用
3	N
4	M
5	L
6	K
7	J
8	I


イニシャライズ
I/O $4016 の bit2, bit1, bit0 をセット(1)する。	
I/O $4016 の bit0 をクリア(0)する。	

キーデータリード	
入力をチェックしたいボタンになるまでI/O $4017 の bit2 を連続で読み込む。 	

読込回数	ボタン
1	未使用
2	ロン
3	リーチ
4	チー
5	ポン
6	カン
7	スタート
8	セレクト


読み込んだ値の bit2 が 0 なら入力無し、 1 なら入力ありと言う事になる。 	
未使用の箇所は、ボタンが接続されてないので 0 が出力される。

井出洋介名人の実践麻雀 専用コントローラー


井出洋介名人の実践麻雀 専用コントローラー


井出洋介名人の実践麻雀 専用コントローラーII


解析自体は3ヶ月前に2日くらいででっち上げた。
一応間違ってないつもりだけど。
ダイオードの定格の見方だけわかんない。
ごめんなさい。


4021とトランジスタダイオードっていう組み合わせが
何とも昭和な作りを感じさせる。


専用コントローラー 回路図、見て見たい人は下のリンクからよろしくです。


井出洋介名人の実践麻雀、実践麻雀II 専用コントローラー
http://akiba.geocities.jp/consolehomebrewprogramming/fc/index.html#MJPAD