mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-10-31 21:29:41 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			350 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
			
		
		
	
	
			350 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
| unit ATtiny104;
 | |
| 
 | |
| interface
 | |
| 
 | |
| var
 | |
|   PINA: byte absolute $00;  // Input Pins, Port A
 | |
|   DDRA: byte absolute $01;  // Data Direction Register, Port A
 | |
|   PORTA: byte absolute $02;  // Port A Data register
 | |
|   PUEA: byte absolute $03;  // Pull-up Enable Control Register for PORTA
 | |
|   PINB: byte absolute $04;  // Input Pins, Port B
 | |
|   DDRB: byte absolute $05;  // Data Direction Register, Port B
 | |
|   PORTB: byte absolute $06;  // Port B Data register
 | |
|   PUEB: byte absolute $07;  // Pull-up Enable Control Register for PORTB
 | |
|   UDR: byte absolute $08;  // USART I/O Data Register
 | |
|   UBRR: word absolute $09;  // USART Baud Rate Register  Bytes
 | |
|   UBRRL: byte absolute $09;  // USART Baud Rate Register  Bytes
 | |
|   UBRRH: byte absolute $0A;  // USART Baud Rate Register  Bytes;
 | |
|   UCSRD: byte absolute $0B;  // USART Control and Status Register D
 | |
|   UCSRC: byte absolute $0C;  // USART Control and Status Register C
 | |
|   UCSRB: byte absolute $0D;  // USART Control and Status Register B
 | |
|   UCSRA: byte absolute $0E;  // USART Control and Status Register A
 | |
|   PCMSK0: byte absolute $0F;  // Pin Change Mask Register 0
 | |
|   PCMSK1: byte absolute $10;  // Pin Change Mask Register 1
 | |
|   PCIFR: byte absolute $11;  // Pin Change Interrupt Flag Register
 | |
|   PCICR: byte absolute $12;  // Pin Change Interrupt Control Register
 | |
|   EIMSK: byte absolute $13;  // External Interrupt Mask register
 | |
|   EIFR: byte absolute $14;  // External Interrupt Flag register
 | |
|   EICRA: byte absolute $15;  // External Interrupt Control Register A
 | |
|   PORTCR: byte absolute $16;  // Port Control Register
 | |
|   DIDR0: byte absolute $17;
 | |
|   ADCL: byte absolute $19;  // ADC Data Register Low
 | |
|   ADCH: byte absolute $1A;  // ADC Data Register High
 | |
|   ADMUX: byte absolute $1B;  // The ADC multiplexer Selection Register
 | |
|   ADCSRB: byte absolute $1C;  // The ADC Control and Status register B
 | |
|   ADCSRA: byte absolute $1D;  // The ADC Control and Status register A
 | |
|   ACSRB: byte absolute $1E;  // Analog Comparator Control And Status Register B
 | |
|   ACSRA: byte absolute $1F;  // Analog Comparator Control And Status Register A
 | |
|   ICR0: word absolute $22;  // Input Capture Register  Bytes
 | |
|   ICR0L: byte absolute $22;  // Input Capture Register  Bytes
 | |
|   ICR0H: byte absolute $23;  // Input Capture Register  Bytes;
 | |
|   OCR0B: word absolute $24;  // Timer/Counter0 Output Compare Register B 
 | |
|   OCR0BL: byte absolute $24;  // Timer/Counter0 Output Compare Register B 
 | |
|   OCR0BH: byte absolute $25;  // Timer/Counter0 Output Compare Register B ;
 | |
|   OCR0A: word absolute $26;  // Timer/Counter 0 Output Compare Register A 
 | |
|   OCR0AL: byte absolute $26;  // Timer/Counter 0 Output Compare Register A 
 | |
|   OCR0AH: byte absolute $27;  // Timer/Counter 0 Output Compare Register A ;
 | |
|   TCNT0: word absolute $28;  // Timer/Counter0 
 | |
|   TCNT0L: byte absolute $28;  // Timer/Counter0 
 | |
|   TCNT0H: byte absolute $29;  // Timer/Counter0 ;
 | |
|   TIFR0: byte absolute $2A;  // Overflow Interrupt Enable
 | |
|   TIMSK0: byte absolute $2B;  // Timer Interrupt Mask Register 0
 | |
|   TCCR0C: byte absolute $2C;  // Timer/Counter 0 Control Register C
 | |
|   TCCR0B: byte absolute $2D;  // Timer/Counter 0 Control Register B
 | |
|   TCCR0A: byte absolute $2E;  // Timer/Counter 0 Control Register A
 | |
|   GTCCR: byte absolute $2F;  // General Timer/Counter Control Register
 | |
|   WDTCSR: byte absolute $31;  // Watchdog Timer Control and Status Register
 | |
|   NVMCSR: byte absolute $32;  // Non-Volatile Memory Control and Status Register
 | |
|   NVMCMD: byte absolute $33;  // Non-Volatile Memory Command
 | |
|   VLMCSR: byte absolute $34;  // Vcc Level Monitoring Control and Status Register
 | |
|   PRR: byte absolute $35;  // Power Reduction Register
 | |
|   CLKPSR: byte absolute $36;  // Clock Prescale Register
 | |
|   CLKMSR: byte absolute $37;  // Clock Main Settings Register
 | |
|   OSCCAL: byte absolute $39;  // Oscillator Calibration Value
 | |
|   SMCR: byte absolute $3A;  // Sleep Mode Control Register
 | |
|   RSTFLR: byte absolute $3B;  // Reset Flag Register
 | |
|   CCP: byte absolute $3C;  // Configuration Change Protection
 | |
|   SP: word absolute $3D;  // Stack Pointer 
 | |
|   SPL: byte absolute $3D;  // Stack Pointer 
 | |
|   SPH: byte absolute $3E;  // Stack Pointer ;
 | |
|   SREG: byte absolute $3F;  // Status Register
 | |
| 
 | |
| const
 | |
|   // Port A Data register
 | |
|   PA0 = $00;  
 | |
|   PA1 = $01;  
 | |
|   PA2 = $02;  
 | |
|   PA3 = $03;  
 | |
|   PA4 = $04;  
 | |
|   PA5 = $05;  
 | |
|   PA6 = $06;  
 | |
|   PA7 = $07;  
 | |
|   // Port B Data register
 | |
|   PB0 = $00;  
 | |
|   PB1 = $01;  
 | |
|   PB2 = $02;  
 | |
|   PB3 = $03;  
 | |
|   // USART Control and Status Register D
 | |
|   SFDE = $05;  
 | |
|   RXS = $06;  
 | |
|   RXSIE = $07;  
 | |
|   // USART Control and Status Register C
 | |
|   UCPOL = $00;  
 | |
|   UCSZ0 = $01;  // Character Size
 | |
|   UCSZ1 = $02;  // Character Size
 | |
|   USBS = $03;  
 | |
|   UPM0 = $04;  // Parity Mode Bits
 | |
|   UPM1 = $05;  // Parity Mode Bits
 | |
|   UMSEL0 = $06;  // USART Mode Select
 | |
|   UMSEL1 = $07;  // USART Mode Select
 | |
|   // USART Control and Status Register B
 | |
|   TXB8 = $00;  
 | |
|   RXB8 = $01;  
 | |
|   UCSZ2 = $02;  
 | |
|   TXEN = $03;  
 | |
|   RXEN = $04;  
 | |
|   UDRIE = $05;  
 | |
|   TXCIE = $06;  
 | |
|   RXCIE = $07;  
 | |
|   // USART Control and Status Register A
 | |
|   MPCM = $00;  
 | |
|   U2X = $01;  
 | |
|   UPE = $02;  
 | |
|   DOR = $03;  
 | |
|   FE = $04;  
 | |
|   UDRE = $05;  
 | |
|   TXC = $06;  
 | |
|   RXC = $07;  
 | |
|   // Pin Change Mask Register 0
 | |
|   PCINT0 = $00;  
 | |
|   PCINT1 = $01;  
 | |
|   PCINT2 = $02;  
 | |
|   PCINT3 = $03;  
 | |
|   PCINT4 = $04;  
 | |
|   PCINT5 = $05;  
 | |
|   PCINT6 = $06;  
 | |
|   PCINT7 = $07;  
 | |
|   // Pin Change Mask Register 1
 | |
|   PCINT8 = $00;  
 | |
|   PCINT9 = $01;  
 | |
|   PCINT10 = $02;  
 | |
|   PCINT11 = $03;  
 | |
|   // Pin Change Interrupt Flag Register
 | |
|   PCIF0 = $00;  
 | |
|   PCIF1 = $01;  
 | |
|   // Pin Change Interrupt Control Register
 | |
|   PCIE0 = $00;  
 | |
|   PCIE1 = $01;  
 | |
|   // External Interrupt Mask register
 | |
|   INT0 = $00;  
 | |
|   // External Interrupt Flag register
 | |
|   INTF0 = $00;  
 | |
|   // External Interrupt Control Register A
 | |
|   ISC00 = $00;  
 | |
|   ISC01 = $01;  
 | |
|   // Port Control Register
 | |
|   BBMA = $00;  
 | |
|   BBMB = $01;  
 | |
|   ADC0D = $00;  
 | |
|   AIN0D = $00;  
 | |
|   ADC1D = $01;  
 | |
|   AIN1D = $01;  
 | |
|   ADC2D = $02;  
 | |
|   ADC3D = $03;  
 | |
|   ADC4D = $04;  
 | |
|   ADC5D = $05;  
 | |
|   ADC6D = $06;  
 | |
|   ADC7D = $07;  
 | |
|   // The ADC multiplexer Selection Register
 | |
|   MUX0 = $00;  // Analog Channel Selection Bits
 | |
|   MUX1 = $01;  // Analog Channel Selection Bits
 | |
|   MUX2 = $02;  // Analog Channel Selection Bits
 | |
|   REFS0 = $06;  // Analog Reference voltage Selection Bits
 | |
|   REFS1 = $07;  // Analog Reference voltage Selection Bits
 | |
|   // The ADC Control and Status register B
 | |
|   ADTS0 = $00;  // ADC Auto Trigger Source bits
 | |
|   ADTS1 = $01;  // ADC Auto Trigger Source bits
 | |
|   ADTS2 = $02;  // ADC Auto Trigger Source bits
 | |
|   ADLAR = $07;  
 | |
|   // The ADC Control and Status register A
 | |
|   ADPS0 = $00;  // ADC  Prescaler Select Bits
 | |
|   ADPS1 = $01;  // ADC  Prescaler Select Bits
 | |
|   ADPS2 = $02;  // ADC  Prescaler Select Bits
 | |
|   ADIE = $03;  
 | |
|   ADIF = $04;  
 | |
|   ADATE = $05;  
 | |
|   ADSC = $06;  
 | |
|   ADEN = $07;  
 | |
|   // Analog Comparator Control And Status Register B
 | |
|   ACPMUX = $00;  
 | |
|   ACOE = $01;  
 | |
|   // Analog Comparator Control And Status Register A
 | |
|   ACIS0 = $00;  // Analog Comparator Interrupt Mode Select bits
 | |
|   ACIS1 = $01;  // Analog Comparator Interrupt Mode Select bits
 | |
|   ACIC = $02;  
 | |
|   ACIE = $03;  
 | |
|   ACI = $04;  
 | |
|   ACO = $05;  
 | |
|   ACBG = $06;  
 | |
|   ACD = $07;  
 | |
|   // Overflow Interrupt Enable
 | |
|   TOV0 = $00;  
 | |
|   OCF0A = $01;  
 | |
|   OCF0B = $02;  
 | |
|   ICF0 = $05;  
 | |
|   // Timer Interrupt Mask Register 0
 | |
|   TOIE0 = $00;  
 | |
|   OCIE0A = $01;  
 | |
|   OCIE0B = $02;  
 | |
|   ICIE0 = $05;  
 | |
|   // Timer/Counter 0 Control Register C
 | |
|   FOC0B = $06;  
 | |
|   FOC0A = $07;  
 | |
|   // Timer/Counter 0 Control Register B
 | |
|   CS00 = $00;  // Clock Select
 | |
|   CS01 = $01;  // Clock Select
 | |
|   CS02 = $02;  // Clock Select
 | |
|   ICES0 = $06;  
 | |
|   ICNC0 = $07;  
 | |
|   // Timer/Counter 0 Control Register A
 | |
|   WGM00 = $00;  // Waveform Generation Mode
 | |
|   WGM01 = $01;  // Waveform Generation Mode
 | |
|   COM0B0 = $04;  // Compare Output Mode for Channel B bits
 | |
|   COM0B1 = $05;  // Compare Output Mode for Channel B bits
 | |
