Код: Выделить всё
.equ BufferAddr = SRAM_START
.equ Buffersize = 48
.equ MaxPointerAddrH = high(BufferAddr + BufferSize)
.equ MaxPointerAddrL = low(BufferAddr + BufferSize)
.equ ReadPointerAddrH = BufferAddr + BufferSize
.equ ReadPointerAddrL = ReadPointerAddrH + 1
.equ WritePointerAddrH = ReadPointerAddrL + 1
.equ WritePointerAddrL = WritePointerAddrH + 1
.equ DataAddr = WritePointerAddrL + 1
.equ BytesInBufferAddr = DataAddr + 1
.def tmp1 = r16
reset:
cli
ldi temp,Low(ramend) ;инициализация стека
out spl,temp
ldi temp,high(ramend)
out sph,temp
rcall buffer_init ;инициализация кольцевого буфера FIFO
;write byte
ldi tmp1, 200 ;записываемые данные
sts DataAddr, tmp1
rcall write_byte ;запись в FIFO
rcall read_byte ;чтение из FIFO
lds tmp1,DataAddr ;считываемые данные
rjmp PC
buffer_init:
ldi tmp1,low(BufferAddr)
sts ReadPointerAddrH,tmp1
ldi tmp1,high(BufferAddr)
sts ReadPointerAddrL,tmp1
ldi tmp1,low(BufferAddr)
sts WritePointerAddrH,tmp1
ldi tmp1,high(BufferAddr)
sts WritePointerAddrL,tmp1
ret
read_byte:
lds tmp1,BytesInBufferAddr
tst tmp1
breq read_byte_error
dec tmp1
sts BytesInBufferAddr,tmp1
lds ZL,ReadPointerAddrL
lds ZH,ReadPointerAddrH
ld tmp1,Z+
sts DataAddr,tmp1
ldi tmp1,MaxPointerAddrH
cpi ZL,MaxPointerAddrL
cpc ZH,tmp1
brlo read_byte_addr_less_than_max
ldi ZL,low(BufferAddr)
ldi ZH,high(BufferAddr)
read_byte_addr_less_than_max:
sts ReadPointerAddrL,ZL
sts ReadPointerAddrH,ZH
ret
read_byte_error:
set
ret
write_byte:
lds tmp1,BytesInBufferAddr
cpi tmp1,Buffersize+1
brlo write_byte_ok
set
ret
write_byte_ok:
inc tmp1
sts BytesInBufferAddr,tmp1
lds ZL,WritePointerAddrL
lds ZH,WritePointerAddrH
lds tmp1,DataAddr
st Z+,tmp1
ldi tmp1,MaxPointerAddrH
cpi ZL,MaxPointerAddrL
cpc ZH,tmp1
brlo write_byte_addr_less_than_max
ldi ZL,low(BufferAddr)
ldi ZH,high(BufferAddr)
write_byte_addr_less_than_max:
sts WritePointerAddrL,ZL
sts WritePointerAddrH,ZH
ret