summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Nielsen Feltzing <linus@haxx.se>2002-10-08 07:43:52 +0000
committerLinus Nielsen Feltzing <linus@haxx.se>2002-10-08 07:43:52 +0000
commit03c13a1a3bcf627bd0a058f331cff8d52a699c5d (patch)
treec76b22c8f60dd08a2df48de5a70bda2a260ec837
parent591f3ac129664d91dd13d77230b4140aba53910c (diff)
downloadrockbox-03c13a1a3bcf627bd0a058f331cff8d52a699c5d.tar.gz
rockbox-03c13a1a3bcf627bd0a058f331cff8d52a699c5d.zip
Back to byte-aligned bitswapping
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@2519 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--firmware/bitswap.S125
-rw-r--r--firmware/mpeg.c40
2 files changed, 89 insertions, 76 deletions
diff --git a/firmware/bitswap.S b/firmware/bitswap.S
index 5f94fedb36..f825be22d1 100644
--- a/firmware/bitswap.S
+++ b/firmware/bitswap.S
@@ -17,85 +17,76 @@
17 * 17 *
18 ****************************************************************************/ 18 ****************************************************************************/
19 19
20 .section .icode,"ax",@progbits 20 .section .icode,"ax",@progbits
21 .global _bitswap 21 .global _bitswap
22 .align 4 22 .align 4
23 .type _bitswap,@function 23 .type _bitswap,@function
24 24
25/* Registers used: 25/* Registers used:
26 * 26 *
27 * r0 Temporary (required by some instructions) 27 * r0 Temporary (required by some instructions)
28 * r1 Low byte 28 * r1 Flip table
29 * r2 High byte 29 * r4 Argument: Data pointer
30 * r3 Result after flip 30 * r5 Argument: Length (in bytes)
31 * r4 Data
32 * r5 Length
33 * r6 Current (position in Data)
34 * r7 Flip table
35 */ 31 */
36 32
33/* TODO: Optimize for DRAM burst operation by reading and writing in chunks
34 We do not want to optimize by reading/writing words, because the data
35 pointer may be odd */
36
37_bitswap: 37_bitswap:
38 mov.l .fliptable,r7 38 mov.l .fliptable,r1
39 mov r4,r6 39 add r4,r5 /* Calculate end of buffer */
40 add r5,r6 /* goto end of buffer */ 40 bra .init
41 add r5,r6 /* (direction IS important) */
42 bra .init
43.loop: 41.loop:
44 mov.w @r4,r1 /* data to flip */ 42 mov.b @r4,r0 /* Data to flip */
45 swap.b r1,r2 43 extu.b r0,r0 /* Zero extend */
46 extu.b r2,r0 /* high byte */ 44 mov.b @(r0,r1),r0 /* Look up in the flip table */
47 mov.b @(r0,r7),r2 45 mov.b r0,@r4 /* Store result */
48 extu.b r2,r0 /* remove any sign extend */ 46 add #1,r4
49 swap.b r0,r3 /* put high byte in result */
50 extu.b r1,r0 /* low byte */
51 mov.b @(r0,r7),r1
52 extu.b r1,r0 /* remove any sign extend */
53 or r0,r3 /* put low byte in result */
54 mov.w r3,@r4 /* store result */
55 add #2,r4
56.init: 47.init:
57 cmp/gt r4,r6 /* while (data < start+length*2) */ 48 cmp/gt r4,r5 /* while (dataptr < start+length) */
58 bt .loop 49 bt .loop
59 rts 50 rts
60 51
61 .align 4 52 .align 4
62 53
63.fliptable: 54.fliptable:
64 .long _fliptable 55 .long _fliptable
65 56
66_fliptable: 57_fliptable:
67 .byte 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0 58 .byte 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0
68 .byte 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0 59 .byte 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0
69 .byte 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8 60 .byte 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8
70 .byte 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8 61 .byte 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8
71 .byte 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4 62 .byte 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4
72 .byte 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4 63 .byte 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4
73 .byte 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec 64 .byte 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec
74 .byte 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc 65 .byte 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc
75 .byte 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2 66 .byte 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2
76 .byte 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2 67 .byte 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2
77 .byte 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea 68 .byte 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea
78 .byte 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa 69 .byte 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa
79 .byte 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6 70 .byte 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6
80 .byte 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6 71 .byte 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6
81 .byte 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee 72 .byte 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee
82 .byte 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe 73 .byte 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe
83 .byte 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1 74 .byte 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1
84 .byte 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1 75 .byte 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1
85 .byte 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9 76 .byte 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9
86 .byte 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9 77 .byte 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9
87 .byte 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5 78 .byte 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5
88 .byte 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5 79 .byte 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5
89 .byte 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed 80 .byte 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed
90 .byte 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd 81 .byte 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd
91 .byte 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3 82 .byte 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3
92 .byte 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3 83 .byte 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3
93 .byte 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb 84 .byte 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb
94 .byte 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb 85 .byte 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb
95 .byte 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7 86 .byte 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7
96 .byte 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7 87 .byte 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7
97 .byte 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef 88 .byte 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef
98 .byte 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff 89 .byte 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff
99 90
100.end: 91.end:
101 .size _bitswap,.end-_bitswap 92 .size _bitswap,.end-_bitswap
diff --git a/firmware/mpeg.c b/firmware/mpeg.c
index 22a4e1f79e..2a5651ed61 100644
--- a/firmware/mpeg.c
+++ b/firmware/mpeg.c
@@ -35,7 +35,7 @@
35#include "file.h" 35#include "file.h"
36#endif 36#endif
37 37
38extern void bitswap(unsigned short *data, int length); 38extern void bitswap(unsigned char *data, int length);
39 39
40#define MPEG_CHUNKSIZE 0x180000 40#define MPEG_CHUNKSIZE 0x180000
41#define MPEG_SWAP_CHUNKSIZE 0x8000 41#define MPEG_SWAP_CHUNKSIZE 0x8000
@@ -465,9 +465,30 @@ static void mas_poll_start(int interval_in_ms)
465 TSR1 &= ~0x02; 465 TSR1 &= ~0x02;
466 TIER1 = 0xf9; /* Enable GRA match interrupt */ 466 TIER1 = 0xf9; /* Enable GRA match interrupt */
467 467
468 TSTR |= 0x02; /* Start timer 2 */ 468 TSTR |= 0x02; /* Start timer 1 */
469} 469}
470 470
471#ifdef DEBUG
472static void dbg_timer_start(void)
473{
474 /* We are using timer 2 */
475
476 TSTR &= ~0x04; /* Stop the timer */
477 TSNC &= ~0x04; /* No synchronization */
478 TMDR &= ~0x44; /* Operate normally */
479
480 TCNT1 = 0; /* Start counting at 0 */
481 TCR1 = 0x03; /* Sysclock/8 */
482
483 TSTR |= 0x04; /* Start timer 2 */
484}
485
486static int dbg_cnt2us(unsigned int cnt)
487{
488 return (cnt * 10000) / (FREQ/800);
489}
490#endif
491
471static int get_unplayed_space(void) 492static int get_unplayed_space(void)
472{ 493{
473 int space = mp3buf_write - mp3buf_read; 494 int space = mp3buf_write - mp3buf_read;
@@ -704,7 +725,7 @@ static int new_file(int steps)
704 } 725 }
705 else 726 else
706 { 727 {
707 /* skip past id3v2 tag (to an even byte) */ 728 /* skip past id3v2 tag */
708 lseek(mpeg_file, 729 lseek(mpeg_file,
709 id3tags[new_tag_idx]->id3.id3v2len, 730 id3tags[new_tag_idx]->id3.id3v2len,
710 SEEK_SET); 731 SEEK_SET);
@@ -827,9 +848,9 @@ static void mpeg_thread(void)
827 set_elapsed(id3); 848 set_elapsed(id3);
828 } 849 }
829 else { 850 else {
830 /* skip past id3v2 tag (to an even byte) */ 851 /* skip past id3v2 tag */
831 lseek(mpeg_file, 852 lseek(mpeg_file,
832 id3tags[tag_read_idx]->id3.id3v2len & ~1, 853 id3tags[tag_read_idx]->id3.id3v2len,
833 SEEK_SET); 854 SEEK_SET);
834 855
835 } 856 }
@@ -1046,8 +1067,6 @@ static void mpeg_thread(void)
1046 newpos = id3->id3v2len; 1067 newpos = id3->id3v2len;
1047 } 1068 }
1048 1069
1049 newpos = newpos & ~1;
1050
1051 if (mpeg_file >= 0) 1070 if (mpeg_file >= 0)
1052 curpos = lseek(mpeg_file, 0, SEEK_CUR); 1071 curpos = lseek(mpeg_file, 0, SEEK_CUR);
1053 else 1072 else
@@ -1196,8 +1215,7 @@ static void mpeg_thread(void)
1196 1215
1197 DEBUGF("B %x\n", amount_to_swap); 1216 DEBUGF("B %x\n", amount_to_swap);
1198 t1 = current_tick; 1217 t1 = current_tick;
1199 bitswap((unsigned short *)(mp3buf + mp3buf_swapwrite), 1218 bitswap(mp3buf + mp3buf_swapwrite, amount_to_swap);
1200 (amount_to_swap+1)/2);
1201 t2 = current_tick; 1219 t2 = current_tick;
1202 DEBUGF("time: %d\n", t2 - t1); 1220 DEBUGF("time: %d\n", t2 - t1);
1203 1221
@@ -2054,6 +2072,10 @@ void mpeg_init(int volume, int bass, int treble, int balance, int loudness, int
2054 2072
2055 memset(id3tags, sizeof(id3tags), 0); 2073 memset(id3tags, sizeof(id3tags), 0);
2056 memset(_id3tags, sizeof(id3tags), 0); 2074 memset(_id3tags, sizeof(id3tags), 0);
2075
2076#ifdef DEBUG
2077 dbg_timer_start();
2078#endif
2057} 2079}
2058 2080
2059/* ----------------------------------------------------------------- 2081/* -----------------------------------------------------------------