📄 fp-52.sdi
字号:
1E14,D1 9F,, ACALL ROUT ;OUTPUT RADIX
1E16,EB,, MOV A,R3 ;GET FORMAT
1E17,54 0F,, ANL A,#0FH ;STRIP INDICATOR
1E19,60 06,, JZ EXPOTX
,,, ;
1E1B,FF,, MOV R7,A ;OUTPUT THE NUMBER OF DIGITS
1E1C,1F,, DEC R7 ;ADJUST BECAUSE ONE CHAR ALREADY OUT
1E1D,D1 58,, ACALL OUTR0
1E1F,80 02,, SJMP EXPOT4
,,, ;
1E21,D1 02,EXPOTX,EXPOTX: ACALL FREE2 ;OUTPUT UNTIL TRAILING ZEROS
,,, ;
1E23,D1 A7,EXPOT4,EXPOT4: ACALL SOUT ;OUTPUT A SPACE
1E25,7D 45,, MOV R5,#'E'
1E27,D1 A9,, ACALL SOUT1 ;OUTPUT AN E
1E29,EE,, MOV A,R6 ;GET THE EXPONENT
1E2A,60 04,, JZ XOUT0 ;EXIT IF ZERO
1E2C,14,, DEC A ;ADJUST FOR THE DIGIT ALREADY OUTPUT
1E2D,B4 80 05,, CJNE A,#80H,XOUT2 ;SEE WHAT IT IS
,,, ;
1E30,D1 A7,XOUT0,XOUT0: ACALL SOUT
1E32,E4,, CLR A
1E33,80 0C,, SJMP XOUT4
,,, ;
1E35,40 06,XOUT2,XOUT2: JC XOUT3 ;NEGATIVE EXPONENT
1E37,7D 2B,, MOV R5,#'+' ;OUTPUT A PLUS SIGN
1E39,D1 A9,, ACALL SOUT1
1E3B,80 04,, SJMP XOUT4
,,, ;
1E3D,D1 9B,XOUT3,XOUT3: ACALL MOUT
1E3F,F4,, CPL A ;FLIP BITS
1E40,04,, INC A ;BUMP
,,, ;
1E41,C2 E7,XOUT4,XOUT4: CLR ACC.7
1E43,F8,, MOV R0,A
1E44,7A 00,, MOV R2,#0
1E46,79 58,, MOV R1,#LOW CONVT ;CONVERSION LOCATION
1E48,7B 00,, MOV R3,#HIGH CONVT
1E4A,F1 04,, ACALL CONVERT_BINARY_TO_ASCII_STRING
1E4C,78 58,, MOV R0,#LOW CONVT ;NOW, OUTPUT EXPONENT
,,, ;
1E4E,E2,EXPOT5,EXPOT5: MOVX A,@R0 ;GET THE CHARACTER
1E4F,FD,, MOV R5,A ;OUTPUT IT
1E50,D1 A9,, ACALL SOUT1
1E52,08,, INC R0 ;BUMP THE POINTER
1E53,E8,, MOV A,R0 ;GET THE POINTER
1E54,B5 01 F7,, CJNE A,R1B0,EXPOT5 ;LOOP
,,, ;
1E57,22,U_RET,U_RET: RET ;EXIT
,,, ;
1E58,,OUTR0,OUTR0: ; Output the characters pointed to by R0, also bias ascii
,,, ;
1E58,EF,, MOV A,R7 ;GET THE COUNTER
1E59,60 0E,, JZ OUTR ;EXIT IF DONE
1E5B,E6,, MOV A,@R0 ;GET THE NUMBER
1E5C,44 30,, ORL A,#30H ;ASCII BIAS
1E5E,08,, INC R0 ;BUMP POINTER AND COUNTER
1E5F,1F,, DEC R7
1E60,FD,, MOV R5,A ;PUT CHARACTER IN OUTPUT REGISTER
1E61,D1 A9,, ACALL SOUT1 ;OUTPUT THE CHARACTER
1E63,E4,, CLR A ;JUST FOR TEST
1E64,B8 33 F1,, CJNE R0,#FP_NIB8+1,OUTR0
1E67,74 55,, MOV A,#55H ;KNOW WHERE EXIT OCCURED
,,, ;
1E69,22,OUTR,OUTR: RET
,,, ;
1E6A,A9 00,ZTEST,ZTEST: MOV R1,R0B0 ;GET POINTER REGISTER
,,, ;
1E6C,E7,ZT0,ZT0: MOV A,@R1 ;GET THE VALUE
1E6D,70 04,, JNZ ZT1
1E6F,09,, INC R1 ;BUMP POINTER
1E70,B9 33 F9,, CJNE R1,#FP_NIB8+1,ZT0
,,, ;
1E73,22,ZT1,ZT1: RET
,,, ;
1E74,EE,NUM_LT,NUM_LT: MOV A,R6 ;GET EXPONENT
1E75,C3,, CLR C ;GET READY FOR SUBB
1E76,94 80,, SUBB A,#80H ;SUB EXPONENT BIAS
1E78,50 01,, JNC NL1 ;OK IF NO CARRY
1E7A,E4,, CLR A ;NO DIGITS LEFT
,,, ;
1E7B,FF,NL1,NL1: MOV R7,A ;SAVE THE COUNT
1E7C,22,, RET
,,, ;
1E7D,C3,NUM_RT,NUM_RT: CLR C ;SUBB AGAIN
1E7E,74 80,, MOV A,#80H ;EXPONENT BIAS
1E80,9E,, SUBB A,R6 ;GET THE BIASED EXPONENT
1E81,50 01,, JNC NR1
1E83,E4,, CLR A
,,, ;
1E84,22,NR1,NR1: RET ;EXIT
,,, ;
1E85,EF,SPACE7,SPACE7: MOV A,R7 ;GET THE NUMBER OF SPACES
1E86,60 FC,, JZ NR1 ;EXIT IF ZERO
1E88,D1 A7,, ACALL SOUT ;OUTPUT A SPACE
1E8A,1F,, DEC R7 ;BUMP COUNTER
1E8B,80 F8,, SJMP SPACE7 ;LOOP
,,, ;
1E8D,FF,Z7R7,Z7R7: MOV R7,A
,,, ;
1E8E,EF,ZERO7,ZERO7: MOV A,R7 ;GET COUNTER
1E8F,60 F3,, JZ NR1 ;EXIT IF ZERO
1E91,D1 A3,, ACALL ZOUT ;OUTPUT A ZERO
1E93,1F,, DEC R7 ;BUMP COUNTER
1E94,80 F8,, SJMP ZERO7 ;LOOP
,,, ;
1E96,D1 85,SS7,SS7: ACALL SPACE7
,,, ;
1E98,EC,SINOUT,SINOUT: MOV A,R4 ;GET THE SIGN
1E99,60 0C,, JZ SOUT ;OUTPUT A SPACE IF ZERO
,,, ;
1E9B,7D 2D,MOUT,MOUT: MOV R5,#'-'
1E9D,80 0A,, SJMP SOUT1 ;OUTPUT A MINUS IF NOT
,,, ;
1E9F,7D 2E,ROUT,ROUT: MOV R5,#'.' ;OUTPUT A RADIX
1EA1,80 06,, SJMP SOUT1
,,, ;
1EA3,7D 30,ZOUT,ZOUT: MOV R5,#'0' ;OUTPUT A ZERO
1EA5,80 02,, SJMP SOUT1
,,, ;
1EA7,7D 20,SOUT,SOUT: MOV R5,#' ' ;OUTPUT A SPACE
,,, ;
1EA9,21 90,SOUT1,SOUT1: AJMP OUTPUT
,,, ;
,,,$EJECT
,,, ;***************************************************************
,,, ;
1EAB,,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
,,, ;
,,, ;***************************************************************
,,, ;
1EAB,91 96,CASB,CASB: ACALL HEXSCAN ;SEE IF HEX NUMBER
1EAD,92 23,, MOV ADD_IN,C ;IF ADD_IN IS SET, THE NUMBER IS HEX
1EAF,F1 EB,, ACALL GET_DIGIT_CHECK
1EB1,B3,, CPL C ;FLIP FOR EXIT
1EB2,40 28,, JC RCASB
1EB4,7B 00,, MOV R3,#00H ;ZERO R3:R1 FOR LOOP
1EB6,79 00,, MOV R1,#00H
1EB8,80 15,, SJMP CASB5
,,, ;
1EBA,A3,CASB2,CASB2: INC DPTR
1EBB,89 00,, MOV R0B0,R1 ;SAVE THE PRESENT CONVERTED VALUE
1EBD,8B 02,, MOV R0B0+2,R3 ;IN R2:R0
1EBF,F1 EB,, ACALL GET_DIGIT_CHECK
1EC1,40 0C,, JC CASB5
1EC3,30 23 16,, JNB ADD_IN,RCASB ;CONVERSION COMPLETE
1EC6,91 B6,, ACALL HEX_CHECK ;SEE IF HEX NUMBER
1EC8,40 03,, JC CASB4 ;PROCEED IF GOOD
1ECA,A3,, INC DPTR ;BUMP PAST H
1ECB,80 0F,, SJMP RCASB
,,, ;
1ECD,24 09,CASB4,CASB4: ADD A,#9 ;ADJUST HEX ASCII BIAS
,,, ;
1ECF,75 F0 0A,CASB5,CASB5: MOV B,#10
1ED2,30 23 03,, JNB ADD_IN,CASB6
1ED5,75 F0 10,, MOV B,#16 ;HEX MODE
,,, ;
1ED8,D1 E3,CASB6,CASB6: ACALL MULNUM ;ACCUMULATE THE DIGITS
1EDA,50 DE,, JNC CASB2 ;LOOP IF NO CARRY
,,, ;
1EDC,E4,RCASB,RCASB: CLR A ;RESET ACC
1EDD,92 E1,, MOV ACC.OVERFLOW,C ;IF OVERFLOW, SAY SO
1EDF,22,, RET ;EXIT
,,, ;
,,,$EJECT
,,, ;
1EE0,75 F0 0A,MULNUM10,MULNUM10:MOV B,#10
,,, ;
,,, ;***************************************************************
,,, ;
1EE3,,MULNUM,MULNUM: ; Take the next digit in the acc (masked to 0FH)
,,, ; accumulate in R3:R1
,,, ;
,,, ;***************************************************************
,,, ;
1EE3,C0 E0,, PUSH ACC ;SAVE ACC
1EE5,C0 F0,, PUSH B ;SAVE MULTIPLIER
1EE7,E9,, MOV A,R1 ;PUT LOW ORDER BITS IN ACC
1EE8,A4,, MUL AB ;DO THE MULTIPLY
1EE9,F9,, MOV R1,A ;PUT THE RESULT BACK
1EEA,EB,, MOV A,R3 ;GET THE HIGH ORDER BYTE
1EEB,AB F0,, MOV R3,B ;SAVE THE OVERFLOW
1EED,D0 F0,, POP B ;GET THE MULTIPLIER
1EEF,A4,, MUL AB ;DO IT
1EF0,A2 D2,, MOV C,OV ;SAVE OVERFLOW IN F0
1EF2,92 D5,, MOV F0,C
1EF4,2B,, ADD A,R3 ;ADD OVERFLOW TO HIGH RESULT
1EF5,FB,, MOV R3,A ;PUT IT BACK
1EF6,D0 E0,, POP ACC ;GET THE ORIGINAL ACC BACK
1EF8,72 D5,, ORL C,F0 ;OR CARRY AND OVERFLOW
1EFA,40 07,, JC MULX ;NO GOOD IF THE CARRY IS SET
,,, ;
1EFC,54 0F,MUL11,MUL11: ANL A,#0FH ;MASK OFF HIGH ORDER BITS
1EFE,29,, ADD A,R1 ;NOW ADD THE ACC
1EFF,F9,, MOV R1,A ;PUT IT BACK
1F00,E4,, CLR A ;PROPAGATE THE CARRY
1F01,3B,, ADDC A,R3
1F02,FB,, MOV R3,A ;PUT IT BACK
,,, ;
1F03,22,MULX,MULX: RET ;EXIT WITH OR WITHOUT CARRY
,,, ;
,,, ;***************************************************************
,,, ;
1F04,,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
,,, ;
,,, ;***************************************************************
,,, ;
1F04,E4,, CLR A ;NO LEADING ZEROS
1F05,90 27 10,, MOV DPTR,#10000 ;SUBTRACT 10000
1F08,F1 21,, ACALL RSUB ;DO THE SUBTRACTION
1F0A,90 03 E8,, MOV DPTR,#1000 ;NOW 1000
1F0D,F1 21,, ACALL RSUB
1F0F,90 00 64,, MOV DPTR,#100 ;NOW 100
1F12,F1 21,, ACALL RSUB
1F14,90 00 0A,, MOV DPTR,#10 ;NOW 10
1F17,F1 21,, ACALL RSUB
1F19,90 00 01,, MOV DPTR,#1 ;NOW 1
1F1C,F1 21,, ACALL RSUB
1F1E,60 20,, JZ RSUB2 ;JUMP OVER RET
,,, ;
1F20,22,RSUB_R,RSUB_R: RET
,,, ;
1F21,7E FF,RSUB,RSUB: MOV R6,#-1 ;SET UP THE COUNTER
,,, ;
1F23,0E,RSUB1,RSUB1: INC R6 ;BUMP THE COUNTER
1F24,CA,, XCH A,R2 ;DO A FAST COMPARE
1F25,B5 83 00,, CJNE A,DPH,$+3
1F28,CA,, XCH A,R2
1F29,40 12,, JC FAST_DONE
1F2B,C8,, XCH A,R0 ;GET LOW BYTE
1F2C,95 82,, SUBB A,DPL ;SUBTRACT, CARRY IS CLEARED
1F2E,C8,, XCH A,R0 ;PUT IT BACK
1F2F,CA,, XCH A,R2 ;GET THE HIGH BYTE
1F30,95 83,, SUBB A,DPH ;ADD THE HIGH BYTE
1F32,CA,, XCH A,R2 ;PUT IT BACK
1F33,50 EE,, JNC RSUB1 ;LOOP UNTIL CARRY
,,, ;
1F35,C8,, XCH A,R0
1F36,25 82,, ADD A,DPL ;RESTORE R2:R0
1F38,C8,, XCH A,R0
1F39,CA,, XCH A,R2
1F3A,35 83,, ADDC A,DPH
1F3C,CA,, XCH A,R2
,,, ;
1F3D,,FAST_DONE,FAST_DONE:
,,, ;
1F3D,4E,, ORL A,R6 ;OR THE COUNT VALUE
1F3E,60 E0,, JZ RSUB_R ;RETURN IF ZERO
,,, ;
1F40,74 30,RSUB2,RSUB2: MOV A,#'0' ;GET THE ASCII BIAS
1F42,2E,, ADD A,R6 ;ADD THE COUNT
,,, ;
1F43,8B A0,RSUB4,RSUB4: MOV P2,R3 ;SET UP P2
1F45,F3,, MOVX @R1,A ;PLACE THE VALUE IN MEMORY
1F46,09,, INC R1
1F47,B9 00 01,, CJNE R1,#00H,RSUB3 ;SEE IF RAPPED AROUND
1F4A,0B,, INC R3 ;BUMP HIGH BYTE
,,, ;
1F4B,22,RSUB3,RSUB3: RET ;EXIT
,,, ;
,,,$EJECT
,,, ;***************************************************************
,,, ;
1F4C,,HEXOUT,HEXOUT: ; Output the hex number in R3:R1, supress leading zeros, if set
,,, ;
,,, ;***************************************************************
,,, ;
1F4C,D1 A7,, ACALL SOUT ;OUTPUT A SPACE
1F4E,A2 36,, MOV C,ZSURP ;GET ZERO SUPPRESSION BIT
1F50,92 23,, MOV ADD_IN,C
1F52,EB,, MOV A,R3 ;GET HIGH NIBBLE AND PRINT IT
1F53,F1 6F,, ACALL HOUTHI
1F55,EB,, MOV A,R3
1F56,F1 70,, ACALL HOUTLO
,,, ;
1F58,C2 23,HEX2X,HEX2X: CLR ADD_IN ;DON'T SUPPRESS ZEROS
1F5A,E9,, MOV A,R1 ;GET LOW NIBBLE AND PRINT IT
1F5B,F1 6F,, ACALL HOUTHI
1F5D,E9,, MOV A,R1
1F5E,F1 70,, ACALL HOUTLO
1F60,7D 48,, MOV R5,#'H' ;OUTPUT H TO INDICATE HEX MODE
,,, ;
1F62,C1 A9,SOUT_1,SOUT_1: AJMP SOUT1
,,, ;
1F64,C2 23,HOUT1,HOUT1: CLR ADD_IN ;PRINTED SOMETHING, SO CLEAR ADD_IN
1F66,24 90,, ADD A,#90H ;CONVERT TO ASCII
1F68,D4,, DA A
1F69,34 40,, ADDC A,#40H
1F6B,D4,, DA A ;GOT IT HERE
1F6C,FD,, MOV R5,A ;OUTPUT THE BYTE
1F6D,80 F3,, SJMP SOUT_1
,,, ;
1F6F,C4,HOUTHI,HOUTHI: SWAP A ;SWAP TO OUTPUT HIGH NIBBLE
,,, ;
1F70,54 0F,HOUTLO,HOUTLO: ANL A,#0FH ;STRIP
1F72,70 F0,, JNZ HOUT1 ;PRINT IF NOT ZERO
1F74,30 23 ED,, JNB ADD_IN,HOUT1 ;OUTPUT A ZERO IF NOT SUPRESSED
1F77,22,, RET
,,, ;
,,,$EJECT
,,, ORG 1FEBH ;FOR LINK COMPATABILITY
,,, ;
,,, ;
1FEB,,GET_DIGIT_CHECK,GET_DIGIT_CHECK: ; Get a character, then check for digit
,,, ;
1FEB,B1 6C,, ACALL GET_DPTR_CHARACTER
,,, ;
1FED,,DIGIT_CHECK,DIGIT_CHECK: ;CHECK FOR A VALID ASCII DIGIT, SET CARRY IF FOUND
,,, ;
1FED,B4 3A 00,, CJNE A,#'9'+1,$+3 ;SEE IF ASCII 9 OR LESS
1FF0,40
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -