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

📄 bassub.asm

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