arduino_midi_player/Midi/mg/AVR.INC
2025-03-24 14:30:56 +08:00

369 lines
3.9 KiB
Plaintext

;------------------------------------------------;
; Constants
.equ RAMTOP = 0x60 ; SRAM top address
.equ RAMTOP100 = 0x100 ; For memory mapped I/O devices
.equ bit0 = 0b00000001
.equ bit1 = 0b00000010
.equ bit2 = 0b00000100
.equ bit3 = 0b00001000
.equ bit4 = 0b00010000
.equ bit5 = 0b00100000
.equ bit6 = 0b01000000
.equ bit7 = 0b10000000
.def T0L = r0
.def T0H = r1
.def T2L = r2
.def T2H = r3
.def T4L = r4
.def T4H = r5
.def T6L = r6
.def T6H = r7
.def T8L = r8
.def T8H = r9
.def T10L = r10
.def T10H = r11
.def T12L = r12
.def T12H = r13
.def T14L = r14
.def T14H = r15
.def AL = r16
.def AH = r17
.def BL = r18
.def BH = r19
.def CL = r20
.def CH = r21
.def DL = r22
.def DH = r23
.def EL = r24
.def EH = r25
;------------------------------------------------;
; Push/Pop register pair
;
; pushw Z
.macro pushw
push @0H
push @0L
.endm
.macro popw
pop @0L
pop @0H
.endm
;------------------------------------------------;
; Load/store word from/to direct memory/immediate
;
; ldsw Z,mem
; ldiw Z,imm
.macro ldiw
ldi @0L,low(@1)
ldi @0H,high(@1)
.endm
.macro ldsw
lds @0L,@1
lds @0H,@1+1
.endm
.macro stsw
sts @0+1,@1H
sts @0,@1L
.endm
.macro lddw
ldd @0L,@1
ldd @0H,@1+1
.endm
.macro stdw
std @0+1,@1H
std @0,@1L
.endm
.macro ldw
ld @0L,@1
ld @0H,@1
.endm
.macro stw
st @0,@1L
st @0,@1H
.endm
.macro inw
in @0L,@1L
in @0H,@1H
.endm
.macro outw
out @0H,@1H
out @0L,@1L
.endm
;------------------------------------------------;
; Store immediate into indirect memory via r16
;
; sti Z,imm
; stdi Z+d,imm
.macro sti
ldi r16,@1
st @0,r16
.endm
.macro stdi
ldi r16,@1
std @0,r16
.endm
.macro muli
ldi r16,@1
mul @0,r16
.endm
;------------------------------------------------;
; add/sub/subc/cp/cpc/lsl/lsr/rol/ror to register pair
;
.macro addiw
subi @0L,low(-(@1))
sbci @0H,high(-(@1))
.endm
.macro subiw
subi @0L,low(@1)
sbci @0H,high(@1)
.endm
.macro addw
add @0L,@1L
adc @0H,@1H
.endm
.macro adcw
adc @0L,@1L
adc @0H,@1H
.endm
.macro subw
sub @0L,@1L
sbc @0H,@1H
.endm
.macro sbcw
sbc @0L,@1L
sbc @0H,@1H
.endm
.macro cpw
cp @0L,@1L
cpc @0H,@1H
.endm
.macro cpcw
cpc @0L,@1L
cpc @0H,@1H
.endm
.macro cpiw
cpi @0L,low(@1)
ldi r16,high(@1)
cpc @0H,r16
.endm
.macro andw
and @0L,@1L
and @0H,@1H
.endm
.macro andiw
andi @0L,low(@1)
andi @0H,high(@1)
.endm
.macro orw
or @0L,@1L
or @0H,@1H
.endm
.macro oriw
ori @0L,low(@1)
ori @0H,high(@1)
.endm
.macro lslw
lsl @0L
rol @0H
.endm
.macro lsrw
lsr @0H
ror @0L
.endm
.macro asrw
asr @0H
ror @0L
.endm
.macro rolw
rol @0L
rol @0H
.endm
.macro rorw
ror @0H
ror @0L
.endm
.macro clrw
clr @0L
clr @0H
.endm
.macro comw
com @0L
com @0H
.endm
.macro negw
com @0H
neg @0L
brne PC+2
inc @0H
.endm
.macro movew
mov @0L, @1L
mov @0H, @1H
.endm
.macro lpmw
lpm @0L, @1
lpm @0H, @1
.endm
;------------------------------------------------;
; Store immediate into direct memory via r16
;
; stsi var,imm
.macro stsi
ldi r16,@1
sts @0,r16
.endm
;------------------------------------------------;
; Output port immediate via r16
;
; outi port,var
.macro outi
ldi r16,@1
out @0,r16
.endm
;------------------------------------------------;
; Add immediate to register
.macro addi
subi @0,-(@1)
.endm
;------------------------------------------------;
; Long branch
.macro rjne
breq PC+2
rjmp @0
.endm
.macro rjeq
brne PC+2
rjmp @0
.endm
.macro rjcc
brcs PC+2
rjmp @0
.endm
.macro rjcs
brcc PC+2
rjmp @0
.endm
.macro rjtc
brts PC+2
rjmp @0
.endm
.macro rjts
brtc PC+2
rjmp @0
.endm
.macro rjge
brlt PC+2
rjmp @0
.endm
.macro rjlt
brge PC+2
rjmp @0
.endm
.macro retcc
brcs PC+2
ret
.endm
.macro retcs
brcc PC+2
ret
.endm
.macro reteq
brne PC+2
ret
.endm
.macro retne
breq PC+2
ret
.endm
;------------------------------------------------;
; Move single bit between two registers
;
; bmov dstreg,dstbit,srcreg.srcbit
.macro movb
bst @2,@3
bld @0,@1
.endm