; Atmel AVR Disassembler v2.03Beta ; ;***** Specify Device .device ATmega128 ;***** I/O Register Definitions .equ SREG =$3F .equ SPH =$3E .equ SPL =$3D .equ EEARH =$1F .equ EEARL =$1E .equ EEDR =$1D .equ EECR =$1C .equ PORTA =$1B .equ DDRA =$1A .equ PINA =$19 .equ PORTB =$18 .equ DDRB =$17 .equ PINB =$16 .equ PORTC =$15 .equ DDRC =$14 .equ PINC =$13 .equ PORTD =$12 .equ DDRD =$11 .equ PIND =$10 .def XL =r26 .def XH =r27 .def YL =r28 .def YH =r29 .def ZL =r30 .def ZH =r31 ;***** Let's do it ;------------------------------------------------------------------------- .dseg .org 0xE00 data0100: .byte 256 ; buffer for download .org 0x1000 STACK: .byte 256 .cseg .org 0x0000 avr0000: .org 0xF000 ;------------------------------------------------------------------------- avrF000: rjmp avrF017 ; 0000 C016 Jump to the start .db 0x00, 0x01, 0x02, 0x03 .db 0x04, 0x05, 0x06, 0x07 .db 0x00, 0x10, 0x20, 0x30 .db 0x40, 0x50, 0x60, 0x70 /* ; 0001 0100 ; 0002 0302 ; 0003 0504 ; 0004 0706 ; 0005 1000 ; 0006 3020 ; 0007 5040 ; 0008 7060 */ .db "Boot Ver 2.3 ", 0x00 .db "by KJS JSB ", 0x00 /* ; 0009 6F42 ; 000A 746F ; 000B 5620 ; 000C 7265 ; 000D 3220 ; 000E 332E ; 000F 0020 ; 0010 7962 ; 0011 4B20 ; 0012 534A ; 0013 4A20 ; 0014 4253 ; 0015 2020 ; 0016 0020 */ avrF017: cli ; 0017 94F8 Interrupts off sbi PORTD, 2 ; 0018 9A92 cbi DDRD, 2 ; 0019 988A sbi PORTD, 3 ; 001A 9A93 sbi DDRD, 3 ; 001B 9A8B sbi $03, 0 ; 001C 9A18 cbi $02, 0 ; 001D 9810 sbi $03, 1 ; 001E 9A19 sbi $02, 1 ; 001F 9A11 ldi r16, 0x10 ; 0020 E100 Stack is at 0x10FF out SPH, r16 ; 0021 BF0E ser r16 ; 0022 EF0F out SPL, r16 ; 0023 BF0D call subF067 ; 0024 940E F067 make delay rcall subF0DC ; 0026 D0B5 set up and open comm port ldi r16, 0x3E ; 0027 E30E send 0x3E rcall subF10B ; 0028 D0E2 send char call subF0FB ; 0029 940E F0FB wait for response brsh avrF064 ; 002B F5C0 no response get out cpi r16, 0x3C ; 002C 330C is it 0x3C ? brne avrF064 ; 002D F5B1 no get out call subF0FB ; 002E 940E F0FB wait for reponse brsh avrF064 ; 0030 F598 no response get out cpi r16, 0xF0 ; 0031 3F00 is it 0xf0 ? brne avrF064 ; 0032 F589 no get out call subF0FB ; 0033 940E F0FB wait for response brsh avrF064 ; 0035 F570 no response get out cpi r16, 0xA5 ; 0036 3A05 is it 0xA5 ? brne avrF064 ; 0037 F561 no get out call subF0FB ; 0038 940E F0FB wait for response brsh avrF064 ; 003A F548 no get out cpi r16, 0x5A ; 003B 350A is it 0x5A ? brne avrF064 ; 003C F539 no get out call subF0FB ; 003D 940E F0FB wait for response brsh avrF064 ; 003F F520 no tesponse get out cpi r16, 0x0F ; 0040 300F is it 0x0F ? brne avrF064 ; 0041 F511 no get out call subF0FB ; 0042 940E F0FB wait for response brsh avrF064 ; 0044 F4F8 no response get out cpi r16, 0x80 ; 0045 3800 is it 0x80 ? brne avrF064 ; 0046 F4E9 no get out call subF0FB ; 0047 940E F0FB wait for response brsh avrF064 ; 0049 F4D0 no response get out cpi r16, 0x53 ; 004A 3503 is it 0x53 ? brne avrF064 ; 004B F4C1 no get out call subF067 ; 004C 940E F067 delay ldi r16, 0x5A ; 004E E50A send 0x5a call subF10B ; 004F 940E F10B do output call subF067 ; 0051 940E F067 delay ldi r16, 0x70 ; 0053 E700 send 0x70 call subF10B ; 0054 940E F10B do output call subF067 ; 0056 940E F067 delay ldi r16, 0x66 ; 0058 E606 send 0x66 call subF10B ; 0059 940E F10B do output call subF067 ; 005B 940E F067 delay ldi r16, 0x54 ; 005D E504 send 0x54 call subF10B ; 005E 940E F10B do output call subF067 ; 0060 940E F067 delay call subF06B ; 0062 940E F06B do the download avrF064: rcall subF0E8 ; 0064 D083 close the comm port jmp avr0000 ; 0065 940C 0000 Go to start of Application subF067: ldi r16, 0x00 ; 0067 E000 delay avr0068: dec r16 ; 0068 950A brne avr0068 ; 0069 F7F1 ret ; 006A 9508 ;------------------------------------------------------------------------- subF06B: ldi r16, 0x21 ; 006B E201 send 0x21 avrF06C: call subF10B ; 006C 940E F10B do output call subF080 ; 006E 940E F080 get the block number ser r16 ; 0070 EF0F R16 = 0xFF ldi r18, 0x00 ; 0071 E020 R18 = 0x00 cp r18, ZL ; 0072 172E if Block = 0xFF00 cpc r16, ZH ; 0073 070F breq avrF07F ; 0074 F051 then return call subF08C ; 0075 940E F08C get download brsh avrF07D ; 0077 F428 call subF0A2 ; 0078 940E F0A2 save download brsh avrF07F ; 007A F420 ldi r16, 0x21 ; 007B E201 send 0x21 rjmp avrF06C ; 007C CFEF next block avrF07D: ldi r16, 0x40 ; 007D E400 send 0x40 rjmp avrF06C ; 007E CFED next block avrF07F: ret ; 007F 9508 ;------------------------------------------------------------------------- subF080: clr r23 ; 0080 2777 clear checksum call subF0F4 ; 0081 940E F0F4 get char to r16 mov ZH, r16 ; 0083 2FF0 save in ZH add r23, r16 ; 0084 0F70 add into checksum mov r20, r16 ; 0085 2F40 save in r20 call subF0F4 ; 0086 940E F0F4 get char to r16 mov ZL, r16 ; 0088 2FE0 save in ZL add r23, r16 ; 0089 0F70 add to checksum mov r21, r16 ; 008A 2F50 save in r21 ret ; 008B 9508 return ;------------------------------------------------------------------------- subF08C: ldi YH, 0x0E ; 008C E0DE Y = 0X0E00 temp buffer ldi YL, 0x00 ; 008D E0C0 ldi r19, 0x80 ; 008E E830 r19 =0x80 avrF08F: call subF0F4 ; 008F 940E F0F4 get char eor r16, r20 ; 0091 2704 XOR with block high add r23, r16 ; 0092 0F70 add into checksum st Y+, r16 ; 0093 9309 and save call subF0F4 ; 0094 940E F0F4 get char eor r16, r21 ; 0096 2705 Xor with Block low add r23, r16 ; 0097 0F70 add into checksum st Y+, r16 ; 0098 9309 and save dec r19 ; 0099 953A dec counter brne avrF08F ; 009A F7A1 rcall subF0F4 ; 009B D058 get char cp r23, r16 ; 009C 1770 is checksum OK ? brne avrF0A0 ; 009D F411 sec ; 009E 9408 good check ret ; 009F 9508 ;------------------------------------------------------------------------- avrF0A0: clc ; 00A0 9488 bad check ret ; 00A1 9508 ;------------------------------------------------------------------------- subF0A2: cpi ZH, 0xFD ; 00A2 3FFD if ZH > 254 brlo avrF0A7 ; 00A3 F018 ldi r16, 0x01 ; 00A4 E001 RAMPZ = 1 jmp avrF0A8 ; 00A5 940C F0A8 avrF0A7: ldi r16, 0x00 ; 00A7 E000 else RAMPZ = 0 avrF0A8: out $3B, r16 ; 00A8 BF0B nop ; 00A9 0000 ldi YH, 0x0E ; 00AA E0DE Y = received buffer ldi YL, 0x00 ; 00AB E0C0 ldi r22, 0x03 ; 00AC E063 Page erase rcall subF0D4 ; 00AD D026 ldi r22, 0x11 ; 00AE E161 rcall subF0D4 ; 00AF D024 ldi r24, 0x00 ; 00B0 E080 count = 0 ldi r25, 0x01 ; 00B1 E091 avrF0B2: ld r0, Y+ ; 00B2 9009 ld r1, Y+ ; 00B3 9019 ldi r22, 0x01 ; 00B4 E061 Fill Buffer rcall subF0D4 ; 00B5 D01E adiw ZL, 0x02 ; 00B6 9632 sbiw r24, 0x02 ; 00B7 9702 decrement count brne avrF0B2 ; 00B8 F7C9 subi ZL, 0x00 ; 00B9 50E0 sbci ZH, 0x01 ; 00BA 40F1 ldi r22, 0x05 ; 00BB E065 Page Write rcall subF0D4 ; 00BC D017 ldi r22, 0x11 ; 00BD E161 call subF0D4 ; 00BE 940E F0D4 ldi r24, 0x00 ; 00C0 E080 count = 0 ldi r25, 0x01 ; 00C1 E091 subi YL, 0x00 ; 00C2 50C0 buffer back to beginning sbci YH, 0x01 ; 00C3 40D1 avrF0C4: lpm r0, Z+ ; 00C4 9005 ld r1, Y+ ; 00C5 9019 cpse r0, r1 ; 00C6 1001 verify rjmp avrF0D2 ; 00C7 C00A sbiw r24, 0x01 ; 00C8 9701 brne avrF0C4 ; 00C9 F7D1 lds r16, 0x0068 ; 00CA 9100 0068 sbrs r16, 6 ; 00CC FF06 rjmp avrF0D0 ; 00CD C002 ldi r22, 0x11 ; 00CE E161 rcall subF0D4 ; 00CF D004 avrF0D0: sec ; 00D0 9408 ret ; 00D1 9508 ;------------------------------------------------------------------------- avrF0D2: clc ; 00D2 9488 ret ; 00D3 9508 ;------------------------------------------------------------------------- subF0D4: sts 0x0068, r22 ; 00D4 9360 0068 perform flash command spm ; 00D6 95E8 avrF0D7: lds r16, 0x0068 ; 00D7 9100 0068 sbrc r16, 0 ; 00D9 FD00 rjmp avrF0D7 ; 00DA CFFC ret ; 00DB 9508 ;------------------------------------------------------------------------- subF0DC: ldi r16, 0x18 ; 00DC E108 set up and open comm port sts 0x009A, r16 ; 00DD 9300 009A ldi r16, 0x00 ; 00DF E000 sts 0x0098, r16 ; 00E0 9300 0098 ldi r16, 0x2F ; 00E2 E20F sts 0x0099, r16 ; 00E3 9300 0099 lds r16, 0x009C ; 00E5 9100 009C ret ; 00E7 9508 ;------------------------------------------------------------------------- subF0E8: ldi r16, 0x00 ; 00E8 E000 close the comm port sts 0x009A, r16 ; 00E9 9300 009A ldi r16, 0x00 ; 00EB E000 sts 0x0098, r16 ; 00EC 9300 0098 ldi r16, 0x00 ; 00EE E000 sts 0x0099, r16 ; 00EF 9300 0099 lds r16, 0x009C ; 00F1 9100 009C ret ; 00F3 9508 ;------------------------------------------------------------------------- subF0F4: lds r18, 0x009B ; 00F4 9120 009B wait for Rx Rdy sbrs r18, 7 ; 00F6 FF27 rjmp subF0F4 ; 00F7 CFFC lds r16, 0x009C ; 00F8 9100 009C get the char ret ; 00FA 9508 ;------------------------------------------------------------------------- subF0FB: ldi r19, 0xC8 ; 00FB EC38 avrF0FC: ldi r20, 0x00 ; 00FC E040 avrF0FD: lds r18, 0x009B ; 00FD 9120 009B get Rx Rdy sbrc r18, 7 ; 00FF FD27 rjmp subF107 ; 0100 C006 dec r20 ; 0101 954A brne avrF0FD ; 0102 F7D1 dec r19 ; 0103 953A brne avrF0FC ; 0104 F7B9 clc ; 0105 9488 ret ; 0106 9508 ;------------------------------------------------------------------------- subF107: lds r16, 0x009C ; 0107 9100 009C get Rx char sec ; 0109 9408 ret ; 010A 9508 ;------------------------------------------------------------------------- subF10B: lds r18, 0x009B ; 010B 9120 009B send r16 when Tx done sbrs r18, 5 ; 010D FF25 rjmp subF10B ; 010E CFFC sts 0x009C, r16 ; 010F 9300 009C ret ; 0111 9508 ;------------------------------------------------------------------------- .exit