; 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

