📄 globdefs.inc
字号:
;+-----------------------------------
;| STORE ACC WORD TO MEMORY
;+-----------------------------------
;
; stsaw mem
.MACRO stsaw
sts @0,Acc
sts @0+1,AccH
.ENDMACRO
;+-----------------------------------
;| STORE ACC WORD TO MEMORY with index
;+-----------------------------------
;
; stdaw [X,Y,Z],index
.MACRO stdaw
std @0+@1,Acc
std @0+@1+1,AccH
.ENDMACRO
;+-----------------------------------
;| STORE ACCT WORD TO MEMORY
;+-----------------------------------
;
; stsawt mem
.MACRO stsawt
sts @0,AccT
sts @0+1,AccTH
.ENDMACRO
;+-----------------------------------
;| STORE ACCT WORD TO MEMORY with index
;+-----------------------------------
;
; stdawt [X,Y,Z],index
.MACRO stdawt
std @0+@1,AccT
std @0+@1+1,AccTH
.ENDMACRO
;+-----------------------------------
;| STORE REGISTER PAIR INTO MEMORY
;+-----------------------------------
;
; stsw mem,Z valid registers X,Y,Z
.MACRO stsw
sts @0,@1L
sts @0+1,@1H
.ENDMACRO
;+-----------------------------------
;| STORE REGISTER PAIR INTO MEMORY with index
;+-----------------------------------
;
; stdw [X,Y,Z],Z valid registers X,Y,Z,index
.MACRO stdw
std @0+@1,@2L
std @0+@1+1,@2H
.ENDMACRO
;+-----------------------------------
;| ADD IMEDIATE TO REGISTER
;+-----------------------------------
;
; addi var,imm
.MACRO addi
subi @0,-(@1)
.ENDMACRO
.MACRO adci
sbci @0,-(@1)
.ENDMACRO
;+-----------------------------------
;| SUB ACC IMEDIATE TO REGISTER PAIR WORD
;+-----------------------------------
;
; subiaw var
.MACRO subiaw
subi Acc,low(@0)
sbci AccH,high(@0)
.ENDMACRO
;+-----------------------------------
;| SUB ACCT IMEDIATE TO REGISTER PAIR WORD
;+-----------------------------------
;
; subiawt var
.MACRO subiawt
subi AccT,low(@0)
sbci AccTH,high(@0)
.ENDMACRO
;+-----------------------------------
;| SUB ACC IMEDIATE TO REGISTER PAIR LONG
;+-----------------------------------
;
; subial var
.MACRO subial
subi Acc,low(lwrd(@0))
sbci AccH,high(lwrd(@0))
sbci AccT,low(hwrd(@0))
sbci AccTH,high(hwrd(@0))
.ENDMACRO
;+-----------------------------------
;| ADD ACC IMEDIATE TO REGISTER PAIR WORD
;+-----------------------------------
;
; addiaw var
.MACRO addiaw
subi Acc,low(-(@0))
sbci AccH,high(-(@0))
.ENDMACRO
;+-----------------------------------
;| ADD ACCT IMEDIATE TO REGISTER PAIR WORD
;+-----------------------------------
;
; addiawt var
.MACRO addiawt
subi AccT,low(-(@0))
sbci AccTH,high(-(@0))
.ENDMACRO
;+-----------------------------------
;| ADD ACC IMEDIATE TO REGISTER PAIR LONG
;+-----------------------------------
;
; addial var
.MACRO addial
subi Acc,low(lwrd(-(@0)))
sbci AccH,high(lwrd(-(@0)))
sbci AccT,low(hwrd(-(@0)))
sbci AccTH,high(hwrd(-(@0)))
.ENDMACRO
;+-----------------------------------
;| SUB IMEDIATE TO REGISTER PAIR WORD
;+-----------------------------------
;
; subiw var,imm valid registers X,Y,Z
.MACRO subiw
subi @0L,low(@1)
sbci @0H,high(@1)
.ENDMACRO
;+-----------------------------------
;| SUB PAIR WORD
;+-----------------------------------
;
; subiw (imm valid registers X,Y,Z),(imm valid registers X,Y,Z)
.MACRO subw
sub @0L,@1L
sbc @0H,@1H
.ENDMACRO
;+-----------------------------------
;| ADD IMEDIATE TO REGISTER PAIR WORD
;+-----------------------------------
;
; addiw var,imm valid registers X,Y,Z
.MACRO addiw
subi @0L,low(-(@1))
sbci @0H,high(-(@1))
.ENDMACRO
;+-----------------------------------
;| ADD PAIR WORD
;+-----------------------------------
;
; addw (valid registers X,Y,Z),(valid registers X,Y,Z)
.MACRO addw
add @0L,@1L
adc @0H,@1H
.ENDMACRO
;+-----------------------------------
;| COMPARE IMEDIATE TO REGISTER PAIR WORD
;+-----------------------------------
;
; cpiw var,imm valid registers X,Y,Z
.MACRO cpiw
ldi Temp,low(@1)
cp @0L,Temp
ldi Temp,high(@1)
cpc @0H,Temp
.ENDMACRO
;+-----------------------------------
;| COMPARE REGISTER PAIR WORD
;+-----------------------------------
;
; cpw valid registers X,Y,Z,valid registers X,Y,Z
.MACRO cpw
cp @0L,@1L
cpc @0H,@1H
.ENDMACRO
;+-----------------------------------
;| COMPARE ACC IMEDIATE TO WORD
;+-----------------------------------
;
; cpiaw imm destroy Temp
.MACRO cpiaw
cpi Acc,low(@0)
ldi Temp,high(@0)
cpc AccH,Temp
.ENDMACRO
;+-----------------------------------
;| COMPARE ACCT IMEDIATE TO WORD
;+-----------------------------------
;
; cpiawt imm destroy Temp
.MACRO cpiawt
cpi AccT,low(@0)
ldi Temp,high(@0)
cpc AccTH,Temp
.ENDMACRO
;+-----------------------------------
;| COMPARE ACC IMEDIATE TO LONG
;+-----------------------------------
;
; cpial imm destroy Temp
.MACRO cpial
cpi Acc,low(lwrd(@0))
ldi Temp,high(lwrd(@0))
cpc AccH,Temp
ldi Temp,low(hwrd(@0))
cpc AccT,Temp
ldi Temp,high(hwrd(@0))
cpc AccTH,Temp
.ENDMACRO
;+-----------------------------------
;| 16 BITS PUSHS
;+-----------------------------------
;
; push AccH:Acc
;
.MACRO pushaw
push Acc
push AccH
.ENDMACRO
;
; push AccTH:AccT
;
.MACRO pushawt
push AccT
push AccTH
.ENDMACRO
;
; push TempH:Temp
;
.MACRO pushTempW
push Temp
push TempH
.ENDMACRO
;
; push X(word),Y(Word),Z(Word)
;
.MACRO pushw
push @0L
push @0H
.ENDMACRO
;+-----------------------------------
;| 16 BITS POPS
;+-----------------------------------
;
; pop AccH:Acc
;
.MACRO popaw
pop AccH
pop Acc
.ENDMACRO
;
; pop AccTH:AccT
;
.MACRO popawt
pop AccTH
pop AccT
.ENDMACRO
;
; pop TempH:Temp
;
.MACRO popTempW
pop TempH
pop Temp
.ENDMACRO
;
; pop X(word),Y(Word),Z(Word)
;
.MACRO popw
pop @0H
pop @0L
.ENDMACRO
;+-----------------------------------
;| LONG BRANCHS
;+-----------------------------------
.MACRO lbrne
breq PC+2
rjmp @0 ;*<NOCHANGE>*
.ENDMACRO
.MACRO lbreq
brne PC+2
rjmp @0 ;*<NOCHANGE>*
.ENDMACRO
.MACRO lbrcs
brcc PC+2
rjmp @0 ;*<NOCHANGE>*
.ENDMACRO
.MACRO lbrcc
brcs PC+2
rjmp @0 ;*<NOCHANGE>*
.ENDMACRO
.MACRO lbrlt
brge PC+2
rjmp @0 ;*<NOCHANGE>*
.ENDMACRO
.MACRO lbrmi
brpl PC+2
rjmp @0 ;*<NOCHANGE>*
.ENDMACRO
.MACRO lbrpo
brmi PC+2
rjmp @0 ;*<NOCHANGE>*
.ENDMACRO
.MACRO lbrge
brlt PC+2
rjmp @0 ;*<NOCHANGE>*
.ENDMACRO
.MACRO lbrsh
brlo PC+2
rjmp @0 ;*<NOCHANGE>*
.ENDMACRO
.MACRO lbrlo
brsh PC+2
rjmp @0 ;*<NOCHANGE>*
.ENDMACRO
;+-----------------------------------
;| LOOPS
;+-----------------------------------
.EQU _LOOP_BYTE = 3 ;byte and integer control loop variables
.EQU _LOOP_INTEGER = 6
;+---------------------
;| USAGE
;|
;| .DSEG
;| X: .BYTE _LOOP_BYTE <--create a _LOOP_BYTE variable
;| .CSEG
;|
;| FOR X,1,5,1 <--create counting from 1 to 5 step 1
;| do something <--put your code here
;| NEXT X <--next X
;+----------------------
;+--------------------
;| IMEDIATE FOR BYTE LOOP
;|
;| FOR X,i1,i2,i3
;| X=loop variable
;| i1=initial
;| i2=end count
;| i2=step
;+--------------------
.MACRO FOR
ldi Temp,@1
sts @0+0,Temp ;store initial
ldi Temp,@2
sts @0+1,Temp ;store end
ldi Temp,@3
sts @0+2,Temp ;store step
ldi Temp,low(PC) ;save in stack return address
push Temp
ldi Temp,high(PC-2)
push Temp
.ENDMACRO
;+--------------------
;| IMEDIATE FOR INTEGER LOOP
;| Syntax same a FOR
;+--------------------
.MACRO FORi
ldi Temp,low(@1)
sts @0+0,Temp ;store initial
ldi Temp,high(@1)
sts @0+1,Temp
ldi Temp,low(@2)
sts @0+2,Temp ;store end
ldi Temp,high(@2)
sts @0+3,Temp
ldi Temp,low(@3)
sts @0+4,Temp ;store step
ldi Temp,high(@3)
sts @0+5,Temp
ldi Temp,low(PC) ;save in stack return address
push Temp
ldi Temp,high(PC-2)
push Temp
.ENDMACRO
;+--------------------
;| NEXT byte complement of FOR byte
;|
;| NEXT X
;| X=loop variable
;+--------------------
.MACRO NEXT
lds Temp,@0+0 ;get variable
lds TempH,@0+2 ;get increment
add Temp,TempH ;next variable
sts @0+0,Temp
lds TempH,@0+1 ;get end
inc TempH
cp Temp,TempH ;variable reach end ?
brsh PC+2 ;yes finish
ret
pop TempH
pop Temp
.ENDMACRO
;+--------------------
;| NEXTi integer complement of FORi integer
;|
;| NEXTi X
;+--------------------
.MACRO NEXTi
push r0
push r1
lds Temp,@0+0 ;get variable
lds TempH,@0+1
lds r0,@0+4 ;get step
lds r1,@0+5
add Temp,r0 ;next variable
adc TempH,r1
sts @0+0,Temp ;store back
sts @0+1,TempH
lds r0,@0+2 ;get end
lds r1,@0+3
cp r0,Temp ;variable reach end ?
cpc r1,TempH
pop r1
pop r0
brcs PC+2 ;yes, finish
ret ;return to for
pop TempH
pop Temp
.ENDMACRO
;+--------------------
;| PUSH LOWER REGISTERS R0..R15
;+--------------------
.MACRO _M_PUSH_LOWER_REGS
push r0
push r1
push r2
push r3
push r4
push r5
push r6
push r7
push r8
push r9
push r10
push r11
push r12
push r13
push r14
push r15
.ENDMACRO
;+--------------------
;| PUSH UPPER REGISTERS R16..R31
;+--------------------
.MACRO _M_PUSH_UPPER_REGS
push r16
push r17
push r18
push r19
push r20
push r21
push r22
push r23
push r24
push r25
push r26
push r27
push r28
push r29
push r30
push r31
.ENDMACRO
;+--------------------
;| PUSH ALL REGISTERS R0..R31
;+--------------------
.MACRO _M_PUSH_ALL_REGS
_M_PUSH_LOWER_REGS
_M_PUSH_UPPER_REGS
.ENDMACRO
;+--------------------
;| POP LOWER REGISTERS R0..R15
;+--------------------
.MACRO _M_POP_LOWER_REGS
pop r15
pop r14
pop r13
pop r12
pop r11
pop r10
pop r9
pop r8
pop r7
pop r6
pop r5
pop r4
pop r3
pop r2
pop r1
pop r0
.ENDMACRO
;+--------------------
;| POP UPPER REGISTERS R16..R31
;+--------------------
.MACRO _M_POP_UPPER_REGS
pop r31
pop r30
pop r29
pop r28
pop r27
pop r26
pop r25
pop r24
pop r23
pop r22
pop r21
pop r20
pop r19
pop r18
pop r17
pop r16
.ENDMACRO
;+--------------------
;| POP ALL REGISTERS R0..R31
;+--------------------
.MACRO _M_POP_ALL_REGS
_M_POP_UPPER_REGS
_M_POP_LOWER_REGS
.ENDMACRO
#endif
.exit
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -