attiny104.pp 12 KB

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