
/* t570.c  "МЯУ" */
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

static volatile uint8_t r4 = 0, r9 = 0, r16 = 0;

uint8_t frame[16][32][3];

ISR(TIMER0_OVF_vect) {
   TCNT0 = 0xC8; r4++;
   if (r4 != 0) {
       PORTB &= ~(1 << PB3); asm volatile("nop"); asm volatile("nop"); PORTB |= (1 << PB3);
       return;
   }
   uint8_t r17 = 0x70; r9--;
   if (r9 == 0) { if (r16 & 0x01) r16 |= 0x02; }
   do { r17--; } while (r17 != 0);
   r16 &= 0xF7;
}

static inline void out_pixel(uint8_t r, uint8_t g, uint8_t b) {
   PORTA = r; PORTB |= (1<<PB2); PORTB &= ~(1<<PB2);
   PORTA = g; PORTB |= (1<<PB2); PORTB &= ~(1<<PB2);
   PORTA = b; PORTB |= (1<<PB2); PORTB &= ~(1<<PB2);
   PORTA = 0x00;
}

static inline void latch_pb0(void) {
   PORTB &= ~(1<<PB0);
   asm volatile("nop\nnop");
   PORTB |= (1<<PB0);
}

void flip_bank(void) {
   PORTB &= ~(1<<PB1);
   PORTB |= (1<<PB1);
}

void clear_frame(void) {
   for (uint8_t y = 0; y < 16; y++) {
       for (uint8_t x = 0; x < 32; x++) {
           frame[y][x][0] = 0;
           frame[y][x][1] = 0;
           frame[y][x][2] = 0;
       }
   }
}

void set_pixel(uint8_t x, uint8_t y, uint8_t r, uint8_t g, uint8_t b) {
   if (x > 31 || y > 15) return;
   frame[y][x][0] = r;
   frame[y][x][1] = g;
   frame[y][x][2] = b;
}

void update_screen(void) {
   for (uint8_t row = 0; row < 16; row++) {
       for (uint8_t x = 0; x < 32; x++) {
           out_pixel(frame[row][x][0], frame[row][x][1], frame[row][x][2]);
       }
       latch_pb0();
   }
   flip_bank();
}

// Крупный шрифт 7x11
const uint8_t font_M_large[11] = {
   0x41, 0x63, 0x55, 0x55, 0x49, 0x49, 0x41, 0x41, 0x41, 0x41, 0x41
};

const uint8_t font_YA_large[11] = {
   0x1F, 0x21, 0x21, 0x21, 0x1F, 0x05, 0x09, 0x11, 0x21, 0x21, 0x21
};

// Надстроенная "У" (11 строк) - добавили 2 строки сверху
const uint8_t font_U_large[11] = {
   0x83, // 10000011 (новая)
   0x83, // 10000011 (новая)
   0x83, // 10000011 (было)
   0x43, // 01000011 (было)
   0x23, // 00100011 (было)
   0x13, // 00010011 (было)
   0x0C, // 00001100 (было)
   0x18, // 00011000 (было)
   0x30, // 00110000 (было)
   0x60, // 01100000 (было)
   0xC0  // 11000000 (было)
};

void draw_char_7bit(uint8_t x, uint8_t y, const uint8_t *font, uint8_t r, uint8_t g, uint8_t b) {
   for (uint8_t row = 0; row < 11; row++) {
       uint8_t bits = font[row];
       for (uint8_t col = 0; col < 7; col++) {
           if (bits & (0x40 >> col)) {
               set_pixel(x + col, y + row, r, g, b);
           }
       }
   }
}

void draw_char_8bit(uint8_t x, uint8_t y, const uint8_t *font, uint8_t r, uint8_t g, uint8_t b) {
   for (uint8_t row = 0; row < 11; row++) {
       uint8_t bits = font[row];
       for (uint8_t col = 0; col < 8; col++) {
           if (bits & (0x80 >> col)) {
               set_pixel(x + col, y + row, r, g, b);
           }
       }
   }
}

int main(void) {
   DDRA = 0xFF; DDRB = 0xFF; DDRC = 0xFF; DDRD = 0xFF; DDRE = 0xFF;
   PORTA = 0x00; PORTC = 0x00; PORTB = 0xFB; PORTD = 0x0D; PORTE = 0x00;
   TCCR1A = 0; TCCR1B = 0; TCCR3A = 0; TCCR3B = 0;
   TCCR0 = 2; TCNT0 = 0xC8; TIMSK |= (1 << TOIE0);
   sei(); _delay_ms(500);
   PORTB = (PORTB & 0x1F); PORTC = 0x00; PORTE = 0x00;
   PORTB |= (1<<PB1)|(1<<PB0);

   clear_frame();

   // 1. Градиентный фон (тусклый, /16)
   for (uint8_t y = 0; y < 16; y++) {
       for (uint8_t x = 0; x < 32; x++) {
           uint8_t r, g, b;
           if (x < 10) {
               r = 0xFF;
               g = (x * 0xFF) / 10;
               b = 0x00;
           } else if (x < 20) {
               r = 0xFF - ((x - 10) * 0xFF) / 10;
               g = 0xFF;
               b = 0x00;
           } else {
               r = 0x00;
               g = 0xFF - ((x - 20) * 0xFF) / 11;
               b = ((x - 20) * 0xFF) / 11;
           }
           set_pixel(x, y, r / 16, g / 16, b / 16);
       }
   }

   // 2. Буквы "МЯУ" (y = 3)
   draw_char_7bit(1, 3, font_M_large, 0x00, 0xFF, 0x00);   // М (зеленый)
   draw_char_7bit(11, 3, font_YA_large, 0x00, 0x00, 0xFF); // Я (синий)
   draw_char_8bit(20, 3, font_U_large, 0xFF, 0xFF, 0x00);  // У (желтый, 8-битный, y=3)

   update_screen();

   for (;;) { }
}
