спасибо сергею за подсказки
у меня что-то получилось, по крайней мере работает.
привожу код который у меня получился
в проекте три файла
1. main.c
Код
#include <iolpc2103.h>
typedef unsigned int UINT;
typedef unsigned short USHORT;
typedef unsigned char UCHAR;
extern __ramfunc void __haffman(USHORT* pHaff, USHORT* pHaffLen);
USHORT haffman[256] =
{
0 , //0
2 , //1
6 , //2
...
32766 , //254
32767 //255
};
USHORT haffman_len_mask[256] =
{
0x0001 , //0
0x0002 , //1
...
0x4000 //255
};
USHORT* pHaff = haffman;
USHORT* pHaffMask = haffman_len_mask;
extern void _cpy(void);
void main()
{
_cpy();
__haffman(pHaff, pHaffMask);
while(1){}
}
второй сама функция, которая должна выполняться в ОЗУ
2 haff.s79
Код
MODULE ?HAFFMAN
RSEG RAM_FUNC : CODE
PUBLIC __haffman
CODE32
DC32 SFB(RAM_FUNC)
DC32 SIZEOF(RAM_FUNC)
__haffman:
//в R0 указатель на первый входной параметр функции
// в данном случае указатель на таблицу констант хаффмана
// в R1 указатель на второй входной параметр функции
// в данном случае указатель на таблицу длинн констант хаффмана
mov R2, #35 // data in
mov R3,#0x01 // bit position
mov R10,#0x40000000 // адресс выходных данных
orr R10,R10,#0x1000
mov R11,#0
str R11,[R10]
mov R11,#0xFF
orr R11,R11,R11, LSL #8 //R11 <- 0x0000FFFF
repeat:
ldr R4,[R0,R2, LSL #1] //загрузить в R4 код HAFFMAN соответствующий входным данным
orr R4,R4,R5,LSL #8
and R4,R4,R11 // маскирование старших 16 бит
mul R5,R4,R3 // сдвигаем очередной код на текущую позицию
ldr R9,[R10] // загружаем выходные данные из текущей позиции
orr R5,R5,R9 // добавляем новые данные
str R5,[R0] // сохраняем новые данные
cmp R6,#0
addne R0,R0,#4
ldr R7,[R8,R2, LSL #1] //загрузить в R7 длину кода HAFFMAN соответствующий входным данным
LSL R7,R7,#1
muls R5,R3,R7
movcs R3, #0x01
movcc R3,R5
addcs R0,R0,#8
b repeat
mov PC,LR //возврат из подпрограммы R15 (PC)- программный счетчих,
// R14 (LR) - регистр связи в нем автоматически сохраняется
// адрес возврата из подпрограммы
ENDMOD
END
и третий файл функция копирования из FLASH в ОЗУ
3 copyd_.s79
Код
MODULE ?CPY
RSEG CODE_ID : CODE
PUBLIC _cpy
EXTERN COPYD
CODE32
_cpy:
ldr R0,COPYD
add R5,R0,#4
ldr R1,[R5],#+4
ldr R2,[R5]
sub R2,R2,#1
add R0,R0,#4
_cpy_1: ldrb R12,[R0],#+1
subs R2,R2,#1
strb R12,[R1],#+1
bne _cpy_1
mov PC,LR
ENDMOD
MODULE ?FLASH
RSEG FLASH :CODE
PUBLIC COPYD
CODE32
COPYD: DC32 SFB(FLASH)
LTORG
ENDMOD //?FLASH
END
и еще подправил файл ххх.XCL
в нем убрал
Код
-QCODE_I=CODE_ID
и добавил
Код
-Z(CODE)RAM_FUNC=40000000-40002000
-Z(CODE)FLASH=40-7FFF
-QRAM_FUNC=FLASH
может получилось несколько коряво, но симуляция показывает, что принцип работает.
сама функция
Код
void __haffman(USHORT* pHaff, USHORT* pHaffLen);
сырая. я над ней еще работаю поэтому прошу не обращать особого внимания на ее тело
а весь проект целиком в прикрепленном файле
идея реализации алгоритма Хаффмана взята в подфоруме AVR (необычное использование аппаратного умножителя)