📄 assembly.s90
字号:
NAME assembly(16)
PUBLIC fill_temp_buffer
PUBLIC write_page
PUBLIC write_lock_bits
PUBLIC read_program_memory
RSEG CODE
#include "defines.h"
#define _SPM DW 0x95E8 ;Workaround for not having enhanced core Assembler in EWAAVR 2.25
write_page:
RCALL WAIT_SPMEN ;Wait for SPMEN flag cleared
MOV R31,R17
MOV R30,R16 ;move adress to z pointer (R31=ZH R30=ZL)
LOAD_SPM_CONTROL_REGISTER_MACRO ; argument 2 decides function (r18)
_SPM ;Store program memory
DW 0xFFFF ;For future part compatibility, instruction alignment
NOP
RJMP WAIT_SPMEN ;Wait for SPMEN flag cleared
fill_temp_buffer:
RCALL WAIT_SPMEN ;Wait for SPMEN flag cleared
MOV R31,R19 ;move adress to z pointer (R31=ZH R30=ZL)
MOV R30,R18
MOV R1,R17 ;move data to reg 0 and 1
MOV R0,R16
LDI R18,(1<<SPMEN)
LOAD_SPM_CONTROL_REGISTER_MACRO ; r18 decides function
_SPM ;Store program memory
DW 0xFFFF ;For future part compatibility, instruction alignment
NOP
RJMP WAIT_SPMEN ;Wait for SPMEN flag cleared
read_program_memory:
RCALL WAIT_SPMEN
MOV R31,R17 ;R31=ZH R30=ZL
MOV R30,R16 ;move adress to z pointer
SBRC R18,0 ;read lockbits? (second argument=0x09)
;if so, place second argument in SPMEN register
LOAD_SPM_CONTROL_REGISTER_MACRO ; r18 decides function
#ifdef LARGE_MEMORY ;If large memory (>64K) ELPM is needed to use RAMPZ
ELPM ;read LSB
#else
LPM
#endif
MOV R16,R0 ;read LSB
INC R30
#ifdef LARGE_MEMORY ;If large memory (>64K) ELPM is needed to use RAMPZ
ELPM ;read LSB
#else
LPM
#endif
MOV R17,R0 ;read MSB (ignored when reading lockbits)
RET
write_lock_bits:
RCALL WAIT_SPMEN ;Wait for SPMEN flag cleared
MOV R0,R16
LDI R18,((1<<BLBSET)|(1<<SPMEN))
LOAD_SPM_CONTROL_REGISTER_MACRO ; r18 decides function
_SPM ;write lockbits
DW 0xFFFF ;For future part compatibility, instruction alignment
NOP
RJMP WAIT_SPMEN ;Wait for SPMEN flag cleared
WAIT_SPMEN:
MOV R0, R18
GET_SPM_CONTROL_REGISTER_MACRO ; get SPMCR into r18
SBRC R18,SPMEN
RJMP WAIT_SPMEN ;Wait for SPMEN flag cleared
MOV R18, R0
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -