From 18b78fa6c81cc778819c8a0a80dc69fe45fbd4af Mon Sep 17 00:00:00 2001 From: IIMarckus Date: Wed, 21 Feb 2018 22:33:01 -0700 Subject: Initial commit, containing DMG and MGB bootroms. --- .gitignore | 2 + Makefile | 12 +++++ dmg.s | 176 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ mgb.s | 176 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 366 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 dmg.s create mode 100644 mgb.s diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..98f5968 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*.bin +*.o diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..baad5a0 --- /dev/null +++ b/Makefile @@ -0,0 +1,12 @@ +.SUFFIXES: .s .o .bin + +all: dmg.bin mgb.bin + +.s.o: + rgbasm -o $@ $< + +.o.bin: + rgblink -o $@ $< + +clean: + rm -f *.o *.bin diff --git a/dmg.s b/dmg.s new file mode 100644 index 0000000..ea83257 --- /dev/null +++ b/dmg.s @@ -0,0 +1,176 @@ +SECTION "blah",rom0 + ; set up stack + ld sp,$fffe + + ; clear vram ($8000–9fff) + xor a + ld hl,$9fff +vloop: + ld [hld],a + bit 7,h + jr nz,vloop + + ; set up audio + ld hl,$ff26 + ld c,$11 + ld a,$80 + ld [hld],a + ld [$ff00+c],a + inc c + ld a,$f3 + ld [$ff00+c],a + ld [hld],a + ld a,$77 + ld [hl],a + + ; set background palette + ld a,$fc + ld [$ff47],a + + ; convert and load logo data from cart into vram + ld de,$0104 + ld hl,$8010 +lloop: + ld a,[de] + call Graphics + call Graphics2 + inc de + ld a,e + cp $34 + jr nz,lloop + + ; load 8 additional bytes into vram + ld de,moredata + ld b,8 +eloop: + ld a,[de] + inc de + ld [hli],a + inc hl + dec b + jr nz,eloop + + ; set background tilemap + ld a,$19 + ld [$9910],a + ld hl,$992f +oloop: + ld c,$0c +iloop: + dec a + jr z,scroll + ld [hld],a + dec c + jr nz,iloop + ld l,$f + jr oloop + +scroll: + ; initialize scroll count + ld h,a + + ; set loop count and vertical scroll register + ld a,$64 + ld d,a + ld [$ff42],a + + ; turn on lcd (showing background) + ld a,$91 + ld [$ff40],a + inc b + +sloop: + ld e,2 +floop1: + ld c,$c +floop2: + ld a,[$ff44] + cp $90 ; wait for screen frame + jr nz,floop2 + dec c + jr nz,floop2 + dec e + jr nz,floop1 + + ld c,$13 + inc h ; increment scroll count + ld a,h + ld e,$83 + cp $62 ; 62 counts in, play sound #1 + jr z,sound1 + ld e,$c1 + cp $64 + jr nz,sound2 ; 64 counts in, play sound #2 +sound1: + ld a,e + ld [$ff00+c],a + inc c + ld a,$87 + ld [$ff00+c],a +sound2: + ld a,[$ff42] + sub b + ld [$ff42],a ; scroll logo up if b=1 + dec d + jr nz,sloop + + dec b ; set b=0 first time + jr nz,logocheck ; … next time, cause jump to logo check + + ld d,$20 ; use scrolling loop to pause + jr sloop + +Graphics: + ld c,a ; “double up” all the bits of the graphics data, store it in vram +Graphics2: + ld b,4 +dloop: + push bc + rl c + rla + pop bc + rl c + rla + dec b + jr nz,dloop + ld [hli],a + inc hl + ld [hli],a + inc hl + ret + +logo: + db $ce,$ed,$66,$66,$cc,$0d,$00,$0b,$03,$73,$00,$83,$00,$0c,$00,$0d + db $00,$08,$11,$1f,$88,$89,$00,$0e,$dc,$cc,$6e,$e6,$dd,$dd,$d9,$99 + db $bb,$bb,$67,$63,$6e,$0e,$ec,$cc,$dd,$dc,$99,$9f,$bb,$b9,$33,$3e + +moredata: + db $3c,$42,$b9,$a5,$b9,$a5,$42,$3c + +logocheck: + ld hl,$0104 ; cart logo + ld de,logo + +lastbranch: + ld a,[de] + inc de + cp [hl] ; compare cart logo to bootrom logo +llockup: + jr nz,llockup + inc hl + ld a,l + cp $34 + jr nz,lastbranch + + ld b,$19 + ld a,b +cloop: + add [hl] + inc hl + dec b + jr nz,cloop + add [hl] +clockup: + jr nz,clockup + ld a,1 + ld [$ff50],a ; turn off bootrom diff --git a/mgb.s b/mgb.s new file mode 100644 index 0000000..16756e8 --- /dev/null +++ b/mgb.s @@ -0,0 +1,176 @@ +SECTION "blah",rom0 + ; set up stack + ld sp,$fffe + + ; clear vram ($8000–9fff) + xor a + ld hl,$9fff +vloop: + ld [hld],a + bit 7,h + jr nz,vloop + + ; set up audio + ld hl,$ff26 + ld c,$11 + ld a,$80 + ld [hld],a + ld [$ff00+c],a + inc c + ld a,$f3 + ld [$ff00+c],a + ld [hld],a + ld a,$77 + ld [hl],a + + ; set background palette + ld a,$fc + ld [$ff47],a + + ; convert and load logo data from cart into vram + ld de,$0104 + ld hl,$8010 +lloop: + ld a,[de] + call Graphics + call Graphics2 + inc de + ld a,e + cp $34 + jr nz,lloop + + ; load 8 additional bytes into vram + ld de,moredata + ld b,8 +eloop: + ld a,[de] + inc de + ld [hli],a + inc hl + dec b + jr nz,eloop + + ; set background tilemap + ld a,$19 + ld [$9910],a + ld hl,$992f +oloop: + ld c,$0c +iloop: + dec a + jr z,scroll + ld [hld],a + dec c + jr nz,iloop + ld l,$f + jr oloop + +scroll: + ; initialize scroll count + ld h,a + + ; set loop count and vertical scroll register + ld a,$64 + ld d,a + ld [$ff42],a + + ; turn on lcd (showing background) + ld a,$91 + ld [$ff40],a + inc b + +sloop: + ld e,2 +floop1: + ld c,$c +floop2: + ld a,[$ff44] + cp $90 ; wait for screen frame + jr nz,floop2 + dec c + jr nz,floop2 + dec e + jr nz,floop1 + + ld c,$13 + inc h ; increment scroll count + ld a,h + ld e,$83 + cp $62 ; 62 counts in, play sound #1 + jr z,sound1 + ld e,$c1 + cp $64 + jr nz,sound2 ; 64 counts in, play sound #2 +sound1: + ld a,e + ld [$ff00+c],a + inc c + ld a,$87 + ld [$ff00+c],a +sound2: + ld a,[$ff42] + sub b + ld [$ff42],a ; scroll logo up if b=1 + dec d + jr nz,sloop + + dec b ; set b=0 first time + jr nz,logocheck ; … next time, cause jump to logo check + + ld d,$20 ; use scrolling loop to pause + jr sloop + +Graphics: + ld c,a ; “double up” all the bits of the graphics data, store it in vram +Graphics2: + ld b,4 +dloop: + push bc + rl c + rla + pop bc + rl c + rla + dec b + jr nz,dloop + ld [hli],a + inc hl + ld [hli],a + inc hl + ret + +logo: + db $ce,$ed,$66,$66,$cc,$0d,$00,$0b,$03,$73,$00,$83,$00,$0c,$00,$0d + db $00,$08,$11,$1f,$88,$89,$00,$0e,$dc,$cc,$6e,$e6,$dd,$dd,$d9,$99 + db $bb,$bb,$67,$63,$6e,$0e,$ec,$cc,$dd,$dc,$99,$9f,$bb,$b9,$33,$3e + +moredata: + db $3c,$42,$b9,$a5,$b9,$a5,$42,$3c + +logocheck: + ld hl,$0104 ; cart logo + ld de,logo + +lastbranch: + ld a,[de] + inc de + cp [hl] ; compare cart logo to bootrom logo +llockup: + jr nz,llockup + inc hl + ld a,l + cp $34 + jr nz,lastbranch + + ld b,$19 + ld a,b +cloop: + add [hl] + inc hl + dec b + jr nz,cloop + add [hl] +clockup: + jr nz,clockup + ld a,-1 + ld [$ff50],a ; turn off bootrom -- cgit v1.2.3