⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 assembly.s90

📁 Mega8完美下载 包含源程序
💻 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 + -