# Fantasy GB Assembly
gbrs = Game Boy Rusty Style
hello-world.gbrs
```rust
#![mbc(none)]
#![ram(none)]
#![entry(EntryPoint)]
// Using the above attributes, the correct header would
// be generated automatically. We don't have to fiddle
// with adding the correct amount of space and that stuff.
const ZERO = 0; // a literal alias uses rust-like syntax
#[link(rom0)]
section "EntryPoint" {
// this specific indentation style is not mandatory, but doing it
// with labels 1 level in and code 2 levels in lets vscode and
// similar editors automatically know how to code fold it.
EntryPoint:
// Shut down audio circuitry
ld a, ZERO
ld [rNR52], a
WaitVBlank:
// Do not turn the LCD off outside of VBlank
ld a, [rLY]
cp 144
jp c, WaitVBlank
// Turn the LCD off
ld a, 0
ld [rLCDC], a
// Copy the tile data
ld de, Tiles
ld hl, $9000
ld bc, size_of_val!(TILES)
CopyTiles:
ld a, [de]
ld [hli], a
inc de
dec bc
ld a, b
or a, c
jp nz, CopyTiles
// Copy the tilemap
ld de, Tilemap
ld hl, $9800
ld bc, size_of_val!(TILE_MAP)
CopyTilemap:
ld a, [de]
ld [hli], a
inc de
dec bc
ld a, b
or a, c
jp nz, CopyTilemap
// Turn the LCD on
ld a, LCDCF_ON | LCDCF_BGON
ld [rLCDC], a
// During the first (blank) frame,
// initialize display registers
ld a, %11100100
ld [rBGP], a
Done:
jp Done
}
#[link(rom0)]
static TILES: &[u8] = include_bytes!("tiles.dat");
// if there's no link attribute, assume rom0
static TILE_MAP: &[u8] = include_bytes!("tile_map.dat");
```