Schnelle Hypot Methode für kleine a b (a<=10,b<=10)
Verfasst: 10.01.2025 15:56
Moin,
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.
Hier noch der Basic Code, um die hypot_10x10 Tabelle zu erstellen.
Überflüssige Kommas müssen selbst entfernt werden.
Wer den MADS Assembler nutzt, muss wohl statt .byte etwas anderes schreiben.
LG
Lars
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