Peter hatte AFAIK letztens erst eine flotte Methode ausgeknobelt für SQRT(a*a + b*b), um z.B. die genauere Entfernung zu messen.
Für Pacmen war ich faul und habe einfach abs(a)+abs(b) verwendet.
Für mein neuestes Projekt brauche ich es aber etwas genauer, soll ja besser aussehen. Allerdings ist mir Peters Methode viel zu langsam und meine x,y Werte sind recht klein (<=10)
Hier also mal meine Version von sqr(x*x + y*y), die Tabellen verwendet und damit sehr flott arbeitet. Kann auch als Idee verstanden werden, wie man so etwas machen könnte.
Code: Alles auswählen
; schnelle "Berechnung" von SQR(x*x + y*y)
; x und y dürfen von -10 bis +10 angegeben werden.
; ist x oder y zu groß(zu klein) wird $FF zurückgegeben.
reg=212 ; irgendeine freie zero-page Adresse.
FAST_HYPOT
cpy #0
bpl y_positiv
sty reg
SEC ;Ensure carry is set
LDA #0 ;Load constant zero
SBC REG ;... subtract the least significant byte
TAY ;... and store the result
y_positiv
cpy #11
bge fail ; bge ist branch greater equal (bcs?)
cpx #0
bpl x_positiv
stx reg
SEC ;Ensure carry is set
LDA #0 ;Load constant zero
SBC REG ;... subtract the least significant byte
TAX ;... and store the result
x_positiv
cpx #11
bge fail
clc
txa
adc hypot_mult_11,y
tax
ldy hypot_10x10,x
ldx #0
rts
fail
ldy #$ff
ldx #$00
rts
hypot_mult_11
.byte 0,11,22,33,44,55,66,77,88,99,110
hypot_10x10
.byte 0,1,2,3,4,5,6,7,8,9,10
.byte 1,1,2,3,4,5,6,7,8,9,10
.byte 2,2,3,4,4,5,6,7,8,9,10
.byte 3,3,4,4,5,6,7,8,9,9,10
.byte 4,4,4,5,6,6,7,8,9,10,11
.byte 5,5,5,6,6,7,8,9,9,10,11
.byte 6,6,6,7,7,8,8,9,10,11,12
.byte 7,7,7,8,8,9,9,10,11,11,12
.byte 8,8,8,9,9,9,10,11,11,12,13
.byte 9,9,9,9,10,10,11,11,12,13,13
.byte 10,10,10,10,11,11,12,12,13,13,14
Code: Alles auswählen
for x = 0 to 10
for y = 0 to 10
?sqr(x*x + y*y);",";
next y
?
next x
Wer den MADS Assembler nutzt, muss wohl statt .byte etwas anderes schreiben.
LG
Lars