Originally posted by vigo@Nov 5 2005, 03:42 AM
1-acaba çarpma yapan bi makro nasıl yazarız..
2-macro'dan return-value nasıl olur..
n1 !by 3;
n2 !by 5;
+mulu n1,n2;
desem, sonuç x'e dönse....
!macro mulu .s1 , .s2 {
!set rslt = .s1 * .s2;
}
gibi mi?
bilen yapan varmı?
[post=2678]Quoted post[/post]
[/b]
O kadar kolay kurtulamazsın!!!! :)
lsr
ror zeropage1
bcc *+5
clc
adc zeropage2
gibisinden bir işlemi 9 kere falan tekrarlaman lazım.
Daha detaylı bilgi için C=Hacking #8'i tavsiye ediyorum.
C=Hacking (http://www.ffd2.com/fridge/chacking/)
*
* 8-bit multiply -> 16-bit result
*
* ACC*AUX -> [AUX,EXT] lo,hi
MULT LDA #$00
LDY #$09
]LOOP LSR
ROR ACC
BCC MULT2
CLC
ADC AUX
MULT2 DEY
BNE ]LOOP
STA EXT
9. sayıda ise tablo kullanarak daha hızlı bir yöntemi mevcut.
Hazır source code istersen The Fridge'de bulman mümkün.
The Fridge (http://www.ffd2.com/fridge/)
Direct Source Link (http://www.ffd2.com/fridge/math/mult-div.s)
Originally posted by vigo@Nov 6 2005, 01:11 PM
ya skate,
benim kafam bi yerde karıştı...
bu iş neden macro ile olmuyor?
bi tane text plot eden macro yazdım
char coord , renk ve textpointer ı parametre geçiyon,
ekrana basıyor...
mesela 5,5 diye geçince,
!SET START_COORD = ( 40 * .py ) + .px;
STA $0400+START_COORD,X;
diyorum sorunsuz oluyor?
derdim sayıları realtime çarpmak diil...
[post=2710]Quoted post[/post]
[/b]
Realtime olmadığı sürece zaten çarpma işlemini yapabilirsin. Ancak sen Macro'ya parametreden değişken gönderdiğin ve bu değişkenler üzerinde işlem yapmaya kalktığın an olay realtime'a dönüşüyor.
mesela
!macro mulu {
!set rslt = .s1 * .s2;
}
gibi birşey çalışabilir belki .s1 ve .s2'yi constant kabul edersek tabii...
ancak
!macro mulu .s1 , .s2 {
!set rslt = .s1 * .s2;
}
dediğimiz anda burda parametrik bir fonksiyon oluşuyor ki .s1 ve .s2'nin constant olmadığı kesin. Bu durumda bu şekilde makro yazılamaz. En azından ben hiç böyle bir yöntem kullanmadım.
Originally posted by vigo@Nov 6 2005, 09:39 PM
hmmm tüh ya...
[post=2739]Quoted post[/post]
[/b]
Yaw boşver tühü mühü... Kullan C=Hacking'deki yöntemi. Özellikle 9. sayıda oldukça hızlı bir çarpma işlemi var tablo kullanarak (x²/4 tablosu). Hatta onu özelleştirerek oldukça hızlı işlemler yapabiliyorsun.
x²/4'ün mantığı da şöyle.
Diyelim ki a ile b'yi çarpacaksın. x²/4 tablosunun elemanları 0'dan 255'e kadar gidiyor... Bu durumda (a+b)inci elemandan (a-b)inci elemanı çıkarınca geriye a*b işleminin sonucu kalıyor. Hemen deneyelim.
a = 7
b = 4
f(a+b) - f(a-b) = a*b
f(7+4) - f(7-4) = 7*4
f(11) - f(3) = 7*4
Bu aşamada precalculated tablodan 11. ve 3. değerler okunacak. Burada biz hesaplayalım.
x²/4 ise;
(11²/4) - (3²/4) = 7*4
(121/4) - (9/4) = 7*4
(121-9) / 4 = 7*4
112 / 4 = 7 * 4
28 = 28
Ahanda doğruymuş işlem :)
Dikkat edilmesi gereken nokta işleme girmeden önce a ile b'nin sort edilmesi gerektiği. Ya da diğer bir deyişle formül şöyle
f(a+b) - f(|a-b|) = a*b
Bir mutlak değer giriyor işin içine.
Bu anlattıklarım pozitif işlemler için geçerli. Negatif çarpım için flag kullanabilir ya da 7 numaralı bitten yararlanabilirsin. Kolay gelsin Vigo kardeş.