;CodeVisionAVR C Compiler V1.0.2.2d Standard
;(C) Copyright 1998-2002 Pavel Haiduc, HP InfoTech s.r.l.
;http://www.hpinfotech.ro
;e-mail:office@hpinfotech.ro , hpinfotech@xmail.ro

;Chip type           : ATtiny22
;Clock frequency     : 4,000000 MHz
;Memory model        : Tiny
;Optimize for        : Size
;Internal SRAM size  : 128
;External SRAM size  : 0
;Data Stack size     : 32
;Promote char to int : No
;char is unsigned    : Yes
;Automatic register allocation : On
;Use AVR Studio Terminal I/O   : No

	.DEVICE ATTINY22
	.LISTMAC
	.EQU UDRE=0x5
	.EQU RXC=0x7
	.EQU USR=0xB
	.EQU UDR=0xC
	.EQU EERE=0x0
	.EQU EEWE=0x1
	.EQU EEMWE=0x2
	.EQU SPSR=0xE
	.EQU SPDR=0xF
	.EQU EECR=0x1C
	.EQU EEDR=0x1D
	.EQU EEARL=0x1E
	.EQU EEARH=0x1F
	.EQU WDTCR=0x21
	.EQU MCUCR=0x35
	.EQU RAMPZ=0x3B
	.EQU SPL=0x3D
	.EQU SPH=0x3E
	.EQU SREG=0x3F
	.DEF R0X0=R0
	.DEF R0X1=R1
	.DEF R0X2=R2
	.DEF R0X3=R3
	.DEF R0X4=R4
	.DEF R0X5=R5
	.DEF R0X6=R6
	.DEF R0X7=R7
	.DEF R0X8=R8
	.DEF R0X9=R9
	.DEF R0XA=R10
	.DEF R0XB=R11
	.DEF R0XC=R12
	.DEF R0XD=R13
	.DEF R0XE=R14
	.DEF R0XF=R15
	.DEF R0X10=R16
	.DEF R0X11=R17
	.DEF R0X12=R18
	.DEF R0X13=R19
	.DEF R0X14=R20
	.DEF R0X15=R21
	.DEF R0X16=R22
	.DEF R0X17=R23
	.DEF R0X18=R24
	.DEF R0X19=R25
	.DEF R0X1A=R26
	.DEF R0X1B=R27
	.DEF R0X1C=R28
	.DEF R0X1D=R29
	.DEF R0X1E=R30
	.DEF R0X1F=R31
	.EQU __se_bit=0x20
	.EQU __sm_mask=0x10

	.MACRO __CPD1N
	CPI  R30,LOW(@0)
	LDI  R26,HIGH(@0)
	CPC  R31,R26
	LDI  R26,BYTE3(@0)
	CPC  R22,R26
	LDI  R26,BYTE4(@0)
	CPC  R23,R26
	.ENDM

	.MACRO __CPD2N
	CPI  R26,LOW(@0)
	LDI  R30,HIGH(@0)
	CPC  R27,R30
	LDI  R30,BYTE3(@0)
	CPC  R24,R30
	LDI  R30,BYTE4(@0)
	CPC  R25,R30
	.ENDM

	.MACRO __CPWRR
	CP   R@0,R@2
	CPC  R@1,R@3
	.ENDM

	.MACRO __CPWRN
	CPI  R@0,LOW(@2)
	LDI  R30,HIGH(@2)
	CPC  R@1,R30
	.ENDM

	.MACRO __ADDD1N
	SUBI R30,LOW(-@0)
	SBCI R31,HIGH(-@0)
	SBCI R22,BYTE3(-@0)
	SBCI R23,BYTE4(-@0)
	.ENDM

	.MACRO __ADDD2N
	SUBI R26,LOW(-@0)
	SBCI R27,HIGH(-@0)
	SBCI R24,BYTE3(-@0)
	SBCI R25,BYTE4(-@0)
	.ENDM

	.MACRO __SUBD1N
	SUBI R30,LOW(@0)
	SBCI R31,HIGH(@0)
	SBCI R22,BYTE3(@0)
	SBCI R23,BYTE4(@0)
	.ENDM

	.MACRO __SUBD2N
	SUBI R26,LOW(@0)
	SBCI R27,HIGH(@0)
	SBCI R24,BYTE3(@0)
	SBCI R25,BYTE4(@0)
	.ENDM

	.MACRO __ANDD1N
	ANDI R30,LOW(@0)
	ANDI R31,HIGH(@0)
	ANDI R22,BYTE3(@0)
	ANDI R23,BYTE4(@0)
	.ENDM

	.MACRO __ORD1N
	ORI  R30,LOW(@0)
	ORI  R31,HIGH(@0)
	ORI  R22,BYTE3(@0)
	ORI  R23,BYTE4(@0)
	.ENDM

	.MACRO __DELAY_USB
	LDI  R24,LOW(@0)
__DELAY_USB_LOOP:
	DEC  R24
	BRNE __DELAY_USB_LOOP
	.ENDM

	.MACRO __DELAY_USW
	LDI  R24,LOW(@0)
	LDI  R25,HIGH(@0)
__DELAY_USW_LOOP:
	SBIW R24,1
	BRNE __DELAY_USW_LOOP
	.ENDM

	.MACRO __CLRD1S
	CLR  R30
	STD  Y+@0,R30
	STD  Y+@0+1,R30
	STD  Y+@0+2,R30
	STD  Y+@0+3,R30
	.ENDM

	.MACRO __GETD1S
	LDD  R30,Y+@0
	LDD  R31,Y+@0+1
	LDD  R22,Y+@0+2
	LDD  R23,Y+@0+3
	.ENDM

	.MACRO __PUTD1S
	STD  Y+@0,R30
	STD  Y+@0+1,R31
	STD  Y+@0+2,R22
	STD  Y+@0+3,R23
	.ENDM

	.MACRO __POINTB1MN
	LDI  R30,LOW(@0+@1)
	.ENDM

	.MACRO __POINTW1MN
	LDI  R30,LOW(@0+@1)
	LDI  R31,HIGH(@0+@1)
	.ENDM

	.MACRO __POINTW1FN
	LDI  R30,LOW(2*@0+@1)
	LDI  R31,HIGH(2*@0+@1)
	.ENDM

	.MACRO __POINTB2MN
	LDI  R26,LOW(@0+@1)
	.ENDM

	.MACRO __POINTW2MN
	LDI  R26,LOW(@0+@1)
	LDI  R27,HIGH(@0+@1)
	.ENDM

	.MACRO __GETD1N
	LDI  R30,LOW(@0)
	LDI  R31,HIGH(@0)
	LDI  R22,BYTE3(@0)
	LDI  R23,BYTE4(@0)
	.ENDM

	.MACRO __GETD2N
	LDI  R26,LOW(@0)
	LDI  R27,HIGH(@0)
	LDI  R24,BYTE3(@0)
	LDI  R25,BYTE4(@0)
	.ENDM

	.MACRO __GETD2S
	LDD  R26,Y+@0
	LDD  R27,Y+@0+1
	LDD  R24,Y+@0+2
	LDD  R25,Y+@0+3
	.ENDM

	.MACRO __GETB1MN
	LDS  R30,@0+@1
	.ENDM

	.MACRO __GETW1MN
	LDS  R30,@0+@1
	LDS  R31,@0+@1+1
	.ENDM

	.MACRO __GETD1MN
	LDS  R30,@0+@1
	LDS  R31,@0+@1+1
	LDS  R22,@0+@1+2
	LDS  R23,@0+@1+3
	.ENDM

	.MACRO __GETBRMN
	LDS  R@2,@0+@1
	.ENDM

	.MACRO __GETWRMN
	LDS  R@2,@0+@1
	LDS  R@3,@0+@1+1
	.ENDM

	.MACRO __GETB2MN
	LDS  R26,@0+@1
	.ENDM

	.MACRO __GETW2MN
	LDS  R26,@0+@1
	LDS  R27,@0+@1+1
	.ENDM

	.MACRO __GETD2MN
	LDS  R26,@0+@1
	LDS  R27,@0+@1+1
	LDS  R24,@0+@1+2
	LDS  R25,@0+@1+3
	.ENDM

	.MACRO __PUTB1MN
	STS  @0+@1,R30
	.ENDM

	.MACRO __PUTW1MN
	STS  @0+@1,R30
	STS  @0+@1+1,R31
	.ENDM

	.MACRO __PUTD1MN
	STS  @0+@1,R30
	STS  @0+@1+1,R31
	STS  @0+@1+2,R22
	STS  @0+@1+3,R23
	.ENDM

	.MACRO __PUTBMRN
	STS  @0+@1,R@2
	.ENDM

	.MACRO __PUTWMRN
	STS  @0+@1,R@2
	STS  @0+@1+1,R@3
	.ENDM

	.MACRO __GETW1R
	MOV  R30,R@0
	MOV  R31,R@1
	.ENDM

	.MACRO __GETW2R
	MOV  R26,R@0
	MOV  R27,R@1
	.ENDM

	.MACRO __GETWRN
	LDI  R@0,LOW(@2)
	LDI  R@1,HIGH(@2)
	.ENDM

	.MACRO __PUTW1R
	MOV  R@0,R30
	MOV  R@1,R31
	.ENDM

	.MACRO __ADDWRN
	SUBI R@0,LOW(-@2)
	SBCI R@1,HIGH(-@2)
	.ENDM

	.MACRO __ADDWRR
	ADD  R@0,R@2
	ADC  R@1,R@3
	.ENDM

	.MACRO __SUBWRN
	SUBI R@0,LOW(@2)
	SBCI R@1,HIGH(@2)
	.ENDM

	.MACRO __SUBWRR
	SUB  R@0,R@2
	SBC  R@1,R@3
	.ENDM

	.MACRO __ANDWRN
	ANDI R@0,LOW(@2)
	ANDI R@1,HIGH(@2)
	.ENDM

	.MACRO __ANDWRR
	AND  R@0,R@2
	AND  R@1,R@3
	.ENDM

	.MACRO __ORWRN
	ORI  R@0,LOW(@2)
	ORI  R@1,HIGH(@2)
	.ENDM

	.MACRO __ORWRR
	OR   R@0,R@2
	OR   R@1,R@3
	.ENDM

	.MACRO __EORWRR
	EOR  R@0,R@2
	EOR  R@1,R@3
	.ENDM

	.MACRO __GETWRS
	LDD  R@0,Y+@2
	LDD  R@1,Y+@2+1
	.ENDM

	.MACRO __PUTWSR
	STD  Y+@2,R@0
	STD  Y+@2+1,R@1
	.ENDM

	.MACRO __MOVEWRR
	MOV  R@0,R@2
	MOV  R@1,R@3
	.ENDM

	.MACRO __INWR
	IN   R@0,@2
	IN   R@1,@2+1
	.ENDM

	.MACRO __OUTWR
	OUT  @2+1,R@1
	OUT  @2,R@0
	.ENDM

	.MACRO __CALL1MN
	LDS  R30,@0+@1
	LDS  R31,@0+@1+1
	ICALL
	.ENDM

	.MACRO __NBST
	BST  R@0,@1
	IN   R30,SREG
	LDI  R31,0x40
	EOR  R30,R31
	OUT  SREG,R30
	.ENDM


	.MACRO __PUTB1SN
	LDD  R26,Y+@0
	SUBI R26,-@1
	ST   X,R30
	.ENDM

	.MACRO __PUTW1SN
	LDD  R26,Y+@0
	SUBI R26,-@1
	ST   X+,R30
	ST   X,R31
	.ENDM

	.MACRO __PUTD1SN
	LDD  R26,Y+@0
	SUBI R26,-@1
	RCALL __PUTDP1
	.ENDM

	.MACRO __PUTB1SNS
	LDD  R26,Y+@0
	SUBI R26,-@1
	ST   X,R30
	.ENDM

	.MACRO __PUTW1SNS
	LDD  R26,Y+@0
	SUBI R26,-@1
	ST   X+,R30
	ST   X,R31
	.ENDM

	.MACRO __PUTD1SNS
	LDD  R26,Y+@0
	SUBI R26,-@1
	RCALL __PUTDP1
	.ENDM

	.MACRO __PUTB1PMN
	LDS  R26,@0
	SUBI R26,-@1
	ST   X,R30
	.ENDM

	.MACRO __PUTW1PMN
	LDS  R26,@0
	SUBI R26,-@1
	ST   X+,R30
	ST   X,R31
	.ENDM

	.MACRO __PUTD1PMN
	LDS  R26,@0
	SUBI R26,-@1
	RCALL __PUTDP1
	.ENDM

	.MACRO __PUTB1PMNS
	LDS  R26,@0
	SUBI R26,-@1
	ST   X,R30
	.ENDM

	.MACRO __PUTW1PMNS
	LDS  R26,@0
	SUBI R26,-@1
	ST   X+,R30
	ST   X,R31
	.ENDM

	.MACRO __PUTD1PMNS
	LDS  R26,@0
	SUBI R26,-@1
	RCALL __PUTDP1
	.ENDM

	.MACRO __GETB1SX
	MOV  R30,R28
	MOV  R31,R29
	SUBI R30,LOW(-@0)
	SBCI R31,HIGH(-@0)
	LD   R30,Z
	.ENDM

	.MACRO __GETW1SX
	MOV  R30,R28
	MOV  R31,R29
	SUBI R30,LOW(-@0)
	SBCI R31,HIGH(-@0)
	LD   R0,Z+
	LD   R31,Z
	MOV  R30,R0
	.ENDM

	.MACRO __GETD1SX
	MOV  R30,R28
	MOV  R31,R29
	SUBI R30,LOW(-@0)
	SBCI R31,HIGH(-@0)
	LD   R0,Z+
	LD   R1,Z+
	LD   R22,Z+
	LD   R23,Z
	MOV  R30,R0
	MOV  R31,R1
	.ENDM

	.MACRO __GETB2SX
	MOV  R26,R28
	MOV  R27,R29
	SUBI R26,LOW(-@0)
	SBCI R27,HIGH(-@0)
	LD   R26,X
	.ENDM

	.MACRO __GETW2SX
	MOV  R26,R28
	MOV  R27,R29
	SUBI R26,LOW(-@0)
	SBCI R27,HIGH(-@0)
	LD   R0,X+
	LD   R27,X
	MOV  R26,R0
	.ENDM

	.MACRO __GETD2SX
	MOV  R26,R28
	MOV  R27,R29
	SUBI R26,LOW(-@0)
	SBCI R27,HIGH(-@0)
	LD   R0,X+
	LD   R1,X+
	LD   R24,X+
	LD   R25,X
	MOV  R26,R0
	MOV  R27,R1
	.ENDM

	.MACRO __GETBRSX
	MOV  R30,R28
	MOV  R31,R29
	SUBI R30,LOW(-@1)
	SBCI R31,HIGH(-@1)
	LD   R@0,Z
	.ENDM

	.MACRO __GETWRSX
	MOV  R30,R28
	MOV  R31,R29
	SUBI R30,LOW(-@2)
	SBCI R31,HIGH(-@2)
	LD   R@0,Z+
	LD   R@1,Z
	.ENDM

	.MACRO __LSLW8SX
	MOV  R30,R28
	MOV  R31,R29
	SUBI R30,LOW(-@0)
	SBCI R31,HIGH(-@0)
	LD   R31,Z
	CLR  R30
	.ENDM

	.MACRO __PUTB1SX
	MOV  R26,R28
	MOV  R27,R29
	SUBI R26,LOW(-@0)
	SBCI R27,HIGH(-@0)
	ST   X,R30
	.ENDM

	.MACRO __PUTW1SX
	MOV  R26,R28
	MOV  R27,R29
	SUBI R26,LOW(-@0)
	SBCI R27,HIGH(-@0)
	ST   X+,R30
	ST   X,R31
	.ENDM

	.MACRO __PUTD1SX
	MOV  R26,R28
	MOV  R27,R29
	SUBI R26,LOW(-@0)
	SBCI R27,HIGH(-@0)
	ST   X+,R30
	ST   X+,R31
	ST   X+,R22
	ST   X,R23
	.ENDM

	.MACRO __CLRW1SX
	MOV  R30,R28
	MOV  R31,R29
	SUBI R30,LOW(-@0)
	SBCI R31,HIGH(-@0)
	CLR  R0
	ST   Z+,R0
	ST   Z,R0
	.ENDM

	.MACRO __CLRD1SX
	MOV  R30,R28
	MOV  R31,R29
	SUBI R30,LOW(-@0)
	SBCI R31,HIGH(-@0)
	CLR  R0
	ST   Z+,R0
	ST   Z+,R0
	ST   Z+,R0
	ST   Z,R0
	.ENDM

	.MACRO __PUTB2SX
	MOV  R30,R28
	MOV  R31,R29
	SUBI R30,LOW(-@0)
	SBCI R31,HIGH(-@0)
	ST   Z,R26
	.ENDM

	.MACRO __PUTW2SX
	MOV  R30,R28
	MOV  R31,R29
	SUBI R30,LOW(-@0)
	SBCI R31,HIGH(-@0)
	ST   Z+,R26
	ST   Z,R27
	.ENDM

	.MACRO __PUTBSRX
	MOV  R30,R28
	MOV  R31,R29
	SUBI R30,LOW(-@0)
	SBCI R31,HIGH(-@0)
	ST   Z,R@1
	.ENDM

	.MACRO __PUTWSRX
	MOV  R30,R28
	MOV  R31,R29
	SUBI R30,LOW(-@2)
	SBCI R31,HIGH(-@2)
	ST   Z+,R@0
	ST   Z,R@1
	.ENDM

	.MACRO __PUTB1SNX
	MOV  R26,R28
	MOV  R27,R29
	SUBI R26,LOW(-@0)
	SBCI R27,HIGH(-@0)
	LD   R0,X+
	LD   R27,X
	MOV  R26,R0
	SUBI R26,LOW(-@1)
	SBCI R27,HIGH(-@1)
	ST   X,R30
	.ENDM

	.MACRO __PUTW1SNX
	MOV  R26,R28
	MOV  R27,R29
	SUBI R26,LOW(-@0)
	SBCI R27,HIGH(-@0)
	LD   R0,X+
	LD   R27,X
	MOV  R26,R0
	SUBI R26,LOW(-@1)
	SBCI R27,HIGH(-@1)
	ST   X+,R30
	ST   X,R31
	.ENDM

	.MACRO __PUTD1SNX
	MOV  R26,R28
	MOV  R27,R29
	SUBI R26,LOW(-@0)
	SBCI R27,HIGH(-@0)
	LD   R0,X+
	LD   R27,X
	MOV  R26,R0
	SUBI R26,LOW(-@1)
	SBCI R27,HIGH(-@1)
	ST   X+,R30
	ST   X+,R31
	ST   X+,R22
	ST   X,R23
	.ENDM

	.CSEG
	.ORG 0x03

	.INCLUDE "ppe_ps.inc"

__RESET:
	CLI
	CLR  R30
	OUT  EECR,R30
	OUT  MCUCR,R30

;DISABLE WATCHDOG
	LDI  R31,0x18
	OUT  WDTCR,R31
	LDI  R31,0x10
	OUT  WDTCR,R31

;CLEAR R2-R15
	LDI  R24,14
	LDI  R26,2
__CLEAR_REG:
	ST   X+,R30
	DEC  R24
	BRNE __CLEAR_REG

;CLEAR SRAM
	LDI  R24,LOW(0x80)
	LDI  R26,0x60
__CLEAR_SRAM:
	ST   X+,R30
	DEC  R24
	BRNE __CLEAR_SRAM

;GLOBAL VARIABLES INITIALIZATION
	LDI  R30,LOW(__GLOBAL_INI_TBL*2)
	LDI  R31,HIGH(__GLOBAL_INI_TBL*2)
__GLOBAL_INI_NEXT:
	LPM
	ADIW R30,1
	MOV  R1,R0
	LPM
	ADIW R30,1
	MOV  R22,R30
	MOV  R23,R31
	MOV  R31,R0
	MOV  R30,R1
	SBIW R30,0
	BREQ __GLOBAL_INI_END
	LPM
	ADIW R30,1
	MOV  R26,R0
	LPM
	ADIW R30,1
	MOV  R27,R0
	LPM
	ADIW R30,1
	MOV  R24,R0
	LPM
	ADIW R30,1
	MOV  R25,R0
__GLOBAL_INI_LOOP:
	LPM
	ADIW R30,1
	ST   X+,R0
	SBIW R24,1
	BRNE __GLOBAL_INI_LOOP
	MOV  R30,R22
	MOV  R31,R23
	RJMP __GLOBAL_INI_NEXT
__GLOBAL_INI_END:

;STACK POINTER INITIALIZATION
	LDI  R30,LOW(0xDF)
	OUT  SPL,R30

;DATA STACK POINTER INITIALIZATION
	LDI  R28,LOW(0x7F)
	LDI  R29,HIGH(0x7F)

	RJMP _main

	.ESEG
	.ORG 1

	.DSEG
	.ORG 0x80
;       1 /*********************************************
;       2 This program was produced by the
;       3 CodeWizardAVR V1.0.2.2d Standard
;       4 Automatic Program Generator
;       5 © Copyright 1998-2002
;       6 Pavel Haiduc, HP InfoTech s.r.l.
;       7 http://www.hpinfotech.ro
;       8 e-mail:office@hpinfotech.ro , hpinfotech@xmail.ro
;       9 
;      10 Project : PPE Pousse Seringue
;      11 Version : Dernière
;      12 Date    : 05/02/2003
;      13 Author  :                 
;      14 Company : LYCEE Pierre Emile MARTIN       
;      15 Comments: Réorganisation de la fonction traiter du PS
;      16 
;      17 
;      18 Chip type           : AT90S8535
;      19 Clock frequency     : 4,000000 MHz
;      20 Memory model        : Small
;      21 Internal SRAM size  : 512
;      22 External SRAM size  : 0
;      23 Data Stack size     : 128
;      24 *********************************************/
;      25 
;      26 #include <90s8535.h>
;      27 // CodeVisionAVR C Compiler
;      28 // (C) 1998-2000 Pavel Haiduc, HP InfoTech S.R.L.
;      29 
;      30 // I/O registers definitions for the AT90S8535
;      31 
;      32 #ifndef _90S8535_INCLUDED_
;      33 #define _90S8535_INCLUDED_
;      34 
;      35 #pragma used+
;      36 sfrb ADCL=4;
;      37 sfrb ADCH=5;
;      38 sfrw ADCW=4;      // 16 bit access
;      39 sfrb ADCSR=6;
;      40 sfrb ADMUX=7;
;      41 sfrb ACSR=8;
;      42 sfrb UBRR=9;
;      43 sfrb UCR=0xa;
;      44 sfrb USR=0xb;
;      45 sfrb UDR=0xc;
;      46 sfrb SPCR=0xd;
;      47 sfrb SPSR=0xe;
;      48 sfrb SPDR=0xf;
;      49 sfrb PIND=0x10;
;      50 sfrb DDRD=0x11;
;      51 sfrb PORTD=0x12;
;      52 sfrb PINC=0x13;
;      53 sfrb DDRC=0x14;
;      54 sfrb PORTC=0x15;
;      55 sfrb PINB=0x16;
;      56 sfrb DDRB=0x17;
;      57 sfrb PORTB=0x18;
;      58 sfrb PINA=0x19;
;      59 sfrb DDRA=0x1a;
;      60 sfrb PORTA=0x1b;
;      61 sfrb EECR=0x1c;
;      62 sfrb EEDR=0x1d;
;      63 sfrb EEARL=0x1e;
;      64 sfrb EEARH=0x1f;
;      65 sfrw EEAR=0x1e;   // 16 bit access
;      66 sfrb WDTCR=0x21;
;      67 sfrb ASSR=0x22;
;      68 sfrb OCR2=0x23;
;      69 sfrb TCNT2=0x24;
;      70 sfrb TCCR2=0x25;
;      71 sfrb ICR1L=0x26;
;      72 sfrb ICR1H=0x27;
;      73 sfrw ICR1=0x26;   // 16 bit access
;      74 sfrb OCR1BL=0x28;
;      75 sfrb OCR1BH=0x29;
;      76 sfrw OCR1B=0x28;  // 16 bit access
;      77 sfrb OCR1AL=0x2a;
;      78 sfrb OCR1AH=0x2b;
;      79 sfrw OCR1A=0x2a;  // 16 bit access
;      80 sfrb TCNT1L=0x2c;
;      81 sfrb TCNT1H=0x2d;
;      82 sfrw TCNT1=0x2c;  // 16 bit access
;      83 sfrb TCCR1B=0x2e;
;      84 sfrb TCCR1A=0x2f;
;      85 sfrb TCNT0=0x32;
;      86 sfrb TCCR0=0x33;
;      87 sfrb MCUSR=0x34;
;      88 sfrb MCUCR=0x35;
;      89 sfrb TIFR=0x38;
;      90 sfrb TIMSK=0x39;
;      91 sfrb GIFR=0x3a;
;      92 sfrb GIMSK=0x3b;
;      93 sfrb SPL=0x3d;
;      94 sfrb SPH=0x3e;
;      95 sfrb SREG=0x3f;
;      96 #pragma used-
;      97 
;      98 // Interrupt vectors definitions
;      99 
;     100 #define EXT_INT0 2
;     101 #define EXT_INT1 3
;     102 #define TIM2_COMP 4
;     103 #define TIM2_OVF 5
;     104 #define TIM1_CAPT 6
;     105 #define TIM1_COMPA 7
;     106 #define TIM1_COMPB 8
;     107 #define TIM1_OVF 9
;     108 #define TIM0_OVF 10
;     109 #define SPI_STC 11
;     110 #define UART_RXC 12
;     111 #define UART_DRE 13
;     112 #define UART_TXC 14
;     113 #define ADC_INT 15
;     114 #define EE_RDY 16
;     115 #define ANA_COMP 17
;     116 
;     117 #endif
;     118 
;     119 
;     120 // Librairies non générées par Wizard (rajoutées manuellement)      
;     121 #include <ssi.h>      // contient les fonctions Lire_BP,Affiche_LCD,Regdebit,Select_Seringue 
;     122 // Ce fichier est à utiliser dans un projet CVAVR
;     123 // il doit être placé dans le sous répertoire \INC
;     124 // cible : AT90S8535
;     125 
;     126 //-----------------------------------------
;     127 //Codes de commande de l'afficheur LCD 2x16
;     128 //-----------------------------------------
;     129 
;     130 // Initialisation du déplacement du curseur
;     131 //-----------------------------------------
;     132 #define EntryMode0 0b00000100 // Par défaut déplacement du curseur vers la gauche
;     133 #define EntryMode1 0b00000101 // Par défaut déplacement de l'affichage vers la gauche
;     134 #define EntryMode2 0b00000110 // Par défaut déplacement du curseur vers la droite
;     135 #define EntryMode3 0b00000111 // Par défaut déplacement de l'affichage vers la droite
;     136 
;     137 #define clear 0b00000001 // Efface l'écran et la DDRAM
;     138 #define home  0b00000010 // Ramène le curseur au début de la première ligne
;     139 
;     140 // Affichage           code       On/Off   curseur      clignotement 
;     141 //------------------------------------------------------------------
;     142 #define displayOff0 0b00001000  //  Off      invisible     non
;     143 #define displayOff1 0b00001001  //  Off      invisible     oui
;     144 #define displayOff2 0b00001010  //  Off      visible       non
;     145 #define displayOff3 0b00001011  //  Off      visible       oui
;     146 #define displayOn0  0b00001011  //  On       invisible     non
;     147 #define displayOn1  0b00001011  //  On       invisible     oui
;     148 #define displayOn2  0b00001011  //  On       visible       non
;     149 #define displayOn3  0b00001011  //  On       visible       oui
;     150 
;     151 // Déplacement du curseur ou de l'affichage
;     152 #define curseurG    0b00010000 // Déplacement du curseur vers la gauche 
;     153 #define curseurD    0b00010100 // Déplacement du curseur vers la droite
;     154 #define fenetreG    0b00011000 // Déplacement de l'affichage vers la gauche
;     155 #define fenetreD    0b00011100 // Déplacement de l'affichage vers la droite
;     156 
;     157 //-------------------------
;     158 // Prototypes des fonctions
;     159 //------------------------- 
;     160 #pragma used+
;     161 
;     162 unsigned char Lire_BP(void);
;     163 /*
;     164 Rôle : Lit l'état des BP de la carte DevATMEL S_SI(PortA) 
;     165 Commentaires : La fonction renvoie le code de la touche actionnée lors du premier
;     166 appel (INC = 0x1F, DEC = Ox2f, OK = 0x37, ECHAP = 0x3B, SET = 0x3D, ENTR=0x3E)
;     167 puis 0x00 si la touche est maintenue ou 0xFF si la touche est relâchée.
;     168 Entrées : aucune
;     169 sortie : code de la touche ou 0x00 ou 0xFF
;     170 */
;     171 
;     172 void Affiche_LCD(char *ligne1,char *ligne2);
;     173 /*
;     174 Rôle : Gére l'affichage d'un LCD équipé d'un contrôleur Hitachi
;     175        et commandé en mode 4 bits
;     176 
;     177 Commentaires : Envoie le contenu de deux tableaux de 16 caractères sur les ligne 1 et
;     178 2 d'un afficheur LCD 2*16 caractères.
;     179 Chaque tableau doit pouvoir contenir les 16 caractères à afficher + \0
;     180 remarque : cette fonction utilise les fonctions de <lcd.h>
;     181 
;     182 Entrées : ligne1, ligne2 = tableaux de 17 caractères
;     183 
;     184 Sorties : Aucune
;     185 */ 
;     186 
;     187 int regle_HTR(unsigned char Heure_ou_Date, char H_J, char mn_mois, int sec_annee);
;     188 /*
;     189 Rôle : Régle la date et l'heure d'une HTR PCF8583 situé à l'adresse 0
;     190 
;     191 Commentaires : La fonction permet à l'utilisateur d'effectuer le réglage de l'heure si Heure_ou_Date = 0
;     192 ou de la date si Heure_ou_Date = 1.Les paramètres H_J, mn_mois, sec_annee servent de base
;     193 aux réglages. Celui-ci s'effectue avec les BP :
;     194 INC pour augmenter une valeur,
;     195 DEC pour diminuer une valeur,
;     196 OK  pour valider la valeur modifiée et passer au réglage suivant
;     197 EChap pour transférer la valeur réglée et sortir de la fonction
;     198 
;     199 Entrées : 
;     200 	Si Heure_ou_Date = 0 (réglage de l'heure) alors -1 < H_J < 24, -1 < mn_mois < 60
;     201 							-1 < sec_annee < 60 
;     202 						  sinon -1 < H_J < 32, 0 < mn_mois < 13
;     203 							1999 < sec_annee < 2050  
;     204 Sortie : la fonction renvoie 0 
;     205 */      
;     206 
;     207 unsigned char D2000_read(unsigned char adressmap);
;     208 /* Rôle : Lit un octet dans une carte à puce D2000 (gérée par le protocole I2C)
;     209 
;     210 Commentaires : Mémoire eeprom de type PCF8582 (256 octets)
;     211                Adresse du boîtier figée en 0xa0 
;     212 Entrées : 
;     213               adressmap = adresse à atteindre dans le boîtier
;     214 Sorties : 
;     215               contenu de l'adresse adressmap du boîtier situé en 0xa0
;     216 
;     217 */
;     218 unsigned char eeprom_read(unsigned char addcase, unsigned int adressmap);
;     219 /*
;     220 Rôle : Lit un octet dans une mémoire série gérée par le protocole I2C
;     221 
;     222 Commentaires : A utiliser avec les mémoires > 256 octets
;     223 
;     224 Entrées :
;     225       addcase : adresse du boîtier mémoire construit par 1 0 1 0 A2 A1 A0 R/W
;     226       remarque (R/W doit être mis à zéro)
;     227       adressmap : adresse à atteindre dans le boîtier
;     228 Sorties : contenu de l'adresse adressmap du boîtier situé en addcase
;     229 
;     230 */
;     231 
;     232 void eeprom_write(unsigned char addcase, unsigned char adressmap, unsigned char data);
;     233 /*
;     234 Rôle : Ecrit un octet dans une mémoire série gérée par le protocole I2C
;     235 
;     236 Commentaires : cette fonction utilise une fonctions de <delay.h>
;     237 
;     238 Entrées :
;     239       addcase : adresse du boîtier mémoire construit par 1 0 1 0 A2 A1 A0 R/W
;     240       remarque (R/W doit être mis à zéro)
;     241       adressmap : adresse à atteindre dans le boîtier
;     242       data : octet à écrire à la position adressmap du boîtier situé en addcase
;     243 Sorties : aucune
;     244 
;     245 */
;     246 void eeprom_page_read(unsigned char addcase, unsigned int adressmap, unsigned char *display_buffer);
;     247 /*
;     248 Rôle : Lit 32 octets dans une mémoire série gérée par le protocole I2C
;     249 
;     250 Commentaires : 
;     251 
;     252 Entrées :
;     253       addcase : adresse du boîtier mémoire construit par 1 0 1 0 A2 A1 A0 R/W
;     254       remarque (R/W doit être mis à zéro)
;     255       adressmap : adresse à atteindre dans le boîtier
;     256 Sorties : contenu des 32 adresses à partir de adressmap du boîtier situé en addcase
;     257 
;     258 */
;     259 
;     260 int Regdebit(unsigned int *dizaines,unsigned int *unites, unsigned int *diziemes);
;     261 /*
;     262 Rôle : Renvoie la valeur de consigne de débit réglée sous la forme dizaine, unité, dizième
;     263 
;     264 Commentaires : fonction écrite pour le pousse seringue
;     265 Entrées / sortie : dizaine de ml/h, unité ml/h, dizième ml/h
;     266  
;     267 */
;     268 
;     269 unsigned char Select_Seringue(void);
;     270 /*Rôle : Revoie le type de seringue sélectionnée
;     271 	 1 : TERUMO 50CC	2 : MONOJECT/ BD 50CC	3 : BD 20CC
;     272 Commentaires : fonction écrite pour le pousse seringue
;     273 sortie : seringue sélectionnée
;     274  
;     275 */
;     276 
;     277 #pragma used-
;     278 
;     279 #pragma library ssi.lib
;     280 
;     281 #include <delay.h>    // contient la fonction delay_ms
;     282 // CodeVisionAVR C Compiler
;     283 // (C) 1998-2000 Pavel Haiduc, HP InfoTech S.R.L.
;     284 
;     285 #ifndef _DELAY_INCLUDED_
;     286 #define _DELAY_INCLUDED_
;     287 
;     288 #pragma used+
;     289 
;     290 void delay_us(unsigned int n);
;     291 void delay_ms(unsigned int n);
;     292 
;     293 #pragma used-
;     294 
;     295 #endif
;     296 #include <stdio.h>    // contient la fonction sprintf
;     297 // CodeVisionAVR C Compiler
;     298 // (C) 1998-2002 Pavel Haiduc, HP InfoTech S.R.L.
;     299 
;     300 // Prototypes for standard I/O functions
;     301 
;     302 #ifndef _STDIO_INCLUDED_
;     303 #define _STDIO_INCLUDED_
;     304 
;     305 #ifndef NULL
;     306 #define NULL 0
;     307 #endif
;     308 
;     309 #ifndef EOF
;     310 #define EOF -1
;     311 #endif
;     312 
;     313 #pragma used+
;     314 
;     315 char getchar(void);
;     316 void putchar(char c);
;     317 void puts(char *str);
;     318 void putsf(char flash *str);
;     319 
;     320 #ifdef _MODEL_TINY_
;     321 char *gets(char *str,unsigned char len);
;     322 #endif
;     323 
;     324 #ifdef _MODEL_SMALL_
;     325 char *gets(char *str,unsigned int len);
;     326 #endif
;     327 
;     328 #pragma parptr+
;     329 void printf(char flash *fmtstr);
;     330 void sprintf(char *str, char flash *fmtstr);
;     331 #pragma parptr-
;     332 
;     333 signed char scanf(char flash *fmtstr,...);
;     334 signed char sscanf(char *str, char flash *fmtstr,...);
;     335 
;     336 #ifdef _DEBUG_TERMINAL_IO_
;     337 // Used for AVR Studio Terminal I/O
;     338 // DON'T CHANGE!
;     339 #pragma warn-
;     340 #pragma keep+
;     341 void _c_getchar(void) {}
;     342 
;     343 char getchar(void)
;     344 {
;     345 #asm
;     346      push  r16
;     347      push  r17
;     348 __getchar0:
;     349 #endasm
;     350 _c_getchar();
;     351 #asm
;     352      cpi   r17,0xff
;     353      breq  __getchar0
;     354      mov   r30,r16
;     355      pop   r17
;     356      pop   r16
;     357 #endasm
;     358 }
;     359 
;     360 void _c_putchar(void) {}
;     361 
;     362 void putchar(char c)
;     363 {
;     364 #asm
;     365     mov   r30,r16
;     366     ld    r16,y
;     367 #endasm
;     368 _c_putchar();
;     369 #asm
;     370     mov   r16,r30
;     371 #endasm
;     372 }
;     373 #pragma keep-
;     374 
;     375 #ifdef _WARNINGS_ON_
;     376 #pragma warn+
;     377 #endif
;     378 
;     379 #endif
;     380 #pragma used-
;     381 
;     382 #pragma library stdio.lib
;     383 
;     384 #endif
;     385 
;     386 
;     387 // Etats du graphe des transitions "Menu"
;     388 #define Arret	 	0
;     389 #define Marche	 	1
;     390 #define ReglageDebit	2    
;     391 #define ChoixSeringue	3
;     392 
;     393 // Etats du graphe des transitions "Moteur"
;     394 #define etat1	1
;     395 #define etat2	2
;     396 #define etat3	3
;     397 #define etat4	4
;     398 
;     399 // Code des BPs de la carte AT90S8535 SSI
;     400 #define INC		0x1F
;     401 #define DEC		0x2F
;     402 #define OK		0x37
;     403 #define ECHAP		0x3B
;     404 #define SET		0x3D
;     405 #define ENTR		0x3E
;     406 
;     407 // Types de seringue
;     408 #define Terumo50CC   	1
;     409 #define Monoject50CC    2
;     410 #define BD20CC          3
;     411 
;     412 // Alphanumeric LCD Module functions
;     413 #asm
   .equ __lcd_port=0x15
