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

📄 macro_sonix_kuo.h

📁 一个sonix的仿51单片机指令macro,在写汇编时超好用
💻 H
📖 第 1 页 / 共 3 页
字号:
;; 2 Byte Compare ( <, >=)  by Constant
;; Run Time Clock:
;; Program Length: 10
CJBC2   MACRO   Reg1_H,Reg1_L,Constant_H,Constant_L,Addr_Below

        MOV     A,Reg1_H
        SUB     A,#Constant_H
        B0BTS1  FC
        JMP_RET Addr_Below      ;; IF(Reg1< #Constant) JMP Below

        B0BTS1  FZ
        JMP     $+5

        MOV     A,Reg1_L
        SUB     A,#Constant_L
        B0BTS1  FC
        JMP_RET Addr_Below      ;; IF(Reg1< #Constant) JMP Below
                                ;; IF(Reg1>=#Constant) unjump
        ENDM

;; 两个寄存器(16Bit)比较,第一个小于等于第二个跳走,
;; 2 Byte Compare ( >, <=)  by Constant
;; Run Time Clock:
;; Program Length: 10
CJBEC2  MACRO   Reg1_H,Reg1_L,Constant_H,Constant_L,Addr_Below_Equ

        MOV     A,Reg1_H
        SUB     A,#Constant_H
        B0BTS1  FC
        JMP_RET Addr_Below_Equ  ;; IF(Reg1<=#Constant) JMP Below_Equ

        B0BTS1  FZ
        JMP     $+5

        MOV     A,#Constant_L
        SUB     A,Reg1_L
        B0BTS0  FC
        JMP_RET Addr_Below_Equ  ;; IF(Reg1<=#Constant) JMP Below_Equ
                                ;; IF(Reg1> #Constant) unjump
        ENDM

;; 寄存器(16Bit)与常数比较,== 跳走,
;; 1 Byte Compare (==, !=),
;; Run Time Clock:== 8, != 4
;; Program Length: 8
CJEC2   MACRO   Reg1_H,Reg1_L,Constant_H,Constant_L,Addr_Equ

        CJNEC   Reg1_H,Constant_H,$+5
        CJEC    Reg1_L,Constant_L,Addr_Equ

        ENDM

;; 寄存器(16Bit)与常数比较,!= 跳走,
;; 1 Byte Compare (==, !=),
;; Run Time Clock:== 4, != 8
;; Program Length: 8
CJNEC2  MACRO   Reg1_H,Reg1_L,Constant_H,Constant_L,Addr_NoEqu

        CJNEC   Reg1_H,Constant_H,Addr_NoEqu
        CJNEC   Reg1_L,Constant_L,Addr_NoEqu

        ENDM

;;------------------------------------------------------------------

;; 送常数到寄存器中
;; Mov to Register by Constant
;; Run Time Colck:2
;; Program Length: 2
MOV1C   MACRO   Reg1,Constant   ;; Reg = CONST
        MOV     A,#Constant
        MOV     Reg1,A
        ENDM
;; 送常数到寄存器中X→FOR ICE
;; Mov to Register by Constant
;; Run Time Colck:2
;; Program Length: 2
B0MOV1C  MACRO   Reg1,Constant   ;; Reg = CONST
        MOV     A,#Constant
        B0MOV  Reg1,A
        ENDM
;; 第二个寄存器送入第一个寄存器中
;; Mov to Register by Register
;; Run Time Colck:2
;; Program Length: 2
MOV1R   MACRO   Reg1,Reg2   ;; Reg1 = Reg2
        MOV     A,Reg2
        MOV     Reg1,A
        ENDM
;; 送两个常数到寄存器中
;; Mov to 2 Register by Constant
;; Run Time Colck:4
;; Program Length: 4
MOV2C   MACRO   A1,A2,C1,C2 ;; A1 = C1 , A2 = C2
        MOV     A,#C1
        MOV     A1,A
        MOV     A,#C2
        MOV     A2,A
        ENDM
;; 送两个寄存器值到寄存器中
;; Mov to 2 Register by 2 Register
;; Run Time Colck:4
;; Program Length: 4
MOV2R   MACRO   A1,A2,B1,B2 ;; A1 = B1 , A2 = B2
        MOV     A,B1
        MOV     A1,A
        MOV     A,B2
        MOV     A2,A
        ENDM
;; Set 3 register
;; run time colck:6
;; ProgramLength: 6
MOV3R   MACRO   AH,AM,AL,BH,BM,BL ;; AX = BX
        MOV     A,BH
        MOV     AH,A
        MOV     A,BM
        MOV     AM,A
        MOV     A,BL
        MOV     AL,A
        ENDM

;; Set 3 register by Constant
;; run time colck:6
;; ProgramLength: 6
MOV3C   MACRO   AH,AM,AL,CH,CM,CL ;; AX = CX
        MOV     A,#CH
        MOV     AH,A
        MOV     A,#CM
        MOV     AM,A
        MOV     A,#CL
        MOV     AL,A
        ENDM

;; Delay time: T=Constant*1
;; Run Time Colck:Constant
;; Program Length: Constant/1.5
D1T         MACRO     Constant
          IF         Constant==0
              EXITM
          ELSEIF     Constant==1
              NOP
              EXITM
          ELSEIF     Constant==2
              JMP       $+1
              EXITM
          ELSEIF     Constant==3
              JMP       $+1
              NOP
              EXITM
          ELSEIF     Constant==4
              JMP       $+1
              JMP       $+1
              EXITM
          ELSEIF     Constant==5
              JMP       $+1
              JMP       $+1
              NOP
              EXITM
          ELSEIF     Constant==6
              JMP       $+1
              JMP       $+1
              JMP       $+1
              EXITM
          ELSEIF     Constant==7
              JMP       $+1
              JMP       $+1
              JMP       $+1
              NOP
              EXITM
          ELSEIF     Constant==8
              JMP       $+1
              JMP       $+1
              JMP       $+1
              JMP       $+1
              EXITM
          ELSE
              Message "<CONSTANT IS TOO LARGE>"
          ENDIF
              ENDM

;; Delay time: T=Constant*2
;; Run Time Colck:Constant*2
;; Program Length: Constant
D2T         MACRO     Constant
          IF         Constant==0
              EXITM
          ELSEIF     Constant==1
              JMP     $+1
              EXITM
          ELSEIF     Constant==2
              JMP     $+1
              JMP     $+1
              EXITM
          ELSEIF     Constant==3
              JMP     $+1
              JMP     $+1
              JMP     $+1
              NOP
              EXITM
          ELSEIF     Constant==4
              JMP     $+1
              JMP     $+1
              JMP     $+1
              JMP     $+1
              EXITM
          ELSEIF     Constant==5
              JMP     $+1
              JMP     $+1
              JMP     $+1
              JMP     $+1
              JMP     $+1
              EXITM
          ELSEIF     Constant==6
              JMP     $+1
              JMP     $+1
              JMP     $+1
              JMP     $+1
              JMP     $+1
              JMP     $+1
              EXITM
          ELSEIF     Constant==7
              JMP     $+1
              JMP     $+1
              JMP     $+1
              JMP     $+1
              JMP     $+1
              JMP     $+1
              JMP     $+1
              EXITM
          ELSEIF     Constant==8
              JMP     $+1
              JMP     $+1
              JMP     $+1
              JMP     $+1
              JMP     $+1
              JMP     $+1
              JMP     $+1
              JMP     $+1
              EXITM
          ELSE
              Message "<CONSTANT IS TOO LARGE>"
          ENDIF
              ENDM

;; 1Byte Left Shift,Clear Carry
;; Run Time Clock:2
;; Program Length: 2
SHLC    MACRO   Reg1            ;; Shift Left
        CLRC
        RLCM    Reg1
        ENDM
;; 1Byte Right Shift,Clear Carry
;; Run Time Clock:2
;; Program Length: 2
SHRC    MACRO   Reg1            ;; Shift Right
        CLRC
        RRCM    Reg1
        ENDM

;; 2Byte Left Shift,Clear Carry
;; Run Time Clock:3
;; Program Length: 3
SHL2C   MACRO   Reg1,Reg2       ;; Shift Left
        SHLC    Reg1
        RLCM    Reg2
        ENDM
;; 3Byte Left Shift,Clear Carry
;; Run Time Clock:4
;; Program Length: 4
SHL3C   MACRO   Reg1,Reg2,Reg3  ;; Shift Left
        SHLC    Reg1
        RLCM    Reg2
        RLCM    Reg3
        ENDM
;; 2Byte Right Shift,Clear Carry
;; Run Time Clock:2
;; Program Length: 2
SHR2C   MACRO   Reg1,Reg2       ;; Shift Right
        SHRC    Reg1
        RRCM    Reg2
        ENDM
;; 3Byte Right Shift,Clear Carry
;; Run Time Clock:4
;; Program Length: 4
SHR3C   MACRO   Reg1,Reg2,Reg3  ;; Shift Right
        SHRC    Reg1
        RRCM    Reg2
        RRCM    Reg3
        ENDM

;; 2Byte Left Shift,
;; Run Time Clock:2
;; Program Length: 2
SHL2    MACRO   Reg1,Reg2       ;; Shift Left
        RLCM    Reg1
        RLCM    Reg2
        ENDM
;; 2Byte Left Shift,
;; Run Time Clock:3
;; Program Length: 3
SHL3    MACRO   Reg1,Reg2,Reg3  ;; Shift Left
        RLCM    Reg1
        RLCM    Reg2
        RLCM    Reg3
        ENDM
;; 2Byte Right Shift,
;; Run Time Clock:2
;; Program Length: 2
SHR2    MACRO   Reg1,Reg2       ;; Shift Right
        RRCM    Reg1
        RRCM    Reg2
        ENDM
;; 3Byte Right Shift,
;; Run Time Clock:3
;; Program Length: 3
SHR3    MACRO   Reg1,Reg2,Reg3  ;; Shift Right
        RRCM    Reg1
        RRCM    Reg2
        RRCM    Reg3
        ENDM

;; 1Byte Right Shift,Return
;; Run Time Clock:5
;; Program Length: 5
ROR     MACRO   Reg1            ;; Shift Right
        RRCM    Reg1
        BTOBE   Reg1.Bit7,FC
        ENDM

;; 1Byte Left Shift,Return
;; Run Time Clock:5
;; Program Length: 5
ROL     MACRO   Reg1            ;; Shift Left
        RLCM    Reg1
        BTOBE   Reg1.Bit0,FC
        ENDM

;; Loop end define
;; run time colck:2 , 3
;; ProgramLength: 2
DJNZ    MACRO   Reg,Locate  ;; if(--Reg != 0) goto Locate
        DECMS   Reg
        JMP_RET Locate
        ENDM
;;--------------------------
;; 当--MEMORY == 0时,MEMORY = #CONSTANT 否则跳转到ADDRESS
;; Run Time Clock:3
;; ProgramLength: 3
DJNZM   MACRO   MEMORY,CONSTANT,ADDRESS

        DECMS   MEMORY
        JMP_RET ADDRESS
        MOV     A,#CONSTANT
        MOV     MEMORY,A

        ENDM

;;-------------------------------------------------------------------
;
;   mov     a, #n
;   @JMP_A  5       // follow 5 commands of jmp
;   jmp     here_a_0
;   jmp     here_a_1
;   jmp     here_a_2
;   jmp     here_a_3
;   jmp     here_a_4
;

@JMP_A  MACRO   Val
    IF  (($+1) !& 0xff00) !!= (($+(val)) !& 0xff00)
            jmp ($ | 0xff)
            ORG ($ | 0xff)
    ENDIF
        ADD PCL,A

        ENDM

;;-------------------------------------------------------------------
;
;       @s_HCLK EQU     4000000 // CPU clock
;       ...
;       @SET_TIMER1     200     // every 200 uS generate interrupt
;

@SET_TIMER1     MACRO   Time
        IFNDEF  @s_HCLK
                @s_HCLK EQU     4000000
        ENDIF

        @s_VALUE        =       time * (@s_HCLK / 1000) / 8000
        @s_RATE         =       0x70

        REPEAT  7
                IF      @s_VALUE > 255
                        @s_VALUE = @s_VALUE / 2
                        @s_RATE = @s_RATE - 0x10
                ENDIF
        ENDM

        IF      @s_VALUE > 255
                ERROR   time over range
                EXITM
        ELSE
                B0BCLR  FTC1IEN

                MOV     A, #@s_RATE + 84H       // enable TC1, auto-reload
                B0MOV   TC1M, A

                MOV     A, #255 - @s_VALUE
                B0MOV   TC1R, A

                B0BSET  FTC1IEN
        ENDIF
        ENDM

;;------------------------------------------------------------------
    ENDIF

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -