📄 fp-52.sdi
字号:
1B76,E6,STORE2,STORE2: MOV A,@R0
1B77,F3,, MOVX @R1,A ;SAVE THE NUMBER
1B78,18,, DEC R0
1B79,19,, DEC R1
1B7A,B8 2A F9,, CJNE R0,#FP_CARRY,STORE2
,,, ;
1B7D,E4,, CLR A ;NO ERRORS
,,, ;
1B7E,22,PRET,PRET: RET ;EXIT
,,, ;
,,,$EJECT
1B7F,,INC_FP_EXP,INC_FP_EXP:
,,, ;
1B7F,05 30,, INC FP_EXP
1B81,E5 30,, MOV A,FP_EXP
1B83,70 F9,, JNZ PRET ;EXIT IF NOT ZERO
1B85,D0 E0,, POP ACC ;WASTE THE CALLING STACK
1B87,D0 E0,, POP ACC
1B89,61 A1,, AJMP OVERFLOW_AND_EXIT
,,, ;
,,,;***********************************************************************
,,,;
1B8B,,UNPACK_R0,UNPACK_R0: ; Unpack BCD digits and load into nibble locations
,,,;
,,,;***********************************************************************
,,, ;
1B8B,C0 01,, PUSH R1B0
1B8D,79 32,, MOV R1,#FP_NIB8
,,, ;
1B8F,E2,ULOOP,ULOOP: MOVX A,@R0
1B90,54 0F,, ANL A,#0FH
1B92,F7,, MOV @R1,A ;SAVE THE NIBBLE
1B93,E2,, MOVX A,@R0
1B94,C4,, SWAP A
1B95,54 0F,, ANL A,#0FH
1B97,19,, DEC R1
1B98,F7,, MOV @R1,A ;SAVE THE NIBBLE AGAIN
1B99,18,, DEC R0
1B9A,19,, DEC R1
1B9B,B9 2A F1,, CJNE R1,#FP_NIB1-1,ULOOP
,,, ;
1B9E,D0 01,, POP R1B0
,,, ;
1BA0,22,LOAD7,LOAD7: RET
,,, ;
,,,$EJECT
,,, ;**************************************************************
,,, ;
1BA1,,OVERFLOW_AND_EXIT,OVERFLOW_AND_EXIT: ;LOAD 99999999 E+127, SET OV BIT, AND EXIT
,,, ;
,,, ;**************************************************************
,,, ;
1BA1,78 2E,, MOV R0,#FP_DIG78
1BA3,74 99,, MOV A,#99H
,,, ;
1BA5,F6,OVE1,OVE1: MOV @R0,A
1BA6,18,, DEC R0
1BA7,B8 2A FB,, CJNE R0,#FP_CARRY,OVE1
,,, ;
1BAA,75 30 FF,, MOV FP_EXP,#0FFH
1BAD,71 70,, ACALL STORE_ALIGN_TEST_AND_EXIT
,,, ;
1BAF,D2 E1,, SETB ACC.OVERFLOW
1BB1,22,, RET
,,, ;
,,,$EJECT
,,, ;**************************************************************
,,, ;
1BB2,,UNDERFLOW_AND_EXIT,UNDERFLOW_AND_EXIT: ;LOAD 0, SET UF BIT, AND EXIT
,,, ;
,,, ;**************************************************************
,,, ;
1BB2,71 B8,, ACALL ZERO_AND_EXIT
1BB4,E4,, CLR A
1BB5,D2 E0,, SETB ACC.UNDERFLOW
1BB7,22,, RET
,,, ;
,,, ;**************************************************************
,,, ;
1BB8,,ZERO_AND_EXIT,ZERO_AND_EXIT: ;LOAD 0, SET ZERO BIT, AND EXIT
,,, ;
,,, ;**************************************************************
,,, ;
1BB8,71 BF,, ACALL FP_CLEAR
1BBA,71 70,, ACALL STORE_ALIGN_TEST_AND_EXIT
1BBC,D2 E2,, SETB ACC.ZERO
1BBE,22,, RET ;EXIT
,,, ;
,,, ;**************************************************************
,,, ;
1BBF,,FP_CLEAR,FP_CLEAR:
,,, ;
,,, ; Clear internal storage
,,, ;
,,, ;**************************************************************
,,, ;
1BBF,E4,, CLR A
1BC0,78 3D,, MOV R0,#FP_ACC8+1
,,, ;
1BC2,F6,FPC1,FPC1: MOV @R0,A
1BC3,18,, DEC R0
1BC4,B8 29 FB,, CJNE R0,#FP_TEMP,FPC1
1BC7,22,, RET
,,, ;
,,,$EJECT
,,, ;**************************************************************
,,, ;
1BC8,,RIGHT,RIGHT: ; Shift ACCUMULATOR RIGHT the number of nibbles in R7
,,, ; Save the shifted values in R4 if SAVE_ROUND is set
,,, ;
,,, ;**************************************************************
,,, ;
1BC8,7C 00,, MOV R4,#0 ;IN CASE OF NO SHIFT
,,, ;
1BCA,C3,RIGHT1,RIGHT1: CLR C
1BCB,EF,, MOV A,R7 ;GET THE DIGITS TO SHIFT
1BCC,60 22,, JZ RIGHT5-1 ;EXIT IF ZERO
1BCE,94 02,, SUBB A,#2 ;TWO TO DO?
1BD0,50 1F,, JNC RIGHT5 ;SHIFT TWO NIBBLES
,,, ;
,,, ; Swap one nibble then exit
,,, ;
1BD2,C0 00,RIGHT3,RIGHT3: PUSH R0B0 ;SAVE POINTER REGISTER
1BD4,C0 01,, PUSH R1B0
,,, ;
1BD6,79 2E,, MOV R1,#FP_DIG78 ;LOAD THE POINTERS
1BD8,78 2D,, MOV R0,#FP_DIG56
1BDA,EC,, MOV A,R4 ;GET THE OVERFLOW REGISTER
1BDB,D7,, XCHD A,@R1 ;GET DIGIT 8
1BDC,C4,, SWAP A ;FLIP FOR LOAD
1BDD,FC,, MOV R4,A
,,, ;
1BDE,E7,RIGHTL,RIGHTL: MOV A,@R1 ;GET THE LOW ORDER BYTE
1BDF,D6,, XCHD A,@R0 ;SWAP NIBBLES
1BE0,C4,, SWAP A ;FLIP FOR STORE
1BE1,F7,, MOV @R1,A ;SAVE THE DIGITS
1BE2,18,, DEC R0 ;BUMP THE POINTERS
1BE3,19,, DEC R1
1BE4,B9 2A F7,, CJNE R1,#FP_DIG12-1,RIGHTL ;LOOP
,,, ;
1BE7,E7,, MOV A,@R1 ;ACC = CH8
1BE8,C4,, SWAP A ;ACC = 8CH
1BE9,54 0F,, ANL A,#0FH ;ACC = 0CH
1BEB,F7,, MOV @R1,A ;CARRY DONE
1BEC,D0 01,, POP R1B0 ;EXIT
1BEE,D0 00,, POP R0B0 ;RESTORE REGISTER
1BF0,22,, RET
,,, ;
1BF1,FF,RIGHT5,RIGHT5: MOV R7,A ;SAVE THE NEW SHIFT NUMBER
1BF2,E4,, CLR A
1BF3,C5 2A,, XCH A,FP_CARRY ;SWAP THE NIBBLES
1BF5,C5 2B,, XCH A,FP_DIG12
1BF7,C5 2C,, XCH A,FP_DIG34
1BF9,C5 2D,, XCH A,FP_DIG56
1BFB,C5 2E,, XCH A,FP_DIG78
1BFD,FC,, MOV R4,A ;SAVE THE LAST DIGIT SHIFTED
1BFE,80 CB,, SJMP RIGHT1+1
,,, ;
,,,$EJECT
,,, ;***************************************************************
,,, ;
1C00,,LEFT,LEFT: ; Shift ACCUMULATOR LEFT the number of nibbles in R7
,,, ;
,,, ;***************************************************************
,,, ;
1C00,7C 00,, MOV R4,#00H ;CLEAR FOR SOME ENTRYS
,,, ;
1C02,C3,LEFT1,LEFT1: CLR C
1C03,EF,, MOV A,R7 ;GET SHIFT VALUE
1C04,60 22,, JZ LEFT5-1 ;EXIT IF ZERO
1C06,94 02,, SUBB A,#2 ;SEE HOW MANY BYTES TO SHIFT
1C08,50 1F,, JNC LEFT5
,,, ;
1C0A,C0 00,LEFT3,LEFT3: PUSH R0B0 ;SAVE POINTER
1C0C,C0 01,, PUSH R1B0
1C0E,78 2A,, MOV R0,#FP_CARRY
1C10,79 2B,, MOV R1,#FP_DIG12
,,, ;
1C12,E6,, MOV A,@R0 ;ACC=CHCL
1C13,C4,, SWAP A ;ACC = CLCH
1C14,F6,, MOV @R0,A ;ACC = CLCH, @R0 = CLCH
,,, ;
1C15,E7,LEFTL,LEFTL: MOV A,@R1 ;DIG 12
1C16,C4,, SWAP A ;DIG 21
1C17,D6,, XCHD A,@R0
1C18,F7,, MOV @R1,A ;SAVE IT
1C19,08,, INC R0 ;BUMP POINTERS
1C1A,09,, INC R1
1C1B,B8 2E F7,, CJNE R0,#FP_DIG78,LEFTL
,,, ;
1C1E,EC,, MOV A,R4
1C1F,C4,, SWAP A
1C20,D6,, XCHD A,@R0
1C21,54 F0,, ANL A,#0F0H
1C23,FC,, MOV R4,A
,,, ;
1C24,D0 01,, POP R1B0
1C26,D0 00,, POP R0B0 ;RESTORE
1C28,22,, RET ;DONE
,,, ;
1C29,FF,LEFT5,LEFT5: MOV R7,A ;RESTORE COUNT
1C2A,E4,, CLR A
1C2B,CC,, XCH A,R4 ;GET THE RESTORATION BYTE
1C2C,C5 2E,, XCH A,FP_DIG78 ;DO THE SWAP
1C2E,C5 2D,, XCH A,FP_DIG56
1C30,C5 2C,, XCH A,FP_DIG34
1C32,C5 2B,, XCH A,FP_DIG12
1C34,C5 2A,, XCH A,FP_CARRY
1C36,80 CB,, SJMP LEFT1+1
,,, ;
,,,$EJECT
1C38,,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
,,, ;
1C38,54 0F,, ANL A,#0FH ;STRIP OFF MS NIBBLE
1C3A,FF,, MOV R7,A
1C3B,78 3C,, MOV R0,#FP_ACC8
1C3D,79 32,, MOV R1,#FP_NIB8
1C3F,E4,, CLR A
1C40,F5 33,, MOV FP_ACCX,A
,,, ;
1C42,18,MNLOOP,MNLOOP: DEC R0 ;BUMP POINTER TO PROPAGATE CARRY
1C43,26,, ADD A,@R0 ;ATTEMPT TO FORCE CARRY
1C44,D4,, DA A ;BCD ADJUST
1C45,30 E4 03,, JNB ACC.4,MNL0 ;DON'T ADJUST IF NO NEED
1C48,18,, DEC R0 ;PROPAGATE CARRY TO THE NEXT DIGIT
1C49,06,, INC @R0 ;DO THE ADJUSTING
1C4A,08,, INC R0 ;RESTORE R0
,,, ;
1C4B,D6,MNL0,MNL0: XCHD A,@R0 ;RESTORE INITIAL NUMBER
1C4C,8F F0,, MOV B,R7 ;GET THE NUBBLE TO MULTIPLY
1C4E,E7,, MOV A,@R1 ;GET THE OTHER NIBBLE
1C4F,A4,, MUL AB ;DO THE MULTIPLY
1C50,75 F0 0A,, MOV B,#10 ;NOW BCD ADJUST
1C53,84,, DIV AB
1C54,C5 F0,, XCH A,B ;GET THE REMAINDER
1C56,26,, ADD A,@R0 ;PROPAGATE THE PARTIAL PRODUCTS
1C57,D4,, DA A ;BCD ADJUST
1C58,30 E4 02,, JNB ACC.4,MNL1 ;PROPAGATE PARTIAL PRODUCT CARRY
1C5B,05 F0,, INC B
,,, ;
1C5D,08,MNL1,MNL1: INC R0
1C5E,D6,, XCHD A,@R0 ;SAVE THE NEW PRODUCT
1C5F,18,, DEC R0
1C60,E5 F0,, MOV A,B ;GET BACK THE QUOTIENT
1C62,19,, DEC R1
1C63,B9 2A DC,, CJNE R1,#FP_NIB1-1,MNLOOP
,,, ;
1C66,25 33,, ADD A,FP_ACCX ;GET THE OVERFLOW
1C68,D4,, DA A ;ADJUST
1C69,F6,, MOV @R0,A ;SAVE IT
1C6A,22,, RET ;EXIT
,,, ;
,,,$EJECT
,,, ;***************************************************************
,,, ;
1C6B,,LOAD_POINTERS,LOAD_POINTERS: ; Load the ARG_STACK into R0 and bump R1
,,, ;
,,, ;***************************************************************
,,, ;
1C6B,75 A0 01,, MOV P2,#ARG_STACK_PAGE
1C6E,A8 09,, MOV R0,ARG_STACK
1C70,74 06,, MOV A,#FP_NUMBER_SIZE
1C72,28,, ADD A,R0
1C73,F9,, MOV R1,A
1C74,22,, RET
,,, ;
,,, ;***************************************************************
,,, ;
1C75,,MUL_DIV_EXP_AND_SIGN,MUL_DIV_EXP_AND_SIGN:
,,, ;
,,, ; Load the sign into R7, R6. R5 gets the sign for
,,, ; multiply and divide.
,,, ;
,,, ;***************************************************************
,,, ;
1C75,71 BF,, ACALL FP_CLEAR ;CLEAR INTERNAL MEMORY
,,, ;
1C77,91 6B,MDES1,MDES1: ACALL LOAD_POINTERS ;LOAD REGISTERS
1C79,E2,, MOVX A,@R0 ;ARG 1 EXP
1C7A,FF,, MOV R7,A ;SAVED IN R7
1C7B,E3,, MOVX A,@R1 ;ARG 2 EXP
1C7C,FE,, MOV R6,A ;SAVED IN R6
1C7D,18,, DEC R0 ;BUMP POINTERS TO SIGN
1C7E,19,, DEC R1
1C7F,E2,, MOVX A,@R0 ;GET THE SIGN
1C80,FC,, MOV R4,A ;SIGN OF ARG1
1C81,E3,, MOVX A,@R1 ;GET SIGN OF NEXT ARG
1C82,FB,, MOV R3,A ;SIGN OF ARG2
1C83,6C,, XRL A,R4 ;ACC GETS THE NEW SIGN
1C84,FD,, MOV R5,A ;R5 GETS THE NEW SIGN
,,, ;
,,, ; Bump the pointers to point at the LS digit
,,, ;
1C85,18,, DEC R0
1C86,19,, DEC R1
,,, ;
1C87,22,, RET
,,, ;
,,,$EJECT
,,, ;***************************************************************
,,, ;
1C88,,LOADR1_MANTISSA,LOADR1_MANTISSA:
,,, ;
,,, ; Load the mantissa of R0 into FP_Digits
,,, ;
,,, ;***************************************************************
,,, ;
1C88,C0 00,, PUSH R0B0 ;SAVE REGISTER 1
1C8A,78 2E,, MOV R0,#FP_DIG78 ;SET UP THE POINTER
,,, ;
1C8C,E3,LOADR1,LOADR1: MOVX A,@R1
1C8D,F6,, MOV @R0,A
1C8E,19,, DEC R1
1C8F,18,, DEC R0
1C90,B8 2A F9,, CJNE R0,#FP_CARRY,LOADR1
,,, ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -