📄 fp52.sdi
字号:
00AC,79 2E,, MOV R1,#FP_DIG78
00AE,7F 04,, MOV R7,#DIGIT ;LOOP COUNT
,,, ;
00B0,74 9A,FSUB5,FSUB5: MOV A,#9AH
00B2,97,, SUBB A,@R1
00B3,24 00,, ADD A,#0
00B5,D4,, DA A
00B6,F7,, MOV @R1,A
00B7,19,, DEC R1
00B8,B3,, CPL C
00B9,DF F5,, DJNZ R7,FSUB5 ;LOOP
,,, ;
,,, ; Now see how many zeros their are
,,, ;
00BB,78 2B,FSUB6,FSUB6: MOV R0,#FP_DIG12
00BD,7F 00,, MOV R7,#0
,,, ;
00BF,E6,FSUB7,FSUB7: MOV A,@R0
00C0,70 08,, JNZ FSUB8
00C2,0F,, INC R7
00C3,0F,, INC R7
00C4,08,, INC R0
00C5,B8 2F F7,, CJNE R0,#FP_SIGN,FSUB7
00C8,41 32,, AJMP ZERO_AND_EXIT
,,, ;
00CA,B4 10 00,FSUB8,FSUB8: CJNE A,#10H,$+3
00CD,50 01,, JNC FSUB9
00CF,0F,, INC R7
,,, ;
,,, ; Now R7 has the number of leading zeros in the FP ACC
,,, ;
00D0,E5 30,FSUB9,FSUB9: MOV A,FP_EXP ;GET THE OLD EXPONENT
00D2,C3,, CLR C
00D3,9F,, SUBB A,R7 ;SUBTRACT FROM THE NUMBER OF ZEROS
00D4,60 0B,, JZ FSUB10
00D6,40 09,, JC FSUB10
,,, ;
00D8,F5 30,, MOV FP_EXP,A ;SAVE THE NEW EXPONENT
,,, ;
00DA,51 7C,, ACALL LEFT1 ;SHIFT THE FP ACC
00DC,75 2A 00,, MOV FP_CARRY,#0
00DF,21 EA,, AJMP STORE_ALIGN_TEST_AND_EXIT
,,, ;
00E1,41 2C,FSUB10,FSUB10: AJMP UNDERFLOW_AND_EXIT
,,, ;
,,,$EJECT
,,, ;***************************************************************
,,, ;
00E3,,FLOATING_COMP,FLOATING_COMP: ; Compare two floating point numbers
,,, ; used for relational operations and is faster
,,, ; than subtraction. ON RETURN, The carry is set
,,, ; if ARG1 is > ARG2, else carry is not set
,,, ; if ARG1 = ARG2, F0 gets set
,,, ;
,,, ;***************************************************************
,,, ;
00E3,51 F1,, ACALL MDES1 ;SET UP THE REGISTERS
00E5,E5 24,, MOV A,ARG_STACK
00E7,24 0C,, ADD A,#FP_NUMBER_SIZE+FP_NUMBER_SIZE
00E9,F5 24,, MOV ARG_STACK,A ;POP THE STACK TWICE, CLEAR THE CARRY
00EB,EE,, MOV A,R6 ;CHECK OUT EXPONENTS
00EC,C2 D5,, CLR F0
00EE,C3,, CLR C
00EF,9F,, SUBB A,R7
00F0,60 0A,, JZ EXPONENTS_EQUAL
00F2,40 03,, JC ARG1_EXP_IS_LARGER
,,, ;
,,, ; Now the ARG2 EXPONENT is > ARG1 EXPONENT
,,, ;
00F4,,SIGNS_DIFFERENT,SIGNS_DIFFERENT:
,,, ;
00F4,EB,, MOV A,R3 ;SEE IF SIGN OF ARG2 IS POSITIVE
00F5,80 01,, SJMP $+3
,,, ;
00F7,,ARG1_EXP_IS_LARGER,ARG1_EXP_IS_LARGER:
,,, ;
00F7,EC,, MOV A,R4 ;GET THE SIGN OF ARG1 EXPONENT
00F8,60 01,, JZ $+3
00FA,B3,, CPL C
00FB,22,, RET
,,, ;
00FC,,EXPONENTS_EQUAL,EXPONENTS_EQUAL:
,,, ;
,,, ; First, test the sign, then the mantissa
,,, ;
00FC,BD 00 F5,, CJNE R5,#0,SIGNS_DIFFERENT
,,, ;
00FF,,BOTH_PLUS,BOTH_PLUS:
,,, ;
00FF,7F 04,, MOV R7,#DIGIT ;POINT AT MS DIGIT
0101,18,, DEC R0
0102,18,, DEC R0
0103,18,, DEC R0
0104,19,, DEC R1
0105,19,, DEC R1
0106,19,, DEC R1
,,, ;
,,, ; Now do the compare
,,, ;
0107,E2,CLOOP,CLOOP: MOVX A,@R0
0108,FE,, MOV R6,A
0109,E3,, MOVX A,@R1
010A,9E,, SUBB A,R6
010B,70 EA,, JNZ ARG1_EXP_IS_LARGER
010D,08,, INC R0
010E,09,, INC R1
010F,DF F6,, DJNZ R7,CLOOP
,,, ;
,,, ; If here, the numbers are the same, the carry is cleared
,,, ;
0111,D2 D5,, SETB F0
0113,22,, RET ;EXIT WITH EQUAL
,,, ;
,,,$EJECT
,,,;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
,,,;
0114,,FLOATING_MUL,FLOATING_MUL: ; Floating point multiply
,,,;
,,,;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
,,,;
0114,51 EF,, ACALL MUL_DIV_EXP_AND_SIGN
,,, ;
,,, ; check for zero exponents
,,, ;
0116,BE 00 02,, CJNE R6,#00,$+5 ;ARG 2 EXP ZERO?
0119,41 32,, AJMP ZERO_AND_EXIT
,,, ;
,,, ; calculate the exponent
,,, ;
011B,8D 2F,FMUL1,FMUL1: MOV FP_SIGN,R5 ;SAVE THE SIGN, IN CASE OF FAILURE
,,, ;
011D,EF,, MOV A,R7
011E,60 F9,, JZ FMUL1-2
0120,2E,, ADD A,R6 ;ADD THE EXPONENTS
0121,20 E7 05,, JB ACC.7,FMUL_OVER
0124,10 D7 06,, JBC CY,FMUL2 ;SEE IF CARRY IS SET
,,, ;
0127,41 2C,, AJMP UNDERFLOW_AND_EXIT
,,, ;
0129,,FMUL_OVER,FMUL_OVER:
,,, ;
0129,50 02,, JNC FMUL2 ;OK IF SET
,,, ;
012B,41 1B,FOV,FOV: AJMP OVERFLOW_AND_EXIT
,,, ;
012D,94 81,FMUL2,FMUL2: SUBB A,#129 ;SUBTRACT THE EXPONENT BIAS
012F,FE,, MOV R6,A ;SAVE IT FOR LATER
,,, ;
,,, ; Unpack and load R0
,,, ;
0130,51 05,, ACALL UNPACK_R0
,,, ;
,,, ; Now set up for loop multiply
,,, ;
0132,7B 04,, MOV R3,#DIGIT
0134,AC 01,, MOV R4,R1B0
,,, ;
,,,$EJECT
,,, ;
,,, ; Now, do the multiply and accumulate the product
,,, ;
0136,8C 01,FMUL3,FMUL3: MOV R1B0,R4
0138,E3,, MOVX A,@R1
0139,FA,, MOV R2,A
013A,51 B2,, ACALL MUL_NIBBLE
,,, ;
013C,EA,, MOV A,R2
013D,C4,, SWAP A
013E,51 B2,, ACALL MUL_NIBBLE
0140,1C,, DEC R4
0141,DB F3,, DJNZ R3,FMUL3
,,, ;
,,, ; Now, pack and restore the sign
,,, ;
0143,8E 30,, MOV FP_EXP,R6
0145,8D 2F,, MOV FP_SIGN,R5
0147,21 AA,, AJMP PACK ;FINISH IT OFF
,,, ;
,,,$EJECT
,,, ;DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
,,, ;
0149,,FLOATING_DIV,FLOATING_DIV:
,,, ;
,,, ;DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
,,, ;
0149,51 F1,, ACALL MDES1
,,, ;
,,, ; Check the exponents
,,, ;
014B,8D 2F,, MOV FP_SIGN,R5 ;SAVE THE SIGN
014D,BF 00 06,, CJNE R7,#0,DIV0 ;CLEARS THE CARRY
0150,51 1B,, ACALL OVERFLOW_AND_EXIT
0152,E4,, CLR A
0153,D2 E3,, SETB ACC.ZERO_DIVIDE
0155,22,, RET
,,, ;
0156,EE,DIV0,DIV0: MOV A,R6 ;GET EXPONENT
0157,60 C0,, JZ FMUL1-2 ;EXIT IF ZERO
0159,9F,, SUBB A,R7 ;DELTA EXPONENT
015A,20 E7 04,, JB ACC.7,D_UNDER
015D,50 04,, JNC DIV3
015F,41 2C,, AJMP UNDERFLOW_AND_EXIT
,,, ;
0161,50 C8,D_UNDER,D_UNDER:JNC FOV
,,, ;
0163,24 81,DIV3,DIV3: ADD A,#129 ;CORRECTLY BIAS THE EXPONENT
0165,F5 30,, MOV FP_EXP,A ;SAVE THE EXPONENT
0167,71 02,, ACALL LOADR1_MANTISSA ;LOAD THE DIVIDED
,,, ;
0169,7A 34,, MOV R2,#FP_ACCC ;SAVE LOCATION
016B,AB 00,, MOV R3,R0B0 ;SAVE POINTER IN R3
016D,75 2A 00,, MOV FP_CARRY,#0 ;ZERO CARRY BYTE
,,, ;
0170,7D FF,DIV4,DIV4: MOV R5,#0FFH ;LOOP COUNT
0172,D3,, SETB C
,,, ;
0173,8B 00,DIV5,DIV5: MOV R0B0,R3 ;RESTORE THE EXTERNAL POINTER
0175,79 2E,, MOV R1,#FP_DIG78 ;SET UP INTERNAL POINTER
0177,7F 04,, MOV R7,#DIGIT ;LOOP COUNT
0179,50 17,, JNC DIV7 ;EXIT IF NO CARRY
,,, ;
017B,E2,DIV6,DIV6: MOVX A,@R0 ;DO ACCUMLATION
017C,FE,, MOV R6,A
017D,E4,, CLR A
017E,34 99,, ADDC A,#99H
0180,9E,, SUBB A,R6
0181,27,, ADD A,@R1
0182,D4,, DA A
0183,F7,, MOV @R1,A
0184,18,, DEC R0
0185,19,, DEC R1
0186,DF F3,, DJNZ R7,DIV6 ;LOOP
,,, ;
0188,0D,, INC R5 ;SUBTRACT COUNTER
0189,40 E8,, JC DIV5 ;KEEP LOOPING IF CARRY
018B,E7,, MOV A,@R1 ;GET CARRY
018C,94 01,, SUBB A,#1 ;CARRY IS CLEARED
018E,F7,, MOV @R1,A ;SAVE CARRY DIGIT
018F,B3,, CPL C
0190,80 E1,, SJMP DIV5 ;LOOP
,,, ;
,,, ; Restore the result if carry was found
,,, ;
0192,11 92,DIV7,DIV7: ACALL ADDLP ;ADD NUMBER BACK
0194,77 00,, MOV @R1,#0 ;CLEAR CARRY
0196,8A 00,, MOV R0B0,R2 ;GET SAVE COUNTER
0198,A6 05,, MOV @R0,5 ;SAVE COUNT BYTE
,,, ;
019A,0A,, INC R2 ;ADJUST SAVE COUNTER
019B,7F 01,, MOV R7,#1 ;BUMP DIVIDEND
019D,51 7A,, ACALL LEFT
019F,BA 3E CE,, CJNE R2,#FP_ACC8+2,DIV4
,,, ;
01A2,D5 30 02,, DJNZ FP_EXP,DIV8
01A5,41 2C,, AJMP UNDERFLOW_AND_EXIT
,,, ;
01A7,75 2A 00,DIV8,DIV8: MOV FP_CARRY,#0
,,, ;
,,,$EJECT
,,, ;***************************************************************
,,, ;
01AA,,PACK,PACK: ; Pack the mantissa
,,, ;
,,, ;***************************************************************
,,, ;
,,, ; First, set up the pointers
,,, ;
01AA,78 34,, MOV R0,#FP_ACCC
01AC,E6,, MOV A,@R0 ;GET FP_ACCC
01AD,FE,, MOV R6,A ;SAVE FOR ZERO COUNT
01AE,60 03,, JZ PACK0 ;JUMP OVER IF ZERO
01B0,31 F9,, ACALL INC_FP_EXP ;BUMP THE EXPONENT
01B2,18,, DEC R0
,,, ;
01B3,08,PACK0,PACK0: INC R0 ;POINT AT FP_ACC1
,,, ;
01B4,74 08,PACK1,PACK1: MOV A,#8 ;ADJUST NIBBLE POINTER
01B6,F9,, MOV R1,A
01B7,28,, ADD A,R0
01B8,F8,, MOV R0,A
01B9,B6 05 00,, CJNE @R0,#5,$+3 ;SEE IF ADJUSTING NEEDED
01BC,40 13,, JC PACK3+1
,,, ;
01BE,D3,PACK2,PACK2: SETB C
01BF,E4,, CLR A
01C0,18,, DEC R0
01C1,36,, ADDC A,@R0
01C2,D4,, DA A
01C3,D6,, XCHD A,@R0 ;SAVE THE VALUE
01C4,30 E4 09,, JNB ACC.4,PACK3
01C7,D9 F5,, DJNZ R1,PACK2
,,, ;
01C9,18,, DEC R0
01CA,76 01,, MOV @R0,#1
01CC,31 F9,, ACALL INC_FP_EXP
01CE,80 06,, SJMP PACK4
,,, ;
01D0,19,PACK3,PACK3: DEC R1
01D1,E9,, MOV A,R1
01D2,C3,, CLR C
01D3,C8,, XCH A,R0
01D4,98,, SUBB A,R0
01D5,F8,, MOV R0,A
,,, ;
01D6,79 2B,PACK4,PACK4: MOV R1,#FP_DIG12
,,, ;
,,, ; Now, pack
,,, ;
01D8,E6,PLOOP,PLOOP: MOV A,@R0
01D9,C4,, SWAP A ;FLIP THE DIGITS
01DA,08,, INC R0
01DB,D6,, XCHD A,@R0
01DC,42 06,, ORL 6,A ;ACCUMULATE THE OR'ED DIGITS
01DE,F7,, MOV @R1,A
01DF,08,, INC R0
01E0,09,, INC R1
01E1,B9 2F F4,, CJNE R1,#FP_SIGN,PLOOP
01E4,EE,, MOV A,R6
01E5,70 03,, JNZ STORE_ALIGN_TEST_AND_EXIT
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -