address に格納されている数値があり、1f
address00
に格納されている別の数値があり1e
ます01
。ここで、と1f
を作り、それらを足して を取得します。どうすればいいですか?私は手順を知っており、これに対処していますが、私は 6502 の初心者なので、誰かがそれを効率的に行う方法を教えてくれることを本当に感謝しています (サイクルの最小量)。1f00
1e
001e
1f1e
asl
lsr
2 に答える
16 ビットの数量を扱う場合は、変数が 16 ビットまたは 2 バイト幅であることを確認する必要があります。
特に変数をアドレスとして使用できる場合は、おそらく 6502 リトルエンディアン順序を使用することをお勧めします。つまり、下位バイト、上位バイトの順序です。
アドレス 00 に数値 1f が格納され、アドレス 01 に別の数値 1e が格納されています。
$001F をアドレス $00-$01 ($00 は #$1F に等しく、$01 は #$00 に等しい) に格納し、$001E をアドレス $02-$03 ($02 は #$1E に等しく、$03 は #$00 に等しい) に格納する必要があります。 )。次に、おそらく別の変数に結果を保持させたいと思うでしょう。たとえば、$04-$05 としましょう。
しかし、実際に 2 つの 8 ビット変数があり、それらを 16 ビット変数に「変換」したい場合は ...
仮定 (わかりやすくするためにラベルを使用):
$00 - 最初の 8 ビット変数 (ラベルVAR_A_8
)
$01 - 2 番目の 8 ビット変数 (ラベルVAR_B_8
)
$02-$03 - 最初に変換された 8 ビット変数 (ラベルVAR_A_16
)を配置する場所
$04-$05 - 変換された 2 番目の 8 ビット変数 (ラベルVAR_B_16
)を配置する場所
彼らは署名されていませんか? もしそうなら、ただLDA #$00, STA VAR_A_16, STA VAR_B_16, LDA $00, >STA VAR_A_16, LDA $01, STA >VAR_B_16
。
「の>
下位バイト」を意味する一般的なアセンブラ構文です(実際にはそうかもしれませ<
ん-私はいつもそれについて混乱していました)
彼らは署名されていますか?8 ビット値が負の場合 (ビット 7 が設定されている)、新しいバイトに $FF を格納する必要があり、それ以外の場合は $00 を格納する必要があります。
一方通行:
LDX #$00
LDA VAR_A_8 ;Loading .A will set N flag in .P if bit 7 is set
BPL VAR_A_NOT_NEG
DEX ;.X will now be $FF
VAR_A_NOT_NEG: STX <VAR_A_16 ;store .X in high byte
STA >VAR_A_16 ;copy low byte
LDX #$00
LDA VAR_B_8
BPL VAR_B_NOT_NEG
DEX
VAR_B_NOT_NEG: STX <VAR_B_16
STA >VAR_B_16
6502 は 8 ビットのマシンです。下位アドレスから最下位バイトを読み取ることにより、16 ビット量を構成します (つまり、リトル エンディアンです)。
したがって、現在のレイアウトに対して切り替えるか、アドレスに移動するか、その他の方法で、1e
前に をアドレスに配置する必要があります。シフトや ORing は必要ありません。実際、ビットごとのロジックでシフトまたは操作できる 6502 内の 16 ビット レジスタはありません。1f
1f
02
2 バイトが保持されているが反転されている場合は、00
たとえば01
ゼロを設定し、アドレッシング モードをx
使用して にアクセスできます。($00, x)
1f1e