; ----------------------------------------------------------------------------- ; Example: Hello world - DMG ver. ; ----------------------------------------------------------------------------- ; Font comes from ZX Spectrum - https://en.wikipedia.org/wiki/ZX_Spectrum_character_set ; More examples by tmk @ https://github.com/gitendo/helloworld ; ----------------------------------------------------------------------------- INCLUDE "hardware.inc" ; system defines SECTION "Start",ROM0[$100] ; start vector, followed by header data applied by rgbfix.exe nop jp start SECTION "Example",ROM0[$150] ; code starts here start: di ; disable interrupts ld sp,$E000 ; setup stack .wait_vbl ; wait for vblank to properly disable lcd ld a,[rLY] cp $90 jr nz,.wait_vbl xor a ld [rIF],a ; reset important registers ld [rLCDC],a ld [rSTAT],a ld [rSCX],a ld [rSCY],a ld [rLYC],a ld [rIE],a ld hl,_RAM ; clear ram (fill with a which is 0 here) ld bc,$2000-2 ; watch out for stack ;) call fill ld hl,_HRAM ; clear hram ld c,$80 ; a = 0, b = 0 here, so let's save a byte and 4 cycles (ld c,$80 - 2/8 vs ld bc,$80 - 3/12) call fill ld hl,_VRAM ; clear vram ld b,$18 ; a = 0, bc should be $1800; c = 0 here, so.. call fill ld a,$20 ; ascii code for 'space' character ; no need to setup hl since _SCRN0 ($9800) and _SCRN1 ($9C00) are part of _VRAM, just continue ld b,8 ; bc should be $800 (_SCRN0/1 are 32*32 bytes); c = 0 here, so.. call fill ld a,%10010011 ; bits: 7-6 = 1st color, 5-4 = 2nd, 3-2 = 3rd and 1-0 = 4th color ; color values: 00 - light, 01 - gray, 10 - dark gray, 11 - dark ld [rBGP],a ; bg palette ld [rOBP0],a ; obj palettes (not used in this example) ld [rOBP1],a ld hl,font ; font data ld de,_VRAM+$200 ; place it here to get ascii mapping ('space' code is $20, tile size $10) ld bc,1776 ; font_8x8.chr file size call copy ld hl,text ; hello message ld de,_SCRN0+$100 ; center it a bit ld c,text_end-text ; b = 0, our string = 18 chars, so.. call copy ; lcdc is disabled so you have 'easy' access to vram ld a,LCDCF_ON | LCDCF_BG8000 | LCDCF_BG9800 | LCDCF_OBJ8 | LCDCF_OBJOFF | LCDCF_WINOFF | LCDCF_BGON ; lcd setup: tiles at $8000, map at $9800, 8x8 sprites (disabled), no window, etc. ld [rLCDC],a ; enable lcd .the_end halt ; save battery ; nop ; nop after halt is mandatory but rgbasm takes care of it :) jr .the_end ; endless loop ;------------------------------------------------------------------------------- copy: ;------------------------------------------------------------------------------- ; hl - source address ; de - destination ; bc - size inc b inc c jr .skip .copy ld a,[hl+] ld [de],a inc de .skip dec c jr nz,.copy dec b jr nz,.copy ret ;------------------------------------------------------------------------------- fill: ;------------------------------------------------------------------------------- ; a - byte to fill with ; hl - destination address ; bc - size of area to fill inc b inc c jr .skip .fill ld [hl+],a .skip dec c jr nz,.fill dec b jr nz,.fill ret ;------------------------------------------------------------------------------- font: INCBIN "font_8x8.chr" ; converted with https://github.com/gitendo/bmp2cgb text: DB " Hello 8-bit world! " text_end: