NextCharX equ &C000 NextCharY equ &C001 org &0000 ;RST 0-7 org &0040 ;Interrupt: Vblank reti org &0048 ;Interrupt: LCD-Stat reti org &0050 ;Interrupt: Timer reti org &0058 ;Interrupt: Serial reti org &0060 ;Interrupt:Joypad reti ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Init routine sstart: org &0100 nop ;0100 0103 Entry point (start of program) jp begin ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Header ;0104-0133 Nintendo logo (must match rom 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 db "CHIBIAKUMAS.COM" ;0134-0142 Game Name (UCASE) ifdef BuildGBC db &80 ;0143 Color gameboy flag (&80 = GB+CGB,&C0 = CGB only) else db &00 endif db 0,0 ;0144-0145 Game Manufacturer code db 0 ;0146 Super GameBoy flag (&00=normal, &03=SGB) db 2 ;0147 Cartridge type (special upgrade hardware) ;(0=normal ROM , 1/2=MBC1(max 2MByte ROM and/or 32KByte RAM) ;0 - ROM ONLY 12 - ROM+MBC3+RAM ;1 - ROM+MBC1 13 - ROM+MBC3+RAM+BATT ;2 - ROM+MBC1+RAM 19 - ROM+MBC5 (max 8MByte ROM and/or 128KByte RAM) ;3 - ROM+MBC1+RAM+BATT 1A - ROM+MBC5+RAM ;5 - ROM+MBC2 1B - ROM+MBC5+RAM+BATT ;6 - ROM+MBC2+BATTERY 1C - ROM+MBC5+RUMBLE ;8 - ROM+RAM 1D - ROM+MBC5+RUMBLE+SRAM ;9 - ROM+RAM+BATTERY 1E - ROM+MBC5+RUMBLE+SRAM+BATT ;B - ROM+MMM01 1F - Pocket Camera ;C - ROM+MMM01+SRAM FD - Bandai TAMA5 ;D - ROM+MMM01+SRAM+BATT FE - Hudson HuC-3 ;F - ROM+MBC3+TIMER+BATT FF - Hudson HuC-1 ;10 - ROM+MBC3+TIMER+RAM+BATT ;11 - ROM+MBC3 db 2 ;0148 Rom size (0=32k, 1=64k,2=128k etc) db 3 ;0149 Cart Ram size (0=none,1=2k 2=8k, 3=32k) db 1 ;014A Destination Code (0=JPN 1=EU/US) db &33 ;014B Old Licensee code (must be &33 for SGB) db 0 ;014C Rom Version Number (usually 0) db 0 ;014D Header Checksum - ‘ones complement' checksum of bytes 0134-014C… (not needed for emulators) dw 0 ;014E-014F Global Checksum – 16 bit sum of all rom bytes (except 014E-014F)… unused by gameboy ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Start of code begin: nop di ld sp, &ffff ; set the stack pointer to highest mem location + 1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Position tilemap xor a ld hl,&FF42 ldi (hl), a ;FF42: SCY - Tile Scroll Y ld (hl), a ;FF43: SCX - Tile Scroll X ld (NextCharX),a ;Set cursor to pos 0,0 ld (NextCharY),a ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Turn off screen StopLCD_wait: ;Turn off the screen so we can define our patterns ld a,(&FF44) ;Loop until we are in VBlank cp 145 ;Is display on scan line 145 yet? jr nz,StopLCD_wait ;no? keep waiting! ld hl,&FF40 ;LCDC - LCD Control (R/W) res 7,(hl) ;Turn off the screen ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Define bitmap font ld de, BitmapFont ;Source bitmaps ld hl, &8000 ;Dest in Vram ld bc, BitmapFontEnd-BitmapFont ;Bytes of font Copy2Bitloop ld a,(de) ;Read in a byte and INC HL inc de ldi (hl),a ;Fill Bitplane 1 ldi (hl),a ;Fill Bitplane 2 dec bc ld a,b or c jr nz,Copy2Bitloop ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Define palette ifdef BuildGBC ld c,0*8 ;palette no 0 (back) call SetGBCPalettes ld c,7*8 ;palette no 7 (used by font) call SetGBCPalettes else ld a,%00011011 ;DDCCBBAA .... A=Background 0=Black, 3=White ld hl,&FF47 ldi (hl),a ;FF47 BGP BG & Window Palette Data (R/W) = &FC ldi (hl),a ;FF48 OBP0 Object Palette 0 Data (R/W) = &FF cpl ;Set sprite Palette 2 to the opposite ldi (hl),a ;FF49 OBP1 Object Palette 1 Data (R/W) = &FF endif ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Turn on screen ld hl,&FF40 ;LCDC - LCD Control (R/W) EWwBbOoC set 7,(hl) ;Turn on the screen ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Our program ld hl,Message ;Address of string Call PrintString ;Show String to screen di halt ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; PrintString: ld a,(hl) ;Print a '255' terminated string cp 255 ret z inc hl call PrintChar jr PrintString Message: db 'Hello World 323!',255 PrintChar: push hl push bc push af ld a,(NextCharY) ld b,a ;YYYYYYYY -------- ld hl,NextCharX ld a,(hl) ld c,a ;-------- ---XXXXX inc (hl) cp 20-1 call z,NewLine xor a rr b ;-YYYYYYY Y------- rra rr b ;--YYYYYY YY------ rra rr b ;---YYYYY YYY----- rra or c ;---YYYYY YYYXXXXX ld c,a ld hl, &9800 ;Tilemap base add hl,bc pop af push af sub 32 ;no char <32! call LCDWait ;Wait for VDP Sync ld (hl),a ifdef BuildGBC ld bc,&FF4F ;VBK - CGB Mode Only - VRAM Bank ld a,1 ;Turn on GBC extras ld (bc),a ld (hl),7 ;Palette 7 xor a ;Turn off GBC extras ld (bc),a endif pop af pop bc pop hl ret NewLine: push hl ld hl,NextCharY ;Inc Ypos inc (hl) ld hl,NextCharX ld (hl),0 ;Reset Xpos pop hl ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; LCDWait: push af di LCDWaitAgain ld a,(&FF41) ;STAT - LCD Status (R/W) ;-LOVHCMM and %00000010 ;MM=video mode (0/1 =Vram available) jr nz,LCDWaitAgain pop af ret SetGBCPalettes: ifdef BuildGBC ld hl,GBPal SetGBCPalettesb: ldi a,(hl) ;GGGRRRRR ld e,a ldi a,(hl) ;xBBBBBGG ld d,a inc a ;cp 255 ret z push hl call lcdwait ;Wait for VDP Sync ld hl,&ff68 ld (hl),c ;FF68 - BCPS/BGPI - CGB Mode Only - Background Palette Index inc hl ld (hl),e ;FF69 - BCPD/BGPD - CGB Mode Only - Background Palette Data dec hl inc c ;Increase palette address ld (hl),c ;FF68 - BCPS/BGPI - CGB Mode Only - Background Palette Index inc hl ld (hl),d ;FF69 - BCPD/BGPD - CGB Mode Only - Background Palette Data inc c ;Increase palette address pop hl jr SetGBCPalettesb endif ; xBBBBBGGGGGRRRRR GBPal: dw %0111110000000000 ;col 0 dw %0111111111100000 ;col 1 dw %0000000000011111 ;col 2 dw %0000001111111111 ;col 3 dw %1111111111111111 ;End of list ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Font (1bpp / Black & White) BitmapFont: incbin "\ResALL\Font96.FNT" ;Font bitmap, BitmapFontEnd: ; this is common to all systems