[an error occurred while processing this directive]
Эх, молодеж........
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено papa 05 сентября 2006 г. 09:43
В ответ на: А как заставить codeVision использовать инструкции аппаратного умножителя ? (+) отправлено <font color=gray>vinogradov aleksei</font> 04 сентября 2006 г. 22:43

Делаешь все так, только в CV нет разделения на процессоры с аппаратным умножением и без оного.
Давно я собирался похвастаться программулиной умножения плавучки, да все некогда было. Ну а тут придется. Копипастуй:


/*************************************************

Умножение с учетом аппаратных команд
(Сделано как примочка к CV)

***********************************************/

float floatmul (float x1, float x2) {
#asm
__GETD1S 0
__GETD2S 4
;------begin
; числа лежат: 1)R:23-22-31-30
; 2)R:25-24-27-26
PUSH R21
; RCALL __UNPACK
;- своя версия распаковщика:
muls r23,r25 ;вычисляем знак
bst r1,7 ;и сохраняем его
clc
sbrc r22,7
sec ;проверили мл. бит порядка
rol r23
subi r23,127 ;попробуем классику...
ori r22,0x80

clc
sbrc r24,7
sec ;проверили мл. бит порядка
rol r25
subi r25,127 ;попробуем классику...
ori r24,0x80
;-----end unpack
CPI R23,0x80
BREQ _mhzero
CPI R25,0x80
BREQ _mhzero
SEC
ADC R23,R25
BRVC __MH124
BRLT _mhzero
__MH125:
brts _mhMIN
; RJMP _mhMAX
_mhMAX:
SER R30
SER R31
LDI R22,0x7F
LDI R23,0x7F
POP R21
rjmp _mhexit
_mhzero:
CLR R30
CLR R31
CLR R22
CLR R23
POP R21
rjmp _mhexit
_mhMIN:
SER R30
SER R31
LDI R22,0x7F
SER R23
POP R21
rjmp _mhexit

__MH124:
PUSH R19
PUSH R20
; CLR R1
; CLR R19
; CLR R20
CLR R21
; LDI R25,24
clr r25 ; для хранения переноса, пока не освободится очередной регистр

__MH120:
mul r30,r26
mov r19,r0 ;11
mov r20,r1

mul r30,r27
add r20,r0
adc r21,r1 ;12

mul r30,r24
mov r30,r1
add r21,r0
adc r30,r25 ; +0 ;13


mul r31,r26
add r20,r0
adc r21,r1
adc r30,r25 ;21

mul r31,r27
add r21,r0
adc r30,r1
adc r25,r25 ;22 учли перенос из r30

mul r31,r24
mov r31,r1
add r30,r0
adc r31,r25
clr r25 ;23


mul r22,r26
add r21,r0
adc r30,r1
adc r31,r25 ;+0
adc r25,r25 ;учли перенос из r31 ;31

mul r22,r27
add r30,r0
adc r31,r1
clr r27
adc r25,r27 ;32

mul r22,r24
mov r22,r1
add r31,r0
adc r22,r25 ;33

POP R20
POP R19
TST R22
BRMI __MH122
LSL R21
ROL R30
ROL R31
ROL R22
RJMP __MH123
__MH122:
INC R23
BRVS __MH1255
__MH123:
; RCALL __REPACK
;- упаковка, соответсвенно, тоже своя:
subi r23,0x82 ;отнять -127 то же что и прибавить +127
andi r22,0x7f ;почистили старший бит результата
ror r23
brcc _mhrp1
ori r22,0x80 ;поставили на его место мл. разряд порядка
_mhrp1:
bld r23,7 ;установили знак результата
;----end repack
POP R21
;----
_mhexit:
ADIW R28,8
RET
;------ не влезло по расстоянию:
__MH1255:
rjmp __MH125

#endasm
}


Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа
Имя (обязательно): 
Пароль: 
E-mail: 

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 
URL изображения: 


Rambler's Top100 Рейтинг@Mail.ru
Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание