Bu arada Nightlord herhalde bahsetmiştir ama çok detaylı okumadığım için yazıları hemen belirtiim, sin_table,x kullandığın sürece sinüs tablosunun bir kopyası yeterli olacaktır, yani.
sin_table !by 128,129,130,132...........,124 (256 adet değer)
Ancak eğer sin_table+$30,x gibi tabloyu biraz ilerden okumaya başlayacak olursan bu taşmaya neden olacaktır. Mesela x'e $e8 gibi bir değer verecek olursak
$e8 + $30 = $118
Tablonun toplam uzunluğu $100 (=256) olduğuna göre hafızadan saçma değerler dönecektir. Bunu engellemek için tabloyu tekrar ettirmek gerekir. Yani;
sin_table !by 128,129,130,132...........,124 (256 adet değer)
!by 128,129,130,132...........,124 (256 adet değer) <- üst satırın kopyası
256 bytelık bir sinüs tablosu için 512 byte kullanmamız gerekir kısacası. Bir diğer önemli husus sinüs tablosu gibi tabloları tam $100'lük bir bloktan başlatmaktır. Yani tablo $0e37 gibi bir adresten değil de $0e00 ya da $0f00 gibi yuvarlak bir adresten başlamasını tercih etmenizi tavsiye ederim.
Bunu ACME'de yapmanın basit bir yolu var. !align komutu.
!align 255,0,0
Diyecek olursanız kod tam $100'lük bir bloğun başına atlar. Diyelim ki şöyle bir kod yazdık.
* = $080d
sei
lda #$00
sta $d020
rts
!align 255,0,0
sin_table !by ....................
!by ....................
kod hafızaya şu şekilde yerleşir
.080d sei
.080e lda #$00
.0810 sta $d020
.0813 rts
.........
.........
.0900 -> sin_table
Satır numaraları aklına takılanlar olursa açıklaması "sei" ve "rts" 1 byte, "lda" parametresiyle birlikte 2 byte, "sta" ise yine parametresiyle 3 byte kaplar. Bu yüzden hafıza yerleşimi o şekilde oluyor.
Burda rts'den sonraki hafızaya dokunmaz ACME. align komutu olduğu için sonraki ilk $100'lük bloğa yani $0900'e atlar ve sinüs tablosunu ordan itibaren yerleştirir.
Sanırım Nightlord bu anlattıklarımı anlatmıştı bir dökümanında ama hangisi hatırlayamadım. En fazla pekiştirme olur sizin için. Sinüs tablosu yaratmanın alternatif yöntemleri için Plazma disk magazinindeki "Test Platformu" köşesini okuyabilirsiniz.