Autor Thema: >ASSEMBLER: Sinus / Cosinus  (Gelesen 5754 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

afalc060

  • Gast
>ASSEMBLER: Sinus / Cosinus
« am: Mi 27.04.2011, 20:20:24 »
Hallo..

Wie am Sinnvollsten Sinus/Cosinus in Assembler benutzen?
Tabelle, ja. Aber wie umrechnen?

edit: Und wieviele Werte in der Tabelle machen sinn?
« Letzte Änderung: Mi 27.04.2011, 20:24:27 von afalc060 »

Offline simonsunnyboy

  • Moderator
  • *****
  • Beiträge: 1.797
  • Rock'n'Roll is the thing - Jerry Lee is the king!
Re: >ASSEMBLER: Sinus / Cosinus
« Antwort #1 am: Do 28.04.2011, 18:58:14 »
Ich würde eine Tabelle mit Fixkommadarstellung anlegen.

Entweder mit 256 Werten für 0 bis Pi/2 zu je 1/256 pro Bit oder mehr, jenach dem wieviel Genauigkeit benutzt wird.
Schnell zu rechnen sollte auch mit vollen 16Bit sein, da ist dann auch Genauigkeit dabei.
Evtl auch gleich Zahlen mit Vorzeichen berücksichtigen. Wenn der Speicher nicht zu knapp ist, den ganzen Bereich bis 2*PI mappen.

Ich denke mit so einer "üblichen" Skalierung findest du auch schon fertige Tabellen im Netz, ansonsten halt die Tabelle mit ${preferredDialect}BASIC oder dgl erzeugen.
Paradize - ST Offline Tournament
Stay cool, stay Atari!
1x2600jr, 1x1040STFm, 1x1040STE 4MB+TOS2.06+SatanDisk, 1xF030 14MB+FPU+NetUS-Bee

afalc060

  • Gast
Re: >ASSEMBLER: Sinus / Cosinus
« Antwort #2 am: Sa 30.04.2011, 19:34:59 »
also sowas
'
OPEN "O",#1,"sintab.i"
anz&=256
c&=8
PRINT #1,"***************************************"
PRINT #1,"*    Sinus LUT mit ";anz&;" Werten"
PRINT #1,"***************************************"
PRINT #1,"ANZSIN equ ";anz&
PRINT #1,"sinustab:";
FOR n&=0 TO anz&
  winkel=(n&/anz&)*(2*PI)
  wert$="$"+HEX$(INT(SIN(winkel)*256))
  IF c&=8
    PRINT #1,CHR$(13)+CHR$(10)+"dc.w ";
    CLR c&
  ELSE
    PRINT #1,", ";
  ENDIF
  PRINT #1,wert$;
  INC c&
NEXT n&
CLOSE #1

heraus kommt dabei sowas
***************************************
*    Sinus LUT mit 256 Werten
***************************************
ANZSIN equ 256
sinustab:
dc.w $0, $6, $C, $12, $19, $1F, $25, $2B
dc.w $31, $38, $3E, $44, $4A, $50, $56, $5C
dc.w $61, $67, $6D, $73, $78, $7E, $83, $88
dc.w $8E, $93, $98, $9D, $A2, $A7, $AB, $B0
dc.w $B5, $B9, $BD, $C1, $C5, $C9, $CD, $D1
dc.w $D4, $D8, $DB, $DE, $E1, $E4, $E7, $EA
dc.w $EC, $EE, $F1, $F3, $F4, $F6, $F8, $F9
dc.w $FB, $FC, $FD, $FE, $FE, $FF, $FF, $FF
dc.w $100, $FF, $FF, $FF, $FE, $FE, $FD, $FC
dc.w $FB, $F9, $F8, $F6, $F4, $F3, $F1, $EE
dc.w $EC, $EA, $E7, $E4, $E1, $DE, $DB, $D8
dc.w $D4, $D1, $CD, $C9, $C5, $C1, $BD, $B9
dc.w $B5, $B0, $AB, $A7, $A2, $9D, $98, $93
dc.w $8E, $88, $83, $7E, $78, $73, $6D, $67
dc.w $61, $5C, $56, $50, $4A, $44, $3E, $38
dc.w $31, $2B, $25, $1F, $19, $12, $C, $6
dc.w $0, $FFFFFFF9, $FFFFFFF3, $FFFFFFED, $FFFFFFE6, $FFFFFFE0, $FFFFFFDA, $FFFFFFD4
dc.w $FFFFFFCE, $FFFFFFC7, $FFFFFFC1, $FFFFFFBB, $FFFFFFB5, $FFFFFFAF, $FFFFFFA9, $FFFFFFA3
dc.w $FFFFFF9E, $FFFFFF98, $FFFFFF92, $FFFFFF8C, $FFFFFF87, $FFFFFF81, $FFFFFF7C, $FFFFFF77
dc.w $FFFFFF71, $FFFFFF6C, $FFFFFF67, $FFFFFF62, $FFFFFF5D, $FFFFFF58, $FFFFFF54, $FFFFFF4F
dc.w $FFFFFF4A, $FFFFFF46, $FFFFFF42, $FFFFFF3E, $FFFFFF3A, $FFFFFF36, $FFFFFF32, $FFFFFF2E
dc.w $FFFFFF2B, $FFFFFF27, $FFFFFF24, $FFFFFF21, $FFFFFF1E, $FFFFFF1B, $FFFFFF18, $FFFFFF15
dc.w $FFFFFF13, $FFFFFF11, $FFFFFF0E, $FFFFFF0C, $FFFFFF0B, $FFFFFF09, $FFFFFF07, $FFFFFF06
dc.w $FFFFFF04, $FFFFFF03, $FFFFFF02, $FFFFFF01, $FFFFFF01, $FFFFFF00, $FFFFFF00, $FFFFFF00
dc.w $FFFFFF00, $FFFFFF00, $FFFFFF00, $FFFFFF00, $FFFFFF01, $FFFFFF01, $FFFFFF02, $FFFFFF03
dc.w $FFFFFF04, $FFFFFF06, $FFFFFF07, $FFFFFF09, $FFFFFF0B, $FFFFFF0C, $FFFFFF0E, $FFFFFF11
dc.w $FFFFFF13, $FFFFFF15, $FFFFFF18, $FFFFFF1B, $FFFFFF1E, $FFFFFF21, $FFFFFF24, $FFFFFF27
dc.w $FFFFFF2B, $FFFFFF2E, $FFFFFF32, $FFFFFF36, $FFFFFF3A, $FFFFFF3E, $FFFFFF42, $FFFFFF46
dc.w $FFFFFF4A, $FFFFFF4F, $FFFFFF54, $FFFFFF58, $FFFFFF5D, $FFFFFF62, $FFFFFF67, $FFFFFF6C
dc.w $FFFFFF71, $FFFFFF77, $FFFFFF7C, $FFFFFF81, $FFFFFF87, $FFFFFF8C, $FFFFFF92, $FFFFFF98
dc.w $FFFFFF9E, $FFFFFFA3, $FFFFFFA9, $FFFFFFAF, $FFFFFFB5, $FFFFFFBB, $FFFFFFC1, $FFFFFFC7
dc.w $FFFFFFCE, $FFFFFFD4, $FFFFFFDA, $FFFFFFE0, $FFFFFFE6, $FFFFFFED, $FFFFFFF3, $FFFFFFF9
dc.w $0

Offline simonsunnyboy

  • Moderator
  • *****
  • Beiträge: 1.797
  • Rock'n'Roll is the thing - Jerry Lee is the king!
Re: >ASSEMBLER: Sinus / Cosinus
« Antwort #3 am: So 01.05.2011, 10:57:50 »
Ganz genau - wichtig ist, daß Du im Maschinencode später die Tabelle auch mit Vorzeichen auswertest.

Denn die erzeugte Tabelle hat ja offenbar Werte mit Vorzeichen.

Wichtig bei deiner Tabelle ist auch, die Werte sind KEINE Words, sondern unten stehen LONGs wo die Vorzeichen drinn stehen. (8 Hexzeichen = 32 Bit, 4 = 16Bit)
Paradize - ST Offline Tournament
Stay cool, stay Atari!
1x2600jr, 1x1040STFm, 1x1040STE 4MB+TOS2.06+SatanDisk, 1xF030 14MB+FPU+NetUS-Bee

afalc060

  • Gast
Re: >ASSEMBLER: Sinus / Cosinus
« Antwort #4 am: So 01.05.2011, 11:32:58 »
hm

auslesen würde dann so aussehen

lea sinustab(pc),a0
move.w (a0,d0),d1

vorzeichen sollte doch egal sein, oder?

Offline simonsunnyboy

  • Moderator
  • *****
  • Beiträge: 1.797
  • Rock'n'Roll is the thing - Jerry Lee is the king!
Re: >ASSEMBLER: Sinus / Cosinus
« Antwort #5 am: So 01.05.2011, 12:13:36 »
Wenn deine Tabelle WORDs enthlten soll, dann sollten die Datendefinitionen auch entsprechend sein. Wenn Du .w liest, dann sollte pro dc.w Eintrag auch imemr nur ein 16Bit Wert mit 4 Hexzeichen stehen. In deiner Tabelle stehen aber teilweise 8 Zeichen, also LONGs.
Paradize - ST Offline Tournament
Stay cool, stay Atari!
1x2600jr, 1x1040STFm, 1x1040STE 4MB+TOS2.06+SatanDisk, 1xF030 14MB+FPU+NetUS-Bee

afalc060

  • Gast
Re: >ASSEMBLER: Sinus / Cosinus
« Antwort #6 am: So 01.05.2011, 14:23:50 »
ok

anstatt

wert$="$"+HEX$(INT(SIN(winkel)*256))

gehört dann

wert$="$"+HEX$(CARD(SIN(winkel)*256))

dann ist es .w auch  Wort.

Offline simonsunnyboy

  • Moderator
  • *****
  • Beiträge: 1.797
  • Rock'n'Roll is the thing - Jerry Lee is the king!
Re: >ASSEMBLER: Sinus / Cosinus
« Antwort #7 am: Sa 16.07.2011, 11:29:11 »
Ich habe eine C Implementierung gepostet, die müsste sich eigentlich leicht auf Assembler übertragen lassen.
Paradize - ST Offline Tournament
Stay cool, stay Atari!
1x2600jr, 1x1040STFm, 1x1040STE 4MB+TOS2.06+SatanDisk, 1xF030 14MB+FPU+NetUS-Bee