├── 01 ├── compile.ps1 ├── main.asm ├── put_baserom.gb_here └── temp.prj ├── 02 ├── compile.ps1 ├── definitions.asm ├── macros.asm ├── main.asm ├── put_baserom.gb_here └── temp.prj ├── 03 ├── compile.ps1 ├── definitions.asm ├── macros.asm ├── main.asm ├── palettes │ └── level01.pal ├── put_baserom.gb_here ├── sprites.asm └── temp.prj ├── 04 ├── backgrounds.asm ├── compile.ps1 ├── data │ ├── level01.bin │ ├── level01_blocks_compressed.bin │ └── level01_map_compressed.bin ├── definitions.asm ├── graphics.asm ├── graphics │ ├── 8952_compressed.bin │ └── VRAM1.2bpp ├── macros.asm ├── main.asm ├── palettes │ └── level01.pal ├── put_baserom.gb_here ├── sprites.asm └── temp.prj └── README.md /01/compile.ps1: -------------------------------------------------------------------------------- 1 | wla-gb -o output.o main.asm 2 | wlalink -s temp.prj output.gbc -------------------------------------------------------------------------------- /01/main.asm: -------------------------------------------------------------------------------- 1 | ; **************************************** 2 | ; *** DEFINITIONS & ROM INITIALIZATION *** 3 | ; **************************************** 4 | 5 | .MEMORYMAP 6 | DEFAULTSLOT 1 7 | SLOTSIZE $4000 8 | SLOT 0 $0000 9 | SLOT 1 $4000 10 | .ENDME 11 | 12 | .ROMBANKSIZE $4000 13 | .ROMBANKS 16 ; 16 banks 14 | .ROMGBCONLY ; Writes $C0 ("GBC only") into $0143 (CGB flag) 15 | .COMPUTEGBCOMPLEMENTCHECK ; Computes the ROM complement check ($014D) 16 | .COMPUTEGBCHECKSUM ; Computes the ROM checksum ($014E-$014F) 17 | 18 | .BACKGROUND "baserom.gb" ; This loads the ROM so we can write directly into it 19 | 20 | .UNBACKGROUND $3DB0 $3FDF ; Free space in bank $00 21 | .UNBACKGROUND $4DF0 $7FDF ; Free space in bank $01 22 | .UNBACKGROUND $B910 $BFFF ; Free space in bank $02 23 | .UNBACKGROUND $FED0 $FFDF ; Free space in bank $03 24 | ; ... -------------------------------------------------------------------------------- /01/put_baserom.gb_here: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toruzz/WebsiteHowtoCode/8cc9965995eac7aa4658f44ec3d6eee78efb914c/01/put_baserom.gb_here -------------------------------------------------------------------------------- /01/temp.prj: -------------------------------------------------------------------------------- 1 | [objects] 2 | output.o -------------------------------------------------------------------------------- /02/compile.ps1: -------------------------------------------------------------------------------- 1 | wla-gb -o output.o main.asm 2 | wlalink -s temp.prj output.gbc -------------------------------------------------------------------------------- /02/definitions.asm: -------------------------------------------------------------------------------- 1 | ; Hardware definitions 2 | 3 | .DEFINE LCDC $FF40 ; LCD Control 4 | .DEFINE STAT $FF41 ; LCDC Status 5 | .DEFINE VBK $FF4F ; VRAM Bank 6 | .DEFINE SVBK $FF70 ; WRAM Bank 7 | .DEFINE BCPS $FF68 ; Background Palette Index (GBC) 8 | .DEFINE BCPD $FF69 ; Background Palette Data (GBC) 9 | .DEFINE OCPS $FF6A ; Sprite Palette Index (GBC) 10 | .DEFINE OCPD $FF6B ; Sprite Palette Data (GBC) 11 | 12 | ; Constants 13 | .DEFINE CHANGE_BANK $2100 14 | 15 | ; Definitions 16 | .DEFINE wCurrentBank $D02C -------------------------------------------------------------------------------- /02/macros.asm: -------------------------------------------------------------------------------- 1 | ; This waits for V-Blank or H-Blank so both OAM and display RAM are accessible 2 | .MACRO WAITBLANK 3 | wait\@: 4 | ldh a,(ATTR_MAP 77 | ld c,a 78 | ld a,(bc) 79 | pop bc 80 | 81 | push af 82 | WAITBLANK 83 | pop af 84 | ret 85 | .ENDS -------------------------------------------------------------------------------- /04/compile.ps1: -------------------------------------------------------------------------------- 1 | wla-gb -o output.o main.asm 2 | wlalink -s temp.prj output.gbc -------------------------------------------------------------------------------- /04/data/level01.bin: -------------------------------------------------------------------------------- 1 |  2 | 3 |  -------------------------------------------------------------------------------- /04/data/level01_blocks_compressed.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toruzz/WebsiteHowtoCode/8cc9965995eac7aa4658f44ec3d6eee78efb914c/04/data/level01_blocks_compressed.bin -------------------------------------------------------------------------------- /04/data/level01_map_compressed.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toruzz/WebsiteHowtoCode/8cc9965995eac7aa4658f44ec3d6eee78efb914c/04/data/level01_map_compressed.bin -------------------------------------------------------------------------------- /04/definitions.asm: -------------------------------------------------------------------------------- 1 | ; Hardware definitions 2 | 3 | .DEFINE LCDC $FF40 ; LCD Control 4 | .DEFINE STAT $FF41 ; LCDC Status 5 | .DEFINE VBK $FF4F ; VRAM Bank 6 | .DEFINE SVBK $FF70 ; WRAM Bank 7 | .DEFINE BCPS $FF68 ; Background Palette Index (GBC) 8 | .DEFINE BCPD $FF69 ; Background Palette Data (GBC) 9 | .DEFINE OCPS $FF6A ; Sprite Palette Index (GBC) 10 | .DEFINE OCPD $FF6B ; Sprite Palette Data (GBC) 11 | 12 | ; Constants 13 | .DEFINE PALSIZE $40 14 | .DEFINE CHANGE_BANK $2100 15 | 16 | ; Definitions 17 | .DEFINE wCurrentBank $D02C 18 | 19 | ; New definitions 20 | .DEFINE ATTR_MAP $D800 -------------------------------------------------------------------------------- /04/graphics.asm: -------------------------------------------------------------------------------- 1 | .BANK 0 SLOT 0 2 | .ORG $2070 3 | .SECTION "Compressed graphics pointers" OVERWRITE 4 | ; Graphics 5 | POINTER :GFX_8952 GFX_8952 $8AE0 ;POINTER $02 $4952 $8AE0 6 | POINTER $02 $5266 $8AE0 7 | POINTER $02 $5B2C $8AE0 8 | POINTER $02 $63EE $8AE0 9 | POINTER $02 $6C49 $8800 10 | POINTER $0A $51F5 $8AE0 11 | POINTER $0A $5B0B $8AE0 12 | POINTER $0A $63C1 $8AE0 13 | POINTER $0A $6C79 $8AE0 14 | POINTER $02 $6C49 $8800 15 | 16 | ; Tile data 17 | POINTER :L1_Blocks L1_Blocks ;POINTER $03 $46E0 18 | POINTER $03 $4AC3 19 | POINTER $03 $48D9 20 | POINTER $03 $4CFF 21 | POINTER $06 $777C 22 | 23 | Test1: 24 | .ENDS 25 | 26 | .BANK 0 SLOT 0 27 | .ORG $38BB 28 | .SECTION "Compressed map pointers" OVERWRITE 29 | POINTER :L1_Map L1_Map 30 | .ENDS 31 | 32 | 33 | .BANK $0F SLOT 1 34 | .SECTION "Compressed graphics" FREE 35 | GFX_8952: .INCBIN "graphics/8952_compressed.bin" 36 | 37 | L1_Blocks: .INCBIN "data/level01_blocks_compressed.bin" 38 | L1_Map: .INCBIN "data/level01_map_compressed.bin" 39 | .ENDS -------------------------------------------------------------------------------- /04/graphics/8952_compressed.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toruzz/WebsiteHowtoCode/8cc9965995eac7aa4658f44ec3d6eee78efb914c/04/graphics/8952_compressed.bin -------------------------------------------------------------------------------- /04/graphics/VRAM1.2bpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toruzz/WebsiteHowtoCode/8cc9965995eac7aa4658f44ec3d6eee78efb914c/04/graphics/VRAM1.2bpp -------------------------------------------------------------------------------- /04/macros.asm: -------------------------------------------------------------------------------- 1 | ; This waits for V-Blank or H-Blank so both OAM and display RAM are accessible 2 | .MACRO WAITBLANK 3 | wait\@: 4 | ldh a,( 3 40 | .FAIL 41 | .ENDIF 42 | .IF NARGS == 2 43 | ld de,\1 44 | ld bc,_sizeof_\1 45 | ld hl,\2 46 | .ENDIF 47 | .IF NARGS == 3 48 | ld de,\1 49 | ld bc,\2 50 | ld hl,\3 51 | .ENDIF 52 | call CopyData 53 | .ENDM 54 | 55 | .MACRO POINTER 56 | .IF NARGS < 2 57 | .FAIL 58 | .ENDIF 59 | .db \1,>\2,<\2 60 | 61 | .IF NARGS == 3 62 | .db <\3,>\3 63 | .ENDIF 64 | .ENDM 65 | 66 | ; Jumps to Bank \1, Offset \2 67 | .MACRO GOTO 68 | .IF NARGS > 2 69 | .FAIL 70 | .ENDIF 71 | .IF NARGS == 1 72 | ld a,:\1 73 | ld hl,\1 74 | .ENDIF 75 | .IF NARGS == 2 76 | ld a,\1 77 | ld hl,\2 78 | .ENDIF 79 | jp SWITCHBANK_JUMPHL 80 | .ENDM 81 | -------------------------------------------------------------------------------- /04/main.asm: -------------------------------------------------------------------------------- 1 | ; **************************************** 2 | ; *** DEFINITIONS & ROM INITIALIZATION *** 3 | ; **************************************** 4 | 5 | .MEMORYMAP 6 | DEFAULTSLOT 1 7 | SLOTSIZE $4000 8 | SLOT 0 $0000 9 | SLOT 1 $4000 10 | .ENDME 11 | 12 | .ROMBANKSIZE $4000 13 | .ROMBANKS 16 ; 16 banks 14 | .ROMSIZE 3 ; 256KB ROM 15 | .ROMGBCONLY ; Writes $C0 ("GBC only") into $0143 (CGB flag) 16 | .COMPUTEGBCOMPLEMENTCHECK ; Computes the ROM complement check ($014D) 17 | .COMPUTEGBCHECKSUM ; Computes the ROM checksum ($014E-$014F) 18 | .CARTRIDGETYPE $01 ; MBC1 19 | 20 | .BACKGROUND "baserom.gb" ; This loads the ROM so we can write directly into it 21 | 22 | ; Free space: 23 | .UNBACKGROUND $0143 $0143 ; CGB Flag 24 | .UNBACKGROUND $0147 $0149 ; Cart type, ROM Size, RAM Size 25 | .UNBACKGROUND $014D $014F ; Checksum 26 | .UNBACKGROUND $3DB0 $3FDF ; Bank $00 27 | .UNBACKGROUND $4DF0 $7FDF ; Bank $01 28 | .UNBACKGROUND $B910 $BFFF ; Bank $02 29 | .UNBACKGROUND $FED0 $FFDF ; Bank $03 30 | .UNBACKGROUND $13640 $13FFF ; Bank $04 31 | .UNBACKGROUND $17AC0 $17FFF ; Bank $05 32 | .UNBACKGROUND $1A740 $1A7FF ; Bank $06 33 | .UNBACKGROUND $1BDF0 $1BFFF ; " 34 | .UNBACKGROUND $1DBA0 $1FFFF ; Bank $07 35 | .UNBACKGROUND $22FB0 $23FDF ; Bank $08 36 | .UNBACKGROUND $274A0 $27FFF ; Bank $09 37 | .UNBACKGROUND $2B4F0 $2BFDF ; Bank $0A 38 | .UNBACKGROUND $2E8B0 $2FFDF ; Bank $0B 39 | .UNBACKGROUND $33CF0 $33FFF ; Bank $0C 40 | .UNBACKGROUND $379C0 $37FFF ; Bank $0D 41 | .UNBACKGROUND $3BF60 $3BFFF ; Bank $0E 42 | .UNBACKGROUND $3DFC0 $3FFDF ; Bank $0F 43 | 44 | ; Includes: 45 | .include "definitions.asm" ; Definitions 46 | .include "macros.asm" ; Macros 47 | .include "sprites.asm" ; Sprites 48 | .include "backgrounds.asm" ; Backgrounds 49 | .include "graphics.asm" ; Replaced compressed graphics 50 | 51 | ; *************** 52 | ; ***MAIN CODE*** 53 | ; *************** 54 | 55 | 56 | .BANK 0 SLOT 0 57 | .SECTION "BasicFunctions" FREE 58 | ; **SET BACKGROUND PALETTES** 59 | ; Writes $40 bytes located at HL to the BG Palette. 60 | 61 | SET_BGPAL: 62 | ld a,$80 ; Set index to first color + auto-increment 63 | ldh (