|
.include "m128def.inc"
.ORG $0000
RJMP START
START: LDI R16,HIGH(RAMEND)
OUT SPH,R16
LDI R16,LOW(RAMEND)
OUT SPL,R16
CLR R16
CLR R17
CLR R11
CLR R10
CLR R9
LDI R21,10
MOV R12, R21
CALL LINOM
CALL GX
CALL FBTOD
RET
LINOM:BST R9, 7
BRTC LI10
CLR R16
SUB R16,R12
MOV R12,R16
CLR R16
SBC R16,R11
MOV R11,R16
CLR R16
SBC R16,R10
MOV R10, R16
CLR R16
SUB R16, R9
MOV R9, R16
LI10:LDI R16, $A0
LP10:SBRC R9, 7
RJMP NX63
LSL R12
ROL R11
ROL R10
ROL R9
DEC R16
CPI R16,$80
BRNE LP10
RJMP G0
NX63:MOV R13,R9
MOV R14,R10
MOV R15,R11
SBRS R12,7
RJMP PP6
RCALL INC3
BRNE PP6
INC R16
SEC
ROR R13
PP6:MOV R12,R16
BLD R13,7
RET
G0: CLR R12 ;若X〈-88.02969
CLR R13
CLR R14
CLR R15
RET ;长整数转换成浮点数字程序结束 各种函数计算子程序中自变量X,一律放在R12---R15四个寄存器中 R12 内存放阶码,R13--R15存放尾数,R13内为尾数的高位字节
GX:RCALL LNX ;下面计算LOGX MDB=20LOGV+20LOG0.775计算LNX
RCALL GLN10 ;计算LN10
RCALL EXCH
RJMP FPDI ;转计算LGX=LNX/LN10
LNX:TST R12
BREQ OV5
SBRS R13,7
RJMP LN1
OV5:SEV
RET
LN1:ANDI R16, $7E
MOV R0, R12
LDI R17, $F3
CP R15, R17
LDI R17, $04
CPC R14, R17
LDI R17, $35
CPC R13, R17
BRCC LN5
DEC R0
MOV R17, R15
OR R17, R14
OR R17, R13
MOV R12, R17
BREQ LN5A
RCALL KP2
LSL R19
ROL R10
ROL R11
LSR R13
ROR R14
ROR R15
LDI R17,$80
OR R13,R17
LDI R17, $7E
MOV R12,R17
RJMP LNTLP
LN5:ORI R16, $80
RCALL KP2
RCALL NEG3A
LDI R17,$80
ADD R9,R17
LSR R13
ROR R14
ROR R15
LDI R17,$C0
OR R13,R17
LDI R17,$7F
MOV R12,R17
LNTLP:LSL R11
ROL R10
ROL R9
DEC R12
SBRS R9,7
RJMP LNTLP
RCALL FPD3
PUSH R0
RCALL FPLN1
.DB $7E,$12,$49,$25
.DB $7E,$4C,$CC,$CD
.DB $7F,$2A,$AA,$AB
.DB $81,$00,$00,$00
.DB $01,$00
INC R12
POP R0
LN5A:LDI R17,$80
ADD R0,R17
BREQ LN53
BRCS LN51
NEG R0
INC R16
LN51:RCALL LD1
MOV R13,R0
RCALL NRML
RCALL GLN2
RCALL FPMU
RCALL GET1
SBRS R16,0
RJMP LN52
RCALL FPSU
RET
LN52:RCALL FPAD
LN53:RET
KP2:MOV R8,R12
MOV R9, R13
MOV R10,R14
MOV R11,R15
RET
NEG3A:COM R11
COM R10
COM R9
INC3A:LDI R17,255
SUB R11,R17
SBC R10,R17
SBC R9,R17
RET
;FPDI 子程序
FPDI:TST R12
BREQ OV3
TST R8
BRNE D1
RJMP G0 ;被除数为0,商为0
D1: NEG R12 ;除数阶码求补,以加补码代替减原码
RCALL DP
BRCS OV3
BREQ OV3
LDI R17, $80
OR R9,R17
OR R13,R17 ;恢复尾数最高位
FPD3:LDI R17,25 ;左移相减试商25次,最后一次舍入
SUB R11,R15
SBC R10,R14
SBC R9,R13
BRCS D2 ;第一次尾数相减试商
INC R12 ;够减,商阶增1
SEC
BRNE D3 ;商阶增1后不为0,转计商;否则为益出
OV3:SEV
RET
D2: ADD R11, R15
ADC R10,R14
ADC R9,R13 ;不够减则恢复被除数
LOOP2:LSL R11
ROL R10
ROL R9 ;被除数算术左移
BRCS D4 ;进位位为1,够减,本位商1
SUB R11,R15
SBC R10,R14
SBC R9,R13 ;否则相减试商
BRCS D2A
SEC
RJMP D3 ;够减,本位商1
D2A:ADD R11,R15 ;不够减,恢复被除数
ADC R10,R14
ADC R9,R13
CLC ;本位商0
RJMP D3
D4: SUB R11,R15
SBC R10,R14
SBC R9,R13 ;被除数减去除数
D3: DEC R17
BRNE D5 ;除法未完成,循环
MOV R13,R5
MOV R14,R6
MOV R15,R7 ; 取回商
BRCC COM3
RCALL INC3 ;第25位商舍入
COM3:LDI R17,$7F
SBRS R16,7
AND R13,R17 ;配置商数符
DON3:RET
D5:ROL R7 ;在R5R6R7中记商
ROL R6
ROL R5
RJMP LOOP2 ; 商数左移1位并记商
;//FPLN
FPLN1:ORI R16,$10
RCALL LD3
RCALL KP2
RCALL FPMU
RJMP FLN0
FPLN2:ANDI R16,$EF
FLN0:RCALL LD1
POP R31
POP R30
LSL R30
ROL R31
LPM
MOV R8,R0
ADIW R30,1
LPM
MOV R9,R0
ADIW R30,1
LPM
MOV R10,R0
ADIW R30,1
LPM
MOV R11,R0
ADIW R30,1
PLN:RCALL M1
LPM
MOV R8,R0
ADIW R30,1
LPM
MOV R9,R0
ADIW R30,1
LPM
MOV R10,R0
ADIW R30,1
LPM
MOV R11,R0
ADIW R30,1
RCALL FPLAD
LPM
RCALL GET1
DEC R0
BRNE PLN
PEND:SBRS R16,4
RJMP REND
RCALL GET3
RCALL M1
REND:LSR R31
ROR R30
ADIW R30,1
IJMP
LD3:STS $78,R12 ;存浮点数
STS $79,R13
STS $7A,R14
STS $7B,R15
RET
;FPMU子程序
FPMU:TST R8
BREQ M0 ; 被乘数为0,积为0
TST R12
BRNE M1 ; 乘数为0,积也为0
M0: RJMP G0
M1: RCALL DP
BRCS OV2
BREQ OV2
LDI R17,$80
OR R9,R17
OR R13,R17
MOV R5, R13
MOV R6,R14
MOV R7, R15
LDI R17, 25
CLR R13
CLR R14
CLR R15
CLC
LOOP1:BRCC M2
ADD R15,R11
ADC R14,R10
ADC R13,R9
M2: ROR R13
ROR R14
ROR R15
ROR R5
ROR R6
ROR R7
DEC R17
BRNE LOOP1
SBRC R13,7
RJMP M3
ROL R5
ROL R15
ROL R14
ROL R13
SBRS R5,7
RJMP M5
RCALL INC3
BRNE M5
SEC
ROR R13
RJMP COM2
M5:DEC R12
BRNE COM2
OV2: SEV
RET
M3:SBRC R5,7
RCALL INC3
COM2:LDI R17,$7F
SBRS R16,7
AND R13,R17
DON2:RET
DP: ANDI R16,$7F ;处理积/商数符,计算积/商阶码子程序
SBRC R9,7
SUBI R16,$80
SBRC R13,7
SUBI R16,$80 ;积/商符号放在R16,7
ADD R12,R8 ;移码相加
LDI R17,$80
BRCC DP1
ADD R12,R17 ; 移码求和有进位,将和再加上$80,再进位为溢出
RET
DP1: SUB R12,R17 ;移码求和无进位,将和减去$80,有借位或差为0为溢出
RET
LD1: STS $70,R12
STS $71,R13
STS $72,R14
STS $73,R15
RET
NRML:ANDI R16,$BF
CLR R14
CLR R15
LDI R20, $88
MOV R12,R20
RJMP NMLOP
GLN2:LDI R17, $80
MOV R8,R17
LDI R17,$31
MOV R9,R17
LDI R17,$72
MOV R10,R17
LDI R17,$18 ; 此处计算LN2
MOV R11,R17
RET
GET1:LDS R8,$70 ;取浮点数
LDS R9, $71
LDS R10,$72
LDS R11,$73
RET
;//FPSU 子程序
FPSU: LDI R17, $80 ;浮点减法子程序
SUB R13,R17
FPAD:TST R8
BREQ DON1
TST R12
BRNE FPLAD
SAV0:MOV R12,R8
MOV R13,R9
MOV R14,R10
MOV R15,R11
DON1:RET
FPLAD:ANDI R16,$3F
SBRC R9,7
ORI R16,$80
SBRC R13,7
ORI R16,$40
LDI R17,$80
OR R9,R17
OR R13,R17
MOV R17,R12
SUB R17,R8
BREQ GOON
BRCC NX3
NEG R17
CPI R17,24
BRCC EXADP
NX2A:LSR R13
ROR R14
ROR R15
DEC R17
BRNE NX2A
MOV R12,R8
BRCC GOON
RCALL INC3
RJMP GOON
EXADP:RJMP EXAD
NX3:CPI R17,24
BRCC COM1
LOOP:LSR R9
ROR R10
ROR R11
DEC R17
BRNE LOOP
BRCC GOON
RCALL INC3A
GOON:SBRC R16,6
SUBI R16,$80
SBRS R16,7
RJMP SAMS
SUB R15,R11
SBC R14,R10
SBC R13,R9
BRCC NOM
SUBI R16,$40
RCALL NEG3
NOM:MOV R17,R13
OR R17,R14
OR R17,R15
BREQ DONO
NMLOP:SBRC R13,7
RJMP COM1
LSL R15
ROL R14
ROL R13
DEC R12
BRNE NMLOP
OV1:SEV
RET
SAMS:ADD R15,R11
ADD R14,R10
ADD R13,R9
BRCC COM1
ROR R13
ROR R14
ROR R15
INC R12
BREQ OV1
BRNE COM1
RCALL INC3
COM1:SBRC R16,6 ;CLV
RET
COMA:LDI R17,$7F
AND R13,R17
DON:RET
EXAD:RCALL SAV0
SBRS R16,7
RJMP COMA
RET
DONO:CLR R12
RET
GLN10:LDI R17,$82
MOV R8,R17
LDI R17,$13
MOV R9,R17
LDI R17,$5D
MOV R10,R17
LDI R17,$8E
MOV R11,R17
RET |
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|