Rearange menu of mpegplayer. Add new menu with "settings" and "quit", and remove...
[kugel-rb.git] / apps / plugins / mpegplayer / motion_comp_coldfire_s.S
blob55d87cb708a6e68555eb3ee4de0ea8c74d8efb22
1 /***************************************************************************
2  *             __________               __   ___.
3  *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
4  *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
5  *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
6  *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
7  *                     \/            \/     \/    \/            \/
8  * $Id$
9  *
10  * Copyright (C) 2007 Jens Arnold
11  *
12  * This program is free software; you can redistribute it and/or
13  * modify it under the terms of the GNU General Public License
14  * as published by the Free Software Foundation; either version 2
15  * of the License, or (at your option) any later version.
16  *
17  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18  * KIND, either express or implied.
19  *
20  ****************************************************************************/
22 .macro LEFT8_PW   dW1, dW2      | needs %d0 == 24, clobbers %d2
23     lsl.l   #8, \dW1            | changes dW1, keeps dW2
24     move.l  \dW2, %d2
25     lsr.l   %d0, %d2
26     or.l    %d2, \dW1
27 .endm
29 .macro LEFT24_PW   dW1, dW2     | needs %d0 == 24, clobbers %d2
30     lsl.l   %d0, \dW1           | changes dW1, keeps dW2
31     move.l  \dW2, %d2
32     lsr.l   #8, %d2
33     or.l    %d2, \dW1
34 .endm
36 /*****************************************************************************/
38     .align  2
39     .global MC_put_o_8
40     .type   MC_put_o_8, @function
41     
42 MC_put_o_8:
43     movem.l (4,%sp), %a0-%a1    | dest, source
44     move.l  %a1, %d0
45     and.l   #3, %d0
46     sub.l   %d0, %a1            | align source
47     jmp.l   (2, %pc, %d0.l*4)
48     bra.w   .po8_0
49     bra.w   .po8_1
50     bra.w   .po8_2
51     | last table entry coincides with target
53 .po8_3:
54     lea.l   (-5*4,%sp), %sp
55     movem.l %d2-%d5/%a2, (%sp)  | save some registers
56     move.l  (5*4+12,%sp), %a2   | stride
57     move.l  (5*4+16,%sp), %d1   | height
58     moveq.l #24, %d0            | shift amount
60     movem.l (%a1), %d3-%d5
61     add.l   %a2, %a1
62     LEFT24_PW %d3, %d4
63     lsl.l   %d0, %d4
64     lsr.l   #8, %d5
65     or.l    %d5, %d4
66     movem.l %d3-%d4, (%a0)
67     add.l   %a2, %a0
68     subq.l  #1, %d1
69     bne.s   1b
70     movem.l (%sp), %d2-%d5/%a2
71     lea.l   (5*4,%sp), %sp
72     rts
74 .po8_2:
75     lea.l   (-3*4,%sp), %sp
76     movem.l %d2-%d4, (%sp)          | save some registers
77     movem.l (3*4+12,%sp), %d0-%d1   | stride, height
79     movem.l (%a1), %d2-%d4
80     add.l   %d0, %a1
81     swap    %d2
82     swap    %d3
83     move.w  %d3, %d2
84     swap    %d4
85     move.w  %d4, %d3
86     movem.l %d2-%d3, (%a0)
87     add.l   %d0, %a0
88     subq.l  #1, %d1
89     bne.s   1b
90     movem.l (%sp), %d2-%d4
91     lea.l   (3*4,%sp), %sp
92     rts
94 .po8_1:
95     lea.l   (-5*4,%sp), %sp
96     movem.l %d2-%d5/%a2, (%sp)  | save some registers
97     move.l  (5*4+12,%sp), %a2   | stride
98     move.l  (5*4+16,%sp), %d1   | height
99     moveq.l #24, %d0            | shift amount
101     movem.l (%a1), %d3-%d5
102     add.l   %a2, %a1
103     LEFT8_PW %d3, %d4
104     lsl.l   #8, %d4
105     lsr.l   %d0, %d5
106     or.l    %d5, %d4
107     movem.l %d3-%d4, (%a0)
108     add.l   %a2, %a0
109     subq.l  #1, %d1
110     bne.s   1b
111     movem.l (%sp), %d2-%d5/%a2
112     lea.l   (5*4,%sp), %sp
113     rts
115 .po8_0:
116     movem.l (12,%sp), %d0-%d1   | stride, height
117     subq.l  #4, %d0             | adjust for increment within the loop
119     move.l  (%a1)+, (%a0)+
120     move.l  (%a1), (%a0)
121     add.l   %d0, %a0
122     add.l   %d0, %a1
123     subq.l  #1, %d1
124     bne.s   1b
125     rts
126     
127 /*****************************************************************************/
129     .align  2
130     .global MC_put_o_16
131     .type   MC_put_o_16, @function
133 MC_put_o_16:
134     lea.l   (-7*4,%sp), %sp
135     movem.l %d2-%d7/%a2, (%sp)  | save some registers
136     movem.l (7*4+4,%sp), %a0-%a2| dest, source, stride
137     move.l  (7*4+16,%sp), %d1   | height
138     move.l  %a1, %d0
139     and.l   #3, %d0
140     sub.l   %d0, %a1
141     jmp.l   (2, %pc, %d0.l*4)
142     bra.w   .po16_0
143     bra.w   .po16_1
144     bra.w   .po16_2
145     | last table entry coincides with target
147 .po16_3:
148     moveq.l #24, %d0            | shift amount
150     movem.l (%a1), %d3-%d7
151     add.l   %a2, %a1
152     LEFT24_PW %d3, %d4
153     LEFT24_PW %d4, %d5
154     LEFT24_PW %d5, %d6
155     lsl.l   %d0, %d6
156     lsr.l   #8, %d7
157     or.l    %d7, %d6
158     movem.l %d3-%d6, (%a0)
159     add.l   %a2, %a0
160     subq.l  #1, %d1
161     bne.s   1b
162     movem.l (%sp), %d2-%d7/%a2
163     lea.l   (7*4,%sp), %sp
164     rts
166 .po16_2:
168     movem.l (%a1), %d3-%d7
169     add.l   %a2, %a1
170     swap    %d3
171     swap    %d4
172     move.w  %d4, %d3
173     swap    %d5
174     move.w  %d5, %d4
175     swap    %d6
176     move.w  %d6, %d5
177     swap    %d7
178     move.w  %d7, %d6
179     movem.l %d3-%d6, (%a0)
180     add.l   %a2, %a0
181     subq.l  #1, %d1
182     bne.s   1b
183     movem.l (%sp), %d2-%d7/%a2
184     lea.l   (7*4,%sp), %sp
185     rts
187 .po16_1:
188     moveq.l #24, %d0            | shift amount
190     movem.l (%a1), %d3-%d7
191     add.l   %a2, %a1
192     LEFT8_PW %d3, %d4
193     LEFT8_PW %d4, %d5
194     LEFT8_PW %d5, %d6
195     lsl.l   #8, %d6
196     lsr.l   %d0, %d7
197     or.l    %d7, %d6
198     movem.l %d3-%d6, (%a0)
199     add.l   %a2, %a0
200     subq.l  #1, %d1
201     bne.s   1b
202     movem.l (%sp), %d2-%d7/%a2
203     lea.l   (7*4,%sp), %sp
204     rts
206 .po16_0:
208     movem.l (%a1), %d3-%d6
209     add.l   %a2, %a1
210     movem.l %d3-%d6, (%a0)
211     add.l   %a2, %a0
212     subq.l  #1, %d1
213     bne.s   1b
214     movem.l (%sp), %d2-%d7/%a2
215     lea.l   (7*4,%sp), %sp
216     rts
217     
218 /*****************************************************************************/
220 .macro  AVG_PW  dW1, dW2        | needs %d0 == 24, clobbers %d1, %d2,
221     move.l  \dW1, %d1           | changes dW1, keeps dW2
222     lsl.l   #8, \dW1
223     move.l  \dW2, %d2
224     lsr.l   %d0, %d2
225     or.l    %d2, \dW1
226     move.l  %d1, %d2
227     eor.l   \dW1, %d1
228     and.l   %d2, \dW1
229     move.l  #0xfefefefe, %d2
230     and.l   %d1, %d2
231     eor.l   %d2, %d1
232     lsr.l   #1, %d2
233     add.l   %d2, \dW1
234     add.l   %d1, \dW1
235 .endm
237 /*****************************************************************************/
239     .align  2
240     .global MC_put_x_8
241     .type   MC_put_x_8, @function
242     
243 MC_put_x_8:
244     lea.l   (-6*4,%sp), %sp
245     movem.l %d2-%d6/%a2, (%sp)  | save some registers
246     movem.l (6*4+4,%sp), %a0-%a2| dest, source, stride
247     move.l  (6*4+16,%sp), %d6   | height
248     move.l  %a1, %d0
249     and.l   #3, %d0
250     sub.l   %d0, %a1
251     jmp.l   (2, %pc, %d0.l*4)
252     bra.w   .px8_0
253     bra.w   .px8_1
254     bra.w   .px8_2
255     | last table entry coincides with target
257 .px8_3:
258     moveq.l #24, %d0
260     movem.l (%a1), %d3-%d5
261     add.l   %a2, %a1
262     LEFT24_PW %d3, %d4
263     LEFT24_PW %d4, %d5
264     lsl.l   %d0, %d5
265     AVG_PW  %d3, %d4
266     AVG_PW  %d4, %d5
267     movem.l %d3-%d4, (%a0)
268     add.l   %a2, %a0
269     subq.l  #1, %d6
270     bne.s   1b
271     movem.l (%sp), %d2-%d6/%a2
272     lea.l   (6*4,%sp), %sp
273     rts
275 .px8_2:
276     moveq.l #24, %d0
278     movem.l (%a1), %d3-%d5
279     add.l   %a2, %a1
280     swap    %d3
281     swap    %d4
282     move.w  %d4, %d3
283     swap    %d5
284     move.w  %d5, %d4
285     AVG_PW  %d3, %d4
286     AVG_PW  %d4, %d5
287     movem.l %d3-%d4, (%a0)
288     add.l   %a2, %a0
289     subq.l  #1, %d6
290     bne.s   1b
291     movem.l (%sp), %d2-%d6/%a2
292     lea.l   (6*4,%sp), %sp
293     rts
295 .px8_1:
296     moveq.l #24, %d0
298     movem.l (%a1), %d3-%d5
299     add.l   %a2, %a1
300     LEFT8_PW %d3, %d4
301     LEFT8_PW %d4, %d5
302     lsl.l   #8, %d5
303     AVG_PW  %d3, %d4
304     AVG_PW  %d4, %d5
305     movem.l %d3-%d4, (%a0)
306     add.l   %a2, %a0
307     subq.l  #1, %d6
308     bne.s   1b
309     movem.l (%sp), %d2-%d6/%a2
310     lea.l   (6*4,%sp), %sp
311     rts
313 .px8_0:
314     moveq.l #24, %d0
316     movem.l (%a1), %d3-%d5
317     add.l   %a2, %a1
318     AVG_PW  %d3, %d4
319     AVG_PW  %d4, %d5
320     movem.l %d3-%d4, (%a0)
321     add.l   %a2, %a0
322     subq.l  #1, %d6
323     bne.s   1b
324     movem.l (%sp), %d2-%d6/%a2
325     lea.l   (6*4,%sp), %sp
326     rts
327     
328 /*****************************************************************************/
330     .align  2
331     .global MC_put_x_16
332     .type   MC_put_x_16, @function
333     
334 MC_put_x_16:
335     lea.l   (-8*4,%sp), %sp
336     movem.l %d2-%d7/%a2-%a3, (%sp)  | save some registers
337     movem.l (8*4+4,%sp), %a0-%a3    | dest, source, stride, height
338     move.l  %a1, %d0
339     and.l   #3, %d0
340     sub.l   %d0, %a1
341     jmp.l   (2, %pc, %d0.l*4)
342     bra.w   .px16_0
343     bra.w   .px16_1
344     bra.w   .px16_2
345     | last table entry coincides with target
347 .px16_3:
348     moveq.l #24, %d0
350     movem.l (%a1), %d3-%d7
351     add.l   %a2, %a1
352     LEFT24_PW %d3, %d4
353     LEFT24_PW %d4, %d5
354     LEFT24_PW %d5, %d6
355     LEFT24_PW %d6, %d7
356     lsl.l   %d0, %d7
357     AVG_PW  %d3, %d4
358     AVG_PW  %d4, %d5
359     AVG_PW  %d5, %d6
360     AVG_PW  %d6, %d7
361     movem.l %d3-%d6, (%a0)
362     add.l   %a2, %a0
363     subq.l  #1, %a3
364     tst.l   %a3
365     bne.w   1b
366     movem.l (%sp), %d2-%d7/%a2-%a3
367     lea.l   (8*4,%sp), %sp
368     rts
370 .px16_2:
371     moveq.l #24, %d0
373     movem.l (%a1), %d3-%d7
374     add.l   %a2, %a1
375     swap    %d3
376     swap    %d4
377     move.w  %d4, %d3
378     swap    %d5
379     move.w  %d5, %d4
380     swap    %d6
381     move.w  %d6, %d5
382     swap    %d7
383     move.w  %d7, %d6
384     AVG_PW  %d3, %d4
385     AVG_PW  %d4, %d5
386     AVG_PW  %d5, %d6
387     AVG_PW  %d6, %d7
388     movem.l %d3-%d6, (%a0)
389     add.l   %a2, %a0
390     subq.l  #1, %a3
391     tst.l   %a3
392     bne.w   1b
393     movem.l (%sp), %d2-%d7/%a2-%a3
394     lea.l   (8*4,%sp), %sp
395     rts
397 .px16_1:
398     moveq.l #24, %d0
400     movem.l (%a1), %d3-%d7
401     add.l   %a2, %a1
402     LEFT8_PW %d3, %d4
403     LEFT8_PW %d4, %d5
404     LEFT8_PW %d5, %d6
405     LEFT8_PW %d6, %d7
406     lsl.l   #8, %d7
407     AVG_PW  %d3, %d4
408     AVG_PW  %d4, %d5
409     AVG_PW  %d5, %d6
410     AVG_PW  %d6, %d7
411     movem.l %d3-%d6, (%a0)
412     add.l   %a2, %a0
413     subq.l  #1, %a3
414     tst.l   %a3
415     bne.w   1b
416     movem.l (%sp), %d2-%d7/%a2-%a3
417     lea.l   (8*4,%sp), %sp
418     rts
420 .px16_0:
421     moveq.l #24, %d0
423     movem.l (%a1), %d3-%d7
424     add.l   %a2, %a1
425     AVG_PW  %d3, %d4
426     AVG_PW  %d4, %d5
427     AVG_PW  %d5, %d6
428     AVG_PW  %d6, %d7
429     movem.l %d3-%d6, (%a0)
430     add.l   %a2, %a0
431     subq.l  #1, %a3
432     tst.l   %a3
433     bne.w   1b
434     movem.l (%sp), %d2-%d7/%a2-%a3
435     lea.l   (8*4,%sp), %sp
436     rts