⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bassub.asm

📁 一个功能完善的大型制冷设备控制程序
💻 ASM
📖 第 1 页 / 共 3 页
字号:
             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 + -