Pinchange and udre interrupts

Im getting data via parallel connection with strobe signal into the parallel to serial converter based on 328p which is in process to being ported to attiny204.

In original code i used serial library. Code was too big to port to attiny so after getting rid of libraries i made it work with just reading all 8 parallel lines into 1 pind register and polling udre0 to fill with new byte from pind.

But now i want to change it to use interrupts on pinchange i.e. strobe signal which is going from high to low when 8 bits are ready to be sent to avr.

Came up with this pseudo code but want to get rid of polling of udre0 inside that isr spent some time and cant get how to construct the logic.

Sender doesn’t have end marker for end line i can catch it only with timming and 300ms works very stable to detect that.

//strobe signal is connected to the pin for //which interrupt is enabled(falling edge)
Pinchange interrupt{
Busy; //set some pin high/low
If (time>300) udr=newline;
Not_busy;set some pin high/low


Spent some time but still cant make it work with interrupts the final working code for 328p:

#define NOT_BUSY() (PORTB&=~(_BV(PB4)))
#define BUSY() (PORTB|=_BV(PB4))

unsigned long current_time = 0;

void setup() {
  // put your setup code here, to run once:
  DDRD = 0;
  DDRD |= _BV(DDD1);
  DDRB = 0;
  DDRB |= _BV(DDB3) | _BV(DDB4);

  PORTD = 0;
  PORTB = 0;
  PORTB |= _BV(PB0) | _BV(PB1) | _BV(PB2);
  PORTD |= _BV(PD7) | _BV(PD6) | _BV(PD5) | _BV(PD4) | _BV(PD3) | _BV(PD2);

  UBRR0L = 0;
  UCSR0B = _BV(TXEN0);

void loop() {
  // put your main code here, to run repeatedly:


  current_time = millis();

  loop_until_bit_is_clear(PIND, PD2);


  if ((millis() - current_time) > 300) {
    loop_until_bit_is_set(UCSR0A, UDRE0);
    UDR0 = '\n';

  loop_until_bit_is_set(UCSR0A, UDRE0);

  UDR0 = (PIND >> 3) | (PINB << 5);



Serial speed is set to 1Mbps works flawlessly. But still would like to use interrupts INT0 or INT1 falling edge for
loop_until_bit_is_clear(PIND, PD2); and to get rid of polling UDRE0 loop_until_bit_is_set(UCSR0A, UDRE0);