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


