📄 systemasm.s
字号:
// SystemAsm.s
#include "m128asm.h"
.global GetFlashByte
.global GetExtFlashByte
.global ProgrFlash
.extern address
.extern buff
.extern length
.func GetFlashByte
GetFlashByte:
push ZL
push ZH
ldi ZL, 0
out RAMPZ, ZL
mov ZL, r24
mov ZH, r25
elpm r24, Z
clr r25
pop ZH
pop ZL
ret
.endfunc
.func GetExtFlashByte
GetExtFlashByte:
push ZL
push ZH
ldi ZL, 1
out RAMPZ, ZL
mov ZL, r24
mov ZH, r25
elpm r24, Z
clr r25
pop ZH
pop ZL
ret
.endfunc
.func ProgrFlash
ProgrFlash:
push r0
push r1
push r16
push r17
push r24
push r25
push YL
push YH
push ZL
push ZH
clr r17
lds ZL, address
lds ZH, address+1
ldi YL, lo8(buff)
ldi YH, hi8(buff)
lds r24, length
lds r25, length+1
length_loop:
cpi r17, 0x00
brne no_page_erase
wait_spm1:
lds r16, SPMCSR
andi r16, 1
cpi r16, 1
breq wait_spm1
ldi r16, 0x03
sts SPMCSR, r16
spm
wait_spm2:
lds r16, SPMCSR
andi r16, 1
cpi r16, 1
breq wait_spm2
ldi r16, 0x11
sts SPMCSR, r16
spm
no_page_erase:
ld r0, Y+
ld r1, Y+
wait_spm3:
lds r16, SPMCSR
andi r16, 1
cpi r16, 1
breq wait_spm3
ldi r16, 0x01
sts SPMCSR, r16
spm
inc r17
cpi r17, 128
brlo same_page
write_page:
clr r17
wait_spm4:
lds r16, SPMCSR
andi r16, 1
cpi r16, 1
breq wait_spm4
ldi r16, 0x05
sts SPMCSR, r16
spm
wait_spm5:
lds r16, SPMCSR
andi r16, 1
cpi r16, 1
breq wait_spm5
ldi r16, 0x11
sts SPMCSR, r16
spm
same_page:
adiw ZL, 2
sbiw r24, 2
breq final_write
rjmp length_loop
final_write:
cpi r17, 0
breq block_done
adiw r24,2
rjmp write_page
block_done:
pop ZH
pop ZL
pop YH
pop YL
pop r25
pop r24
pop r17
pop r16
pop r1
pop r0
.endfunc
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -