Hatena::ブログ(Diary)

naruko の開発メモ

2013年05月04日

マッピーキッズのサウンドテスト

http://makainyumon.web.fc2.com/cheat/

129 の実験にあると便利なんで使ってみることにした。ここに書いてあるんだが、条件がシビア。命令を見てみた。

;page = 3. (ROM offset 0x2000 * 3 + 0x1b40)
;each button pressed, increment memory
BD40: lda  $03   ;player2.button.status
BD42: cmp  #$80  ;buttonA
BD44: bne  $BD48
BD46: inc  $D1
BD48: cmp  #$40  ;buttonB
BD4A: bne  $BD4E
BD4C: inc  $D2
BD4E: lda  $02   ;player1.button.status
BD50: cmp  #$20  ;Select
BD52: bne  $BD56
BD54: inc  $D3
BD56: cmp  #$40
BD58: bne  $BD5C
BD5A: inc  $D4
BD5C: lda  $D0
; (snip)
BD9B: lda  $D1  ;player2.buttonA.presscount
BD9D: cmp  #$B4 ;180 <= count < 240
BD9F: bcc  $BDBC
BDA1: cmp  #$F0
BDA3: bcs  $BDBC
BDA5: lda  $D2  ;player2.buttonB.presscount
BDA7: cmp  #$3C ;60 <= count < 120
BDA9: bcc  $BDBC
BDAB: cmp  #$78
BDAD: bcs  $BDBC
BDAF: lda  $D3  ;player1.select.presscount
BDB1: cmp  #$78 ;120 <= count < 180
BDB3: bcc  $BDBC
BDB5: cmp  #$B4
BDB7: bcs  $BDBC
BDB9: jmp  $C094

調べたところ、時間の指定は命令と全く同じで、ボタンを押す順番は条件外ということでちょっと違った。こんな時間の測定はプレイヤー側からは判定することが容易ではないので、私同様に逆アセンブルしたものと見られる。

..... 見られるがどういう経緯でここに掲載されたのかが非常に気になる。当時の雑誌には掲載されたものの再録がなかったから埋もれて発掘とかなのか。

シビアな条件は作業の効率化として邪魔なので、Aボタンを押すだけで動くように変更した。

	org	$bd9b
	lda	$02     ;player1.buttonA.pressed? (bit7)
	bpl	$bdbc
	jmp	$c094

この状態だと上下で番号を1ずつ変更するため、左右で5ずつ変更する命令も書いたんだが、長いので割愛。

カートリッジの端子名として M2 という言葉は正しいのか

私が書いた文書は nesdev に転載されるときに PHI2 (または φ2) を M2 として置換されている。私が PHI2 を使っている理由は混乱の助長を防ぐために、俗説的な言葉は使わないようにするという方針だからである。俗説的な、というのは解析の文書を書いた人がφ2だと気づいたものの、φが ASCII の文字ではなく文字数を稼ぐために、 Z80 の M1 に似た言葉として M2 としたのではないかと疑っているためである。

nesdev の wiki にもこういう説明がある。

http://wiki.nesdev.com/w/index.php/Cartridge_connector

M2 : Also called PHI2 in official docs. This is the CPU clock output. When this signal is high, this means the PRG bus address and data lines are in a stable state and can be latched by external hardware. On reads, the data must be stable until this signal goes low.

この説明では私の推測通りなので M2 という言葉は不適切なので使うことはない。

別の文書では説明が詳細にされており、ちょっと心が揺らいでいる。

http://wiki.nesdev.com/w/index.php/CPU_pin_out_and_signal_description

M2 can be considered as a "signals ready" pin. It is a modified version the 6502's φ2 (which roughly corresponds to the CPU input clock φ0) that allows for slower ROMs.

In the NTSC 2A03, M2 has a duty cycle (fraction of a cycle the signal stays high) of ⅝, or 350ns/559ns. Equivalently, a CPU read (which happens during the second, high phase of M2) takes 1⅞ PPU cycles. The internal φ2 duty cycle is exactly ½. (The duty cycle in the PAL 2A07 is not known, but suspected to be 19/32)

(補足:分数がフォントによっては見にくい.順番に 5/8, 1と7/8(帯分数), 1/2)

CPU が 6502 ではなく 2A03 であり、φ2 から若干変更した信号ということであればその言葉を使う方がいいのかもしれないと思っている。もちろん Nintendo 公式の文書がでてくればそれに従うが、そういうものは機密文書なのででてくることはない(でも業務用の回路図はあったな)。

M2 の最初の定義は1つめの説明で、後々に再定義されたということなのかもしれない。スケールの大きな話で申し訳ないが、似た話としてメートルは時々定義が変更されて、精度が上がっている。

http://ja.wikipedia.org/wiki/%E3%83%A1%E3%83%BC%E3%83%88%E3%83%AB → 定義の変遷を参照, ただし wikipedia なのでこの文書自体の精度は微妙