home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 326.lha / KFFT_v1.1 / fftold.asm < prev    next >
Assembly Source File  |  1989-12-23  |  11KB  |  385 lines

  1. \ FFT.ASM - Fast Fourier Transform assembly support words.
  2. \
  3. \ KFFT V1.1 (C)Copyright 1989, Jerry Kallaus.  All rights reserved. 
  4. \ May be freely redistributed for non-commercial use (FREEWARE).
  5.  
  6. \ These words assume that registors A0,A1,D0,D1,D2,D3 are trashable.
  7.  
  8. INCLUDE? ASSEMBLER JU:ASM
  9.    
  10. ALSO assembler
  11.  
  12. ANEW TASK-fft.asm
  13.  
  14. DECIMAL
  15.  
  16. auto_scale_fft? .IF false .ELSE true .THEN     ( avoid confussion with )
  17.      CONSTANT  not_auto_scale_fft?             ( assembler NOT )
  18.  
  19. \ --------------------  MACROS ------------------------
  20.  
  21. : BPL$+4  $ 6A02  w, ; ( Needed to preclude assembler from filling in )
  22.                        ( branch address in conditionally assembled code )
  23.  
  24. : ASRM  ( dreg nbits -- , gen code to shift right with asl, swap, ext )
  25.    16 - negate #  dup dup
  26.    dn asl
  27.    dn swap
  28.    dn ext
  29. ;
  30.  
  31. : ASRM.FFT ( dreg -- )   14  ASRM ;
  32.  
  33. auto_scale_fft? .IF
  34. : TRACKHI  ( dreg -- , track highest bit of abs set and OR into 7dr )
  35.    dup dup
  36.    dn tst
  37.    bpl$+4
  38.    dn neg
  39.    dn  7dr dn  or
  40. ;  immediate
  41. .ELSE
  42. : TRACKHI drop ;  immediate
  43. .THEN
  44.  
  45.  
  46.  
  47. ( Code bracketed by following two words will be deleted if flag is true.  )
  48. ( Note that the bracketed code may not contain branch instructions as     )
  49. ( the assembler will come back and stuff branch address into code that    )
  50. ( isn't there - inother words, into the code that overlayed deleted code. )
  51.  
  52. VARIABLE save-here
  53. : MARK.CODE    ( -- )   here save-here ! ;  immediate
  54. : ?DELETE.CODE ( flag -- ) IF  save-here @ here - allot  THEN ;  immediate
  55.  
  56. \ ----------------------------------------------------------
  57.  
  58. CODE 2**      ( n -- 2**n )
  59.    1   #   0dr DN   MOVEQ
  60.    tos DN  0dr DN   ASL
  61.    0dr DN  tos DN   MOVE
  62.    BOTH
  63. END-CODE
  64.  
  65. CODE 2CELL+   ( n -- n+8 )
  66.    8 #   TOS DN   ADDQ
  67.    BOTH
  68. END-CODE
  69.  
  70. CODE 2CELL-   ( n -- n-8 )
  71.    8 #   TOS DN   SUBQ
  72.    BOTH
  73. END-CODE
  74.  
  75. CODE 2CELLS   ( n -- 8*n )
  76.    3 #   TOS DN   ASL
  77.    BOTH
  78. END-CODE
  79.  
  80. CODE 4DUP    ( n1 n2 n3 n4 -- n1 n2 n3 n4 n1 n2 n3 n4 )
  81.   DSP AN    0ar  AN      MOVE
  82.   0ar A@+   1dr 2dr 3dr  MOVEM
  83.   TOS DN    DSP -A@      MOVE
  84.   1dr 2dr 3dr   DSP -A@  MOVEM
  85.   BOTH
  86. END-CODE
  87.  
  88. CODE Z@  ( addr -- real imag )
  89.   ORG TOS 0 AN+R+B   DSP -A@   MOVE
  90.   ORG TOS 4 AN+R+B   TOS DN    MOVE
  91.   BOTH
  92. END-CODE
  93.  
  94. CODE Z!  ( real imag addr -- )
  95.   DSP A@+   ORG  TOS 4 AN+R+B  MOVE
  96.   DSP A@+   ORG  TOS 0 AN+R+B  MOVE
  97.   DSP A@+   TOS  DN  MOVE
  98.   BOTH
  99. END-CODE
  100.  
  101. CODE Z+  ( r1 i1 r2 i2 -- r1+r2  i1+i2 )
  102.    DSP A@+  0dr 1dr 2dr  MOVEM
  103.    0dr DN   2dr DN       ADD
  104.    1dr DN   TOS DN       ADD
  105.    2dr DN   DSP -A@      MOVE
  106.    BOTH
  107. END-CODE
  108.  
  109. CODE Z-   ( r1 i1 r2 i2 -- r1-r2  i1-i2 )
  110.    DSP A@+  0dr 1dr 2dr  MOVEM
  111.    0dr DN   2dr DN       SUB
  112.    1dr DN   TOS DN       SUB
  113.             TOS DN       NEG
  114.    2dr DN   DSP -A@      MOVE
  115.    BOTH
  116. END-CODE
  117.  
  118. CODE Z*  ( a b c d -- ac-bd ad+bc )
  119.              ( complex multiply, fixed point scaled 2**14 )
  120.   DSP A@+  1dr 2dr 3dr  MOVEM   \              a b c d
  121.   3dr DN   0dr DN   MOVE        \ a            3 2 1 7
  122.   1dr DN   0dr DN   MULS        \ ac
  123.   2dr DN   1dr DN   MULS        \ bc
  124.   TOS DN   2dr DN   MULS        \ bd
  125.   2dr DN   0dr DN   SUB         \ ac-bd
  126.            0dr      ASRM.FFT
  127.   0dr DN   DSP -A@  MOVE
  128.   3dr DN   TOS DN   MULS         \ ad
  129.   1dr DN   TOS DN   ADD          \ ad+bc
  130.            TOS      ASRM.FFT
  131.   both
  132. END-CODE
  133.  
  134. CODE ZNEGATE  ( a b -- -a -b )
  135.            TOS DN   NEG
  136.    DSP A@  0dr DN   MOVE
  137.            0dr DN   NEG
  138.    0dr DN  DSP A@   MOVE
  139.    BOTH
  140. END-CODE
  141.  
  142. CODE Z/2
  143.    1 #     TOS DN  ASR
  144.    DSP A@  0dr DN  MOVE
  145.    1 #     0dr DN  ASR
  146.    0dr DN  DSP A@  MOVE
  147.    BOTH
  148. END-CODE
  149.  
  150. CODE Z/2**N   ( a b n -- a/2**n b/2**n , arith rshift a and b by n )
  151.   DSP A@+   0dr 1dr   MOVEM
  152.   TOS DN    0dr DN    ASR
  153.   TOS DN    1dr DN    ASR
  154.   0dr DN    TOS DN    MOVE
  155.   1dr DN    DSP -A@   MOVE
  156.   BOTH
  157. END-CODE
  158.  
  159. CODE NSBITS  ( value --  number of significant abs bits plus 1 sign bit )
  160.    TOS DN            TST
  161.             9  BYTE  BEQ
  162.             1  BYTE  BGT
  163.    TOS DN            NOT
  164.             1  BYTE  BGT
  165.    1   #    TOS DN   MOVEQ
  166.             9  BYTE  BRA
  167. 1  BR:
  168.    33  #    0dr DN   MOVEQ
  169. 2  BR:
  170.    1   #    TOS DN   ASL
  171.    2   0dr DN  word  DBLT
  172.    0dr DN   TOS DN   MOVE
  173. 9  BR:
  174.    BOTH
  175. END-CODE
  176.  
  177. CODE OR.ABS.ARRAY     ( addr ncells -- or'd-magnitude-bits-of-array )
  178.    DSP A@+  0ar AN  MOVE
  179.    ORG AN   0ar AN  ADDA
  180.    0   #    0dr DN  MOVEQ
  181.    TOS DN   2dr DN  MOVE       ( 64k counter )
  182.             2dr DN  SWAP
  183.             3 BYTE  BRA
  184. 1  BR:
  185.    0ar A@+  0dr DN  MOVE
  186.             2 BYTE  BPL
  187.             0dr DN  NOT
  188. 2  BR:
  189.    0dr DN   1dr DN  OR
  190. 3  BR:
  191.    1  TOS DN  WORD  DBRA
  192.    1  2dr DN  WORD  DBRA
  193.    1dr DN   TOS DN  MOVE
  194.    BOTH
  195. END-CODE
  196.  
  197.  
  198.                       ( Arithmetic shift array of n-cells by n-bits. )
  199.                       ( Left for n-bits positive, right for n-bits neg.)
  200. CODE ASHIFT.ARRAY     ( array-addr n-cells n-bits -- )
  201.    4dr DN    RP -A@   MOVE
  202.    5dr DN    RP -A@   MOVE
  203.    DSP A@+   4dr DN   MOVE      ( n )
  204.                    8  BLE
  205.    4dr DN    1ar AN   MOVE
  206.    2   #     4dr DN   LSR
  207.    DSP A@+   0dr DN   MOVE
  208.    ORG 0dr 0  AN+R+B  0ar AN   LEA   ( addr )
  209.    16  #     5dr DN   MOVEQ
  210.    TOS DN             TST
  211.                    9  BEQ
  212.                    4  BGT
  213.    TOS DN             NEG
  214.    1   #     4dr DN   SUBQ
  215.              2 BYTE   BMI
  216. 1  BR:
  217.    0ar A@+   0dr 1dr 2dr 3dr  MOVEM
  218.    7dr DN    0dr DN   ASR
  219.    7dr DN    1dr DN   ASR
  220.    7dr DN    2dr DN   ASR
  221.    7dr DN    3dr DN   ASR
  222.    0dr 1dr 2dr 3dr   0ar -A@  MOVEM
  223.    5dr DN    0ar AN   ADDA
  224.    1  4dr DN   WORD   DBRA
  225. 2  BR:
  226.    1ar AN    4dr DN   MOVE
  227.    3 #       0dr DN   MOVEQ
  228.    0dr DN    4dr DN   AND
  229.             9  BYTE   BEQ
  230.    1 #       4dr DN   SUBQ
  231. 3  BR:
  232.    0ar A@    0dr DN   MOVE
  233.    7dr DN    0dr DN   ASR
  234.    0dr DN    0ar A@+  MOVE
  235.    3  4dr DN   WORD   DBRA
  236.              9 BYTE   BRA
  237. 4  BR:
  238.    1   #     4dr DN   SUBQ      ( start of left shift code )
  239.              6 BYTE   BMI
  240. 5  BR:
  241.    0ar A@+   0dr 1dr 2dr 3dr  MOVEM
  242.    7dr DN    0dr DN   ASL
  243.    7dr DN    1dr DN   ASL
  244.    7dr DN    2dr DN   ASL
  245.    7dr DN    3dr DN   ASL
  246.    0dr 1dr 2dr 3dr   0ar -A@  MOVEM
  247.    5dr DN    0ar AN   ADDA
  248.    5  4dr DN   WORD   DBRA
  249. 6  BR:
  250.    1ar AN    4dr DN   MOVE
  251.    3   #     0dr DN   MOVEQ
  252.    0dr DN    4dr DN   AND
  253.              9 BYTE   BEQ
  254.    1   #     4dr DN   SUBQ
  255. 7  BR:
  256.    0ar A@    0dr DN   MOVE
  257.    7dr DN    0dr DN   ASL
  258.    0dr DN    0ar A@+  MOVE
  259.    7  4dr DN   WORD   DBRA
  260.              9 BYTE   BRA
  261. 8  BR:
  262.    4 #  DSP AN WORD   ADDA   ( pop data-addr off of stack )
  263. 9  BR:
  264.    RP  A@+   5dr DN   MOVE
  265.    RP  A@+   4dr DN   MOVE
  266.    DSP A@+   TOS DN   MOVE
  267. END-CODE
  268.  
  269. CODE STATS.ARRAY  ( array-addr n -- max min sumlo 0 )
  270.    DSP A@+  0ar AN   MOVE     ( 0 added for compatability with new )
  271.    ORG AN   0ar AN   ADDA     ( version with double precision sum  )
  272.    TOS DN   0dr DN   MOVE
  273.    0   #    TOS DN   MOVEQ     ( init sum to 0 )
  274.    $ 80000000 # 2dr DN MOVE    ( init max to -inf )
  275.    $ 3fffffff # 3dr DN MOVE    ( init min to +inf )
  276.    1   #    0dr DN   SUBQ
  277.    9   BLT
  278. 1 BR:
  279.    0ar A@+  1dr DN  MOVE
  280.    1dr DN   TOS DN  ADD     ( sum )
  281.    1dr DN   2dr DN  CMP
  282.    2 BYTE   BGE
  283.    1dr DN   2dr DN  MOVE    ( max )
  284. 2 BR:
  285.    1dr DN   3dr DN  CMP
  286.    3 BYTE   BLE
  287.    1dr DN   3dr DN  MOVE    ( min )
  288. 3 BR:
  289.    1  0dr DN  WORD  DBRA
  290. 9 BR:
  291.    2dr DN   DSP -A@  MOVE
  292.    3dr DN   DSP -A@  MOVE
  293.    tos DN   DSP -A@  MOVE
  294.    0   #    TOS  DN  MOVEQ
  295. END-CODE
  296.  
  297. CODE QUICK.REVERSAL  ( array-data  reversal-map-of-swap-pairs )
  298.   3ar AN    RP -A@   MOVE              ( save regs on return stack )
  299.   5ar AN    RP -A@   MOVE
  300.   ORG TOS 0 AN+R+B   0ar  AN  LEA      ( r )
  301.   DSP A@+   1ar AN   MOVE
  302.   ORG AN    1ar AN   ADDA              ( a )
  303.   0ar A@+   TOS DN   MOVE              ( i )
  304. MARK 3
  305.   0ar A@+   0dr DN   MOVE              ( next j )
  306.   1ar TOS 0 AN+R+B   3ar AN   LEA      ( abs i )
  307.   1ar 0dr 0 AN+R+B   5ar AN   LEA      ( abs j )
  308.   3ar A@   1dr DN    MOVE              ( swap cmplx a[i] with a[j] )
  309.   5ar A@   2dr DN    MOVE
  310.   1dr DN   5ar A@+   MOVE
  311.   2dr DN   3ar A@+   MOVE
  312.   3ar A@   1dr DN    MOVE
  313.   5ar A@   2dr DN    MOVE
  314.   1dr DN   5ar A@    MOVE
  315.   2dr DN   3ar A@    MOVE
  316.   0ar A@+  TOS DN    MOVE         ( next i )
  317.   3   BNE                         ( zero terminator in swap map )
  318.   DSP A@+  TOS DN    MOVE         ( cache TOS )
  319.   RP  A@+  5ar AN    MOVE         ( restore regs )
  320.   rp  A@+  3ar AN    MOVE
  321.   BOTH
  322. END-CODE
  323.  
  324. \  inner-loop register usage
  325. \  i   a   n           ss  le le1                ui      ur
  326. \  0dr 1   2   3   4   5   6   7     0ar 1   2   3   4   5   6   7
  327. \  i  air aii ur-i ur+i ss ur le1    ai aip  an  ur      ui
  328. \                             high               le
  329.  
  330. CODE INNER.LOOP   ( u le ss n a i le1 -- )
  331.    4dr 5dr 6dr 2ar 3ar 5ar   RP -A@    MOVEM   ( save regs on return stack )
  332.    DSP A@+   0dr 1dr 2dr 5dr 6dr 3ar 5ar   MOVEM  
  333.    ORG 1dr 0 AN+R+B   0ar  AN  LEA      ( a )
  334.    0ar 2dr 0 AN+R+B   2ar  AN  LEA      ( an )
  335.    0dr DN  0ar AN   ADDA                ( ai )
  336.    0ar 7dr 0 AN+R+B   1ar  AN  LEA      ( aip )
  337.    0 #     7dr DN   MOVEQ               ( hi - abs all output or'd in 7dr )
  338.    5ar AN  3dr DN   MOVE                ( ur )
  339.    5ar AN  4dr DN   MOVE
  340.    3ar AN  3dr DN   SUB                 ( ur-ui )
  341.    3ar AN  4dr DN   ADD                 ( ur+ui )
  342.    4 #     6dr DN   SUBQ
  343.    6dr DN  3ar AN   MOVE                ( le )
  344. 1  BR:
  345.    1ar A@     1dr DN   MOVE             ( a[ip] )
  346.    1ar 4 An+W 2dr DN   MOVE
  347.    5dr DN     1dr DN   ASR              ( scale down )
  348.    5dr DN     2dr DN   ASR
  349.    1dr DN     0dr DN   MOVE
  350.    2dr DN     0dr DN   SUB              ( c-d )
  351.    5ar AN     6dr DN   MOVE             ( ur )
  352.    6dr DN     0dr DN   MULS             ( z )
  353.    3dr DN     2dr DN   MULS             ( fd )
  354.    0dr DN     2dr DN   ADD              ( fd+z )
  355.    4dr DN     1dr DN   MULS             ( gc )
  356.    0dr DN     1dr DN   SUB              ( gc-z )
  357.               1dr      ASRM.FFT         ( scale down cmplx * result )
  358.               2dr      ASRM.FFT
  359.    0ar A@     0dr DN   MOVE             ( a[i] real )
  360.    5dr DN     0dr DN   ASR              ( scale down )
  361.    0dr DN     6dr DN   MOVE
  362.    2dr DN     6dr DN   SUB              ( a[i]-t )
  363.    6dr DN     1ar A@+  MOVE             ( a[ip] )
  364.               6dr      TRACKHI
  365.    2dr DN     0dr DN   ADD              ( a[i]+t )
  366.    0dr DN     0ar A@+  MOVE             ( a[i] )
  367.               0dr      TRACKHI
  368.    0ar A@     0dr DN   MOVE             ( a[i] imag )
  369.    5dr DN     0dr DN   ASR              ( scale down )
  370.    0dr DN     6dr DN   MOVE
  371.    1dr DN     6dr DN   SUB              ( a[i]-t )
  372.    6dr DN     1ar A@   MOVE             ( a[ip] )
  373.               6dr      TRACKHI
  374.    1dr DN     0dr DN   ADD              ( a[i]+t )
  375.    0dr DN     0ar A@   MOVE             ( a[i] )
  376.               0dr      TRACKHI
  377.    3ar AN     1ar AN   ADDA
  378.    3ar AN     0ar AN   ADDA
  379.    2ar AN     0ar AN   CMP
  380.         1  BLT
  381.    RP A@+   4dr 5dr 6dr 2ar 3ar 5ar     MOVEM
  382. END-CODE
  383.  
  384. PREVIOUS
  385.