|   COM0A0 = $06;  // Compare Output Mode for Channel A bits
 | |
|   COM0A1 = $07;  // Compare Output Mode for Channel A bits
 | |
|   // General Timer/Counter Control Register
 | |
|   PSR = $00;  
 | |
|   REMAP = $01;  
 | |
|   TSM = $07;  
 | |
|   // Watchdog Timer Control and Status Register
 | |
|   WDE = $03;  
 | |
|   WDP0 = $00;  // Watchdog Timer Prescaler Bits
 | |
|   WDP1 = $01;  // Watchdog Timer Prescaler Bits
 | |
|   WDP2 = $02;  // Watchdog Timer Prescaler Bits
 | |
|   WDP3 = $05;  // Watchdog Timer Prescaler Bits
 | |
|   WDIE = $06;  
 | |
|   WDIF = $07;  
 | |
|   // Non-Volatile Memory Control and Status Register
 | |
|   NVMBSY = $07;  
 | |
|   // Vcc Level Monitoring Control and Status Register
 | |
|   VLM0 = $00;  // Trigger Level of Voltage Level Monitor bits
 | |
|   VLM1 = $01;  // Trigger Level of Voltage Level Monitor bits
 | |
|   VLM2 = $02;  // Trigger Level of Voltage Level Monitor bits
 | |
|   VLMIE = $06;  
 | |
|   VLMF = $07;  
 | |
|   // Power Reduction Register
 | |
|   PRTIM0 = $00;  
 | |
|   PRADC = $01;  
 | |
|   PRUSART = $02;  
 | |
|   // Clock Prescale Register
 | |
|   CLKPS0 = $00;  // Clock Prescaler Select Bits
 | |
|   CLKPS1 = $01;  // Clock Prescaler Select Bits
 | |
|   CLKPS2 = $02;  // Clock Prescaler Select Bits
 | |
|   CLKPS3 = $03;  // Clock Prescaler Select Bits
 | |
|   // Clock Main Settings Register
 | |
|   CLKMS0 = $00;  // Clock Main Select Bits
 | |
|   CLKMS1 = $01;  // Clock Main Select Bits
 | |
|   // Sleep Mode Control Register
 | |
|   SE = $00;  
 | |
|   SM0 = $01;  // Sleep Mode Select Bits
 | |
|   SM1 = $02;  // Sleep Mode Select Bits
 | |
|   SM2 = $03;  // Sleep Mode Select Bits
 | |
|   // Reset Flag Register
 | |
|   PORF = $00;  
 | |
|   EXTRF = $01;  
 | |
|   WDRF = $03;  
 | |
|   // Configuration Change Protection
 | |
|   CCP0 = $00;  // CCP signature
 | |
|   CCP1 = $01;  // CCP signature
 | |
|   CCP2 = $02;  // CCP signature
 | |
|   CCP3 = $03;  // CCP signature
 | |
|   CCP4 = $04;  // CCP signature
 | |
|   CCP5 = $05;  // CCP signature
 | |
|   CCP6 = $06;  // CCP signature
 | |
|   CCP7 = $07;  // CCP signature
 | |
|   // Status Register
 | |
|   C = $00;  
 | |
|   Z = $01;  
 | |
|   N = $02;  
 | |
|   V = $03;  
 | |
|   S = $04;  
 | |
|   H = $05;  
 | |
|   T = $06;  
 | |
|   I = $07;  
 | |
| 
 | |
| 
 | |
| implementation
 | |
| {$define RELBRANCHES}
 | |
| {$i avrcommon.inc}
 | |
| 
 | |
| procedure INT0_ISR; external name 'INT0_ISR'; // Interrupt 1 External Interrupt Request 0
 | |
| procedure PCINT0_ISR; external name 'PCINT0_ISR'; // Interrupt 2 Pin Change Interrupt Request 0
 | |
| procedure PCINT1_ISR; external name 'PCINT1_ISR'; // Interrupt 3 Pin Change Interrupt Request 1
 | |
| procedure TIM0_CAPT_ISR; external name 'TIM0_CAPT_ISR'; // Interrupt 4 Timer/Counter0 Input Capture
 | |
| procedure TIM0_OVF_ISR; external name 'TIM0_OVF_ISR'; // Interrupt 5 Timer/Counter0 Overflow
 | |
| procedure TIM0_COMPA_ISR; external name 'TIM0_COMPA_ISR'; // Interrupt 6 Timer/Counter Compare Match A
 | |
| procedure TIM0_COMPB_ISR; external name 'TIM0_COMPB_ISR'; // Interrupt 7 Timer/Counter Compare Match B
 | |
| procedure ANA_COMP_ISR; external name 'ANA_COMP_ISR'; // Interrupt 8 Analog Comparator
 | |
| procedure WDT_ISR; external name 'WDT_ISR'; // Interrupt 9 Watchdog Time-out
 | |
| procedure VLM_ISR; external name 'VLM_ISR'; // Interrupt 10 Vcc Voltage Level Monitor
 | |
| procedure ADC_ISR; external name 'ADC_ISR'; // Interrupt 11 ADC Conversion complete
 | |
| procedure USART_RXS_ISR; external name 'USART_RXS_ISR'; // Interrupt 12 USART RX Start
 | |
| procedure USART_RXC_ISR; external name 'USART_RXC_ISR'; // Interrupt 13 USART RX Complete
 | |
| procedure USART_DRE_ISR; external name 'USART_DRE_ISR'; // Interrupt 14 USART Data register empty
 | |
| procedure USART_TXC_ISR; external name 'USART_TXC_ISR'; // Interrupt 15 USART Tx Complete
 | |
| 
 | |
| procedure _FPC_start; assembler; nostackframe; noreturn; public name '_START'; section '.init';
 | |
|  asm
 | |
|   rjmp __dtors_end
 | |
|   rjmp INT0_ISR
 | |
|   rjmp PCINT0_ISR
 | |
|   rjmp PCINT1_ISR
 | |
|   rjmp TIM0_CAPT_ISR
 | |
|   rjmp TIM0_OVF_ISR
 | |
|   rjmp TIM0_COMPA_ISR
 | |
|   rjmp TIM0_COMPB_ISR
 | |
|   rjmp ANA_COMP_ISR
 | |
|   rjmp WDT_ISR
 | |
|   rjmp VLM_ISR
 | |
|   rjmp ADC_ISR
 | |
|   rjmp USART_RXS_ISR
 | |
|   rjmp USART_RXC_ISR
 | |
|   rjmp USART_DRE_ISR
 | |
|   rjmp USART_TXC_ISR
 | |
| 
 | |
|   .weak INT0_ISR
 | |
|   .weak PCINT0_ISR
 | |
|   .weak PCINT1_ISR
 | |
|   .weak TIM0_CAPT_ISR
 | |
|   .weak TIM0_OVF_ISR
 | |
|   .weak TIM0_COMPA_ISR
 | |
|   .weak TIM0_COMPB_ISR
 | |
|   .weak ANA_COMP_ISR
 | |
|   .weak WDT_ISR
 | |
|   .weak VLM_ISR
 | |
|   .weak ADC_ISR
 | |
|   .weak USART_RXS_ISR
 | |
|   .weak USART_RXC_ISR
 | |
|   .weak USART_DRE_ISR
 | |
|   .weak USART_TXC_ISR
 | |
| 
 | |
|   .set INT0_ISR, Default_IRQ_handler
 | |
|   .set PCINT0_ISR, Default_IRQ_handler
 | |
|   .set PCINT1_ISR, Default_IRQ_handler
 | |
|   .set TIM0_CAPT_ISR, Default_IRQ_handler
 | |
|   .set TIM0_OVF_ISR, Default_IRQ_handler
 | |
|   .set TIM0_COMPA_ISR, Default_IRQ_handler
 | |
|   .set TIM0_COMPB_ISR, Default_IRQ_handler
 | |
|   .set ANA_COMP_ISR, Default_IRQ_handler
 | |
|   .set WDT_ISR, Default_IRQ_handler
 | |
|   .set VLM_ISR, Default_IRQ_handler
 | |
|   .set ADC_ISR, Default_IRQ_handler
 | |
|   .set USART_RXS_ISR, Default_IRQ_handler
 | |
|   .set USART_RXC_ISR, Default_IRQ_handler
 | |
|   .set USART_DRE_ISR, Default_IRQ_handler
 | |
|   .set USART_TXC_ISR, Default_IRQ_handler
 | |
| end;
 | |
| 
 | |
| end.
 | 
