attiny104.pp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  1. unit ATtiny104;
  2. interface
  3. var
  4. PINA: byte absolute $00; // Input Pins, Port A
  5. DDRA: byte absolute $01; // Data Direction Register, Port A
  6. PORTA: byte absolute $02; // Port A Data register
  7. PUEA: byte absolute $03; // Pull-up Enable Control Register for PORTA
  8. PINB: byte absolute $04; // Input Pins, Port B
  9. DDRB: byte absolute $05; // Data Direction Register, Port B
  10. PORTB: byte absolute $06; // Port B Data register
  11. PUEB: byte absolute $07; // Pull-up Enable Control Register for PORTB
  12. UDR: byte absolute $08; // USART I/O Data Register
  13. UBRR: word absolute $09; // USART Baud Rate Register Bytes
  14. UBRRL: byte absolute $09; // USART Baud Rate Register Bytes
  15. UBRRH: byte absolute $0A; // USART Baud Rate Register Bytes;
  16. UCSRD: byte absolute $0B; // USART Control and Status Register D
  17. UCSRC: byte absolute $0C; // USART Control and Status Register C
  18. UCSRB: byte absolute $0D; // USART Control and Status Register B
  19. UCSRA: byte absolute $0E; // USART Control and Status Register A
  20. PCMSK0: byte absolute $0F; // Pin Change Mask Register 0
  21. PCMSK1: byte absolute $10; // Pin Change Mask Register 1
  22. PCIFR: byte absolute $11; // Pin Change Interrupt Flag Register
  23. PCICR: byte absolute $12; // Pin Change Interrupt Control Register
  24. EIMSK: byte absolute $13; // External Interrupt Mask register
  25. EIFR: byte absolute $14; // External Interrupt Flag register
  26. EICRA: byte absolute $15; // External Interrupt Control Register A
  27. PORTCR: byte absolute $16; // Port Control Register
  28. DIDR0: byte absolute $17;
  29. ADCL: byte absolute $19; // ADC Data Register Low
  30. ADCH: byte absolute $1A; // ADC Data Register High
  31. ADMUX: byte absolute $1B; // The ADC multiplexer Selection Register
  32. ADCSRB: byte absolute $1C; // The ADC Control and Status register B
  33. ADCSRA: byte absolute $1D; // The ADC Control and Status register A
  34. ACSRB: byte absolute $1E; // Analog Comparator Control And Status Register B
  35. ACSRA: byte absolute $1F; // Analog Comparator Control And Status Register A
  36. ICR0: word absolute $22; // Input Capture Register Bytes
  37. ICR0L: byte absolute $22; // Input Capture Register Bytes
  38. ICR0H: byte absolute $23; // Input Capture Register Bytes;
  39. OCR0B: word absolute $24; // Timer/Counter0 Output Compare Register B
  40. OCR0BL: byte absolute $24; // Timer/Counter0 Output Compare Register B
  41. OCR0BH: byte absolute $25; // Timer/Counter0 Output Compare Register B ;
  42. OCR0A: word absolute $26; // Timer/Counter 0 Output Compare Register A
  43. OCR0AL: byte absolute $26; // Timer/Counter 0 Output Compare Register A
  44. OCR0AH: byte absolute $27; // Timer/Counter 0 Output Compare Register A ;
  45. TCNT0: word absolute $28; // Timer/Counter0
  46. TCNT0L: byte absolute $28; // Timer/Counter0
  47. TCNT0H: byte absolute $29; // Timer/Counter0 ;
  48. TIFR0: byte absolute $2A; // Overflow Interrupt Enable
  49. TIMSK0: byte absolute $2B; // Timer Interrupt Mask Register 0
  50. TCCR0C: byte absolute $2C; // Timer/Counter 0 Control Register C
  51. TCCR0B: byte absolute $2D; // Timer/Counter 0 Control Register B
  52. TCCR0A: byte absolute $2E; // Timer/Counter 0 Control Register A
  53. GTCCR: byte absolute $2F; // General Timer/Counter Control Register
  54. WDTCSR: byte absolute $31; // Watchdog Timer Control and Status Register
  55. NVMCSR: byte absolute $32; // Non-Volatile Memory Control and Status Register
  56. NVMCMD: byte absolute $33; // Non-Volatile Memory Command
  57. VLMCSR: byte absolute $34; // Vcc Level Monitoring Control and Status Register
  58. PRR: byte absolute $35; // Power Reduction Register
  59. CLKPSR: byte absolute $36; // Clock Prescale Register
  60. CLKMSR: byte absolute $37; // Clock Main Settings Register
  61. OSCCAL: byte absolute $39; // Oscillator Calibration Value
  62. SMCR: byte absolute $3A; // Sleep Mode Control Register
  63. RSTFLR: byte absolute $3B; // Reset Flag Register
  64. CCP: byte absolute $3C; // Configuration Change Protection
  65. SP: word absolute $3D; // Stack Pointer
  66. SPL: byte absolute $3D; // Stack Pointer
  67. SPH: byte absolute $3E; // Stack Pointer ;
  68. SREG: byte absolute $3F; // Status Register
  69. const
  70. // Port A Data register
  71. PA0 = $00;
  72. PA1 = $01;
  73. PA2 = $02;
  74. PA3 = $03;
  75. PA4 = $04;
  76. PA5 = $05;
  77. PA6 = $06;
  78. PA7 = $07;
  79. // Port B Data register
  80. PB0 = $00;
  81. PB1 = $01;
  82. PB2 = $02;
  83. PB3 = $03;
  84. // USART Control and Status Register D
  85. SFDE = $05;
  86. RXS = $06;
  87. RXSIE = $07;
  88. // USART Control and Status Register C
  89. UCPOL = $00;
  90. UCSZ0 = $01; // Character Size
  91. UCSZ1 = $02; // Character Size
  92. USBS = $03;
  93. UPM0 = $04; // Parity Mode Bits
  94. UPM1 = $05; // Parity Mode Bits
  95. UMSEL0 = $06; // USART Mode Select
  96. UMSEL1 = $07; // USART Mode Select
  97. // USART Control and Status Register B
  98. TXB8 = $00;
  99. RXB8 = $01;
  100. UCSZ2 = $02;
  101. TXEN = $03;
  102. RXEN = $04;
  103. UDRIE = $05;
  104. TXCIE = $06;
  105. RXCIE = $07;
  106. // USART Control and Status Register A
  107. MPCM = $00;
  108. U2X = $01;
  109. UPE = $02;
  110. DOR = $03;
  111. FE = $04;
  112. UDRE = $05;
  113. TXC = $06;
  114. RXC = $07;
  115. // Pin Change Mask Register 0
  116. PCINT0 = $00;
  117. PCINT1 = $01;
  118. PCINT2 = $02;
  119. PCINT3 = $03;
  120. PCINT4 = $04;
  121. PCINT5 = $05;
  122. PCINT6 = $06;
  123. PCINT7 = $07;
  124. // Pin Change Mask Register 1
  125. PCINT8 = $00;
  126. PCINT9 = $01;
  127. PCINT10 = $02;
  128. PCINT11 = $03;
  129. // Pin Change Interrupt Flag Register
  130. PCIF0 = $00;
  131. PCIF1 = $01;
  132. // Pin Change Interrupt Control Register
  133. PCIE0 = $00;
  134. PCIE1 = $01;
  135. // External Interrupt Mask register
  136. INT0 = $00;
  137. // External Interrupt Flag register
  138. INTF0 = $00;
  139. // External Interrupt Control Register A
  140. ISC00 = $00;
  141. ISC01 = $01;
  142. // Port Control Register
  143. BBMA = $00;
  144. BBMB = $01;
  145. ADC0D = $00;
  146. AIN0D = $00;
  147. ADC1D = $01;
  148. AIN1D = $01;
  149. ADC2D = $02;
  150. ADC3D = $03;
  151. ADC4D = $04;
  152. ADC5D = $05;
  153. ADC6D = $06;
  154. ADC7D = $07;
  155. // The ADC multiplexer Selection Register
  156. MUX0 = $00; // Analog Channel Selection Bits
  157. MUX1 = $01; // Analog Channel Selection Bits
  158. MUX2 = $02; // Analog Channel Selection Bits
  159. REFS0 = $06; // Analog Reference voltage Selection Bits
  160. REFS1 = $07; // Analog Reference voltage Selection Bits
  161. // The ADC Control and Status register B
  162. ADTS0 = $00; // ADC Auto Trigger Source bits
  163. ADTS1 = $01; // ADC Auto Trigger Source bits
  164. ADTS2 = $02; // ADC Auto Trigger Source bits
  165. ADLAR = $07;
  166. // The ADC Control and Status register A
  167. ADPS0 = $00; // ADC Prescaler Select Bits
  168. ADPS1 = $01; // ADC Prescaler Select Bits
  169. ADPS2 = $02; // ADC Prescaler Select Bits
  170. ADIE = $03;
  171. ADIF = $04;
  172. ADATE = $05;
  173. ADSC = $06;
  174. ADEN = $07;
  175. // Analog Comparator Control And Status Register B
  176. ACPMUX = $00;
  177. ACOE = $01;
  178. // Analog Comparator Control And Status Register A
  179. ACIS0 = $00; // Analog Comparator Interrupt Mode Select bits
  180. ACIS1 = $01; // Analog Comparator Interrupt Mode Select bits
  181. ACIC = $02;
  182. ACIE = $03;
  183. ACI = $04;
  184. ACO = $05;
  185. ACBG = $06;
  186. ACD = $07;
  187. // Overflow Interrupt Enable
  188. TOV0 = $00;
  189. OCF0A = $01;
  190. OCF0B = $02;
  191. ICF0 = $05;
  192. // Timer Interrupt Mask Register 0
  193. TOIE0 = $00;
  194. OCIE0A = $01;
  195. OCIE0B = $02;
  196. ICIE0 = $05;
  197. // Timer/Counter 0 Control Register C
  198. FOC0B = $06;
  199. FOC0A = $07;
  200. // Timer/Counter 0 Control Register B
  201. CS00 = $00; // Clock Select
  202. CS01 = $01; // Clock Select
  203. CS02 = $02; // Clock Select
  204. ICES0 = $06;
  205. ICNC0 = $07;
  206. // Timer/Counter 0 Control Register A
  207. WGM00 = $00; // Waveform Generation Mode
  208. WGM01 = $01; // Waveform Generation Mode
  209. COM0B0 = $04; // Compare Output Mode for Channel B bits
  210. COM0B1 = $05; // Compare Output Mode for Channel B bits
  211. COM0A0 = $06; // Compare Output Mode for Channel A bits
  212. COM0A1 = $07; // Compare Output Mode for Channel A bits
  213. // General Timer/Counter Control Register
  214. PSR = $00;
  215. REMAP = $01;
  216. TSM = $07;
  217. // Watchdog Timer Control and Status Register
  218. WDE = $03;
  219. WDP0 = $00; // Watchdog Timer Prescaler Bits
  220. WDP1 = $01; // Watchdog Timer Prescaler Bits
  221. WDP2 = $02; // Watchdog Timer Prescaler Bits
  222. WDP3 = $05; // Watchdog Timer Prescaler Bits
  223. WDIE = $06;
  224. WDIF = $07;
  225. // Non-Volatile Memory Control and Status Register
  226. NVMBSY = $07;
  227. // Vcc Level Monitoring Control and Status Register
  228. VLM0 = $00; // Trigger Level of Voltage Level Monitor bits
  229. VLM1 = $01; // Trigger Level of Voltage Level Monitor bits
  230. VLM2 = $02; // Trigger Level of Voltage Level Monitor bits
  231. VLMIE = $06;
  232. VLMF = $07;
  233. // Power Reduction Register
  234. PRTIM0 = $00;
  235. PRADC = $01;
  236. PRUSART = $02;
  237. // Clock Prescale Register
  238. CLKPS0 = $00; // Clock Prescaler Select Bits
  239. CLKPS1 = $01; // Clock Prescaler Select Bits
  240. CLKPS2 = $02; // Clock Prescaler Select Bits
  241. CLKPS3 = $03; // Clock Prescaler Select Bits
  242. // Clock Main Settings Register
  243. CLKMS0 = $00; // Clock Main Select Bits
  244. CLKMS1 = $01; // Clock Main Select Bits
  245. // Sleep Mode Control Register
  246. SE = $00;
  247. SM0 = $01; // Sleep Mode Select Bits
  248. SM1 = $02; // Sleep Mode Select Bits
  249. SM2 = $03; // Sleep Mode Select Bits
  250. // Reset Flag Register
  251. PORF = $00;
  252. EXTRF = $01;
  253. WDRF = $03;
  254. // Configuration Change Protection
  255. CCP0 = $00; // CCP signature
  256. CCP1 = $01; // CCP signature
  257. CCP2 = $02; // CCP signature
  258. CCP3 = $03; // CCP signature
  259. CCP4 = $04; // CCP signature
  260. CCP5 = $05; // CCP signature
  261. CCP6 = $06; // CCP signature
  262. CCP7 = $07; // CCP signature
  263. // Status Register
  264. C = $00;
  265. Z = $01;
  266. N = $02;
  267. V = $03;
  268. S = $04;
  269. H = $05;
  270. T = $06;
  271. I = $07;
  272. implementation
  273. {$define RELBRANCHES}
  274. {$i avrcommon.inc}
  275. procedure INT0_ISR; external name 'INT0_ISR'; // Interrupt 1 External Interrupt Request 0
  276. procedure PCINT0_ISR; external name 'PCINT0_ISR'; // Interrupt 2 Pin Change Interrupt Request 0
  277. procedure PCINT1_ISR; external name 'PCINT1_ISR'; // Interrupt 3 Pin Change Interrupt Request 1
  278. procedure TIM0_CAPT_ISR; external name 'TIM0_CAPT_ISR'; // Interrupt 4 Timer/Counter0 Input Capture
  279. procedure TIM0_OVF_ISR; external name 'TIM0_OVF_ISR'; // Interrupt 5 Timer/Counter0 Overflow
  280. procedure TIM0_COMPA_ISR; external name 'TIM0_COMPA_ISR'; // Interrupt 6 Timer/Counter Compare Match A
  281. procedure TIM0_COMPB_ISR; external name 'TIM0_COMPB_ISR'; // Interrupt 7 Timer/Counter Compare Match B
  282. procedure ANA_COMP_ISR; external name 'ANA_COMP_ISR'; // Interrupt 8 Analog Comparator
  283. procedure WDT_ISR; external name 'WDT_ISR'; // Interrupt 9 Watchdog Time-out
  284. procedure VLM_ISR; external name 'VLM_ISR'; // Interrupt 10 Vcc Voltage Level Monitor
  285. procedure ADC_ISR; external name 'ADC_ISR'; // Interrupt 11 ADC Conversion complete
  286. procedure USART_RXS_ISR; external name 'USART_RXS_ISR'; // Interrupt 12 USART RX Start
  287. procedure USART_RXC_ISR; external name 'USART_RXC_ISR'; // Interrupt 13 USART RX Complete
  288. procedure USART_DRE_ISR; external name 'USART_DRE_ISR'; // Interrupt 14 USART Data register empty
  289. procedure USART_TXC_ISR; external name 'USART_TXC_ISR'; // Interrupt 15 USART Tx Complete
  290. procedure _FPC_start; assembler; nostackframe; noreturn; public name '_START'; section '.init';
  291. asm
  292. rjmp __dtors_end
  293. rjmp INT0_ISR
  294. rjmp PCINT0_ISR
  295. rjmp PCINT1_ISR
  296. rjmp TIM0_CAPT_ISR
  297. rjmp TIM0_OVF_ISR
  298. rjmp TIM0_COMPA_ISR
  299. rjmp TIM0_COMPB_ISR
  300. rjmp ANA_COMP_ISR
  301. rjmp WDT_ISR
  302. rjmp VLM_ISR
  303. rjmp ADC_ISR
  304. rjmp USART_RXS_ISR
  305. rjmp USART_RXC_ISR
  306. rjmp USART_DRE_ISR
  307. rjmp USART_TXC_ISR
  308. .weak INT0_ISR
  309. .weak PCINT0_ISR
  310. .weak PCINT1_ISR
  311. .weak TIM0_CAPT_ISR
  312. .weak TIM0_OVF_ISR
  313. .weak TIM0_COMPA_ISR
  314. .weak TIM0_COMPB_ISR
  315. .weak ANA_COMP_ISR
  316. .weak WDT_ISR
  317. .weak VLM_ISR
  318. .weak ADC_ISR
  319. .weak USART_RXS_ISR
  320. .weak USART_RXC_ISR
  321. .weak USART_DRE_ISR
  322. .weak USART_TXC_ISR
  323. .set INT0_ISR, Default_IRQ_handler
  324. .set PCINT0_ISR, Default_IRQ_handler
  325. .set PCINT1_ISR, Default_IRQ_handler
  326. .set TIM0_CAPT_ISR, Default_IRQ_handler
  327. .set TIM0_OVF_ISR, Default_IRQ_handler
  328. .set TIM0_COMPA_ISR, Default_IRQ_handler
  329. .set TIM0_COMPB_ISR, Default_IRQ_handler
  330. .set ANA_COMP_ISR, Default_IRQ_handler
  331. .set WDT_ISR, Default_IRQ_handler
  332. .set VLM_ISR, Default_IRQ_handler
  333. .set ADC_ISR, Default_IRQ_handler
  334. .set USART_RXS_ISR, Default_IRQ_handler
  335. .set USART_RXC_ISR, Default_IRQ_handler
  336. .set USART_DRE_ISR, Default_IRQ_handler
  337. .set USART_TXC_ISR, Default_IRQ_handler
  338. end;
  339. end.