* ATmega16 support by Anton Kavalenka, resolves issue #28217

git-svn-id: trunk@30943 -
This commit is contained in:
florian 2015-05-31 15:55:39 +00:00
parent 0997122c4c
commit e9ef6347d2
4 changed files with 365 additions and 2 deletions

1
.gitattributes vendored
View File

@ -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/atmega16.pp svneol=native#text/plain
rtl/embedded/avr/atmega168fam.pp svneol=native#text/plain
rtl/embedded/avr/atmega48fam.pp svneol=native#text/plain
rtl/embedded/avr/atmega8.pp svneol=native#text/plain

View File

@ -369,7 +369,7 @@ CPU_UNITS=allwinner_a20
endif
endif
ifeq ($(ARCH),avr)
CPU_UNITS=atmega128 atmega8 avrsim attinyx4 atmega48fam atmega168fam
CPU_UNITS=atmega128 atmega8 atmega16 avrsim attinyx4 atmega48fam atmega168fam
endif
ifeq ($(ARCH),i386)
CPU_SPECIFIC_COMMON_UNITS=sysutils math classes fgl macpas typinfo types rtlconsts getopts lineinfo

View File

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

View File

@ -0,0 +1,362 @@
{******************************************************************************
Register definitions and startup code for ATMEL ATmega16
******************************************************************************}
unit atmega16;
{$goto on}
interface
const
_SFR_OFFSET = $20; //indirect addressing
var
TWBR : byte absolute $00+_SFR_OFFSET;
TWSR : byte absolute $01+_SFR_OFFSET;
TWAR : byte absolute $02+_SFR_OFFSET;
TWDR : byte absolute $03+_SFR_OFFSET;
ADCW : word absolute $04+_SFR_OFFSET;
ADC : word absolute $04+_SFR_OFFSET;
ADCL : byte absolute $04+_SFR_OFFSET;
ADCH : byte absolute $05+_SFR_OFFSET;
ADCSRA : byte absolute $06+_SFR_OFFSET;
ADMUX : byte absolute $07+_SFR_OFFSET;
ACSR : byte absolute $08+_SFR_OFFSET;
UBRRL : byte absolute $09+_SFR_OFFSET;
UCSRB : byte absolute $0A+_SFR_OFFSET;
UCSRA : byte absolute $0B+_SFR_OFFSET;
UDR : byte absolute $0C+_SFR_OFFSET;
SPCR : byte absolute $0D+_SFR_OFFSET;
SPSR : byte absolute $0E+_SFR_OFFSET;
SPDR : byte absolute $0F+_SFR_OFFSET;
PIND : byte absolute $10+_SFR_OFFSET;
DDRD : byte absolute $11+_SFR_OFFSET;
PORTD : byte absolute $12+_SFR_OFFSET;
PINC : byte absolute $13+_SFR_OFFSET;
DDRC : byte absolute $14+_SFR_OFFSET;
PORTC : byte absolute $15+_SFR_OFFSET;
PINB : byte absolute $16+_SFR_OFFSET;
DDRB : byte absolute $17+_SFR_OFFSET;
PORTB : byte absolute $18+_SFR_OFFSET;
PINA : byte absolute $19+_SFR_OFFSET;
DDRA : byte absolute $1A+_SFR_OFFSET;
PORTA : byte absolute $1B+_SFR_OFFSET;
EECR : byte absolute $1C+_SFR_OFFSET;
EEDR : byte absolute $1D+_SFR_OFFSET;
EEAR : word absolute $1E+_SFR_OFFSET;
EEARL : byte absolute $1E+_SFR_OFFSET;
EEARH : byte absolute $1F+_SFR_OFFSET;
UCSRC : byte absolute $20+_SFR_OFFSET;
UBRRH : byte absolute $20+_SFR_OFFSET;
WDTCR : byte absolute $21+_SFR_OFFSET;
ASSR : byte absolute $22+_SFR_OFFSET;
OCR2 : byte absolute $23+_SFR_OFFSET;
TCNT2 : byte absolute $24+_SFR_OFFSET;
TCCR2 : byte absolute $25+_SFR_OFFSET;
ICR1 : word absolute $26+_SFR_OFFSET;
ICR1L : byte absolute $26+_SFR_OFFSET;
ICR1H : byte absolute $27+_SFR_OFFSET;
OCR1B : word absolute $28+_SFR_OFFSET;
OCR1BL : byte absolute $28+_SFR_OFFSET;
OCR1BH : byte absolute $29+_SFR_OFFSET;
OCR1A : word absolute $2A+_SFR_OFFSET;
OCR1AL : byte absolute $2A+_SFR_OFFSET;
OCR1AH : byte absolute $2B+_SFR_OFFSET;
TCNT1 : word absolute $2C+_SFR_OFFSET;
TCNT1L : byte absolute $2C+_SFR_OFFSET;
TCNT1H : byte absolute $2D+_SFR_OFFSET;
TCCR1B : byte absolute $2E+_SFR_OFFSET;
TCCR1A : byte absolute $2F+_SFR_OFFSET;
SFIOR : byte absolute $30+_SFR_OFFSET;
OSCCAL : byte absolute $31+_SFR_OFFSET;
TCNT0 : byte absolute $32+_SFR_OFFSET;
TCCR0 : byte absolute $33+_SFR_OFFSET;
MCUSR : byte absolute $34+_SFR_OFFSET;
MCUCSR : byte absolute $34+_SFR_OFFSET;
MCUCR : byte absolute $35+_SFR_OFFSET;
TWCR : byte absolute $36+_SFR_OFFSET;
SPMCR : byte absolute $37+_SFR_OFFSET;
TIFR : byte absolute $38+_SFR_OFFSET;
TIMSK : byte absolute $39+_SFR_OFFSET;
GIFR : byte absolute $3A+_SFR_OFFSET;
GICR : byte absolute $3B+_SFR_OFFSET;
OCR0 : byte absolute $3C+_SFR_OFFSET;
SP : word absolute $3D+_SFR_OFFSET;
SPL : byte absolute $3D+_SFR_OFFSET;
SPH : byte absolute $3E+_SFR_OFFSET;
SREG : byte absolute $3F+_SFR_OFFSET;
const
TWINT = 7;
TWEA = 6;
TWSTA = 5;
TWSTO = 4;
TWWC = 3;
TWEN = 2;
TWIE = 0;
TWA6 = 7;
TWA5 = 6;
TWA4 = 5;
TWA3 = 4;
TWA2 = 3;
TWA1 = 2;
TWA0 = 1;
TWGCE = 0;
TWS7 = 7;
TWS6 = 6;
TWS5 = 5;
TWS4 = 4;
TWS3 = 3;
TWPS1 = 1;
TWPS0 = 0;
XDIVEN = 7;
XDIV6 = 6;
XDIV5 = 5;
XDIV4 = 4;
XDIV3 = 3;
XDIV2 = 2;
XDIV1 = 1;
XDIV0 = 0;
ISC11 = 3;
ISC10 = 2;
ISC01 = 1;
ISC00 = 0;
INT1 = 7;
INT0 = 6;
INTF1 = 7;
INTF0 = 6;
OCIE2 = 7;
TOIE2 = 6;
TICIE1 = 5;
OCIE1A = 4;
OCIE1B = 3;
TOIE1 = 2;
TOIE0 = 0;
OCF2 = 7;
TOV2 = 6;
ICF1 = 5;
OCF1A = 4;
OCF1B = 3;
TOV1 = 2;
TOV0 = 0;
SPMIE = 7;
RWWSB = 6;
RWWSRE = 4;
BLBSET = 3;
PGWRT = 2;
PGERS = 1;
SPMEN = 0;
COM1A1 = 7;
COM1A0 = 6;
COM1B1 = 5;
COM1B0 = 4;
COM1C1 = 3;
COM1C0 = 2;
WGM11 = 1;
WGM10 = 0;
ICNC = 7;
ICES = 6;
WGMB3 = 4;
WGMB2 = 3;
CSB2 = 2;
CSB1 = 1;
CSB0 = 0;
ICNC1 = 7;
ICES1 = 6;
WGM13 = 4;
WGM12 = 3;
CS12 = 2;
CS11 = 1;
CS10 = 0;
FOC2 = 7;
WGM20 = 6;
COM21 = 5;
COM20 = 4;
WGM21 = 3;
CS22 = 2;
CS21 = 1;
CS20 = 0;
SPIF = 7;
WCOL = 6;
SPI2X = 0;
SPIE = 7;
SPE = 6;
DORD = 5;
MSTR = 4;
CPOL = 3;
CPHA = 2;
SPR1 = 1;
SPR0 = 0;
URSEL = 7;
UMSEL = 6;
UPM1 = 5;
UPM0 = 4;
USBS = 3;
UCSZ1 = 2;
UCSZ0 = 1;
UCPOL = 0;
RXC = 7;
TXC = 6;
UDRE = 5;
FE = 4;
DOR = 3;
UPE = 2;
U2X = 1;
MPCM = 0;
RXCIE = 7;
TXCIE = 6;
UDRIE = 5;
RXEN = 4;
TXEN = 3;
UCSZ = 2;
UCSZ2 = 2;
RXB8 = 1;
TXB8 = 0;
ACD = 7;
ACBG = 6;
ACO = 5;
ACI = 4;
ACIE = 3;
ACIC = 2;
ACIS1 = 1;
ACIS0 = 0;
ADEN = 7;
ADSC = 6;
ADFR = 5;
ADIF = 4;
ADIE = 3;
ADPS2 = 2;
ADPS1 = 1;
ADPS0 = 0;
REFS1 = 7;
REFS0 = 6;
ADLAR = 5;
MUX3 = 3;
MUX2 = 2;
MUX1 = 1;
MUX0 = 0;
implementation
{$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 _FPC_start; assembler; nostackframe;
label
_start;
asm
.init
.globl _start
jmp _start
jmp Int00Handler
jmp Int01Handler
jmp Int02Handler
jmp Int03Handler
jmp Int04Handler
jmp Int05Handler
jmp Int06Handler
jmp Int07Handler
jmp Int08Handler
jmp Int09Handler
jmp Int10Handler
jmp Int11Handler
jmp Int12Handler
jmp Int13Handler
jmp Int14Handler
jmp Int15Handler
jmp Int16Handler
jmp Int17Handler
jmp Int18Handler
jmp Int19Handler
{
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
.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
end;
end.