;     415 #endasm
;     416 #include <lcd.h>  
;     417 /* LCD driver routines
;     418 
;     419   CodeVisionAVR C Compiler
;     420   (C) 1998-2000 Pavel Haiduc, HP InfoTech S.R.L.
;     421 
;     422   BEFORE #include -ING THIS FILE YOU
;     423   MUST DECLARE THE I/O ADDRESS OF THE
;     424   DATA REGISTER OF THE PORT AT WHICH
;     425   THE LCD IS CONNECTED!
;     426 
;     427   EXAMPLE FOR PORTB:
;     428 
;     429     #asm
;     430         .equ __lcd_port=0x18
;     431     #endasm
;     432     #include <lcd.h>
;     433 
;     434 */
;     435 
;     436 #ifndef _LCD_INCLUDED_
;     437 #define _LCD_INCLUDED_
;     438 
;     439 #pragma used+
;     440 
;     441 void _lcd_ready(void);
;     442 void _lcd_write_data(unsigned char data);
;     443 // write a byte to the LCD character generator or display RAM
;     444 void lcd_write_byte(unsigned char addr, unsigned char data);
;     445 // read a byte from the LCD character generator or display RAM
;     446 unsigned char lcd_read_byte(unsigned char addr);
;     447 // set the LCD display position  x=0..39 y=0..3
;     448 void lcd_gotoxy(unsigned char x, unsigned char y);
;     449 // clear the LCD
;     450 void lcd_clear(void);
;     451 void lcd_putchar(char c);
;     452 // write the string str located in SRAM to the LCD
;     453 void lcd_puts(char *str);
;     454 // write the string str located in FLASH to the LCD
;     455 void lcd_putsf(char flash *str);
;     456 // initialize the LCD controller
;     457 void lcd_init(unsigned char lcd_columns);
;     458 
;     459 #pragma used-
;     460 #pragma library lcd.lib
;     461 
;     462 #endif
;     463 
;     464 
;     465 
;     466 // Declare your global variables here
;     467 unsigned int Vtimer; // Réglage de la fréquence du moteur pas à pas
;     468 
;     469 // Timer 1 overflow interrupt service routine 
;     470 // Sous programme d'interruption "Moteur"
;     471 interrupt [TIM1_OVF] void timer1_ovf_isr(void)
;     472 {

	.CSEG
;     473 static unsigned char etat = etat1;

	.DSEG

	.CSEG
;     474 TCNT1 = Vtimer;
;     475 switch(etat) 
;     476 	{
;     477        	  
;     478        	  // à compléter
;     479        	  
;     480 	  default : etat = etat1;
;     481 	} 
;     482 }
;     483 
;     484 //--------------------
;     485 // Programme principal
;     486 //--------------------
;     487 
;     488 void main(void)
;     489 {
_main:
;     490 // Declare your local variables here
;     491 //----------------------------------
;     492 char display_buffer_ligne0[17]; // tampon ligne 0 de l'afficheur
;     493 char display_buffer_ligne1[17]; // tampon ligne 1 de l'afficheur
;     494 float FPH; // fréquence calculée à partir de la consigne de débit
;     495 unsigned char etat = Arret, etat_1 = Marche; // variables du graphe Menu
;     496 unsigned char BP, seringue; // BP = code ou état de la touche sélectionnée
;     497 			    // seringue = type de seringue sélectionnée 
;     498 unsigned int dizaines=0, unites=0, diziemes=0; // sélection du débit  dizaines unites.diziemes ml/h
;     499 unsigned int dix_C_debit; // dix_C_debit = 100*dizaines + 10*unites + diziemes
;     500 
;     501 
;     502 // Input/Output Ports initialization
;     503 // Port A
;     504 PORTA=0x3F;
	SBIW R28,44
	LDI  R24,4
	LDI  R26,LOW(2)
	LDI  R27,HIGH(2)
	LDI  R30,LOW(_0x26*2)
	LDI  R31,HIGH(_0x26*2)
	RCALL __INITLOCB
;	display_buffer_ligne0 -> Y+27
;	display_buffer_ligne1 -> Y+10
;	FPH -> Y+6
;	etat -> R16
;	etat_1 -> R17
;	BP -> R18
;	seringue -> R19
;	dizaines -> R20,R21
;	unites -> Y+4
;	diziemes -> Y+2
;	dix_C_debit -> Y+0
	LDI  R16,0
	LDI  R17,1
	LDI  R20,0
	LDI  R21,0
	LDI  R30,LOW(63)
	OUT  0x1B,R30
;     505 DDRA=0x00;
	CLR  R30
	OUT  0x1A,R30
;     506 
;     507 // Port B
;     508 PORTB=0x00;
	OUT  0x18,R30
;     509 DDRB=0x1F;
	LDI  R30,LOW(31)
	OUT  0x17,R30
;     510 
;     511 // Timer/Counter 1 initialization
;     512 // Clock source: System Clock
;     513 // Clock value: 3,906 kHz
;     514 // Mode: Normal top=FFFFh
;     515 // OC1A output: Discon.
;     516 // OC1B output: Discon.
;     517 // Noise Canceler: Off
;     518 // Input Capture on Falling Edge
;     519 TCCR1A=0x00;
	CLR  R30
	OUT  0x2F,R30
;     520 TCCR1B=0x05;
	LDI  R30,LOW(5)
	OUT  0x2E,R30
;     521 TCNT1H=0xFF;
	LDI  R30,LOW(255)
	OUT  0x2D,R30
;     522 TCNT1L=0xFE;
	LDI  R30,LOW(254)
	OUT  0x2C,R30
;     523 OCR1AH=0x00;
	CLR  R30
	OUT  0x2B,R30
;     524 OCR1AL=0x00;
	OUT  0x2A,R30
;     525 OCR1BH=0x00;
	OUT  0x29,R30
;     526 OCR1BL=0x00;
	OUT  0x28,R30
;     527 
;     528 // LCD module initialization
;     529 lcd_init(16);
	LDI  R30,LOW(16)
	ST   -Y,R30
	RCALL _lcd_init
;     530 
;     531 // Global enable interrupts
;     532 #asm("sei")
	sei
;     533 
;     534 
;     535 while (1)
_0x27:
;     536   {
;     537       BP = Lire_BP();
	RCALL SUBOPT_0x0
;     538       
;     539       switch (etat)
	MOV  R30,R16
;     540       {
;     541        case Arret : if (etat_1 != etat)
	CPI  R30,0
	BRNE _0x2D
	CP   R16,R17
	BREQ _0x2E
;     542                        {
;     543                         PORTB = 0x0F;  // désactivation du moteur
	LDI  R30,LOW(15)
	OUT  0x18,R30
;     544                         TIMSK=0x00; // inhibition interruption débordement timer 1
	CLR  R30
	OUT  0x39,R30
;     545                         sprintf(display_buffer_ligne0,"OK>RG_D ETR>CH_S");
	PUSH R28
	RCALL SUBOPT_0x1
	__POINTW1FN _37,0
	ST   -Y,R31
	ST   -Y,R30
	RCALL _sprintf
	ADIW R28,3
;     546                     	sprintf(display_buffer_ligne1,"SET -> RUN");
	PUSH R28
	RCALL SUBOPT_0x2
	__POINTW1FN _37,17
	ST   -Y,R31
	ST   -Y,R30
	RCALL _sprintf
	RCALL SUBOPT_0x3
;     547                     	Affiche_LCD(display_buffer_ligne0,display_buffer_ligne1);
	RCALL SUBOPT_0x4
;     548                        }
;     549                     	if (BP==OK) etat = ReglageDebit;
_0x2E:
	CPI  R18,55
	BRNE _0x2F
	LDI  R16,LOW(2)
;     550                       		else if (BP==SET) etat = Marche;
	RJMP _0x30
_0x2F:
	CPI  R18,61
	BRNE _0x31
	LDI  R16,LOW(1)
;     551                       	       		else if (BP==ENTR) etat = ChoixSeringue;
	RJMP _0x32
_0x31:
	CPI  R18,62
	BRNE _0x33
	LDI  R16,LOW(3)
;     552                       		               else etat = Arret;
	RJMP _0x34
_0x33:
	LDI  R16,LOW(0)
_0x34:
_0x32:
_0x30:
;     553        		    etat_1 = Arret; 
	LDI  R17,LOW(0)
;     554        break;
	RJMP _0x2C
;     555        		   
;     556        case Marche : if (etat_1 != etat) 
_0x2D:
	CPI  R30,LOW(0x1)
	BRNE _0x35
	CP   R16,R17
	BREQ _0x36
;     557                        { 
;     558                           dix_C_debit = 100*dizaines + 10*unites + diziemes;
	__GETW1R 20,21
	LDI  R26,LOW(100)
	LDI  R27,HIGH(100)
	RCALL __MULW12U
	PUSH R31
	PUSH R30
	LDD  R30,Y+4
	LDD  R31,Y+4+1
	LDI  R26,LOW(10)
	LDI  R27,HIGH(10)
	RCALL __MULW12U
	POP  R26
	POP  R27
	ADD  R30,R26
	ADC  R31,R27
	LDD  R26,Y+2
	LDD  R27,Y+2+1
	ADD  R30,R26
	ADC  R31,R27
	ST   Y,R30
	STD  Y+1,R31
;     559                          
;     560                        	  switch (seringue)   // Calcul de FPH=f(C_debit)
	MOV  R30,R19
;     561                          	{
;     562                          	 
;     563                          	 // à compléter
;     564                          	 
;     565                          	 
;     566                          	} 
;     567                          
;     568                            Vtimer =  // à compléter; //calcul de la valeur initiale du timer1
;     569                          
;     570                            sprintf(display_buffer_ligne0,"DEDIT = %-u%-u.%-uml/h",dizaines,unites,diziemes);
	PUSH R28
	RCALL SUBOPT_0x1
	__POINTW1FN _37,28
	ST   -Y,R31
	ST   -Y,R30
	ST   -Y,R21
	ST   -Y,R20
	RCALL SUBOPT_0x5
	RCALL SUBOPT_0x5
	RCALL _sprintf
	ADIW R28,9
	__PUTW1R 4,5
;     571                            sprintf(display_buffer_ligne1,"Echap -> STOP");
	PUSH R28
	RCALL SUBOPT_0x2
	__POINTW1FN _37,51
	ST   -Y,R31
	ST   -Y,R30
	RCALL _sprintf
	RCALL SUBOPT_0x3
;     572                            Affiche_LCD(display_buffer_ligne0,display_buffer_ligne1);
	RCALL SUBOPT_0x4
;     573                            TIMSK=0x04; // autorisation interruption débordement sur timer1
	LDI  R30,LOW(4)
	OUT  0x39,R30
;     574                          
;     575                         }
;     576        		      if (BP==ECHAP) etat = Arret;
_0x36:
	CPI  R18,59
	BRNE _0x3A
	LDI  R16,LOW(0)
;     577                       		else etat = Marche; 
	RJMP _0x3B
_0x3A:
	LDI  R16,LOW(1)
_0x3B:
;     578                       		
;     579                       etat_1 = Marche;
	LDI  R17,LOW(1)
;     580        break;
	RJMP _0x2C
;     581                       
;     582        case ReglageDebit: if (etat_1 != etat)
_0x35:
	CPI  R30,LOW(0x2)
	BRNE _0x3C
	CP   R16,R17
	BREQ _0x3D
;     583                           { 
;     584                             Regdebit(&dizaines, &unites, &diziemes);
	LDI  R30,LOW(20)
	ST   -Y,R30
	MOV  R30,R28
	SUBI R30,-(5)
	RCALL SUBOPT_0x6
	RCALL _Regdebit
;     585                             sprintf(display_buffer_ligne0,"Echap -> Arret");
	PUSH R28
	RCALL SUBOPT_0x1
	__POINTW1FN _37,65
	ST   -Y,R31
	ST   -Y,R30
	RCALL _sprintf
	ADIW R28,3
;     586                             sprintf(display_buffer_ligne1,"SET   -> RUN");
	PUSH R28
	RCALL SUBOPT_0x2
	__POINTW1FN _37,80
	ST   -Y,R31
	ST   -Y,R30
	RCALL _sprintf
	RCALL SUBOPT_0x3
;     587                             Affiche_LCD(display_buffer_ligne0,display_buffer_ligne1);
	RCALL SUBOPT_0x4
;     588                           }
;     589        		      
;     590                       	  if (BP==ECHAP) etat = Arret;
_0x3D:
	CPI  R18,59
	BRNE _0x3E
	LDI  R16,LOW(0)
;     591                       		else if (BP == SET) etat = Marche;
	RJMP _0x3F
_0x3E:
	CPI  R18,61
	BRNE _0x40
	LDI  R16,LOW(1)
;     592                       		              else etat = ReglageDebit;
	RJMP _0x41
_0x40:
	LDI  R16,LOW(2)
_0x41:
_0x3F:
;     593                       
;     594                           etat_1 = ReglageDebit;
	LDI  R17,LOW(2)
;     595        break;
	RJMP _0x2C
;     596        
;     597        case ChoixSeringue: if (etat_1 != etat)
_0x3C:
	CPI  R30,LOW(0x3)
	BRNE _0x2C
	CP   R16,R17
	BREQ _0x43
;     598                             {
;     599                             	seringue = Select_Seringue();
	RCALL _Select_Seringue
	MOV  R19,R30
;     600                          
;     601                          	switch(seringue)
	MOV  R30,R19
;     602                          	{
;     603                          	 case 1 : sprintf(display_buffer_ligne0,"Srg=TERUMO 50CC"); break;
	CPI  R30,LOW(0x1)
	BRNE _0x47
	PUSH R28
	RCALL SUBOPT_0x1
	__POINTW1FN _37,93
	ST   -Y,R31
	ST   -Y,R30
	RCALL _sprintf
	ADIW R28,3
	RJMP _0x46
;     604                          	 case 2 : sprintf(display_buffer_ligne0,"Srg=MONO/BD 50CC"); break;
_0x47:
	CPI  R30,LOW(0x2)
	BRNE _0x48
	PUSH R28
	RCALL SUBOPT_0x1
	__POINTW1FN _37,109
	ST   -Y,R31
	ST   -Y,R30
	RCALL _sprintf
	ADIW R28,3
	RJMP _0x46
;     605                          	 case 3 : sprintf(display_buffer_ligne0,"Seringue=BD 20CC"); break;
_0x48:
	CPI  R30,LOW(0x3)
	BRNE _0x46
	PUSH R28
	RCALL SUBOPT_0x1
	__POINTW1FN _37,126
	ST   -Y,R31
	ST   -Y,R30
	RCALL _sprintf
	ADIW R28,3
;     606                          	}
_0x46:
;     607                          	sprintf(display_buffer_ligne1,"echp>Arr OK>RG_D"); 
	PUSH R28
	RCALL SUBOPT_0x2
	__POINTW1FN _37,143
	ST   -Y,R31
	ST   -Y,R30
	RCALL _sprintf
	RCALL SUBOPT_0x3
;     608                          	Affiche_LCD(display_buffer_ligne0,display_buffer_ligne1);
	RCALL SUBOPT_0x4
;     609                          	
;     610                             } 
;     611                             if (BP==ECHAP) etat = Arret;
_0x43:
	CPI  R18,59
	BRNE _0x4A
	LDI  R16,LOW(0)
;     612                       		else if (BP == OK) etat = ReglageDebit;
	RJMP _0x4B
_0x4A:
	CPI  R18,55
	BRNE _0x4C
	LDI  R16,LOW(2)
;     613                       		              else etat = ChoixSeringue;
	RJMP _0x4D
_0x4C:
	LDI  R16,LOW(3)
_0x4D:
_0x4B:
;     614                             etat_1 = ChoixSeringue;
	LDI  R17,LOW(3)
;     615        break;
;     616       }
_0x2C:
;     617 
;     618    };
	RJMP _0x27
;     619 }
	ADIW R28,44
_0x4E:
	RJMP _0x4E
_Lire_BP:

	.DSEG

	.CSEG
	RCALL __SAVELOCR2
	IN   R17,25
	ANDI R17,LOW(63)
	MOV  R30,R7
	CPI  R30,LOW(0x1)
	BRNE _0x53
	CPI  R17,63
	BRNE _0x54
	MOV  R16,R17
	RCALL SUBOPT_0x7
	IN   R17,25
	ANDI R17,LOW(63)
	CP   R17,R16
	BRNE _0x55
	CLR  R7
	LDI  R30,LOW(255)
	RJMP _0x109
_0x55:
	CLR  R30
	RJMP _0x109
	RJMP _0x57
_0x54:
	CLR  R30
	RJMP _0x109
_0x57:
	RJMP _0x52
_0x53:
	CPI  R30,0
	BRNE _0x52
	CPI  R17,63
	BREQ _0x59
	MOV  R16,R17
	RCALL SUBOPT_0x7
	IN   R17,25
	ANDI R17,LOW(63)
	CP   R17,R16
	BRNE _0x5A
	LDI  R30,LOW(1)
	MOV  R7,R30
	MOV  R30,R17
	RJMP _0x109
_0x5A:
	LDI  R30,LOW(255)
	RJMP _0x109
	RJMP _0x5C
_0x59:
	LDI  R30,LOW(255)
_0x5C:
_0x52:
_0x109:
	RCALL __LOADLOCR2P
	RET
_Affiche_LCD:
	RCALL _lcd_clear
	LDD  R30,Y+1
	RCALL SUBOPT_0x8
	RCALL SUBOPT_0x9
	RCALL SUBOPT_0xA
	RCALL _lcd_gotoxy
	LD   R30,Y
	RCALL SUBOPT_0x8
	ADIW R28,2
	RET
_Regdebit:
	SBIW R28,43
	LDI  R24,2
	LDI  R26,LOW(40)
	LDI  R27,HIGH(40)
	LDI  R30,LOW(_0x5F*2)
	LDI  R31,HIGH(_0x5F*2)
	RCALL __INITLOCB
_0x60:
	RCALL _Lire_BP
	STD  Y+42,R30
	LDD  R30,Y+41
	CPI  R30,0
	BREQ PC+2
	RJMP _0x66
	RCALL SUBOPT_0xB
	CPI  R30,LOW(0xFFFF)
	LDI  R26,HIGH(0xFFFF)
	CPC  R31,R26
	BRNE _0x67
	LDD  R26,Y+45
	RCALL SUBOPT_0xC
	RJMP _0x68
_0x67:
	RCALL SUBOPT_0xB
	CPI  R30,LOW(0xA)
	LDI  R26,HIGH(0xA)
	CPC  R31,R26
	BRNE _0x69
	LDD  R26,Y+45
	RCALL SUBOPT_0xD
_0x69:
_0x68:
	RCALL SUBOPT_0xB
	LDD  R26,Y+38
	LDD  R27,Y+38+1
	CP   R30,R26
	CPC  R31,R27
	BRNE _0x6B
	RCALL SUBOPT_0xE
	BREQ _0x6A
_0x6B:
	PUSH R28
	RCALL SUBOPT_0xF
	__POINTW1FN _94,0
	ST   -Y,R31
	ST   -Y,R30
	RCALL _sprintf
	ADIW R28,3
	PUSH R28
	RCALL SUBOPT_0x10
	__POINTW1FN _94,17
	RCALL SUBOPT_0x11
	RCALL _sprintf
	RCALL SUBOPT_0x12
	RCALL SUBOPT_0x13
	RCALL SUBOPT_0xB
	STD  Y+38,R30
	STD  Y+38+1,R31
_0x6A:
	RCALL SUBOPT_0x14
	BRNE _0x70
	RCALL SUBOPT_0xB
	ADIW R30,1
	RCALL SUBOPT_0x15
	RJMP _0x6F
_0x70:
	CPI  R30,LOW(0x2F)
	BRNE _0x71
	RCALL SUBOPT_0xB
	SBIW R30,1
	RCALL SUBOPT_0x15
	RJMP _0x6F
_0x71:
	CPI  R30,LOW(0x37)
	BRNE _0x72
	LDI  R30,LOW(1)
	RJMP _0x10A
_0x72:
	CPI  R30,LOW(0x3E)
	BRNE _0x74
	LDI  R30,LOW(3)
	RJMP _0x10A
_0x74:
	CLR  R30
_0x10A:
	STD  Y+41,R30
_0x6F:
	CLR  R30
	STD  Y+40,R30
	RJMP _0x65
_0x66:
	CPI  R30,LOW(0x1)
	BREQ PC+2
	RJMP _0x75
	RCALL SUBOPT_0x16
	CPI  R30,LOW(0xFFFF)
	LDI  R26,HIGH(0xFFFF)
	CPC  R31,R26
	BRNE _0x76
	LDD  R26,Y+44
	RCALL SUBOPT_0xC
	RJMP _0x77
_0x76:
	RCALL SUBOPT_0x16
	CPI  R30,LOW(0xA)
	LDI  R26,HIGH(0xA)
	CPC  R31,R26
	BRNE _0x78
	LDD  R26,Y+44
	RCALL SUBOPT_0xD
_0x78:
_0x77:
	RCALL SUBOPT_0x16
	LDD  R26,Y+36
	LDD  R27,Y+36+1
	CP   R30,R26
	CPC  R31,R27
	BRNE _0x7A
	RCALL SUBOPT_0xE
	BREQ _0x79
_0x7A:
	PUSH R28
	RCALL SUBOPT_0xF
	__POINTW1FN _94,39
	ST   -Y,R31
	ST   -Y,R30
	RCALL _sprintf
	ADIW R28,3
	PUSH R28
	RCALL SUBOPT_0x10
	__POINTW1FN _94,56
	RCALL SUBOPT_0x11
	RCALL _sprintf
	RCALL SUBOPT_0x12
	RCALL SUBOPT_0x13
	RCALL SUBOPT_0x16
	STD  Y+36,R30
	STD  Y+36+1,R31
_0x79:
	RCALL SUBOPT_0x14
	BRNE _0x7F
	RCALL SUBOPT_0x16
	ADIW R30,1
	RCALL SUBOPT_0x17
	RJMP _0x7E
_0x7F:
	CPI  R30,LOW(0x2F)
	BRNE _0x80
	RCALL SUBOPT_0x16
	SBIW R30,1
	RCALL SUBOPT_0x17
	RJMP _0x7E
_0x80:
	CPI  R30,LOW(0x37)
	BRNE _0x81
	LDI  R30,LOW(2)
	RJMP _0x10B
_0x81:
	CPI  R30,LOW(0x3E)
	BRNE _0x83
	LDI  R30,LOW(3)
	RJMP _0x10B
_0x83:
	LDI  R30,LOW(1)
_0x10B:
	STD  Y+41,R30
_0x7E:
	LDI  R30,LOW(1)
	STD  Y+40,R30
	RJMP _0x65
_0x75:
	CPI  R30,LOW(0x2)
	BREQ PC+2
	RJMP _0x84
	RCALL SUBOPT_0x18
	CPI  R30,LOW(0xFFFF)
	LDI  R26,HIGH(0xFFFF)
	CPC  R31,R26
	BRNE _0x85
	LDD  R26,Y+43
	RCALL SUBOPT_0xC
	RJMP _0x86
_0x85:
	RCALL SUBOPT_0x18
	CPI  R30,LOW(0xA)
	LDI  R26,HIGH(0xA)
	CPC  R31,R26
	BRNE _0x87
	LDD  R26,Y+43
	RCALL SUBOPT_0xD
_0x87:
_0x86:
	RCALL SUBOPT_0x18
	LDD  R26,Y+34
	LDD  R27,Y+34+1
	CP   R30,R26
	CPC  R31,R27
	BRNE _0x89
	RCALL SUBOPT_0xE
	BREQ _0x88
_0x89:
	PUSH R28
	RCALL SUBOPT_0xF
	__POINTW1FN _94,78
	ST   -Y,R31
	ST   -Y,R30
	RCALL _sprintf
	ADIW R28,3
	PUSH R28
	RCALL SUBOPT_0x10
	__POINTW1FN _94,95
	RCALL SUBOPT_0x11
	RCALL _sprintf
	RCALL SUBOPT_0x12
	RCALL SUBOPT_0x13
	RCALL SUBOPT_0x18
	STD  Y+34,R30
	STD  Y+34+1,R31
_0x88:
	RCALL SUBOPT_0x14
	BRNE _0x8E
	RCALL SUBOPT_0x18
	ADIW R30,1
	RCALL SUBOPT_0x19
	RJMP _0x8D
_0x8E:
	CPI  R30,LOW(0x2F)
	BRNE _0x8F
	RCALL SUBOPT_0x18
	SBIW R30,1
	RCALL SUBOPT_0x19
	RJMP _0x8D
_0x8F:
	CPI  R30,LOW(0x37)
	BRNE _0x90
	CLR  R30
	RJMP _0x10C
_0x90:
	CPI  R30,LOW(0x3E)
	BRNE _0x92
	LDI  R30,LOW(3)
	RJMP _0x10C
_0x92:
	LDI  R30,LOW(2)
_0x10C:
	STD  Y+41,R30
_0x8D:
	LDI  R30,LOW(2)
	STD  Y+40,R30
	RJMP _0x65
_0x84:
	CPI  R30,LOW(0x3)
	BRNE _0x65
	CLR  R30
	CLR  R31
	RJMP _0x108
_0x65:
	RJMP _0x60
_0x108:
	ADIW R28,46
	RET
_Select_Seringue:
	SBIW R28,34
	RCALL __SAVELOCR3
_0x95:
	RCALL SUBOPT_0x0
	CPI  R16,0
	BRNE _0x98
	LDI  R16,LOW(3)
	RJMP _0x99
_0x98:
	CPI  R16,4
	BRNE _0x9A
	LDI  R16,LOW(1)
_0x9A:
_0x99:
	CP   R16,R17
	BREQ _0x9B
	PUSH R28
	MOV  R30,R28
	SUBI R30,-(20)
	ST   -Y,R30
	__POINTW1FN _148,0
	ST   -Y,R31
	ST   -Y,R30
	RCALL _sprintf
	ADIW R28,3
	MOV  R30,R16
	CPI  R30,LOW(0x1)
	BRNE _0x9F
	PUSH R28
	RCALL SUBOPT_0x1A
	__POINTW1FN _148,17
	ST   -Y,R31
	ST   -Y,R30
	RCALL _sprintf
	ADIW R28,3
	RJMP _0x9E
_0x9F:
	CPI  R30,LOW(0x2)
	BRNE _0xA0
	PUSH R28
	RCALL SUBOPT_0x1A
	__POINTW1FN _148,33
	ST   -Y,R31
	ST   -Y,R30
	RCALL _sprintf
	ADIW R28,3
	RJMP _0x9E
