sta POS+2,x diye bir opcode da yok aslında. Bu senin kullandığın derleyicinin bir güzelliği sana. Yani diyelim ki;
POS = $1000
sta POS+2,x
derlendiğinde;
sta $1002,x
şekline dönüşür. Buradaki POS+2'lerin tamamı aslında POS diye sadeleştirilebilir, dediğim gibi burada önemli olan sadece X ve Y registerlarının kullanım yapıları.
sta söz konusu olduğunda.
sta ZEROPAGE_ADDRESS
sta ZEROPAGE_ADDRESS,x
sta ADDRESS
sta ADDRESS,x
sta ADDRESS,y
sta (ZEROPAGE_ADDRESS,x)
sta (ZEROPAGE_ADDRESS),y
bunlar mevcut, valid opcodelar.
sta ZEROPAGE_ADDRESS,y
sta (ZEROPAGE_ADDRESS)
sta (ZEROPAGE_ADDRESS),x
sta (ZEROPAGE_ADDRESS,y)
bunlar valid değil, işlemcide böyle opcodeler yok.
sta (POS+2,x) bu bağlamda valid ama POS+2'nin değeri zeropage'de yer almak koşuluyla ($00-$ff aralığı).
Edit: Sorunun ikinci paragrafını cevaplamamışım.
Parantez "address pointer" anlamına geliyor. Yani parantez olmadan;
sta $74
dediğinde accumulator'deki değer hafızanın $74 yani $0074 adresine yazılıyor. Ancak;
sta ($74),y
ya da
sta ($74,x)
kullandığımızda bu adreslerin işaret ettiği hafıza adresine değer yazılıyor. Şöyle ki x ve y sıfır değerinde olduğu durumda her ikisi de;
$74 : low byte
$75: high byte
olacak şekilde 16 bitlik bir adres okuyor. Örneğin;
$0074 : $8c
$0075 : $a4
olduğu durumda bu;
$a48c
adresine denk geliyor ve buraya accumulator değeri yazılıyor. Ancak x'in parantezin içinde, y'nin dışında olmasının bir farkı var elbette ki.
sta ($74,x)
söz konusu olduğunda $74'e değil $74+x adresine yazılıyor accumulator'ün değeri. Yani x'in değeri $04 ise $74'den değil $78'den itibaren adresleri okuyor, kısacası low byte $78, high byte $79'dan okunuyor.
sta ($74),y
durumunda ise her zaman low byte $74 ve high byte $75'den okunuyor. Deminki örneğe göre $a48c alınıyor ele. Ama buna y'nin değeri ekleniyor. Örneğin y'nin değeri $12 olduğu durumda $a48c'ye değil $a48c+$12 = $a49e adresine yazılıyor accumulator değeri.
Özetle durum bu.