Compare commits
	
		
			No commits in common. "4fa9f68107a7c88cf7a138b55955ce4cf903d3e8" and "e9c84abc9e300a6acd5e8c8b2f0ff6506a43294b" have entirely different histories.
		
	
	
		
			4fa9f68107
			...
			e9c84abc9e
		
	
		
							
								
								
									
										
											BIN
										
									
								
								bin/DMGTRIS.GBC
								
								
								
								
							
							
						
						
									
										
											BIN
										
									
								
								bin/DMGTRIS.GBC
								
								
								
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							| 
						 | 
					@ -25,7 +25,7 @@ INCLUDE "globals.asm"
 | 
				
			||||||
SECTION "High Banking Variables", HRAM
 | 
					SECTION "High Banking Variables", HRAM
 | 
				
			||||||
hBankBackup: ds 1
 | 
					hBankBackup: ds 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					; 0x00, 0x08, 0x10, 0x18, 0x20, 0x28, 0x30, and 0x38
 | 
				
			||||||
SECTION "Switch Bank", ROM0[$08]
 | 
					SECTION "Switch Bank", ROM0[$08]
 | 
				
			||||||
    ; Saves the current bank and switches to the bank in b.
 | 
					    ; Saves the current bank and switches to the bank in b.
 | 
				
			||||||
RSTSwitchBank::
 | 
					RSTSwitchBank::
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -23,7 +23,6 @@ INCLUDE "globals.asm"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SECTION "DMG Intro Effect", ROM0
 | 
					SECTION "DMG Intro Effect", ROM0
 | 
				
			||||||
    ; Does a small effect on boot with the nintendo logo.
 | 
					 | 
				
			||||||
DoDMGEffect::
 | 
					DoDMGEffect::
 | 
				
			||||||
    ld a, [wInitialA]
 | 
					    ld a, [wInitialA]
 | 
				
			||||||
    cp a, $11
 | 
					    cp a, $11
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										228
									
								
								src/field.asm
								
								
								
								
							
							
						
						
									
										228
									
								
								src/field.asm
								
								
								
								
							| 
						 | 
					@ -62,10 +62,6 @@ hShouldLockIfGrounded: ds 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SECTION "Field Functions", ROM0
 | 
					SECTION "Field Functions", ROM0
 | 
				
			||||||
    ; Initializes the field completely blank.
 | 
					 | 
				
			||||||
    ; Initializes the combo counter to 1.
 | 
					 | 
				
			||||||
    ; Initializes the bravo counter to 0.
 | 
					 | 
				
			||||||
    ; Initializes the shadow field.
 | 
					 | 
				
			||||||
FieldInit::
 | 
					FieldInit::
 | 
				
			||||||
    xor a, a
 | 
					    xor a, a
 | 
				
			||||||
    ldh [hBravo], a
 | 
					    ldh [hBravo], a
 | 
				
			||||||
| 
						 | 
					@ -73,14 +69,14 @@ FieldInit::
 | 
				
			||||||
    ldh [hComboCt], a
 | 
					    ldh [hComboCt], a
 | 
				
			||||||
    ld hl, wField
 | 
					    ld hl, wField
 | 
				
			||||||
    ld bc, 10*24
 | 
					    ld bc, 10*24
 | 
				
			||||||
    ld d, TILE_BLANK
 | 
					    ld d, 1
 | 
				
			||||||
    call UnsafeMemSet
 | 
					    call UnsafeMemSet
 | 
				
			||||||
    ld hl, wShadowField
 | 
					    ld hl, wShadowField
 | 
				
			||||||
    ld bc, 14*26
 | 
					    ld bc, 14*26
 | 
				
			||||||
    ld d, $FF
 | 
					    ld d, $FF
 | 
				
			||||||
    jp UnsafeMemSet
 | 
					    jp UnsafeMemSet
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Fills the field with the empty tile.
 | 
					
 | 
				
			||||||
FieldClear::
 | 
					FieldClear::
 | 
				
			||||||
    ld hl, wField
 | 
					    ld hl, wField
 | 
				
			||||||
    ld bc, 10*24
 | 
					    ld bc, 10*24
 | 
				
			||||||
| 
						 | 
					@ -88,16 +84,13 @@ FieldClear::
 | 
				
			||||||
    jp UnsafeMemSet
 | 
					    jp UnsafeMemSet
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Backs up the field.
 | 
					 | 
				
			||||||
    ; This backup field is used for pausing the game.
 | 
					 | 
				
			||||||
ToBackupField::
 | 
					ToBackupField::
 | 
				
			||||||
    ld de, wField
 | 
					 | 
				
			||||||
    ld hl, wBackupField
 | 
					    ld hl, wBackupField
 | 
				
			||||||
 | 
					    ld de, wField
 | 
				
			||||||
    ld bc, 10*24
 | 
					    ld bc, 10*24
 | 
				
			||||||
    jp UnsafeMemCopy
 | 
					    jp UnsafeMemCopy
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Restores the backup of the field for ending pause mode.
 | 
					 | 
				
			||||||
FromBackupField::
 | 
					FromBackupField::
 | 
				
			||||||
    ld hl, wField
 | 
					    ld hl, wField
 | 
				
			||||||
    ld de, wBackupField
 | 
					    ld de, wBackupField
 | 
				
			||||||
| 
						 | 
					@ -105,8 +98,6 @@ FromBackupField::
 | 
				
			||||||
    jp UnsafeMemCopy
 | 
					    jp UnsafeMemCopy
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Copies the field to the shadow field.
 | 
					 | 
				
			||||||
    ; This shadow field is used to calculate whether or not the piece can fit.
 | 
					 | 
				
			||||||
ToShadowField::
 | 
					ToShadowField::
 | 
				
			||||||
    ld hl, wField
 | 
					    ld hl, wField
 | 
				
			||||||
    ld de, wShadowField+2
 | 
					    ld de, wShadowField+2
 | 
				
			||||||
| 
						 | 
					@ -128,7 +119,6 @@ ToShadowField::
 | 
				
			||||||
    ret
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Restores the shadow field to the main field.
 | 
					 | 
				
			||||||
FromShadowField:
 | 
					FromShadowField:
 | 
				
			||||||
    ld hl, wField
 | 
					    ld hl, wField
 | 
				
			||||||
    ld de, wShadowField+2
 | 
					    ld de, wShadowField+2
 | 
				
			||||||
| 
						 | 
					@ -150,10 +140,9 @@ FromShadowField:
 | 
				
			||||||
    ret
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Blits the field onto the tile map.
 | 
					    ; This routine will copy wField onto the screen.
 | 
				
			||||||
    ; On the GBC, this chain calls into a special version that takes
 | 
					 | 
				
			||||||
    ; advantage of the GBC's CPU.
 | 
					 | 
				
			||||||
BlitField::
 | 
					BlitField::
 | 
				
			||||||
 | 
					    ; Hold on, are we on a gbc?
 | 
				
			||||||
    ld a, [wInitialA]
 | 
					    ld a, [wInitialA]
 | 
				
			||||||
    cp a, $11
 | 
					    cp a, $11
 | 
				
			||||||
    jp z, GBCBlitField
 | 
					    jp z, GBCBlitField
 | 
				
			||||||
| 
						 | 
					@ -201,39 +190,39 @@ BlitField::
 | 
				
			||||||
        add hl, bc
 | 
					        add hl, bc
 | 
				
			||||||
    ENDR
 | 
					    ENDR
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; This function is actually called as the vblank handler for the gameplay state.
 | 
					    ; This has to finish just before the first LCDC interrupt of the frame or stuff will break in weird ways.
 | 
				
			||||||
    ; This is why it jumps straight back to the event loop.
 | 
					 | 
				
			||||||
    jp EventLoop
 | 
					    jp EventLoop
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; The current piece ID is used to get the offset into the rotation states
 | 
					 | 
				
			||||||
    ; corresponding to that piece's zero rotation.
 | 
					 | 
				
			||||||
SetPieceData:
 | 
					SetPieceData:
 | 
				
			||||||
    ldh a, [hCurrentPiece]
 | 
					    ldh a, [hCurrentPiece]
 | 
				
			||||||
    sla a
 | 
					 | 
				
			||||||
    sla a
 | 
					 | 
				
			||||||
    sla a
 | 
					 | 
				
			||||||
    sla a
 | 
					 | 
				
			||||||
    ld c, a
 | 
					 | 
				
			||||||
    ld b, 0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    ld hl, sPieceRotationStates
 | 
					    ld hl, sPieceRotationStates
 | 
				
			||||||
    add hl, bc
 | 
					    ld de, 16
 | 
				
			||||||
    ld a, l
 | 
					:   cp a, 0
 | 
				
			||||||
 | 
					    jr z, :+
 | 
				
			||||||
 | 
					    add hl, de
 | 
				
			||||||
 | 
					    dec a
 | 
				
			||||||
 | 
					    jr :-
 | 
				
			||||||
 | 
					:   ld a, l
 | 
				
			||||||
    ldh [hPieceDataBase], a
 | 
					    ldh [hPieceDataBase], a
 | 
				
			||||||
    ld a, h
 | 
					    ld a, h
 | 
				
			||||||
    ldh [hPieceDataBase+1], a
 | 
					    ldh [hPieceDataBase+1], a
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ldh a, [hCurrentPiece]
 | 
				
			||||||
    ld hl, sPieceFastRotationStates
 | 
					    ld hl, sPieceFastRotationStates
 | 
				
			||||||
    add hl, bc
 | 
					    ld de, 16
 | 
				
			||||||
    ld a, l
 | 
					:   cp a, 0
 | 
				
			||||||
 | 
					    jr z, :+
 | 
				
			||||||
 | 
					    add hl, de
 | 
				
			||||||
 | 
					    dec a
 | 
				
			||||||
 | 
					    jr :-
 | 
				
			||||||
 | 
					:   ld a, l
 | 
				
			||||||
    ldh [hPieceDataBaseFast], a
 | 
					    ldh [hPieceDataBaseFast], a
 | 
				
			||||||
    ld a, h
 | 
					    ld a, h
 | 
				
			||||||
    ldh [hPieceDataBaseFast+1], a
 | 
					    ldh [hPieceDataBaseFast+1], a
 | 
				
			||||||
    ret
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; The rotation state is a further offset of 4 bytes.
 | 
					 | 
				
			||||||
SetPieceDataOffset:
 | 
					SetPieceDataOffset:
 | 
				
			||||||
    ldh a, [hCurrentPieceRotationState]
 | 
					    ldh a, [hCurrentPieceRotationState]
 | 
				
			||||||
    sla a
 | 
					    sla a
 | 
				
			||||||
| 
						 | 
					@ -259,6 +248,7 @@ XYToSFieldPtr:
 | 
				
			||||||
    ret
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Converts piece Y in B and a piece X in A to a pointer to the field in HL.
 | 
					    ; Converts piece Y in B and a piece X in A to a pointer to the field in HL.
 | 
				
			||||||
XYToFieldPtr:
 | 
					XYToFieldPtr:
 | 
				
			||||||
    ld hl, wField-2
 | 
					    ld hl, wField-2
 | 
				
			||||||
| 
						 | 
					@ -276,9 +266,6 @@ XYToFieldPtr:
 | 
				
			||||||
    ret
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; This function makes HL point to the correct offset into the rotation data.
 | 
					 | 
				
			||||||
    ; This version of the data is used for thorough checking (T, J, and L have
 | 
					 | 
				
			||||||
    ; a middle column exception.)
 | 
					 | 
				
			||||||
GetPieceData:
 | 
					GetPieceData:
 | 
				
			||||||
    ldh a, [hPieceDataBase]
 | 
					    ldh a, [hPieceDataBase]
 | 
				
			||||||
    ld l, a
 | 
					    ld l, a
 | 
				
			||||||
| 
						 | 
					@ -286,13 +273,12 @@ GetPieceData:
 | 
				
			||||||
    ld h, a
 | 
					    ld h, a
 | 
				
			||||||
    ldh a, [hPieceDataOffset]
 | 
					    ldh a, [hPieceDataOffset]
 | 
				
			||||||
    ld c, a
 | 
					    ld c, a
 | 
				
			||||||
    ld b, 0
 | 
					    xor a, a
 | 
				
			||||||
 | 
					    ld b, a
 | 
				
			||||||
    add hl, bc
 | 
					    add hl, bc
 | 
				
			||||||
    ret
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Same as the above but for the fast data. This data is used when the exact
 | 
					 | 
				
			||||||
    ; cell that failed isn't important.
 | 
					 | 
				
			||||||
GetPieceDataFast:
 | 
					GetPieceDataFast:
 | 
				
			||||||
    ldh a, [hPieceDataBaseFast]
 | 
					    ldh a, [hPieceDataBaseFast]
 | 
				
			||||||
    ld l, a
 | 
					    ld l, a
 | 
				
			||||||
| 
						 | 
					@ -305,12 +291,61 @@ GetPieceDataFast:
 | 
				
			||||||
    add hl, bc
 | 
					    add hl, bc
 | 
				
			||||||
    ret
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ; Checks if the piece can fit at the current position, but fast.
 | 
				
			||||||
 | 
					    ; HL should point to the piece's rotation state data.
 | 
				
			||||||
 | 
					    ; DE should be pointing to the right place in the SHADOW field.
 | 
				
			||||||
 | 
					CanPieceFitFast:
 | 
				
			||||||
 | 
					    ld a, [hl+]
 | 
				
			||||||
 | 
					    add a, e
 | 
				
			||||||
 | 
					    ld e, a
 | 
				
			||||||
 | 
					    adc a, d
 | 
				
			||||||
 | 
					    sub e
 | 
				
			||||||
 | 
					    ld d, a
 | 
				
			||||||
 | 
					    ld a, [de]
 | 
				
			||||||
 | 
					    cp a, TILE_FIELD_EMPTY
 | 
				
			||||||
 | 
					    jr z, :+
 | 
				
			||||||
 | 
					    xor a, a
 | 
				
			||||||
 | 
					    ret
 | 
				
			||||||
 | 
					:   ld a, [hl+]
 | 
				
			||||||
 | 
					    add a, e
 | 
				
			||||||
 | 
					    ld e, a
 | 
				
			||||||
 | 
					    adc a, d
 | 
				
			||||||
 | 
					    sub e
 | 
				
			||||||
 | 
					    ld d, a
 | 
				
			||||||
 | 
					    ld a, [de]
 | 
				
			||||||
 | 
					    cp a, TILE_FIELD_EMPTY
 | 
				
			||||||
 | 
					    jr z, :+
 | 
				
			||||||
 | 
					    xor a, a
 | 
				
			||||||
 | 
					    ret
 | 
				
			||||||
 | 
					:   ld a, [hl+]
 | 
				
			||||||
 | 
					    add a, e
 | 
				
			||||||
 | 
					    ld e, a
 | 
				
			||||||
 | 
					    adc a, d
 | 
				
			||||||
 | 
					    sub e
 | 
				
			||||||
 | 
					    ld d, a
 | 
				
			||||||
 | 
					    ld a, [de]
 | 
				
			||||||
 | 
					    cp a, TILE_FIELD_EMPTY
 | 
				
			||||||
 | 
					    jr z, :+
 | 
				
			||||||
 | 
					    xor a, a
 | 
				
			||||||
 | 
					    ret
 | 
				
			||||||
 | 
					:   ld a, [hl+]
 | 
				
			||||||
 | 
					    add a, e
 | 
				
			||||||
 | 
					    ld e, a
 | 
				
			||||||
 | 
					    adc a, d
 | 
				
			||||||
 | 
					    sub e
 | 
				
			||||||
 | 
					    ld d, a
 | 
				
			||||||
 | 
					    ld a, [de]
 | 
				
			||||||
 | 
					    cp a, TILE_FIELD_EMPTY
 | 
				
			||||||
 | 
					    jr z, :+
 | 
				
			||||||
 | 
					    xor a, a
 | 
				
			||||||
 | 
					    ret
 | 
				
			||||||
 | 
					:   ld a, $FF
 | 
				
			||||||
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Checks if the piece can fit at the current position.
 | 
					    ; Checks if the piece can fit at the current position.
 | 
				
			||||||
    ; HL should point to the piece's rotation state data.
 | 
					    ; HL should point to the piece's rotation state data.
 | 
				
			||||||
    ; DE should be pointing to the right place in the SHADOW field.
 | 
					    ; DE should be pointing to the right place in the SHADOW field.
 | 
				
			||||||
    ; This will return with $FF in A if the piece fits, or with the
 | 
					 | 
				
			||||||
    ; exact cell that caused the first failure in A.
 | 
					 | 
				
			||||||
CanPieceFit:
 | 
					CanPieceFit:
 | 
				
			||||||
    xor a, a
 | 
					    xor a, a
 | 
				
			||||||
    ld b, a
 | 
					    ld b, a
 | 
				
			||||||
| 
						 | 
					@ -468,63 +503,6 @@ CanPieceFit:
 | 
				
			||||||
    ret
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Checks if the piece can fit at the current position, but fast.
 | 
					 | 
				
			||||||
    ; HL should point to the piece's fast rotation state data.
 | 
					 | 
				
			||||||
    ; DE should be pointing to the right place in the SHADOW field.
 | 
					 | 
				
			||||||
    ; This will return with $FF in A if the piece fits, or with a non-$FF
 | 
					 | 
				
			||||||
    ; value if it doesn't.
 | 
					 | 
				
			||||||
CanPieceFitFast:
 | 
					 | 
				
			||||||
    ld a, [hl+]
 | 
					 | 
				
			||||||
    add a, e
 | 
					 | 
				
			||||||
    ld e, a
 | 
					 | 
				
			||||||
    adc a, d
 | 
					 | 
				
			||||||
    sub e
 | 
					 | 
				
			||||||
    ld d, a
 | 
					 | 
				
			||||||
    ld a, [de]
 | 
					 | 
				
			||||||
    cp a, TILE_FIELD_EMPTY
 | 
					 | 
				
			||||||
    jr z, :+
 | 
					 | 
				
			||||||
    xor a, a
 | 
					 | 
				
			||||||
    ret
 | 
					 | 
				
			||||||
:   ld a, [hl+]
 | 
					 | 
				
			||||||
    add a, e
 | 
					 | 
				
			||||||
    ld e, a
 | 
					 | 
				
			||||||
    adc a, d
 | 
					 | 
				
			||||||
    sub e
 | 
					 | 
				
			||||||
    ld d, a
 | 
					 | 
				
			||||||
    ld a, [de]
 | 
					 | 
				
			||||||
    cp a, TILE_FIELD_EMPTY
 | 
					 | 
				
			||||||
    jr z, :+
 | 
					 | 
				
			||||||
    xor a, a
 | 
					 | 
				
			||||||
    ret
 | 
					 | 
				
			||||||
:   ld a, [hl+]
 | 
					 | 
				
			||||||
    add a, e
 | 
					 | 
				
			||||||
    ld e, a
 | 
					 | 
				
			||||||
    adc a, d
 | 
					 | 
				
			||||||
    sub e
 | 
					 | 
				
			||||||
    ld d, a
 | 
					 | 
				
			||||||
    ld a, [de]
 | 
					 | 
				
			||||||
    cp a, TILE_FIELD_EMPTY
 | 
					 | 
				
			||||||
    jr z, :+
 | 
					 | 
				
			||||||
    xor a, a
 | 
					 | 
				
			||||||
    ret
 | 
					 | 
				
			||||||
:   ld a, [hl+]
 | 
					 | 
				
			||||||
    add a, e
 | 
					 | 
				
			||||||
    ld e, a
 | 
					 | 
				
			||||||
    adc a, d
 | 
					 | 
				
			||||||
    sub e
 | 
					 | 
				
			||||||
    ld d, a
 | 
					 | 
				
			||||||
    ld a, [de]
 | 
					 | 
				
			||||||
    cp a, TILE_FIELD_EMPTY
 | 
					 | 
				
			||||||
    jr z, :+
 | 
					 | 
				
			||||||
    xor a, a
 | 
					 | 
				
			||||||
    ret
 | 
					 | 
				
			||||||
:   ld a, $FF
 | 
					 | 
				
			||||||
    ret
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    ; This function will draw the piece even if it can't fit.
 | 
					 | 
				
			||||||
    ; We use this to draw a final failed spawn before going game
 | 
					 | 
				
			||||||
    ; over.
 | 
					 | 
				
			||||||
ForceSpawnPiece::
 | 
					ForceSpawnPiece::
 | 
				
			||||||
    call SetPieceData
 | 
					    call SetPieceData
 | 
				
			||||||
    call SetPieceDataOffset
 | 
					    call SetPieceDataOffset
 | 
				
			||||||
| 
						 | 
					@ -535,7 +513,8 @@ ForceSpawnPiece::
 | 
				
			||||||
    ld d, h
 | 
					    ld d, h
 | 
				
			||||||
    ld e, l
 | 
					    ld e, l
 | 
				
			||||||
    call GetPieceData
 | 
					    call GetPieceData
 | 
				
			||||||
    ld b, GAME_OVER_OTHER
 | 
					    ld a, GAME_OVER_OTHER
 | 
				
			||||||
 | 
					    ld b, a
 | 
				
			||||||
    push hl
 | 
					    push hl
 | 
				
			||||||
    push de
 | 
					    push de
 | 
				
			||||||
    pop hl
 | 
					    pop hl
 | 
				
			||||||
| 
						 | 
					@ -543,8 +522,6 @@ ForceSpawnPiece::
 | 
				
			||||||
    jp DrawPiece
 | 
					    jp DrawPiece
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Initialize the state for a new piece and attempts to spawn it.
 | 
					 | 
				
			||||||
    ; On return, A will be $FF if the piece fit.
 | 
					 | 
				
			||||||
TrySpawnPiece::
 | 
					TrySpawnPiece::
 | 
				
			||||||
    ; Always reset these for a new piece.
 | 
					    ; Always reset these for a new piece.
 | 
				
			||||||
    xor a, a
 | 
					    xor a, a
 | 
				
			||||||
| 
						 | 
					@ -731,8 +708,6 @@ FindMaxG:
 | 
				
			||||||
    ret
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; This is the main function that will process input, gravity, and locking.
 | 
					 | 
				
			||||||
    ; It should be ran once per frame as long as lock delay is greater than 0.
 | 
					 | 
				
			||||||
FieldProcess::
 | 
					FieldProcess::
 | 
				
			||||||
    ; **************************************************************
 | 
					    ; **************************************************************
 | 
				
			||||||
    ; SETUP
 | 
					    ; SETUP
 | 
				
			||||||
| 
						 | 
					@ -861,7 +836,7 @@ FieldProcess::
 | 
				
			||||||
    cp a, PIECE_Z
 | 
					    cp a, PIECE_Z
 | 
				
			||||||
    jr z, .trykickright
 | 
					    jr z, .trykickright
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; I piece only kicks in ARS2
 | 
					    ; I piece only kicks in TGM3/TGW3/EASY/EAWY
 | 
				
			||||||
    cp a, PIECE_I
 | 
					    cp a, PIECE_I
 | 
				
			||||||
    jr nz, :+
 | 
					    jr nz, :+
 | 
				
			||||||
    ld a, [wRotModeState]
 | 
					    ld a, [wRotModeState]
 | 
				
			||||||
| 
						 | 
					@ -957,7 +932,7 @@ FieldProcess::
 | 
				
			||||||
    ldh [hLockDelayForce], a
 | 
					    ldh [hLockDelayForce], a
 | 
				
			||||||
    jp .norot
 | 
					    jp .norot
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; In ARS2 mode, there are a few other kicks possible.
 | 
					    ; In TGM3, TGW3, EASY, and EAWY modes, there are a few other kicks possible.
 | 
				
			||||||
.maybetgm3rot
 | 
					.maybetgm3rot
 | 
				
			||||||
    ld a, [wRotModeState]
 | 
					    ld a, [wRotModeState]
 | 
				
			||||||
    cp a, ROT_MODE_ARSTI
 | 
					    cp a, ROT_MODE_ARSTI
 | 
				
			||||||
| 
						 | 
					@ -1253,7 +1228,6 @@ FieldProcess::
 | 
				
			||||||
    ld a, $FF
 | 
					    ld a, $FF
 | 
				
			||||||
    ldh [hAwardDownBonus], a
 | 
					    ldh [hAwardDownBonus], a
 | 
				
			||||||
    ld a, 20
 | 
					    ld a, 20
 | 
				
			||||||
    ldh [hWantedG], a
 | 
					 | 
				
			||||||
    ld b, a
 | 
					    ld b, a
 | 
				
			||||||
    ldh a, [hActualG]
 | 
					    ldh a, [hActualG]
 | 
				
			||||||
    cp a, b
 | 
					    cp a, b
 | 
				
			||||||
| 
						 | 
					@ -1286,7 +1260,7 @@ FieldProcess::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Gravity?
 | 
					    ; Gravity?
 | 
				
			||||||
:   ldh a, [hCurrentFractionalGravity]
 | 
					:   ldh a, [hCurrentFractionalGravity]
 | 
				
			||||||
    cp a, $00 ; 0 is the sentinel value that should be interpreted as "every frame"
 | 
					    cp a, $00
 | 
				
			||||||
    jr z, :+
 | 
					    jr z, :+
 | 
				
			||||||
    ld b, a
 | 
					    ld b, a
 | 
				
			||||||
    ldh a, [hGravityCtr]
 | 
					    ldh a, [hGravityCtr]
 | 
				
			||||||
| 
						 | 
					@ -1469,7 +1443,7 @@ FieldProcess::
 | 
				
			||||||
    ldh a, [hWantedG]
 | 
					    ldh a, [hWantedG]
 | 
				
			||||||
    cp a, 1
 | 
					    cp a, 1
 | 
				
			||||||
    jr nz, .postghost
 | 
					    jr nz, .postghost
 | 
				
			||||||
    ld a, [wInitialA] ; Let's not do the flickering on the GBC.
 | 
					    ld a, [wInitialA]
 | 
				
			||||||
    cp a, $11
 | 
					    cp a, $11
 | 
				
			||||||
    jr z, .ghost
 | 
					    jr z, .ghost
 | 
				
			||||||
    ldh a, [hEvenFrame]
 | 
					    ldh a, [hEvenFrame]
 | 
				
			||||||
| 
						 | 
					@ -1507,22 +1481,20 @@ FieldProcess::
 | 
				
			||||||
    cp a, b
 | 
					    cp a, b
 | 
				
			||||||
    jr z, .drawpiece
 | 
					    jr z, .drawpiece
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ; If we're not grounded, draw the piece normally.
 | 
				
			||||||
 | 
					    ldh a, [hGrounded]
 | 
				
			||||||
 | 
					    cp a, $FF
 | 
				
			||||||
 | 
					    jr nz, .drawpiece
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; If the lock delay is 0, draw the piece in the final color.
 | 
					    ; If the lock delay is 0, draw the piece in the final color.
 | 
				
			||||||
    ldh a, [hWantedTile]
 | 
					    ldh a, [hCurrentPiece]
 | 
				
			||||||
    add a, 7
 | 
					    ld b, TILE_PIECE_0+7
 | 
				
			||||||
 | 
					    add a, b
 | 
				
			||||||
    ldh [hWantedTile], a
 | 
					    ldh [hWantedTile], a
 | 
				
			||||||
    ldh a, [hCurrentLockDelayRemaining]
 | 
					    ldh a, [hCurrentLockDelayRemaining]
 | 
				
			||||||
    cp a, 0
 | 
					    cp a, 0
 | 
				
			||||||
    jr z, .drawpiece
 | 
					    jr z, .drawpiece
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; If we're not grounded, draw the piece normally.
 | 
					 | 
				
			||||||
    ldh a, [hWantedTile]
 | 
					 | 
				
			||||||
    sub a, 7
 | 
					 | 
				
			||||||
    ldh [hWantedTile], a
 | 
					 | 
				
			||||||
    ldh a, [hGrounded]
 | 
					 | 
				
			||||||
    cp a, $FF
 | 
					 | 
				
			||||||
    jr nz, .drawpiece
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    ; Otherwise, look it up.
 | 
					    ; Otherwise, look it up.
 | 
				
			||||||
    call GetTileShade
 | 
					    call GetTileShade
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1543,7 +1515,7 @@ FieldProcess::
 | 
				
			||||||
    call DrawPiece
 | 
					    call DrawPiece
 | 
				
			||||||
    ret
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Performs a lookup to see how "locked" the piece is.
 | 
					
 | 
				
			||||||
GetTileShade:
 | 
					GetTileShade:
 | 
				
			||||||
    ldh a, [hCurrentLockDelay]
 | 
					    ldh a, [hCurrentLockDelay]
 | 
				
			||||||
    cp a, 30
 | 
					    cp a, 30
 | 
				
			||||||
| 
						 | 
					@ -1651,8 +1623,6 @@ GetTileShade:
 | 
				
			||||||
    ret
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; This is called every frame after a piece has been locked until the delay state ends.
 | 
					 | 
				
			||||||
    ; Lines are cleared, levels and score are awarded, and ARE time is waited out.
 | 
					 | 
				
			||||||
FieldDelay::
 | 
					FieldDelay::
 | 
				
			||||||
    ; Switch on the delay state.
 | 
					    ; Switch on the delay state.
 | 
				
			||||||
    ld a, [wDelayState]
 | 
					    ld a, [wDelayState]
 | 
				
			||||||
| 
						 | 
					@ -1691,7 +1661,7 @@ FieldDelay::
 | 
				
			||||||
    and a, d
 | 
					    and a, d
 | 
				
			||||||
    cp a, $FF
 | 
					    cp a, $FF
 | 
				
			||||||
    jr z, .skip
 | 
					    jr z, .skip
 | 
				
			||||||
    ld a, DELAY_STATE_LINE_PRE_CLEAR ; If there were line clears, do a line clear delay, then a LINE_ARE delay.
 | 
					    ld a, DELAY_STATE_LINE_PRE_CLEAR ; If there were line clears, do a line clear delay, then an ARE delay.
 | 
				
			||||||
    ld [wDelayState], a
 | 
					    ld [wDelayState], a
 | 
				
			||||||
    ldh a, [hCurrentLineClearDelay]
 | 
					    ldh a, [hCurrentLineClearDelay]
 | 
				
			||||||
    ldh [hRemainingDelay], a
 | 
					    ldh [hRemainingDelay], a
 | 
				
			||||||
| 
						 | 
					@ -1834,7 +1804,7 @@ FieldDelay::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Line clear delay.
 | 
					    ; Line clear delay.
 | 
				
			||||||
    ; Count down the delay. If we're out of delay, clear the lines and go to LINE_ARE.
 | 
					    ; Count down the delay. If we're out of delay, clear the lines and go to ARE.
 | 
				
			||||||
.lineclear
 | 
					.lineclear
 | 
				
			||||||
    ldh a, [hRemainingDelay]
 | 
					    ldh a, [hRemainingDelay]
 | 
				
			||||||
    dec a
 | 
					    dec a
 | 
				
			||||||
| 
						 | 
					@ -1888,12 +1858,12 @@ FieldDelay::
 | 
				
			||||||
    ldh [hCurrentPiece], a
 | 
					    ldh [hCurrentPiece], a
 | 
				
			||||||
    call GetNextPiece
 | 
					    call GetNextPiece
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Kill the sound for the next piece.
 | 
					    ; Kill the sound for the next piece.
 | 
				
			||||||
    jp SFXKill
 | 
					    call SFXKill
 | 
				
			||||||
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Shifts B into the line clear list.
 | 
					 | 
				
			||||||
    ; Also increments the line clear count.
 | 
					 | 
				
			||||||
AppendClearedLine:
 | 
					AppendClearedLine:
 | 
				
			||||||
    ldh a, [hLineClearCt]
 | 
					    ldh a, [hLineClearCt]
 | 
				
			||||||
    inc a
 | 
					    inc a
 | 
				
			||||||
| 
						 | 
					@ -1909,8 +1879,6 @@ AppendClearedLine:
 | 
				
			||||||
    ret
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Scans the field for lines that are completely filled with non-empty spaces.
 | 
					 | 
				
			||||||
    ; Every time one is found, it is added to a list.
 | 
					 | 
				
			||||||
FindClearedLines:
 | 
					FindClearedLines:
 | 
				
			||||||
    xor a, a
 | 
					    xor a, a
 | 
				
			||||||
    ldh [hLineClearCt], a
 | 
					    ldh [hLineClearCt], a
 | 
				
			||||||
| 
						 | 
					@ -1946,7 +1914,7 @@ FindClearedLines:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ret
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Goes through the list of cleared lines and marks those lines with the "line clear" tile.
 | 
					
 | 
				
			||||||
MarkClear:
 | 
					MarkClear:
 | 
				
			||||||
    ldh a, [hClearedLines]
 | 
					    ldh a, [hClearedLines]
 | 
				
			||||||
    cp a, $FF
 | 
					    cp a, $FF
 | 
				
			||||||
| 
						 | 
					@ -1998,10 +1966,10 @@ MarkClear:
 | 
				
			||||||
    jr nz, :-
 | 
					    jr nz, :-
 | 
				
			||||||
    ld bc, 10
 | 
					    ld bc, 10
 | 
				
			||||||
    ld d, TILE_CLEARING
 | 
					    ld d, TILE_CLEARING
 | 
				
			||||||
    jp UnsafeMemSet
 | 
					    call UnsafeMemSet
 | 
				
			||||||
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Once again, scans the field for cleared lines, but this time removes them.
 | 
					 | 
				
			||||||
ClearLines:
 | 
					ClearLines:
 | 
				
			||||||
    ld de, 0
 | 
					    ld de, 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										75
									
								
								src/gbc.asm
								
								
								
								
							
							
						
						
									
										75
									
								
								src/gbc.asm
								
								
								
								
							| 
						 | 
					@ -38,11 +38,9 @@ DEF R3 EQU %0000000000011111
 | 
				
			||||||
SECTION "GBC Shadow Tilemap", WRAM0, ALIGN[8]
 | 
					SECTION "GBC Shadow Tilemap", WRAM0, ALIGN[8]
 | 
				
			||||||
wShadowTilemap:: ds 32*32
 | 
					wShadowTilemap:: ds 32*32
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
SECTION "GBC Shadow Tile Attributes", WRAM0, ALIGN[8]
 | 
					SECTION "GBC Shadow Tile Attributes", WRAM0, ALIGN[8]
 | 
				
			||||||
wShadowTileAttrs:: ds 32*32
 | 
					wShadowTileAttrs:: ds 32*32
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
SECTION "GBC Variables", WRAM0
 | 
					SECTION "GBC Variables", WRAM0
 | 
				
			||||||
wOuterReps:: ds 1
 | 
					wOuterReps:: ds 1
 | 
				
			||||||
wInnerReps:: ds 1
 | 
					wInnerReps:: ds 1
 | 
				
			||||||
| 
						 | 
					@ -50,7 +48,6 @@ wTitlePal:: ds 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SECTION "GBC Functions", ROM0
 | 
					SECTION "GBC Functions", ROM0
 | 
				
			||||||
    ; Copies the shadow tile attribute map to vram using instant HDMA.
 | 
					 | 
				
			||||||
ToATTR::
 | 
					ToATTR::
 | 
				
			||||||
    ld a, [wInitialA]
 | 
					    ld a, [wInitialA]
 | 
				
			||||||
    cp a, $11
 | 
					    cp a, $11
 | 
				
			||||||
| 
						 | 
					@ -74,7 +71,38 @@ ToATTR::
 | 
				
			||||||
    ret
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Sets up GBC registers for the title state.
 | 
					ToVRAM::
 | 
				
			||||||
 | 
					    ; Bank 1
 | 
				
			||||||
 | 
					    ld a, 1
 | 
				
			||||||
 | 
					    ldh [rVBK], a
 | 
				
			||||||
 | 
					    ld a, HIGH(wShadowTileAttrs)
 | 
				
			||||||
 | 
					    ldh [rHDMA1], a
 | 
				
			||||||
 | 
					    ld a, LOW(wShadowTileAttrs)
 | 
				
			||||||
 | 
					    ldh [rHDMA2], a
 | 
				
			||||||
 | 
					    ld a, HIGH($9800)
 | 
				
			||||||
 | 
					    ldh [rHDMA3], a
 | 
				
			||||||
 | 
					    ld a, LOW($9800)
 | 
				
			||||||
 | 
					    ldh [rHDMA4], a
 | 
				
			||||||
 | 
					    ld a, 40
 | 
				
			||||||
 | 
					    ldh [rHDMA5], a
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ; Bank 0
 | 
				
			||||||
 | 
					    ld a, 0
 | 
				
			||||||
 | 
					    ldh [rVBK], a
 | 
				
			||||||
 | 
					    ld a, HIGH(wShadowTilemap)
 | 
				
			||||||
 | 
					    ldh [rHDMA1], a
 | 
				
			||||||
 | 
					    ld a, LOW(wShadowTilemap)
 | 
				
			||||||
 | 
					    ldh [rHDMA2], a
 | 
				
			||||||
 | 
					    ld a, HIGH($9800)
 | 
				
			||||||
 | 
					    ldh [rHDMA3], a
 | 
				
			||||||
 | 
					    ld a, LOW($9800)
 | 
				
			||||||
 | 
					    ldh [rHDMA4], a
 | 
				
			||||||
 | 
					    ld a, 39 | $80
 | 
				
			||||||
 | 
					    ldh [rHDMA5], a
 | 
				
			||||||
 | 
					    jp EventLoop
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GBCTitleInit::
 | 
					GBCTitleInit::
 | 
				
			||||||
    ld a, [wInitialA]
 | 
					    ld a, [wInitialA]
 | 
				
			||||||
    cp a, $11
 | 
					    cp a, $11
 | 
				
			||||||
| 
						 | 
					@ -356,7 +384,7 @@ GBCTitleInit::
 | 
				
			||||||
    ld [wTitlePal], a
 | 
					    ld [wTitlePal], a
 | 
				
			||||||
    ret
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Sets the GBC registers for the gameplay state.
 | 
					
 | 
				
			||||||
GBCGameplayInit::
 | 
					GBCGameplayInit::
 | 
				
			||||||
    ld a, [wInitialA]
 | 
					    ld a, [wInitialA]
 | 
				
			||||||
    cp a, $11
 | 
					    cp a, $11
 | 
				
			||||||
| 
						 | 
					@ -650,7 +678,6 @@ GBCGameplayInit::
 | 
				
			||||||
    ret
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Additional GBC effects for the title screen process state.
 | 
					 | 
				
			||||||
GBCTitleProcess::
 | 
					GBCTitleProcess::
 | 
				
			||||||
    ld a, [wInitialA]
 | 
					    ld a, [wInitialA]
 | 
				
			||||||
    cp a, $11
 | 
					    cp a, $11
 | 
				
			||||||
| 
						 | 
					@ -698,10 +725,10 @@ GBCTitleProcess::
 | 
				
			||||||
    ld a, 3
 | 
					    ld a, 3
 | 
				
			||||||
    ld d, a
 | 
					    ld d, a
 | 
				
			||||||
    ld bc, 32
 | 
					    ld bc, 32
 | 
				
			||||||
    jp UnsafeMemSet
 | 
					    call UnsafeMemSet
 | 
				
			||||||
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Additional GBC effects for the gameplay process state.
 | 
					 | 
				
			||||||
GBCGameplayProcess::
 | 
					GBCGameplayProcess::
 | 
				
			||||||
    ld a, [wInitialA]
 | 
					    ld a, [wInitialA]
 | 
				
			||||||
    cp a, $11
 | 
					    cp a, $11
 | 
				
			||||||
| 
						 | 
					@ -919,38 +946,8 @@ GBCGameplayProcess::
 | 
				
			||||||
    ret
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Copies the shadow tile maps to VRAM using HDMA. The attributes are copied using instant mode
 | 
					 | 
				
			||||||
    ; The tile data is done using hblank mode.
 | 
					 | 
				
			||||||
GBCBlitField::
 | 
					GBCBlitField::
 | 
				
			||||||
ToVRAM::
 | 
					    jp ToVRAM
 | 
				
			||||||
    ; Bank 1
 | 
					 | 
				
			||||||
    ld a, 1
 | 
					 | 
				
			||||||
    ldh [rVBK], a
 | 
					 | 
				
			||||||
    ld a, HIGH(wShadowTileAttrs)
 | 
					 | 
				
			||||||
    ldh [rHDMA1], a
 | 
					 | 
				
			||||||
    ld a, LOW(wShadowTileAttrs)
 | 
					 | 
				
			||||||
    ldh [rHDMA2], a
 | 
					 | 
				
			||||||
    ld a, HIGH($9800)
 | 
					 | 
				
			||||||
    ldh [rHDMA3], a
 | 
					 | 
				
			||||||
    ld a, LOW($9800)
 | 
					 | 
				
			||||||
    ldh [rHDMA4], a
 | 
					 | 
				
			||||||
    ld a, 40
 | 
					 | 
				
			||||||
    ldh [rHDMA5], a
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    ; Bank 0
 | 
					 | 
				
			||||||
    ld a, 0
 | 
					 | 
				
			||||||
    ldh [rVBK], a
 | 
					 | 
				
			||||||
    ld a, HIGH(wShadowTilemap)
 | 
					 | 
				
			||||||
    ldh [rHDMA1], a
 | 
					 | 
				
			||||||
    ld a, LOW(wShadowTilemap)
 | 
					 | 
				
			||||||
    ldh [rHDMA2], a
 | 
					 | 
				
			||||||
    ld a, HIGH($9800)
 | 
					 | 
				
			||||||
    ldh [rHDMA3], a
 | 
					 | 
				
			||||||
    ld a, LOW($9800)
 | 
					 | 
				
			||||||
    ldh [rHDMA4], a
 | 
					 | 
				
			||||||
    ld a, 39 | $80
 | 
					 | 
				
			||||||
    ldh [rHDMA5], a
 | 
					 | 
				
			||||||
    jp EventLoop
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ENDC
 | 
					ENDC
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -35,7 +35,6 @@ hSelectState::     ds 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SECTION "Input Functions", ROM0
 | 
					SECTION "Input Functions", ROM0
 | 
				
			||||||
    ; Zeroes out all button states.
 | 
					 | 
				
			||||||
InputInit::
 | 
					InputInit::
 | 
				
			||||||
    xor a, a
 | 
					    xor a, a
 | 
				
			||||||
    ldh [hUpState], a
 | 
					    ldh [hUpState], a
 | 
				
			||||||
| 
						 | 
					@ -49,9 +48,6 @@ InputInit::
 | 
				
			||||||
    ret
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Gets the current state of all buttons.
 | 
					 | 
				
			||||||
    ; Held buttons are incremented. Buttons that aren't held are reset to 0.
 | 
					 | 
				
			||||||
    ; Left/Right cause Up/Down to be reset as well.
 | 
					 | 
				
			||||||
GetInput::
 | 
					GetInput::
 | 
				
			||||||
    ; Get the button state.
 | 
					    ; Get the button state.
 | 
				
			||||||
.btns
 | 
					.btns
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -27,13 +27,12 @@ hLCDCCtr:: ds 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SECTION "Interrupt Initialization Functions", ROM0
 | 
					SECTION "Interrupt Initialization Functions", ROM0
 | 
				
			||||||
    ; Zeroes out the interrupt counter.
 | 
					 | 
				
			||||||
IntrInit::
 | 
					IntrInit::
 | 
				
			||||||
    xor a, a
 | 
					    xor a, a
 | 
				
			||||||
    ldh [hLCDCCtr], a
 | 
					    ldh [hLCDCCtr], a
 | 
				
			||||||
    ret
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Sets up the STAT interrupt.
 | 
					
 | 
				
			||||||
InitializeLCDCInterrupt::
 | 
					InitializeLCDCInterrupt::
 | 
				
			||||||
    ld a, STATF_LYC
 | 
					    ld a, STATF_LYC
 | 
				
			||||||
    ldh [rSTAT], a
 | 
					    ldh [rSTAT], a
 | 
				
			||||||
| 
						 | 
					@ -50,8 +49,6 @@ InitializeLCDCInterrupt::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SECTION "LCDC Interrupt", ROM0[INT_HANDLER_STAT]
 | 
					SECTION "LCDC Interrupt", ROM0[INT_HANDLER_STAT]
 | 
				
			||||||
    ; This interrupt handler will be called every 7 scanlines, scrolling up the tile map by 1 line. This has the
 | 
					 | 
				
			||||||
    ; effect of making the tiles appear as 8x7 pixels, and making 20 rows fit on the screen.
 | 
					 | 
				
			||||||
LCDCInterrupt:
 | 
					LCDCInterrupt:
 | 
				
			||||||
    push af
 | 
					    push af
 | 
				
			||||||
    push hl
 | 
					    push hl
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -41,11 +41,22 @@ hPrevHundreds:: ds 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SECTION "Level Functions", ROM0
 | 
					SECTION "Level Functions", ROM0
 | 
				
			||||||
    ; Loads the initial state of the speed curve.
 | 
					 | 
				
			||||||
LevelInit::
 | 
					LevelInit::
 | 
				
			||||||
    xor a, a
 | 
					    xor a, a
 | 
				
			||||||
 | 
					    ldh [hLevel], a
 | 
				
			||||||
 | 
					    ldh [hLevel+1], a
 | 
				
			||||||
 | 
					    ldh [hCLevel], a
 | 
				
			||||||
 | 
					    ldh [hCLevel+1], a
 | 
				
			||||||
 | 
					    ldh [hCLevel+2], a
 | 
				
			||||||
 | 
					    ldh [hCLevel+3], a
 | 
				
			||||||
 | 
					    ldh [hNLevel], a
 | 
				
			||||||
 | 
					    ldh [hNLevel+2], a ; Note +1 is inited later.
 | 
				
			||||||
 | 
					    ldh [hNLevel+3], a
 | 
				
			||||||
    ldh [hRequiresLineClear], a
 | 
					    ldh [hRequiresLineClear], a
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ld a, 1
 | 
				
			||||||
 | 
					    ldh [hNLevel+1], a
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ldh a, [hStartSpeed]
 | 
					    ldh a, [hStartSpeed]
 | 
				
			||||||
    ld l, a
 | 
					    ld l, a
 | 
				
			||||||
    ldh a, [hStartSpeed+1]
 | 
					    ldh a, [hStartSpeed+1]
 | 
				
			||||||
| 
						 | 
					@ -98,8 +109,8 @@ LevelInit::
 | 
				
			||||||
    and a, $0F
 | 
					    and a, $0F
 | 
				
			||||||
    ldh [hNLevel], a
 | 
					    ldh [hNLevel], a
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    jp DoSpeedUp
 | 
					    call DoSpeedUp
 | 
				
			||||||
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Increment level and speed up if necessary. Level increment in E.
 | 
					    ; Increment level and speed up if necessary. Level increment in E.
 | 
				
			||||||
    ; Levels may only increment by single digits.
 | 
					    ; Levels may only increment by single digits.
 | 
				
			||||||
| 
						 | 
					@ -188,7 +199,8 @@ LevelUp::
 | 
				
			||||||
    ldh [hLevel+1], a
 | 
					    ldh [hLevel+1], a
 | 
				
			||||||
    call DoSpeedUp
 | 
					    call DoSpeedUp
 | 
				
			||||||
    ld a, SFX_RANKUP
 | 
					    ld a, SFX_RANKUP
 | 
				
			||||||
    jp SFXEnqueue
 | 
					    call SFXEnqueue
 | 
				
			||||||
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.checknlevel
 | 
					.checknlevel
 | 
				
			||||||
    ; Make wNLevel make sense.
 | 
					    ; Make wNLevel make sense.
 | 
				
			||||||
| 
						 | 
					@ -294,14 +306,16 @@ LevelUp::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
:   ldh a, [hNextSpeedUp+1]
 | 
					:   ldh a, [hNextSpeedUp+1]
 | 
				
			||||||
    and a, $0F
 | 
					    and a, $0F
 | 
				
			||||||
    jr z, DoSpeedUp
 | 
					    jr z, :+
 | 
				
			||||||
    ld hl, hCLevel+3
 | 
					    ld hl, hCLevel+3
 | 
				
			||||||
    cp a, [hl]
 | 
					    cp a, [hl]
 | 
				
			||||||
    jr z, DoSpeedUp
 | 
					    jr z, :+
 | 
				
			||||||
    ret nc  ; This can fall through to the next function here. This is intentional.
 | 
					    ret nc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:   call DoSpeedUp
 | 
				
			||||||
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Iterates over the speed curve and loads the new constants.
 | 
					 | 
				
			||||||
DoSpeedUp:
 | 
					DoSpeedUp:
 | 
				
			||||||
    ; Load curve ptr.
 | 
					    ; Load curve ptr.
 | 
				
			||||||
    ldh a, [hSpeedCurvePtr]
 | 
					    ldh a, [hSpeedCurvePtr]
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										14
									
								
								src/main.asm
								
								
								
								
							
							
						
						
									
										14
									
								
								src/main.asm
								
								
								
								
							| 
						 | 
					@ -39,6 +39,10 @@ wAlways20GState:: ds 1
 | 
				
			||||||
wInitialA:: ds 1
 | 
					wInitialA:: ds 1
 | 
				
			||||||
wInitialB:: ds 1
 | 
					wInitialB:: ds 1
 | 
				
			||||||
wInitialC:: ds 1
 | 
					wInitialC:: ds 1
 | 
				
			||||||
 | 
					wInitialD:: ds 1
 | 
				
			||||||
 | 
					wInitialE:: ds 1
 | 
				
			||||||
 | 
					wInitialH:: ds 1
 | 
				
			||||||
 | 
					wInitialL:: ds 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SECTION "Stack", WRAM0
 | 
					SECTION "Stack", WRAM0
 | 
				
			||||||
| 
						 | 
					@ -48,7 +52,6 @@ wStackEnd::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SECTION "Code Entry Point", ROM0
 | 
					SECTION "Code Entry Point", ROM0
 | 
				
			||||||
    ; Main entry point. Does some set up and then goes into an infinite event loop initialized on the title screen.
 | 
					 | 
				
			||||||
Main::
 | 
					Main::
 | 
				
			||||||
    ; Load the initial registers. For reasons.
 | 
					    ; Load the initial registers. For reasons.
 | 
				
			||||||
    ld [wInitialA], a
 | 
					    ld [wInitialA], a
 | 
				
			||||||
| 
						 | 
					@ -56,6 +59,14 @@ Main::
 | 
				
			||||||
    ld [wInitialB], a
 | 
					    ld [wInitialB], a
 | 
				
			||||||
    ld a, c
 | 
					    ld a, c
 | 
				
			||||||
    ld [wInitialC], a
 | 
					    ld [wInitialC], a
 | 
				
			||||||
 | 
					    ld a, d
 | 
				
			||||||
 | 
					    ld [wInitialD], a
 | 
				
			||||||
 | 
					    ld a, e
 | 
				
			||||||
 | 
					    ld [wInitialE], a
 | 
				
			||||||
 | 
					    ld a, h
 | 
				
			||||||
 | 
					    ld [wInitialH], a
 | 
				
			||||||
 | 
					    ld a, l
 | 
				
			||||||
 | 
					    ld [wInitialL], a
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Let the DMG have some fun with the initial screen.
 | 
					    ; Let the DMG have some fun with the initial screen.
 | 
				
			||||||
    call DoDMGEffect
 | 
					    call DoDMGEffect
 | 
				
			||||||
| 
						 | 
					@ -117,7 +128,6 @@ Main::
 | 
				
			||||||
    call SwitchToTitle
 | 
					    call SwitchToTitle
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Event loop time!
 | 
					 | 
				
			||||||
EventLoop::
 | 
					EventLoop::
 | 
				
			||||||
    ; Play the sound effect, if any.
 | 
					    ; Play the sound effect, if any.
 | 
				
			||||||
    call SFXPlay
 | 
					    call SFXPlay
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -23,7 +23,7 @@ INCLUDE "globals.asm"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SECTION "Memory Functions", ROM0
 | 
					SECTION "Memory Functions", ROM0
 | 
				
			||||||
    ; Copies data from de to hl, bc bytes. Doesn't check for vram access.
 | 
					; Copies data from de to hl, bc bytes
 | 
				
			||||||
UnsafeMemCopy::
 | 
					UnsafeMemCopy::
 | 
				
			||||||
    ld a, [de]
 | 
					    ld a, [de]
 | 
				
			||||||
    ld [hl+], a
 | 
					    ld [hl+], a
 | 
				
			||||||
| 
						 | 
					@ -35,7 +35,7 @@ UnsafeMemCopy::
 | 
				
			||||||
    ret
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Copies data from de to hl, bc bytes. Checks for vram access.
 | 
					; Copies data from de to hl, bc bytes
 | 
				
			||||||
SafeMemCopy::
 | 
					SafeMemCopy::
 | 
				
			||||||
    wait_vram
 | 
					    wait_vram
 | 
				
			||||||
    ld a, [de]
 | 
					    ld a, [de]
 | 
				
			||||||
| 
						 | 
					@ -47,8 +47,7 @@ SafeMemCopy::
 | 
				
			||||||
    jr nz, SafeMemCopy
 | 
					    jr nz, SafeMemCopy
 | 
				
			||||||
    ret
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					; Sets memory from hl to hl+bc to d
 | 
				
			||||||
    ; Sets memory from hl to hl+bc to d. Doesn't check for vram access.
 | 
					 | 
				
			||||||
UnsafeMemSet::
 | 
					UnsafeMemSet::
 | 
				
			||||||
    ld [hl], d
 | 
					    ld [hl], d
 | 
				
			||||||
    inc hl
 | 
					    inc hl
 | 
				
			||||||
| 
						 | 
					@ -58,8 +57,6 @@ UnsafeMemSet::
 | 
				
			||||||
    jr nz, UnsafeMemSet
 | 
					    jr nz, UnsafeMemSet
 | 
				
			||||||
    ret
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
    ; Sets memory from hl to hl+bc to d. Checks for vram access.
 | 
					 | 
				
			||||||
SafeMemSet::
 | 
					SafeMemSet::
 | 
				
			||||||
    wait_vram
 | 
					    wait_vram
 | 
				
			||||||
    ld [hl], d
 | 
					    ld [hl], d
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										34
									
								
								src/rng.asm
								
								
								
								
							
							
						
						
									
										34
									
								
								src/rng.asm
								
								
								
								
							| 
						 | 
					@ -38,7 +38,6 @@ wTGM3WorstDroughtIdx: ds 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
section "RNG Functions", ROM0
 | 
					section "RNG Functions", ROM0
 | 
				
			||||||
    ; Snapshots the initial seed for a game, then initializes the history and piece queue.
 | 
					 | 
				
			||||||
RNGInit::
 | 
					RNGInit::
 | 
				
			||||||
    ; Do some bit fuckery on the seed using the gameboy's free-running timers.
 | 
					    ; Do some bit fuckery on the seed using the gameboy's free-running timers.
 | 
				
			||||||
    ldh a, [rDIV]
 | 
					    ldh a, [rDIV]
 | 
				
			||||||
| 
						 | 
					@ -113,7 +112,8 @@ RNGInit::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Generate the next 2 to fill up the queue.
 | 
					    ; Generate the next 2 to fill up the queue.
 | 
				
			||||||
    call GetNextPiece
 | 
					    call GetNextPiece
 | 
				
			||||||
    jp GetNextPiece
 | 
					    call GetNextPiece
 | 
				
			||||||
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Shift the generated piece into the history and save it.
 | 
					    ; Shift the generated piece into the history and save it.
 | 
				
			||||||
| 
						 | 
					@ -354,27 +354,21 @@ GetNextTGM3Piece:
 | 
				
			||||||
    ld [hl], a
 | 
					    ld [hl], a
 | 
				
			||||||
    ret
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Gets the next piece depending on RNG mode.
 | 
					
 | 
				
			||||||
GetNextPiece::
 | 
					GetNextPiece::
 | 
				
			||||||
    ld hl, .nextpiecejumps
 | 
					 | 
				
			||||||
    ld a, [wRNGModeState]
 | 
					    ld a, [wRNGModeState]
 | 
				
			||||||
    ld b, 0
 | 
					    cp a, RNG_MODE_HELL
 | 
				
			||||||
    ld c, a
 | 
					    jp z, GetNextHellPiece
 | 
				
			||||||
    add a, c
 | 
					    cp a, RNG_MODE_TGM1
 | 
				
			||||||
    add a, c
 | 
					    jp z, GetNextTGM1Piece
 | 
				
			||||||
    ld c, a
 | 
					    cp a, RNG_MODE_TGM2
 | 
				
			||||||
    add hl, bc
 | 
					    jp z, GetNextTGM2Piece
 | 
				
			||||||
    jp hl
 | 
					    cp a, RNG_MODE_TGM3
 | 
				
			||||||
 | 
					    jp z, GetNextTGM3Piece
 | 
				
			||||||
.nextpiecejumps
 | 
					    cp a, RNG_MODE_NES
 | 
				
			||||||
    jp GetNextTGM1Piece
 | 
					    jp z, GetNextNesPiece
 | 
				
			||||||
    jp GetNextTGM2Piece
 | 
					 | 
				
			||||||
    jp GetNextTGM3Piece
 | 
					 | 
				
			||||||
    jp GetNextHellPiece
 | 
					 | 
				
			||||||
    jp GetNextNesPiece
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Tries generating bytes until it gets one in [0; 35)
 | 
					 | 
				
			||||||
Next35Piece:
 | 
					Next35Piece:
 | 
				
			||||||
:   call NextByte
 | 
					:   call NextByte
 | 
				
			||||||
    and a, $3F
 | 
					    and a, $3F
 | 
				
			||||||
| 
						 | 
					@ -383,7 +377,6 @@ Next35Piece:
 | 
				
			||||||
    ret
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Tries generating bytes until it gets one in [0; 7)
 | 
					 | 
				
			||||||
Next7Piece:
 | 
					Next7Piece:
 | 
				
			||||||
:   call NextByte
 | 
					:   call NextByte
 | 
				
			||||||
    and a, $07
 | 
					    and a, $07
 | 
				
			||||||
| 
						 | 
					@ -392,7 +385,6 @@ Next7Piece:
 | 
				
			||||||
    ret
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Cyrcles the RNG returning a random byte in a.
 | 
					 | 
				
			||||||
NextByte:
 | 
					NextByte:
 | 
				
			||||||
    ; Load seed
 | 
					    ; Load seed
 | 
				
			||||||
    ld hl, hRNGSeed+3
 | 
					    ld hl, hRNGSeed+3
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -30,7 +30,6 @@ hScoreIncrementHead:: ds 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SECTION "Score Functions", ROM0
 | 
					SECTION "Score Functions", ROM0
 | 
				
			||||||
    ; Wipes the score.
 | 
					 | 
				
			||||||
ScoreInit::
 | 
					ScoreInit::
 | 
				
			||||||
    xor a, a
 | 
					    xor a, a
 | 
				
			||||||
    ldh [hScore], a
 | 
					    ldh [hScore], a
 | 
				
			||||||
| 
						 | 
					@ -50,7 +49,6 @@ ScoreInit::
 | 
				
			||||||
    ldh [hScoreIncrementBCD+5], a
 | 
					    ldh [hScoreIncrementBCD+5], a
 | 
				
			||||||
    ret
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
    ; Increases the current score by the amount in wScoreIncrement.
 | 
					    ; Increases the current score by the amount in wScoreIncrement.
 | 
				
			||||||
IncreaseScore::
 | 
					IncreaseScore::
 | 
				
			||||||
    ; Wipe the old BCD score.
 | 
					    ; Wipe the old BCD score.
 | 
				
			||||||
| 
						 | 
					@ -188,7 +186,8 @@ IncreaseScore::
 | 
				
			||||||
    xor a, a
 | 
					    xor a, a
 | 
				
			||||||
    ldh [hScore], a
 | 
					    ldh [hScore], a
 | 
				
			||||||
    ld a, SFX_RANKUP
 | 
					    ld a, SFX_RANKUP
 | 
				
			||||||
    jp SFXEnqueue
 | 
					    call SFXEnqueue
 | 
				
			||||||
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ENDC
 | 
					ENDC
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										108
									
								
								src/sfx.asm
								
								
								
								
							
							
						
						
									
										108
									
								
								src/sfx.asm
								
								
								
								
							| 
						 | 
					@ -70,9 +70,8 @@ hNoisePlayhead:: ds 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SECTION "SFX Functions", ROM0
 | 
					SECTION "SFX Functions", ROM0
 | 
				
			||||||
    ; Audio on, volume on, and enable all channels.
 | 
					 | 
				
			||||||
    ; Zeroes out all playheads and the queue.
 | 
					 | 
				
			||||||
SFXInit::
 | 
					SFXInit::
 | 
				
			||||||
 | 
					    ; Audio on, volume on, and enable all channels.
 | 
				
			||||||
    ld a, $80
 | 
					    ld a, $80
 | 
				
			||||||
    ldh [rNR52], a
 | 
					    ldh [rNR52], a
 | 
				
			||||||
    ld a, $FF
 | 
					    ld a, $FF
 | 
				
			||||||
| 
						 | 
					@ -93,8 +92,8 @@ SFXInit::
 | 
				
			||||||
    ret
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Pop the head of the queue into A, the tail of the queue will be set to $FF.
 | 
					 | 
				
			||||||
SFXPopQueue:
 | 
					SFXPopQueue:
 | 
				
			||||||
 | 
					    ; Pop the head of the queue into A, the tail of the queue will be set to $FF.
 | 
				
			||||||
    ldh a, [hPlayQueue]
 | 
					    ldh a, [hPlayQueue]
 | 
				
			||||||
    ld b, a
 | 
					    ld b, a
 | 
				
			||||||
    ldh a, [hPlayQueue+1]
 | 
					    ldh a, [hPlayQueue+1]
 | 
				
			||||||
| 
						 | 
					@ -109,8 +108,8 @@ SFXPopQueue:
 | 
				
			||||||
    ret
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Push A onto the tail of the queue, the head of the queue will be pushed off.
 | 
					 | 
				
			||||||
SFXPushQueue:
 | 
					SFXPushQueue:
 | 
				
			||||||
 | 
					    ; Push A onto the tail of the queue, the head of the queue will be pushed off.
 | 
				
			||||||
    ld b, a
 | 
					    ld b, a
 | 
				
			||||||
    ldh a, [hPlayQueue+1]
 | 
					    ldh a, [hPlayQueue+1]
 | 
				
			||||||
    ldh [hPlayQueue], a
 | 
					    ldh [hPlayQueue], a
 | 
				
			||||||
| 
						 | 
					@ -123,18 +122,18 @@ SFXPushQueue:
 | 
				
			||||||
    ret
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Process the queue, if there's more to play, it will do so.
 | 
					 | 
				
			||||||
SFXProcessQueue:
 | 
					SFXProcessQueue:
 | 
				
			||||||
    ; Clear the playhead.
 | 
					    ; Clear the playhead.
 | 
				
			||||||
    xor a, a
 | 
					    xor a, a
 | 
				
			||||||
    ldh [hPlayhead], a
 | 
					    ldh [hPlayhead], a
 | 
				
			||||||
    ldh [hPlayhead+1], a
 | 
					    ldh [hPlayhead+1], a
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Music will just repeat.
 | 
					 | 
				
			||||||
    ldh a, [hPlayQueue]
 | 
					    ldh a, [hPlayQueue]
 | 
				
			||||||
    cp a, MUSIC_MENU
 | 
					    cp a, MUSIC_MENU
 | 
				
			||||||
    jr nz, :+
 | 
					    jr nz, :+
 | 
				
			||||||
    jr SFXEnqueue
 | 
					    call SFXEnqueue
 | 
				
			||||||
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Try 4 times to pop a sound effect off the queue.
 | 
					    ; Try 4 times to pop a sound effect off the queue.
 | 
				
			||||||
:   call SFXPopQueue
 | 
					:   call SFXPopQueue
 | 
				
			||||||
| 
						 | 
					@ -151,10 +150,10 @@ SFXProcessQueue:
 | 
				
			||||||
    ret z
 | 
					    ret z
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; If we got a valid sound effect, then play it.
 | 
					    ; If we got a valid sound effect, then play it.
 | 
				
			||||||
    jr SFXEnqueue
 | 
					    call SFXEnqueue
 | 
				
			||||||
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Noise effects use their own playhead that can play at the same time as the normal queue.
 | 
					 | 
				
			||||||
SFXTriggerNoise::
 | 
					SFXTriggerNoise::
 | 
				
			||||||
    cp a, SFX_LINE_CLEAR
 | 
					    cp a, SFX_LINE_CLEAR
 | 
				
			||||||
    jr nz, :+
 | 
					    jr nz, :+
 | 
				
			||||||
| 
						 | 
					@ -192,7 +191,8 @@ SFXEnqueue::
 | 
				
			||||||
    or a, l
 | 
					    or a, l
 | 
				
			||||||
    jr z, :+
 | 
					    jr z, :+
 | 
				
			||||||
    ld a, b
 | 
					    ld a, b
 | 
				
			||||||
    jr SFXPushQueue
 | 
					    call SFXPushQueue
 | 
				
			||||||
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Menu music
 | 
					    ; Menu music
 | 
				
			||||||
:   ld a, b
 | 
					:   ld a, b
 | 
				
			||||||
| 
						 | 
					@ -203,7 +203,9 @@ SFXEnqueue::
 | 
				
			||||||
    ldh [hPlayhead], a
 | 
					    ldh [hPlayhead], a
 | 
				
			||||||
    ld a, HIGH(sMusicMenu)
 | 
					    ld a, HIGH(sMusicMenu)
 | 
				
			||||||
    ldh [hPlayhead+1], a
 | 
					    ldh [hPlayhead+1], a
 | 
				
			||||||
    jp SFXPlay
 | 
					    call SFXPlay
 | 
				
			||||||
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Piece jingles.
 | 
					    ; Piece jingles.
 | 
				
			||||||
:   ld a, b
 | 
					:   ld a, b
 | 
				
			||||||
| 
						 | 
					@ -213,7 +215,8 @@ SFXEnqueue::
 | 
				
			||||||
    ldh [hPlayhead], a
 | 
					    ldh [hPlayhead], a
 | 
				
			||||||
    ld a, HIGH(sSFXPieceI)
 | 
					    ld a, HIGH(sSFXPieceI)
 | 
				
			||||||
    ldh [hPlayhead+1], a
 | 
					    ldh [hPlayhead+1], a
 | 
				
			||||||
    jp SFXPlay
 | 
					    call SFXPlay
 | 
				
			||||||
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
:   ld a, b
 | 
					:   ld a, b
 | 
				
			||||||
    cp a, PIECE_I | SFX_IRS
 | 
					    cp a, PIECE_I | SFX_IRS
 | 
				
			||||||