_0xA0:
	CPI  R30,LOW(0x3)
	BRNE _0x9E
	PUSH R28
	RCALL SUBOPT_0x1A
	__POINTW1FN _148,49
	ST   -Y,R31
	ST   -Y,R30
	RCALL _sprintf
	ADIW R28,3
_0x9E:
	MOV  R30,R28
	SUBI R30,-(20)
	RCALL SUBOPT_0x6
	RCALL _Affiche_LCD
	MOV  R17,R16
_0x9B:
	MOV  R30,R18
	CPI  R30,LOW(0x1F)
	BRNE _0xA5
	SUBI R16,-LOW(1)
	RJMP _0xA4
_0xA5:
	CPI  R30,LOW(0x2F)
	BRNE _0xA6
	SUBI R16,LOW(1)
	RJMP _0xA4
_0xA6:
	CPI  R30,LOW(0x37)
	BRNE _0xA4
	MOV  R30,R16
	RJMP _0x107
_0xA4:
	RJMP _0x95
_0x107:
	RCALL __LOADLOCR3
	ADIW R28,37
	RET
_getchar:
     sbis usr,rxc
     rjmp _getchar
     in   r30,udr
	RET
_putchar:
     sbis usr,udre
     rjmp _putchar
     ld   r30,y
     out  udr,r30
	ADIW R28,1
	RET

	.DSEG
_cc_G3:
	.BYTE 0x1
_pp_G3:
	.BYTE 0x1

	.CSEG

	.DSEG
__base_y:
	.BYTE 0x4
    .equ __lcd_direction=__lcd_port-1
    .equ __lcd_pin=__lcd_port-2
    .equ __lcd_rs=0
    .equ __lcd_rd=1
    .equ __lcd_enable=2
    .equ __lcd_busy_flag=7

	.CSEG
__lcd_ready:
    in    r26,__lcd_direction
    andi  r26,0xf                 ;set as input
    out   __lcd_direction,r26
    sbi   __lcd_port,__lcd_rd     ;RD=1
    cbi   __lcd_port,__lcd_rs     ;RS=0
__lcd_busy:
    rcall __lcd_delay
    sbi   __lcd_port,__lcd_enable ;EN=1
    rcall __lcd_delay
    sbic  __lcd_pin,__lcd_busy_flag
    rjmp  __lcd_busy
    cbi   __lcd_port,__lcd_enable ;EN=0
	RET
__lcd_write_nibble:
    andi  r26,0xf0
    or    r26,r27
    out   __lcd_port,r26          ;write
    sbi   __lcd_port,__lcd_enable ;EN=1
    rcall __lcd_delay
    cbi   __lcd_port,__lcd_enable ;EN=0
__lcd_delay:
    nop
    nop
    nop
    nop
    nop
    nop
    ret
__lcd_write_data:
    cbi  __lcd_port,__lcd_rd 	  ;RD=0
    in    r26,__lcd_direction
    ori   r26,0xf7                ;set as output
    out   __lcd_direction,r26
    in    r27,__lcd_port
    andi  r27,0xf
    ld    r26,y
    rcall __lcd_write_nibble      ;RD=0, write MSN
    ld    r26,y
    swap  r26
    rcall __lcd_write_nibble      ;write LSN
    sbi   __lcd_port,__lcd_rd     ;RD=1
	ADIW R28,1
	RET
_lcd_gotoxy:
	RCALL __lcd_ready
	LD   R30,Y
	SUBI R30,-LOW(__base_y)
	LD   R30,Z
	LDD  R26,Y+1
	ADD  R30,R26
	RCALL SUBOPT_0x1B
	LDD  R8,Y+1
	LDD  R9,Y+0
	ADIW R28,2
	RET
_lcd_clear:
	RCALL __lcd_ready
	LDI  R30,LOW(12)
	RCALL SUBOPT_0x1B
	RCALL __lcd_ready
	RCALL SUBOPT_0xA
	RCALL __lcd_write_data
	CLR  R30
	MOV  R9,R30
	MOV  R8,R30
	RET
_lcd_putchar:
    push r30
    push r31
    ld   r26,y
    set
    cpi  r26,10
    breq __lcd_putchar1
    clt
	INC  R8
	CP   R10,R8
	BRSH _0x103
	__lcd_putchar1:
	INC  R9
	RCALL SUBOPT_0x9
	ST   -Y,R9
	RCALL _lcd_gotoxy
	brts __lcd_putchar0
_0x103:
    rcall __lcd_ready
    sbi  __lcd_port,__lcd_rs ;RS=1
    ld   r26,y
    st   -y,r26
    rcall __lcd_write_data
__lcd_putchar0:
    pop  r31
    pop  r30
	ADIW R28,1
	RET
_lcd_puts:
    clr  r31
    ld   r30,y
__lcd_puts0:
    ld   r26,z+
    tst  r26
    breq __lcd_puts1
    st   -y,r26    
    rcall _lcd_putchar
    rjmp __lcd_puts0
__lcd_puts1:
	ADIW R28,1
	RET
__long_delay:
    clr   r26
    clr   r27
__long_delay0:
    sbiw  r26,1         ;2 cycles
    brne  __long_delay0 ;2 cycles
	RET
_lcd_init:
    cbi   __lcd_port,__lcd_enable ;EN=0
    cbi   __lcd_port,__lcd_rs     ;RS=0
	LDD  R10,Y+0
	LD   R30,Y
	SUBI R30,-LOW(128)
	__PUTB1MN __base_y,2
	LD   R30,Y
	SUBI R30,-LOW(192)
	__PUTB1MN __base_y,3
	RCALL SUBOPT_0x1C
	RCALL SUBOPT_0x1C
	RCALL SUBOPT_0x1C
	RCALL __long_delay
	LDI  R30,LOW(32)
	RCALL SUBOPT_0x1B
	RCALL __lcd_ready
	LDI  R30,LOW(40)
	RCALL SUBOPT_0x1B
	RCALL __lcd_ready
	LDI  R30,LOW(6)
	RCALL SUBOPT_0x1B
	RCALL _lcd_clear
	ADIW R28,1
	RET

;OPTIMIZER ADDED SUBROUTINE, CALLED 2 TIMES
SUBOPT_0x0:
	RCALL _Lire_BP
	MOV  R18,R30
	RET

;OPTIMIZER ADDED SUBROUTINE, CALLED 10 TIMES
SUBOPT_0x1:
	MOV  R30,R28
	SUBI R30,-(27)
	ST   -Y,R30
	RET

;OPTIMIZER ADDED SUBROUTINE, CALLED 4 TIMES
SUBOPT_0x2:
	MOV  R30,R28
	SUBI R30,-(10)
	ST   -Y,R30
	RET

;OPTIMIZER ADDED SUBROUTINE, CALLED 4 TIMES
SUBOPT_0x3:
	ADIW R28,3
	RJMP SUBOPT_0x1

;OPTIMIZER ADDED SUBROUTINE, CALLED 4 TIMES
SUBOPT_0x4:
	MOV  R30,R28
	SUBI R30,-(11)
	ST   -Y,R30
	RJMP _Affiche_LCD

;OPTIMIZER ADDED SUBROUTINE, CALLED 2 TIMES
SUBOPT_0x5:
	LDD  R30,Y+9
	LDD  R31,Y+9+1
	ST   -Y,R31
	ST   -Y,R30
	RET

;OPTIMIZER ADDED SUBROUTINE, CALLED 2 TIMES
SUBOPT_0x6:
	ST   -Y,R30
	MOV  R30,R28
	SUBI R30,-(4)
	ST   -Y,R30
	RET

;OPTIMIZER ADDED SUBROUTINE, CALLED 2 TIMES
SUBOPT_0x7:
	LDI  R30,LOW(20)
	LDI  R31,HIGH(20)
	ST   -Y,R31
	ST   -Y,R30
	RJMP _delay_ms

;OPTIMIZER ADDED SUBROUTINE, CALLED 2 TIMES
SUBOPT_0x8:
	ST   -Y,R30
	RJMP _lcd_puts

;OPTIMIZER ADDED SUBROUTINE, CALLED 2 TIMES
SUBOPT_0x9:
	CLR  R30
	ST   -Y,R30
	RET

;OPTIMIZER ADDED SUBROUTINE, CALLED 2 TIMES
SUBOPT_0xA:
	LDI  R30,LOW(1)
	ST   -Y,R30
	RET

;OPTIMIZER ADDED SUBROUTINE, CALLED 6 TIMES
SUBOPT_0xB:
	LDD  R26,Y+45
	RCALL __GETW1P
	RET

;OPTIMIZER ADDED SUBROUTINE, CALLED 3 TIMES
SUBOPT_0xC:
	LDI  R30,LOW(9)
	LDI  R31,HIGH(9)
	RCALL __PUTWP1
	RET

;OPTIMIZER ADDED SUBROUTINE, CALLED 3 TIMES
SUBOPT_0xD:
	CLR  R30
	CLR  R31
	RCALL __PUTWP1
	RET

;OPTIMIZER ADDED SUBROUTINE, CALLED 3 TIMES
SUBOPT_0xE:
	LDD  R30,Y+41
	LDD  R26,Y+40
	CP   R30,R26
	RET

;OPTIMIZER ADDED SUBROUTINE, CALLED 6 TIMES
SUBOPT_0xF:
	MOV  R30,R28
	SUBI R30,-(17)
	ST   -Y,R30
	RET

;OPTIMIZER ADDED SUBROUTINE, CALLED 3 TIMES
SUBOPT_0x10:
	MOV  R30,R28
	ST   -Y,R30
	RET

;OPTIMIZER ADDED SUBROUTINE, CALLED 3 TIMES
SUBOPT_0x11:
	ST   -Y,R31
	ST   -Y,R30
	LDD  R26,Y+48
	RCALL __GETW1P
	ST   -Y,R31
	ST   -Y,R30
	LDD  R26,Y+49
	RCALL __GETW1P
	ST   -Y,R31
	ST   -Y,R30
	LDD  R26,Y+50
	RCALL __GETW1P
	ST   -Y,R31
	ST   -Y,R30
	RET

;OPTIMIZER ADDED SUBROUTINE, CALLED 3 TIMES
SUBOPT_0x12:
	ADIW R28,9
	RJMP SUBOPT_0xF

;OPTIMIZER ADDED SUBROUTINE, CALLED 3 TIMES
SUBOPT_0x13:
	MOV  R30,R28
	SUBI R30,-(1)
	ST   -Y,R30
	RJMP _Affiche_LCD

;OPTIMIZER ADDED SUBROUTINE, CALLED 3 TIMES
SUBOPT_0x14:
	LDD  R30,Y+42
	CPI  R30,LOW(0x1F)
	RET

;OPTIMIZER ADDED SUBROUTINE, CALLED 2 TIMES
SUBOPT_0x15:
	LDD  R26,Y+45
	RCALL __PUTWP1
	RET

