ATTiny85 - sleep using Registers...

Been trying this as a learning exercise about regsiters and actually understanding datasheets much more in general...I know I could just copy code from the net and use libraries, but I want to understand what is actually going on "under the bonnet".

#include <avr/sleep.h>
#include <avr/io.h>        // Adds useful constants

#define red 0
#define yellow 1
#define button A2
#define temp_sensor A3

#define redOn digitalWrite(red,HIGH);
#define redOff digitalWrite(red,LOW);
#define yellowOn digitalWrite(yellow,HIGH);
#define yellowOff digitalWrite(yellow,LOW);

void setup()
{
  pinMode(red, OUTPUT);
  pinMode(yellow, OUTPUT);
  pinMode(temp_sensor, INPUT);
  pinMode(button, INPUT_PULLUP);
}
void loop()
{
  if (!digitalRead(button)) {
    decimalFlash(getTemp());
  }

  gotoSleep();

}

float getTemp() {

  float millivolts = analogRead(temp_sensor) * (getVcc() / 1000.0);

  float voltage = millivolts / 1024.0;

  return (voltage - 0.5) * 100;

}

long getVcc() {

  //reads internal 1V1 reference against VCC
  ADMUX = _BV(MUX3) | _BV(MUX2); // For ATtiny85/45

  delay(2); // Wait for Vref to settle
  ADCSRA |= _BV(ADSC); // Convert
  while (bit_is_set(ADCSRA, ADSC));
  uint8_t low = ADCL;
  unsigned int val = (ADCH << 8) | low;
  //discard previous result
  ADCSRA |= _BV(ADSC); // Convert
  while (bit_is_set(ADCSRA, ADSC));
  low = ADCL;
  val = (ADCH << 8) | low;

  return ((long)1024 * 1100) / val;

}

void decimalFlash(int a) {

  unsigned int tens = a / 10;
  unsigned int units = a % 10;

  for (byte t = 0; t < tens; t++) {
    redOn
    delay(200);
    redOff
    delay(200);
  }

  for (byte u = 0; u < units; u++) {
    yellowOn
    delay(200);
    yellowOff
    delay(200);
  }

  delay(500);

}

void gotoSleep() {
  SREG &= B01111111; // Disable I bit (interrupts).

  MCUCR |= (1 << SM1) | (0 << SM0); // Power Down Mode
  ADCSRA &= ~(1 << ADEN); //Disable ADC, saves ~230uA
  PRR = 0xFF;     // Power save.

  GIMSK |= (1 << PCIE); // General Interupts (Pin Change Interrupt)
  PCMSK = 0;
  PCMSK = (1 << PCINT4); // Any logic change on PB4 (PCINT4 / D4 / A2) causes interrupt.
  GIFR |= (1 << PCIF); // Flag set when interrupt occurs
  SREG |= B10000000; // Enable Interrupts...

  MCUCR |= (1 << SE); // Enable the sleep bit...
  sleep_cpu();
  sleep_disable();

  MCUCR |= (0 << SE); // Turn the sleep enable bit off.
  PRR = 0;        // Turn back on Modules.
  ADCSRA &= ~(0 << ADEN); //Enable ADC

}

I can't seem to wake the unit up again once it enters sleep.

Got a button from PB4 to GND.

The code I have written (tried to follow the datasheet) is at the very bottom.