| 
						 | 
					@ -222,7 +225,8 @@ SFXEnqueue::
 | 
				
			||||||
    ldh [hPlayhead], a
 | 
					    ldh [hPlayhead], a
 | 
				
			||||||
    ld a, HIGH(sSFXPieceIRSI)
 | 
					    ld a, HIGH(sSFXPieceIRSI)
 | 
				
			||||||
    ldh [hPlayhead+1], a
 | 
					    ldh [hPlayhead+1], a
 | 
				
			||||||
    jp SFXPlay
 | 
					    call SFXPlay
 | 
				
			||||||
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
:   ld a, b
 | 
					:   ld a, b
 | 
				
			||||||
    cp a, PIECE_S
 | 
					    cp a, PIECE_S
 | 
				
			||||||
| 
						 | 
					@ -231,7 +235,8 @@ SFXEnqueue::
 | 
				
			||||||
    ldh [hPlayhead], a
 | 
					    ldh [hPlayhead], a
 | 
				
			||||||
    ld a, HIGH(sSFXPieceS)
 | 
					    ld a, HIGH(sSFXPieceS)
 | 
				
			||||||
    ldh [hPlayhead+1], a
 | 
					    ldh [hPlayhead+1], a
 | 
				
			||||||
    jp SFXPlay
 | 
					    call SFXPlay
 | 
				
			||||||
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
:   ld a, b
 | 
					:   ld a, b
 | 
				
			||||||
    cp a, PIECE_S | SFX_IRS
 | 
					    cp a, PIECE_S | SFX_IRS
 | 
				
			||||||
| 
						 | 
					@ -240,7 +245,8 @@ SFXEnqueue::
 | 
				
			||||||
    ldh [hPlayhead], a
 | 
					    ldh [hPlayhead], a
 | 
				
			||||||
    ld a, HIGH(sSFXPieceIRSS)
 | 
					    ld a, HIGH(sSFXPieceIRSS)
 | 
				
			||||||
    ldh [hPlayhead+1], a
 | 
					    ldh [hPlayhead+1], a
 | 
				
			||||||
    jp SFXPlay
 | 
					    call SFXPlay
 | 
				
			||||||
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
:   ld a, b
 | 
					:   ld a, b
 | 
				
			||||||
    cp a, PIECE_Z
 | 
					    cp a, PIECE_Z
 | 
				
			||||||
| 
						 | 
					@ -249,7 +255,8 @@ SFXEnqueue::
 | 
				
			||||||
    ldh [hPlayhead], a
 | 
					    ldh [hPlayhead], a
 | 
				
			||||||
    ld a, HIGH(sSFXPieceZ)
 | 
					    ld a, HIGH(sSFXPieceZ)
 | 
				
			||||||
    ldh [hPlayhead+1], a
 | 
					    ldh [hPlayhead+1], a
 | 
				
			||||||
    jp SFXPlay
 | 
					    call SFXPlay
 | 
				
			||||||
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
:   ld a, b
 | 
					:   ld a, b
 | 
				
			||||||
    cp a, PIECE_Z | SFX_IRS
 | 
					    cp a, PIECE_Z | SFX_IRS
 | 
				
			||||||
| 
						 | 
					@ -258,7 +265,8 @@ SFXEnqueue::
 | 
				
			||||||
    ldh [hPlayhead], a
 | 
					    ldh [hPlayhead], a
 | 
				
			||||||
    ld a, HIGH(sSFXPieceIRSZ)
 | 
					    ld a, HIGH(sSFXPieceIRSZ)
 | 
				
			||||||
    ldh [hPlayhead+1], a
 | 
					    ldh [hPlayhead+1], a
 | 
				
			||||||
    jp SFXPlay
 | 
					    call SFXPlay
 | 
				
			||||||
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
:   ld a, b
 | 
					:   ld a, b
 | 
				
			||||||
    cp a, PIECE_J
 | 
					    cp a, PIECE_J
 | 
				
			||||||
| 
						 | 
					@ -267,7 +275,8 @@ SFXEnqueue::
 | 
				
			||||||
    ldh [hPlayhead], a
 | 
					    ldh [hPlayhead], a
 | 
				
			||||||
    ld a, HIGH(sSFXPieceJ)
 | 
					    ld a, HIGH(sSFXPieceJ)
 | 
				
			||||||
    ldh [hPlayhead+1], a
 | 
					    ldh [hPlayhead+1], a
 | 
				
			||||||
    jp SFXPlay
 | 
					    call SFXPlay
 | 
				
			||||||
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
:   ld a, b
 | 
					:   ld a, b
 | 
				
			||||||
    cp a, PIECE_J | SFX_IRS
 | 
					    cp a, PIECE_J | SFX_IRS
 | 
				
			||||||
| 
						 | 
					@ -276,7 +285,8 @@ SFXEnqueue::
 | 
				
			||||||
    ldh [hPlayhead], a
 | 
					    ldh [hPlayhead], a
 | 
				
			||||||
    ld a, HIGH(sSFXPieceIRSJ)
 | 
					    ld a, HIGH(sSFXPieceIRSJ)
 | 
				
			||||||
    ldh [hPlayhead+1], a
 | 
					    ldh [hPlayhead+1], a
 | 
				
			||||||
    jp SFXPlay
 | 
					    call SFXPlay
 | 
				
			||||||
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
:   ld a, b
 | 
					:   ld a, b
 | 
				
			||||||
    cp a, PIECE_L
 | 
					    cp a, PIECE_L
 | 
				
			||||||
| 
						 | 
					@ -285,7 +295,8 @@ SFXEnqueue::
 | 
				
			||||||
    ldh [hPlayhead], a
 | 
					    ldh [hPlayhead], a
 | 
				
			||||||
    ld a, HIGH(sSFXPieceL)
 | 
					    ld a, HIGH(sSFXPieceL)
 | 
				
			||||||
    ldh [hPlayhead+1], a
 | 
					    ldh [hPlayhead+1], a
 | 
				
			||||||
    jp SFXPlay
 | 
					    call SFXPlay
 | 
				
			||||||
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
:   ld a, b
 | 
					:   ld a, b
 | 
				
			||||||
    cp a, PIECE_L | SFX_IRS
 | 
					    cp a, PIECE_L | SFX_IRS
 | 
				
			||||||
| 
						 | 
					@ -294,7 +305,8 @@ SFXEnqueue::
 | 
				
			||||||
    ldh [hPlayhead], a
 | 
					    ldh [hPlayhead], a
 | 
				
			||||||
    ld a, HIGH(sSFXPieceIRSL)
 | 
					    ld a, HIGH(sSFXPieceIRSL)
 | 
				
			||||||
    ldh [hPlayhead+1], a
 | 
					    ldh [hPlayhead+1], a
 | 
				
			||||||
    jp SFXPlay
 | 
					    call SFXPlay
 | 
				
			||||||
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
:   ld a, b
 | 
					:   ld a, b
 | 
				
			||||||
    cp a, PIECE_O
 | 
					    cp a, PIECE_O
 | 
				
			||||||
| 
						 | 
					@ -303,7 +315,8 @@ SFXEnqueue::
 | 
				
			||||||
    ldh [hPlayhead], a
 | 
					    ldh [hPlayhead], a
 | 
				
			||||||
    ld a, HIGH(sSFXPieceO)
 | 
					    ld a, HIGH(sSFXPieceO)
 | 
				
			||||||
    ldh [hPlayhead+1], a
 | 
					    ldh [hPlayhead+1], a
 | 
				
			||||||
    jp SFXPlay
 | 
					    call SFXPlay
 | 
				
			||||||
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
:   ld a, b
 | 
					:   ld a, b
 | 
				
			||||||
    cp a, PIECE_O | SFX_IRS
 | 
					    cp a, PIECE_O | SFX_IRS
 | 
				
			||||||
| 
						 | 
					@ -312,7 +325,8 @@ SFXEnqueue::
 | 
				
			||||||
    ldh [hPlayhead], a
 | 
					    ldh [hPlayhead], a
 | 
				
			||||||
    ld a, HIGH(sSFXPieceIRSO)
 | 
					    ld a, HIGH(sSFXPieceIRSO)
 | 
				
			||||||
    ldh [hPlayhead+1], a
 | 
					    ldh [hPlayhead+1], a
 | 
				
			||||||
    jp SFXPlay
 | 
					    call SFXPlay
 | 
				
			||||||
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
:   ld a, b
 | 
					:   ld a, b
 | 
				
			||||||
    cp a, PIECE_T
 | 
					    cp a, PIECE_T
 | 
				
			||||||
| 
						 | 
					@ -321,7 +335,8 @@ SFXEnqueue::
 | 
				
			||||||
    ldh [hPlayhead], a
 | 
					    ldh [hPlayhead], a
 | 
				
			||||||
    ld a, HIGH(sSFXPieceT)
 | 
					    ld a, HIGH(sSFXPieceT)
 | 
				
			||||||
    ldh [hPlayhead+1], a
 | 
					    ldh [hPlayhead+1], a
 | 
				
			||||||
    jp SFXPlay
 | 
					    call SFXPlay
 | 
				
			||||||
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
:   ld a, b
 | 
					:   ld a, b
 | 
				
			||||||
    cp a, PIECE_T | SFX_IRS
 | 
					    cp a, PIECE_T | SFX_IRS
 | 
				
			||||||
| 
						 | 
					@ -330,7 +345,9 @@ SFXEnqueue::
 | 
				
			||||||
    ldh [hPlayhead], a
 | 
					    ldh [hPlayhead], a
 | 
				
			||||||
    ld a, HIGH(sSFXPieceIRST)
 | 
					    ld a, HIGH(sSFXPieceIRST)
 | 
				
			||||||
    ldh [hPlayhead+1], a
 | 
					    ldh [hPlayhead+1], a
 | 
				
			||||||
    jp SFXPlay
 | 
					    call SFXPlay
 | 
				
			||||||
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; IRS
 | 
					    ; IRS
 | 
				
			||||||
:   cp a, SFX_IHS
 | 
					:   cp a, SFX_IHS
 | 
				
			||||||
| 
						 | 
					@ -339,7 +356,8 @@ SFXEnqueue::
 | 
				
			||||||
    ldh [hPlayhead], a
 | 
					    ldh [hPlayhead], a
 | 
				
			||||||
    ld a, HIGH(sSFXIHS)
 | 
					    ld a, HIGH(sSFXIHS)
 | 
				
			||||||
    ldh [hPlayhead+1], a
 | 
					    ldh [hPlayhead+1], a
 | 
				
			||||||
    jp SFXPlay
 | 
					    call SFXPlay
 | 
				
			||||||
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
:   cp a, SFX_IHS | SFX_IRS
 | 
					:   cp a, SFX_IHS | SFX_IRS
 | 
				
			||||||
    jr nz, :+
 | 
					    jr nz, :+
 | 
				
			||||||
| 
						 | 
					@ -347,7 +365,9 @@ SFXEnqueue::
 | 
				
			||||||
    ldh [hPlayhead], a
 | 
					    ldh [hPlayhead], a
 | 
				
			||||||
    ld a, HIGH(sSFXIHSIRS)
 | 
					    ld a, HIGH(sSFXIHSIRS)
 | 
				
			||||||
    ldh [hPlayhead+1], a
 | 
					    ldh [hPlayhead+1], a
 | 
				
			||||||
    jp SFXPlay
 | 
					    call SFXPlay
 | 
				
			||||||
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Leveling
 | 
					    ; Leveling
 | 
				
			||||||
:   cp a, SFX_LEVELLOCK
 | 
					:   cp a, SFX_LEVELLOCK
 | 
				
			||||||
| 
						 | 
					@ -356,7 +376,8 @@ SFXEnqueue::
 | 
				
			||||||
    ldh [hPlayhead], a
 | 
					    ldh [hPlayhead], a
 | 
				
			||||||
    ld a, HIGH(sSFXLevelLock)
 | 
					    ld a, HIGH(sSFXLevelLock)
 | 
				
			||||||
    ldh [hPlayhead+1], a
 | 
					    ldh [hPlayhead+1], a
 | 
				
			||||||
    jr SFXPlay
 | 
					    call SFXPlay
 | 
				
			||||||
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
:   cp a, SFX_LEVELUP
 | 
					:   cp a, SFX_LEVELUP
 | 
				
			||||||
    jr nz, :+
 | 
					    jr nz, :+
 | 
				
			||||||
| 
						 | 
					@ -364,7 +385,9 @@ SFXEnqueue::
 | 
				
			||||||
    ldh [hPlayhead], a
 | 
					    ldh [hPlayhead], a
 | 
				
			||||||
    ld a, HIGH(sSFXLevelUp)
 | 
					    ld a, HIGH(sSFXLevelUp)
 | 
				
			||||||
    ldh [hPlayhead+1], a
 | 
					    ldh [hPlayhead+1], a
 | 
				
			||||||
    jr SFXPlay
 | 
					    call SFXPlay
 | 
				
			||||||
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Other
 | 
					    ; Other
 | 
				
			||||||
:   cp a, SFX_RANKUP
 | 
					:   cp a, SFX_RANKUP
 | 
				
			||||||
| 
						 | 
					@ -373,7 +396,8 @@ SFXEnqueue::
 | 
				
			||||||
    ldh [hPlayhead], a
 | 
					    ldh [hPlayhead], a
 | 
				
			||||||
    ld a, HIGH(sSFXRankUp)
 | 
					    ld a, HIGH(sSFXRankUp)
 | 
				
			||||||
    ldh [hPlayhead+1], a
 | 
					    ldh [hPlayhead+1], a
 | 
				
			||||||
    jr SFXPlay
 | 
					    call SFXPlay
 | 
				
			||||||
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
:   cp a, SFX_READYGO
 | 
					:   cp a, SFX_READYGO
 | 
				
			||||||
    ret nz
 | 
					    ret nz
 | 
				
			||||||