;OPTIMIZER ADDED SUBROUTINE, CALLED 6 TIMES
SUBOPT_0x16:
	LDD  R26,Y+44
	RCALL __GETW1P
	RET

;OPTIMIZER ADDED SUBROUTINE, CALLED 2 TIMES
SUBOPT_0x17:
	LDD  R26,Y+44
	RCALL __PUTWP1
	RET

;OPTIMIZER ADDED SUBROUTINE, CALLED 6 TIMES
SUBOPT_0x18:
	LDD  R26,Y+43
	RCALL __GETW1P
	RET

;OPTIMIZER ADDED SUBROUTINE, CALLED 2 TIMES
SUBOPT_0x19:
	LDD  R26,Y+43
	RCALL __PUTWP1
	RET

;OPTIMIZER ADDED SUBROUTINE, CALLED 3 TIMES
SUBOPT_0x1A:
	MOV  R30,R28
	SUBI R30,-(3)
	ST   -Y,R30
	RET

;OPTIMIZER ADDED SUBROUTINE, CALLED 8 TIMES
SUBOPT_0x1B:
	ST   -Y,R30
	RJMP __lcd_write_data

;OPTIMIZER ADDED SUBROUTINE, CALLED 3 TIMES
SUBOPT_0x1C:
	RCALL __long_delay
	LDI  R30,LOW(48)
	RJMP SUBOPT_0x1B

_isdigit:
	ldi  r30,1
	ld   r31,y+
	cpi  r31,'0'
	brlo __isdigit0
	cpi  r31,'9'+1
	brlo __isdigit1
__isdigit0:
	clr  r30
__isdigit1:
	ret

_isspace:
	ldi  r30,1
	ld   r31,y+
	cpi  r31,' '
	breq __isspace1
	cpi  r31,9
	breq __isspace1
	cpi  r31,13
	breq __isspace1
	clr  r30
__isspace1:
	ret

_sprintf:
	pop  r31
	pop  r30
	pop  r26
	clr  r27
	push r30
	push r31
	ld   r30,-x
	st   -y,r30
	ld   r31,-x
	ld   r30,-x
	ser  r23
__sprintf0:
	tst  r23
	brmi __sprintf9
	breq __sprintf9
	ldi  r22,' '
	rcall __sprintf_char
	rjmp __sprintf0
__sprintf9:
	ldi  r24,' '
	clr  r25
__sprintf5:
	lpm
	adiw r30,1
	mov  r22,r0
	tst  r22
	brne __sprintf1
	rcall __sprintf_char0
	adiw r28,1
	ret
__sprintf1:
	sbrc r25,0
	rjmp __sprintf3
	cpi  r22,'%'
	breq __sprintf2
__sprintf11:
	rcall __sprintf_char0
	rjmp __sprintf0
__sprintf2:
	sbr  r25,1
	rjmp __sprintf5
__sprintf3:
	cpi  r22,'%'
	brne __sprintf8
	rjmp __sprintf11
__sprintf8:
	cpi  r22,'-'
	brne __sprintf6
__sprintf10:
	sbr  r25,2
	rjmp __sprintf5
__sprintf6:
	cpi  r22,'0'
	brne __sprintf4
	sbrc r25,1
	rjmp __sprintf5
	mov  r24,r22
	rjmp __sprintf5
__sprintf4:
	cpi  r22,'9'+1
	brsh __sprintf7
	subi r22,'0'
	brlo __sprintf7
	cpi  r22,1
	breq __sprintf10
	mov  r23,r22
	rjmp __sprintf5
__sprintf7:
	cpi  r22,'s'
	breq __sprintfs
	cpi  r22,'c'
	breq __sprintfc
	cpi  r22,'d'
	breq __sprintfi
	cpi  r22,'i'
	breq __sprintfi
	cpi  r22,'u'
	breq __sprintfu
	cpi  r22,'X'
	breq __sprintfx1
	cpi  r22,'x'
	brne __sprintf2
	sbr  r25,8
__sprintfx1:
	rjmp __sprintfx
__sprintfs:
	mov  r0,r30
	mov  r1,r31
	ld   r30,-x
	clr  r31
__sprintfs0:
	ld   r22,z+
	tst  r22
	breq __sprintfs1
	rcall __sprintf_char0
	rjmp __sprintfs0
__sprintfs1:
	mov  r30,r0
	mov  r31,r1
	rjmp __sprintf0
__sprintfc:
	sbiw r26,2
	ld   r22,x
	rjmp __sprintf11
__sprintfi:
	ldi  r22,7
	rcall __sprintf_pad0
	sbr  r25,4
	ld   r1,-x
	ld   r0,-x
	push r26
	push r27
	ldi  r26,1
	clr  r27
	cp   r0,r27
	cpc  r1,r27
	brpl __sprintfi0
	com  r0
	com  r1
	add  r0,r26
	adc  r1,r27
	sbr  r25,0x80
	rjmp __sprintfi0
__sprintfu:
	ldi  r22,6
	rcall __sprintf_pad0
	ld   r1,-x
	ld   r0,-x
	push r26
	push r27
__sprintfi0:
	push r30
	ldi  r26,low(10000)
	ldi  r27,high(10000)
	ldi  r30,6
	sbrc r25,2
	inc  r30
	rcall __sprintfu0
	ldi  r26,low(1000)
	ldi  r27,high(1000)
	rcall __sprintfu0
	ldi  r26,100
	clr  r27
	rcall __sprintfu0
	ldi  r26,10
	rcall __sprintfu0
	mov  r22,r0
	pop  r30
	pop  r27
	pop  r26
	rcall __sprintf_digit0
	rjmp __sprintf0
__sprintfx:
	cpi  r23,0xff
	brne __sprintfx2
	cpi  r24,' '
	brne __sprintfx2
	sbr  r25,2
__sprintfx2:
	ldi  r22,5
	rcall __sprintf_pad0
	push r30
	ldi  r30,5
	ld   r22,-x
	rcall __sprintf_xbyte
	ld   r22,-x
	sbr  r25,0x40
	rcall __sprintf_xbyte
	pop  r30
	rjmp __sprintf0
__sprintf_xbyte:
	mov  r0,r22
	swap r22
	rcall __sprintf_xnibble
	mov  r22,r0
	sbrc r25,6
	sbr  r25,0x20
__sprintf_xnibble:
	andi r22,0xf
__sprintf_digit:
	dec  r30
	tst  r22
	brne __sprintf_digit0
	cp   r23,r30
	sbrs r25,4
	brlo __sprintf_left0
	sbrc r25,5
	rjmp __sprintf_digit4
	sbrc r25,1
	rjmp __sprintf_left
	cpi  r24,'0'
	brne __sprintf_pad
	sbrs r25,7
	rjmp __sprintf_pad
	dec  r30
	rcall __sprintf_minus
	rjmp __sprintf_pad
__sprintf_left:
	sbrs r25,7
__sprintf_left0:
	ret
__sprintf_minus:
	cbr  r25,0x84
	ldi  r22,'-'
	rjmp __sprintf_char
__sprintf_pad:
	mov  r22,r24
	rjmp __sprintf_char
__sprintf_digit0:
	sbr  r25,0x10
	sbrs r25,2
	rjmp __sprintf_digit1
	cbr  r25,4
	push r22
	sbrs r25,7
	rjmp __sprintf_digit3
	rcall __sprintf_minus
	rjmp __sprintf_digit2
__sprintf_digit3:
	sbrc r25,1
	rjmp __sprintf_digit2
	rcall __sprintf_pad
__sprintf_digit2:
	pop  r22
__sprintf_digit1:
	cbr  r25,2
	ldi  r24,'0'
__sprintf_digit4:
	subi r22,-0x30
	cpi  r22,'9'+1
	brlo __sprintf_char
	subi r22,-7
	sbrc r25,3
	sbr  r22,0x20
__sprintf_char:
	tst  r23
	brmi __sprintf_char0
	dec  r23
__sprintf_char0:
	push r26
	push r27
	ld   r26,y
	clr  r27
	st   x+,r22
	st   y,r26
	pop  r27
	pop  r26
	ret
__sprintfu0:
	clr  r22
__sprintfu1:
	cp   r0,r26
	cpc  r1,r27
	brlo __sprintf_digit
	inc  r22
	sub  r0,r26
	sbc  r1,r27
	brne __sprintfu1
	rjmp __sprintf_digit

__sprintf_pad0:
	sbrc r25,1
__sprintf_pad2:
	ret
	mov  r1,r22
__sprintf_pad1:
	cp   r23,r1
	brlt __sprintf_pad2
	rcall __sprintf_pad
	rjmp __sprintf_pad1

_delay_ms:
	ld   r30,y+
	ld   r31,y+
	adiw r30,0
	breq __delay_ms1
__delay_ms0:
	__DELAY_USW 0x3E8
	wdr
	sbiw r30,1
	brne __delay_ms0
__delay_ms1:
	ret

__SAVEISR:
	ST   -Y,R0
	ST   -Y,R1
	ST   -Y,R22
	ST   -Y,R23
	ST   -Y,R24
	ST   -Y,R25
	ST   -Y,R26
	ST   -Y,R27
	ST   -Y,R30
	ST   -Y,R31
	IN   R0,SREG
	ST   -Y,R0
	RET

__LOADISR:
	LD   R0,Y+
	OUT  SREG,R0
	LD   R31,Y+
	LD   R30,Y+
	LD   R27,Y+
	LD   R26,Y+
	LD   R25,Y+
	LD   R24,Y+
	LD   R23,Y+
	LD   R22,Y+
	LD   R1,Y+
	LD   R0,Y+
	RET

__MULW12U:
	MOV  R0,R26
	MOV  R1,R27
	LDI  R24,17
	CLR  R26
	SUB  R27,R27
	RJMP __MULW12U1
__MULW12U3:
	BRCC __MULW12U2
	ADD  R26,R0
	ADC  R27,R1
__MULW12U2:
	LSR  R27
	ROR  R26
__MULW12U1:
	ROR  R31
	ROR  R30
	DEC  R24
	BRNE __MULW12U3
	RET

__GETW1P:
	LD   R30,X+
	LD   R31,X
	SBIW R26,1
	RET

__PUTWP1:
	ST   X+,R30
	ST   X,R31
	RET

__SAVELOCR3:
	ST   -Y,R18
__SAVELOCR2:
	ST   -Y,R17
	ST   -Y,R16
	RET

__LOADLOCR3:
	LDD  R18,Y+2
__LOADLOCR2:
	LDD  R17,Y+1
	LD   R16,Y
	RET

__LOADLOCR2P:
	LD   R16,Y+
	LD   R17,Y+
	RET

__INITLOCB:
__INITLOCW:
	ADD R26,R28
__INITLOC0:
	LPM
	ADIW R30,1
	ST   X+,R0
	DEC  R24
	BRNE __INITLOC0
	RET

	.ORG 0x00

;INTERRUPT VECTORS
	RJMP __RESET
	RJMP 0
	RJMP 0
