videochargen/main.c

55 lines
1.2 KiB
C

/**
* @file main.c
* @author giomba@glgprograms.it
* @brief OSDY main.
*
* @copyright Copyright RetrOfficina GLG Programs (c) 2022
*
* Video image generator superimposition for analog PAL signals,
* with Atmega328, for your retro OSD titles.
*
*/
#include "const.h"
#include <avr/interrupt.h>
#include <avr/io.h>
#include <string.h>
volatile uint16_t frame = 0;
volatile uint16_t line = 0xfe;
volatile uint8_t image = 0xff;
ISR(INT0_vect, ISR_NAKED) {
// vertical sync interrupt
asm("jmp int_vertical_sync");
}
ISR(INT1_vect, ISR_NAKED) {
// horizontal sync interrupt
asm("jmp int_horizontal_sync");
}
ISR(TIMER0_COMPA_vect, ISR_NAKED) {
// back porch timer interrupt
asm("jmp int_timer_0");
}
// external assembly main loop
void main_asm(void);
int main() {
// port B, pin 4 and 5 as output, others as input
DDRB |= 0x30;
// set interrupt vectors at address 0x0, not bootloader
// timing is important, see atmel datasheet
_SFR_IO8(MCUCR) = (1 << IVCE);
_SFR_IO8(MCUCR) = 0;
EICRA = 0x0a; // external interrupt 0 and 1, falling edge
EIMSK = 0x03; // external interrupt 0 and 1, mask enable
TCCR0A = 0x02; // don't connect output pins to timer, CTC[1:0] mode
TCCR0B = 0x01; // CTC[2] mode, no prescaler
main_asm();
}