📄 main.lst
字号:
398 ;
399
400 (*address)++; // Select next EEPROM byte
\ 00000086 01F2 MOVW R31:R30, R5:R4
\ 00000088 8100 LD R16, Z
\ 0000008A 8111 LDD R17, Z+1
\ 0000008C 8122 LDD R18, Z+2
\ 0000008E 8133 LDD R19, Z+3
\ 00000090 5F0F SUBI R16, 255
\ 00000092 4F1F SBCI R17, 255
\ 00000094 4F2F SBCI R18, 255
\ 00000096 4F3F SBCI R19, 255
\ 00000098 8300 ST Z, R16
\ 0000009A 8311 STD Z+1, R17
\ 0000009C 8322 STD Z+2, R18
\ 0000009E 8333 STD Z+3, R19
401 }
\ 000000A0 5F8F SUBI R24, 255
\ 000000A2 4F9F SBCI R25, 255
\ 000000A4 4FAF SBCI R26, 255
\ 000000A6 4FBF SBCI R27, 255
\ 000000A8 CFD5 RJMP ??BlockLoad_3
402
403 return '\r'; // Report programming OK
\ ??BlockLoad_4:
\ 000000AA E00D LDI R16, 13
\ 000000AC C06A RJMP ??BlockLoad_6
404 }
405
406 // Flash memory type.
407 else if(mem=='F')
\ ??BlockLoad_0:
\ 000000AE E406 LDI R16, 70
\ 000000B0 16A0 CP R10, R16
\ 000000B2 F009 BREQ $+2+2
\ 000000B4 C065 RJMP ??BlockLoad_7
408 { // NOTE: For flash programming, 'address' is given in words.
409 (*address) <<= 1; // Convert address to bytes temporarily.
\ 000000B6 01F2 MOVW R31:R30, R5:R4
\ 000000B8 8100 LD R16, Z
\ 000000BA 8111 LDD R17, Z+1
\ 000000BC 8122 LDD R18, Z+2
\ 000000BE 8133 LDD R19, Z+3
\ 000000C0 0F00 LSL R16
\ 000000C2 1F11 ROL R17
\ 000000C4 1F22 ROL R18
\ 000000C6 1F33 ROL R19
\ 000000C8 01F2 MOVW R31:R30, R5:R4
\ 000000CA 8300 ST Z, R16
\ 000000CC 8311 STD Z+1, R17
\ 000000CE 8322 STD Z+2, R18
\ 000000D0 8333 STD Z+3, R19
410 tempaddress = (*address); // Store address in page.
\ 000000D2 01F2 MOVW R31:R30, R5:R4
\ 000000D4 8100 LD R16, Z
\ 000000D6 8111 LDD R17, Z+1
\ 000000D8 8122 LDD R18, Z+2
\ 000000DA 8133 LDD R19, Z+3
\ 000000DC 01C8 MOVW R25:R24, R17:R16
\ 000000DE 01D9 MOVW R27:R26, R19:R18
411
412 do
413 {
414 data = recchar();
\ ??BlockLoad_8:
\ 000000E0 ........ CALL recchar
\ 000000E4 E010 LDI R17, 0
\ 000000E6 0138 MOVW R7:R6, R17:R16
415 data |= (recchar() << 8);
\ 000000E8 ........ CALL recchar
\ 000000EC 2F30 MOV R19, R16
\ 000000EE E020 LDI R18, 0
\ 000000F0 2A62 OR R6, R18
\ 000000F2 2A73 OR R7, R19
416 #pragma diag_suppress=Pe1053 // Suppress warning for conversion from long-type address to flash ptr.
417 _FILL_TEMP_WORD(*address,data);
\ 000000F4 E041 LDI R20, 1
\ 000000F6 01F2 MOVW R31:R30, R5:R4
\ 000000F8 8100 LD R16, Z
\ 000000FA 8111 LDD R17, Z+1
\ 000000FC 8122 LDD R18, Z+2
\ 000000FE 01F8 MOVW R31:R30, R17:R16
\ 00000100 2F32 MOV R19, R18
\ 00000102 BF3B OUT 0x3B, R19
\ 00000104 0103 MOVW R1:R0, R7:R6
\ 00000106 BF47 OUT 0x37, R20
\ 00000108 95E8 SPM
418 #pragma diag_default=Pe1053 // Back to default.
419 (*address)+=2; // Select next word in memory.
\ 0000010A 01F2 MOVW R31:R30, R5:R4
\ 0000010C 8100 LD R16, Z
\ 0000010E 8111 LDD R17, Z+1
\ 00000110 8122 LDD R18, Z+2
\ 00000112 8133 LDD R19, Z+3
\ 00000114 5F0E SUBI R16, 254
\ 00000116 4F1F SBCI R17, 255
\ 00000118 4F2F SBCI R18, 255
\ 0000011A 4F3F SBCI R19, 255
\ 0000011C 8300 ST Z, R16
\ 0000011E 8311 STD Z+1, R17
\ 00000120 8322 STD Z+2, R18
\ 00000122 8333 STD Z+3, R19
420 size -= 2; // Reduce number of bytes to write by two.
\ 00000124 EF0E LDI R16, 254
\ 00000126 0E80 ADD R8, R16
\ 00000128 EF0F LDI R16, 255
\ 0000012A 1E90 ADC R9, R16
421 } while(size); // Loop until all bytes written.
\ 0000012C 2D08 MOV R16, R8
\ 0000012E 2909 OR R16, R9
\ 00000130 F6B9 BRNE ??BlockLoad_8
422
423 if( tempaddress < (APP_END) ) { // Protect bootloader area.
\ 00000132 3080 CPI R24, 0
\ 00000134 EF00 LDI R16, 240
\ 00000136 0790 CPC R25, R16
\ 00000138 E003 LDI R16, 3
\ 0000013A 07A0 CPC R26, R16
\ 0000013C E000 LDI R16, 0
\ 0000013E 07B0 CPC R27, R16
\ 00000140 F454 BRGE ??BlockLoad_9
424 #pragma diag_suppress=Pe1053 // Suppress warning for conversion from long-type address to flash ptr.
425 _PAGE_WRITE(tempaddress);
\ 00000142 E005 LDI R16, 5
\ 00000144 01FC MOVW R31:R30, R25:R24
\ 00000146 2F3A MOV R19, R26
\ 00000148 BF3B OUT 0x3B, R19
\ 0000014A BF07 OUT 0x37, R16
\ 0000014C 95E8 SPM
426 #pragma diag_default=Pe1053 // Back to default.
427 _WAIT_FOR_SPM();
\ ??BlockLoad_10:
\ 0000014E B707 IN R16, 0x37
\ 00000150 2F10 MOV R17, R16
\ 00000152 FD10 SBRC R17, 0
\ 00000154 CFFC RJMP ??BlockLoad_10
428 }
429 _ENABLE_RWW_SECTION();
\ ??BlockLoad_9:
\ 00000156 E111 LDI R17, 17
\ 00000158 E000 LDI R16, 0
\ 0000015A 2E00 MOV R0, R16
\ 0000015C BF17 OUT 0x37, R17
\ 0000015E 95E8 SPM
430
431 (*address) >>= 1; // Convert address back to Flash words again.
\ 00000160 01F2 MOVW R31:R30, R5:R4
\ 00000162 8100 LD R16, Z
\ 00000164 8111 LDD R17, Z+1
\ 00000166 8122 LDD R18, Z+2
\ 00000168 8133 LDD R19, Z+3
\ 0000016A 9535 ASR R19
\ 0000016C 9527 ROR R18
\ 0000016E 9517 ROR R17
\ 00000170 9507 ROR R16
\ 00000172 01F2 MOVW R31:R30, R5:R4
\ 00000174 8300 ST Z, R16
\ 00000176 8311 STD Z+1, R17
\ 00000178 8322 STD Z+2, R18
\ 0000017A 8333 STD Z+3, R19
432 return '\r'; // Report programming OK
\ 0000017C E00D LDI R16, 13
\ 0000017E C001 RJMP ??BlockLoad_6
433 }
434
435 // Invalid memory type?
436 else
437 {
438 return '?';
\ ??BlockLoad_7:
\ 00000180 E30F LDI R16, 63
\ ??BlockLoad_6:
\ 00000182 5FDF SUBI R29, 255
\ 00000184 E0EB LDI R30, 11
\ 00000186 ........ JMP ?EPILOGUE_B11_L09
439 }
440 }
441
442
443
444 /*! \brief Read block of mem and send to serial port.
445 *
446 * Read 'size' bytes from EEPROM/Flash memory 'address' and
447 * send to serial port. If 'mem' == 'E', then 'address' gives
448 * the byte address in EEPROM. If 'mem' == 'F', then 'address'
449 * gives the word address in Flash.
450 */
\ In segment FARCODE, align 2, keep-with-next
451 void BlockRead(unsigned int size, unsigned char mem, long *address)
\ BlockRead:
452 {
\ 00000000 ........ CALL ?PROLOGUE5_L09
\ 00000004 REQUIRE ?Register_R4_is_cg_reg
\ 00000004 01C8 MOVW R25:R24, R17:R16
\ 00000006 2E42 MOV R4, R18
\ 00000008 01DA MOVW R27:R26, R21:R20
453 // EEPROM memory type.
454 if (mem=='E') // Read EEPROM
\ 0000000A E405 LDI R16, 69
\ 0000000C 1640 CP R4, R16
\ 0000000E F509 BRNE ??BlockRead_0
455 {
456 do
457 {
458 EEARL = *address; // Setup EEPROM address
\ ??BlockRead_1:
\ 00000010 910D LD R16, X+
\ 00000012 911D LD R17, X+
\ 00000014 912D LD R18, X+
\ 00000016 9713 SBIW R27:R26, 3
\ 00000018 BD01 OUT 0x21, R16
459 EEARH = ((*address) >> 8);
\ 0000001A 910D LD R16, X+
\ 0000001C 911D LD R17, X+
\ 0000001E 912D LD R18, X+
\ 00000020 9713 SBIW R27:R26, 3
\ 00000022 2F01 MOV R16, R17
\ 00000024 BD02 OUT 0x22, R16
460 (*address)++; // Select next EEPROM byte
\ 00000026 01FD MOVW R31:R30, R27:R26
\ 00000028 8100 LD R16, Z
\ 0000002A 8111 LDD R17, Z+1
\ 0000002C 8122 LDD R18, Z+2
\ 0000002E 8133 LDD R19, Z+3
\ 00000030 5F0F SUBI R16, 255
\ 00000032 4F1F SBCI R17, 255
\ 00000034 4F2F SBCI R18, 255
\ 00000036 4F3F SBCI R19, 255
\ 00000038 8300 ST Z, R16
\ 0000003A 8311 STD Z+1, R17
\ 0000003C 8322 STD Z+2, R18
\ 0000003E 8333 STD Z+3, R19
461 EECR |= (1<<EERE); // Read EEPROM
\ 00000040 9AF8 SBI 0x1F, 0x00
462 sendchar(EEDR); // Transmit EEPROM dat ato PC
\ 00000042 B500 IN R16, 0x20
\ 00000044 ........ CALL sendchar
463
464 size--; // Decrease number of bytes to read
\ 00000048 9701 SBIW R25:R24, 1
465 } while (size); // Repeat until all block has been read
\ 0000004A 2F08 MOV R16, R24
\ 0000004C 2B09 OR R16, R25
\ 0000004E F701 BRNE ??BlockRead_1
\ 00000050 C04C RJMP ??BlockRead_2
466 }
467
468 // Flash memory type.
469 else if(mem=='F')
\ ??BlockRead_0:
\ 00000052 E406 LDI R16, 70
\ 00000054 1640 CP R4, R16
\ 00000056 F009 BREQ $+2+2
\ 00000058 C048 RJMP ??BlockRead_2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -