📄 fp52.sdi
字号:
01E7,75 30 00,, MOV FP_EXP,#0 ;ZERO EXPONENT
,,, ;
,,, ;**************************************************************
,,, ;
01EA,,STORE_ALIGN_TEST_AND_EXIT,STORE_ALIGN_TEST_AND_EXIT: ;Save the number align carry and exit
,,, ;
,,, ;**************************************************************
,,, ;
01EA,51 E5,, ACALL LOAD_POINTERS
01EC,89 24,, MOV ARG_STACK,R1 ;SET UP THE NEW STACK
01EE,78 30,, MOV R0,#FP_EXP
,,, ;
,,, ; Now load the numbers
,,, ;
01F0,E6,STORE2,STORE2: MOV A,@R0
01F1,F3,, MOVX @R1,A ;SAVE THE NUMBER
01F2,18,, DEC R0
01F3,19,, DEC R1
01F4,B8 2A F9,, CJNE R0,#FP_CARRY,STORE2
,,, ;
01F7,E4,, CLR A ;NO ERRORS
,,, ;
01F8,22,PRET,PRET: RET ;EXIT
,,, ;
,,,$EJECT
01F9,,INC_FP_EXP,INC_FP_EXP:
,,, ;
01F9,05 30,, INC FP_EXP
01FB,E5 30,, MOV A,FP_EXP
01FD,70 F9,, JNZ PRET ;EXIT IF NOT ZERO
01FF,D0 E0,, POP ACC ;WASTE THE CALLING STACK
0201,D0 E0,, POP ACC
0203,41 1B,, AJMP OVERFLOW_AND_EXIT
,,, ;
,,,;***********************************************************************
,,,;
0205,,UNPACK_R0,UNPACK_R0: ; Unpack BCD digits and load into nibble locations
,,,;
,,,;***********************************************************************
,,, ;
0205,C0 01,, PUSH R1B0
0207,79 32,, MOV R1,#FP_NIB8
,,, ;
0209,E2,ULOOP,ULOOP: MOVX A,@R0
020A,54 0F,, ANL A,#0FH
020C,F7,, MOV @R1,A ;SAVE THE NIBBLE
020D,E2,, MOVX A,@R0
020E,C4,, SWAP A
020F,54 0F,, ANL A,#0FH
0211,19,, DEC R1
0212,F7,, MOV @R1,A ;SAVE THE NIBBLE AGAIN
0213,18,, DEC R0
0214,19,, DEC R1
0215,B9 2A F1,, CJNE R1,#FP_NIB1-1,ULOOP
,,, ;
0218,D0 01,, POP R1B0
,,, ;
021A,22,LOAD7,LOAD7: RET
,,, ;
,,,$EJECT
,,, ;**************************************************************
,,, ;
021B,,OVERFLOW_AND_EXIT,OVERFLOW_AND_EXIT: ;LOAD 99999999 E+127, SET OV BIT, AND EXIT
,,, ;
,,, ;**************************************************************
,,, ;
021B,78 2E,, MOV R0,#FP_DIG78
021D,74 99,, MOV A,#99H
,,, ;
021F,F6,OVE1,OVE1: MOV @R0,A
0220,18,, DEC R0
0221,B8 2A FB,, CJNE R0,#FP_CARRY,OVE1
,,, ;
0224,75 30 FF,, MOV FP_EXP,#0FFH
0227,31 EA,, ACALL STORE_ALIGN_TEST_AND_EXIT
,,, ;
0229,D2 E1,, SETB ACC.OVERFLOW
022B,22,, RET
,,, ;
,,,$EJECT
,,, ;**************************************************************
,,, ;
022C,,UNDERFLOW_AND_EXIT,UNDERFLOW_AND_EXIT: ;LOAD 0, SET UF BIT, AND EXIT
,,, ;
,,, ;**************************************************************
,,, ;
022C,51 32,, ACALL ZERO_AND_EXIT
022E,E4,, CLR A
022F,D2 E0,, SETB ACC.UNDERFLOW
0231,22,, RET
,,, ;
,,, ;**************************************************************
,,, ;
0232,,ZERO_AND_EXIT,ZERO_AND_EXIT: ;LOAD 0, SET ZERO BIT, AND EXIT
,,, ;
,,, ;**************************************************************
,,, ;
0232,51 39,, ACALL FP_CLEAR
0234,31 EA,, ACALL STORE_ALIGN_TEST_AND_EXIT
0236,D2 E2,, SETB ACC.ZERO
0238,22,, RET ;EXIT
,,, ;
,,, ;**************************************************************
,,, ;
0239,,FP_CLEAR,FP_CLEAR:
,,, ;
,,, ; Clear internal storage
,,, ;
,,, ;**************************************************************
,,, ;
0239,E4,, CLR A
023A,78 3D,, MOV R0,#FP_ACC8+1
,,, ;
023C,F6,FPC1,FPC1: MOV @R0,A
023D,18,, DEC R0
023E,B8 29 FB,, CJNE R0,#FP_TEMP,FPC1
0241,22,, RET
,,, ;
,,,$EJECT
,,, ;**************************************************************
,,, ;
0242,,RIGHT,RIGHT: ; Shift ACCUMULATOR RIGHT the number of nibbles in R7
,,, ; Save the shifted values in R4 if SAVE_ROUND is set
,,, ;
,,, ;**************************************************************
,,, ;
0242,7C 00,, MOV R4,#0 ;IN CASE OF NO SHIFT
,,, ;
0244,C3,RIGHT1,RIGHT1: CLR C
0245,EF,, MOV A,R7 ;GET THE DIGITS TO SHIFT
0246,60 22,, JZ RIGHT5-1 ;EXIT IF ZERO
0248,94 02,, SUBB A,#2 ;TWO TO DO?
024A,50 1F,, JNC RIGHT5 ;SHIFT TWO NIBBLES
,,, ;
,,, ; Swap one nibble then exit
,,, ;
024C,C0 00,RIGHT3,RIGHT3: PUSH R0B0 ;SAVE POINTER REGISTER
024E,C0 01,, PUSH R1B0
,,, ;
0250,79 2E,, MOV R1,#FP_DIG78 ;LOAD THE POINTERS
0252,78 2D,, MOV R0,#FP_DIG56
0254,EC,, MOV A,R4 ;GET THE OVERFLOW REGISTER
0255,D7,, XCHD A,@R1 ;GET DIGIT 8
0256,C4,, SWAP A ;FLIP FOR LOAD
0257,FC,, MOV R4,A
,,, ;
0258,E7,RIGHTL,RIGHTL: MOV A,@R1 ;GET THE LOW ORDER BYTE
0259,D6,, XCHD A,@R0 ;SWAP NIBBLES
025A,C4,, SWAP A ;FLIP FOR STORE
025B,F7,, MOV @R1,A ;SAVE THE DIGITS
025C,18,, DEC R0 ;BUMP THE POINTERS
025D,19,, DEC R1
025E,B9 2A F7,, CJNE R1,#FP_DIG12-1,RIGHTL ;LOOP
,,, ;
0261,E7,, MOV A,@R1 ;ACC = CH8
0262,C4,, SWAP A ;ACC = 8CH
0263,54 0F,, ANL A,#0FH ;ACC = 0CH
0265,F7,, MOV @R1,A ;CARRY DONE
0266,D0 01,, POP R1B0 ;EXIT
0268,D0 00,, POP R0B0 ;RESTORE REGISTER
026A,22,, RET
,,, ;
026B,FF,RIGHT5,RIGHT5: MOV R7,A ;SAVE THE NEW SHIFT NUMBER
026C,E4,, CLR A
026D,C5 2A,, XCH A,FP_CARRY ;SWAP THE NIBBLES
026F,C5 2B,, XCH A,FP_DIG12
0271,C5 2C,, XCH A,FP_DIG34
0273,C5 2D,, XCH A,FP_DIG56
0275,C5 2E,, XCH A,FP_DIG78
0277,FC,, MOV R4,A ;SAVE THE LAST DIGIT SHIFTED
0278,80 CB,, SJMP RIGHT1+1
,,, ;
,,,$EJECT
,,, ;***************************************************************
,,, ;
027A,,LEFT,LEFT: ; Shift ACCUMULATOR LEFT the number of nibbles in R7
,,, ;
,,, ;***************************************************************
,,, ;
027A,7C 00,, MOV R4,#00H ;CLEAR FOR SOME ENTRYS
,,, ;
027C,C3,LEFT1,LEFT1: CLR C
027D,EF,, MOV A,R7 ;GET SHIFT VALUE
027E,60 22,, JZ LEFT5-1 ;EXIT IF ZERO
0280,94 02,, SUBB A,#2 ;SEE HOW MANY BYTES TO SHIFT
0282,50 1F,, JNC LEFT5
,,, ;
0284,C0 00,LEFT3,LEFT3: PUSH R0B0 ;SAVE POINTER
0286,C0 01,, PUSH R1B0
0288,78 2A,, MOV R0,#FP_CARRY
028A,79 2B,, MOV R1,#FP_DIG12
,,, ;
028C,E6,, MOV A,@R0 ;ACC=CHCL
028D,C4,, SWAP A ;ACC = CLCH
028E,F6,, MOV @R0,A ;ACC = CLCH, @R0 = CLCH
,,, ;
028F,E7,LEFTL,LEFTL: MOV A,@R1 ;DIG 12
0290,C4,, SWAP A ;DIG 21
0291,D6,, XCHD A,@R0
0292,F7,, MOV @R1,A ;SAVE IT
0293,08,, INC R0 ;BUMP POINTERS
0294,09,, INC R1
0295,B8 2E F7,, CJNE R0,#FP_DIG78,LEFTL
,,, ;
0298,EC,, MOV A,R4
0299,C4,, SWAP A
029A,D6,, XCHD A,@R0
029B,54 F0,, ANL A,#0F0H
029D,FC,, MOV R4,A
,,, ;
029E,D0 01,, POP R1B0
02A0,D0 00,, POP R0B0 ;RESTORE
02A2,22,, RET ;DONE
,,, ;
02A3,FF,LEFT5,LEFT5: MOV R7,A ;RESTORE COUNT
02A4,E4,, CLR A
02A5,CC,, XCH A,R4 ;GET THE RESTORATION BYTE
02A6,C5 2E,, XCH A,FP_DIG78 ;DO THE SWAP
02A8,C5 2D,, XCH A,FP_DIG56
02AA,C5 2C,, XCH A,FP_DIG34
02AC,C5 2B,, XCH A,FP_DIG12
02AE,C5 2A,, XCH A,FP_CARRY
02B0,80 CB,, SJMP LEFT1+1
,,, ;
,,,$EJECT
02B2,,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
,,, ;
02B2,54 0F,, ANL A,#0FH ;STRIP OFF MS NIBBLE
02B4,FF,, MOV R7,A
02B5,78 3C,, MOV R0,#FP_ACC8
02B7,79 32,, MOV R1,#FP_NIB8
02B9,E4,, CLR A
02BA,F5 33,, MOV FP_ACCX,A
,,, ;
02BC,18,MNLOOP,MNLOOP: DEC R0 ;BUMP POINTER TO PROPAGATE CARRY
02BD,26,, ADD A,@R0 ;ATTEMPT TO FORCE CARRY
02BE,D4,, DA A ;BCD ADJUST
02BF,30 E4 03,, JNB ACC.4,MNL0 ;DON'T ADJUST IF NO NEED
02C2,18,, DEC R0 ;PROPAGATE CARRY TO THE NEXT DIGIT
02C3,06,, INC @R0 ;DO THE ADJUSTING
02C4,08,, INC R0 ;RESTORE R0
,,, ;
02C5,D6,MNL0,MNL0: XCHD A,@R0 ;RESTORE INITIAL NUMBER
02C6,8F F0,, MOV B,R7 ;GET THE NUBBLE TO MULTIPLY
02C8,E7,, MOV A,@R1 ;GET THE OTHER NIBBLE
02C9,A4,, MUL AB ;DO THE MULTIPLY
02CA,75 F0 0A,, MOV B,#10 ;NOW BCD ADJUST
02CD,84,, DIV AB
02CE,C5 F0,, XCH A,B ;GET THE REMAINDER
02D0,26,, ADD A,@R0 ;PROPAGATE THE PARTIAL PRODUCTS
02D1,D4,, DA A ;BCD ADJUST
02D2,30 E4 02,, JNB ACC.4,MNL1 ;PROPAGATE PARTIAL PRODUCT CARRY
02D5,05 F0,, INC B
,,, ;
02D7,08,MNL1,MNL1: INC R0
02D8,D6,, XCHD A,@R0 ;SAVE THE NEW PRODUCT
02D9,18,, DEC R0
02DA,E5 F0,, MOV A,B ;GET BACK THE QUOTIENT
02DC,19,, DEC R1
02DD,B9 2A DC,, CJNE R1,#FP_NIB1-1,MNLOOP
,,, ;
02E0,25 33,, ADD A,FP_ACCX ;GET THE OVERFLOW
02E2,D4,, DA A ;ADJUST
02E3,F6,, MOV @R0,A ;SAVE IT
02E4,22,, RET ;EXIT
,,, ;
,,,$EJECT
,,, ;***************************************************************
,,, ;
02E5,,LOAD_POINTERS,LOAD_POINTERS: ; Load the ARG_STACK into R0 and bump R1
,,, ;
,,, ;***************************************************************
,,, ;
02E5,75 A0 01,, MOV P2,#ARG_STACK_PAGE
02E8,A8 24,, MOV R0,ARG_STACK
02EA,74 06,, MOV A,#FP_NUMBER_SIZE
02EC,28,, ADD A,R0
02ED,F9,, MOV R1,A
02EE,22,, RET
,,, ;
,,, ;***************************************************************
,,, ;
02EF,,MUL_DIV_EXP_AND_SIGN,MUL_DIV_EXP_AND_SIGN:
,,, ;
,,, ; Load the sign into R7, R6. R5 gets the sign for
,,, ; multiply and divide.
,,, ;
,,, ;***************************************************************
,,, ;
02EF,51 39,, ACALL FP_CLEAR ;CLEAR INTERNAL MEMORY
,,, ;
02F1,51 E5,MDES1,MDES1: ACALL LOAD_POINTERS ;LOAD REGISTERS
02F3,E2,, MOVX A,@R0 ;ARG 1 EXP
02F4,FF,, MOV R7,A ;SAVED IN R7
02F5,E3,, MOVX A,@R1 ;ARG 2 EXP
02F6,FE,, MOV R6,A ;SAVED IN R6
02F7,18,, DEC R0 ;BUMP POINTERS TO SIGN
02F8,19,, DEC R1
02F9,E2,, MOVX A,@R0 ;GET THE SIGN
02FA,FC,, MOV R4,A ;SIGN OF ARG1
02FB,E3,, MOVX A,@R1 ;GET SIGN OF NEXT ARG
02FC,FB,, MOV R3,A ;SIGN OF ARG2
02FD,6C,, XRL A,R4 ;ACC GETS THE NEW SIGN
02FE,FD,, MOV R5,A ;R5 GETS THE NEW SIGN
,,, ;
,,, ; Bump the pointers to point at the LS digit
,,, ;
02FF,18,, DEC R0
0300,19,, DEC R1
,,, ;
0301,22,, RET
,,, ;
,,,$EJECT
,,, ;***************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -