📄 calc.sdi
字号:
01B9,D4,, DA A
01BA,CC,, XCH A,R4
01BB,70 01,, JNZ $+3
01BD,FC,, MOV R4,A
01BE,B4 50 00,, CJNE A,#50H,$+3 ;TEST FOR SUBTRACTION
01C1,30 33 18,, JNB ADD_IN,SUBLP ;DO SUBTRACTION IF NO ADD_IN
01C4,B3,, CPL C ;FLIP CARRY FOR ADDITION
01C5,31 D3,, ACALL ADDLP ;DO ADDITION
,,, ;
01C7,50 08,, JNC ADD_R
01C9,05 2A,, INC FP_CARRY
01CB,7F 01,, MOV R7,#1
01CD,71 83,, ACALL RIGHT
01CF,71 3A,, ACALL INC_FP_EXP ;SHIFT AND BUMP EXPONENT
,,, ;
01D1,61 2B,ADD_R,ADD_R: AJMP STORE_ALIGN_TEST_AND_EXIT
,,, ;
01D3,E2,ADDLP,ADDLP: MOVX A,@R0
01D4,37,, ADDC A,@R1
01D5,D4,, DA A
01D6,F7,, MOV @R1,A
01D7,18,, DEC R0
01D8,19,, DEC R1
01D9,DF F8,, DJNZ R7,ADDLP ;LOOP UNTIL DONE
01DB,22,, RET
,,, ;
,,,$EJECT
,,, ;
01DC,E2,SUBLP,SUBLP: MOVX A,@R0 ;NOW DO SUBTRACTION
01DD,FE,, MOV R6,A
01DE,E4,, CLR A
01DF,34 99,, ADDC A,#99H
01E1,97,, SUBB A,@R1
01E2,2E,, ADD A,R6
01E3,D4,, DA A
01E4,F7,, MOV @R1,A
01E5,18,, DEC R0
01E6,19,, DEC R1
01E7,DF F3,, DJNZ R7,SUBLP
01E9,40 11,, JC FSUB6
,,, ;
,,,$EJECT
,,, ;
,,, ; Need to complement the result and sign because the floating
,,, ; point accumulator mantissa was larger than the external
,,, ; memory and their signs were equal.
,,, ;
01EB,B2 78,, CPL FP_SIGN.0
01ED,79 2E,, MOV R1,#FP_DIG78
01EF,7F 04,, MOV R7,#DIGIT ;LOOP COUNT
,,, ;
01F1,74 9A,FSUB5,FSUB5: MOV A,#9AH
01F3,97,, SUBB A,@R1
01F4,24 00,, ADD A,#0
01F6,D4,, DA A
01F7,F7,, MOV @R1,A
01F8,19,, DEC R1
01F9,B3,, CPL C
01FA,DF F5,, DJNZ R7,FSUB5 ;LOOP
,,, ;
,,, ; Now see how many zeros their are
,,, ;
01FC,78 2B,FSUB6,FSUB6: MOV R0,#FP_DIG12
01FE,7F 00,, MOV R7,#0
,,, ;
0200,E6,FSUB7,FSUB7: MOV A,@R0
0201,70 08,, JNZ FSUB8
0203,0F,, INC R7
0204,0F,, INC R7
0205,08,, INC R0
0206,B8 2F F7,, CJNE R0,#FP_SIGN,FSUB7
0209,61 73,, AJMP ZERO_AND_EXIT
,,, ;
020B,B4 10 00,FSUB8,FSUB8: CJNE A,#10H,$+3
020E,50 01,, JNC FSUB9
0210,0F,, INC R7
,,, ;
,,, ; Now R7 has the number of leading zeros in the FP ACC
,,, ;
0211,E5 30,FSUB9,FSUB9: MOV A,FP_EXP ;GET THE OLD EXPONENT
0213,C3,, CLR C
0214,9F,, SUBB A,R7 ;SUBTRACT FROM THE NUMBER OF ZEROS
0215,60 0B,, JZ FSUB10
0217,40 09,, JC FSUB10
,,, ;
0219,F5 30,, MOV FP_EXP,A ;SAVE THE NEW EXPONENT
,,, ;
021B,71 BD,, ACALL LEFT1 ;SHIFT THE FP ACC
021D,75 2A 00,, MOV FP_CARRY,#0
0220,61 2B,, AJMP STORE_ALIGN_TEST_AND_EXIT
,,, ;
0222,61 6D,FSUB10,FSUB10: AJMP UNDERFLOW_AND_EXIT
,,, ;
,,,$EJECT
,,, ;***************************************************************
,,, ;
0224,,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
,,, ;
,,, ;***************************************************************
,,, ;
0224,91 32,, ACALL MDES1 ;SET UP THE REGISTERS
0226,E5 24,, MOV A,ARG_STACK
0228,24 0C,, ADD A,#FP_NUMBER_SIZE+FP_NUMBER_SIZE
022A,F5 24,, MOV ARG_STACK,A ;POP THE STACK TWICE, CLEAR THE CARRY
022C,EE,, MOV A,R6 ;CHECK OUT EXPONENTS
022D,C2 D5,, CLR F0
022F,C3,, CLR C
0230,9F,, SUBB A,R7
0231,60 0A,, JZ EXPONENTS_EQUAL
0233,40 03,, JC ARG1_EXP_IS_LARGER
,,, ;
,,, ; Now the ARG2 EXPONENT is > ARG1 EXPONENT
,,, ;
0235,,SIGNS_DIFFERENT,SIGNS_DIFFERENT:
,,, ;
0235,EB,, MOV A,R3 ;SEE IF SIGN OF ARG2 IS POSITIVE
0236,80 01,, SJMP $+3
,,, ;
0238,,ARG1_EXP_IS_LARGER,ARG1_EXP_IS_LARGER:
,,, ;
0238,EC,, MOV A,R4 ;GET THE SIGN OF ARG1 EXPONENT
0239,60 01,, JZ $+3
023B,B3,, CPL C
023C,22,, RET
,,, ;
023D,,EXPONENTS_EQUAL,EXPONENTS_EQUAL:
,,, ;
,,, ; First, test the sign, then the mantissa
,,, ;
023D,BD 00 F5,, CJNE R5,#0,SIGNS_DIFFERENT
,,, ;
0240,,BOTH_PLUS,BOTH_PLUS:
,,, ;
0240,7F 04,, MOV R7,#DIGIT ;POINT AT MS DIGIT
0242,18,, DEC R0
0243,18,, DEC R0
0244,18,, DEC R0
0245,19,, DEC R1
0246,19,, DEC R1
0247,19,, DEC R1
,,, ;
,,, ; Now do the compare
,,, ;
0248,E2,CLOOP,CLOOP: MOVX A,@R0
0249,FE,, MOV R6,A
024A,E3,, MOVX A,@R1
024B,9E,, SUBB A,R6
024C,70 EA,, JNZ ARG1_EXP_IS_LARGER
024E,08,, INC R0
024F,09,, INC R1
0250,DF F6,, DJNZ R7,CLOOP
,,, ;
,,, ; If here, the numbers are the same, the carry is cleared
,,, ;
0252,D2 D5,, SETB F0
0254,22,, RET ;EXIT WITH EQUAL
,,, ;
,,,$EJECT
,,,;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
,,,;
0255,,FLOATING_MUL,FLOATING_MUL: ; Floating point multiply
,,,;
,,,;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
,,,;
0255,91 30,, ACALL MUL_DIV_EXP_AND_SIGN
,,, ;
,,, ; check for zero exponents
,,, ;
0257,BE 00 02,, CJNE R6,#00,$+5 ;ARG 2 EXP ZERO?
025A,61 73,, AJMP ZERO_AND_EXIT
,,, ;
,,, ; calculate the exponent
,,, ;
025C,8D 2F,FMUL1,FMUL1: MOV FP_SIGN,R5 ;SAVE THE SIGN, IN CASE OF FAILURE
,,, ;
025E,EF,, MOV A,R7
025F,60 F9,, JZ FMUL1-2
0261,2E,, ADD A,R6 ;ADD THE EXPONENTS
0262,20 E7 05,, JB ACC.7,FMUL_OVER
0265,10 D7 06,, JBC CY,FMUL2 ;SEE IF CARRY IS SET
,,, ;
0268,61 6D,, AJMP UNDERFLOW_AND_EXIT
,,, ;
026A,,FMUL_OVER,FMUL_OVER:
,,, ;
026A,50 02,, JNC FMUL2 ;OK IF SET
,,, ;
026C,61 5C,FOV,FOV: AJMP OVERFLOW_AND_EXIT
,,, ;
026E,94 81,FMUL2,FMUL2: SUBB A,#129 ;SUBTRACT THE EXPONENT BIAS
0270,FE,, MOV R6,A ;SAVE IT FOR LATER
,,, ;
,,, ; Unpack and load R0
,,, ;
0271,71 46,, ACALL UNPACK_R0
,,, ;
,,, ; Now set up for loop multiply
,,, ;
0273,7B 04,, MOV R3,#DIGIT
0275,AC 01,, MOV R4,R1B0
,,, ;
,,,$EJECT
,,, ;
,,, ; Now, do the multiply and accumulate the product
,,, ;
0277,8C 01,FMUL3,FMUL3: MOV R1B0,R4
0279,E3,, MOVX A,@R1
027A,FA,, MOV R2,A
027B,71 F3,, ACALL MUL_NIBBLE
,,, ;
027D,EA,, MOV A,R2
027E,C4,, SWAP A
027F,71 F3,, ACALL MUL_NIBBLE
0281,1C,, DEC R4
0282,DB F3,, DJNZ R3,FMUL3
,,, ;
,,, ; Now, pack and restore the sign
,,, ;
0284,8E 30,, MOV FP_EXP,R6
0286,8D 2F,, MOV FP_SIGN,R5
0288,41 EB,, AJMP PACK ;FINISH IT OFF
,,, ;
,,,$EJECT
,,, ;DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
,,, ;
028A,,FLOATING_DIV,FLOATING_DIV:
,,, ;
,,, ;DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
,,, ;
028A,91 32,, ACALL MDES1
,,, ;
,,, ; Check the exponents
,,, ;
028C,8D 2F,, MOV FP_SIGN,R5 ;SAVE THE SIGN
028E,BF 00 06,, CJNE R7,#0,DIV0 ;CLEARS THE CARRY
0291,71 5C,, ACALL OVERFLOW_AND_EXIT
0293,E4,, CLR A
0294,D2 E3,, SETB ACC.ZERO_DIVIDE
0296,22,, RET
,,, ;
0297,EE,DIV0,DIV0: MOV A,R6 ;GET EXPONENT
0298,60 C0,, JZ FMUL1-2 ;EXIT IF ZERO
029A,9F,, SUBB A,R7 ;DELTA EXPONENT
029B,20 E7 04,, JB ACC.7,D_UNDER
029E,50 04,, JNC DIV3
02A0,61 6D,, AJMP UNDERFLOW_AND_EXIT
,,, ;
02A2,50 C8,D_UNDER,D_UNDER:JNC FOV
,,, ;
02A4,24 81,DIV3,DIV3: ADD A,#129 ;CORRECTLY BIAS THE EXPONENT
02A6,F5 30,, MOV FP_EXP,A ;SAVE THE EXPONENT
02A8,91 43,, ACALL LOADR1_MANTISSA ;LOAD THE DIVIDED
,,, ;
02AA,7A 34,, MOV R2,#FP_ACCC ;SAVE LOCATION
02AC,AB 00,, MOV R3,R0B0 ;SAVE POINTER IN R3
02AE,75 2A 00,, MOV FP_CARRY,#0 ;ZERO CARRY BYTE
,,, ;
02B1,7D FF,DIV4,DIV4: MOV R5,#0FFH ;LOOP COUNT
02B3,D3,, SETB C
,,, ;
02B4,8B 00,DIV5,DIV5: MOV R0B0,R3 ;RESTORE THE EXTERNAL POINTER
02B6,79 2E,, MOV R1,#FP_DIG78 ;SET UP INTERNAL POINTER
02B8,7F 04,, MOV R7,#DIGIT ;LOOP COUNT
02BA,50 17,, JNC DIV7 ;EXIT IF NO CARRY
,,, ;
02BC,E2,DIV6,DIV6: MOVX A,@R0 ;DO ACCUMLATION
02BD,FE,, MOV R6,A
02BE,E4,, CLR A
02BF,34 99,, ADDC A,#99H
02C1,9E,, SUBB A,R6
02C2,27,, ADD A,@R1
02C3,D4,, DA A
02C4,F7,, MOV @R1,A
02C5,18,, DEC R0
02C6,19,, DEC R1
02C7,DF F3,, DJNZ R7,DIV6 ;LOOP
,,, ;
02C9,0D,, INC R5 ;SUBTRACT COUNTER
02CA,40 E8,, JC DIV5 ;KEEP LOOPING IF CARRY
02CC,E7,, MOV A,@R1 ;GET CARRY
02CD,94 01,, SUBB A,#1 ;CARRY IS CLEARED
02CF,F7,, MOV @R1,A ;SAVE CARRY DIGIT
02D0,B3,, CPL C
02D1,80 E1,, SJMP DIV5 ;LOOP
,,, ;
,,, ; Restore the result if carry was found
,,, ;
02D3,31 D3,DIV7,DIV7: ACALL ADDLP ;ADD NUMBER BACK
02D5,77 00,, MOV @R1,#0 ;CLEAR CARRY
02D7,8A 00,, MOV R0B0,R2 ;GET SAVE COUNTER
02D9,A6 05,, MOV @R0,5 ;SAVE COUNT BYTE
,,, ;
02DB,0A,, INC R2 ;ADJUST SAVE COUNTER
02DC,7F 01,, MOV R7,#1 ;BUMP DIVIDEND
02DE,71 BB,, ACALL LEFT
02E0,BA 3E CE,, CJNE R2,#FP_ACC8+2,DIV4
,,, ;
02E3,D5 30 02,, DJNZ FP_EXP,DIV8
02E6,61 6D,, AJMP UNDERFLOW_AND_EXIT
,,, ;
02E8,75 2A 00,DIV8,DIV8: MOV FP_CARRY,#0
,,, ;
,,,$EJECT
,,, ;***************************************************************
,,, ;
02EB,,PACK,PACK: ; Pack the mantissa
,,, ;
,,, ;***************************************************************
,,, ;
,,, ; First, set up the pointers
,,, ;
02EB,78 34,, MOV R0,#FP_ACCC
02ED,E6,, MOV A,@R0 ;GET FP_ACCC
02EE,FE,, MOV R6,A ;SAVE FOR ZERO COUNT
02EF,60 03,, JZ PACK0 ;JUMP OVER IF ZERO
02F1,71 3A,, ACALL INC_FP_EXP ;BUMP THE EXPONENT
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -