diff --git a/src/include/constants.asm b/src/include/constants.asm new file mode 100644 index 0000000..cb6588a --- /dev/null +++ b/src/include/constants.asm @@ -0,0 +1,358 @@ +IF !DEF(CONSTANTS_ASM) +DEF CONSTANTS_ASM EQU 1 + + +SECTION "Static Data", ROM0 +sPieceXOffsets:: ; How to draw each piece. X-offsets of the sprites. + db 0, 8, 16, 24 ; I + db 0, 8, 8, 16 ; Z + db 0, 8, 8, 16 ; S + db 0, 8, 16, 16 ; J + db 0, 0, 8, 16 ; L + db 8, 8, 16, 16 ; O + db 0, 8, 8, 16 ; T + +sPieceYOffsets:: ; How to draw each piece. Y-offsets of the sprites. + db 0, 0, 0, 0 ; I + db 0, 0, 7, 7 ; Z + db 7, 7, 0, 0 ; S + db 0, 0, 0, 7 ; J + db 7, 0, 0, 0 ; L + db 0, 7, 0, 7 ; O + db 0, 0, 7, 0 ; T + +sSpeedCurve:: ; Speed curve of the game. + dw $0000 ; Level 0000 + db 0, %00000001 ; 1/8G + db 25, 14, 30, 40 ; ARE, DAS, LOCK, LINECLEAR + + dw $0100 ; Level 0100 + db 0, %00010001 ; 2/8G + db 25, 14, 30, 40 ; ARE, DAS, LOCK, LINECLEAR + + dw $0150 ; Level 0150 + db 0, %01001001 ; 3/8G + db 25, 14, 30, 40 ; ARE, DAS, LOCK, LINECLEAR + + dw $0200 ; Level 0200 + db 0, %01010101 ; 4/8G + db 25, 14, 30, 40 ; ARE, DAS, LOCK, LINECLEAR + + dw $0225 ; Level 0225 + db 0, %01011101 ; 5/8G + db 25, 14, 30, 40 ; ARE, DAS, LOCK, LINECLEAR + + dw $0250 ; Level 0250 + db 0, %01110111 ; 6/8G + db 25, 14, 30, 40 ; ARE, DAS, LOCK, LINECLEAR + + dw $0275 ; Level 0275 + db 0, %01111111 ; 7/8G + db 25, 14, 30, 40 ; ARE, DAS, LOCK, LINECLEAR + + dw $0300 ; Level 0300 + db 1, %11111111 ; 1G + db 25, 14, 30, 32 ; ARE, DAS, LOCK, LINECLEAR + + dw $0350 ; Level 0350 + db 2, %11111111 ; 2G + db 25, 14, 30, 32 ; ARE, DAS, LOCK, LINECLEAR + + dw $0400 ; Level 0400 + db 3, %11111111 ; 3G + db 25, 14, 30, 32 ; ARE, DAS, LOCK, LINECLEAR + + dw $0450 ; Level 0450 + db 4, %11111111 ; 4G + db 25, 14, 30, 32 ; ARE, DAS, LOCK, LINECLEAR + + dw $0475 ; Level 0475 + db 5, %11111111 ; 5G + db 25, 14, 30, 32 ; ARE, DAS, LOCK, LINECLEAR + + dw $0500 ; Level 0500 + db 20, %11111111 ; 20G + db 25, 14, 30, 24 ; ARE, DAS, LOCK, LINECLEAR + + dw $0600 ; Level 0600 + db 20, %11111111 ; 20G + db 25, 8, 30, 24 ; ARE, DAS, LOCK, LINECLEAR + + dw $0700 ; Level 0700 + db 20, %11111111 ; 20G + db 20, 8, 30, 24 ; ARE, DAS, LOCK, LINECLEAR + + dw $0900 ; Level 0900 + db 20, %11111111 ; 20G + db 16, 6, 25, 16 ; ARE, DAS, LOCK, LINECLEAR + + dw $1100 ; Level 1100 + db 20, %11111111 ; 20G + db 12, 6, 25, 16 ; ARE, DAS, LOCK, LINECLEAR + + dw $1200 ; Level 1200 + db 20, %11111111 ; 20G + db 12, 6, 25, 8 ; ARE, DAS, LOCK, LINECLEAR + + dw $1300 ; Level 1300 + db 20, %11111111 ; 20G + db 10, 6, 20, 7 ; ARE, DAS, LOCK, LINECLEAR + + dw $1400 ; Level 1400 + db 20, %11111111 ; 20G + db 10, 6, 18, 6 ; ARE, DAS, LOCK, LINECLEAR + + dw $1500 ; Level 1500 + db 20, %11111111 ; 20G + db 8, 4, 16, 5 ; ARE, DAS, LOCK, LINECLEAR + + dw $1600 ; Level 1600 + db 20, %11111111 ; 20G + db 8, 4, 14, 4 ; ARE, DAS, LOCK, LINECLEAR + + dw $1700 ; Level 1700 + db 20, %11111111 ; 20G + db 6, 4, 12, 3 ; ARE, DAS, LOCK, LINECLEAR + + dw $1800 ; Level 1800 + db 20, %11111111 ; 20G + db 6, 4, 10, 3 ; ARE, DAS, LOCK, LINECLEAR + + dw $1900 ; Level 1900 + db 20, %11111111 ; 20G + db 4, 4, 8, 3 ; ARE, DAS, LOCK, LINECLEAR + + dw $2000 ; Level 2000 + db 20, %11111111 ; 20G + db 4, 3, 8, 3 ; ARE, DAS, LOCK, LINECLEAR + + dw $2500 ; Level 2500 + db 20, %11111111 ; 20G + db 2, 1, 8, 2 ; ARE, DAS, LOCK, LINECLEAR + + dw $3000 ; Level 3000 + db 20, %11111111 ; 20G + db 1, 1, 8, 1 ; ARE, DAS, LOCK, LINECLEAR + + dw $4000 ; Level 4000 + db 20, %11111111 ; 20G + db 1, 1, 6, 1 ; ARE, DAS, LOCK, LINECLEAR + + dw $5000 ; Level 5000 + db 20, %11111111 ; 20G + db 1, 1, 4, 1 ; ARE, DAS, LOCK, LINECLEAR + + dw $6666 ; Level 6666 + db 20, %11111111 ; 20G + db 1, 1, 2, 1 ; ARE, DAS, LOCK, LINECLEAR + + dw $9999 ; Level 9999 + db 20, %11111111 ; 20G + db 1, 1, 1, 1 ; ARE, DAS, LOCK, LINECLEAR + +sPieceRotationStates:: ; How each piece is rotated. + ; I + db %0000 + db %1111 + db %0000 + db %0000 + + db %0010 + db %0010 + db %0010 + db %0010 + + db %0000 + db %1111 + db %0000 + db %0000 + + db %0010 + db %0010 + db %0010 + db %0010 + + ; Z + db %0000 + db %1100 + db %0110 + db %0000 + + db %0010 + db %0110 + db %0100 + db %0000 + + db %0000 + db %1100 + db %0110 + db %0000 + + db %0010 + db %0110 + db %0100 + db %0000 + + ; S + db %0000 + db %0110 + db %1100 + db %0000 + + db %1000 + db %1100 + db %0100 + db %0000 + + db %0000 + db %0110 + db %1100 + db %0000 + + db %1000 + db %1100 + db %0100 + db %0000 + + ; J + db %0000 + db %1110 + db %0010 + db %0000 + + db %0110 + db %0100 + db %0100 + db %0000 + + db %0000 + db %1000 + db %1110 + db %0000 + + db %0100 + db %0100 + db %1100 + db %0000 + + ; L + db %0000 + db %1110 + db %1000 + db %0000 + + db %0100 + db %0100 + db %0110 + db %0000 + + db %0000 + db %0010 + db %1110 + db %0000 + + db %1100 + db %0100 + db %0100 + db %0000 + + ; O + db %0000 + db %0110 + db %0110 + db %0000 + + db %0000 + db %0110 + db %0110 + db %0000 + + db %0000 + db %0110 + db %0110 + db %0000 + + db %0000 + db %0110 + db %0110 + db %0000 + + ; T + db %0000 + db %1110 + db %0100 + db %0000 + + db %0100 + db %0110 + db %0100 + db %0000 + + db %0000 + db %0100 + db %1110 + db %0000 + + db %0100 + db %1100 + db %0100 + db %0000 + + +DEF PALETTE_REGULAR EQU %11100100 +DEF PALETTE_INVERTED EQU %00011011 +DEF PALETTE_MONO_0 EQU %11111111 +DEF PALETTE_MONO_1 EQU %10101010 +DEF PALETTE_MONO_2 EQU %01010101 +DEF PALETTE_MONO_3 EQU %00000000 +DEF PALETTE_DARKER_0 EQU %11100100 +DEF PALETTE_DARKER_1 EQU %11111001 +DEF PALETTE_DARKER_2 EQU %11111110 +DEF PALETTE_DARKER_3 EQU %11111111 +DEF PALETTE_LIGHTER_0 EQU %11100100 +DEF PALETTE_LIGHTER_1 EQU %10010000 +DEF PALETTE_LIGHTER_2 EQU %01000000 +DEF PALETTE_LIGHTER_3 EQU %00000000 +DEF FIELD_TOP_LEFT EQU $9800+(0*32)+1 +DEF FIELD_ROW_1 EQU $9800+(0*32)+1 +DEF FIELD_ROW_2 EQU $9800+(1*32)+1 +DEF FIELD_ROW_3 EQU $9800+(2*32)+1 +DEF FIELD_ROW_4 EQU $9800+(3*32)+1 +DEF FIELD_ROW_5 EQU $9800+(4*32)+1 +DEF FIELD_ROW_6 EQU $9800+(5*32)+1 +DEF FIELD_ROW_7 EQU $9800+(6*32)+1 +DEF FIELD_ROW_8 EQU $9800+(7*32)+1 +DEF FIELD_ROW_9 EQU $9800+(8*32)+1 +DEF FIELD_ROW_10 EQU $9800+(9*32)+1 +DEF FIELD_ROW_11 EQU $9800+(10*32)+1 +DEF FIELD_ROW_12 EQU $9800+(11*32)+1 +DEF FIELD_ROW_13 EQU $9800+(12*32)+1 +DEF FIELD_ROW_14 EQU $9800+(13*32)+1 +DEF FIELD_ROW_15 EQU $9800+(14*32)+1 +DEF FIELD_ROW_16 EQU $9800+(15*32)+1 +DEF FIELD_ROW_17 EQU $9800+(16*32)+1 +DEF FIELD_ROW_18 EQU $9800+(17*32)+1 +DEF FIELD_ROW_19 EQU $9800+(18*32)+1 +DEF FIELD_ROW_20 EQU $9800+(19*32)+1 +DEF TILE_FIELD_EMPTY EQU 7 +DEF TILE_PIECE_0 EQU 10 +DEF TILE_0 EQU 110 +DEF NEXT_BASE_X EQU 120 +DEF NEXT_BASE_Y EQU 40 +DEF HOLD_BASE_X EQU 120 +DEF HOLD_BASE_Y EQU 80 +DEF DIGIT_BASE_X EQU 112 +DEF SCORE_BASE_Y EQU 115 +DEF CLEVEL_BASE_Y EQU 136 +DEF NLEVEL_BASE_Y EQU 148 +DEF SCURVE_N_ENTRIES EQU 32 +DEF SCURVE_ENTRY_SIZE EQU 8 +DEF PIECE_I EQU 0 +DEF PIECE_Z EQU 1 +DEF PIECE_S EQU 2 +DEF PIECE_J EQU 3 +DEF PIECE_L EQU 4 +DEF PIECE_O EQU 5 +DEF PIECE_T EQU 6 + +ENDC diff --git a/src/include/globals.asm b/src/include/globals.asm index ae29add..dd43d78 100644 --- a/src/include/globals.asm +++ b/src/include/globals.asm @@ -1,110 +1,25 @@ -; ***************************************************************************** -; * * -; * Libraries and Defines * -; * * -; ***************************************************************************** +IF !DEF(GLOBALS_ASM) +DEF GLOBALS_ASM EQU 1 + + INCLUDE "vendor/hardware.inc" INCLUDE "vendor/structs.asm" +INCLUDE "constants.asm" + -; ***************************************************************************** -; * * -; * Game Variables * -; * * -; ***************************************************************************** SECTION "General Game Variables", WRAM0 -wLCDCCtr:: db +wLCDCCtr:: db wEvenFrame:: db -wField:: ds (10*22) -wRNGSeed:: ds 4 +wField:: ds (10*22) + SECTION "Important Game Variables", HRAM -hScore:: ds 6 +hCtr:: ds 1 +hScore:: ds 6 hCLevel:: ds 6 hNLevel:: ds 6 -; ***************************************************************************** -; * * -; * Static Data * -; * * -; ***************************************************************************** -SECTION "Static Data", ROM0 -sPieceXOffsets:: - db 0, 8, 16, 24 ; I - db 0, 8, 8, 16 ; Z - db 0, 8, 8, 16 ; S - db 0, 8, 16, 16 ; J - db 0, 0, 8, 16 ; L - db 8, 8, 16, 16 ; O - db 0, 8, 8, 16 ; T -sPieceYOffsets:: - db 0, 0, 0, 0 ; I - db 0, 0, 7, 7 ; Z - db 7, 7, 0, 0 ; S - db 0, 0, 0, 7 ; J - db 0, 7, 0, 0 ; L - db 0, 7, 0, 7 ; O - db 0, 0, 7, 0 ; T - - -; ***************************************************************************** -; * * -; * Convenience Defines * -; * * -; ***************************************************************************** -DEF PALETTE_REGULAR EQU %11100100 -DEF PALETTE_INVERTED EQU %00011011 -DEF PALETTE_MONO_0 EQU %11111111 -DEF PALETTE_MONO_1 EQU %10101010 -DEF PALETTE_MONO_2 EQU %01010101 -DEF PALETTE_MONO_3 EQU %00000000 -DEF PALETTE_DARKER_0 EQU %11100100 -DEF PALETTE_DARKER_1 EQU %11111001 -DEF PALETTE_DARKER_2 EQU %11111110 -DEF PALETTE_DARKER_3 EQU %11111111 -DEF PALETTE_LIGHTER_0 EQU %11100100 -DEF PALETTE_LIGHTER_1 EQU %10010000 -DEF PALETTE_LIGHTER_2 EQU %01000000 -DEF PALETTE_LIGHTER_3 EQU %00000000 -DEF FIELD_TOP_LEFT EQU $9800+(0*32)+1 -DEF FIELD_ROW_1 EQU $9800+(0*32)+1 -DEF FIELD_ROW_2 EQU $9800+(1*32)+1 -DEF FIELD_ROW_3 EQU $9800+(2*32)+1 -DEF FIELD_ROW_4 EQU $9800+(3*32)+1 -DEF FIELD_ROW_5 EQU $9800+(4*32)+1 -DEF FIELD_ROW_6 EQU $9800+(5*32)+1 -DEF FIELD_ROW_7 EQU $9800+(6*32)+1 -DEF FIELD_ROW_8 EQU $9800+(7*32)+1 -DEF FIELD_ROW_9 EQU $9800+(8*32)+1 -DEF FIELD_ROW_10 EQU $9800+(9*32)+1 -DEF FIELD_ROW_11 EQU $9800+(10*32)+1 -DEF FIELD_ROW_12 EQU $9800+(11*32)+1 -DEF FIELD_ROW_13 EQU $9800+(12*32)+1 -DEF FIELD_ROW_14 EQU $9800+(13*32)+1 -DEF FIELD_ROW_15 EQU $9800+(14*32)+1 -DEF FIELD_ROW_16 EQU $9800+(15*32)+1 -DEF FIELD_ROW_17 EQU $9800+(16*32)+1 -DEF FIELD_ROW_18 EQU $9800+(17*32)+1 -DEF FIELD_ROW_19 EQU $9800+(18*32)+1 -DEF FIELD_ROW_20 EQU $9800+(19*32)+1 -DEF TILE_FIELD_EMPTY EQU 7 -DEF TILE_PIECE_0 EQU 10 -DEF TILE_0 EQU 110 -DEF NEXT_BASE_X EQU 120 -DEF NEXT_BASE_Y EQU 40 -DEF HOLD_BASE_X EQU 120 -DEF HOLD_BASE_Y EQU 80 -DEF DIGIT_BASE_X EQU 112 -DEF SCORE_BASE_Y EQU 115 -DEF CLEVEL_BASE_Y EQU 136 -DEF NLEVEL_BASE_Y EQU 148 - - -; ***************************************************************************** -; * * -; * Convenience Macros * -; * * -; ***************************************************************************** ; Waits for VRAM to be safe to access. (Includes hblank.) MACRO wait_vram .waitvram\@ @@ -113,6 +28,7 @@ MACRO wait_vram jr nz, .waitvram\@ ENDM + ; Waits for lcd to be in vblank. MACRO wait_vblank .waitvb\@ @@ -122,6 +38,7 @@ MACRO wait_vblank jr nz, .waitvb\@ ENDM + ; Waits for lcd to not be in vblank. MACRO wait_vblank_end .waitvbe\@ @@ -131,21 +48,25 @@ MACRO wait_vblank_end jr z, .waitvbe\@ ENDM + ; Sets the background palette to A. MACRO set_bg_palette ldh [rBGP], a ENDM + ; Sets the object0 palette to A. MACRO set_obj0_palette ldh [rOBP0], a ENDM + ; Sets the object1 palette to A. MACRO set_obj1_palette ldh [rOBP1], a ENDM + ; Sets all palettes to A. MACRO set_all_palettes set_bg_palette a @@ -158,3 +79,6 @@ ENDM MACRO lb ld \1, (LOW(\2) << 8) | LOW(\3) ENDM + + +ENDC diff --git a/src/include/hardwarectl.asm b/src/include/hardwarectl.asm deleted file mode 100644 index 0dcb227..0000000 --- a/src/include/hardwarectl.asm +++ /dev/null @@ -1,34 +0,0 @@ -SECTION "Hardware Control Functions", ROM0 -DisableAudio:: - xor a, a - ldh [rNR52], a - ret - - -DisableLCDKeepingSettings:: - ldh a, [rLCDC] - and LOW(~LCDCF_ON) - wait_vram - ldh [rLCDC], a - ret - - -DisableLCD:: - wait_vram - xor a, a - ldh [rLCDC], a - ret - - -EnableLCD:: - ldh a, [rLCDC] - or LCDCF_ON | LCDCF_BGON | LCDCF_OBJON - ldh [rLCDC], a - ret - - -SetTileDataBanks:: - ldh a, [rLCDC] - or LCDCF_BLK01 - ldh [rLCDC], a - ret diff --git a/src/include/interrupts.asm b/src/include/interrupts.asm index c361d2b..fba6778 100644 --- a/src/include/interrupts.asm +++ b/src/include/interrupts.asm @@ -1,3 +1,7 @@ +IF !DEF(INTERRUPTS_ASM) +DEF INTERRUPTS_ASM EQU 1 + + SECTION "Interrupt Initialization Functions", ROM0 InitializeLCDCInterrupt:: ld a, STATF_LYC @@ -52,3 +56,5 @@ LCDCInterrupt_End: pop af reti + +ENDC diff --git a/src/include/memcpy.asm b/src/include/memory.asm similarity index 91% rename from src/include/memcpy.asm rename to src/include/memory.asm index 5633628..c48d49c 100644 --- a/src/include/memcpy.asm +++ b/src/include/memory.asm @@ -1,3 +1,7 @@ +IF !DEF(MEMORY_ASM) +DEF MEMORY_ASM EQU 1 + + SECTION "Memory Functions", ROM0 ; Copies data from de to hl, bc bytes UnsafeMemCopy:: @@ -32,3 +36,6 @@ UnsafeMemSet:: or a, c jp nz, UnsafeMemSet ret + + +ENDC diff --git a/src/include/vendor/structs.asm b/src/include/vendor/structs.asm index a341506..54cc58b 100644 --- a/src/include/vendor/structs.asm +++ b/src/include/vendor/structs.asm @@ -22,7 +22,7 @@ ; SOFTWARE. - +IF !DEF(STRUCTS_VERSION) DEF STRUCTS_VERSION equs "3.0.1" MACRO structs_assert assert (\1), "rgbds-structs {STRUCTS_VERSION} bug. Please report at https://github.com/ISSOtm/rgbds-structs, and share the above stack trace *and* your code there!" @@ -336,3 +336,5 @@ MACRO dstructs ; nb_structs, struct_type, instance_name ENDR PURGE STRUCT_ID ENDM + +ENDC