yagbas 0.2.0

Yagbas is a programming language that builds programs for the Game Boy.
Documentation
/*
Fullscreen Background Example for the Nintendo Game Boy
based on the assembly example by tbsp
https://github.com/tbsp/simple-gb-asm-examples/blob/master/src/background-fullscreen/background-fullscreen.asm
*/

#[hram]
static ram VBlankDone: u8 = 0;

static rom TileData: [Tile; _] = include_png_tiles!("starry-night-tiles.png");

#[irq_handler]
fn vblank_vector() {
  *VBlankDone = 1;
  *LCDC = LcdCtrl {
    lcd_enabled, bg_win_enabled, 
  };
}

#[irq_handler]
fn stat_vector() {
  *LCDC = LcdCtrl {
    lcd_enabled, bg_win_enabled, bg_win_tiles_signed,
  };
}

fn main() {
  disable_interrupts!();
  set_stack_pointer!($E000);
  *NR52 = AudioMain {};
  'wait_for_vblank: loop {
    if *LY == VBLANK_START {
      break
    }
  };
  *LCDC = LcdCtrl {};
  // copy just 240 tiles
  memcpy($8000, TileData, size_of!(TileData.0)*240);
  // copy the other 120 tiles
  memcpy($9000, TileData.241, size_of!(TileData.0)*120);
  
  let tiles_per_row_advance = TILEMAP_WIDTH-SCREEN_WIDTH_TILES;
  let tile_addr = $9800;
  let id = 0;
  let y = SCREEN_HEIGHT_TILES;
  let x = SCREEN_WIDTH_TILES;
  loop {
    loop x times {
      *tile_addr = id;
      tile_addr += 1;
      id += 1;
    };
    tile_addr += tiles_per_row_advance;
    y -= 1;
    if y == 7 {
      id = 0;
    };
    if y == 0 {
      break
    };
  };
  
  [BGP] = STANDARD_PALETTE;
  [SCX] = 0;
  [SCY] = 0;
  
  setup_vblank_and_stat_interrupts();
  
  *LCDC = LdcCtrl { lcd_enabled, bg_win_enabled };
  loop {
    wait_vblank();
  }
}

fn setup_vblank_and_stat_interrupts() {
  *STAT = LcdStatus { lyc_eq_ly_irq };
  *LYC = 96;
  *IE = Interrupts { vblank, stat };
  *IF = Interrupts {};
  enable_interrupts!();
}

fn wait_vblank() {
  *VBlankDone = 0;
  loop {
    halt!();
    if *VBlankDone != 0 {
      return
    }
  }
}