atmega128.pp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626
  1. {******************************************************************************
  2. Register definitions and startup code for ATMEL ATmega128
  3. ******************************************************************************}
  4. unit atmega128;
  5. {$goto on}
  6. {$macro on}
  7. interface
  8. type
  9. const
  10. _SFR_OFFSET = $20; //indirect addressing
  11. var
  12. PINF : byte absolute $00+_SFR_OFFSET;
  13. PINE : byte absolute $01+_SFR_OFFSET;
  14. DDRE : byte absolute $02+_SFR_OFFSET;
  15. PORTE : byte absolute $03+_SFR_OFFSET;
  16. ADCW : word absolute $04+_SFR_OFFSET;
  17. ADC : word absolute $04+_SFR_OFFSET;
  18. ADCL : byte absolute $04+_SFR_OFFSET;
  19. ADCH : byte absolute $05+_SFR_OFFSET;
  20. ADCSR : byte absolute $06+_SFR_OFFSET;
  21. ADCSRA : byte absolute $06+_SFR_OFFSET;
  22. ADMUX : byte absolute $07+_SFR_OFFSET;
  23. ACSR : byte absolute $08+_SFR_OFFSET;
  24. UBRR0L : byte absolute $09+_SFR_OFFSET;
  25. UCSR0B : byte absolute $0A+_SFR_OFFSET;
  26. UCSR0A : byte absolute $0B+_SFR_OFFSET;
  27. UDR0 : byte absolute $0C+_SFR_OFFSET;
  28. SPCR : byte absolute $0D+_SFR_OFFSET;
  29. SPSR : byte absolute $0E+_SFR_OFFSET;
  30. SPDR : byte absolute $0F+_SFR_OFFSET;
  31. PIND : byte absolute $10+_SFR_OFFSET;
  32. DDRD : byte absolute $11+_SFR_OFFSET;
  33. PORTD : byte absolute $12+_SFR_OFFSET;
  34. PINC : byte absolute $13+_SFR_OFFSET;
  35. DDRC : byte absolute $14+_SFR_OFFSET;
  36. PORTC : byte absolute $15+_SFR_OFFSET;
  37. PINB : byte absolute $16+_SFR_OFFSET;
  38. DDRB : byte absolute $17+_SFR_OFFSET;
  39. PORTB : byte absolute $18+_SFR_OFFSET;
  40. PINA : byte absolute $19+_SFR_OFFSET;
  41. DDRA : byte absolute $1A+_SFR_OFFSET;
  42. PORTA : byte absolute $1B+_SFR_OFFSET;
  43. EECR : byte absolute $1C+_SFR_OFFSET;
  44. EEDR : byte absolute $1D+_SFR_OFFSET;
  45. EEAR : word absolute $1E+_SFR_OFFSET;
  46. EEARL : byte absolute $1E+_SFR_OFFSET;
  47. EEARH : byte absolute $1F+_SFR_OFFSET;
  48. SFIOR : byte absolute $20+_SFR_OFFSET;
  49. WDTCR : byte absolute $21+_SFR_OFFSET;
  50. OCDR : byte absolute $22+_SFR_OFFSET;
  51. OCR2 : byte absolute $23+_SFR_OFFSET;
  52. TCNT2 : byte absolute $24+_SFR_OFFSET;
  53. TCCR2 : byte absolute $25+_SFR_OFFSET;
  54. ICR1 : word absolute $26+_SFR_OFFSET;
  55. ICR1L : byte absolute $26+_SFR_OFFSET;
  56. ICR1H : byte absolute $27+_SFR_OFFSET;
  57. OCR1B : word absolute $28+_SFR_OFFSET;
  58. OCR1BL : byte absolute $28+_SFR_OFFSET;
  59. OCR1BH : byte absolute $29+_SFR_OFFSET;
  60. OCR1A : word absolute $2A+_SFR_OFFSET;
  61. OCR1AL : byte absolute $2A+_SFR_OFFSET;
  62. OCR1AH : byte absolute $2B+_SFR_OFFSET;
  63. TCNT1 : word absolute $2C+_SFR_OFFSET;
  64. TCNT1L : byte absolute $2C+_SFR_OFFSET;
  65. TCNT1H : byte absolute $2D+_SFR_OFFSET;
  66. TCCR1B : byte absolute $2E+_SFR_OFFSET;
  67. TCCR1A : byte absolute $2F+_SFR_OFFSET;
  68. TCCR1B : byte absolute $2E+_SFR_OFFSET;
  69. ASSR : byte absolute $30+_SFR_OFFSET;
  70. OCR0 : byte absolute $31+_SFR_OFFSET;
  71. TCNT0 : byte absolute $32+_SFR_OFFSET;
  72. TCCR0 : byte absolute $33+_SFR_OFFSET;
  73. MCUSR : byte absolute $34+_SFR_OFFSET;
  74. MCUCSR : byte absolute $34+_SFR_OFFSET;
  75. MCUCR : byte absolute $35+_SFR_OFFSET;
  76. TIFR : byte absolute $36+_SFR_OFFSET;
  77. TIMSK : byte absolute $37+_SFR_OFFSET;
  78. EIFR : byte absolute $38+_SFR_OFFSET;
  79. EIMSK : byte absolute $39+_SFR_OFFSET;
  80. EICRB : byte absolute $3A+_SFR_OFFSET;
  81. RAMPZ : byte absolute $3B+_SFR_OFFSET;
  82. XDIV : byte absolute $3C+_SFR_OFFSET;
  83. DDRF : byte absolute $61;
  84. PORTF : byte absolute $62;
  85. PING : byte absolute $63;
  86. DDRG : byte absolute $64;
  87. PORTG : byte absolute $65;
  88. SPMCSR : byte absolute $68;
  89. EICRA : byte absolute $6A;
  90. XMCRB : byte absolute $6C;
  91. XMCRA : byte absolute $6D;
  92. OSCCAL : byte absolute $6F;
  93. TWBR : byte absolute $70;
  94. TWSR : byte absolute $71;
  95. TWAR : byte absolute $72;
  96. TWDR : byte absolute $73;
  97. TWCR : byte absolute $74;
  98. OCR1C : word absolute $78;
  99. OCR1CL : byte absolute $78;
  100. OCR1CH : byte absolute $79;
  101. TCCR1C : byte absolute $7A;
  102. ETIFR : byte absolute $7C;
  103. ETIMSK : byte absolute $7D;
  104. ICR3 : word absolute $80;
  105. ICR3L : byte absolute $80;
  106. ICR3H : byte absolute $81;
  107. OCR3C : word absolute $82;
  108. OCR3CL : byte absolute $82;
  109. OCR3CH : byte absolute $83;
  110. OCR3B : word absolute $84;
  111. OCR3BL : byte absolute $84;
  112. OCR3BH : byte absolute $85;
  113. OCR3A : word absolute $86;
  114. OCR3AL : byte absolute $86;
  115. OCR3AH : byte absolute $87;
  116. TCNT3 : word absolute $88;
  117. TCNT3L : byte absolute $88;
  118. TCNT3H : byte absolute $89;
  119. TCCR3B : byte absolute $8A;
  120. TCCR3A : byte absolute $8B;
  121. TCCR3C : byte absolute $8C;
  122. UBRR0H : byte absolute $90;
  123. UCSR0C : byte absolute $95;
  124. UBRR1H : byte absolute $98;
  125. UBRR1L : byte absolute $99;
  126. UCSR1B : byte absolute $9A;
  127. UCSR1A : byte absolute $9B;
  128. UDR1 : byte absolute $9C;
  129. UCSR1C : byte absolute $9D;
  130. const
  131. TWINT = 7;
  132. TWEA = 6;
  133. TWSTA = 5;
  134. TWSTO = 4;
  135. TWWC = 3;
  136. TWEN = 2;
  137. TWIE = 0;
  138. TWA6 = 7;
  139. TWA5 = 6;
  140. TWA4 = 5;
  141. TWA3 = 4;
  142. TWA2 = 3;
  143. TWA1 = 2;
  144. TWA0 = 1;
  145. TWGCE = 0;
  146. TWS7 = 7;
  147. TWS6 = 6;
  148. TWS5 = 5;
  149. TWS4 = 4;
  150. TWS3 = 3;
  151. TWPS1 = 1;
  152. TWPS0 = 0;
  153. SRL2 = 6;
  154. SRL1 = 5;
  155. SRL0 = 4;
  156. SRW01 = 3;
  157. SRW00 = 2;
  158. SRW11 = 1;
  159. XMBK = 7;
  160. XMM2 = 2;
  161. XMM1 = 1;
  162. XMM0 = 0;
  163. XDIVEN = 7;
  164. XDIV6 = 6;
  165. XDIV5 = 5;
  166. XDIV4 = 4;
  167. XDIV3 = 3;
  168. XDIV2 = 2;
  169. XDIV1 = 1;
  170. XDIV0 = 0;
  171. RAMPZ0 = 0;
  172. ISC31 = 7;
  173. ISC30 = 6;
  174. ISC21 = 5;
  175. ISC20 = 4;
  176. ISC11 = 3;
  177. ISC10 = 2;
  178. ISC01 = 1;
  179. ISC00 = 0;
  180. ISC71 = 7;
  181. ISC70 = 6;
  182. ISC61 = 5;
  183. ISC60 = 4;
  184. ISC51 = 3;
  185. ISC50 = 2;
  186. ISC41 = 1;
  187. ISC40 = 0;
  188. SPMIE = 7;
  189. RWWSB = 6;
  190. RWWSRE = 4;
  191. BLBSET = 3;
  192. PGWRT = 2;
  193. PGERS = 1;
  194. SPMEN = 0;
  195. INT7 = 7;
  196. INT6 = 6;
  197. INT5 = 5;
  198. INT4 = 4;
  199. INT3 = 3;
  200. INT2 = 2;
  201. INT1 = 1;
  202. INT0 = 0;
  203. INTF7 = 7;
  204. INTF6 = 6;
  205. INTF5 = 5;
  206. INTF4 = 4;
  207. INTF3 = 3;
  208. INTF2 = 2;
  209. INTF1 = 1;
  210. INTF0 = 0;
  211. OCIE2 = 7;
  212. TOIE2 = 6;
  213. TICIE1 = 5;
  214. OCIE1A = 4;
  215. OCIE1B = 3;
  216. TOIE1 = 2;
  217. OCIE0 = 1;
  218. TOIE0 = 0;
  219. OCF2 = 7;
  220. TOV2 = 6;
  221. ICF1 = 5;
  222. OCF1A = 4;
  223. OCF1B = 3;
  224. TOV1 = 2;
  225. OCF0 = 1;
  226. TOV0 = 0;
  227. TICIE3 = 5;
  228. OCIE3A = 4;
  229. OCIE3B = 3;
  230. TOIE3 = 2;
  231. OCIE3C = 1;
  232. OCIE1C = 0;
  233. ICF3 = 5;
  234. OCF3A = 4;
  235. OCF3B = 3;
  236. TOV3 = 2;
  237. OCF3C = 1;
  238. OCF1C = 0;
  239. SRE = 7;
  240. SRW = 6;
  241. SRW10 = 6;
  242. SE = 5;
  243. SM1 = 4;
  244. SM0 = 3;
  245. SM2 = 2;
  246. IVSEL = 1;
  247. IVCE = 0;
  248. JTD = 7;
  249. JTRF = 4;
  250. WDRF = 3;
  251. BORF = 2;
  252. EXTRF = 1;
  253. PORF = 0;
  254. FOC = 7;
  255. WGM0 = 6;
  256. COM1 = 5;
  257. COM0 = 4;
  258. WGM1 = 3;
  259. CS2 = 2;
  260. CS1 = 1;
  261. CS0 = 0;
  262. FOC0 = 7;
  263. WGM00 = 6;
  264. COM01 = 5;
  265. COM00 = 4;
  266. WGM01 = 3;
  267. CS02 = 2;
  268. CS01 = 1;
  269. CS00 = 0;
  270. FOC2 = 7;
  271. WGM20 = 6;
  272. COM21 = 5;
  273. COM20 = 4;
  274. WGM21 = 3;
  275. CS22 = 2;
  276. CS21 = 1;
  277. CS20 = 0;
  278. AS0 = 3;
  279. TCN0UB = 2;
  280. OCR0UB = 1;
  281. TCR0UB = 0;
  282. COMA1 = 7;
  283. COMA0 = 6;
  284. COMB1 = 5;
  285. COMB0 = 4;
  286. COMC1 = 3;
  287. COMC0 = 2;
  288. WGMA1 = 1;
  289. WGMA0 = 0;
  290. COM1A1 = 7;
  291. COM1A0 = 6;
  292. COM1B1 = 5;
  293. COM1B0 = 4;
  294. COM1C1 = 3;
  295. COM1C0 = 2;
  296. WGM11 = 1;
  297. WGM10 = 0;
  298. COM3A1 = 7;
  299. COM3A0 = 6;
  300. COM3B1 = 5;
  301. COM3B0 = 4;
  302. COM3C1 = 3;
  303. COM3C0 = 2;
  304. WGM31 = 1;
  305. WGM30 = 0;
  306. ICNC = 7;
  307. ICES = 6;
  308. WGMB3 = 4;
  309. WGMB2 = 3;
  310. CSB2 = 2;
  311. CSB1 = 1;
  312. CSB0 = 0;
  313. ICNC1 = 7;
  314. ICES1 = 6;
  315. WGM13 = 4;
  316. WGM12 = 3;
  317. CS12 = 2;
  318. CS11 = 1;
  319. CS10 = 0;
  320. ICNC3 = 7;
  321. ICES3 = 6;
  322. WGM33 = 4;
  323. WGM32 = 3;
  324. CS32 = 2;
  325. CS31 = 1;
  326. CS30 = 0;
  327. FOCA = 7;
  328. FOCB = 6;
  329. FOCC = 5;
  330. FOC3A = 7;
  331. FOC3B = 6;
  332. FOC3C = 5;
  333. FOC1A = 7;
  334. FOC1B = 6;
  335. FOC1C = 5;
  336. IDRD = 7;
  337. OCDR7 = 7;
  338. OCDR6 = 6;
  339. OCDR5 = 5;
  340. OCDR4 = 4;
  341. OCDR3 = 3;
  342. OCDR2 = 2;
  343. OCDR1 = 1;
  344. OCDR0 = 0;
  345. WDCE = 4;
  346. WDE = 3;
  347. WDP2 = 2;
  348. WDP1 = 1;
  349. WDP0 = 0;
  350. TSM = 7;
  351. ACME = 3;
  352. PUD = 2;
  353. PSR0 = 1;
  354. PSR321 = 0;
  355. SPIF = 7;
  356. WCOL = 6;
  357. SPI2X = 0;
  358. SPIE = 7;
  359. SPE = 6;
  360. DORD = 5;
  361. MSTR = 4;
  362. CPOL = 3;
  363. CPHA = 2;
  364. SPR1 = 1;
  365. SPR0 = 0;
  366. UMSEL = 6;
  367. UPM1 = 5;
  368. UPM0 = 4;
  369. USBS = 3;
  370. UCSZ1 = 2;
  371. UCSZ0 = 1;
  372. UCPOL = 0;
  373. UMSEL1 = 6;
  374. UPM11 = 5;
  375. UPM10 = 4;
  376. USBS1 = 3;
  377. UCSZ11 = 2;
  378. UCSZ10 = 1;
  379. UCPOL1 = 0;
  380. UMSEL0 = 6;
  381. UPM01 = 5;
  382. UPM00 = 4;
  383. USBS0 = 3;
  384. UCSZ01 = 2;
  385. UCSZ00 = 1;
  386. UCPOL0 = 0;
  387. RXC = 7;
  388. TXC = 6;
  389. UDRE = 5;
  390. FE = 4;
  391. DOR = 3;
  392. UPE = 2;
  393. U2X = 1;
  394. MPCM = 0;
  395. RXC1 = 7;
  396. TXC1 = 6;
  397. UDRE1 = 5;
  398. FE1 = 4;
  399. DOR1 = 3;
  400. UPE1 = 2;
  401. U2X1 = 1;
  402. MPCM1 = 0;
  403. RXC0 = 7;
  404. TXC0 = 6;
  405. UDRE0 = 5;
  406. FE0 = 4;
  407. DOR0 = 3;
  408. UPE0 = 2;
  409. U2X0 = 1;
  410. MPCM0 = 0;
  411. RXCIE = 7;
  412. TXCIE = 6;
  413. UDRIE = 5;
  414. RXEN = 4;
  415. TXEN = 3;
  416. UCSZ = 2;
  417. UCSZ2 = 2;
  418. RXB8 = 1;
  419. TXB8 = 0;
  420. RXCIE1 = 7;
  421. TXCIE1 = 6;
  422. UDRIE1 = 5;
  423. RXEN1 = 4;
  424. TXEN1 = 3;
  425. UCSZ12 = 2;
  426. RXB81 = 1;
  427. TXB81 = 0;
  428. RXCIE0 = 7;
  429. TXCIE0 = 6;
  430. UDRIE0 = 5;
  431. RXEN0 = 4;
  432. TXEN0 = 3;
  433. UCSZ02 = 2;
  434. RXB80 = 1;
  435. TXB80 = 0;
  436. ACD = 7;
  437. ACBG = 6;
  438. ACO = 5;
  439. ACI = 4;
  440. ACIE = 3;
  441. ACIC = 2;
  442. ACIS1 = 1;
  443. ACIS0 = 0;
  444. ADEN = 7;
  445. ADSC = 6;
  446. ADFR = 5;
  447. ADIF = 4;
  448. ADIE = 3;
  449. ADPS2 = 2;
  450. ADPS1 = 1;
  451. ADPS0 = 0;
  452. REFS1 = 7;
  453. REFS0 = 6;
  454. ADLAR = 5;
  455. MUX4 = 4;
  456. MUX3 = 3;
  457. MUX2 = 2;
  458. MUX1 = 1;
  459. MUX0 = 0;
  460. {$define DOCALL:=call}
  461. {$define DOJMP:=jmp}
  462. implementation
  463. procedure PASCALMAIN; external name 'PASCALMAIN';
  464. procedure _FPC_haltproc; assembler; nostackframe; public name '_haltproc';
  465. asm
  466. cli
  467. .Lhalt:
  468. jmp .Lhalt
  469. end;
  470. var
  471. _data: record end; external name '_data';
  472. _edata: record end; external name '_edata';
  473. _etext: record end; external name '_etext';
  474. _bss_start: record end; external name '_bss_start';
  475. _bss_end: record end; external name '_bss_end';
  476. _stack_top: record end; external name '_stack_top';
  477. Int00Handler,
  478. Int01Handler,
  479. Int02Handler,
  480. Int03Handler,
  481. Int04Handler,
  482. Int05Handler,
  483. Int06Handler,
  484. Int07Handler,
  485. Int08Handler,
  486. Int09Handler,
  487. Int10Handler,
  488. Int11Handler,
  489. Int12Handler,
  490. Int13Handler,
  491. Int14Handler,
  492. Int15Handler,
  493. Int16Handler,
  494. Int17Handler,
  495. Int18Handler,
  496. Int19Handler,
  497. Int20Handler,
  498. Int21Handler,
  499. Int22Handler,
  500. Int23Handler,
  501. Int24Handler,
  502. Int25Handler,
  503. Int26Handler,
  504. Int27Handler,
  505. Int28Handler,
  506. Int29Handler,
  507. Int30Handler,
  508. Int31Handler,
  509. Int32Handler,
  510. Int33Handler,
  511. Int34Handler : Pointer = Default_IRQ_handler;
  512. procedure Default_IRQ_handler; assembler; nostackframe; public name '_Default_IRQ_handler';
  513. asm
  514. .Lloop:
  515. b .Lloop
  516. end;
  517. procedure _FPC_start; assembler; nostackframe;
  518. label
  519. _start;
  520. asm
  521. .init
  522. .globl _start
  523. // .org 0x00
  524. rjmp _start
  525. rjump Int00Handler
  526. rjump Int01Handler
  527. rjump Int02Handler
  528. rjump Int03Handler
  529. rjump Int04Handler
  530. rjump Int05Handler
  531. rjump Int06Handler
  532. rjump Int07Handler
  533. rjump Int08Handler
  534. rjump Int09Handler
  535. rjump Int10Handler
  536. rjump Int11Handler
  537. rjump Int12Handler
  538. rjump Int13Handler
  539. rjump Int14Handler
  540. rjump Int15Handler
  541. rjump Int16Handler
  542. rjump Int17Handler
  543. rjump Int18Handler
  544. rjump Int19Handler
  545. rjump Int20Handler
  546. rjump Int21Handler
  547. rjump Int22Handler
  548. rjump Int23Handler
  549. rjump Int24Handler
  550. rjump Int25Handler
  551. rjump Int26Handler
  552. rjump Int27Handler
  553. rjump Int28Handler
  554. rjump Int29Handler
  555. rjump Int30Handler
  556. rjump Int31Handler
  557. rjump Int32Handler
  558. rjump Int33Handler
  559. rjump Int34Handler
  560. {
  561. all ATMEL MCUs use the same startup code, the details are
  562. governed by defines
  563. }
  564. {$i start.inc}
  565. end;
  566. end.