📄 calc.sdi
字号:
02F3,18,, DEC R0
,,, ;
02F4,08,PACK0,PACK0: INC R0 ;POINT AT FP_ACC1
,,, ;
02F5,74 08,PACK1,PACK1: MOV A,#8 ;ADJUST NIBBLE POINTER
02F7,F9,, MOV R1,A
02F8,28,, ADD A,R0
02F9,F8,, MOV R0,A
02FA,B6 05 00,, CJNE @R0,#5,$+3 ;SEE IF ADJUSTING NEEDED
02FD,40 13,, JC PACK3+1
,,, ;
02FF,D3,PACK2,PACK2: SETB C
0300,E4,, CLR A
0301,18,, DEC R0
0302,36,, ADDC A,@R0
0303,D4,, DA A
0304,D6,, XCHD A,@R0 ;SAVE THE VALUE
0305,30 E4 09,, JNB ACC.4,PACK3
0308,D9 F5,, DJNZ R1,PACK2
,,, ;
030A,18,, DEC R0
030B,76 01,, MOV @R0,#1
030D,71 3A,, ACALL INC_FP_EXP
030F,80 06,, SJMP PACK4
,,, ;
0311,19,PACK3,PACK3: DEC R1
0312,E9,, MOV A,R1
0313,C3,, CLR C
0314,C8,, XCH A,R0
0315,98,, SUBB A,R0
0316,F8,, MOV R0,A
,,, ;
0317,79 2B,PACK4,PACK4: MOV R1,#FP_DIG12
,,, ;
,,, ; Now, pack
,,, ;
0319,E6,PLOOP,PLOOP: MOV A,@R0
031A,C4,, SWAP A ;FLIP THE DIGITS
031B,08,, INC R0
031C,D6,, XCHD A,@R0
031D,42 06,, ORL 6,A ;ACCUMULATE THE OR'ED DIGITS
031F,F7,, MOV @R1,A
0320,08,, INC R0
0321,09,, INC R1
0322,B9 2F F4,, CJNE R1,#FP_SIGN,PLOOP
0325,EE,, MOV A,R6
0326,70 03,, JNZ STORE_ALIGN_TEST_AND_EXIT
0328,75 30 00,, MOV FP_EXP,#0 ;ZERO EXPONENT
,,, ;
,,, ;**************************************************************
,,, ;
032B,,STORE_ALIGN_TEST_AND_EXIT,STORE_ALIGN_TEST_AND_EXIT: ;Save the number align carry and exit
,,, ;
,,, ;**************************************************************
,,, ;
032B,91 26,, ACALL LOAD_POINTERS
032D,89 24,, MOV ARG_STACK,R1 ;SET UP THE NEW STACK
032F,78 30,, MOV R0,#FP_EXP
,,, ;
,,, ; Now load the numbers
,,, ;
0331,E6,STORE2,STORE2: MOV A,@R0
0332,F3,, MOVX @R1,A ;SAVE THE NUMBER
0333,18,, DEC R0
0334,19,, DEC R1
0335,B8 2A F9,, CJNE R0,#FP_CARRY,STORE2
,,, ;
0338,E4,, CLR A ;NO ERRORS
,,, ;
0339,22,PRET,PRET: RET ;EXIT
,,, ;
,,,$EJECT
033A,,INC_FP_EXP,INC_FP_EXP:
,,, ;
033A,05 30,, INC FP_EXP
033C,E5 30,, MOV A,FP_EXP
033E,70 F9,, JNZ PRET ;EXIT IF NOT ZERO
0340,D0 E0,, POP ACC ;WASTE THE CALLING STACK
0342,D0 E0,, POP ACC
0344,61 5C,, AJMP OVERFLOW_AND_EXIT
,,, ;
,,,;***********************************************************************
,,,;
0346,,UNPACK_R0,UNPACK_R0: ; Unpack BCD digits and load into nibble locations
,,,;
,,,;***********************************************************************
,,, ;
0346,C0 01,, PUSH R1B0
0348,79 32,, MOV R1,#FP_NIB8
,,, ;
034A,E2,ULOOP,ULOOP: MOVX A,@R0
034B,54 0F,, ANL A,#0FH
034D,F7,, MOV @R1,A ;SAVE THE NIBBLE
034E,E2,, MOVX A,@R0
034F,C4,, SWAP A
0350,54 0F,, ANL A,#0FH
0352,19,, DEC R1
0353,F7,, MOV @R1,A ;SAVE THE NIBBLE AGAIN
0354,18,, DEC R0
0355,19,, DEC R1
0356,B9 2A F1,, CJNE R1,#FP_NIB1-1,ULOOP
,,, ;
0359,D0 01,, POP R1B0
,,, ;
035B,22,LOAD7,LOAD7: RET
,,, ;
,,,$EJECT
,,, ;**************************************************************
,,, ;
035C,,OVERFLOW_AND_EXIT,OVERFLOW_AND_EXIT: ;LOAD 99999999 E+127, SET OV BIT, AND EXIT
,,, ;
,,, ;**************************************************************
,,, ;
035C,78 2E,, MOV R0,#FP_DIG78
035E,74 99,, MOV A,#99H
,,, ;
0360,F6,OVE1,OVE1: MOV @R0,A
0361,18,, DEC R0
0362,B8 2A FB,, CJNE R0,#FP_CARRY,OVE1
,,, ;
0365,75 30 FF,, MOV FP_EXP,#0FFH
0368,71 2B,, ACALL STORE_ALIGN_TEST_AND_EXIT
,,, ;
036A,D2 E1,, SETB ACC.OVERFLOW
036C,22,, RET
,,, ;
,,,$EJECT
,,, ;**************************************************************
,,, ;
036D,,UNDERFLOW_AND_EXIT,UNDERFLOW_AND_EXIT: ;LOAD 0, SET UF BIT, AND EXIT
,,, ;
,,, ;**************************************************************
,,, ;
036D,71 73,, ACALL ZERO_AND_EXIT
036F,E4,, CLR A
0370,D2 E0,, SETB ACC.UNDERFLOW
0372,22,, RET
,,, ;
,,, ;**************************************************************
,,, ;
0373,,ZERO_AND_EXIT,ZERO_AND_EXIT: ;LOAD 0, SET ZERO BIT, AND EXIT
,,, ;
,,, ;**************************************************************
,,, ;
0373,71 7A,, ACALL FP_CLEAR
0375,71 2B,, ACALL STORE_ALIGN_TEST_AND_EXIT
0377,D2 E2,, SETB ACC.ZERO
0379,22,, RET ;EXIT
,,, ;
,,, ;**************************************************************
,,, ;
037A,,FP_CLEAR,FP_CLEAR:
,,, ;
,,, ; Clear internal storage
,,, ;
,,, ;**************************************************************
,,, ;
037A,E4,, CLR A
037B,78 3D,, MOV R0,#FP_ACC8+1
,,, ;
037D,F6,FPC1,FPC1: MOV @R0,A
037E,18,, DEC R0
037F,B8 29 FB,, CJNE R0,#FP_TEMP,FPC1
0382,22,, RET
,,, ;
,,,$EJECT
,,, ;**************************************************************
,,, ;
0383,,RIGHT,RIGHT: ; Shift ACCUMULATOR RIGHT the number of nibbles in R7
,,, ; Save the shifted values in R4 if SAVE_ROUND is set
,,, ;
,,, ;**************************************************************
,,, ;
0383,7C 00,, MOV R4,#0 ;IN CASE OF NO SHIFT
,,, ;
0385,C3,RIGHT1,RIGHT1: CLR C
0386,EF,, MOV A,R7 ;GET THE DIGITS TO SHIFT
0387,60 22,, JZ RIGHT5-1 ;EXIT IF ZERO
0389,94 02,, SUBB A,#2 ;TWO TO DO?
038B,50 1F,, JNC RIGHT5 ;SHIFT TWO NIBBLES
,,, ;
,,, ; Swap one nibble then exit
,,, ;
038D,C0 00,RIGHT3,RIGHT3: PUSH R0B0 ;SAVE POINTER REGISTER
038F,C0 01,, PUSH R1B0
,,, ;
0391,79 2E,, MOV R1,#FP_DIG78 ;LOAD THE POINTERS
0393,78 2D,, MOV R0,#FP_DIG56
0395,EC,, MOV A,R4 ;GET THE OVERFLOW REGISTER
0396,D7,, XCHD A,@R1 ;GET DIGIT 8
0397,C4,, SWAP A ;FLIP FOR LOAD
0398,FC,, MOV R4,A
,,, ;
0399,E7,RIGHTL,RIGHTL: MOV A,@R1 ;GET THE LOW ORDER BYTE
039A,D6,, XCHD A,@R0 ;SWAP NIBBLES
039B,C4,, SWAP A ;FLIP FOR STORE
039C,F7,, MOV @R1,A ;SAVE THE DIGITS
039D,18,, DEC R0 ;BUMP THE POINTERS
039E,19,, DEC R1
039F,B9 2A F7,, CJNE R1,#FP_DIG12-1,RIGHTL ;LOOP
,,, ;
03A2,E7,, MOV A,@R1 ;ACC = CH8
03A3,C4,, SWAP A ;ACC = 8CH
03A4,54 0F,, ANL A,#0FH ;ACC = 0CH
03A6,F7,, MOV @R1,A ;CARRY DONE
03A7,D0 01,, POP R1B0 ;EXIT
03A9,D0 00,, POP R0B0 ;RESTORE REGISTER
03AB,22,, RET
,,, ;
03AC,FF,RIGHT5,RIGHT5: MOV R7,A ;SAVE THE NEW SHIFT NUMBER
03AD,E4,, CLR A
03AE,C5 2A,, XCH A,FP_CARRY ;SWAP THE NIBBLES
03B0,C5 2B,, XCH A,FP_DIG12
03B2,C5 2C,, XCH A,FP_DIG34
03B4,C5 2D,, XCH A,FP_DIG56
03B6,C5 2E,, XCH A,FP_DIG78
03B8,FC,, MOV R4,A ;SAVE THE LAST DIGIT SHIFTED
03B9,80 CB,, SJMP RIGHT1+1
,,, ;
,,,$EJECT
,,, ;***************************************************************
,,, ;
03BB,,LEFT,LEFT: ; Shift ACCUMULATOR LEFT the number of nibbles in R7
,,, ;
,,, ;***************************************************************
,,, ;
03BB,7C 00,, MOV R4,#00H ;CLEAR FOR SOME ENTRYS
,,, ;
03BD,C3,LEFT1,LEFT1: CLR C
03BE,EF,, MOV A,R7 ;GET SHIFT VALUE
03BF,60 22,, JZ LEFT5-1 ;EXIT IF ZERO
03C1,94 02,, SUBB A,#2 ;SEE HOW MANY BYTES TO SHIFT
03C3,50 1F,, JNC LEFT5
,,, ;
03C5,C0 00,LEFT3,LEFT3: PUSH R0B0 ;SAVE POINTER
03C7,C0 01,, PUSH R1B0
03C9,78 2A,, MOV R0,#FP_CARRY
03CB,79 2B,, MOV R1,#FP_DIG12
,,, ;
03CD,E6,, MOV A,@R0 ;ACC=CHCL
03CE,C4,, SWAP A ;ACC = CLCH
03CF,F6,, MOV @R0,A ;ACC = CLCH, @R0 = CLCH
,,, ;
03D0,E7,LEFTL,LEFTL: MOV A,@R1 ;DIG 12
03D1,C4,, SWAP A ;DIG 21
03D2,D6,, XCHD A,@R0
03D3,F7,, MOV @R1,A ;SAVE IT
03D4,08,, INC R0 ;BUMP POINTERS
03D5,09,, INC R1
03D6,B8 2E F7,, CJNE R0,#FP_DIG78,LEFTL
,,, ;
03D9,EC,, MOV A,R4
03DA,C4,, SWAP A
03DB,D6,, XCHD A,@R0
03DC,54 F0,, ANL A,#0F0H
03DE,FC,, MOV R4,A
,,, ;
03DF,D0 01,, POP R1B0
03E1,D0 00,, POP R0B0 ;RESTORE
03E3,22,, RET ;DONE
,,, ;
03E4,FF,LEFT5,LEFT5: MOV R7,A ;RESTORE COUNT
03E5,E4,, CLR A
03E6,CC,, XCH A,R4 ;GET THE RESTORATION BYTE
03E7,C5 2E,, XCH A,FP_DIG78 ;DO THE SWAP
03E9,C5 2D,, XCH A,FP_DIG56
03EB,C5 2C,, XCH A,FP_DIG34
03ED,C5 2B,, XCH A,FP_DIG12
03EF,C5 2A,, XCH A,FP_CARRY
03F1,80 CB,, SJMP LEFT1+1
,,, ;
,,,$EJECT
03F3,,MUL_NIBBLE,MUL_NIBBLE:
,,, ;
,,, ; Multiply the nibble in R7 by the FP_NIB locations
,,, ; accumulate the product in FP_ACC
,,, ;
,,, ; Set up the pointers for multiplication
,,, ;
03F3,54 0F,, ANL A,#0FH ;STRIP OFF MS NIBBLE
03F5,FF,, MOV R7,A
03F6,78 3C,, MOV R0,#FP_ACC8
03F8,79 32,, MOV R1,#FP_NIB8
03FA,E4,, CLR A
03FB,F5 33,, MOV FP_ACCX,A
,,, ;
03FD,18,MNLOOP,MNLOOP: DEC R0 ;BUMP POINTER TO PROPAGATE CARRY
03FE,26,, ADD A,@R0 ;ATTEMPT TO FORCE CARRY
03FF,D4,, DA A ;BCD ADJUST
0400,30 E4 03,, JNB ACC.4,MNL0 ;DON'T ADJUST IF NO NEED
0403,18,, DEC R0 ;PROPAGATE CARRY TO THE NEXT DIGIT
0404,06,, INC @R0 ;DO THE ADJUSTING
0405,08,, INC R0 ;RESTORE R0
,,, ;
0406,D6,MNL0,MNL0: XCHD A,@R0 ;RESTORE INITIAL NUMBER
0407,8F F0,, MOV B,R7 ;GET THE NUBBLE TO MULTIPLY
0409,E7,, MOV A,@R1 ;GET THE OTHER NIBBLE
040A,A4,, MUL AB ;DO THE MULTIPLY
040B,75 F0 0A,, MOV B,#10 ;NOW BCD ADJUST
040E,84,, DIV AB
040F,C5 F0,, XCH A,B ;GET THE REMAINDER
0411,26,, ADD A,@R0 ;PROPAGATE THE PARTIAL PRODUCTS
0412,D4,, DA A ;BCD ADJUST
0413,30 E4 02,, JNB ACC.4,MNL1 ;PROPAGATE PARTIAL PRODUCT CARRY
0416,05 F0,, INC B
,,, ;
0418,08,MNL1,MNL1: INC R0
0419,D6,, XCHD A,@R0 ;SAVE THE NEW PRODUCT
041A,18,, DEC R0
041B,E5 F0,, MOV A,B ;GET BACK THE QUOTIENT
041D,19,, DEC R1
041E,B9 2A DC,, CJNE R1,#FP_NIB1-1,MNLOOP
,,, ;
0421,25 33,, ADD A,FP_ACCX ;GET THE OVERFLOW
0423,D4,, DA A ;ADJUST
0424,F6,, MOV @R0,A ;SAVE IT
0425,22,, RET ;EXIT
,,, ;
,,,$EJECT
,,, ;***************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -