📄 fp52.sdi
字号:
046F,B4 08 02,, CJNE A,#8,FREE4
0472,81 D2,, AJMP OUTR0
,,, ;
0474,91 D2,FREE4,FREE4: ACALL OUTR0
0476,91 E4,, ACALL ZTEST ;TEST FOR TRAILING ZEROS
0478,60 57,, JZ U_RET ;DONE IF ALL TRAILING ZEROS
047A,B1 19,, ACALL ROUT ;OUTPUT RADIX
,,, ;
047C,7F 01,FREE2,FREE2: MOV R7,#1 ;OUTPUT ONE DIGIT
047E,91 D2,, ACALL OUTR0
0480,70 4F,, JNZ U_RET
0482,91 E4,, ACALL ZTEST
0484,60 4B,, JZ U_RET
0486,80 F4,, SJMP FREE2 ;LOOP
,,, ;
0488,B1 12,EXPOUT,EXPOUT: ACALL SINOUT ;PRINT THE SIGN
048A,7F 01,, MOV R7,#1 ;OUTPUT ONE CHARACTER
048C,91 D2,, ACALL OUTR0
048E,B1 19,, ACALL ROUT ;OUTPUT RADIX
0490,EB,, MOV A,R3 ;GET FORMAT
0491,54 0F,, ANL A,#0FH ;STRIP INDICATOR
0493,60 06,, JZ EXPOTX
,,, ;
0495,FF,, MOV R7,A ;OUTPUT THE NUMBER OF DIGITS
0496,1F,, DEC R7 ;ADJUST BECAUSE ONE CHAR ALREADY OUT
0497,91 D2,, ACALL OUTR0
0499,80 02,, SJMP EXPOT4
,,, ;
049B,91 7C,EXPOTX,EXPOTX: ACALL FREE2 ;OUTPUT UNTIL TRAILING ZEROS
,,, ;
049D,B1 21,EXPOT4,EXPOT4: ACALL SOUT ;OUTPUT A SPACE
049F,7D 45,, MOV R5,#'E'
04A1,B1 23,, ACALL SOUT1 ;OUTPUT AN E
04A3,EE,, MOV A,R6 ;GET THE EXPONENT
04A4,60 04,, JZ XOUT0 ;EXIT IF ZERO
04A6,14,, DEC A ;ADJUST FOR THE DIGIT ALREADY OUTPUT
04A7,B4 80 05,, CJNE A,#80H,XOUT2 ;SEE WHAT IT IS
,,, ;
04AA,B1 21,XOUT0,XOUT0: ACALL SOUT
04AC,E4,, CLR A
04AD,80 0C,, SJMP XOUT4
,,, ;
04AF,40 06,XOUT2,XOUT2: JC XOUT3 ;NEGATIVE EXPONENT
04B1,7D 2B,, MOV R5,#'+' ;OUTPUT A PLUS SIGN
04B3,B1 23,, ACALL SOUT1
04B5,80 04,, SJMP XOUT4
,,, ;
04B7,B1 15,XOUT3,XOUT3: ACALL MOUT
04B9,F4,, CPL A ;FLIP BITS
04BA,04,, INC A ;BUMP
,,, ;
04BB,C2 E7,XOUT4,XOUT4: CLR ACC.7
04BD,F8,, MOV R0,A
04BE,7A 00,, MOV R2,#0
04C0,79 48,, MOV R1,#LOW CONVT ;CONVERSION LOCATION
04C2,7B 00,, MOV R3,#HIGH CONVT
04C4,B1 7E,, ACALL CONVERT_BINARY_TO_ASCII_STRING
04C6,78 48,, MOV R0,#LOW CONVT ;NOW, OUTPUT EXPONENT
,,, ;
04C8,E2,EXPOT5,EXPOT5: MOVX A,@R0 ;GET THE CHARACTER
04C9,FD,, MOV R5,A ;OUTPUT IT
04CA,B1 23,, ACALL SOUT1
04CC,08,, INC R0 ;BUMP THE POINTER
04CD,E8,, MOV A,R0 ;GET THE POINTER
04CE,B5 01 F7,, CJNE A,R1B0,EXPOT5 ;LOOP
,,, ;
04D1,22,U_RET,U_RET: RET ;EXIT
,,, ;
04D2,,OUTR0,OUTR0: ; Output the characters pointed to by R0, also bias ascii
,,, ;
04D2,EF,, MOV A,R7 ;GET THE COUNTER
04D3,60 0E,, JZ OUTR ;EXIT IF DONE
04D5,E6,, MOV A,@R0 ;GET THE NUMBER
04D6,44 30,, ORL A,#30H ;ASCII BIAS
04D8,08,, INC R0 ;BUMP POINTER AND COUNTER
04D9,1F,, DEC R7
04DA,FD,, MOV R5,A ;PUT CHARACTER IN OUTPUT REGISTER
04DB,B1 23,, ACALL SOUT1 ;OUTPUT THE CHARACTER
04DD,E4,, CLR A ;JUST FOR TEST
04DE,B8 33 F1,, CJNE R0,#FP_NIB8+1,OUTR0
04E1,74 55,, MOV A,#55H ;KNOW WHERE EXIT OCCURED
,,, ;
04E3,22,OUTR,OUTR: RET
,,, ;
04E4,A9 00,ZTEST,ZTEST: MOV R1,R0B0 ;GET POINTER REGISTER
,,, ;
04E6,E7,ZT0,ZT0: MOV A,@R1 ;GET THE VALUE
04E7,70 04,, JNZ ZT1
04E9,09,, INC R1 ;BUMP POINTER
04EA,B9 33 F9,, CJNE R1,#FP_NIB8+1,ZT0
,,, ;
04ED,22,ZT1,ZT1: RET
,,, ;
04EE,EE,NUM_LT,NUM_LT: MOV A,R6 ;GET EXPONENT
04EF,C3,, CLR C ;GET READY FOR SUBB
04F0,94 80,, SUBB A,#80H ;SUB EXPONENT BIAS
04F2,50 01,, JNC NL1 ;OK IF NO CARRY
04F4,E4,, CLR A ;NO DIGITS LEFT
,,, ;
04F5,FF,NL1,NL1: MOV R7,A ;SAVE THE COUNT
04F6,22,, RET
,,, ;
04F7,C3,NUM_RT,NUM_RT: CLR C ;SUBB AGAIN
04F8,74 80,, MOV A,#80H ;EXPONENT BIAS
04FA,9E,, SUBB A,R6 ;GET THE BIASED EXPONENT
04FB,50 01,, JNC NR1
04FD,E4,, CLR A
,,, ;
04FE,22,NR1,NR1: RET ;EXIT
,,, ;
04FF,EF,SPACE7,SPACE7: MOV A,R7 ;GET THE NUMBER OF SPACES
0500,60 FC,, JZ NR1 ;EXIT IF ZERO
0502,B1 21,, ACALL SOUT ;OUTPUT A SPACE
0504,1F,, DEC R7 ;BUMP COUNTER
0505,80 F8,, SJMP SPACE7 ;LOOP
,,, ;
0507,FF,Z7R7,Z7R7: MOV R7,A
,,, ;
0508,EF,ZERO7,ZERO7: MOV A,R7 ;GET COUNTER
0509,60 F3,, JZ NR1 ;EXIT IF ZERO
050B,B1 1D,, ACALL ZOUT ;OUTPUT A ZERO
050D,1F,, DEC R7 ;BUMP COUNTER
050E,80 F8,, SJMP ZERO7 ;LOOP
,,, ;
0510,91 FF,SS7,SS7: ACALL SPACE7
,,, ;
0512,EC,SINOUT,SINOUT: MOV A,R4 ;GET THE SIGN
0513,60 0C,, JZ SOUT ;OUTPUT A SPACE IF ZERO
,,, ;
0515,7D 2D,MOUT,MOUT: MOV R5,#'-'
0517,80 0A,, SJMP SOUT1 ;OUTPUT A MINUS IF NOT
,,, ;
0519,7D 2E,ROUT,ROUT: MOV R5,#'.' ;OUTPUT A RADIX
051B,80 06,, SJMP SOUT1
,,, ;
051D,7D 30,ZOUT,ZOUT: MOV R5,#'0' ;OUTPUT A ZERO
051F,80 02,, SJMP SOUT1
,,, ;
0521,7D 20,SOUT,SOUT: MOV R5,#' ' ;OUTPUT A SPACE
,,, ;
0523,A1 FF,SOUT1,SOUT1: AJMP R5OUT
,,, ;
,,,$EJECT
,,, ;***************************************************************
,,, ;
0525,,CONVERT_ASCII_STRING_TO_BINARY,CONVERT_ASCII_STRING_TO_BINARY:
,,, ;
,,, ;DPTR POINTS TO ASCII STRING
,,, ;PUT THE BINARY NUMBER IN R2:R0, ERROR IF >64K
,,, ;
,,, ;***************************************************************
,,, ;
0525,71 10,CASB,CASB: ACALL HEXSCAN ;SEE IF HEX NUMBER
0527,92 33,, MOV ADD_IN,C ;IF ADD_IN IS SET, THE NUMBER IS HEX
0529,B1 F2,, ACALL GET_DIGIT_CHECK
052B,B3,, CPL C ;FLIP FOR EXIT
052C,40 28,, JC RCASB
052E,7B 00,, MOV R3,#00H ;ZERO R3:R1 FOR LOOP
0530,79 00,, MOV R1,#00H
0532,80 15,, SJMP CASB5
,,, ;
0534,A3,CASB2,CASB2: INC DPTR
0535,89 00,, MOV R0B0,R1 ;SAVE THE PRESENT CONVERTED VALUE
0537,8B 02,, MOV R0B0+2,R3 ;IN R2:R0
0539,B1 F2,, ACALL GET_DIGIT_CHECK
053B,40 0C,, JC CASB5
053D,30 33 16,, JNB ADD_IN,RCASB ;CONVERSION COMPLETE
0540,71 30,, ACALL HEX_CHECK ;SEE IF HEX NUMBER
0542,40 03,, JC CASB4 ;PROCEED IF GOOD
0544,A3,, INC DPTR ;BUMP PAST H
0545,80 0F,, SJMP RCASB
,,, ;
0547,24 09,CASB4,CASB4: ADD A,#9 ;ADJUST HEX ASCII BIAS
,,, ;
0549,75 F0 0A,CASB5,CASB5: MOV B,#10
054C,30 33 03,, JNB ADD_IN,CASB6
054F,75 F0 10,, MOV B,#16 ;HEX MODE
,,, ;
0552,B1 5D,CASB6,CASB6: ACALL MULNUM ;ACCUMULATE THE DIGITS
0554,50 DE,, JNC CASB2 ;LOOP IF NO CARRY
,,, ;
0556,E4,RCASB,RCASB: CLR A ;RESET ACC
0557,92 E1,, MOV ACC.OVERFLOW,C ;IF OVERFLOW, SAY SO
0559,22,, RET ;EXIT
,,, ;
,,,$EJECT
,,, ;
055A,75 F0 0A,MULNUM10,MULNUM10:MOV B,#10
,,, ;
,,, ;***************************************************************
,,, ;
055D,,MULNUM,MULNUM: ; Take the next digit in the acc (masked to 0FH)
,,, ; accumulate in R3:R1
,,, ;
,,, ;***************************************************************
,,, ;
055D,C0 E0,, PUSH ACC ;SAVE ACC
055F,C0 F0,, PUSH B ;SAVE MULTIPLIER
0561,E9,, MOV A,R1 ;PUT LOW ORDER BITS IN ACC
0562,A4,, MUL AB ;DO THE MULTIPLY
0563,F9,, MOV R1,A ;PUT THE RESULT BACK
0564,EB,, MOV A,R3 ;GET THE HIGH ORDER BYTE
0565,AB F0,, MOV R3,B ;SAVE THE OVERFLOW
0567,D0 F0,, POP B ;GET THE MULTIPLIER
0569,A4,, MUL AB ;DO IT
056A,A2 D2,, MOV C,OV ;SAVE OVERFLOW IN F0
056C,92 D5,, MOV F0,C
056E,2B,, ADD A,R3 ;ADD OVERFLOW TO HIGH RESULT
056F,FB,, MOV R3,A ;PUT IT BACK
0570,D0 E0,, POP ACC ;GET THE ORIGINAL ACC BACK
0572,72 D5,, ORL C,F0 ;OR CARRY AND OVERFLOW
0574,40 07,, JC MULX ;NO GOOD IF THE CARRY IS SET
,,, ;
0576,54 0F,MUL11,MUL11: ANL A,#0FH ;MASK OFF HIGH ORDER BITS
0578,29,, ADD A,R1 ;NOW ADD THE ACC
0579,F9,, MOV R1,A ;PUT IT BACK
057A,E4,, CLR A ;PROPAGATE THE CARRY
057B,3B,, ADDC A,R3
057C,FB,, MOV R3,A ;PUT IT BACK
,,, ;
057D,22,MULX,MULX: RET ;EXIT WITH OR WITHOUT CARRY
,,, ;
,,, ;***************************************************************
,,, ;
057E,,CONVERT_BINARY_TO_ASCII_STRING,CONVERT_BINARY_TO_ASCII_STRING:
,,, ;
,,, ;R3:R1 contains the address of the string
,,, ;R2:R0 contains the value to convert
,,, ;DPTR, R7, R6, and ACC gets clobbered
,,, ;
,,, ;***************************************************************
,,, ;
057E,E4,, CLR A ;NO LEADING ZEROS
057F,90 27 10,, MOV DPTR,#10000 ;SUBTRACT 10000
0582,B1 9B,, ACALL RSUB ;DO THE SUBTRACTION
0584,90 03 E8,, MOV DPTR,#1000 ;NOW 1000
0587,B1 9B,, ACALL RSUB
0589,90 00 64,, MOV DPTR,#100 ;NOW 100
058C,B1 9B,, ACALL RSUB
058E,90 00 0A,, MOV DPTR,#10 ;NOW 10
0591,B1 9B,, ACALL RSUB
0593,90 00 01,, MOV DPTR,#1 ;NOW 1
0596,B1 9B,, ACALL RSUB
0598,60 20,, JZ RSUB2 ;JUMP OVER RET
,,, ;
059A,22,RSUB_R,RSUB_R: RET
,,, ;
059B,7E FF,RSUB,RSUB: MOV R6,#-1 ;SET UP THE COUNTER
,,, ;
059D,0E,RSUB1,RSUB1: INC R6 ;BUMP THE COUNTER
059E,CA,, XCH A,R2 ;DO A FAST COMPARE
059F,B5 83 00,, CJNE A,DPH,$+3
05A2,CA,, XCH A,R2
05A3,40 12,, JC FAST_DONE
05A5,C8,, XCH A,R0 ;GET LOW BYTE
05A6,95 82,, SUBB A,DPL ;SUBTRACT, CARRY IS CLEARED
05A8,C8,, XCH A,R0 ;PUT IT BACK
05A9,CA,, XCH A,R2 ;GET THE HIGH BYTE
05AA,95 83,, SUBB A,DPH ;ADD THE HIGH BYTE
05AC,CA,, XCH A,R2 ;PUT IT BACK
05AD,50 EE,, JNC RSUB1 ;LOOP UNTIL CARRY
,,, ;
05AF,C8,, XCH A,R0
05B0,25 82,, ADD A,DPL ;RESTORE R2:R0
05B2,C8,, XCH A,R0
05B3,CA,, XCH A,R2
05B4,35 83,, ADDC A,DPH
05B6,CA,, XCH A,R2
,,, ;
05B7,,FAST_DONE,FAST_DONE:
,,, ;
05B7,4E,, ORL A,R6 ;OR THE COUNT VALUE
05B8,60 E0,, JZ RSUB_R ;RETURN IF ZERO
,,, ;
05BA,74 30,RSUB2,RSUB2: MOV A,#'0' ;GET THE ASCII BIAS
05BC,2E,, ADD A,R6 ;ADD THE COUNT
,,, ;
05BD,8B A0,RSUB4,RSUB4: MOV P2,R3 ;SET UP P2
05BF,F3,, MOVX @R1,A ;PLACE THE VALUE IN MEMORY
05C0,09,, INC R1
05C1,B9 00 01,, CJNE R1,#00H,RSUB3 ;SEE IF RAPPED AROUND
05C4,0B,, INC R3 ;BUMP HIGH BYTE
,,, ;
05C5,22,RSUB3,RSUB3: RET ;EXIT
,,, ;
,,,$EJECT
,,, ;***************************************************************
,,, ;
05C6,,HEXOUT,HEXOUT: ; Output the hex number in R3:R1, supress leading zeros, if set
,,, ;
,,, ;***************************************************************
,,, ;
05C6,B1 21,, ACALL SOUT ;OUTPUT A SPACE
05C8,A2 36,, MOV C,ZSURP ;GET ZERO SUPPRESSION BIT
05CA,92 33,, MOV ADD_IN,C
05CC,EB,, MOV A,R3 ;GET HIGH NIBBLE AND PRINT IT
05CD,B1 E9,, ACALL HOUTHI
05CF,EB,, MOV A,R3
05D0,B1 EA,, ACALL HOUTLO
,,, ;
05D2,C2 33,HEX2X,HEX2X: CLR ADD_IN ;DON'T SUPPRESS ZEROS
05D4,E9,, MOV A,R1 ;GET LOW NIBBLE AND PRINT IT
05D5,B1 E9,, ACALL HOUTHI
05D7,E9,, MOV A,R1
05D8,B1 EA,, ACALL HOUTLO
05DA,7D 48,, MOV R5,#'H' ;OUTPUT H TO INDICATE HEX MODE
,,, ;
05DC,A1 23,SOUT_1,SOUT_1: AJMP SOUT1
,,, ;
05DE,C2 33,HOUT1,HOUT1: CLR ADD_IN ;PRINTED SOMETHING, SO CLEAR ADD_IN
05E0,24 90,, ADD A,#90H ;CONVERT TO ASCII
05E2,D4,, DA A
05E3,34 40,, ADDC A,#40H
05E5,D4,, DA A ;GOT IT HERE
05E6,FD,, MOV R5,A ;OUTPUT THE BYTE
05E7,80 F3,, SJMP SOUT_1
,,, ;
05E9,C4,HOUTHI,HOUTHI: SWAP A ;SWAP TO OUTPUT HIGH
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -