На вот... Кто-то давно из этой конфы мне давал эти исходники, и кажись они рабочие :-)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

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

Отправлено Звероящер 17 ноября 2004 г. 11:03
В ответ на: плавающая точка для AT89S8252? отправлено Анатолий 17 ноября 2004 г. 08:07

/*
Число представлено в нормализованной форме, в старшем бите старшего байта мантиссы
всегда единица, поэтому она потом сбрасывается и на ее место пишется знак ( 1 - отрицательное число).
Нулевой порядок - 81Н.
Представление 1.00 : R2 = 81H, R3 = 0, R4 = 0.


*/


FLOAT MOV R2,#00H
;***********************************************************************
;"FLOAT" - п/п преобразования числа в формате с фиксированной запятой
; в формат с плавающей запятой;
;Вход: R3 - ст.байт;
; R4 - мл.байт;
;Выход:R2 - порядок;
; R3 - ст.байт мантиссы;
; R4 - мл.байт мантиссы;
MOV A,R3
ORL A,R4
JZ FL5
MOV R2,#90H
NORM: MOV A,R3
JB ACC.7,FL4
CLR C
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
DEC R2
SJMP NORM
FL4: MOV A,R3
ANL A,#7FH
MOV R3,A
FL5: RET


CDES MOV A,R2
;**************************************************************;
;"CDES" - п/п преобразования числа с плавающей запятой в формат;
; с фиксированной запятой;
;Вход: R2 - порядок;
; R3 - ст.байт мантиссы;
; R4 - мл.байт мантиссы;
;Выход: R3 - ст.байт;
; R4 - мл.байт;

ADD A,#6FH
JNC IFIX4
MOV R3,#0FFH
MOV R4,#0FFH
RET ;выход при Nвх >FFFFH ;
IFIX4: MOV A,R2
ADD A,#7FH
JC IF0
SJMP IFIX0
IF0: MOV R5,#80H
MOV R6,#0
MOV R7,#0
LCALL FADD
MOV A,R3
MOV R6,#0
MOV R7,#0
ORL A,#80H
MOV R3,A
MOV A,R2
ADD A,#80H
MOV R0,A
JC IFIX3
IFIX0: MOV R3,#0
MOV R4,#0
RET
IFIX3: CLR C
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
MOV A,R7
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
DJNZ R0,IFIX3
MOV A,R7
MOV R4,A
MOV A,R6
MOV R3,A
RET


;***********************************************************************;
; подпрограмма деления двух чисел в плавающем формате ;
; R2,R3,R4 - делимое
; R5,R6,R7 - делитель
; выход - R2,R3,R4

FDIV MOV A,R5
JNZ FDV1
SETB C
RET
FDV1: MOV A,R2
JNZ FDV2
CLR C
RET
FDV2: MOV A,R5
CPL A
INC A
ADD A,R2
XRL A,#80H
FDV0: MOV R2,A
MOV A,R3
XRL A,R6
MOV R5,A
MOV A,R3
ORL A,#80H
MOV R3,A
MOV A,R6
ORL A,#80H
MOV R6,A
MOV R1,#2
MOV R0,#0
FDV3: MOV A,R3
CPL A
MOV R3,A
MOV A,R4
CPL A
ADD A,R7
CPL A
MOV R4,A
MOV A,R3
ADDC A,R6
CPL A
MOV R3,A
JNC FDV4
MOV A,R1
RRC A
JC FDV5
MOV A,R4
ADD A,R7
MOV R4,A
MOV A,R3
ADDC A,R6
MOV R3,A
DEC R1
FDV4: INC R1
FDV5: MOV A,R4
ADD A,R4
MOV R4,A
MOV A,R3
ADDC A,R3
MOV R3,A
MOV A,R1
RLC A
MOV R1,A
MOV A,R0
RLC A
MOV R0,A
JC FDV9
SJMP FDV3
FDV9: MOV A,R1
RRC A
JNC FDV6
MOV A,R1
ADD A,#1
MOV R1,A
MOV A,R0
ADDC A,#0
MOV R0,A
FDV6: CLR C
MOV A,R0
JB ACC.7,FDV8
MOV A,R1
RLC A
MOV R1,A
MOV A,R0
RLC A
MOV R0,A
DJNZ R2,FDV6
SETB C
RET
FDV8: MOV A,R1
MOV R4,A
MOV A,R0
MOV R3,A
INC R2
MOV A,R5
JB ACC.7,FDV10
MOV A,R3
ANL A,#7FH
MOV R3,A
FDV10: CLR C
RET


FDEC MOV R5,#81H
;***********************************************************************;
; подпрограмма сложения и вычитания чисел в плавающем формате ;
; FADD - R2...R4 = R2...R4 + R5...R7
; FSUB - R2...R4 = R2...R4 - R5...R7
CLR A
MOV R6,A
MOV R7,A

FSUB: MOV A,R6
XRL A,#80H
MOV R6,A
SJMP FADD

FINC: MOV R5,#81H
CLR A
MOV R6,A
MOV R7,A

FADD: MOV A,R2
JNZ FAD1
MOV A,R5
MOV R2,A
MOV A,R6
MOV R3,A
MOV A,R7
MOV R4,A
CLR C
RET
FAD1: MOV A,R5
JNZ FAD2
CLR C
RET
FAD2: CPL A
INC A
ADD A,R2
MOV R0,A
JC FAD3
CPL A
INC A
MOV R0,A
MOV A,R2
XCH A,R5
MOV R2,A
MOV A,R3
XCH A,R6
MOV R3,A
MOV A,R4
XCH A,R7
MOV R4,A
MOV A,R0
FAD3: ADD A,#0F0H
JNC FAD4
CLR C
RET
FAD4: MOV A,R3
MOV R1,A
ORL A,#80H
MOV R3,A
MOV A,R6
MOV R5,A
ORL A,#80H
MOV R6,A
MOV A,R0
JZ FAD06
FAD5: CLR C
MOV A,R6
RRC A
MOV R6,A
MOV A,R7
RRC A
MOV R7,A
DJNZ R0,FAD5
FAD06: MOV A,R1
XRL A,R5
JB ACC.7,FAD8
MOV A,R4
ADD A,R7
MOV R4,A
MOV A,R3
ADDC A,R6
MOV R3,A
JNC FAD7
MOV A,R2
ADD A,#1
MOV R2,A
JNC FAD6
RET
FAD6: MOV A,R3
RRC A
MOV R3,A
MOV A,R4
RRC A
MOV R4,A
FAD7: MOV A,R1
RLC A
MOV A,R3
RLC A
RR A
MOV R3,A
CLR C
RET
FAD8: MOV A,R7
CPL A
ADD A,#1
MOV R7,A
MOV A,R6
CPL A
ADDC A,#0
MOV R6,A
MOV A,R4
ADD A,R7
MOV R4,A
MOV A,R3
ADDC A,R6
MOV R3,A
JC FAD9
MOV A,R4
CPL A
ADD A,#1
MOV R4,A
MOV A,R3
CPL A
ADDC A,#0
MOV R3,A
MOV A,R1
CPL A
MOV R1,A
FAD9: MOV A,R3
ORL A,R4
JNZ FAD10
MOV R2,A
CLR C
RET
FAD10: MOV A,R3
JB ACC.7,FAD7
CLR C
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
DJNZ R2,FAD10
CLR C
CPL C

RET

CMP_FLOAT MOV A,R3
;***********************************************************************
%"** Сравнение двух чисел в плавающем формате.
; Вход : первое число R2,R3,R4
; второе число R5,R6,R7
; Выход : А = 1 - числа равны
; А = 2 - 1 < 2
; A = 4 - 1 > 2
XRL A,R6
JNB ACC.7,CMP_FLOAT0
MOV A,R3
JB ACC.7,CMP_FLOAT1
MOV A,#04H
RET
CMP_FLOAT1: MOV A,#02H
RET
CMP_FLOAT0: MOV A,R2
CLR C
SUBB A,R5
JNZ CMP_FLOAT3
MOV A,R3
CLR C
SUBB A,R6
JNZ CMP_FLOAT3
MOV A,R4
CLR C
SUBB A,R7
JNZ CMP_FLOAT3
MOV A,#01H
RET
CMP_FLOAT3: JC CMP_FLOAT2
MOV A,R3
JB ACC.7,CMP_FLOAT4
MOV A,#04H
RET
CMP_FLOAT4: MOV A,#02H
RET
CMP_FLOAT2: MOV A,R3
JB ACC.7,CMP_FLOAT5
MOV A,#02H
RET
CMP_FLOAT5: MOV A,#04H
RET

;************************************************************************
; новая подпрограмма

FMUL MOV A,R2
JNZ FMP21
RET
FMP21: MOV A,R5
JNZ FMP22
MOV R2,A
RET
FMP22: ADD A,R2
JC FMP23 ; число большое
ADD A,#80H
JC FMP24
FMP55: MOV R2,#01H
SJMP FMP25 ; число мало

FMP23: ADD A,#80H
JNC FMP24
MOV R2,#0FFH
FMP25: MOV A,R3
XRL A,R6
ORL A,#7FH
MOV R3,A
MOV R4,#0FFH
RET
FMP24: MOV R2,A ; порядок
ADD A,#0F0H
JNC FMP55
MOV A,R3
XRL A,R6
ANL A,#80H
ADD A,#10H
MOV R5,A ; знак

MOV A,R3
ORL A,#80H
MOV R3,A
MOV A,R6
ORL A,#80H
MOV R6,A ; восстановление старших разрядов
;*** перемножение мантисс **********
MOV A,R4
MOV B,R7
MUL AB
JNB ACC.7,FMP41
INC B
FMP41: MOV R0,B
MOV A,R6
MOV B,R4
MUL AB
ADD A,R0
MOV R0,A
MOV A,B
ADDC A,#00H ;17
MOV R1,A

MOV A,R3
MOV B,R7
MUL AB
ADD A,R0
MOV R0,A
MOV A,B
ADDC A,R1
MOV R1,A
CLR A
RLC A
MOV R4,A

MOV A,R6
MOV B,R3
MUL AB ;38
ADD A,R1
MOV R1,A
MOV A,B
ADDC A,R4
MOV R3,A
MOV A,R1
MOV R4,A

MOV A,R3 ;46
JB ACC.7,FMP40
MOV A,R0
RLC A
MOV R0,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
DEC R2
FMP40: MOV A,R0
JNB ACC.7,FMP42
MOV A,R4 ; уменьшить ошибку округления
ADD A,#01H
MOV R4,A
MOV A,R3
ADDC A,#00H
MOV R3,A
JNZ FMP42
INC R2
FMP42: MOV A,R5 ; восстановить знак
RLC A
MOV A,R3
RLC A
RR A
MOV R3,A
RET ;64 + 24 = 88 циклов