📄 macro_sonix_kuo.h
字号:
;; 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 + -