1
0
Fork 0
forked from len0rd/rockbox

Back to byte-aligned bitswapping

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@2519 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Linus Nielsen Feltzing 2002-10-08 07:43:52 +00:00
parent 591f3ac129
commit 03c13a1a3b
2 changed files with 89 additions and 76 deletions

View file

@ -17,85 +17,76 @@
*
****************************************************************************/
.section .icode,"ax",@progbits
.global _bitswap
.align 4
.type _bitswap,@function
.section .icode,"ax",@progbits
.global _bitswap
.align 4
.type _bitswap,@function
/* Registers used:
*
* r0 Temporary (required by some instructions)
* r1 Low byte
* r2 High byte
* r3 Result after flip
* r4 Data
* r5 Length
* r6 Current (position in Data)
* r7 Flip table
* r0 Temporary (required by some instructions)
* r1 Flip table
* r4 Argument: Data pointer
* r5 Argument: Length (in bytes)
*/
/* TODO: Optimize for DRAM burst operation by reading and writing in chunks
We do not want to optimize by reading/writing words, because the data
pointer may be odd */
_bitswap:
mov.l .fliptable,r7
mov r4,r6
add r5,r6 /* goto end of buffer */
add r5,r6 /* (direction IS important) */
bra .init
mov.l .fliptable,r1
add r4,r5 /* Calculate end of buffer */
bra .init
.loop:
mov.w @r4,r1 /* data to flip */
swap.b r1,r2
extu.b r2,r0 /* high byte */
mov.b @(r0,r7),r2
extu.b r2,r0 /* remove any sign extend */
swap.b r0,r3 /* put high byte in result */
extu.b r1,r0 /* low byte */
mov.b @(r0,r7),r1
extu.b r1,r0 /* remove any sign extend */
or r0,r3 /* put low byte in result */
mov.w r3,@r4 /* store result */
add #2,r4
mov.b @r4,r0 /* Data to flip */
extu.b r0,r0 /* Zero extend */
mov.b @(r0,r1),r0 /* Look up in the flip table */
mov.b r0,@r4 /* Store result */
add #1,r4
.init:
cmp/gt r4,r6 /* while (data < start+length*2) */
bt .loop
rts
cmp/gt r4,r5 /* while (dataptr < start+length) */
bt .loop
rts
.align 4
.align 4
.fliptable:
.long _fliptable
.long _fliptable
_fliptable:
.byte 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0
.byte 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0
.byte 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8
.byte 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8
.byte 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4
.byte 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4
.byte 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec
.byte 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc
.byte 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2
.byte 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2
.byte 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea
.byte 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa
.byte 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6
.byte 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6
.byte 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee
.byte 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe
.byte 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1
.byte 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1
.byte 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9
.byte 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9
.byte 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5
.byte 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5
.byte 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed
.byte 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd
.byte 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3
.byte 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3
.byte 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb
.byte 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb
.byte 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7
.byte 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7
.byte 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef
.byte 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff
.byte 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0
.byte 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0
.byte 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8
.byte 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8
.byte 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4
.byte 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4
.byte 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec
.byte 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc
.byte 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2
.byte 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2
.byte 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea
.byte 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa
.byte 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6
.byte 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6
.byte 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee
.byte 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe
.byte 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1
.byte 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1
.byte 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9
.byte 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9
.byte 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5
.byte 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5
.byte 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed
.byte 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd
.byte 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3
.byte 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3
.byte 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb
.byte 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb
.byte 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7
.byte 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7
.byte 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef
.byte 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff
.end:
.size _bitswap,.end-_bitswap
.size _bitswap,.end-_bitswap

View file

@ -35,7 +35,7 @@
#include "file.h"
#endif
extern void bitswap(unsigned short *data, int length);
extern void bitswap(unsigned char *data, int length);
#define MPEG_CHUNKSIZE 0x180000
#define MPEG_SWAP_CHUNKSIZE 0x8000
@ -465,9 +465,30 @@ static void mas_poll_start(int interval_in_ms)
TSR1 &= ~0x02;
TIER1 = 0xf9; /* Enable GRA match interrupt */
TSTR |= 0x02; /* Start timer 2 */
TSTR |= 0x02; /* Start timer 1 */
}
#ifdef DEBUG
static void dbg_timer_start(void)
{
/* We are using timer 2 */
TSTR &= ~0x04; /* Stop the timer */
TSNC &= ~0x04; /* No synchronization */
TMDR &= ~0x44; /* Operate normally */
TCNT1 = 0; /* Start counting at 0 */
TCR1 = 0x03; /* Sysclock/8 */
TSTR |= 0x04; /* Start timer 2 */
}
static int dbg_cnt2us(unsigned int cnt)
{
return (cnt * 10000) / (FREQ/800);
}
#endif
static int get_unplayed_space(void)
{
int space = mp3buf_write - mp3buf_read;
@ -704,7 +725,7 @@ static int new_file(int steps)
}
else
{
/* skip past id3v2 tag (to an even byte) */
/* skip past id3v2 tag */
lseek(mpeg_file,
id3tags[new_tag_idx]->id3.id3v2len,
SEEK_SET);
@ -827,9 +848,9 @@ static void mpeg_thread(void)
set_elapsed(id3);
}
else {
/* skip past id3v2 tag (to an even byte) */
/* skip past id3v2 tag */
lseek(mpeg_file,
id3tags[tag_read_idx]->id3.id3v2len & ~1,
id3tags[tag_read_idx]->id3.id3v2len,
SEEK_SET);
}
@ -1046,8 +1067,6 @@ static void mpeg_thread(void)
newpos = id3->id3v2len;
}
newpos = newpos & ~1;
if (mpeg_file >= 0)
curpos = lseek(mpeg_file, 0, SEEK_CUR);
else
@ -1196,8 +1215,7 @@ static void mpeg_thread(void)
DEBUGF("B %x\n", amount_to_swap);
t1 = current_tick;
bitswap((unsigned short *)(mp3buf + mp3buf_swapwrite),
(amount_to_swap+1)/2);
bitswap(mp3buf + mp3buf_swapwrite, amount_to_swap);
t2 = current_tick;
DEBUGF("time: %d\n", t2 - t1);
@ -2054,6 +2072,10 @@ void mpeg_init(int volume, int bass, int treble, int balance, int loudness, int
memset(id3tags, sizeof(id3tags), 0);
memset(_id3tags, sizeof(id3tags), 0);
#ifdef DEBUG
dbg_timer_start();
#endif
}
/* -----------------------------------------------------------------