diff --git a/src/header.asm b/src/header.asm index 7f2d278..4e3b676 100644 --- a/src/header.asm +++ b/src/header.asm @@ -1,8 +1,4 @@ -; ***************************************************************************** -; * * -; * Cartridge Header. * -; * * -; ***************************************************************************** -SECTION "Header", ROM0[$100] - jp MainEntryPoint - ds $150 - @, 0 ; RGBFIX will fill in the header. +SECTION "Cartridge Header", ROM0[$100] + nop + jp Main + ds $150 - @, 0 diff --git a/src/include/rng.asm b/src/include/rng.asm index 89592c2..b59db9f 100644 --- a/src/include/rng.asm +++ b/src/include/rng.asm @@ -1,34 +1,138 @@ +IF !DEF(RNG_ASM) +DEF RNG_ASM EQU 1 + + +INCLUDE "globals.asm" + + +SECTION "RNG Variables", WRAM0 +wRNGSeed: ds 4 +wPieceHistory: ds 4 +wNextPiece:: ds 1 + + section "RNG Functions", ROM0 -NextByte:: +StartNewGame:: + ; Do some bit fuckery on the seed using the gameboy's free-running timers. + ld hl, wRNGSeed + ldh a, [rDIV] + xor a, [hl] + ld [hl+], a + + ldh a, [rTIMA] + xor a, [hl] + ld [hl+], a + + ldh a, [rDIV] + xor a, [hl] + ld [hl+], a + + ldh a, [rTIMA] + xor a, [hl] + ld [hl], a + + ; Initialize the next history. + ld hl, wPieceHistory + ld a, PIECE_Z + ld [hl+], a + ld [hl+], a + ld a, PIECE_S + ld [hl+], a + ld [hl], a + + ; Get the first piece and make sure it's not Z, S or O. +: call NextPiece + cp a, PIECE_Z + jr z, :- + cp a, PIECE_S + jr z, :- + cp a, PIECE_O + jr z, :- + + ; Store it. + ld hl, wPieceHistory + ld [hl], a + ld hl, wNextPiece + ld [hl], a + ret + + +GetNextPiece:: + ld e, 7 +: dec e + jr z, :+ + + call NextPiece + ld hl, wPieceHistory + cp a, [hl] + jr z, :- + inc hl + cp a, [hl] + jr z, :- + inc hl + cp a, [hl] + jr z, :- + inc hl + cp a, [hl] + jr z, :- + +: ld hl, wNextPiece + ld [hl], a + ld b, a + ld hl, wPieceHistory+2 + ld a, [hl+] + ld [hl], a + ld hl, wPieceHistory+1 + ld a, [hl+] + ld [hl], a + ld hl, wPieceHistory + ld a, [hl+] + ld [hl-], a + ld a, b + ld [hl], a + ret + + +NextPiece: + call NextByte + and a, $07 + cp a, 7 + ret nz + dec a + ret + +NextByte: ; Load seed ld hl,wRNGSeed+3 - ld a,[hl-] - ld b,a - ld a,[hl-] - ld c,a - ld a,[hl-] + ld a, [hl-] + ld b, a + ld a, [hl-] + ld c, a + ld a, [hl-] ; Multiply by 0x01010101 add [hl] - ld d,a + ld d, a adc c - ld c,a + ld c, a adc b - ld b,a + ld b, a ; Add 0x31415927 and write back - ld a,[hl] + ld a, [hl] add $27 - ld [hl+],a - ld a,d + ld [hl+], a + ld a, d adc $59 - ld [hl+],a - ld a,c + ld [hl+], a + ld a, c adc $41 - ld [hl+],a - ld c,a - ld a,b + ld [hl+], a + ld c, a + ld a, b adc $31 - ld [hl],a - ld b,a + ld [hl], a ret + + +ENDC diff --git a/src/main.asm b/src/main.asm index 5f26df5..b2afc58 100644 --- a/src/main.asm +++ b/src/main.asm @@ -1,18 +1,21 @@ INCLUDE "globals.asm" -INCLUDE "memcpy.asm" -INCLUDE "hardwarectl.asm" +INCLUDE "memory.asm" INCLUDE "interrupts.asm" INCLUDE "sprites.asm" +INCLUDE "rng.asm" INCLUDE "res/tiles.inc" INCLUDE "res/gameplay_map.inc" SECTION "Code Entry Point", ROM0 -MainEntryPoint:: +Main:: ; Turn off LCD during initialization. - call DisableLCD + wait_vram + xor a, a + ldh [rLCDC], a ; Save some power and turn off the audio. - call DisableAudio + xor a, a + ldh [rNR52], a ; We use a single set of tiles for the entire game, so we copy it at the start. ld de, Tiles @@ -27,7 +30,9 @@ MainEntryPoint:: call UnsafeMemCopy ; Make sure both sprites and bg use the same tile data. - call SetTileDataBanks + ldh a, [rLCDC] + or LCDCF_BLK01 + ldh [rLCDC], a ; The tilemap is just for testing for now. ld de, GameplayTilemap @@ -44,6 +49,11 @@ MainEntryPoint:: ld a, PALETTE_REGULAR set_all_palettes + ; Get the timer going. It's used for RNG. + xor a, a + ldh [rTMA], a + ld a, TACF_262KHZ | TACF_START + ; Zero out the ram where needed. call InitializeVariables @@ -51,12 +61,17 @@ MainEntryPoint:: call InitializeLCDCInterrupt ; And turn the LCD back on before we start. - call EnableLCD + ldh a, [rLCDC] + or LCDCF_ON | LCDCF_BGON | LCDCF_OBJON + ldh [rLCDC], a ; Make sure the first game loop starts just like all the future ones. wait_vblank wait_vblank_end + ; TEMP: Set up the game. + call StartNewGame + GameLoop:: call GetInput @@ -65,10 +80,18 @@ GameLoop:: ; Handle gameplay here ; TODO - ld a, 0 + ldh a, [hCtr] + inc a + and a, $1F + ldh [hCtr], a + + jr nz, :+ + call GetNextPiece + +: ld a, [wNextPiece] call ApplyNext - ld a, 4 + ld a, [wNextPiece] call ApplyHold ld hl, wSPRScore1 diff --git a/tools/Emulicious.ini b/tools/Emulicious.ini index 5ab5e3f..8c0ab8d 100644 --- a/tools/Emulicious.ini +++ b/tools/Emulicious.ini @@ -1,5 +1,5 @@ #Emulicious settings file -#Wed Oct 11 08:17:53 CEST 2023 +#Fri Oct 13 08:36:54 CEST 2023 SouthPanelHeight=635 GameBoyErrorBreakpointMessage6= GameBoyErrorBreakpointMessage5= @@ -46,7 +46,7 @@ GameBoyErrorBreakpointEnabled3=false Gamepad0Key5=-1 GameBoyErrorBreakpointEnabled2=false Gamepad0Key4=-1 -WindowVideoViewerOpen=true +WindowVideoViewerOpen=false GameBoyErrorBreakpointEnabled1=false Gamepad0Key3=-1 GameBoyErrorBreakpointEnabled0=false @@ -63,7 +63,7 @@ WindowEventViewerWindowY=489 WindowEventViewerWindowX=1472 WindowSpriteViewerHeight=527 WindowSpriteViewerWidth=370 -DebuggerWestPanelSelectedTab=1 +DebuggerWestPanelSelectedTab=0 WindowMemoryTracerWindowHeight=289 Gamepad0Key37=-1 Gamepad0Key36=-1 @@ -76,7 +76,7 @@ Gamepad0Key32=-1 Gamepad0Key31=-1 Gamepad0Key30=-1 DebuggerSouthPanelSelectedTab=0 -StackWidth=940 +StackWidth=1311 SMSGamepadAKeyboard=false GameBoyErrorBreakpointCondition19= GameBoyErrorBreakpointCondition18= @@ -148,33 +148,33 @@ Gamepad1Key21=-1 Gamepad1Key20=-1 StackSplitLocation=320 FontSize=13 -CombineVideoViewers=true -WindowEmuliciousHeight=781 CodeFontSize=13 +WindowEmuliciousHeight=781 +CombineVideoViewers=true WindowTilemapViewerY=544 -MemoryTracer=true -GBGamepadKeyboard=false -UninitializedMemoryBreakpointSuspend=true WindowTilemapViewerX=1013 +UninitializedMemoryBreakpointSuspend=true +GBGamepadKeyboard=false +MemoryTracer=true SMSGamepadBKeyboard=false DebuggerConsoleLogBreakpoints=true SMSGamepadBThreshold=50 Gamepad1Key19=-1 -Gamepad1Key18=-1 BankSwapAtPCBreakpointEnabled=false +Gamepad1Key18=-1 Gamepad1Key17=-1 -WindowPaletteViewerWidth=485 Gamepad1Key16=-1 -Gamepad1Key15=-1 -Recent0=C\:\\workspace\\dmgtris\\bin\\out.gb +WindowPaletteViewerWidth=485 GameBoyErrorBreakpointSuspend32=true +Recent0=C\:\\workspace\\dmgtris\\bin\\out.gb +Gamepad1Key15=-1 Gamepad1Key14=-1 Gamepad1Key13=-1 Gamepad1Key12=-1 -Gamepad1Key11=-1 GameBoyErrorBreakpointSuspend9=true -Gamepad1Key10=-1 +Gamepad1Key11=-1 GameBoyErrorBreakpointSuspend8=true +Gamepad1Key10=-1 GameBoyErrorBreakpointSuspend7=true GameBoyErrorBreakpointSuspend6=true GameBoyErrorBreakpointSuspend5=true @@ -184,73 +184,73 @@ GameBoyErrorBreakpointSuspend2=true GameBoyErrorBreakpointSuspend1=true GameBoyErrorBreakpointSuspend0=true Scale=5.0 -DebuggerMemorySelectedAddress=0 +DebuggerMemorySelectedAddress=390 WindowEmuliciousWidth=816 GameBoyErrorBreakpointSuspend20=true DataExecutionBreakpointCondition= -GameBoyErrorBreakpointMessage32= -BankSwapAtPCBreakpointCondition= WindowTilemapViewerWidth=404 +BankSwapAtPCBreakpointCondition= +GameBoyErrorBreakpointMessage32= SMSbuttonsThreshold=50 WindowTileViewerY=549 -Gamepad1Key9=-1 WindowTileViewerX=271 -Gamepad1Key8=-1 +Gamepad1Key9=-1 UninitializedMemoryBreakpointCondition= -Gamepad1Key7=-1 +Gamepad1Key8=-1 GameBoyErrorBreakpointSuspend19=true -Gamepad1Key6=-1 +Gamepad1Key7=-1 GameBoyErrorBreakpointSuspend18=true -Gamepad1Key5=-1 +Gamepad1Key6=-1 GameBoyErrorBreakpointSuspend17=true -Gamepad1Key4=-1 +Gamepad1Key5=-1 GameBoyErrorBreakpointSuspend16=true -WindowVideoViewerY=275 +Gamepad1Key4=-1 Gamepad1Key3=-1 -WindowVideoViewerX=946 +WindowVideoViewerY=275 Gamepad1Key2=-1 +WindowVideoViewerX=946 Gamepad1Key1=-1 Gamepad1Key0=-1 GameBoyErrorBreakpointSuspend10=true -WindowTilemapViewerHeight=744 WindowEventViewerWindowDivider=309 +WindowTilemapViewerHeight=744 GameBoyErrorBreakpointMessage20= -MemoryTracerDisplayFileOffsetsForROM=true WindowTileViewerWidth=467 -WindowDebuggerY=158 -WindowDebuggerX=939 +MemoryTracerDisplayFileOffsetsForROM=true +WindowDebuggerY=189 +WindowDebuggerX=1113 Key37=-1 Key36=-1 -Key35=-1 -GameBoyErrorBreakpointCondition9= -GameBoyErrorBreakpointEnabled32=false WindowTileViewerOpen=false -Key34=-1 +GameBoyErrorBreakpointEnabled32=false +GameBoyErrorBreakpointCondition9= +Key35=-1 GameBoyErrorBreakpointCondition8= -Key33=-1 -GameBoyErrorBreakpointMessage19= +Key34=-1 GameBoyErrorBreakpointCondition7= -Key32=-1 -GameBoyErrorBreakpointCondition6= -GameBoyErrorBreakpointMessage18= +GameBoyErrorBreakpointMessage19= +Key33=-1 DebuggerMemoryTabVisibleRect=0,0,0,0 -Key31=-1 -GameBoyErrorBreakpointCondition5= -GameBoyErrorBreakpointMessage17= -OutlineWidth=425 +GameBoyErrorBreakpointMessage18= +GameBoyErrorBreakpointCondition6= +Key32=-1 WindowEventViewerWindowWidth=930 -Key30=-1 -GameBoyErrorBreakpointCondition4= +OutlineWidth=425 +GameBoyErrorBreakpointMessage17= +GameBoyErrorBreakpointCondition5= +Key31=-1 GameBoyErrorBreakpointMessage16= +GameBoyErrorBreakpointCondition4= +Key30=-1 GameBoyErrorBreakpointCondition3= GameBoyErrorBreakpointCondition2= -GameBoyErrorBreakpointCondition1= Key9=40 -GameBoyErrorBreakpointCondition0= +GameBoyErrorBreakpointCondition1= Key8=38 +GameBoyErrorBreakpointCondition0= Key7=83 -Key6=87 GameBoyErrorBreakpointMessage10= +Key6=87 Key5=65 Key4=68 Key3=10 @@ -262,21 +262,21 @@ Update=2 Key29=-1 Key28=10 Key27=-1 -WindowSpriteViewerOpen=false Key26=-1 +WindowSpriteViewerOpen=false Key25=-1 -Key24=-1 WindowTileViewerHeight=453 -Key23=10 +Key24=-1 GameBoyErrorBreakpointEnabled20=false +Key23=10 Key22=-1 Key21=-1 -Key20=-1 BankSwapAtPCBreakpointSuspend=true -WindowEmuliciousY=376 -WindowEmuliciousX=146 -DebuggerMemorySelectedTab=HRAM -WindowDebuggerWidth=1110 +Key20=-1 +WindowEmuliciousY=489 +WindowEmuliciousX=666 +DebuggerMemorySelectedTab=RAM +WindowDebuggerWidth=1481 GameBoyErrorBreakpointMessage9= GameBoyErrorBreakpointMessage8= GameBoyErrorBreakpointMessage7=