📄 fp-52.sdi
字号:
,,, ;
,,, ; Now see how many zeros their are
,,, ;
1A42,78 2B,FSUB6,FSUB6: MOV R0,#FP_DIG12
1A44,7F 00,, MOV R7,#0
,,, ;
1A46,E6,FSUB7,FSUB7: MOV A,@R0
1A47,70 08,, JNZ FSUB8
1A49,0F,, INC R7
1A4A,0F,, INC R7
1A4B,08,, INC R0
1A4C,B8 2F F7,, CJNE R0,#FP_SIGN,FSUB7
1A4F,61 B8,, AJMP ZERO_AND_EXIT
,,, ;
1A51,B4 10 00,FSUB8,FSUB8: CJNE A,#10H,$+3
1A54,50 01,, JNC FSUB9
1A56,0F,, INC R7
,,, ;
,,, ; Now R7 has the number of leading zeros in the FP ACC
,,, ;
1A57,E5 30,FSUB9,FSUB9: MOV A,FP_EXP ;GET THE OLD EXPONENT
1A59,C3,, CLR C
1A5A,9F,, SUBB A,R7 ;SUBTRACT FROM THE NUMBER OF ZEROS
1A5B,60 0B,, JZ FSUB10
1A5D,40 09,, JC FSUB10
,,, ;
1A5F,F5 30,, MOV FP_EXP,A ;SAVE THE NEW EXPONENT
,,, ;
1A61,91 02,, ACALL LEFT1 ;SHIFT THE FP ACC
1A63,75 2A 00,, MOV FP_CARRY,#0
1A66,61 70,, AJMP STORE_ALIGN_TEST_AND_EXIT
,,, ;
1A68,61 B2,FSUB10,FSUB10: AJMP UNDERFLOW_AND_EXIT
,,, ;
,,,$EJECT
,,, ;***************************************************************
,,, ;
1A6A,,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
,,, ;
,,, ;***************************************************************
,,, ;
1A6A,91 77,, ACALL MDES1 ;SET UP THE REGISTERS
1A6C,E5 09,, MOV A,ARG_STACK
1A6E,24 0C,, ADD A,#FP_NUMBER_SIZE+FP_NUMBER_SIZE
1A70,F5 09,, MOV ARG_STACK,A ;POP THE STACK TWICE, CLEAR THE CARRY
1A72,EE,, MOV A,R6 ;CHECK OUT EXPONENTS
1A73,C2 D5,, CLR F0
1A75,9F,, SUBB A,R7
1A76,60 0A,, JZ EXPONENTS_EQUAL
1A78,40 03,, JC ARG1_EXP_IS_LARGER
,,, ;
,,, ; Now the ARG2 EXPONENT is > ARG1 EXPONENT
,,, ;
1A7A,,SIGNS_DIFFERENT,SIGNS_DIFFERENT:
,,, ;
1A7A,EB,, MOV A,R3 ;SEE IF SIGN OF ARG2 IS POSITIVE
1A7B,80 01,, SJMP $+3
,,, ;
1A7D,,ARG1_EXP_IS_LARGER,ARG1_EXP_IS_LARGER:
,,, ;
1A7D,EC,, MOV A,R4 ;GET THE SIGN OF ARG1 EXPONENT
1A7E,60 01,, JZ $+3
1A80,B3,, CPL C
1A81,22,, RET
,,, ;
1A82,,EXPONENTS_EQUAL,EXPONENTS_EQUAL:
,,, ;
,,, ; First, test the sign, then the mantissa
,,, ;
1A82,BD 00 F5,, CJNE R5,#0,SIGNS_DIFFERENT
,,, ;
1A85,,BOTH_PLUS,BOTH_PLUS:
,,, ;
1A85,7F 04,, MOV R7,#DIGIT ;POINT AT MS DIGIT
1A87,18,, DEC R0
1A88,18,, DEC R0
1A89,18,, DEC R0
1A8A,19,, DEC R1
1A8B,19,, DEC R1
1A8C,19,, DEC R1
,,, ;
,,, ; Now do the compare
,,, ;
1A8D,E2,CLOOP,CLOOP: MOVX A,@R0
1A8E,FE,, MOV R6,A
1A8F,E3,, MOVX A,@R1
1A90,9E,, SUBB A,R6
1A91,70 EA,, JNZ ARG1_EXP_IS_LARGER
1A93,08,, INC R0
1A94,09,, INC R1
1A95,DF F6,, DJNZ R7,CLOOP
,,, ;
,,, ; If here, the numbers are the same, the carry is cleared
,,, ;
1A97,D2 D5,, SETB F0
1A99,22,, RET ;EXIT WITH EQUAL
,,, ;
,,,$EJECT
,,,;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
,,,;
1A9A,,FLOATING_MUL,FLOATING_MUL: ; Floating point multiply
,,,;
,,,;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
,,,;
1A9A,91 75,, ACALL MUL_DIV_EXP_AND_SIGN
,,, ;
,,, ; check for zero exponents
,,, ;
1A9C,BE 00 02,, CJNE R6,#00,$+5 ;ARG 2 EXP ZERO?
1A9F,61 B8,, AJMP ZERO_AND_EXIT
,,, ;
,,, ; calculate the exponent
,,, ;
1AA1,8D 2F,FMUL1,FMUL1: MOV FP_SIGN,R5 ;SAVE THE SIGN, IN CASE OF FAILURE
,,, ;
1AA3,EF,, MOV A,R7
1AA4,60 F9,, JZ FMUL1-2
1AA6,2E,, ADD A,R6 ;ADD THE EXPONENTS
1AA7,20 E7 05,, JB ACC.7,FMUL_OVER
1AAA,10 D7 06,, JBC CY,FMUL2 ;SEE IF CARRY IS SET
,,, ;
1AAD,61 B2,, AJMP UNDERFLOW_AND_EXIT
,,, ;
1AAF,,FMUL_OVER,FMUL_OVER:
,,, ;
1AAF,50 02,, JNC FMUL2 ;OK IF SET
,,, ;
1AB1,61 A1,FOV,FOV: AJMP OVERFLOW_AND_EXIT
,,, ;
1AB3,94 81,FMUL2,FMUL2: SUBB A,#129 ;SUBTRACT THE EXPONENT BIAS
1AB5,FE,, MOV R6,A ;SAVE IT FOR LATER
,,, ;
,,, ; Unpack and load R0
,,, ;
1AB6,71 8B,, ACALL UNPACK_R0
,,, ;
,,, ; Now set up for loop multiply
,,, ;
1AB8,7B 04,, MOV R3,#DIGIT
1ABA,AC 01,, MOV R4,R1B0
,,, ;
,,,$EJECT
,,, ;
,,, ; Now, do the multiply and accumulate the product
,,, ;
1ABC,8C 01,FMUL3,FMUL3: MOV R1B0,R4
1ABE,E3,, MOVX A,@R1
1ABF,FA,, MOV R2,A
1AC0,91 38,, ACALL MUL_NIBBLE
,,, ;
1AC2,EA,, MOV A,R2
1AC3,C4,, SWAP A
1AC4,91 38,, ACALL MUL_NIBBLE
1AC6,1C,, DEC R4
1AC7,DB F3,, DJNZ R3,FMUL3
,,, ;
,,, ; Now, pack and restore the sign
,,, ;
1AC9,8E 30,, MOV FP_EXP,R6
1ACB,8D 2F,, MOV FP_SIGN,R5
1ACD,61 30,, AJMP PACK ;FINISH IT OFF
,,, ;
,,,$EJECT
,,, ;DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
,,, ;
1ACF,,FLOATING_DIV,FLOATING_DIV:
,,, ;
,,, ;DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
,,, ;
1ACF,91 77,, ACALL MDES1
,,, ;
,,, ; Check the exponents
,,, ;
1AD1,8D 2F,, MOV FP_SIGN,R5 ;SAVE THE SIGN
1AD3,BF 00 06,, CJNE R7,#0,DIV0 ;CLEARS THE CARRY
1AD6,71 A1,, ACALL OVERFLOW_AND_EXIT
1AD8,E4,, CLR A
1AD9,D2 E3,, SETB ACC.ZERO_DIVIDE
1ADB,22,, RET
,,, ;
1ADC,EE,DIV0,DIV0: MOV A,R6 ;GET EXPONENT
1ADD,60 C0,, JZ FMUL1-2 ;EXIT IF ZERO
1ADF,9F,, SUBB A,R7 ;DELTA EXPONENT
1AE0,20 E7 04,, JB ACC.7,D_UNDER
1AE3,50 04,, JNC DIV3
1AE5,61 B2,, AJMP UNDERFLOW_AND_EXIT
,,, ;
1AE7,50 C8,D_UNDER,D_UNDER:JNC FOV
,,, ;
1AE9,24 81,DIV3,DIV3: ADD A,#129 ;CORRECTLY BIAS THE EXPONENT
1AEB,F5 30,, MOV FP_EXP,A ;SAVE THE EXPONENT
1AED,91 88,, ACALL LOADR1_MANTISSA ;LOAD THE DIVIDED
,,, ;
1AEF,7A 34,, MOV R2,#FP_ACCC ;SAVE LOCATION
1AF1,AB 00,, MOV R3,R0B0 ;SAVE POINTER IN R3
1AF3,75 2A 00,, MOV FP_CARRY,#0 ;ZERO CARRY BYTE
,,, ;
1AF6,7D FF,DIV4,DIV4: MOV R5,#0FFH ;LOOP COUNT
1AF8,D3,, SETB C
,,, ;
1AF9,8B 00,DIV5,DIV5: MOV R0B0,R3 ;RESTORE THE EXTERNAL POINTER
1AFB,79 2E,, MOV R1,#FP_DIG78 ;SET UP INTERNAL POINTER
1AFD,7F 04,, MOV R7,#DIGIT ;LOOP COUNT
1AFF,50 17,, JNC DIV7 ;EXIT IF NO CARRY
,,, ;
1B01,E2,DIV6,DIV6: MOVX A,@R0 ;DO ACCUMLATION
1B02,FE,, MOV R6,A
1B03,E4,, CLR A
1B04,34 99,, ADDC A,#99H
1B06,9E,, SUBB A,R6
1B07,27,, ADD A,@R1
1B08,D4,, DA A
1B09,F7,, MOV @R1,A
1B0A,18,, DEC R0
1B0B,19,, DEC R1
1B0C,DF F3,, DJNZ R7,DIV6 ;LOOP
,,, ;
1B0E,0D,, INC R5 ;SUBTRACT COUNTER
1B0F,40 E8,, JC DIV5 ;KEEP LOOPING IF CARRY
1B11,E7,, MOV A,@R1 ;GET CARRY
1B12,94 01,, SUBB A,#1 ;CARRY IS CLEARED
1B14,F7,, MOV @R1,A ;SAVE CARRY DIGIT
1B15,B3,, CPL C
1B16,80 E1,, SJMP DIV5 ;LOOP
,,, ;
,,, ; Restore the result if carry was found
,,, ;
1B18,51 19,DIV7,DIV7: ACALL ADDLP ;ADD NUMBER BACK
1B1A,77 00,, MOV @R1,#0 ;CLEAR CARRY
1B1C,8A 00,, MOV R0B0,R2 ;GET SAVE COUNTER
1B1E,A6 05,, MOV @R0,5 ;SAVE COUNT BYTE
,,, ;
1B20,0A,, INC R2 ;ADJUST SAVE COUNTER
1B21,7F 01,, MOV R7,#1 ;BUMP DIVIDEND
1B23,91 00,, ACALL LEFT
1B25,BA 3E CE,, CJNE R2,#FP_ACC8+2,DIV4
,,, ;
1B28,D5 30 02,, DJNZ FP_EXP,DIV8
1B2B,61 B2,, AJMP UNDERFLOW_AND_EXIT
,,, ;
1B2D,75 2A 00,DIV8,DIV8: MOV FP_CARRY,#0
,,, ;
,,,$EJECT
,,, ;***************************************************************
,,, ;
1B30,,PACK,PACK: ; Pack the mantissa
,,, ;
,,, ;***************************************************************
,,, ;
,,, ; First, set up the pointers
,,, ;
1B30,78 34,, MOV R0,#FP_ACCC
1B32,E6,, MOV A,@R0 ;GET FP_ACCC
1B33,FE,, MOV R6,A ;SAVE FOR ZERO COUNT
1B34,60 03,, JZ PACK0 ;JUMP OVER IF ZERO
1B36,71 7F,, ACALL INC_FP_EXP ;BUMP THE EXPONENT
1B38,18,, DEC R0
,,, ;
1B39,08,PACK0,PACK0: INC R0 ;POINT AT FP_ACC1
,,, ;
1B3A,74 08,PACK1,PACK1: MOV A,#8 ;ADJUST NIBBLE POINTER
1B3C,F9,, MOV R1,A
1B3D,28,, ADD A,R0
1B3E,F8,, MOV R0,A
1B3F,B6 05 00,, CJNE @R0,#5,$+3 ;SEE IF ADJUSTING NEEDED
1B42,40 13,, JC PACK3+1
,,, ;
1B44,D3,PACK2,PACK2: SETB C
1B45,E4,, CLR A
1B46,18,, DEC R0
1B47,36,, ADDC A,@R0
1B48,D4,, DA A
1B49,D6,, XCHD A,@R0 ;SAVE THE VALUE
1B4A,30 E4 09,, JNB ACC.4,PACK3
1B4D,D9 F5,, DJNZ R1,PACK2
,,, ;
1B4F,18,, DEC R0
1B50,76 01,, MOV @R0,#1
1B52,71 7F,, ACALL INC_FP_EXP
1B54,80 06,, SJMP PACK4
,,, ;
1B56,19,PACK3,PACK3: DEC R1
1B57,E9,, MOV A,R1
1B58,C3,, CLR C
1B59,C8,, XCH A,R0
1B5A,98,, SUBB A,R0
1B5B,F8,, MOV R0,A
,,, ;
1B5C,79 2B,PACK4,PACK4: MOV R1,#FP_DIG12
,,, ;
,,, ; Now, pack
,,, ;
1B5E,E6,PLOOP,PLOOP: MOV A,@R0
1B5F,C4,, SWAP A ;FLIP THE DIGITS
1B60,08,, INC R0
1B61,D6,, XCHD A,@R0
1B62,42 06,, ORL 6,A ;ACCUMULATE THE OR'ED DIGITS
1B64,F7,, MOV @R1,A
1B65,08,, INC R0
1B66,09,, INC R1
1B67,B9 2F F4,, CJNE R1,#FP_SIGN,PLOOP
1B6A,EE,, MOV A,R6
1B6B,70 03,, JNZ STORE_ALIGN_TEST_AND_EXIT
1B6D,75 30 00,, MOV FP_EXP,#0 ;ZERO EXPONENT
,,, ;
,,, ;**************************************************************
,,, ;
1B70,,STORE_ALIGN_TEST_AND_EXIT,STORE_ALIGN_TEST_AND_EXIT: ;Save the number align carry and exit
,,, ;
,,, ;**************************************************************
,,, ;
1B70,91 6B,, ACALL LOAD_POINTERS
1B72,89 09,, MOV ARG_STACK,R1 ;SET UP THE NEW STACK
1B74,78 30,, MOV R0,#FP_EXP
,,, ;
,,, ; Now load the numbers
,,, ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -