#define __SFR_OFFSET 0 #include "avr/io.h" #define bit(q) (1 << q) #define low(q) (q & 0xFF) #define high(q) low((q >> 8)) .global main ;.global _reset ;.global _cic_reset ;.global loop ;#define regionchange ;https://ww1.microchip.com/downloads/en/DeviceDoc/ATmega48A-PA-88A-PA-168A-PA-328-P-DS-DS40002061B.pdf ;http://ww1.microchip.com/downloads/en/devicedoc/atmel-0856-avr-instruction-set-manual.pdf ;http://ww1.microchip.com/downloads/en/devicedoc/31029a.pdf ;https://ww1.microchip.com/downloads/en/devicedoc/41190c.pdf ; memory usage: ; ;0120 buffer for seed calc and transfer ;0121-012F seed area(lock seed) ;R0 buffer for seed calc ;R1-R15 seed area(key seed; 0x31 filled by lock) ;ZL(R30)-ZH(R31) buffer for seed calc ;R19 buffer for EEPROM access ;R18 loop variable for longwait ;R17 loop variable for wait ;R20 GPIO buffer variable for pair mode allow ;R21 0: SuperCIC pair mode available flag ;R22 SuperCIC pair mode detect (phase 1) ;R23 SuperCIC pair mode detect (phase 2) ; ;R16 w ;R17 f ;R24 const 0x08 ;R25 const 0x0F ;X(R26-R27) loop seed ;Y(R28-R29) (0x0100)[64] ; .if 1 .org 0x0000 main: JMP 0x0080 ;; RESET ;; JMP 0x0068 ;; INT0 ;; JMP 0x0000 ;; INT1 ;; JMP 0x0000 ;; PCINT0 ;; JMP 0x0000 ;; PCINT1 ;; JMP 0x0000 ;; PCINT2 ;; JMP 0x0000 ;; WDT ;; JMP 0x0000 ;; TIMER2_COMPA ;; JMP 0x0000 ;; TIMER2_COMPB ;; JMP 0x0000 ;; TIMER2_OVF ;; JMP 0x0000 ;; TIMER1_CAPT ;; JMP 0x0000 ;; TIMER1_COMPA ;; JMP 0x0000 ;; TIMER1_COMPB ;; JMP 0x0000 ;; TIMER1_OVF ;; JMP 0x0000 ;; TIMER0_COMPA ;; JMP 0x0000 ;; TIMER0_COMPB ;; JMP 0x0000 ;; TIMER0_OVF ;; JMP 0x0000 ;; SPI_STC ;; JMP 0x0000 ;; USART_RX ;; JMP 0x0000 ;; USART_UDRE ;; JMP 0x0000 ;; USART_TX ;; JMP 0x0000 ;; ADC ;; JMP 0x0000 ;; EE_READY ;; JMP 0x0000 ;; ANALOG_COMP ;; JMP 0x0000 ;; TWI ;; JMP 0x0000 ;; SPM_Ready ;; .org 0x0068 _cic_reset: CLI ; 91 bcf INTCON, 1 LDI R16, 0x01 OUT EIFR, R16 CBI PORTD, 0 ; 92 bcf GPIO, 0 CBI PORTD, 1 ; 93 bcf GPIO, 1 SBI PORTD, 4 ; 94 bsf GPIO, 4 CLR R22 ; 95 clrf 0x5E ; 96 clrf 0x5F LDI R23, bit(1) ; 97 bsf 0x5f, 1 CLR R21 ; 98 clrf 0x5D ; 99 clrf 0x5C LDI R20, bit(3) ; 100 bsf 0x5C, 3 SEI ; 111 bsf INTCON, 7 RJMP _main ; 102 goto main .org 0x0080 _init: CLI ; 105 bcf STATUS, RP0 CLR PORTD ; 106 clrf GPIO LDI R16, 0x80 ; 107 movlw 0x07 OUT ACSR, R16 ; 108 movwf CMCON LDI R16, 0b00000010 ; 109 movlw 0x90 LDI R17, 0x01 STS EICRA, R16 ; 117 movwf OPTION_REG OUT EIMSK, R17 ; 110 movwf INTCON OUT EIFR, R17 ; 111 bsf STATUS, RP0 LDI R16, ~0x2D ; 112 movlw 0x2D OUT DDRD, R16 ; 113 movwf TRISIO LDI R16, 0xFF OUT DDRB, R16 CLR PORTB ; 114 movlw 0x24 ; 115 movwf WPU ; 116 movlw 0x00 ; 119 bcf STATUS, RP0 SBI PORTD, 4 ; 120 bsf GPIO, 4 LDS R16, ASSR SBR R16, bit(EXCLK) STS ASSR, R16 SBR R16, bit(AS2) CLR R16 SEI _idle: x0: RCALL _wait ; cause LEDs connected to digital DEC R18 ; pins 8~13 (PORTB) to blink rapidly BRNE x0 ; to show that Arduino is running x1: ; and that INT0 hasn't been RCALL _wait ; triggered yet. Also shows the DEC R18 ; speed of the clock? BRNE x1 IN R16, PORTB COM R16 OUT PORTB, R16 RJMP _idle ; 122 goto idle _main: LDI YL, 0x00 LDI YH, 0x01 LDI R24, 0x08 LDI R25, 0x0F ; bsf STATUS, RP0 SBI DDRD, 0 ; 126 bsf TRISIO, 0 CBI DDRD, 1 ; 127 bcf TRISIO, 1 ; bcf STATUS, RP0 ; -------- INIT LOCK SEED (what the lock sends) -------- LDI R16, 0xB ; 130 movlw 0xB STD Y+0x21, R16 ; 131 movwf 0x21 LDI R16, 0x1 ; 132 movlw 0x1 STD Y+0x22, R16 ; 133 movwf 0x22 LDI R16, 0x4 ; 134 movlw 0x4 STD Y+0x23, R16 ; 135 movwf 0x23 LDI R16, 0xF ; 136 movlw 0xF STD Y+0x24, R16 ; 137 movwf 0x24 LDI R16, 0x4 ; 138 movlw 0x4 STD Y+0x25, R16 ; 139 movwf 0x25 LDI R16, 0xB ; 140 movlw 0xB STD Y+0x26, R16 ; 141 movwf 0x26 LDI R16, 0x5 ; 142 movlw 0x5 STD Y+0x27, R16 ; 143 movwf 0x27 LDI R16, 0x7 ; 144 movlw 0x7 STD Y+0x28, R16 ; 145 movwf 0x28 LDI R16, 0xF ; 146 movlw 0xF STD Y+0x29, R16 ; 147 movwf 0x29 LDI R16, 0xD ; 148 movlw 0xD STD Y+0x2A, R16 ; 149 movwf 0x2A LDI R16, 0x6 ; 150 movlw 0x6 STD Y+0x2B, R16 ; 151 movwf 0x2B LDI R16, 0x1 ; 152 movlw 0x1 STD Y+0x2C, R16 ; 153 movwf 0x2C LDI R16, 0xE ; 154 movlw 0xE STD Y+0x2D, R16 ; 155 movwf 0x2D LDI R16, 0x9 ; 156 movlw 0x9 STD Y+0x2E, R16 ; 157 movwf 0x2E LDI R16, 0x8 ; 158 movlw 0x8 STD Y+0x2F, R16 ; 159 movwf 0x2F ; -------- INIT KEY SEED (what we must send) -------- ; 162 bsf STATUS, RP0 CLR R16 ; 163 clrf EEADR OUT EEARH, R16 OUT EEARL, R16 SBI EECR, EERE ; 164 bsf EECON1, RD IN R16, EEDR ; 165 movf EEDAT, w ; 166 bcf STATUS, RP0 .ifndef regionchange LDI R16, 0x9 ; fixed to D411 (NTSC) .else NOP .endif MOV R2, R16 ; 167 movwf 0x32 LDI R16, 0xA ; 168 movlw 0xA MOV R3, R16 ; 169 movwf 0x33 LDI R16, 0x1 ; 170 movlw 0x1 MOV R4, R16 ; 171 movwf 0x34 LDI R16, 0x8 ; 172 movlw 0x8 MOV R5, R16 ; 173 movwf 0x35 LDI R16, 0x5 ; 174 movlw 0x5 MOV R6, R16 ; 175 movwf 0x36 LDI R16, 0xF ; 176 movlw 0xF MOV R7, R16 ; 177 movwf 0x37 LDI R16, 0x1 ; 178 movlw 0x1 MOV R8, R16 ; 179 movwf 0x38 MOV R9, R16 ; 180 movwf 0x39 LDI R16, 0xE ; 181 movlw 0xE MOV R10, R16 ; 182 movwf 0x3A LDI R16, 0x1 ; 183 movlw 0x1 MOV R11, R16 ; 184 movwf 0x3B LDI R16, 0x0 ; 185 movlw 0x0 MOV R12, R16 ; 186 movwf 0x3C LDI R16, 0xD ; 187 movlw 0xD MOV R13, R16 ; 188 movwf 0x3D LDI R16, 0xE ; 189 movlw 0xE MOV R14, R16 ; 190 movwf 0x3E LDI R16, 0xC ; 191 movlw 0xC MOV R15, R16 ; 192 movwf 0x3F ; -------- wait for stream ID -------- LDI R16, 0xB5 ; 195 movlw 0xB5 RCALL _wait ; 196 call wait CLR R1 ; 197 clrf 0x31 ; ------- lock sends stream ID. 15 cycles per bit ------- SBIC PIND, 0 ; 202 btfsc GPIO, 0 MOV R18, R1 ; 203 bsf 0x31, 3 SBR R18, bit(3) LDI R16, 0x01 ; 204 movlw 0x2 RCALL _wait ; 205 call wait NOP ; 206 nop NOP ; 207 nop SBIC PIND, 0 ; 211 btsc GPIO, 0 SBR R18, bit(0) ; 212 bsf 0x31, 0 LDI R16, 0x01 ; 213 movlw 0x2 RCALL _wait ; 214 call wait NOP ; 215 nop NOP ; 216 nop SBIC PIND, 0 ; 220 btsc GPIO, 0 SBR R18, bit(1) ; 221 bsf 0x31, 1 LDI R16, 0x01 ; 222 movlw 0x2 RCALL _wait ; 223 call wait NOP ; 224 nop NOP ; 225 nop SBIC PIND, 0 ; 229 btfsc GPIO, 0 SBR R18, bit(2) ; 230 bsf 0x31, 2 MOV R1, R18 ; 231 bsf STATUS, RP0 CBI DDRD, 0 ; 232 bcf TRISIO, 0 SBI DDRD, 1 ; 233 bcf TRISIO, 1 ; 234 bcf STATUS, RP0 LDI R16, 0x38 ; 235 movlw 0x27 RCALL _wait ; 236 call wait NOP ; 237 nop NOP ; -------- main loop -------- loop: LDI XL, 0x1 ; 240 movlw 0x1 MOV XH, XL _loop0: ADIW X, 0x30 ; 242 addlw 0x30 ; 243 movwf FSR _loop1: NOP ; 245 nop LD R16, X ; 246 movf INDF, w STD Y+0x20, R16 ; 247 movwf 0x20 CBR R16, 0x02 ; 248 bcf 0x20, 1 SBRC R16, 0 ; 249 btfsc 0x20, 0 SBR R16, bit(1) ; 250 bsf 0x20, 1 SBR R16, bit(4) ; 251 bsf 0x20, 4 LDD R16, Y+0x20 ; 252 movf 0x20, w OUT PORTD, R16 ; 253 movwf GPIO NOP ; 254 nop NOP ; 255 nop NOP ; 256 nop NOP ; 257 nop LDI R16, 0x10 ; 258 movlw 0x10 OUT PORTD, R16 ; 259 movwf GPIO LDI R16, 0x1A ; 260 movlw 0x13 RCALL _wait ; 261 call wait NOP NOP ; 262 nop SBRC R21, 0 ; 263 btfsc 0x5d, 0 CBI PORTD, 4 ; 264 bcf GPIO, 4 NOP ; 265 nop NOP ; 266 nop SBI PORTD, 4 ; 267 bsf GPIO, 4 SBIC PIND, 0 ; 268 btfsc GPIO, 0 RJMP _die ; 269 goto die SBIC PIND, 1 ; 270 btfsc GPIO, 1 RJMP _die ; 271 goto die ADIW Z, 1 ; 272 incf FSR, f ; 273 movlw 0xf ANDI R30, 0x0F ; 274 andwf FSR, w BREQ _277 ; 275 btfss STATUS, Z RJMP _loop1 ; 276 goto loop1 _277: RCALL _mangle ; 277 call mangle RCALL _mangle ; 278 call mangle RCALL _mangle ; 279 call mangle LDI R16, 0x01 ; 280 movlw 0x2 RCALL _wait ; 281 call wait NOP ; 282 nop NOP ; 283 nop SBRC R7, 0 ; 284 btfsc 0x37, 0 RJMP _swap ; 285 goto swap ; 286 bsf STATUS, RP0 CBI DDRD, 0 ; 287 bcf TRISIO, 0 SBI DDRD, 1 ; 288 bsf TRISIO, 1 RJMP _swapskip ; 289 goto swapskip _swap: ; 291 bsf STATUS, RP0 SBI DDRD, 0 ; 292 bsf TRISIO, 0 CBI DDRD, 1 ; 293 bcf TRISIO, 1 NOP ; 294 nop _swapskip: ; 296 bcf STATUS, RP0 MOV R16, R7 ; 297 movf 0x37, w ANDI R16, 0x0F ; 298 andlw 0xf BREQ _301 ; 299 btfss STATUS, Z RJMP _loop0 ; 300 goto loop0 _301: RJMP loop ; 301 goto loop ; -------- calculate new seeds -------- _mangle: RCALL _mangle_lock ; 307 call mangle_lock IN R16, PIND ; 308 movf GPIO, W MOV R20, R16 ; 309 movwf 0x5C _mangle_key: LDD R16, Y+0x2F ; 311 movf 0x2F, W STD Y+0x20, R16 ; 312 movwf 0x20 _mangle_key_loop: INC R16 ; 314 addlw 0x1 LDD R17, Y+0x21 ; 315 addwf 0x21, f ADD R16, R17 STD Y+0x21, R16 LDD R16, Y+0x22 ; 316 movf 0x22, w MOV R30, R16 ; 317 movwf 0x40 LDD R16, Y+0x21 ; 318 movf 0x21, w LDD R17, Y+0x22 ; 319 addwf 0x22, f ADD R16, R17 INC R16 ; 320 incf 0x22, f COM R16 ; 321 comf 0x22, f STD Y+0x22, R16 LDD R16, Y+0x23 ; 322 movf 0x23, w MOV R31, R16 ; 323 movwf 0x41 ; 324 movlw 0xf ANDI R16, 0x0F ; 325 andwf 0x23, f STD Y+0x23, R16 MOV R16, R30 ; 326 movf 0x40, w ANDI R16, 0x0F ; 327 andlw 0xf LDD R17, Y+0x23 ; 328 addwf 0x23, f ADD R16, R17 INC R16 ; 329 incf 0x23, f STD Y+0x23, R16 SBRC R16, 4 ; 310 btfsc 0x23, 4 RJMP _mangle_key_withskip ; 311 goto mangle_key_withskip mangle_key_withoutskip: MOV R16, R31 ; 333 movf 0x41, w LDD R17, Y+0x24 ; 334 addwf 0x24, f ADD R16, R17 STD Y+0x24, R16 LDD R16, Y+0x25 ; 335 movf 0x25, w MOV R30, R16 ; 336 movwf 0x40 LDD R16, Y+0x24 ; 337 movf 0x24, w LDD R17, Y+0x25 ; 338 addwf 0x25, f ADD R16, R17 STD Y+0x25, R16 LDD R16, Y+0x26 ; 339 movf 0x26, w MOV R31, R16 ; 340 movwf 0x41 MOV R16, R30 ; 341 movf 0x40, w ANDI R16, 0x0F ; 342 andlw 0xf LDI R17, 0x08 ; 343 addlw 0x8 ADD R16, R17 LDD R17, Y+0x26 ; 346 addwf 0x26, w MOV R30, R16 ; 344 movwf 0x40 SBRS R30, 4 ; 345 btfss 0x40, 4 ADD R16, R17 ; 346 addwf 0x26, w STD Y+0x26, R16 ; 347 movwf 0x26 MOV R16, R31 ; 349 movf 0x41, w INC R16 ; 350 addlw 0x1 LDD R17, Y+0x27 ; 351 addwf 0x27, f ADD R16, R17 STD Y+0x27, R16 ; 353 movf 0x27, w INC R16 ; 354 addlw 0x1 LDD R17, Y+0x28 ; 355 addwf 0x28, f ADD R16, R17 STD Y+0x28, R16 ; 357 movf 0x28, w INC R16 ; 358 addlw 0x1 LDD R17, Y+0x29 ; 359 addwf 0x29, f ADD R16, R17 STD Y+0x29, R16 ; 361 movf 0x29, w INC R16 ; 362 addlw 0x1 LDD R17, Y+0x2A ; 363 addwf 0x2a, f ADD R16, R17 STD Y+0x2A, R16 ; 365 movf 0x2a, w INC R16 ; 366 addlw 0x1 LDD R17, Y+0x2B ; 367 addwf 0x2b, f ADD R16, R17 STD Y+0x2B, R16 ; 369 movf 0x2b, w INC R16 ; 370 addlw 0x1 LDD R17, Y+0x2C ; 371 addwf 0x2c, f ADD R16, R17 STD Y+0x2C, R16 ; 373 movf 0x2c, w INC R16 ; 374 addlw 0x1 LDD R17, Y+0x2D ; 375 addwf 0x2d, f ADD R16, R17 STD Y+0x2D, R16 ; 377 movf 0x2d, w INC R16 ; 378 addlw 0x1 LDD R17, Y+0x2E ; 379 addwf 0x2e, f ADD R16, R17 STD Y+0x2E, R16 ; 381 movf 0x2e, w INC R16 ; 382 addlw 0x1 LDD R17, Y+0x2F ; 383 addwf 0x2f, f ADD R16, R17 STD Y+0x2F, R16 LDD R16, Y+0x20 ; 385 movf 0x20, w ANDI R16, 0x0F ; 386 andlw 0xf ADD R17, R25 ; 387 addlw 0xf STD Y+0x20, R16 ; 388 movwf 0x20 MOV R16, R21 ; 390 btfsc 0x5d, 0 SBRC R16, 0 CBI PORTD, 4 ; 391 bcf GPIO, 4 NOP ; 392 nop NOP ; 393 nop SBI PORTD, 4 ; 394 bsf GPIO, 4 NOP ; 396 nop NOP ; 397 nop NOP ; 398 nop NOP ; 399 nop LDD R16, Y+0x20 ; 400 btfss 0x20, 4 SBRS R16, 4 RJMP _mangle_return ; 401 goto mangle_return NOP ; 402 nop RJMP _mangle_key_loop ; 403 goto mangle_key_loop _mangle_key_withskip: MOV R16, R31 ; 408 movf 0x41, w LDD R17, Y+0x23 ; 409 addwf 0x23, f ADD R16, R17 STD Y+0x23, R16 LDD R16, Y+0x24 ; 410 movf 0x24, w MOV R30, R16 ; 411 movwf 0x40 LDD R16, Y+0x23 ; 412 movf 0x23, w LDD R17, Y+0x24 ; 413 addwf 0x24, f ADD R16, R17 STD Y+0x24, R16 LDD R16, Y+0x25 ; 414 movf 0x25, w MOV R31, R16 ; 415 movwf 0x41 MOV R16, R30 ; 416 movf 0x40, w ANDI R16, 0x0F ; 417 andlw 0xf LDI R17, 0x08 ; 418 addlw 0x8 ADD R16, R17 MOV R30, R16 ; 419 movwf 0x40 LDD R17, Y+0x25 ; 421 addwf 0x25, w SBRS R30, 4 ; 420 btfss 0x40, 4 ADD R16, R17 ; 421 addwf 0x25, w STD Y+0x25, R16 ; 422 movwf 0x25 MOV R16, R31 ; 424 movf 0x41, w INC R16 ; 425 addlw 0x1 LDD R17, Y+0x26 ; 426 addwf 0x26, f ADD R16, R17 STD Y+0x26, R16 ; 428 movf 0x26, w INC R16 ; 429 addlw 0x1 LDD R17, Y+0x27 ; 430 addwf 0x27, f ADD R16, R16 STD Y+0x27, R16 ; 432 movf 0x27, w INC R16 ; 433 addlw 0x1 LDD R17, Y+0x28 ; 434 addwf 0x28, f ADD R16, R16 STD Y+0x28, R16 ; 436 movf 0x28, w INC R16 ; 437 addlw 0x1 LDD R17, Y+0x29 ; 438 addwf 0x29, f ADD R16, R16 STD Y+0x29, R16 ; 440 movf 0x29, w INC R16 ; 441 addlw 0x1 LDD R17, Y+0x2A ; 442 addwf 0x2a, f ADD R16, R16 STD Y+0x2A, R16 ; 444 movf 0x2a, w INC R16 ; 445 addlw 0x1 LDD R17, Y+0x2B ; 446 addwf 0x2b, f ADD R16, R16 STD Y+0x2B, R16 ; 448 movf 0x2b, w INC R16 ; 449 addlw 0x1 LDD R17, Y+0x2C ; 450 addwf 0x2c, f ADD R16, R16 STD Y+0x2C, R16 ; 452 movf 0x2c, w INC R16 ; 453 addlw 0x1 LDD R17, Y+0x2D ; 454 addwf 0x2d, f ADD R16, R16 STD Y+0x2D, R16 ; 456 movf 0x2d, w INC R16 ; 457 addlw 0x1 LDD R17, Y+0x2E ; 458 addwf 0x2e, f ADD R16, R16 STD Y+0x2E, R16 ; 460 movf 0x2e, w INC R16 ; 461 addlw 0x1 LDD R17, Y+0x2F ; 462 addwf 0x2f, f ADD R16, R16 STD Y+0x2F, R16 LDD R16, Y+0x20 ; 464 movf 0x20, w ANDI R16, 0x0F ; 465 andlw 0xf LDI R17, 0x0F ; 466 addlw 0xf ADD R16, R17 STD Y+0x20, R16 ; 467 movwf 0x20 ;------- pair mode code ------- CBI PORTD, 0 ; 469 bcf GPIO, 0 IN R16, PIND ; 470 movf GPIO, w SBRS R20, 3 ; 471 btfss 0x5c, 3 SBI PORTD, 0 ; 472 bsf GPIO, 0 MOV R22, R16 ; 473 movwf 0x5e IN R16, PIND ; 474 movf GPIO, w MOV R23, R16 ; 475 movwf 0x5f CBI PORTD, 0 ; 476 bcf GPIO, 0 SBRC R21, 0 ; 478 btfsc 0x5d, 0 CBI PORTD, 4 ; 479 bcf GPIO, 4 SBI PORTD, 4 ; 480 bsf GPIO, 4 ;------- end of pair mode code ------- LDD R17, Y+0x20 ; 482 btfss 0x20, 4 SBRS R17, 4 RJMP _mangle_return ; 483 goto mangle_return LDD R16, Y+0x20 ; 484 movf 0x20, w RJMP _mangle_key_loop ; 485 goto mangle_key_loop _mangle_return: RET ; 487 return _mangle_lock: MOV R16, R15 ; 492 movf 0x3f, w MOV R0, R16 ; 493 movwf 0x30 _mangle_lock_loop: INC R16 ; 495 addlw 0x1 ADD R1, R16 ; 496 addwf 0x31, f MOV R16, R2 ; 497 movf 0x32, w MOV R30, R16 ; 498 movwf 0x40 MOV R16, R1 ; 499 movf 0x31, w ADD R2, R16 ; 500 addwf 0x32, f INC R2 ; 501 incf 0x32, f COM R2 ; 502 comf 0x32, f MOV R16, R3 ; 503 movf 0x33, w MOV R31, R16 ; 504 movwf 0x41 ; 505 movlw 0xf AND R3, R25 ; 506 andwf 0x33, f MOV R16, R30 ; 507 movf 0x40, w ANDI R16, 0x0F ; 508 andlw 0xf ADD R3, R16 ; 509 addwf 0x33, f INC R3 ; 510 incf 0x33, f SBRC R16, 4 ; 511 btfsc 0x33, 4 RJMP _mangle_lock_withskip ; 512 goto mangle_lock_withskip _mangle_lock_withoutskip: MOV R16, R31 ; 514 movf 0x41, w ADD R4, R16 ; 515 addwf 0x34, f MOV R16, R5 ; 516 movf 0x35, w MOV R30, R16 ; 517 movwf 0x40 MOV R16, R4 ; 518 movf 0x34, w ADD R5, R16 ; 519 addwf 0x35, f MOV R16, R6 ; 520 movf 0x36, w MOV R31, R16 ; 521 movwf 0x41 MOV R16, R30 ; 522 movf 0x40, w ANDI R16, 0x0F ; 523 andlw 0xf ADD R16, R24 ; 524 addlw 0x8 MOV R30, R16 ; 525 movwf 0x40 MOV R16, R6 ; 527 addwf 0x36, w SBRS R16, 4 ; 526 btfss 0x40, 4 ADD R16, R6 ; 527 addwf 0x36, w MOV R6, R16 ; 528 movwf 0x36 MOV R16, R31 ;530 movf 0x41, w INC R16 ;531 addlw 0x1 ADD R7, R16 ;532 addwf 0x37, f MOV R16, R7 ;534 movf 0x37, w INC R16 ;535 addlw 0x1 ADD R8, R16 ;536 addwf 0x38, f MOV R16, R8 ;538 movf 0x38, w INC R16 ;539 addlw 0x1 ADD R9, R16 ;540 addwf 0x39, f MOV R16, R9 ;542 movf 0x39, w INC R16 ;543 addlw 0x1 ADD R10, R16 ;544 addwf 0x3a, f MOV R16, R10 ;546 movf 0x3a, w INC R16 ;547 addlw 0x1 ADD R11, R16 ;548 addwf 0x3b, f MOV R16, R11 ;550 movf 0x3b, w INC R16 ;551 addlw 0x1 ADD R12, R16 ;552 addwf 0x3c, f MOV R16, R12 ;554 movf 0x3c, w INC R16 ;555 addlw 0x1 ADD R13, R16 ;556 addwf 0x3d, f MOV R16, R13 ;558 movf 0x3d, w INC R16 ;559 addlw 0x1 ADD R14, R16 ;560 addwf 0x3e, f MOV R16, R14 ;562 movf 0x3e, w INC R16 ;563 addlw 0x1 ADD R15, R16 ;564 addwf 0x3f, f MOV R16, R0 ;566 movf 0x30, w ANDI R16, 0x0F ;567 andlw 0xf ADD R16, R25 ;568 addlw 0xf MOV R0, R16 ;569 movwf 0x30 SBRC R21, 0 ;571 btfsc 0x5d, 0 SBI PORTD, 4 ;572 bcf GPIO, 4 NOP ;573 nop NOP ;574 nop SBI PORTD, 4 ;575 bsf GPIO, 4 NOP ;577 nop NOP ;578 nop NOP ;579 nop NOP ;580 nop SBRS R0, 4 ;581 btfss 0x30, 4 RJMP _mangle_return ;582 goto mangle_return NOP ;583 nop RJMP _mangle_lock_loop ;584 goto mangle_lock_loop _mangle_lock_withskip: MOV R16, R31 ; 589 movf 0x41, w ADD R3, R16 ; 590 addwf 0x33, f MOV R16, R4 ; 591 movf 0x34, w MOV R30, R16 ; 592 movwf 0x40 MOV R16, R3 ; 593 movf 0x33, w ADD R4, R16 ; 594 addwf 0x34, f MOV R16, R5 ; 595 movf 0x35, w MOV R31, R16 ; 596 movwf 0x41 MOV R16, R30 ; 597 movf 0x40, w ANDI R16, 0x0F ; 598 andlw 0xf ADD R16, R24 ; 599 addlw 0x8 MOV R30, R16 ; 600 movwf 0x40 ADD R16, R5 ; 602 addwf 0x35, w SBRS R16, 4 ; 601 btfss 0x40, 4 ADD R16, R17 ; 602 addwf 0x35, w MOV R5, R16 ; 603 movwf 0x35 MOV R16, R31 ; 605 movf 0x41, w INC R16 ; 606 addlw 0x1 ADD R6, R16 ; 607 addwf 0x36, f MOV R16, R6 ; 609 movf 0x36, w INC R16 ; 610 addlw 0x1 ADD R7, R16 ; 611 addwf 0x37, f MOV R16, R7 ; 613 movf 0x37, w INC R16 ; 614 addlw 0x1 ADD R8, R16 ; 615 addwf 0x38, f MOV R16, R8 ; 617 movf 0x38, w INC R16 ; 618 addlw 0x1 ADD R9, R16 ; 619 addwf 0x39, f MOV R16, R9 ; 621 movf 0x39, w INC R16 ; 622 addlw 0x1 ADD R10, R16 ; 623 addwf 0x3a, f MOV R16, R10 ; 625 movf 0x3a, w INC R16 ; 626 addlw 0x1 ADD R11, R16 ; 627 addwf 0x3b, f MOV R16, R11 ; 629 movf 0x3b, w INC R16 ; 630 addlw 0x1 ADD R12, R16 ; 631 addwf 0x3c, f MOV R16, R12 ; 633 movf 0x3c, w INC R16 ; 634 addlw 0x1 ADD R13, R16 ; 635 addwf 0x3d, f MOV R16, R13 ; 637 movf 0x3d, w INC R16 ; 638 addlw 0x1 ADD R14, R16 ; 639 addwf 0x3e, f MOV R16, R14 ; 641 movf 0x3e, w INC R16 ; 642 addlw 0x1 ADD R15, R16 ; 643 addwf 0x3f, f MOV R16, R0 ; 645 movf 0x30, w ANDI R16, 0x0F ; 646 andlw 0xf ADD R16, R25 ; 647 addlw 0xf MOV R0, R16 ; 648 movwf 0x30 ;------- pair mode code ------- SBRS R22, 1 ; 650 btfss 0x5e, 1 RJMP _scic_pair_skip1 ; 651 goto scic_pair_skip1 SBRC R23, 1 ; 652 btfsc 0x5f, 1 RJMP _scic_pair_skip2 ; 653 goto scic_pair_skip2 SBRC R20, 3 ; 654 btfsc 0x5c, 3 RJMP _scic_pair_skip3 ; 655 goto scic_pair_skip3 RJMP _supercic_pairmode ; 656 goto supercic_pairmode _scic_pair_skip1: NOP ; 658 nop NOP ; 659 nop _scic_pair_skip2: NOP ; 661 nop NOP ; 662 nop NOP ; 663 nop NOP ; 664 nop RJMP _scic_pair_skip4 ; 665 goto scic_pair_skip4 _scic_pair_skip3: CBI PORTD, 4 ; 667 bcf GPIO, 4 SBR R21, bit(0) ; 668 bsf 0x5d, 0 NOP ; 669 nop SBI PORTD, 4 ; 670 bsf GPIO, 4 _scic_pair_skip4: ;------- end of pair mode code ------- SBRS R0, 4 ; 674 btfss 0x30, 4 RJMP _mangle_return ; 675 goto mangle_return NOP ; 676 nop RJMP _mangle_lock_loop ; 677 goto mangle_lock_loop ; --------- wait: 2 * (R16 - 1) + 10 cycles ----------- _wait: MOV R17, R16 ; 683 movwf 0x4F _wait0: DEC R17 ; 684 decfsz 0x4F, F BRNE _wait0 ; 685 goto wait0 RET ; 868 return ; -------- change region in eeprom and die ------- _die: LDI R18, 0x3A ;700 movlw 0x3a CLR R16 _longwait0: RCALL _wait DEC R18 BRNE _longwait0 ;701 call longwait ;702 bsf STATUS, RP0 CLR R16 ;703 clrw OUT EEARH, R16 ;704 movwf EEADR OUT EEARL, R16 SBI EECR, EERE ;705 bsf EECON1, RD OUT EEDR, R16 ;706 movf EEDAT, w ;707 bcf STATUS, RP0 MOV R19, R16 ;708 movwf 0x4d SBRS R19, 0 ;709 btfsc 0x4d, 0 RJMP _die_reg_6 ;710 goto die_reg_6 _die_reg_9: LDI R16, 0x9 ; 712 movlw 0x9 RJMP _die_reg_cont ; 713 goto die_reg_cont _die_reg_6: LDI R16, 0x6 ; 715 movlw 0x6 _die_reg_cont: ; 717 bsf STATUS, RP0 OUT EEDR, R16 ; 718 movwf EEDAT LDI R17, bit(EEMPE) ; 719 bsf EECON1, WREN _die_intloop: CLI ; 722 bcf INTCON, GIE BRID _726 ; 723 btfsc INTCON, GIE RJMP _die_intloop ; 724 goto die_intloop _726: ; 726 movlw 0x55 ; 727 movwf EECON2 ; 728 movlw 0xaa ; 729 movwf EECON2 OUT EECR, R17 ; 719 bsf EECON1, WREN SBI EECR, EEPE ; 730 bsf EECON1, WR SEI ; 731 bsf INTCON, GIE ; 733 bcf STATUS, RP0 CBI PORTD, 4 ; 734 bcf GPIO, 4 ; -------- get caught up -------- _die_trap: RJMP _die_trap ; 737 goto die_trap ;-------------------------------------------------------- _supercic_pairmode: ; 740 bsf STATUS, RP0 SBI DDRD, 0 ; 741 bsf TRISIO, 0 SBI DDRD, 1 ; 742 bsf TRISIO, 1 ; 743 bcf STATUS, RP0 _supercic_pairmode_loop: SBI PORTD, 4 ; 745 bsf GPIO, 4 NOP ; 746 nop NOP ; 747 nop CBI PORTD, 4 ; 748 bcf GPIO, 4 RJMP _supercic_pairmode_loop; 749 goto supercic_pairmode_loop .org 0x04FC .endif