2
0
Эх сурвалжийг харах

+ ATmega48/ATmega88 support

git-svn-id: trunk@30937 -
florian 10 жил өмнө
parent
commit
0cd521fc8b

+ 1 - 0
.gitattributes

@@ -8300,6 +8300,7 @@ rtl/embedded/arm/stm32f10x_xl.pp svneol=native#text/pascal
 rtl/embedded/arm/stm32f429.pp svneol=native#text/pascal
 rtl/embedded/arm/xmc4500.pp svneol=native#text/pascal
 rtl/embedded/avr/atmega128.pp svneol=native#text/plain
+rtl/embedded/avr/atmega48fam.pp svneol=native#text/plain
 rtl/embedded/avr/atmega8.pp svneol=native#text/plain
 rtl/embedded/avr/attinyx4.pp svneol=native#text/plain
 rtl/embedded/avr/avrcommon.inc svneol=native#text/plain

+ 36 - 22
compiler/avr/cpuinfo.pas

@@ -62,10 +62,12 @@ Type
       ct_attiny44,
       ct_attiny84,
 
+      ct_atmega48,
+      ct_atmega88,
+
       ct_atmega8,
       ct_atmega16,
       ct_atmega32,
-      ct_atmega48,
       ct_atmega64,
       ct_atmega128
      );
@@ -118,7 +120,7 @@ Const
    {$WARN 3177 OFF}
    embedded_controllers : array [tcontrollertype] of tcontrollerdatatype =
    ((
-   	controllertypestr:'';
+        controllertypestr:'';
         controllerunitstr:'';
         flashbase:0;
         flashsize:0;
@@ -126,8 +128,8 @@ Const
         sramsize:0;
         eeprombase:0;
         eepromsize:0
-   	),
-   	(
+        ),
+        (
         controllertypestr:'AVRSIM';
         controllerunitstr:'AVRSIM';
         flashbase:0;
@@ -138,7 +140,7 @@ Const
         eepromsize:4096;
         ),
         (
-   	controllertypestr:'ATTINY24';
+        controllertypestr:'ATTINY24';
         controllerunitstr:'ATTINYX4';
         flashbase:0;
         flashsize:2048;
@@ -148,7 +150,7 @@ Const
         eepromsize:128
         ),
         (
-   	controllertypestr:'ATTINY44';
+        controllertypestr:'ATTINY44';
         controllerunitstr:'ATTINYX4';
         flashbase:0;
         flashsize:4096;
@@ -158,7 +160,7 @@ Const
         eepromsize:256
         ),
         (
-   	controllertypestr:'ATTINY84';
+        controllertypestr:'ATTINY84';
         controllerunitstr:'ATTINYX4';
         flashbase:0;
         flashsize:8192;
@@ -167,8 +169,30 @@ Const
         eeprombase:0;
         eepromsize:512
         ),
+
+        (
+        controllertypestr:'ATMEGA48';
+        controllerunitstr:'ATMEGA48FAM';
+        flashbase:0;
+        flashsize:4*1024;
+        srambase:0;
+        sramsize:512;
+        eeprombase:0;
+        eepromsize:256;
+        ),
+        (
+        controllertypestr:'ATMEGA88';
+        controllerunitstr:'ATMEGA48FAM';
+        flashbase:0;
+        flashsize:8*1024;
+        srambase:0;
+        sramsize:1024;
+        eeprombase:0;
+        eepromsize:512;
+        ),
+
         (
-   	controllertypestr:'ATMEGA8';
+        controllertypestr:'ATMEGA8';
         controllerunitstr:'ATMEGA8';
         flashbase:0;
         flashsize:$2000;
@@ -178,7 +202,7 @@ Const
         eepromsize:512
         ),
         (
-   	controllertypestr:'ATMEGA16';
+        controllertypestr:'ATMEGA16';
         controllerunitstr:'ATMEGA16';
         flashbase:0;
         flashsize:$4000;
@@ -188,7 +212,7 @@ Const
         eepromsize:512
         ),
         (
-   	controllertypestr:'ATMEGA32';
+        controllertypestr:'ATMEGA32';
         controllerunitstr:'ATMEGA32';
         flashbase:0;
         flashsize:$8000;
@@ -197,17 +221,7 @@ Const
         eeprombase:0;
         eepromsize:512
         ),
-   	(
-        controllertypestr:'ATMEGA48';
-        controllerunitstr:'ATMEGA48';
-        flashbase:0;
-        flashsize:$1000;
-        srambase:0;
-        sramsize:512;
-        eeprombase:0;
-        eepromsize:256;
-        ),
-   	(
+        (
         controllertypestr:'ATMEGA64';
         controllerunitstr:'ATMEGA64';
         flashbase:0;
@@ -217,7 +231,7 @@ Const
         eeprombase:0;
         eepromsize:2048;
         ),
-   	(
+        (
         controllertypestr:'ATMEGA128';
         controllerunitstr:'ATMEGA128';
         flashbase:0;

+ 19 - 3
rtl/embedded/Makefile

@@ -1,8 +1,8 @@
 #
-# Don't edit, this file is generated by FPCMake Version 2.0.0 [2015-03-17 rev 30250]
+# Don't edit, this file is generated by FPCMake Version 2.0.0 [2015-05-20 rev 30890]
 #
 default: all
-MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-haiku i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian i386-nativent i386-iphonesim i386-android i386-aros m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macos powerpc-darwin powerpc-morphos powerpc-embedded powerpc-wii powerpc-aix sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-netbsd x86_64-solaris x86_64-openbsd x86_64-darwin x86_64-win64 x86_64-embedded x86_64-iphonesim x86_64-dragonfly arm-linux arm-palmos arm-darwin arm-wince arm-gba arm-nds arm-embedded arm-symbian arm-android powerpc64-linux powerpc64-darwin powerpc64-embedded powerpc64-aix avr-embedded armeb-linux armeb-embedded mips-linux mipsel-linux mipsel-embedded mipsel-android jvm-java jvm-android i8086-msdos aarch64-darwin
+MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-haiku i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian i386-nativent i386-iphonesim i386-android i386-aros m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macos powerpc-darwin powerpc-morphos powerpc-embedded powerpc-wii powerpc-aix sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-netbsd x86_64-solaris x86_64-openbsd x86_64-darwin x86_64-win64 x86_64-embedded x86_64-iphonesim x86_64-dragonfly arm-linux arm-palmos arm-darwin arm-wince arm-gba arm-nds arm-embedded arm-symbian arm-android powerpc64-linux powerpc64-darwin powerpc64-embedded powerpc64-aix avr-embedded armeb-linux armeb-embedded mips-linux mipsel-linux mipsel-embedded mipsel-android jvm-java jvm-android i8086-msdos aarch64-linux aarch64-darwin
 BSDs = freebsd netbsd openbsd darwin dragonfly
 UNIXs = linux $(BSDs) solaris qnx haiku aix
 LIMIT83fs = go32v2 os2 emx watcom msdos
@@ -369,7 +369,7 @@ CPU_UNITS=allwinner_a20
 endif
 endif
 ifeq ($(ARCH),avr)
-CPU_UNITS=atmega128 atmega8 avrsim attinyx4
+CPU_UNITS=atmega128 atmega8 avrsim attinyx4 atmega48fam
 endif
 ifeq ($(ARCH),i386)
 CPU_SPECIFIC_COMMON_UNITS=sysutils math classes fgl macpas typinfo types rtlconsts getopts lineinfo
@@ -617,6 +617,9 @@ endif
 ifeq ($(FULL_TARGET),i8086-msdos)
 override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 strings heapmgr consoleio $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
 endif
+ifeq ($(FULL_TARGET),aarch64-linux)
+override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 strings heapmgr consoleio $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
+endif
 ifeq ($(FULL_TARGET),aarch64-darwin)
 override TARGET_UNITS+=$(SYSTEMUNIT) $(CPU_UNITS) uuchar objpas iso7185 strings heapmgr consoleio $(CPU_SPECIFIC_COMMON_UNITS) dos ctypes charset cpall sysconst
 endif
@@ -854,6 +857,9 @@ endif
 ifeq ($(FULL_TARGET),i8086-msdos)
 override TARGET_LOADERS+=$(LOADERS)
 endif
+ifeq ($(FULL_TARGET),aarch64-linux)
+override TARGET_LOADERS+=$(LOADERS)
+endif
 ifeq ($(FULL_TARGET),aarch64-darwin)
 override TARGET_LOADERS+=$(LOADERS)
 endif
@@ -1092,6 +1098,9 @@ endif
 ifeq ($(FULL_TARGET),i8086-msdos)
 override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
 endif
+ifeq ($(FULL_TARGET),aarch64-linux)
+override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
+endif
 ifeq ($(FULL_TARGET),aarch64-darwin)
 override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
 endif
@@ -1329,6 +1338,9 @@ endif
 ifeq ($(FULL_TARGET),i8086-msdos)
 override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
 endif
+ifeq ($(FULL_TARGET),aarch64-linux)
+override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
+endif
 ifeq ($(FULL_TARGET),aarch64-darwin)
 override COMPILER_SOURCEDIR+=$(INC) $(PROCINC) $(COMMON) $(ARCH)
 endif
@@ -1727,6 +1739,10 @@ STATICLIBPREFIX=
 STATICLIBEXT=.a
 SHORTSUFFIX=d16
 endif
+ifeq ($(OS_TARGET),embedded)
+EXEEXT=.bin
+SHORTSUFFIX=emb
+endif
 ifneq ($(findstring $(OS_SOURCE),$(LIMIT83fs)),)
 FPCMADE=fpcmade.$(SHORTSUFFIX)
 ZIPSUFFIX=$(SHORTSUFFIX)

+ 1 - 1
rtl/embedded/Makefile.fpc

@@ -84,7 +84,7 @@ endif
 endif
 
 ifeq ($(ARCH),avr)
-CPU_UNITS=atmega128 atmega8 avrsim attinyx4
+CPU_UNITS=atmega128 atmega8 avrsim attinyx4 atmega48fam
 endif
 
 ifeq ($(ARCH),i386)

+ 667 - 0
rtl/embedded/avr/atmega48fam.pp

@@ -0,0 +1,667 @@
+{******************************************************************************
+Register definitions and startup code for ATMEL ATmega48/88
+
+******************************************************************************}
+unit atmega48fam;
+
+{$goto on}
+
+  interface
+
+    var
+      PINB    : byte absolute $23;
+      DDRB    : byte absolute $24;
+      PORTB   : byte absolute $25;
+      PINC    : byte absolute $26;
+      DDRC    : byte absolute $27;
+      PORTC   : byte absolute $28;
+      PIND    : byte absolute $29;
+      DDRD    : byte absolute $2A;
+      PORTD   : byte absolute $2B;
+      TIFR0   : byte absolute $35;
+      TIFR1   : byte absolute $36;
+      PCIFR   : byte absolute $3B;
+      EIFR    : byte absolute $3C;
+      EIMSK   : byte absolute $3D;
+      GPIOR0  : byte absolute $3E;
+      EECR    : byte absolute $3F;
+      EEDR    : byte absolute $40;
+      EEARL   : byte absolute $41;
+      EEARH   : byte absolute $42;
+      EEAR    : word absolute $41;
+      GTCCR   : byte absolute $43;
+      TCCR0A  : byte absolute $44;
+      TCCR0B  : byte absolute $45;
+      TCNT0   : byte absolute $46;
+      OCR0A   : byte absolute $47;
+      OCR0B   : byte absolute $48;
+      GPIOR1  : byte absolute $4A;
+      GPIOR2  : byte absolute $4B;
+      SPCR    : byte absolute $4C;
+      SPSR    : byte absolute $4D;
+      SPDR    : byte absolute $4E;
+      ACSR    : byte absolute $50;
+      SMCR    : byte absolute $53;
+      MCUSR   : byte absolute $54;
+      MCUCR   : byte absolute $55;
+      SPMCSR  : byte absolute $57;
+      SPL     : byte absolute $5D;
+      SPH     : byte absolute $5E;
+      SP      : word absolute $5D;
+      SREG    : byte absolute $5F;
+      WDTCSR  : byte absolute $60;
+      CLKPR   : byte absolute $61;
+      PRR     : byte absolute $64;
+      OSCCAL  : byte absolute $66;
+      PCICR   : byte absolute $68;
+      EICRA   : byte absolute $69;
+      PCMSK0  : byte absolute $6B;
+      PCMSK1  : byte absolute $6C;
+      PCMSK2  : byte absolute $6D;
+      TIMSK0  : byte absolute $6E;
+      TIMSK1  : byte absolute $6F;
+      TIMSK2  : byte absolute $70;
+      ADCL    : byte absolute $78;
+      ADCH    : byte absolute $79;
+      ADC     : word absolute $78;
+      ADCSRA  : byte absolute $7A;
+      ADCSRB  : byte absolute $7B;
+      ADMUX   : byte absolute $7C;
+      DIDR0   : byte absolute $7E;
+      DIDR1   : byte absolute $7F;
+      TCCR1A  : byte absolute $80;
+      TCCR1B  : byte absolute $81;
+      TCCR1C  : byte absolute $82;
+      TCNT1L  : byte absolute $84;
+      TCNT1H  : byte absolute $85;
+      TCNT1   : word absolute $84;
+      ICRL    : byte absolute $86;
+      ICR1H   : byte absolute $87;
+      OCR1AL  : byte absolute $88;
+      OCR1AH  : byte absolute $89;
+      OCR1A   : word absolute $88;
+      OCR1BL  : byte absolute $8A;
+      OCR1BH  : byte absolute $8B;
+      OCR1B   : word absolute $8A;
+      TCCR2A  : byte absolute $B0;
+      TCCR2B  : byte absolute $B1;
+      TCNT2   : byte absolute $B2;
+      OCR2A   : byte absolute $B3;
+      OCR2B   : byte absolute $B4;
+      ASSR    : byte absolute $B6;
+      TWBR    : byte absolute $B8;
+      TWSR    : byte absolute $B9;
+      TWAR    : byte absolute $BA;
+      TWDR    : byte absolute $BB;
+      TWCR    : byte absolute $BC;
+      TWAMR   : byte absolute $BD;
+      UCSR0A  : byte absolute $C0;
+      UCSR0B  : byte absolute $C1;
+      UCSR0C  : byte absolute $C2;
+      UBRR0L  : byte absolute $C4;
+      UBRR0H  : byte absolute $C5;
+      UBRR0   : word absolute $C4;
+      UDR0    : byte absolute $C6;
+
+    const
+      { PINB }
+      PINB7    = 7;
+      PINB6    = 6;
+      PINB5    = 5;
+      PINB4    = 4;
+      PINB3    = 3;
+      PINB2    = 2;
+      PINB1    = 1;
+      PINB0    = 0;
+
+      { DDRB }
+      DDB7     = 7;
+      DDB6     = 6;
+      DDB5     = 5;
+      DDB4     = 4;
+      DDB3     = 3;
+      DDB2     = 2;
+      DDB1     = 1;
+      DDB0     = 0;
+
+      { PORTB }
+      PORTB7   = 7;
+      PORTB6   = 6;
+      PORTB5   = 5;
+      PORTB4   = 4;
+      PORTB3   = 3;
+      PORTB2   = 2;
+      PORTB1   = 1;
+      PORTB0   = 0;
+
+      { PINC }
+      PINC6    = 6;
+      PINC5    = 5;
+      PINC4    = 4;
+      PINC3    = 3;
+      PINC2    = 2;
+      PINC1    = 1;
+      PINC0    = 0;
+
+      { DDRC }
+      DDC6     = 6;
+      DDC5     = 5;
+      DDC4     = 4;
+      DDC3     = 3;
+      DDC2     = 2;
+      DDC1     = 1;
+      DDC0     = 0;
+
+      { PORTC }
+      PORTC6   = 6;
+      PORTC5   = 5;
+      PORTC4   = 4;
+      PORTC3   = 3;
+      PORTC2   = 2;
+      PORTC1   = 1;
+      PORTC0   = 0;
+
+      { PIND }
+      PIND7    = 7;
+      PIND6    = 6;
+      PIND5    = 5;
+      PIND4    = 4;
+      PIND3    = 3;
+      PIND2    = 2;
+      PIND1    = 1;
+      PIND0    = 0;
+
+      { DDRD }
+      DDD7     = 7;
+      DDD6     = 6;
+      DDD5     = 5;
+      DDD4     = 4;
+      DDD3     = 3;
+      DDD2     = 2;
+      DDD1     = 1;
+      DDD0     = 0;
+
+      { PORTD }
+      PORTD7   = 7;
+      PORTD6   = 6;
+      PORTD5   = 5;
+      PORTD4   = 4;
+      PORTD3   = 3;
+      PORTD2   = 2;
+      PORTD1   = 1;
+      PORTD0   = 0;
+
+      { TIFR0 }
+      OCF0B    = 2;
+      OCF0A    = 1;
+      TOV0     = 0;
+
+      { TIFR1 }
+      ICF1     = 5;
+      OCF1B    = 2;
+      OCF1A    = 1;
+      TOV1     = 0;
+
+      { PCIFR }
+      PCIF2    = 2;
+      PCIF1    = 1;
+      PCIF0    = 0;
+
+      { EIFR }
+      INTF1    = 1;
+      INTF0    = 0;
+
+      { EIMSK }
+      INT1     = 1;
+      INT0     = 0;
+
+      { EECR }
+      EEPM1    = 5;
+      EEPM0    = 4;
+      EERIE    = 3;
+      EEMPE    = 2;
+      EEPE     = 1;
+      EERE     = 0;
+
+      { GTCCR }
+      TSM      = 7;
+      PSRASY   = 1;
+      PSRSYNC  = 0;
+
+      { TCCR0A }
+      COM0A1   = 7;
+      COM0A0   = 6;
+      COM0B1   = 5;
+      COM0B0   = 4;
+      WGM01    = 1;
+      WGM00    = 0;
+
+      { TCCR0B }
+      FOC0A    = 7;
+      FOC0B    = 6;
+      WGM02    = 3;
+      CS02     = 2;
+      CS01     = 1;
+      CS00     = 0;
+
+      { SPCR }
+      SPIE     = 7;
+      SPE      = 6;
+      DORD     = 5;
+      MSTR     = 4;
+      CPOL     = 3;
+      CPHA     = 2;
+      SPR1     = 1;
+      SPR0     = 0;
+
+      { SPSR }
+      SPIF     = 7;
+      WCOL     = 6;
+      SPI2X    = 0;
+
+      { ACSR }
+      ACD      = 7;
+      ACBG     = 6;
+      ACO      = 5;
+      ACI      = 4;
+      ACIE     = 3;
+      ACIC     = 2;
+      ACIS1    = 1;
+      ACIS0    = 0;
+
+      { SMCR }
+      SM2      = 3;
+      SM1      = 2;
+      SM0      = 1;
+      SE       = 0;
+
+      { MCUSR }
+      WDRF     = 3;
+      BORF     = 2;
+      EXTRF    = 1;
+      PORF     = 0;
+
+      { MCUCR }
+      PUD      = 4;
+      IVSEL    = 1;
+      IVCE     = 0;
+
+      { SPMCSR }
+      SPMIE    = 7;
+      RWWSB    = 6;
+      RWWSRE   = 4;
+      BLBSET   = 3;
+      PGWRT    = 2;
+      PGERS    = 1;
+      SPMEN    = 0;
+
+      { WDTCSR }
+      WDIF     = 7;
+      WDIE     = 6;
+      WDP3     = 5;
+      WDCE     = 4;
+      WDE      = 3;
+      WDP2     = 2;
+      WDP1     = 1;
+      WDP0     = 0;
+
+      { CLKPR }
+      CLKPCE   = 7;
+      CLKPS3   = 3;
+      CLKPS2   = 2;
+      CLKPS1   = 1;
+      CLKPS0   = 0;
+
+      { PRR }
+      PRTWI    = 7;
+      PRTIM2   = 6;
+      PRTIM0   = 5;
+      PRTIM1   = 3;
+      PRSPI    = 2;
+      PRUSART0 = 1;
+      PRADC    = 0;
+
+      { PCICR }
+      PCIE2    = 2;
+      PCIE1    = 1;
+      PCIE0    = 0;
+
+      { EICRA }
+      ISC11    = 3;
+      ISC10    = 2;
+      ISC01    = 1;
+      ISC00    = 0;
+
+      { PCMSK0 }
+      PCINT7   = 7;
+      PCINT6   = 6;
+      PCINT5   = 5;
+      PCINT4   = 4;
+      PCINT3   = 3;
+      PCINT2   = 2;
+      PCINT1   = 1;
+      PCINT0   = 0;
+
+      { PCMSK1 }
+      PCINT14  = 6;
+      PCINT13  = 5;
+      PCINT12  = 4;
+      PCINT11  = 3;
+      PCINT10  = 2;
+      PCINT9   = 1;
+      PCINT8   = 0;
+
+      { PCMSK2 }
+      PCINT23  = 7;
+      PCINT22  = 6;
+      PCINT21  = 5;
+      PCINT20  = 4;
+      PCINT19  = 3;
+      PCINT18  = 2;
+      PCINT17  = 1;
+      PCINT16  = 0;
+
+      { TIMSK0 }
+      OCIE0B   = 2;
+      OCIE0A   = 1;
+      TOIE0    = 0;
+
+      { TIMSK1 }
+      ICIE1    = 5;
+      OCIE1B   = 2;
+      OCIE1A   = 1;
+      TOIE1    = 0;
+
+      { TIMSK2 }
+      OCIE2B   = 2;
+      OCIE2A   = 1;
+      TOIE2    = 0;
+
+      { ADCSRA }
+      ADEN     = 7;
+      ADSC     = 6;
+      ADATE    = 5;
+      ADIF     = 4;
+      ADIE     = 3;
+      ADPS2    = 2;
+      ADPS1    = 1;
+      ADPS0    = 0;
+
+      { ADCSRB }
+      ACME     = 6;
+      ADTS2    = 2;
+      ADTS1    = 1;
+      ADTS0    = 0;
+
+      { ADMUX }
+      REFS1    = 7;
+      REFS0    = 6;
+      ADLAR    = 5;
+      MUX3     = 3;
+      MUX2     = 2;
+      MUX1     = 1;
+      MUX0     = 0;
+
+      { DIDR0 }
+      ADC5D    = 5;
+      ADC4D    = 4;
+      ADC3D    = 3;
+      ADC2D    = 2;
+      ADC1D    = 1;
+      ADC0D    = 0;
+
+      { DIDR1 }
+      AIN1D    = 1;
+      AIN0D    = 0;
+
+      { TCCR1A }
+      COM1A1   = 7;
+      COM1A0   = 6;
+      COM1B1   = 5;
+      COM1B0   = 4;
+      WGM11    = 1;
+      WGM10    = 0;
+
+      { TCCR1B }
+      ICNC1    = 7;
+      ICES1    = 6;
+      WGM13    = 4;
+      WGM12    = 3;
+      CS12     = 2;
+      CS11     = 1;
+      CS10     = 0;
+
+      { TCCR1C }
+      FOC1A    = 7;
+      FOC1B    = 6;
+
+      { TCCR2A }
+      COM2A1   = 7;
+      COM2A0   = 6;
+      COM2B1   = 5;
+      COM2B0   = 4;
+      WGM21    = 1;
+      WGM20    = 0;
+
+      { TCCR2B }
+      FOC2A    = 7;
+      FOC2B    = 6;
+      WGM22    = 3;
+      CS22     = 2;
+      CS21     = 1;
+      CS20     = 0;
+
+      { ASSR }
+      EXCLK    = 6;
+      AS2      = 5;
+      TCN2UB   = 4;
+      OCR2AUB  = 3;
+      OCR2BUB  = 2;
+      TCR2AUB  = 1;
+      TCR2BUB  = 0;
+
+      { TWSR }
+      TWS7     = 7;
+      TWS6     = 6;
+      TWS5     = 5;
+      TWS4     = 4;
+      TWS3     = 3;
+      TWPS1    = 1;
+      TWPS0    = 0;
+
+      { TWAR }
+      TWA6     = 7;
+      TWA5     = 6;
+      TWA4     = 5;
+      TWA3     = 4;
+      TWA2     = 3;
+      TWA1     = 2;
+      TWA0     = 1;
+
+      { TWCR }
+      TWINT    = 7;
+      TWEA     = 6;
+      TWSTA    = 5;
+      TWSTO    = 4;
+      TWWC     = 3;
+      TWEN     = 2;
+      TWIE     = 0;
+
+      { TWAMR }
+      TWAM6    = 7;
+      TWAM5    = 6;
+      TWAM4    = 5;
+      TWAM3    = 4;
+      TWAM2    = 3;
+      TWAM1    = 2;
+      TWAM0    = 1;
+
+      { UCSR0A }
+      RXC0     = 7;
+      TXC0     = 6;
+      UDRE0    = 5;
+      FE0      = 4;
+      DOR0     = 3;
+      UPE0     = 2;
+      U2X0     = 1;
+      MPCM0    = 0;
+
+      { UCSR0B }
+      RXCIE0   = 7;
+      TXCIE0   = 6;
+      UDRIE0   = 5;
+      RXEN0    = 4;
+      TXEN0    = 3;
+      UCVSZ02  = 2;
+      RXB80    = 1;
+      TXB80    = 0;
+
+      { UCSR0C }
+      UMSEL01  = 7;
+      UMSEL00  = 6;
+      UPM01    = 5;
+      UPM00    = 4;
+      USBS0    = 3;
+      UCVSZ01  = 2;
+      UCVSZ00  = 1;
+      UCPOL0   = 0;
+
+  implementation
+
+{$define RELBRANCHES}
+
+{$i avrcommon.inc}
+	
+    procedure Int00Handler; external name 'Int00Handler';
+    procedure Int01Handler; external name 'Int01Handler';
+    procedure Int02Handler; external name 'Int02Handler';
+    procedure Int03Handler; external name 'Int03Handler';
+    procedure Int04Handler; external name 'Int04Handler';
+    procedure Int05Handler; external name 'Int05Handler';
+    procedure Int06Handler; external name 'Int06Handler';
+    procedure Int07Handler; external name 'Int07Handler';
+    procedure Int08Handler; external name 'Int08Handler';
+    procedure Int09Handler; external name 'Int09Handler';
+    procedure Int10Handler; external name 'Int10Handler';
+    procedure Int11Handler; external name 'Int11Handler';
+    procedure Int12Handler; external name 'Int12Handler';
+    procedure Int13Handler; external name 'Int13Handler';
+    procedure Int14Handler; external name 'Int14Handler';
+    procedure Int15Handler; external name 'Int15Handler';
+    procedure Int16Handler; external name 'Int16Handler';
+    procedure Int17Handler; external name 'Int17Handler';
+    procedure Int18Handler; external name 'Int18Handler';
+    procedure Int19Handler; external name 'Int19Handler';
+    procedure Int20Handler; external name 'Int20Handler';
+    procedure Int21Handler; external name 'Int21Handler';
+    procedure Int22Handler; external name 'Int22Handler';
+    procedure Int23Handler; external name 'Int23Handler';
+    procedure Int24Handler; external name 'Int24Handler';
+    procedure Int25Handler; external name 'Int25Handler';
+    procedure Int26Handler; external name 'Int26Handler';
+    procedure Int27Handler; external name 'Int27Handler';
+    procedure Int28Handler; external name 'Int28Handler';
+    procedure Int29Handler; external name 'Int29Handler';
+    procedure Int30Handler; external name 'Int30Handler';
+    procedure Int31Handler; external name 'Int31Handler';
+    procedure Int32Handler; external name 'Int32Handler';
+    procedure Int33Handler; external name 'Int33Handler';
+    procedure Int34Handler; external name 'Int34Handler';
+
+    procedure _FPC_start; assembler; nostackframe;
+      label
+        _start;
+      asm
+        .init
+        .globl _start
+
+        rjmp _start
+        rjmp Int00Handler
+        rjmp Int01Handler
+        rjmp Int02Handler
+        rjmp Int03Handler
+        rjmp Int04Handler
+        rjmp Int05Handler
+        rjmp Int06Handler
+        rjmp Int07Handler
+        rjmp Int08Handler
+        rjmp Int09Handler
+        rjmp Int10Handler
+        rjmp Int11Handler
+        rjmp Int12Handler
+        rjmp Int13Handler
+        rjmp Int14Handler
+        rjmp Int15Handler
+        rjmp Int16Handler
+        rjmp Int17Handler
+        rjmp Int18Handler
+        rjmp Int19Handler
+        rjmp Int20Handler
+        rjmp Int21Handler
+        rjmp Int22Handler
+        rjmp Int23Handler
+        rjmp Int24Handler
+        rjmp Int25Handler
+
+        {
+          all ATMEL MCUs use the same startup code, the details are
+          governed by defines
+        }
+        {$i start.inc}
+
+        .weak Int00Handler
+        .weak Int01Handler
+        .weak Int02Handler
+        .weak Int03Handler
+        .weak Int04Handler
+        .weak Int05Handler
+        .weak Int06Handler
+        .weak Int07Handler
+        .weak Int08Handler
+        .weak Int09Handler
+        .weak Int10Handler
+        .weak Int11Handler
+        .weak Int12Handler
+        .weak Int13Handler
+        .weak Int14Handler
+        .weak Int15Handler
+        .weak Int16Handler
+        .weak Int17Handler
+        .weak Int18Handler
+        .weak Int19Handler
+        .weak Int20Handler
+        .weak Int21Handler
+        .weak Int22Handler
+        .weak Int23Handler
+        .weak Int24Handler
+        .weak Int25Handler
+
+        .set Int00Handler, Default_IRQ_handler
+        .set Int01Handler, Default_IRQ_handler
+        .set Int02Handler, Default_IRQ_handler
+        .set Int03Handler, Default_IRQ_handler
+        .set Int04Handler, Default_IRQ_handler
+        .set Int05Handler, Default_IRQ_handler
+        .set Int06Handler, Default_IRQ_handler
+        .set Int07Handler, Default_IRQ_handler
+        .set Int08Handler, Default_IRQ_handler
+        .set Int09Handler, Default_IRQ_handler
+        .set Int10Handler, Default_IRQ_handler
+        .set Int11Handler, Default_IRQ_handler
+        .set Int12Handler, Default_IRQ_handler
+        .set Int13Handler, Default_IRQ_handler
+        .set Int14Handler, Default_IRQ_handler
+        .set Int15Handler, Default_IRQ_handler
+        .set Int16Handler, Default_IRQ_handler
+        .set Int17Handler, Default_IRQ_handler
+        .set Int18Handler, Default_IRQ_handler
+        .set Int19Handler, Default_IRQ_handler
+        .set Int20Handler, Default_IRQ_handler
+        .set Int21Handler, Default_IRQ_handler
+        .set Int22Handler, Default_IRQ_handler
+        .set Int23Handler, Default_IRQ_handler
+        .set Int24Handler, Default_IRQ_handler
+        .set Int25Handler, Default_IRQ_handler
+      end;
+
+end.