[an error occurred while processing this directive]
|
Делаешь все так, только в 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,r1mul r30,r27
add r20,r0
adc r21,r1 ;12mul 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 ;21mul r31,r27
add r21,r0
adc r30,r1
adc r25,r25 ;22 учли перенос из r30mul 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 ;31mul r22,r27
add r30,r0
adc r31,r1
clr r27
adc r25,r27 ;32mul 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
}