📄 bassub.asm
字号:
CALL FIXtoBYTE
L_NextClr: RLC A
DJNZ B, L_NextClr
RET
;#############################################################
; FILE NAME BASSUB.ASM
; SUBROUTE: FIX_R6BIT - SET [R6 = 0..15] BIT IN REGISTER B
; FUNCTION:
; PARMENTERS:
; R6 - THE INDEX OF BIT THAT WILL BE SET
; CHANGE REGISTER: C, B, R6
; RETURN: REGISTER B, C - THE FLAG FOR HIGH BYTE
;------------------------------------------------------------
FIX_R6BIT: PUSH ACC
MOV B, R6
CALL FIXtoBYTE
CJNE R6, #8, ContFix
ContFix: CPL C
MOV A, #80H
ToNextBit: RL A
DJNZ B, ToNextBit
MOV B, A
POP ACC
RET
;#############################################################
; FILE NAME BASSUB.ASM
; SUBROUTE: CTO_R6BIT - SET C BIT TO [R6=0...] BIT IN REGISTER A
; FUNCTION:
; PARMENTERS:
; C - THE ADVEANCE BIT
; A - THE OLD DATA BYTE
; R6 - THE INDEX OF BIT THAT WILL BE SET
; CHANGE REGISTER: C, B_TMPUSE, A, B, R6
; RETURN: REGISTER A
;------------------------------------------------------------
CTO_R6BIT: MOV B_TMPUSE, C ; SAVE THE CY FLAG BIT
CALL FIX_R6BIT
MOV C, B_TMPUSE
JC SetR6Bit
XCH A, B
CPL A
ANL A, B
RET
SetR6Bit: ORL A, B
RET
END
;#############################################################
; FILE NAME BASSUB.ASM
; SUBROUTE: F3_INT - GET THE INTEGER DATA FROM INTEGRAL PART OF
; THREE BYTE FLOAT DATA IN (R7,R4,R5) AND SAVE IN REGISTER A
; CALL FUNCTION:
; PARMENTERS:
; R7, R4, R5 - THE THREE BYTE FLOAT DATA SAVE IN
; USEING REGISTER: C, A, B, R6, R4, R5, R7
; RETURN: A, B - HAS THE INTEGER DATA, C - SET(LESS 0 IS) ELSE: OK!
; R7, R4, R5 - THE DATA THAT PART (< 0) SET TO
;------------------------------------------------------------
PROC F3_INT, F3_MUL, F3_RSMUL, F3_FORMAT
F3_INT: MOV A, R7
MOV C, ACC.6
MOV ACC.7, C
JNC SaveCount
ZeroRet: CLR A
MOV B, A
RET
SaveCount: JZ ZeroRet
MOV R6, A ; GET THE BIT NUMBER IN INTEGRAL PART
ANL A, #0F0H
JNZ ZeroRet ; ERROR RETURN R6 <> 0
CLR A
MOV R7, A
MOV B, A
ToShift: PUSH ACC
MOV A, R5
RLC A
MOV R5, A
MOV A, R4
RLC A
MOV R4, A
MOV A, B
RLC A
MOV B, A
POP ACC
RLC A
DJNZ R6, ToShift
CLR C
RET
;#############################################################
; FILE NAME BASSUB.ASM
; SUBROUTE: F3_MUL - MULITPLY THE THREE BYTES FLOAT
; FUNCTION: @R0 * R7.R4.R5 => R7.R4.R5
; PARMENTERS:
; R0 - THE POINTER TO THE BUFFER THAT SAVING MULTIPLIED DATA
; R7 - THE POWER (BASE 2) BYTE FOR MULITPLY DATA
; R4 - THE HI BYTE OF MULITPLY DATA
; R5 - THE LOW BYTE OF MULITPLY DATA
; CHANGE REGISTER: C, A, B, R2, R3, R4, R5, R6, R7
; RETURN: RESULT IN R7,R4,R5. THE LESS DATA IN R2,R3
;------------------------------------------------------------
F3_MUL: CALL PR0_R623 ; MOVE FLOAT DATA POINT BY R0 TO R6, R2, R3
F3_RSMUL: CJNE R7, #cF3_ERR, MulR6Err ; IF SOURCE DATA 1 ERROR
MulErrRet: SETB C
CLR A
MOV R7, A
MOV R4, A
MOV R5, A
RET
MulR6Err: CJNE R6, #cF3_ERR, DoRsMul ; IF SOURCE DATA 2 ERROR
JMP MulErrRet
DoRsMul: CJNE R4, #00, NoZero
CJNE R5, #00, NoZero
MOV R7, #00
CLR C
RET
NoZero: MOV A, R6 ; ADD TWO POWER, AND SAVE THE RESULT IN A
MOV C, ACC.6 ; \\.
MOV ACC.7, C
MOV B, A
MOV A, R7 ; \\.
MOV C, ACC.6
MOV ACC.7, C
ADD A, B ; \\..
ANL A, #7FH ; ADD THE SIGN BIT
MOV B, A ;
MOV A, R6 ; \.
XRL A, R7 ;
ANL A, #80H ;
ORL A, B ; \\..
MOV R7, A ; SAVE THE POWER BYTE
MOV A, R5
MOV B, R3
MUL AB ; R3 * R5 = B. A
XCH A, B
XCH A, R5 ; GET R5 TO A, AND SAVE HIGH BYTE TO R5
MOV B, R2
MUL AB ; R2 * R5 = B. A
PUSH B
PUSH ACC
MOV A, R4 ;
MOV B, R3
MUL AB ; R3 * R4
ADD A, R5
MOV R5, A
POP ACC
ADDC A, R5 ; MOV R3, A IF NEEDID
XCH A, B
POP B
ADDC A, B
MOV R5, A
CLR A
ADDC A, #0
XCH A, R4
MOV B, R2
MUL AB ; R2 * R4
ADD A, R5
XCH A, B
ADDC A, R4
CALL F3_FORMAT
MOV R4, A
MOV R5, B
CLR C
RET
;#############################################################
; FILE NAME BASSUB.ASM
; SUBROUTE: F3_FORMAT - FORMAT THE TWO BYTES INTERGER DATA
; AS: 1XXXXXXX,XXXXXXXX + 2**R7
; FUNCTION:
; PARMENTERS:
; R7 - THE NUMBER OF POWER BASE 2
; A - THE HIGH BYTE OF FORMATED DATA
; B - THE LOW BYTE OF FORMATED DATA
; CHANGE REGISTER: C, A, B, R7
; RETURN: A - HI BITE, B - LOW BYTE, R7 - THE NUMBER OF POWER BASE 2
;------------------------------------------------------------
F3_FORMAT: JNZ ShiftBit
XCH A, B
JNZ XchFrist
MOV R7, A
RET
XchFrist: XCH A, B
ShiftBit: XCH A, R7
RLC A
PUSH PSW
RRC A
XCH A, R7
ShiftNext: JB ACC.7, EndFormat
CLR C
XCH A, B
RLC A
XCH A, B
RLC A
DEC R7
JMP ShiftNext
EndFormat: XCH A, R7
RLC A
POP PSW
RRC A
XCH A, R7
RET
END
;#############################################################
; FILE NAME USESUB.ASM
; SUBROUTE: CHECK_EN - CHECK ENERGRY IS LESS 15% OR MORE 100%
; FUNCTION:
; PARMENTERS: A - THE LESS OR MORE THE SCALE
; R0 - THE POINTER TO THE A/D DATA.
; USEING REGISTER: A, R0, R7, R4, R5
; RETURN: NONE
;------------------------------------------------------------
PROC CHECK_EN
CHECK_EN: MOV dEXTPART, #cADSEG ; SET A/D DATA ADDRESS HIGH BYTE
MOV pPORT2, dEXTPART
PUSH ACC
CALL MOVPR0_RS
POP ACC
CJNE R7, #cF3_ERR, RightData
CLR A
CLR C
AJMP RestoreRtn
RightData:MOV R0, A
CALL F3_INT
MOV A, B
CLR C
SUBB A, R0 ; IS ENERGRY LESS 15% OR MORE 100%?
RestoreRtn:MOV dEXTPART, #0 ; RESET DATA ADDRESS HIGH BYTE
MOV pPORT2, dEXTPART
RET
END
;#############################################################
; FILE NAME BASE.ASM
; SUBROUTE: F3_SUB - SUBTRACT THREE BYTES FLOAT DATA
; FUNCTION: @R0 - R7.R4.R5 => R7.R4.R5
; PARMENTERS:
; R0 - THE POINTER TO THE BUFFER THAT SAVING D
; R7 - THE POWER (BASE 2) BYTE FOR SOURCE DATA
; R4 - THE HI BYTE OF SOURCE DATA
; R5 - THE LOW BYTE OF SOURCE DATA
; CHANGE REGISTER: C, A, B, R2, R3, R4, R5, R6, R7
; RETURN: RESULT IN R7,R4,R5.
;------------------------------------------------------------
F3_SUB: MOV A, R7 ; COMPLEMENT THE SIGN BIT IN DESTINATION DATA
RLC A ; \\.
CPL C
RRC A
MOV R7, A
CALL F3_ADD ; CALL THE 3 BYTES FLOAT ADD FUNCTION
PUSH ACC
MOV A, R7
MOV C, ACC.7
POP ACC
RET
;#############################################################
; FILE NAME BASE.ASM
; SUBROUTE: F3_RSSUB - SUBTRACT THREE BYTES FLOAT DATA
; FUNCTION: R6.R2.R3 - R7.R4.R5 => R7.R4.R5
; PARMENTERS:
; R6 - THE POWER (BASE 2) BYTE FOR SOURCE DATA 1
; R2 - THE HI BYTE OF SOURCE DATA 1
; R3 - THE LOW BYTE OF SOURCE DATA 1
; R7 - THE POWER (BASE 2) BYTE FOR SOURCE DATA 2
; R4 - THE HI BYTE OF SOURCE DATA 2
; R5 - THE LOW BYTE OF SOURCE DATA 2
; CHANGE REGISTER: C, A, B, R2, R3, R4, R5, R6, R7
; RETURN: RESULT IN R7,R4,R5.
;------------------------------------------------------------
F3_RSSUB: MOV A, R7 ; COMPLEMENT THE SIGN BIT IN DESTINATION DATA
RLC A ; \\.
CPL C
RRC A
MOV R7, A
CALL F3_RSADD ; CALL THE 3 BYTES FLOAT ADD FUNCTION
PUSH ACC
MOV A, R7
MOV C, ACC.7
POP ACC
RET
;#############################################################
; FILE NAME BASE.ASM
; SUBROUTE: PR0_R623 - MOV THREE BYTES DATA POINT BY R0 TO R6,R2,R3
; FUNCTION:
; PARMENTERS:
; R0 - THE POINTER TO THE BUFFER THAT SAVING MULTIPLY DATA
; CHANGE REGISTER: R6, R2, R3
; RETURN: RESULT IN R6,R2,R3
;------------------------------------------------------------
PR0_R623: PUSH ACC
MOVX A, @R0
MOV R6, A
INC R0
MOVX A, @R0
MOV R2, A
INC R0
MOVX A, @R0
MOV R3, A
DEC R0
DEC R0
POP ACC
RET
;#############################################################
; FILE NAME BASE.ASM
; SUBROUTE: F3_ADD - ADD THREE BYTES FLOAT DATA
; FUNCTION: @R0 + R7.R4.R5 => R7.R4.R5
; PARMENTERS:
; R0 - THE POINTER TO THE BUFFER THAT SAVING D
; R7 - THE POWER (BASE 2) BYTE FOR SOURCE DATA
; R4 - THE HI BYTE OF SOURCE DATA
; R5 - THE LOW BYTE OF SOURCE DATA
; CHANGE REGISTER: C, A, B, R2, R3, R4, R5, R6, R7
; RETURN: RESULT IN R7,R4,R5.
;------------------------------------------------------------
PROC F3_ADD, F3_RSADD
F3_ADD: CALL PR0_R623 ; MOVE FLOAT DATA POINT BY R0 TO R6, R2, R3
F3_RSADD: CJNE R7, #cF3_ERR, AddR6Err ; IF SOURCE DATA 1 ERROR
AddErrRet: SETB C
CLR A
MOV R7, A
MOV R4, A
MOV R5, A
RET
AddR6Err: CJNE R6, #cF3_ERR, DoRsAdd ; IF SOURCE DATA 2 ERROR
JMP AddErrRet
DoRSAdd: CJNE R2, #0, IsDist_0
CJNE R3, #0, IsDist_0
MOV A, #1
RET
IsDist_0: MOV A, R6
CJNE R4, #0, ProcPower
CJNE R5, #0, ProcPower
MOV R7, A
MOV A, R2
MOV B, R3
JMP EndProc
ProcPower: MOV B, R7 ; PROCESS THE POWER
MOV C, ACC.6
MOV ACC.7, C
XCH A, B
MOV C, ACC.6
MOV ACC.7, C
CLR C
SUBB A, B
JZ Fix2bProcT ;(Zero)THE POWER IS EQUAL, NO SHIFT NEED
MOV C, ACC.7
JC Less
MOV B, A ; THE SOURCE < DESTINATION, SHIFT THE DEST. DATA
NextBitD: MOV A, R2
RRC A
MOV R2, A
MOV A, R3
RRC A
MOV R3, A
CLR C
DJNZ B, NextBitD
MOV B, R7
Fix2bProcT: JMP Fix2bProc
Less: CPL A ; ELSE SOURCE > DESTINATION, SHIFT SOURCE DATA
INC A
MOV B, A
NextBitS: CLR C
MOV A, R4
RRC A
MOV R4, A
MOV A, R5
RRC A
MOV R5, A
DJNZ B, NextBitS
MOV B, R6 ; USE THE DEST. DATA POWER AS RESULT POWER
Fix2bProc: CLR C
MOV A, R6 ; SET THE NEW POWER TO R7
RLC A ; \\.
XCH A, B ; \\ GET NEW POWER
RL A ; \\ CHANGE THE SIGN BIT
RRC A ; \\.
XCH A, R7 ; \\.. SAVE THE POWER
XRL A, R6 ; DECIDED WITCH CALCULATE (+ or -) NEED
RLC A ; \\.
MOV A, R3 ; READY FOR PROCESS
MOV B, R2
JC Fix2bSub ; \\..
ADDC A, R5
XCH A, B
ADDC A, R4
JNC EndProc
RRC A
XCH A, B
RRC A
XCH A, B
INC R7
PUSH ACC ; IF THE POWER = -1, R7 IS OVERFLOW
MOV A, R7 ; \.. AFTER INCREMENTED.
ANL A, #7FH
JNZ PassOver ; IS IT NO OVER FLOW??
JMP CplForOver
Fix2bSub: CLR C
SUBB A, R5
XCH A, B
SUBB A, R4
JNC FormatIt
MOV A, R5
MOV B, R4
CLR C
SUBB A, R3
XCH A, B
SUBB A, R2
PUSH ACC
CplForOver: MOV A, #80H ; COMPLEMENT THE HIGH BIT (THE SIGN BIT)
XRL A, R7 ; \\.
MOV R7, A ; \\..
PassOver: POP ACC
FormatIt: CALL F3_FORMAT
EndProc: MOV R4, A
MOV R5, B
ADD A, B ; RETURN ZERO FLAG
CLR C
RET
END
;#############################################################
; FILE NAME BASE.ASM
; SUBROUTE: F3_DIV - DIVIDED THE THREE BYTES FLOAT
; FUNCTION: @R0 / R7.R4.R5 = R7.R4.R5
; PARMENTERS:
; R0 - THE POINTER TO THE BUFFER THAT SAVING D
; R7 - THE POWER (BASE 2) BYTE FOR DIVIDE 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, R6, R7
; RETURN: RESULT IN R7,R4,R5. THE LESS DATA IN R2,R3
; C - 1: IS FLAG FOR DIVIDED BY ZERO, 0: OK!!
;------------------------------------------------------------
PROC F3_DIV, F3_RSDIV, FIX2BDIV
F3_DIV: CALL PR0_R623 ; MOVE FLOAT DATAPOINT BY R0 TO R6,R2,R3
F3_RSDIV: CJNE R7, #cF3_ERR, DivR6Err ; IF SOURCE DATA 1 ERROR
DivErrRet: SETB C
CLR A
MOV R7, A
MOV R4, A
MOV R5, A
RET
DivR6Err: CJNE R6, #cF3_ERR, DoRsDiv ; IF SOURCE DATA 2 ERROR
JMP DivErrRet
DoRsDiv: CJNE R4, #00, NoDivErr
CJNE R5, #00, NoDivErr
JMP DivErrRet
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -