名前欄に6502プログラムを書きたいその2

  • さくじつ書いたプログラムをアセンブルして、バイナリが出てくるので cheat として名前欄に手打ちする。
  • 制御文字が入っていていくつかのバイナリを直接名前欄に書くことが出来ない。
  • ここまでは想定内で、0x00-0x3f, 0xc0-0xff あたりが使えない。
  • リストアップしようにも最初の名前入力欄の文字の並びがバイナリ値として不規則に並んでいて調査が面倒くさい。

使えない文字が少ないことに驚きを感じた方がいい。具体的に使えない命令を list up する。

ldy #6-1 → ldy $xxxx

0x05 は正常な文字ではないので、 ROM のどこかにある 0x05 をリストアップする。このアドレスは当然正常な文字で構成されべきで致命的ではないものの、0x05 を探すのが単純に面倒。

bne	save0_name1

次の名前欄の相対アドレスが 0x3a になって使えない。この場合、名前欄に書く順番を変えて -0x46 とかにすると使える。別の制限ができるけど。

lda	param,y → ldx param,y (次のtaxは削除)

opcode $b9 が不正な文字。それ以前に abs,y は lda だけだと思ってたら ldx ができるなんてしらんかった。 ldx param,x みたいな dest と index が同じになるアドレッシングはないらしい。

sta	$7c00,x → sta $7c40,x

$00 が使えないので x に読み込まれる値を調整する。

bmi	save1_name1 → bne save1_name1

単純に相対分岐でなくなったから、 bpl + jmp としてたんだが、 bpl も bmi も使えない。いや、 beq でいいです。

param:
	byt	1,$6c
	byt	$8c,$72
	byt	$86,$73

offset 0 の data の 1 を収録できないので、bit7:5 あたりを xor 反転したら次の $8c が不正な文字になるというありさま。これも 0xe7 を含む正常な文字のアドレスを見つければいいので大した問題ではない。
でも正常なスクリプトアドレスを含ませたくてかなり考えた。xor は無理なので bit rotate なら正常な文字になると思った物の、6502 の bit rorate は carry も含めて 9bit の rotate なのでなんかうまくいかなそうで、命令長が長くなる。 add がなくて adc とか inc a がないとか bra がないとかは有名だが、これも一種の adc だけの友達であることなんて今更気づいたよ。

param の address は正常の文字とせねばらないので $6x40-$6x45 か $6x80-$6x85 に置く必要がある。これが先頭の bne の相対ジャンプ先とからんで、希望するアドレスにおけないとかいう別の問題が発生。

明日はどっちだ。