📄 calc.sdi
字号:
0578,D1 51,USING0,USING0: ACALL SS7 ;OUTPUT SPACES, IF NEED TO
057A,EA,, MOV A,R2 ;OUTPUT DIGITS
057B,FF,, MOV R7,A
057C,D1 13,, ACALL OUTR0
,,, ;
057E,EB,USING1,USING1: MOV A,R3
057F,54 0F,, ANL A,#0FH ;GET THE NUMBER RIGHT OF DP
0581,FA,, MOV R2,A ;SAVE IT
0582,60 BD,, JZ PMT1 ;EXIT IF ZERO
0584,D1 5A,, ACALL ROUT ;OUTPUT DP
0586,D1 38,, ACALL NUM_RT
0588,B5 02 03,, CJNE A,2,USINGX ;COMPARE A TO R2
,,, ;
058B,EA,USINGY,USINGY: MOV A,R2
058C,C1 48,, AJMP Z7R7
,,, ;
058E,50 FB,USINGX,USINGX: JNC USINGY
,,, ;
0590,CA,USING2,USING2: XCH A,R2
0591,C3,, CLR C
0592,9A,, SUBB A,R2
0593,CA,, XCH A,R2
0594,D1 48,, ACALL Z7R7 ;OUTPUT ZEROS IF NEED TO
0596,EA,, MOV A,R2
0597,FF,, MOV R7,A
0598,C1 13,, AJMP OUTR0
,,, ;
,,, ; First, force exponential output, if need to
,,, ;
059A,EE,FREE,FREE: MOV A,R6 ;GET THE EXPONENT
059B,70 04,, JNZ FREE1 ;IF ZERO, PRINT IT
059D,D1 62,, ACALL SOUT
059F,C1 5E,, AJMP ZOUT
,,, ;
05A1,7B F0,FREE1,FREE1: MOV R3,#0F0H ;IN CASE EXP NEEDED
05A3,74 77,, MOV A,#80H-DIGIT-DIGIT-1
05A5,2E,, ADD A,R6
05A6,40 21,, JC EXPOUT
05A8,94 F7,, SUBB A,#0F7H
05AA,40 1D,, JC EXPOUT
,,, ;
,,, ; Now, just print the number
,,, ;
05AC,D1 53,, ACALL SINOUT ;PRINT THE SIGN OF THE NUMBER
05AE,D1 2F,, ACALL NUM_LT ;GET THE NUMBER LEFT OF DP
05B0,B4 08 02,, CJNE A,#8,FREE4
05B3,C1 13,, AJMP OUTR0
,,, ;
05B5,D1 13,FREE4,FREE4: ACALL OUTR0
05B7,D1 25,, ACALL ZTEST ;TEST FOR TRAILING ZEROS
05B9,60 57,, JZ U_RET ;DONE IF ALL TRAILING ZEROS
05BB,D1 5A,, ACALL ROUT ;OUTPUT RADIX
,,, ;
05BD,7F 01,FREE2,FREE2: MOV R7,#1 ;OUTPUT ONE DIGIT
05BF,D1 13,, ACALL OUTR0
05C1,70 4F,, JNZ U_RET
05C3,D1 25,, ACALL ZTEST
05C5,60 4B,, JZ U_RET
05C7,80 F4,, SJMP FREE2 ;LOOP
,,, ;
05C9,D1 53,EXPOUT,EXPOUT: ACALL SINOUT ;PRINT THE SIGN
05CB,7F 01,, MOV R7,#1 ;OUTPUT ONE CHARACTER
05CD,D1 13,, ACALL OUTR0
05CF,D1 5A,, ACALL ROUT ;OUTPUT RADIX
05D1,EB,, MOV A,R3 ;GET FORMAT
05D2,54 0F,, ANL A,#0FH ;STRIP INDICATOR
05D4,60 06,, JZ EXPOTX
,,, ;
05D6,FF,, MOV R7,A ;OUTPUT THE NUMBER OF DIGITS
05D7,1F,, DEC R7 ;ADJUST BECAUSE ONE CHAR ALREADY OUT
05D8,D1 13,, ACALL OUTR0
05DA,80 02,, SJMP EXPOT4
,,, ;
05DC,B1 BD,EXPOTX,EXPOTX: ACALL FREE2 ;OUTPUT UNTIL TRAILING ZEROS
,,, ;
05DE,D1 62,EXPOT4,EXPOT4: ACALL SOUT ;OUTPUT A SPACE
05E0,7D 45,, MOV R5,#'E'
05E2,D1 64,, ACALL SOUT1 ;OUTPUT AN E
05E4,EE,, MOV A,R6 ;GET THE EXPONENT
05E5,60 04,, JZ XOUT0 ;EXIT IF ZERO
05E7,14,, DEC A ;ADJUST FOR THE DIGIT ALREADY OUTPUT
05E8,B4 80 05,, CJNE A,#80H,XOUT2 ;SEE WHAT IT IS
,,, ;
05EB,D1 62,XOUT0,XOUT0: ACALL SOUT
05ED,E4,, CLR A
05EE,80 0C,, SJMP XOUT4
,,, ;
05F0,40 06,XOUT2,XOUT2: JC XOUT3 ;NEGATIVE EXPONENT
05F2,7D 2B,, MOV R5,#'+' ;OUTPUT A PLUS SIGN
05F4,D1 64,, ACALL SOUT1
05F6,80 04,, SJMP XOUT4
,,, ;
05F8,D1 56,XOUT3,XOUT3: ACALL MOUT
05FA,F4,, CPL A ;FLIP BITS
05FB,04,, INC A ;BUMP
,,, ;
05FC,C2 E7,XOUT4,XOUT4: CLR ACC.7
05FE,F8,, MOV R0,A
05FF,7A 00,, MOV R2,#0
0601,79 48,, MOV R1,#LOW CONVT ;CONVERSION LOCATION
0603,7B 00,, MOV R3,#HIGH CONVT
0605,D1 BF,, ACALL CONVERT_BINARY_TO_ASCII_STRING
0607,78 48,, MOV R0,#LOW CONVT ;NOW, OUTPUT EXPONENT
,,, ;
0609,E2,EXPOT5,EXPOT5: MOVX A,@R0 ;GET THE CHARACTER
060A,FD,, MOV R5,A ;OUTPUT IT
060B,D1 64,, ACALL SOUT1
060D,08,, INC R0 ;BUMP THE POINTER
060E,E8,, MOV A,R0 ;GET THE POINTER
060F,B5 01 F7,, CJNE A,R1B0,EXPOT5 ;LOOP
,,, ;
0612,22,U_RET,U_RET: RET ;EXIT
,,, ;
0613,,OUTR0,OUTR0: ; Output the characters pointed to by R0, also bias ascii
,,, ;
0613,EF,, MOV A,R7 ;GET THE COUNTER
0614,60 0E,, JZ OUTR ;EXIT IF DONE
0616,E6,, MOV A,@R0 ;GET THE NUMBER
0617,44 30,, ORL A,#30H ;ASCII BIAS
0619,08,, INC R0 ;BUMP POINTER AND COUNTER
061A,1F,, DEC R7
061B,FD,, MOV R5,A ;PUT CHARACTER IN OUTPUT REGISTER
061C,D1 64,, ACALL SOUT1 ;OUTPUT THE CHARACTER
061E,E4,, CLR A ;JUST FOR TEST
061F,B8 33 F1,, CJNE R0,#FP_NIB8+1,OUTR0
0622,74 55,, MOV A,#55H ;KNOW WHERE EXIT OCCURED
,,, ;
0624,22,OUTR,OUTR: RET
,,, ;
0625,A9 00,ZTEST,ZTEST: MOV R1,R0B0 ;GET POINTER REGISTER
,,, ;
0627,E7,ZT0,ZT0: MOV A,@R1 ;GET THE VALUE
0628,70 04,, JNZ ZT1
062A,09,, INC R1 ;BUMP POINTER
062B,B9 33 F9,, CJNE R1,#FP_NIB8+1,ZT0
,,, ;
062E,22,ZT1,ZT1: RET
,,, ;
062F,EE,NUM_LT,NUM_LT: MOV A,R6 ;GET EXPONENT
0630,C3,, CLR C ;GET READY FOR SUBB
0631,94 80,, SUBB A,#80H ;SUB EXPONENT BIAS
0633,50 01,, JNC NL1 ;OK IF NO CARRY
0635,E4,, CLR A ;NO DIGITS LEFT
,,, ;
0636,FF,NL1,NL1: MOV R7,A ;SAVE THE COUNT
0637,22,, RET
,,, ;
0638,C3,NUM_RT,NUM_RT: CLR C ;SUBB AGAIN
0639,74 80,, MOV A,#80H ;EXPONENT BIAS
063B,9E,, SUBB A,R6 ;GET THE BIASED EXPONENT
063C,50 01,, JNC NR1
063E,E4,, CLR A
,,, ;
063F,22,NR1,NR1: RET ;EXIT
,,, ;
0640,EF,SPACE7,SPACE7: MOV A,R7 ;GET THE NUMBER OF SPACES
0641,60 FC,, JZ NR1 ;EXIT IF ZERO
0643,D1 62,, ACALL SOUT ;OUTPUT A SPACE
0645,1F,, DEC R7 ;BUMP COUNTER
0646,80 F8,, SJMP SPACE7 ;LOOP
,,, ;
0648,FF,Z7R7,Z7R7: MOV R7,A
,,, ;
0649,EF,ZERO7,ZERO7: MOV A,R7 ;GET COUNTER
064A,60 F3,, JZ NR1 ;EXIT IF ZERO
064C,D1 5E,, ACALL ZOUT ;OUTPUT A ZERO
064E,1F,, DEC R7 ;BUMP COUNTER
064F,80 F8,, SJMP ZERO7 ;LOOP
,,, ;
0651,D1 40,SS7,SS7: ACALL SPACE7
,,, ;
0653,EC,SINOUT,SINOUT: MOV A,R4 ;GET THE SIGN
0654,60 0C,, JZ SOUT ;OUTPUT A SPACE IF ZERO
,,, ;
0656,7D 2D,MOUT,MOUT: MOV R5,#'-'
0658,80 0A,, SJMP SOUT1 ;OUTPUT A MINUS IF NOT
,,, ;
065A,7D 2E,ROUT,ROUT: MOV R5,#'.' ;OUTPUT A RADIX
065C,80 06,, SJMP SOUT1
,,, ;
065E,7D 30,ZOUT,ZOUT: MOV R5,#'0' ;OUTPUT A ZERO
0660,80 02,, SJMP SOUT1
,,, ;
0662,7D 20,SOUT,SOUT: MOV R5,#' ' ;OUTPUT A SPACE
,,, ;
0664,E1 40,SOUT1,SOUT1: AJMP R5OUT
,,, ;
,,,$EJECT
,,, ;***************************************************************
,,, ;
0666,,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
,,, ;
,,, ;***************************************************************
,,, ;
0666,91 51,CASB,CASB: ACALL HEXSCAN ;SEE IF HEX NUMBER
0668,92 33,, MOV ADD_IN,C ;IF ADD_IN IS SET, THE NUMBER IS HEX
066A,F1 33,, ACALL GET_DIGIT_CHECK
066C,B3,, CPL C ;FLIP FOR EXIT
066D,40 28,, JC RCASB
066F,7B 00,, MOV R3,#00H ;ZERO R3:R1 FOR LOOP
0671,79 00,, MOV R1,#00H
0673,80 15,, SJMP CASB5
,,, ;
0675,A3,CASB2,CASB2: INC DPTR
0676,89 00,, MOV R0B0,R1 ;SAVE THE PRESENT CONVERTED VALUE
0678,8B 02,, MOV R0B0+2,R3 ;IN R2:R0
067A,F1 33,, ACALL GET_DIGIT_CHECK
067C,40 0C,, JC CASB5
067E,30 33 16,, JNB ADD_IN,RCASB ;CONVERSION COMPLETE
0681,91 71,, ACALL HEX_CHECK ;SEE IF HEX NUMBER
0683,40 03,, JC CASB4 ;PROCEED IF GOOD
0685,A3,, INC DPTR ;BUMP PAST H
0686,80 0F,, SJMP RCASB
,,, ;
0688,24 09,CASB4,CASB4: ADD A,#9 ;ADJUST HEX ASCII BIAS
,,, ;
068A,75 F0 0A,CASB5,CASB5: MOV B,#10
068D,30 33 03,, JNB ADD_IN,CASB6
0690,75 F0 10,, MOV B,#16 ;HEX MODE
,,, ;
0693,D1 9E,CASB6,CASB6: ACALL MULNUM ;ACCUMULATE THE DIGITS
0695,50 DE,, JNC CASB2 ;LOOP IF NO CARRY
,,, ;
0697,E4,RCASB,RCASB: CLR A ;RESET ACC
0698,92 E1,, MOV ACC.OVERFLOW,C ;IF OVERFLOW, SAY SO
069A,22,, RET ;EXIT
,,, ;
,,,$EJECT
,,, ;
069B,75 F0 0A,MULNUM10,MULNUM10:MOV B,#10
,,, ;
,,, ;***************************************************************
,,, ;
069E,,MULNUM,MULNUM: ; Take the next digit in the acc (masked to 0FH)
,,, ; accumulate in R3:R1
,,, ;
,,, ;***************************************************************
,,, ;
069E,C0 E0,, PUSH ACC ;SAVE ACC
06A0,C0 F0,, PUSH B ;SAVE MULTIPLIER
06A2,E9,, MOV A,R1 ;PUT LOW ORDER BITS IN ACC
06A3,A4,, MUL AB ;DO THE MULTIPLY
06A4,F9,, MOV R1,A ;PUT THE RESULT BACK
06A5,EB,, MOV A,R3 ;GET THE HIGH ORDER BYTE
06A6,AB F0,, MOV R3,B ;SAVE THE OVERFLOW
06A8,D0 F0,, POP B ;GET THE MULTIPLIER
06AA,A4,, MUL AB ;DO IT
06AB,A2 D2,, MOV C,OV ;SAVE OVERFLOW IN F0
06AD,92 D5,, MOV F0,C
06AF,2B,, ADD A,R3 ;ADD OVERFLOW TO HIGH RESULT
06B0,FB,, MOV R3,A ;PUT IT BACK
06B1,D0 E0,, POP ACC ;GET THE ORIGINAL ACC BACK
06B3,72 D5,, ORL C,F0 ;OR CARRY AND OVERFLOW
06B5,40 07,, JC MULX ;NO GOOD IF THE CARRY IS SET
,,, ;
06B7,54 0F,MUL11,MUL11: ANL A,#0FH ;MASK OFF HIGH ORDER BITS
06B9,29,, ADD A,R1 ;NOW ADD THE ACC
06BA,F9,, MOV R1,A ;PUT IT BACK
06BB,E4,, CLR A ;PROPAGATE THE CARRY
06BC,3B,, ADDC A,R3
06BD,FB,, MOV R3,A ;PUT IT BACK
,,, ;
06BE,22,MULX,MULX: RET ;EXIT WITH OR WITHOUT CARRY
,,, ;
,,, ;***************************************************************
,,, ;
06BF,,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
,,, ;
,,, ;***************************************************************
,,, ;
06BF,E4,, CLR A ;NO LEADING ZEROS
06C0,90 27 10,, MOV DPTR,#10000 ;SUBTRACT 10000
06C3,D1 DC,, ACALL RSUB ;DO THE SUBTRACTION
06C5,90 03 E8,, MOV DPTR,#1000 ;NOW 1000
06C8,D1 DC,, ACALL RSUB
06CA,90 00 64,, MOV DPTR,#100 ;NOW 100
06CD,D1 DC,, ACALL RSUB
06CF,90 00 0A,, MOV DPTR,#10 ;NOW 10
06D2,D1 DC,, ACALL RSUB
06D4,90 00 01,, MOV DPTR,#1 ;NOW 1
06D7,D1 DC,, ACALL RSUB
06D9,60 20,, JZ RSUB2 ;JUMP OVER RET
,,, ;
06DB,22,RSUB_R,RSUB_R: RET
,,, ;
06DC,7E FF,RSUB,RSUB: MOV R6,#-1 ;SET UP THE COUNTER
,,, ;
06DE,0E,RSUB1,RSUB1: INC R6 ;BUMP THE COUNTER
06DF,CA,, XCH A,R2 ;DO A FAST COMPARE
06E0,B5 83 00,, CJNE A,DPH,$+3
06E3,CA,, XCH A,R2
06E4,40 12,, JC FAST_DONE
06E6,C8,, XCH A,R0 ;GET LOW BYTE
06E7,95 82,, SUBB A,DPL ;SUBTRACT, CARRY IS CLEARED
06E9,C8,, XCH A,R0 ;PUT IT BACK
06EA,CA,, XCH A,R2 ;GET THE HIGH BYTE
06EB,95 83,, SUBB A,DPH ;ADD THE HIGH BYTE
06ED,CA,, XCH A,R2 ;PUT IT BACK
06EE,50 EE,, JNC RSUB1 ;LOOP UNTIL CARRY
,,, ;
06F0,C8,, XCH A,R0
06F1,25 82,, ADD A,DPL ;RESTORE R2:R0
06F3,C8,, XCH A,R0
06F4,CA,, XCH A,R2
06F5,35 83,, ADDC A,DPH
06F7,CA,, XCH A,R2
,,, ;
06F8,,FAST_DONE,FAST_DONE:
,,, ;
06F8,4E,,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -