SIN_1_4  EQU   $5A82
COS_1_4  EQU   SIN_1_4

SIN_1_8  EQU   $30FC
COS_1_8  EQU   $7642
SIN_3_8  EQU   COS_1_8
COS_3_8  EQU   SIN_1_8

SIN_1_16 EQU   $18F9
COS_1_16 EQU   $7D8A
SIN_7_16 EQU   COS_1_16
COS_7_16 EQU   SIN_1_16

SIN_3_16 EQU   $471D
COS_3_16 EQU   $6A6E
SIN_5_16 EQU   COS_3_16
COS_5_16 EQU   SIN_3_16

OSIN_1_4 EQU   $16A1
OCOS_1_4 EQU   OSIN_1_4

OSIN_1_8 EQU   $0C3F
OCOS_1_8 EQU   $1D90
OSIN_3_8 EQU   OCOS_1_8
OCOS_3_8 EQU   OSIN_1_8

OSIN_1_16 EQU  $063E
OCOS_1_16 EQU  $1F63
OSIN_7_16 EQU  OCOS_1_16
OCOS_7_16 EQU  OSIN_1_16

OSIN_3_16 EQU  $11C7
OCOS_3_16 EQU  $1A9B
OSIN_5_16 EQU  OCOS_3_16
OCOS_5_16 EQU  OSIN_3_16

UNFIXH   MACRO
         add.l    d6,\1
         clr.w    \1
         swap     \1
         ENDM

   section text,code

   xdef @j_rev_dct

@j_rev_dct:
   movem.l  d0-d7/a0-a6,-(sp)

   move.l   a0,a6

   move.l   #7,d4
   lea.l    data(pc),a5
   
loop1:

   move.w   4(a0),d5    ; in2
   move.w   12(a0),d6   ; in6
   move.w   d5,d1       ; in2
   move.w   d6,d2       ; in6

   move.w   #SIN_1_8,d0
   muls.w   d0,d5    ; in2*SIN_1_8
   muls.w   d0,d6    ; in6*SIN_1_8
   
   move.w   #COS_1_8,d0
   muls.w   d0,d1    ; in2*COS_1_8
   muls.w   d0,d2    ; in6*COS_1_8
   
   sub.l    d2,d5    ; tmp12 = in2*SIN_1_8 - in6*COS_1_8
   add.l    d1,d6    ; tmp13 = in6*SIN_1_8 + in2*COS_1_8
   
   ; RUSED: d5 d6

   move.w   0(a0),d1 ; in0
   move.w   8(a0),d2 ; in4
   move.w   d1,d3    ; in0

   add.w    d2,d1    ; in0 + in4
   sub.w    d2,d3    ; in0 - in4

   move.w   #COS_1_4,d0
   muls.w   d0,d1    ; tmp10 = (in0+in4)*COS_1_4
   muls.w   d0,d3    ; tmp11 = (in0-in4)*COS_1_4
   
   ; RUSED: d5 d6 d1 d3 d0

   move.l   d1,d2    ; tmp10
   move.l   d3,d7    ; tmp11

   add.l    d6,d1    ; tmp20 = tmp10 + tmp13
   add.l    d5,d3    ; tmp21 = tmp11 + tmp12
   sub.l    d5,d7    ; tmp22 = tmp11 - tmp12
   sub.l    d6,d2    ; tmp23 = tmp10 - tmp13

   move.l   d1,a1    ; tmp20
   move.l   d3,a2    ; tmp21
   move.l   d7,a3    ; tmp22
   move.l   d2,a4    ; tmp23

   ; RUSED: d0
   
   move.w   6(a0),d1 ; in3
   move.w   10(a0),d5 ; in5
   move.w   d1,d3    ; in3

   add.w    d5,d1    ; in3 + in5
   sub.w    d5,d3    ; in3 - in5 
   muls.w   d0,d1    ; (in3+in5)*COS_1_4
   muls.w   d0,d3    ; (in3-in5)*COS_1_4
   
   ; RUSED: d1 d3
   
   move.l   #$00001000,d0
   move.l   #13,d2
   add.l    d0,d1
   asr.l    d2,d1   ; tmp30 = UNFIXO((in3+in5)*COS_1_4)
   add.l    d0,d3
   asr.l    d2,d3   ; tmp31 = UNFIXO((in3-in5)*COS_1_4)

   ; RUSED: d1 d3

   move.w   2(a0),d0 ; in1
   ext.l    d0
   asl.l    #2,d0    ; OVERSHIFT(in1) !!! DANGER !!!
   move.l   d0,d5
   
   add.l    d1,d0    ; tmp40 = OVERSHIFT(in1) + tmp30
   sub.l    d1,d5    ; tmp42 = OVERSHIFT(in1) - tmp30
   
   ; RUSED: d3 d0 d5
   
   move.w   14(a0),d1 ; in7
   ext.l    d1
   asl.l    #2,d1    ; OVERSHIFT(in7) !!! DANGER !!!
   move.l   d1,d2
   
   add.l    d3,d1    ; tmp41 = OVERSHIFT(in7) + tmp31
   sub.l    d3,d2    ; tmp43 = OVERSHIFT(in7) - tmp31
   
   ; RUSED:
   ; d0 = tmp40
   ; d1 = tmp41
   ; d2 = tmp43
   ; d5 = tmp42

   move.w   d0,d6    ; tmp40
   move.w   d1,d7    ; tmp41

   move.w   #OCOS_1_16,d3
   muls.w   d3,d6    ; tmp40 * OCOS_1_16
   muls.w   d3,d1    ; tmp41 * OCOS_5_16

   move.w   #OSIN_1_16,d3
   muls.w   d3,d7    ; tmp41 * OSIN_1_16
   muls.w   d3,d0    ; tmp40 * OSIN_5_16

   add.l    d6,d7    ; tmp50 = tmp40 * OCOS_1_16 + tmp41 * OSIN_1_16
   sub.l    d1,d0    ; tmp51 = tmp40 * OSIN_1_16 - tmp41 * OCOS_1_16
   
   ; RUSED: d2 d5 d7 d0

   move.w   d2,d1    ; tmp43
   move.w   d5,d6    ; tmp42

   move.w   #OCOS_5_16,d3
   muls.w   d3,d6    ; tmp42 * OCOS_5_16
   muls.w   d3,d2    ; tmp43 * OCOS_5_16

   move.w   #OSIN_5_16,d3
   muls.w   d3,d1    ; tmp43 * OSIN_5_16
   muls.w   d3,d5    ; tmp42 * OSIN_5_16

   add.l    d6,d1    ; tmp52 = tmp42 * OCOS_5_16 + tmp43 * OSIN_5_16
   sub.l    d2,d5    ; tmp53 = tmp42 * OSIN_5_16 - tmp43 * OCOS_5_16

   ; RUSED:
   ; d7 = tmp50
   ; d0 = tmp51
   ; d1 = tmp52
   ; d5 = tmp53
   ; a1 = tmp20
   ; a2 = tmp21
   ; a3 = tmp22
   ; a4 = tmp23

   move.l   #$00008000,d6
   
   move.l   a1,d2    ; tmp20
   add.l    d7,d2    ; tmp20 + tmp50
   UNFIXH   d2
   move.w   d2,(a5)
   
   move.l   a2,d2    ; tmp21
   add.l    d5,d2    ; tmp21 + tmp53
   UNFIXH   d2
   move.w   d2,16(a5)

   move.l   a3,d2    ; tmp22
   add.l    d1,d2    ; tmp22 + tmp52
   UNFIXH   d2
   move.w   d2,32(a5)
   
   move.l   a4,d2    ; tmp23
   add.l    d0,d2    ; tmp23 + tmp51
   UNFIXH   d2
   move.w   d2,48(a5)

   move.l   a4,d2    ; tmp23
   sub.l    d0,d2    ; tmp23 - tmp51
   UNFIXH   d2
   move.w   d2,64(a5)
   
   move.l   a3,d2    ; tmp22
   sub.l    d1,d2    ; tmp22 - tmp52
   UNFIXH   d2
   move.w   d2,80(a5)
   
   move.l   a2,d2    ; tmp21
   sub.l    d5,d2    ; tmp21 - tmp53
   UNFIXH   d2
   move.w   d2,96(a5)
   
   move.l   a1,d2    ; tmp20
   sub.l    d7,d2    ; tmp20 - tmp50
   UNFIXH   d2
   move.w   d2,112(a5)

   adda.l   #2,a5
   adda.l   #16,a0

   dbf      d4,loop1

   movea.l  a6,a5

   move.l   #7,d4
   lea.l    data(pc),a0
   
loop2:

   move.w   4(a0),d5    ; in2
   move.w   12(a0),d6   ; in6
   move.w   d5,d1       ; in2
   move.w   d6,d2       ; in6

   move.w   #SIN_1_8,d0
   muls.w   d0,d5    ; in2*SIN_1_8
   muls.w   d0,d6    ; in6*SIN_1_8
   
   move.w   #COS_1_8,d0
   muls.w   d0,d1    ; in2*COS_1_8
   muls.w   d0,d2    ; in6*COS_1_8
   
   sub.l    d2,d5    ; tmp12 = in2*SIN_1_8 - in6*COS_1_8
   add.l    d1,d6    ; tmp13 = in6*SIN_1_8 + in2*COS_1_8
   
   ; RUSED: d5 d6

   move.w   0(a0),d1 ; in0
   move.w   8(a0),d2 ; in4
   move.w   d1,d3    ; in0

   add.w    d2,d1    ; in0 + in4
   sub.w    d2,d3    ; in0 - in4

   move.w   #COS_1_4,d0
   muls.w   d0,d1    ; tmp10 = (in0+in4)*COS_1_4
   muls.w   d0,d3    ; tmp11 = (in0-in4)*COS_1_4
   
   ; RUSED: d5 d6 d1 d3 d0

   move.l   d1,d2    ; tmp10
   move.l   d3,d7    ; tmp11

   add.l    d6,d1    ; tmp20 = tmp10 + tmp13
   add.l    d5,d3    ; tmp21 = tmp11 + tmp12
   sub.l    d5,d7    ; tmp22 = tmp11 - tmp12
   sub.l    d6,d2    ; tmp23 = tmp10 - tmp13

   move.l   d1,a1    ; tmp20
   move.l   d3,a2    ; tmp21
   move.l   d7,a3    ; tmp22
   move.l   d2,a4    ; tmp23

   ; RUSED: d0
   
   move.w   6(a0),d1 ; in3
   move.w   10(a0),d5 ; in5
   move.w   d1,d3    ; in3

   add.w    d5,d1    ; in3 + in5
   sub.w    d5,d3    ; in3 - in5 
   muls.w   d0,d1    ; (in3+in5)*COS_1_4
   muls.w   d0,d3    ; (in3-in5)*COS_1_4
   
   ; RUSED: d1 d3
   
   move.l   #$00001000,d0
   move.l   #13,d2
   add.l    d0,d1
   asr.l    d2,d1   ; tmp30 = UNFIXO((in3+in5)*COS_1_4)
   add.l    d0,d3
   asr.l    d2,d3   ; tmp31 = UNFIXO((in3-in5)*COS_1_4)

   ; RUSED: d1 d3

   move.w   2(a0),d0 ; in1
   ext.l    d0
   asl.l    #2,d0    ; OVERSHIFT(in1) !!! DANGER !!!
   move.l   d0,d5
   
   add.l    d1,d0    ; tmp40 = OVERSHIFT(in1) + tmp30
   sub.l    d1,d5    ; tmp42 = OVERSHIFT(in1) - tmp30
   
   ; RUSED: d3 d0 d5
   
   move.w   14(a0),d1 ; in7
   ext.l    d1
   asl.l    #2,d1    ; OVERSHIFT(in7) !!! DANGER !!!
   move.l   d1,d2
   
   add.l    d3,d1    ; tmp41 = OVERSHIFT(in7) + tmp31
   sub.l    d3,d2    ; tmp43 = OVERSHIFT(in7) - tmp31
   
   ; RUSED:
   ; d0 = tmp40
   ; d1 = tmp41
   ; d2 = tmp43
   ; d5 = tmp42

   move.w   d0,d6    ; tmp40
   move.w   d1,d7    ; tmp41

   move.w   #OCOS_1_16,d3
   muls.w   d3,d6    ; tmp40 * OCOS_1_16
   muls.w   d3,d1    ; tmp41 * OCOS_5_16

   move.w   #OSIN_1_16,d3
   muls.w   d3,d7    ; tmp41 * OSIN_1_16
   muls.w   d3,d0    ; tmp40 * OSIN_5_16

   add.l    d6,d7    ; tmp50 = tmp40 * OCOS_1_16 + tmp41 * OSIN_1_16
   sub.l    d1,d0    ; tmp51 = tmp40 * OSIN_1_16 - tmp41 * OCOS_1_16
   
   ; RUSED: d2 d5 d7 d0

   move.w   d2,d1    ; tmp43
   move.w   d5,d6    ; tmp42

   move.w   #OCOS_5_16,d3
   muls.w   d3,d6    ; tmp42 * OCOS_5_16
   muls.w   d3,d2    ; tmp43 * OCOS_5_16

   move.w   #OSIN_5_16,d3
   muls.w   d3,d1    ; tmp43 * OSIN_5_16
   muls.w   d3,d5    ; tmp42 * OSIN_5_16

   add.l    d6,d1    ; tmp52 = tmp42 * OCOS_5_16 + tmp43 * OSIN_5_16
   sub.l    d2,d5    ; tmp53 = tmp42 * OSIN_5_16 - tmp43 * OCOS_5_16

   ; RUSED:
   ; d7 = tmp50
   ; d0 = tmp51
   ; d1 = tmp52
   ; d5 = tmp53
   ; a1 = tmp20
   ; a2 = tmp21
   ; a3 = tmp22
   ; a4 = tmp23

   move.l   #$00008000,d6
   
   move.l   a1,d2    ; tmp20
   add.l    d7,d2    ; tmp20 + tmp50
   UNFIXH   d2
   move.w   d2,(a5)
   
   move.l   a2,d2    ; tmp21
   add.l    d5,d2    ; tmp21 + tmp53
   UNFIXH   d2
   move.w   d2,16(a5)

   move.l   a3,d2    ; tmp22
   add.l    d1,d2    ; tmp22 + tmp52
   UNFIXH   d2
   move.w   d2,32(a5)
   
   move.l   a4,d2    ; tmp23
   add.l    d0,d2    ; tmp23 + tmp51
   UNFIXH   d2
   move.w   d2,48(a5)

   move.l   a4,d2    ; tmp23
   sub.l    d0,d2    ; tmp23 - tmp51
   UNFIXH   d2
   move.w   d2,64(a5)
   
   move.l   a3,d2    ; tmp22
   sub.l    d1,d2    ; tmp22 - tmp52
   UNFIXH   d2
   move.w   d2,80(a5)
   
   move.l   a2,d2    ; tmp21
   sub.l    d5,d2    ; tmp21 - tmp53
   UNFIXH   d2
   move.w   d2,96(a5)
   
   move.l   a1,d2    ; tmp20
   sub.l    d7,d2    ; tmp20 - tmp50
   UNFIXH   d2
   move.w   d2,112(a5)

   adda.l   #2,a5
   adda.l   #16,a0


   dbf      d4,loop2

   movem.l  (sp)+,d0-d7/a0-a6
   rts

data: ds.w 64

   END