| 
						 | 
					@ -381,9 +405,10 @@ SFXEnqueue::
 | 
				
			||||||
    ldh [hPlayhead], a
 | 
					    ldh [hPlayhead], a
 | 
				
			||||||
    ld a, HIGH(sSFXReadyGo)
 | 
					    ld a, HIGH(sSFXReadyGo)
 | 
				
			||||||
    ldh [hPlayhead+1], a
 | 
					    ldh [hPlayhead+1], a
 | 
				
			||||||
    jr SFXPlay
 | 
					    call SFXPlay
 | 
				
			||||||
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Kill the non-noise sound and clear the queue.
 | 
					 | 
				
			||||||
SFXKill::
 | 
					SFXKill::
 | 
				
			||||||
    ; Kill all sound without pops.
 | 
					    ; Kill all sound without pops.
 | 
				
			||||||
    ld a, %00111111
 | 
					    ld a, %00111111
 | 
				
			||||||
| 
						 | 
					@ -391,10 +416,12 @@ SFXKill::
 | 
				
			||||||
    ldh [rNR21], a
 | 
					    ldh [rNR21], a
 | 
				
			||||||
    ld a, $FF
 | 
					    ld a, $FF
 | 
				
			||||||
    ldh [rNR31], a
 | 
					    ldh [rNR31], a
 | 
				
			||||||
 | 
					    ;ldh [rNR41], a
 | 
				
			||||||
    ld a, %01000000
 | 
					    ld a, %01000000
 | 
				
			||||||
    ldh [rNR14], a
 | 
					    ldh [rNR14], a
 | 
				
			||||||
    ldh [rNR24], a
 | 
					    ldh [rNR24], a
 | 
				
			||||||
    ldh [rNR34], a
 | 
					    ldh [rNR34], a
 | 
				
			||||||
 | 
					    ;ldh [rNR44], a
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Clear the queue.
 | 
					    ; Clear the queue.
 | 
				
			||||||
    ld a, $FF
 | 
					    ld a, $FF
 | 
				
			||||||
| 
						 | 
					@ -408,8 +435,6 @@ SFXKill::
 | 
				
			||||||
    ret
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Play routine for the noise channel.
 | 
					 | 
				
			||||||
    ; Must be called every frame.
 | 
					 | 
				
			||||||
SFXPlayNoise::
 | 
					SFXPlayNoise::
 | 
				
			||||||
    ; Get the noise playhead.
 | 
					    ; Get the noise playhead.
 | 
				
			||||||
    ldh a, [hNoisePlayhead]
 | 
					    ldh a, [hNoisePlayhead]
 | 
				
			||||||
| 
						 | 
					@ -459,11 +484,11 @@ SFXPlayNoise::
 | 
				
			||||||
    ldh [hNoisePlayhead], a
 | 
					    ldh [hNoisePlayhead], a
 | 
				
			||||||
    ld a, h
 | 
					    ld a, h
 | 
				
			||||||
    ldh [hNoisePlayhead+1], a
 | 
					    ldh [hNoisePlayhead+1], a
 | 
				
			||||||
    jp RSTRestoreBank
 | 
					    rst RSTRestoreBank
 | 
				
			||||||
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Play routine for the regular sfx channels.
 | 
					    ; This play routine must be called every frame.
 | 
				
			||||||
    ; Must be called every frame.
 | 
					 | 
				
			||||||
SFXPlay::
 | 
					SFXPlay::
 | 
				
			||||||
    ; Bank to correct bank.
 | 
					    ; Bank to correct bank.
 | 
				
			||||||
    ldh a, [hPlayQueue]
 | 
					    ldh a, [hPlayQueue]
 | 
				
			||||||
| 
						 | 
					@ -485,7 +510,8 @@ SFXPlay::
 | 
				
			||||||
    ; Nothing to do if it's a null ptr.
 | 
					    ; Nothing to do if it's a null ptr.
 | 
				
			||||||
    or a, l
 | 
					    or a, l
 | 
				
			||||||
    jr nz, .getRegister
 | 
					    jr nz, .getRegister
 | 
				
			||||||
    jp RSTRestoreBank
 | 
					    rst RSTRestoreBank
 | 
				
			||||||
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Otherwise, get the register to write to.
 | 
					    ; Otherwise, get the register to write to.
 | 
				
			||||||
.getRegister
 | 
					.getRegister
 | 
				
			||||||
| 
						 | 
					@ -496,7 +522,8 @@ SFXPlay::
 | 
				
			||||||
    cp a, $FE
 | 
					    cp a, $FE
 | 
				
			||||||
    jr nz, :+
 | 
					    jr nz, :+
 | 
				
			||||||
    rst RSTRestoreBank
 | 
					    rst RSTRestoreBank
 | 
				
			||||||
    jp SFXProcessQueue
 | 
					    call SFXProcessQueue
 | 
				
			||||||
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; If it's $FF, then we're done for this frame.
 | 
					    ; If it's $FF, then we're done for this frame.
 | 
				
			||||||
:   cp a, $FF
 | 
					:   cp a, $FF
 | 
				
			||||||
| 
						 | 
					@ -519,7 +546,8 @@ SFXPlay::
 | 
				
			||||||
    ldh [hPlayhead], a
 | 
					    ldh [hPlayhead], a
 | 
				
			||||||
    ld a, h
 | 
					    ld a, h
 | 
				
			||||||
    ldh [hPlayhead+1], a
 | 
					    ldh [hPlayhead+1], a
 | 
				
			||||||
    jp RSTRestoreBank
 | 
					    rst RSTRestoreBank
 | 
				
			||||||
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ENDC
 | 
					ENDC
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -90,15 +90,14 @@ OAMDMAEnd::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SECTION "OAM Functions", ROM0
 | 
					SECTION "OAM Functions", ROM0
 | 
				
			||||||
    ; Copies the OAM handler to HRAM.
 | 
					 | 
				
			||||||
CopyOAMHandler::
 | 
					CopyOAMHandler::
 | 
				
			||||||
    ld de, OAMDMA
 | 
					    ld de, OAMDMA
 | 
				
			||||||
    ld hl, hOAMDMA
 | 
					    ld hl, hOAMDMA
 | 
				
			||||||
    ld bc, OAMDMAEnd - OAMDMA
 | 
					    ld bc, OAMDMAEnd - OAMDMA
 | 
				
			||||||
    jp UnsafeMemCopy
 | 
					    call UnsafeMemCopy
 | 
				
			||||||
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Clears OAM and shadow OAM.
 | 
					 | 
				
			||||||
ClearOAM::
 | 
					ClearOAM::
 | 
				
			||||||
    ld hl, _OAMRAM
 | 
					    ld hl, _OAMRAM
 | 
				
			||||||
    ld bc, $9F
 | 
					    ld bc, $9F
 | 
				
			||||||
| 
						 | 
					@ -107,12 +106,12 @@ ClearOAM::
 | 
				
			||||||
    ld hl, wShadowOAM
 | 
					    ld hl, wShadowOAM
 | 
				
			||||||
    ld bc, $9F
 | 
					    ld bc, $9F
 | 
				
			||||||
    ld d, 0
 | 
					    ld d, 0
 | 
				
			||||||
    jp UnsafeMemSet
 | 
					    call SafeMemSet
 | 
				
			||||||
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SECTION "Domain Specific Functions", ROM0
 | 
					SECTION "Domain Specific Functions", ROM0
 | 
				
			||||||
    ; Puts the mode tells into sprites and displays them.
 | 
					 | 
				
			||||||
ApplyTells::
 | 
					ApplyTells::
 | 
				
			||||||
    ld a, TELLS_BASE_Y
 | 
					    ld a, TELLS_BASE_Y
 | 
				
			||||||
    ld [wSPRModeRNG], a
 | 
					    ld [wSPRModeRNG], a
 | 
				
			||||||
| 
						 | 
					@ -156,7 +155,6 @@ ApplyTells::
 | 
				
			||||||
    ret
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Draws the next pieces as a sprite.
 | 
					 | 
				
			||||||
; Index of next piece in A.
 | 
					; Index of next piece in A.
 | 
				
			||||||
ApplyNext::
 | 
					ApplyNext::
 | 
				
			||||||
    ; Correct color
 | 
					    ; Correct color
 | 
				
			||||||
| 
						 | 
					@ -221,6 +219,7 @@ ApplyNext::
 | 
				
			||||||
    add a, NEXT_BASE_Y
 | 
					    add a, NEXT_BASE_Y
 | 
				
			||||||
    ld [wSPRNext4+0], a
 | 
					    ld [wSPRNext4+0], a
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Queue
 | 
					    ; Queue
 | 
				
			||||||
    ld a, QUEUE_BASE_Y
 | 
					    ld a, QUEUE_BASE_Y
 | 
				
			||||||
    ld [wSPRQueue1A], a
 | 
					    ld [wSPRQueue1A], a
 | 
				
			||||||
| 
						 | 
					@ -255,10 +254,17 @@ ApplyNext::
 | 
				
			||||||
    ld [wSPRQueue2B+2], a
 | 
					    ld [wSPRQueue2B+2], a
 | 
				
			||||||
    ret
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					; Index of hold piece in A.
 | 
				
			||||||
    ; Draws the held piece.
 | 
					 | 
				
			||||||
    ; Index of held piece in A.
 | 
					 | 
				
			||||||
ApplyHold::
 | 
					ApplyHold::
 | 
				
			||||||
 | 
					    cp 255
 | 
				
			||||||
 | 
					    jr nz, .doApplyHold
 | 
				
			||||||
 | 
					    ld hl, wSPRHold1
 | 
				
			||||||
 | 
					    ld bc, 16
 | 
				
			||||||
 | 
					    ld d, 0
 | 
				
			||||||
 | 
					    call UnsafeMemSet
 | 
				
			||||||
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.doApplyHold
 | 
				
			||||||
    ; Correct color
 | 
					    ; Correct color
 | 
				
			||||||
    ld [wSPRHold1+3], a
 | 
					    ld [wSPRHold1+3], a
 | 
				
			||||||
    ld [wSPRHold2+3], a
 | 
					    ld [wSPRHold2+3], a
 | 
				
			||||||
| 
						 | 
					@ -276,6 +282,7 @@ ApplyHold::
 | 
				
			||||||
    ld a, b
 | 
					    ld a, b
 | 
				
			||||||
    jr z, .show
 | 
					    jr z, .show
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.hide
 | 
					.hide
 | 
				
			||||||
    ld b, a
 | 
					    ld b, a
 | 
				
			||||||
    ld a, TILE_BLANK
 | 
					    ld a, TILE_BLANK
 | 
				
			||||||
| 
						 | 
					@ -343,7 +350,6 @@ ApplyHold::
 | 
				
			||||||
    ret
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Generic function to draw a BCD number (6 digits) as 6 sprites.
 | 
					 | 
				
			||||||
; Address of first sprite in hl.
 | 
					; Address of first sprite in hl.
 | 
				
			||||||
; Address of first digit in de.
 | 
					; Address of first digit in de.
 | 
				
			||||||
ApplyNumbers::
 | 
					ApplyNumbers::
 | 
				
			||||||
| 
						 | 
					@ -384,10 +390,11 @@ ApplyNumbers::
 | 
				
			||||||
    ld a, [de]
 | 
					    ld a, [de]
 | 
				
			||||||
    add a, TILE_0
 | 
					    add a, TILE_0
 | 
				
			||||||
    ld [hl], a
 | 
					    ld [hl], a
 | 
				
			||||||
 | 
					    add hl, bc
 | 
				
			||||||
 | 
					    inc de
 | 
				
			||||||
    ret
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Positions all number sprites for gameplay.
 | 
					 | 
				
			||||||
SetNumberSpritePositions::
 | 
					SetNumberSpritePositions::
 | 
				
			||||||
    ld a, SCORE_BASE_X
 | 
					    ld a, SCORE_BASE_X
 | 
				
			||||||
    ld hl, wSPRScore1
 | 
					    ld hl, wSPRScore1
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -34,9 +34,8 @@ rSelectedStartLevel:: ds 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SECTION "SRAM Functions", ROM0
 | 
					SECTION "SRAM Functions", ROM0
 | 
				
			||||||
    ; Check if our SRAM is initialized and of the correct version.
 | 
					 | 
				
			||||||
    ; Restores it if so, otherwise initializes it.
 | 
					 | 
				
			||||||
RestoreSRAM::
 | 
					RestoreSRAM::
 | 
				
			||||||
 | 
					    ; Check if our SRAM is initialized and of the correct version.
 | 
				
			||||||
    ld a, [rCheck]
 | 
					    ld a, [rCheck]
 | 
				
			||||||
    cp a, LOW(__UTC_YEAR__)
 | 
					    cp a, LOW(__UTC_YEAR__)
 | 
				
			||||||
    jr nz, InitializeSRAM
 | 
					    jr nz, InitializeSRAM
 | 
				
			||||||
| 
						 | 
					@ -76,7 +75,6 @@ RestoreSRAM::
 | 
				
			||||||
    ldh [hStartSpeed+1], a
 | 
					    ldh [hStartSpeed+1], a
 | 
				
			||||||
    ret
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Initializes SRAM with default values.
 | 
					 | 
				
			||||||
InitializeSRAM:
 | 
					InitializeSRAM:
 | 
				
			||||||
    ; Set the magic id.
 | 
					    ; Set the magic id.
 | 
				
			||||||
    ld a, LOW(__UTC_YEAR__)
 | 
					    ld a, LOW(__UTC_YEAR__)
 | 
				
			||||||
| 
						 | 
					@ -127,5 +125,4 @@ InitializeSRAM:
 | 
				
			||||||
    ld [rSelectedStartLevel+1], a
 | 
					    ld [rSelectedStartLevel+1], a
 | 
				
			||||||
    ret
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
ENDC
 | 
					ENDC
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -48,7 +48,6 @@ hRequestedJingle: ds 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SECTION "Gameplay Functions", ROM0
 | 
					SECTION "Gameplay Functions", ROM0
 | 
				
			||||||
    ; Change to game play mode. The event loop will call the event loop and vblank handlers for this mode after this returns.
 | 
					 | 
				
			||||||
SwitchToGameplay::
 | 
					SwitchToGameplay::
 | 
				
			||||||
    ; Turn the screen off if it's on.
 | 
					    ; Turn the screen off if it's on.
 | 
				
			||||||
    ldh a, [rLCDC]
 | 
					    ldh a, [rLCDC]
 | 
				
			||||||
| 
						 | 
					@ -114,7 +113,6 @@ SwitchToGameplay::
 | 
				
			||||||
    ret
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Main gameplay event loop.
 | 
					 | 
				
			||||||
GamePlayEventLoopHandler::
 | 
					GamePlayEventLoopHandler::
 | 
				
			||||||
    ; What mode are we in?
 | 
					    ; What mode are we in?
 | 
				
			||||||
    ld hl, .modejumps
 | 
					    ld hl, .modejumps
 | 
				
			||||||
| 
						 | 
					@ -136,7 +134,6 @@ GamePlayEventLoopHandler::
 | 
				
			||||||
    jp preGameOverMode
 | 
					    jp preGameOverMode
 | 
				
			||||||
    jp pauseMode
 | 
					    jp pauseMode
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
    ; Draw "READY" and wait a bit.
 | 
					    ; Draw "READY" and wait a bit.
 | 
				
			||||||
leadyMode:
 | 
					leadyMode:
 | 
				
			||||||
    ldh a, [hModeCounter]
 | 
					    ldh a, [hModeCounter]
 | 
				
			||||||
| 
						 | 
					@ -362,7 +359,6 @@ delayMode:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
:   jp drawStaticInfo
 | 
					:   jp drawStaticInfo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
preGameOverMode:
 | 
					preGameOverMode:
 | 
				
			||||||
    ; Spawn the failed piece.
 | 
					    ; Spawn the failed piece.
 | 
				
			||||||
    call ForceSpawnPiece
 | 
					    call ForceSpawnPiece
 | 
				
			||||||
| 
						 | 
					@ -582,7 +578,6 @@ drawStaticInfo:
 | 
				
			||||||
    jp EventLoopPostHandler
 | 
					    jp EventLoopPostHandler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Do the hold action.
 | 
					 | 
				
			||||||
DoHold:
 | 
					DoHold:
 | 
				
			||||||
    ; Mark hold as spent.
 | 
					    ; Mark hold as spent.
 | 
				
			||||||
    ld a, $FF
 | 
					    ld a, $FF
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -27,7 +27,6 @@ wSelected:: ds 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SECTION "Title Functions", ROM0
 | 
					SECTION "Title Functions", ROM0
 | 
				
			||||||
    ; Change to title mode. The event loop will call the event loop and vblank handlers for this mode after this returns.
 | 
					 | 
				
			||||||
SwitchToTitle::
 | 
					SwitchToTitle::
 | 
				
			||||||
    ; Turn the screen off if it's on.
 | 
					    ; Turn the screen off if it's on.
 | 
				
			||||||
    ldh a, [rLCDC]
 | 
					    ldh a, [rLCDC]
 | 
				
			||||||
| 
						 | 
					@ -137,7 +136,6 @@ SwitchToTitle::
 | 
				
			||||||
    ret
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Handles title screen input.
 | 
					 | 
				
			||||||
TitleEventLoopHandler::
 | 
					TitleEventLoopHandler::
 | 
				
			||||||
    call GBCTitleProcess
 | 
					    call GBCTitleProcess
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -211,8 +209,6 @@ TitleEventLoopHandler::
 | 
				
			||||||
.done
 | 
					.done
 | 
				
			||||||
    jp EventLoopPostHandler
 | 
					    jp EventLoopPostHandler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
    ; Decrements the currently selected option.
 | 
					 | 
				
			||||||
DecrementOption:
 | 
					DecrementOption:
 | 
				
			||||||
.opt0
 | 
					.opt0
 | 
				
			||||||
    ld a, [wSelected]
 | 
					    ld a, [wSelected]
 | 
				
			||||||
| 
						 | 
					@ -311,8 +307,6 @@ DecrementOption:
 | 
				
			||||||
    jr DecrementLevel
 | 
					    jr DecrementLevel
 | 
				
			||||||
    jp EventLoopPostHandler
 | 
					    jp EventLoopPostHandler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
    ; Decrements start level.
 | 
					 | 
				
			||||||
DecrementLevel:
 | 
					DecrementLevel:
 | 
				
			||||||
    ; Decrement
 | 
					    ; Decrement
 | 
				
			||||||
    ldh a, [hStartSpeed]
 | 
					    ldh a, [hStartSpeed]
 | 
				
			||||||
| 
						 | 
					@ -330,7 +324,6 @@ DecrementLevel:
 | 
				
			||||||
    jp CheckLevelRange
 | 
					    jp CheckLevelRange
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Increments the selected option.
 | 
					 | 
				
			||||||
IncrementOption:
 | 
					IncrementOption:
 | 
				
			||||||
.opt0
 | 
					.opt0
 | 
				
			||||||
    ld a, [wSelected]
 | 
					    ld a, [wSelected]
 | 
				
			||||||
| 
						 | 
					@ -429,8 +422,6 @@ IncrementOption:
 | 
				
			||||||
    jr IncrementLevel
 | 
					    jr IncrementLevel
 | 
				
			||||||
    jp EventLoopPostHandler
 | 
					    jp EventLoopPostHandler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
    ; Increments start level.
 | 
					 | 
				
			||||||
IncrementLevel:
 | 
					IncrementLevel:
 | 
				
			||||||
    ; Increment
 | 
					    ; Increment
 | 
				
			||||||
    ldh a, [hStartSpeed]
 | 
					    ldh a, [hStartSpeed]
 | 
				
			||||||
| 
						 | 
					@ -447,11 +438,11 @@ IncrementLevel:
 | 
				
			||||||
    ld [rSelectedStartLevel+1], a
 | 
					    ld [rSelectedStartLevel+1], a
 | 
				
			||||||
    jp CheckLevelRange
 | 
					    jp CheckLevelRange
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
    ; Wipes the start level upon selecting a new speed curve.
 | 
					 | 
				
			||||||
InitSpeedCurve:
 | 
					InitSpeedCurve:
 | 
				
			||||||
    ld a, [wSpeedCurveState]
 | 
					    ld a, [wSpeedCurveState]
 | 
				
			||||||
    call GetStart
 | 
					    call GetStart
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.set
 | 
				
			||||||
    ld a, l
 | 
					    ld a, l
 | 
				
			||||||
    ldh [hStartSpeed], a
 | 
					    ldh [hStartSpeed], a
 | 
				
			||||||
    ld [rSelectedStartLevel], a
 | 
					    ld [rSelectedStartLevel], a
 | 
				
			||||||
| 
						 | 
					@ -461,7 +452,7 @@ InitSpeedCurve:
 | 
				
			||||||
    ret
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Gets the end of a speed curve.
 | 
					
 | 
				
			||||||
GetEnd:
 | 
					GetEnd:
 | 
				
			||||||
    ld a, [wSpeedCurveState]
 | 
					    ld a, [wSpeedCurveState]
 | 
				
			||||||
    cp a, SCURVE_DMGT
 | 
					    cp a, SCURVE_DMGT
 | 
				
			||||||
| 
						 | 
					@ -487,8 +478,6 @@ GetEnd:
 | 
				
			||||||
:   ld bc, sCHILSpeedCurveEnd
 | 
					:   ld bc, sCHILSpeedCurveEnd
 | 
				
			||||||
    ret
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
    ; Gets the beginning of a speed curve.
 | 
					 | 
				
			||||||
GetStart:
 | 
					GetStart:
 | 
				
			||||||
    ld a, [wSpeedCurveState]
 | 
					    ld a, [wSpeedCurveState]
 | 
				
			||||||
    cp a, SCURVE_DMGT
 | 
					    cp a, SCURVE_DMGT
 | 
				
			||||||
| 
						 | 
					@ -514,8 +503,6 @@ GetStart:
 | 
				
			||||||
:   ld hl, sCHILSpeedCurve
 | 
					:   ld hl, sCHILSpeedCurve
 | 
				
			||||||
    ret
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
    ; Make sure we don't overflow the level range.
 | 
					 | 
				
			||||||
CheckLevelRange:
 | 
					CheckLevelRange:
 | 
				
			||||||
    ; At end?
 | 
					    ; At end?
 | 
				
			||||||
    call GetEnd
 | 
					    call GetEnd
 | 
				
			||||||
| 
						 | 
					@ -560,7 +547,6 @@ CheckLevelRange:
 | 
				
			||||||
    jp EventLoopPostHandler
 | 
					    jp EventLoopPostHandler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ; Handles the display of the menu.
 | 
					 | 
				
			||||||
TitleVBlankHandler::
 | 
					TitleVBlankHandler::
 | 
				
			||||||
    call ToATTR
 | 
					    call ToATTR
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										41
									
								
								src/time.asm
								
								
								
								
							
							
						
						
									
										41
									
								
								src/time.asm
								
								
								
								
							| 
						 | 
					@ -27,63 +27,22 @@ hFrameCtr::  ds 1
 | 
				
			||||||
hEvenFrame:: ds 1
 | 
					hEvenFrame:: ds 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SECTION "Time Variables", WRAM0
 | 
					 | 
				
			||||||
wMinutes:: ds 1
 | 
					 | 
				
			||||||
wSeconds:: ds 1
 | 
					 | 
				
			||||||
wFrames:: ds 1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SECTION "Time Functions", ROM0
 | 
					SECTION "Time Functions", ROM0
 | 
				
			||||||
    ; Zeroes all timers and gets the free-running timer ticking.
 | 
					 | 
				
			||||||
TimeInit::
 | 
					TimeInit::
 | 
				
			||||||
    xor a, a
 | 
					    xor a, a
 | 
				
			||||||
    ldh [rTMA], a
 | 
					    ldh [rTMA], a
 | 
				
			||||||
    ldh [hEvenFrame], a
 | 
					    ldh [hEvenFrame], a
 | 
				
			||||||
    ldh [hFrameCtr], a
 | 
					    ldh [hFrameCtr], a
 | 
				
			||||||
    ld [wMinutes], a
 | 
					 | 
				
			||||||
    ld [wSeconds], a
 | 
					 | 
				
			||||||
    ld [wFrames], a
 | 
					 | 
				
			||||||
    ld a, TACF_262KHZ | TACF_START
 | 
					    ld a, TACF_262KHZ | TACF_START
 | 
				
			||||||
    ldh [rTAC], a
 | 
					    ldh [rTAC], a
 | 
				
			||||||
    ret
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
    ; Resets the minute-second timer.
 | 
					 | 
				
			||||||
ResetTime::
 | 
					 | 
				
			||||||
    xor a, a
 | 
					 | 
				
			||||||
    ld [wMinutes], a
 | 
					 | 
				
			||||||
    ld [wSeconds], a
 | 
					 | 
				
			||||||
    ld [wFrames], a
 | 
					 | 
				
			||||||
    ret
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    ; Increments the global timer. Also saves whether we're on an even frame.
 | 
					 | 
				
			||||||
HandleTimers::
 | 
					HandleTimers::
 | 
				
			||||||
    ldh a, [hFrameCtr]
 | 
					    ldh a, [hFrameCtr]
 | 
				
			||||||
    inc a
 | 
					    inc a
 | 
				
			||||||
    ldh [hFrameCtr], a
 | 
					    ldh [hFrameCtr], a
 | 
				
			||||||
    and 1
 | 
					    and 1
 | 
				
			||||||
    ldh [hEvenFrame], a
 | 
					    ldh [hEvenFrame], a
 | 
				
			||||||
 | 
					 | 
				
			||||||
    ld a, [wFrames]
 | 
					 | 
				
			||||||
    inc a
 | 
					 | 
				
			||||||
    ld [wFrames], a
 | 
					 | 
				
			||||||
    cp a, 60
 | 
					 | 
				
			||||||
    ret nz
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    xor a, a
 | 
					 | 
				
			||||||
    ld [wFrames], a
 | 
					 | 
				
			||||||
    ld a, [wSeconds]
 | 
					 | 
				
			||||||
    inc a
 | 
					 | 
				
			||||||
    ld [wSeconds], a
 | 
					 | 
				
			||||||
    cp a, 60
 | 
					 | 
				
			||||||
    ret nz
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    xor a, a
 | 
					 | 
				
			||||||
    ld [wSeconds], a
 | 
					 | 
				
			||||||
    ld a, [wMinutes]
 | 
					 | 
				
			||||||
    inc a
 | 
					 | 
				
			||||||
    ld [wMinutes], a
 | 
					 | 
				
			||||||
    ret
 | 
					    ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue