📄 bassub.asm
字号:
NoDivErr: CALL FIX2BDIV ; PROCESS THE TWO BYTE DATA
XCH A, R6
PUSH ACC
XRL A, R7
RLC A ; GET THE SIGN BIT
POP ACC
PUSH PSW ; SAVE THE SIGN BIT
ADD A, R6 ; ADJUST THE FOWER OF DIVIDED DATA
CLR C ; FOR SUBTRACT TWO POWER DATA
SUBB A, R7
POP PSW
MOV ACC.7, C ; SET THE SIGN BIT IN THE RESULT
MOV R7, A ; SAVE THE POWER OF RESULT
CLR C
RET
;#############################################################
; FILE NAME BASE.ASM
; SUBROUTE: FIX2BDIV - FIXED TWO BYTES DIVIDE
; FUNCTION: DIVIDE R2.R3 BY R4.R5
; PARMENTERS:
; R2 - THE HI BYTE OF DIVIDED DATA
; R3 - THE LOW BYTE OF DIVIDED DATA
; R4 - THE HI BYTE OF DIVIDE DATA
; R5 - THE LOW BYTE OF DIVIDE DATA
; CHANGE REGISTER: C, bUSE1, bUSE2, A, B, R2, R3, R4, R5
; RETURN: THE RESULT IS FLOAT DATA SAVE IN - A, R4, R5 AND THE R2, R3
; IS THE LESS DATA
;------------------------------------------------------------
FIX2BDIV: MOV A, R1 ; SAVE THE REGISTER R1, R6, R7
PUSH ACC
MOV A, R6
PUSH ACC
MOV A, R7
PUSH ACC
MOV R1, #11H ; TEMPARY USE R1 (<=17D) FOR LOOP NUMBER + 1
CLR A
MOV R6, A
MOV R7, A
CLR bUSE1
CLR bUSE2
MOV A, R3
MOV B, R2
JMP TwoSub
LoopNextBit: CLR C ; ADJUST THE RESULT DATA
MOV A, R6
RLC A
MOV R6, A
MOV A, R7
RLC A
MOV R7, A
MOV A, R3 ; ADJUST THE DIVIDED DATA
MOV B, R2
RLC A
MOV R3, A ; SAVE LOW BYTE, AFTER SHIFT
XCH A, B
RLC A
MOV R2, A ; SAVE HIGH BYTE, AFTER SHIFT
XCH A, B
MOV bUSE2, C
TwoSub: CLR C
SUBB A, R5
XCH A, B
SUBB A, R4
JB bUSE2, Great
JC ReadyForNext ; LESS THE DIVIDE DATA
Great: MOV R2, A
MOV R3, B
INC R6
CJNE R1, #11H, ReadyForNext
SETB bUSE1 ; SET (THE RESULT > 0) FLAG
DEC R1
ReadyForNext: DJNZ R1, LoopNextBit
MOV A, R7 ; SAVE THE RESULT
MOV R4, A
MOV A, R6
MOV R5, A
POP ACC ; RESTORE THE REGISTERS
MOV R7, A
POP ACC
MOV R6, A
POP ACC
MOV R1, A
CLR A
JNB bUSE1, LessZero
INC A
LessZero: RET
END
;###########################################################
; FILE: BS2SUB.ASM
; NAME: INT2_TOSTR - CONVERT THE INTEGER TO ASCII CODE
; PARMENTERS: A, B - THE DOUBLE BYTE INTEGER
; R1 - THE BUFFER FOR STORE THE ASCII STRING
; R2 - THE NUMBER OF CHARACTER WILL BE STORED
; CHANGE: C, A, B, R2, R3, R4, R5, DPTR, THE BUFFER POINTER BY R1
; RETURN: C - ERROR FLAG, R1 - THE BUFFER DATA
;###########################################################
INT2_TOSTR:PUSH ACC ; // MOVE THE BUFFER POINTER TO END
MOV A, R1 ; //..
ADD A, R2 ; //..
MOV R1, A ; //..
POP ACC ; //....
MOV DPTR, #D256_10
SETB C
NextD10: JZ INT_Cnvt
PUSH B ; SAVE THE LOW BYTE
MOV B, #0AH
DIV AB ; GET TWO BYTES AFTER HIGH DIVIDED BY 10
MOV R3, A ; SAVE THE [A/B]
MOV R6, B ; SAVE THE {A%B}
POP ACC ; GET LOW BYTE
MOV B, #0AH
DIV AB ; GET TWO BYTES AFTER LOW DIVIDED BY 10
XCH A, B
MOV R5, A ; SAVE THE REMAINDER TO LOW BYTE
MOV A, R6 ; GET THE REMAINDER OF HIGH BYTE
MOVC A, @A+DPTR ; \...
ADD A, R5 ; \ADD THE REMAINDER OF LOW BYTE
PUSH ACC ; SAVE THE RESULT
CLR C ;
SUBB A, #0AH ; IF IS IT MORE THAN 10D
JNC GreatIs ; >= 10D
POP ACC
CALL PUTONE_D ; OUTPUT ONE BYTE
JC OverRet ; No enough buffer, Error return
JMP ForNextB
GreatIs: INC B ; THE LOW BYTE INC 1 THAT IS DIVIDE RESULT
CALL PUTONE_D
POP ACC ; MOVE THE STACK POINTER BACK ONE BYTE
JC OverRet ; No enough buffer, Error return
ForNextB: MOV A, #0AH ; GET THE DIV RESULT FROM HIGH BYTE TO LOW
ADD A, R6 ; ..
MOVC A, @A+DPTR ; ....
ADD A, B ; GET LOW BYTE OF DIVIDED RESULT
MOV B, A
MOV A, R3 ; GET HIGH BYTE OF DIVIDED RESULT
JMP NextD10
INT_Cnvt: MOV A, B
JC NoCareZ
JZ OverRet
NoCareZ: MOV A, R1 ; MOVE R1 POINTER TO THE FRIST
CLR C
SUBB A, R2 ; ..
MOV R1, A ; ...
MOV A, B
CALL INT_TOSTR
OverRet: RET
D256_10: DB 0, 6, 2, 8, 4, 0, 6, 2, 8, 4
DB 0, 25, 51, 4CH, 66H, 80H, 99H,0B3H,0CCH,0E6H
PUTONE_D: CJNE R2, #0, OK_Output
SETB C
RET
OK_Output: ORL A, #30H
DEC R1
MOVX @R1, A
DEC R2
RET
;###########################################################
; FILE: BS2SUB.ASM
; NAME: STR_TOINT2 - CONVERT THE STRING TO TWO BYTES INTEGER
; PARMENTERS: R1 - THE POINTER TO THE STRING
; R2 - THE NUMBER OF CHARACTER WILL BE STORED
; CHANGE: C, A, B, R1, R2, R4, R5
; RETURN: C - ERROR FLAG, A. B THE TWO BYTE INYEGER
;###########################################################
STR_TOINT2: CLR A
MOV R5, A
GetNextC: MOV R4, A
MOVX A, @R1
CLR C
SUBB A, #30H ; THE ASCII IS IN ['0', '9']
JC OverCnvtI
PUSH ACC
SUBB A, #0AH ; .....
POP ACC
JNC OverCnvtI
MOV B, #0AH
XCH A, R5
MUL AB
ADD A, R5
MOV R5, A
CLR A
ADDC A, B
JC ErrToSetC
XCH A, R4
MOV B, #0AH
MUL AB
XCH A, B
JNZ ErrToSetC
MOV A, B
ADD A, R4
MOV R4, A
JC ErrToSetC
INC R1
DJNZ R2, GetNextC
OverCnvtI: MOV B, R5
CLR C
RET
ErrToSetC: SETB C
RET
;###########################################################
; FILE: BS2SUB.ASM
; NAME: STR_TOF3 - CONVERT THE STRING TO 3-BYTES FLOAT
; PARMENTERS: R1 - THE POINTER TO THE STRING
; A - THE NUMBER OF CHARACTER WILL BE STORED
; CHANGE: C, A, B, R1, R2, R3, R4, R5, R7
; RETURN: C - ERROR FLAG, R7, R4, R5 - THE 3-BYTES FLOAT DATA
;###########################################################
STR_TOF3: MOV R2, A
ForNtChar: MOVX A, @R1 ; NO CARE THE SPACE CHARACTERS
CJNE A, #cSPACE, ForData
DEC R2
INC R1
JMP ForNtChar
ForData: MOV A, R1
PUSH ACC
MOVX A, @R1
CJNE A, #2DH, OverMins ; NO CARE MINITES
DEC R2
INC R1
OverMins: LCALL STR_TOINT2
JNC ForDecimal
POP ACC
RET
ForDecimal:MOV R7, #10H
CALL F3_FORMAT
PUSH B
PUSH ACC
MOV A, R7
PUSH ACC
MOV A, R2
JZ EndCnvtD
MOVX A, @R1
CJNE A, #2EH, EndCnvtD ; NO DECIMAL PART, RETURN
DEC R2
INC R1
MOV A, R2
JZ EndCnvtD ; NO DECIMAL PART, RETURN
CLR C
SUBB A, #5 ; LESS 5 DIGITS, FOR DECINAL PART
JC DecimalC ; ..
MOV R2, #4 ; ....
DecimalC: MOV A, R2
PUSH ACC
LCALL STR_TOINT2
POP ACC
CLR C
SUBB A, R2 ; SAVE THE CONVERTTED CHAR NUMBER
MOV R2, A
MOV R7, #10H ; GET THE SHIFT BITS NUMBER
CALL F3_FORMAT
MOV R4, A
MOV R5, B
MOV DPTR, #DUB10 ; GET THE 10*R2 IN F3 MODE
MOV A, R2
MOV B, #3
MUL AB
MOV R3, A
MOVC A, @A+DPTR
MOV R6, A
INC R3
MOV A, R3
MOVC A, @A+DPTR
MOV R2, A
MOV A, R3
INC A
MOVC A, @A+DPTR
MOV R3, A
CALL F3_RSDIV ; DIVIDE BY 10**R2 BACK TO NORNAL DATA
POP ACC
MOV R6, A
POP ACC
MOV R2, A
POP ACC
MOV R3, A
CALL F3_RSADD ; ....
ForMinus: POP ACC
MOVX A, @R1
CJNE A, #2DH, OverCnvt ; IS MINIUES DATA
MOV A, R7
SETB ACC.7
MOV R7, A
OverCnvt: CLR C
RET
EndCnvtD: POP ACC
MOV R7, A
POP ACC
MOV R4, A
POP ACC
MOV R5, A
JMP ForMinus
;###########################################################
; FILE: BS2SUB.ASM
; NAME: F3_TOSTR - CONVERT THE INTEGER TO ASCII CODE
; PARMENTERS: R7,R4,R5 - THE THE FLOAT DATA
; R1 - THE BUFFER FOR STORE THE ASCII STRING
; A - THE NUMBER OF CHARACTER WILL BE STORED
; CHANGE: A, B, R2, R3, R4, R5, R6, R7 THE BUFFER POINTER BY R1
; RETURN: C - ERROR FLAG IF SET, THE STRING DATA
;###########################################################
PUTASC_F: CJNE R2, #0, OK_ASCOut
SETB C
RET
OK_ASCOut: MOVX @R1, A
INC R1
DEC R2
RET
F3_TOSTR: PUSH ACC
MOV R2, A
MOV A, R7
CJNE A, #cF3_ERR, LE0_Proc
POP ACC
ErrFill: MOV A, #2DH ; OUTPUT '-' CHARACTER
CALL PUTASC_F ; IT'S ERROR DATA
JNC ErrFill
SETB C
RET
LE0_Proc: JNB ACC.7, INT_Proc
CLR ACC.7
MOV R7, A ; IS MINUS DATA
MOV A, #2DH ; OUTPUT '-' CHARACTER
CALL PUTASC_F
POP ACC
MOV A, R2 ; ONE BYTE BE USED
PUSH ACC
INT_Proc: CALL F3_INT ; RET A,B and R7,R4,R5
XCH A, R5 ; SAVE R7,R4,R5 F3-DATA
PUSH ACC
MOV A, R5
CALL INT2_TOSTR ; CONVERT THE INTEGER2 DATA
POP ACC ;RESTORE F3-DATA R7,R4,R5
MOV R5, A ;
JNC LE1_Proc
POP ACC
MOV R2, A
JMP ErrFill
LE1_Proc: POP ACC ;
MOV R2, A
CALL DEL_SPACE ;
MOV A, #2EH ; OUTPUT '.' CHARACTER
CALL PUTASC_F
JC EndCnvt
MOV A, #5 ; THE TIAL DIGIT NUMBER <= 5
SUBB A, R2 ; ..
JNC MovPoint
MOV R2, #5 ; ....
MovPoint: MOV A, R2
JZ EndCnvt
PUSH ACC ; SAVE THE BUFFER BYTES
DEC A ; MOVE DOUBLE 10 POINTER
MOV B, #3
MUL AB
MOV DPTR, #DUB10
ADD A, DPL
MOV DPL, A
CLR A
ADDC A, DPH ; ....
CLR A ; GET THE DOUBLE 10 3-BYTE FLOAT DATA
MOVC A, @A+DPTR ; TO R6, R2, R3
MOV R6, A
MOV A, #1
MOVC A, @A+DPTR
MOV R2, A
MOV A, #2
MOVC A, @A+DPTR
MOV R3, A ;.....
LCALL F3_RSMUL ; THE TIAL DATA MULITILY MULT-DOUBLE 10
POP ACC
PUSH ACC
MOV R2, A
CALL F3_INT ; GET THE INTEGER PART
CALL INT2_TOSTR ; CONVERT THE INTEGER TO STRING
POP ACC
MOV R2, A
CALL FI0_SPACE
EndCnvt: RET
DUB10: DB 04H, 0A0H, 0, 07H, 0C8H, 0, 0AH, 0FAH, 0
DB 0EH, 09CH, 40H, 11H, 0C3H, 50H, 0
;#############################################################
; FILE NAME BASE.ASM
; SUBROUTE: DEL_SPACE - DELEATE THE SPACES IN THE STRING
; FUNCTION: NONE
; PARMENTERS:
; R1 - THE POINTER TO THE STRING
; R2 - THE MAX NUMBER OF BYTES TO THIS STRING
; CHANGE REGISTERS: A, R0, R1, R2, R3
; RETURN: R2 - THE BYTES HAVE BE REMAINED
; R1 - THE POINTER TO END OF STRING
;------------------------------------------------------------
DEL_SPACE: MOV A, R1
MOV R0, A
CLR A
MOV R3, A
ForNextC: MOVX A, @R0
CJNE A, #cSPACE, MoveChar
INC R3
INC R0
DJNZ R2, ForNextC
MoveChar: MOVX @R1, A
INC R1
INC R0
DJNZ R2, ForNextC
CLR A
MOVX @R1, A
MOV A, R3
MOV R2, A
RET
;#############################################################
; FILE NAME BASE.ASM
; SUBROUTE: FI0_SPACE - FILL '0' ON THE SPACE CHARACTERS IN THE STRING
; FUNCTION: NONE
; PARMENTERS: R1 - THE POINTER TO THE STRING
; R2 - THE MAX NUMBER WILL BE SCANED
; CHANGE REGISTERS: A, R0, R1
; RETURN: NONE
;------------------------------------------------------------
FI0_SPACE:
NextFill: MOVX A, @R1
CJNE A, #cSPACE, FillChar
MOV A, #30H
MOVX @R1, A
FillChar: INC R1
DJNZ R2, NextFill
CLR A
MOVX @R1, A
RET
;#############################################################
; FILE NAME BASE.ASM
; SUBROUTE: FILL_SP - FILL ' ' ON THE CHARACTERS IN THE STRING
; FUNCTION: NONE
; PARMENTERS: R1 - THE POINTER TO THE STRING
; R2 - THE MAX NUMBER WILL BE SCANED
; CHANGE REGISTERS: A, R0, R1
; RETURN: NONE
;------------------------------------------------------------
FILL_SP: MOVX A, @R1
; JZ EndFiSP
MOV A, #cSPACE
MOVX @R1, A
INC R1
DJNZ R2, FILL_SP
EndFiSP: RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -