.INCLUDE "M32DEF.INC" .EQU OPTION_SIZE = 0x4 .EQU RAM_OPTIONS = 0x100 .ORG 0 LDI R16,HIGH(RAMEND) OUT SPH,R16 LDI R16,LOW(RAMEND) OUT SPL,R16 RCALL LOAD_OPTIONS RCALL TEST_CHKSUM TST R20 BREQ L1 RCALL INIT_OPTIONS L1: RCALL CAL_CHKSUM RCALL STORE_OPTIONS HERE: RJMP HERE LOAD_FROM_EEPROM: SBIC EECR, EEWE RJMP LOAD_FROM_EEPROM OUT EEARH,XH OUT EEARL,XL SBI EECR,EERE IN R20,EEDR RET STORE_IN_EEPROM: SBIC EECR, EEWE RJMP STORE_IN_EEPROM OUT EEARH,XH OUT EEARL,XL OUT EEDR,R20 SBI EECR,EEMWE SBI EECR,EEWE RET LOAD_OPTIONS: LDI XL,LOW(E_OPTIONS) LDI XH,HIGH(E_OPTIONS) LDI YL,LOW(RAM_OPTIONS) LDI YH,HIGH(RAM_OPTIONS) LDI R16,OPTION_SIZE+1 LL1: CALL LOAD_FROM_EEPROM ST Y+,R20 INC XL BRNE LL2 INC XH LL2: DEC R16 BRNE LL1 RET STORE_OPTIONS: LDI XL,LOW(E_OPTIONS) LDI XH,HIGH(E_OPTIONS) LDI YL,LOW(RAM_OPTIONS) LDI YH,HIGH(RAM_OPTIONS) LDI R16,OPTION_SIZE+1 SL1: LD R20, Y+ CALL STORE_IN_EEPROM INC XL BRNE SL2 INC XH SL2: DEC R16 BRNE SL1 RET INIT_OPTIONS: LDI ZL,LOW(FLASH_OPTIONS<<1) LDI ZH,HIGH(FLASH_OPTIONS<<1) LDI YL,LOW(RAM_OPTIONS) LDI YH,HIGH(RAM_OPTIONS) LDI R16,OPTION_SIZE H1: LPM R18,Z+ ST Y+,R18 DEC R16 BRNE H1 RET CAL_CHKSUM: LDI YL,LOW(RAM_OPTIONS) LDI YH,HIGH(RAM_OPTIONS) LDI R16,OPTION_SIZE LDI R20,0 CL1: LD R17,Y+ ADD R20,R17 DEC R16 BRNE CL1 NEG R20 ST Y,R20 RET TEST_CHKSUM: LDI YL,LOW(RAM_OPTIONS) LDI YH,HIGH(RAM_OPTIONS) LDI R16,OPTION_SIZE+1 LDI R20,0 TL1: LD R17,Y+ ADD R20,R17 DEC R16 BRNE TL1 RET FLASH_OPTIONS: .DB 0x25,0x62,0x3F,0x52 .ESEG .ORG $0 E_OPTIONS: .DB 0x25,0x62,0x3F,0x52