📄 main.lst
字号:
\ 000002B6 E0E2 LDI R30, 2
\ 000002B8 CFE0 RJMP ??main_32
\ ??main_37:
\ 000002BA 3503 CPI R16, 83
\ 000002BC F4A1 BRNE ??main_39
\ 000002BE E401 LDI R16, 65
\ 000002C0 ........ CALL sendchar
\ 000002C4 E506 LDI R16, 86
\ 000002C6 ........ CALL sendchar
\ 000002CA E502 LDI R16, 82
\ 000002CC ........ CALL sendchar
\ 000002D0 E402 LDI R16, 66
\ 000002D2 ........ CALL sendchar
\ 000002D6 E40F LDI R16, 79
\ 000002D8 ........ CALL sendchar
\ 000002DC E40F LDI R16, 79
\ 000002DE ........ CALL sendchar
\ 000002E2 E504 LDI R16, 84
\ 000002E4 CEA2 RJMP ??main_3
\ ??main_39:
\ 000002E6 3506 CPI R16, 86
\ 000002E8 F429 BRNE ??main_40
\ 000002EA E301 LDI R16, 49
\ 000002EC ........ CALL sendchar
\ 000002F0 E305 LDI R16, 53
\ 000002F2 CE9B RJMP ??main_3
\ ??main_40:
\ 000002F4 3703 CPI R16, 115
\ 000002F6 F441 BRNE ??main_41
\ 000002F8 E001 LDI R16, 1
\ 000002FA ........ CALL sendchar
\ 000002FE E908 LDI R16, 152
\ 00000300 ........ CALL sendchar
\ 00000304 E10E LDI R16, 30
\ 00000306 CE91 RJMP ??main_3
\ ??main_41:
\ 00000308 310B CPI R16, 27
\ 0000030A F409 BRNE $+2+2
\ 0000030C CE90 RJMP ??main_0
\ 0000030E E30F LDI R16, 63
\ 00000310 CE8C RJMP ??main_3
364
365
366 #ifndef REMOVE_BLOCK_SUPPORT
367 /*! \brief Write block from serial port and program mem.
368 *
369 * Read 'size' bytes from serial port and write to EPROM/Flash
370 * memory 'address'.
371 * If 'mem' == 'E', then 'address' gives
372 * the byte address in EEPROM. If 'mem' == 'F', then 'address'
373 * gives the word address in Flash.
374 */
\ In segment FARCODE, align 2, keep-with-next
375 unsigned char BlockLoad(unsigned int size, unsigned char mem, long *address)
\ BlockLoad:
376 {
\ 00000000 ........ CALL ?PROLOGUE10_L09
\ 00000004 REQUIRE ?Register_R4_is_cg_reg
\ 00000004 REQUIRE ?Register_R5_is_cg_reg
\ 00000004 REQUIRE ?Register_R6_is_cg_reg
\ 00000004 REQUIRE ?Register_R7_is_cg_reg
\ 00000004 REQUIRE ?Register_R8_is_cg_reg
\ 00000004 REQUIRE ?Register_R9_is_cg_reg
\ 00000004 50D1 SUBI R29, 1
\ 00000006 0138 MOVW R7:R6, R17:R16
\ 00000008 012A MOVW R5:R4, R21:R20
377 unsigned char buffer[BLOCKSIZE];
378 unsigned int data;
379 long tempaddress;
380
381 // EEPROM memory type.
382 if(mem=='E')
\ 0000000A 3425 CPI R18, 69
\ 0000000C F009 BREQ $+2+2
\ 0000000E C046 RJMP ??BlockLoad_0
383 {
384 /* Fill buffer first, as EEPROM is too slow to copy with UART speed */
385 for(tempaddress=0;tempaddress<size;tempaddress++)
\ 00000010 E080 LDI R24, 0
\ 00000012 E090 LDI R25, 0
\ 00000014 E0A0 LDI R26, 0
\ 00000016 E0B0 LDI R27, 0
\ 00000018 C00B RJMP ??BlockLoad_1
386 buffer[tempaddress] = recchar();
\ ??BlockLoad_2:
\ 0000001A ........ CALL recchar
\ 0000001E 01FE MOVW R31:R30, R29:R28
\ 00000020 019C MOVW R19:R18, R25:R24
\ 00000022 0FE2 ADD R30, R18
\ 00000024 1FF3 ADC R31, R19
\ 00000026 8300 ST Z, R16
\ 00000028 5F8F SUBI R24, 255
\ 0000002A 4F9F SBCI R25, 255
\ 0000002C 4FAF SBCI R26, 255
\ 0000002E 4FBF SBCI R27, 255
\ ??BlockLoad_1:
\ 00000030 E060 LDI R22, 0
\ 00000032 1586 CP R24, R6
\ 00000034 0597 CPC R25, R7
\ 00000036 07A6 CPC R26, R22
\ 00000038 07B6 CPC R27, R22
\ 0000003A F37C BRLT ??BlockLoad_2
387
388 /* Then program the EEPROM */
389 _WAIT_FOR_SPM();
\ ??BlockLoad_3:
\ 0000003C B707 IN R16, 0x37
\ 0000003E 2F10 MOV R17, R16
\ 00000040 FD10 SBRC R17, 0
\ 00000042 CFFC RJMP ??BlockLoad_3
390 for( tempaddress=0; tempaddress < size; tempaddress++)
\ 00000044 E080 LDI R24, 0
\ 00000046 E090 LDI R25, 0
\ 00000048 E0A0 LDI R26, 0
\ 0000004A E0B0 LDI R27, 0
\ 0000004C C020 RJMP ??BlockLoad_4
391 {
392 EEARL = *address; // Setup EEPROM address
\ ??BlockLoad_5:
\ 0000004E 01F2 MOVW R31:R30, R5:R4
\ 00000050 8100 LD R16, Z
\ 00000052 BD01 OUT 0x21, R16
393 EEARH = ((*address) >> 8);
\ 00000054 8111 LDD R17, Z+1
\ 00000056 BD12 OUT 0x22, R17
394 EEDR = buffer[tempaddress]; // Get byte.
\ 00000058 01FE MOVW R31:R30, R29:R28
\ 0000005A 018C MOVW R17:R16, R25:R24
\ 0000005C 0FE0 ADD R30, R16
\ 0000005E 1FF1 ADC R31, R17
\ 00000060 8100 LD R16, Z
\ 00000062 BD00 OUT 0x20, R16
395 EECR |= (1<<EEMWE); // Write byte.
\ 00000064 9AFA SBI 0x1F, 0x02
396 EECR |= (1<<EEWE);
\ 00000066 9AF9 SBI 0x1F, 0x01
397 while (EECR & (1<<EEWE)) // Wait for write operation to finish.
\ ??BlockLoad_6:
\ 00000068 99F9 SBIC 0x1F, 0x01
\ 0000006A CFFE RJMP ??BlockLoad_6
398 ;
399
400 (*address)++; // Select next EEPROM byte
\ 0000006C 01F2 MOVW R31:R30, R5:R4
\ 0000006E 8100 LD R16, Z
\ 00000070 8111 LDD R17, Z+1
\ 00000072 8122 LDD R18, Z+2
\ 00000074 8133 LDD R19, Z+3
\ 00000076 5F0F SUBI R16, 255
\ 00000078 4F1F SBCI R17, 255
\ 0000007A 4F2F SBCI R18, 255
\ 0000007C 4F3F SBCI R19, 255
\ 0000007E 8300 ST Z, R16
\ 00000080 8311 STD Z+1, R17
\ 00000082 8322 STD Z+2, R18
\ 00000084 8333 STD Z+3, R19
401 }
\ 00000086 5F8F SUBI R24, 255
\ 00000088 4F9F SBCI R25, 255
\ 0000008A 4FAF SBCI R26, 255
\ 0000008C 4FBF SBCI R27, 255
\ ??BlockLoad_4:
\ 0000008E 1586 CP R24, R6
\ 00000090 0597 CPC R25, R7
\ 00000092 07A6 CPC R26, R22
\ 00000094 07B6 CPC R27, R22
\ 00000096 F2DC BRLT ??BlockLoad_5
402
403 return '\r'; // Report programming OK
\ ??BlockLoad_7:
\ 00000098 E00D LDI R16, 13
\ 0000009A C05D RJMP ??BlockLoad_8
404 }
405
406 // Flash memory type.
407 else if(mem=='F')
\ ??BlockLoad_0:
\ 0000009C 3426 CPI R18, 70
\ 0000009E F009 BREQ $+2+2
\ 000000A0 C059 RJMP ??BlockLoad_9
408 { // NOTE: For flash programming, 'address' is given in words.
409 (*address) <<= 1; // Convert address to bytes temporarily.
\ 000000A2 01F2 MOVW R31:R30, R5:R4
\ 000000A4 8100 LD R16, Z
\ 000000A6 8111 LDD R17, Z+1
\ 000000A8 8122 LDD R18, Z+2
\ 000000AA 8133 LDD R19, Z+3
\ 000000AC 0F00 LSL R16
\ 000000AE 1F11 ROL R17
\ 000000B0 1F22 ROL R18
\ 000000B2 1F33 ROL R19
\ 000000B4 8300 ST Z, R16
\ 000000B6 8311 STD Z+1, R17
\ 000000B8 8322 STD Z+2, R18
\ 000000BA 8333 STD Z+3, R19
410 tempaddress = (*address); // Store address in page.
\ 000000BC 8180 LD R24, Z
\ 000000BE 8191 LDD R25, Z+1
\ 000000C0 81A2 LDD R26, Z+2
\ 000000C2 81B3 LDD R27, Z+3
411
412 do
413 {
414 data = recchar();
\ ??BlockLoad_10:
\ 000000C4 ........ CALL recchar
\ 000000C8 2E80 MOV R8, R16
\ 000000CA 2499 CLR R9
415 data |= (recchar() << 8);
\ 000000CC ........ CALL recchar
\ 000000D0 2A90 OR R9, R16
416 #pragma diag_suppress=Pe1053 // Suppress warning for conversion from long-type address to flash ptr.
417 _FILL_TEMP_WORD(*address,data);
\ 000000D2 E001 LDI R16, 1
\ 000000D4 01F2 MOVW R31:R30, R5:R4
\ 000000D6 8140 LD R20, Z
\ 000000D8 8151 LDD R21, Z+1
\ 000000DA 8162 LDD R22, Z+2
\ 000000DC 01FA MOVW R31:R30, R21:R20
\ 000000DE BF6B OUT 0x3B, R22
\ 000000E0 0104 MOVW R1:R0, R9:R8
\ 000000E2 BF07 OUT 0x37, R16
\ 000000E4 95E8 SPM
418 #pragma diag_default=Pe1053 // Back to default.
419 (*address)+=2; // Select next word in memory.
\ 000000E6 01F2 MOVW R31:R30, R5:R4
\ 000000E8 8100 LD R16, Z
\ 000000EA 8111 LDD R17, Z+1
\ 000000EC 8122 LDD R18, Z+2
\ 000000EE 8133 LDD R19, Z+3
\ 000000F0 5F0E SUBI R16, 254
\ 000000F2 4F1F SBCI R17, 255
\ 000000F4 4F2F SBCI R18, 255
\ 000000F6 4F3F SBCI R19, 255
\ 000000F8 8300 ST Z, R16
\ 000000FA 8311 STD Z+1, R17
\ 000000FC 8322 STD Z+2, R18
\ 000000FE 8333 STD Z+3, R19
420 size -= 2; // Reduce number of bytes to write by two.
\ 00000100 EF0E LDI R16, 254
\ 00000102 0E60 ADD R6, R16
\ 00000104 EF0F LDI R16, 255
\ 00000106 1E70 ADC R7, R16
421 } while(size); // Loop until all bytes written.
\ 00000108 2D06 MOV R16, R6
\ 0000010A 2907 OR R16, R7
\ 0000010C F6D9 BRNE ??BlockLoad_10
422
423 if( tempaddress < (APP_END) ) { // Protect bootloader area.
\ 0000010E 3080 CPI R24, 0
\ 00000110 EF00 LDI R16, 240
\ 00000112 0790 CPC R25, R16
\ 00000114 E003 LDI R16, 3
\ 00000116 07A0 CPC R26, R16
\ 00000118 E000 LDI R16, 0
\ 0000011A 07B0 CPC R27, R16
\ 0000011C F44C BRGE ??BlockLoad_11
424 #pragma diag_suppress=Pe1053 // Suppress warning for conversion from long-type address to flash ptr.
425 _PAGE_WRITE(tempaddress);
\ 0000011E E005 LDI R16, 5
\ 00000120 01FC MOVW R31:R30, R25:R24
\ 00000122 BFAB OUT 0x3B, R26
\ 00000124 BF07 OUT 0x37, R16
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -