Software > Coding

>ASSEMBLER: Sinus / Cosinus

(1/2) > >>

afalc060:
Hallo..

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

edit: Und wieviele Werte in der Tabelle machen sinn?

simonsunnyboy:
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.

afalc060:
also sowas

--- Code: ---'
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

--- Ende Code ---

heraus kommt dabei sowas

--- Code: ---***************************************
*    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
--- Ende Code ---

simonsunnyboy:
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)

afalc060:
hm

auslesen würde dann so aussehen

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

vorzeichen sollte doch egal sein, oder?

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln