diff options
author | Daniel Harding <33dannye@gmail.com> | 2021-11-15 13:31:15 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-11-15 13:31:15 -0600 |
commit | f516a91f5fa02a741631c77b9097598f466d1328 (patch) | |
tree | bac2ee5e3fad02983b061580f5c085baecb5439a /src/engine/gfx/color.asm | |
parent | 15e986d374fdd11ed0f412fbdc9b858d4c4b9f50 (diff) | |
parent | 1fd16cd27fcd4f432bfc09fc5b7a262798b72430 (diff) |
Some more bank splitting
Diffstat (limited to 'src/engine/gfx/color.asm')
-rw-r--r-- | src/engine/gfx/color.asm | 536 |
1 files changed, 536 insertions, 0 deletions
diff --git a/src/engine/gfx/color.asm b/src/engine/gfx/color.asm new file mode 100644 index 0000000..db75861 --- /dev/null +++ b/src/engine/gfx/color.asm @@ -0,0 +1,536 @@ +; writes wd293 with byte depending on console +; every entry in the list is $00 +Func_10a9b: + push hl + ld a, [wConsole] + add LOW(.data_10ab1) + ld l, a + ld a, HIGH(.data_10ab1) + adc 0 + ld h, a + ld a, [hl] + ld [wd293], a + xor a + ld [wd317], a + pop hl + ret + +.data_10ab1 + db $00 ; CONSOLE_DMG + db $00 ; CONSOLE_SGB + db $00 ; CONSOLE_CGB + +FadeScreenToWhite: + ld a, [wLCDC] + bit LCDC_ENABLE_F, a + jr z, .lcd_off + ld a, [wd293] + ld [wTempBGP], a + ld [wTempOBP0], a + ld [wTempOBP1], a + ld de, PALRGB_WHITE + ld hl, wTempBackgroundPalettesCGB + ld bc, NUM_BACKGROUND_PALETTES palettes + call FillMemoryWithDE + call RestoreFirstColorInOBPals + call FadeScreenToTempPals + call DisableLCD + ret + +.lcd_off + ld a, [wd293] + ld [wBGP], a + ld [wOBP0], a + ld [wOBP1], a + ld de, PALRGB_WHITE + ld hl, wBackgroundPalettesCGB + ld bc, NUM_BACKGROUND_PALETTES palettes + call FillMemoryWithDE + call FlushAllPalettes + ret + +FadeScreenFromWhite: + call .BackupPalsAndSetWhite + call RestoreFirstColorInOBPals + call FlushAllPalettes + call EnableLCD + jp FadeScreenToTempPals + +.BackupPalsAndSetWhite + ld a, [wBGP] + ld [wTempBGP], a + ld a, [wOBP0] + ld [wTempOBP0], a + ld a, [wOBP1] + ld [wTempOBP1], a + ld hl, wBackgroundPalettesCGB + ld de, wTempBackgroundPalettesCGB + ld bc, NUM_BACKGROUND_PALETTES palettes + NUM_OBJECT_PALETTES palettes + call CopyDataHLtoDE_SaveRegisters + jr SetWhitePalettes ; can be fallthrough + +; fills wBackgroundPalettesCGB with white pal +SetWhitePalettes: + ld a, [wd293] + ld [wBGP], a + ld [wOBP0], a + ld [wOBP1], a + ld de, PALRGB_WHITE + ld hl, wBackgroundPalettesCGB + ld bc, NUM_BACKGROUND_PALETTES palettes + call FillMemoryWithDE + ret + +; gets from backup OB pals the first color +; of each pal and writes them in wObjectPalettesCGB +RestoreFirstColorInOBPals: + ld hl, wTempObjectPalettesCGB + ld de, wObjectPalettesCGB + ld c, NUM_OBJECT_PALETTES +.loop_pals + push bc + ld a, [hli] + ld [de], a + inc de + ld a, [hl] + ld [de], a + ld bc, CGB_PAL_SIZE - 1 + add hl, bc + ld a, c + add e + ld e, a + ld a, b + adc d + ld d, a + pop bc + dec c + jr nz, .loop_pals + ret + +FadeScreenToTempPals: + ld a, [wVBlankCounter] + push af + ld c, $10 +.loop + push bc + ld a, c + and %11 + cp 0 + call z, Func_10b85 + call FadeBGPalIntoTemp3 + call FadeOBPalIntoTemp + call FlushAllPalettes + call DoFrameIfLCDEnabled + pop bc + dec c + dec c + jr nz, .loop + pop af + ld b, a + ld a, [wVBlankCounter] + sub b + ret + +; does something with wBGP given wTempBGP +; mixes them into a single value? +Func_10b85: + push bc + ld c, $03 + ld hl, wBGP + ld de, wTempBGP +.asm_10b8e + push bc + ld b, [hl] + ld a, [de] + ld c, a + call .Func_10b9e + ld [hl], a + pop bc + inc de + inc hl + dec c + jr nz, .asm_10b8e + pop bc + ret + +.Func_10b9e + push bc + push de + ld e, 4 + ld d, $00 +.loop + call .Func_10bba + or d + rlca + rlca + ld d, a + rlc b + rlc b + rlc c + rlc c + dec e + jr nz, .loop + ld a, d + pop de + pop bc + ret + +; calculates ((b & %11) << 2) | (c & %11) +; that is, %0000xxyy, where x and y are +; the 2 lower bits of b and c respectively +; and outputs the entry from a table given that value +.Func_10bba + push hl + push bc + ld a, %11 + and b + add a + add a + ld b, a + ld a, %11 + and c + or b + ld c, a + ld b, $00 + ld hl, .data_10bd1 + add hl, bc + ld a, [hl] + pop bc + pop hl + ret + +.data_10bd1 + db %00 ; b = %00 | c = %00 + db %01 ; b = %00 | c = %01 + db %01 ; b = %00 | c = %10 + db %01 ; b = %00 | c = %11 + db %00 ; b = %01 | c = %00 + db %01 ; b = %01 | c = %01 + db %10 ; b = %01 | c = %10 + db %10 ; b = %01 | c = %11 + db %01 ; b = %10 | c = %00 + db %01 ; b = %10 | c = %01 + db %10 ; b = %10 | c = %10 + db %11 ; b = %10 | c = %11 + db %10 ; b = %11 | c = %00 + db %10 ; b = %11 | c = %01 + db %10 ; b = %11 | c = %10 + db %11 ; b = %11 | c = %11 + +FadeOBPalIntoTemp: + push bc + ld c, 4 palettes + ld hl, wObjectPalettesCGB + ld de, wTempObjectPalettesCGB + jr FadePalIntoAnother + +FadeBGPalIntoTemp1: + push bc + ld c, 2 palettes + ld hl, wBackgroundPalettesCGB + ld de, wTempBackgroundPalettesCGB + jr FadePalIntoAnother + +FadeBGPalIntoTemp2: + push bc + ld c, 2 palettes + ld hl, wBackgroundPalettesCGB + 4 palettes + ld de, wTempBackgroundPalettesCGB + 4 palettes + jr FadePalIntoAnother + +FadeBGPalIntoTemp3: + push bc + ld c, 4 palettes + ld hl, wBackgroundPalettesCGB + ld de, wTempBackgroundPalettesCGB +; fallthrough + +; hl = input pal to modify +; de = pal to fade into +; c = number of colors to fade +FadePalIntoAnother: + push bc + ld a, [de] + inc de + ld c, a + ld a, [de] + inc de + ld b, a + push de + push bc + ld c, [hl] + inc hl + ld b, [hl] + pop de + call .GetFadedColor + ; overwrite with new color + ld [hld], a + ld [hl], c + inc hl + inc hl + pop de + pop bc + dec c + jr nz, FadePalIntoAnother + pop bc + ret + +; fade pal bc to de +; output resulting pal in a and c +.GetFadedColor + push hl + ld a, c + cp e + jr nz, .unequal + ld a, b + cp d + jr z, .skip + +.unequal + ; red + ld a, e + and %11111 + ld l, a + ld a, c + and %11111 + call .FadeColor + ldh [hffb6], a + + ; green + ld a, e + and %11100000 + ld l, a + ld a, d + and %11 + or l + swap a + rrca + ld l, a + ld a, c + and %11100000 + ld h, a + ld a, b + and %11 + or h + swap a + rrca + call .FadeColor + rlca + swap a + ld h, a + and %11 + ldh [hffb7], a + ld a, %11100000 + and h + ld h, a + ldh a, [hffb6] + or h + ld h, a + + ; blue + ld a, d + and %1111100 + rrca + rrca + ld l, a + ld a, b + and %1111100 + rrca + rrca + call .FadeColor + rlca + rlca + ld b, a + ldh a, [hffb7] + or b + ld c, h +.skip + pop hl + ret + +; compares color in a and in l +; if a is smaller/greater than l, then +; increase/decrease its value up to l +; up to a maximum of 4 +; a = pal color (red, green or blue) +; l = pal color (red, green or blue) +.FadeColor + cp l + ret z ; same value + jr c, .incr_a +; decr a + dec a + cp l + ret z + dec a + cp l + ret z + dec a + cp l + ret z + dec a + ret + +.incr_a + inc a + cp l + ret z + inc a + cp l + ret z + inc a + cp l + ret z + inc a + ret + +; fades screen to white then +; if c == 0, fade back in +; keep white otherwise +FlashScreenToWhite: + ldh a, [hBankSRAM] + push af + push bc + ld a, BANK("SRAM1") + call BankswitchSRAM + call CopyPalsToSRAMBuffer + call FadeScreenToWhite + pop bc + ld a, c + or a + jr nz, .skip_fade_in + call LoadPalsFromSRAMBuffer + call FadeScreenFromWhite +.skip_fade_in + call EnableLCD + pop af + call BankswitchSRAM + call DisableSRAM + ret + +; copies current BG and OP pals, +; wBackgroundPalettesCGB and wObjectPalettesCGB +; to sGfxBuffer2 +CopyPalsToSRAMBuffer: + ldh a, [hBankSRAM] + + push af + cp BANK("SRAM1") + jr z, .ok + debug_nop +.ok + ld a, BANK("SRAM1") + call BankswitchSRAM + ld hl, sGfxBuffer2 + ld a, [wBGP] + ld [hli], a + ld a, [wOBP0] + ld [hli], a + ld a, [wOBP1] + ld [hli], a + ld e, l + ld d, h + ld hl, wBackgroundPalettesCGB + ld bc, NUM_BACKGROUND_PALETTES palettes + NUM_OBJECT_PALETTES palettes + call CopyDataHLtoDE_SaveRegisters + pop af + + call BankswitchSRAM + call DisableSRAM + ret + +; loads BG and OP pals, +; wBackgroundPalettesCGB and wObjectPalettesCGB +; from sGfxBuffer2 +LoadPalsFromSRAMBuffer: + ldh a, [hBankSRAM] + + push af + cp BANK("SRAM1") + jr z, .ok + debug_nop +.ok + ld a, BANK("SRAM1") + call BankswitchSRAM + ld hl, sGfxBuffer2 + ld a, [hli] + ld [wBGP], a + ld a, [hli] + ld [wOBP0], a + ld a, [hli] + ld [wOBP1], a + ld de, wBackgroundPalettesCGB + ld bc, NUM_BACKGROUND_PALETTES palettes + NUM_OBJECT_PALETTES palettes + call CopyDataHLtoDE_SaveRegisters + pop af + + call BankswitchSRAM + call DisableSRAM + ret + +; backs up all palettes +; and writes 4 BG pals with white pal +Func_10d17: + ld a, [wBGP] + ld [wTempBGP], a + ld a, [wOBP0] + ld [wTempOBP0], a + ld a, [wOBP1] + ld [wTempOBP1], a + ld hl, wBackgroundPalettesCGB + ld de, wTempBackgroundPalettesCGB + ld bc, NUM_BACKGROUND_PALETTES palettes + NUM_OBJECT_PALETTES palettes + call CopyDataHLtoDE_SaveRegisters + + ld a, [wd293] + ld [wBGP], a + ld de, PALRGB_WHITE + ld hl, wBackgroundPalettesCGB + ld bc, 4 palettes + call FillMemoryWithDE + call FlushAllPalettes + + ld a, $10 + ld [wd317], a + ret + +Func_10d50: + ld a, [wd293] + ld [wTempBGP], a + ld a, [wOBP0] + ld [wTempOBP0], a + ld a, [wOBP1] + ld [wTempOBP1], a + ld de, PALRGB_WHITE + ld hl, wTempBackgroundPalettesCGB + ld bc, 4 palettes + call FillMemoryWithDE + ld a, $10 + ld [wd317], a + ret + +; does stuff according to bottom 2 bits from wd317: +; - if equal to %01, modify wBGP +; - if bottom bit not set, fade BG pals 0 and 1 +; - if bottom bit is set, fade BG pals 4 and 5 +; and Flush Palettes +; then decrements wd317 +; does nothing if wd317 is 0 +Func_10d74: + ld a, [wd317] + or a + ret z + and %11 + ld c, a + cp $1 + call z, Func_10b85 + bit 0, c + call z, FadeBGPalIntoTemp1 + bit 0, c + call nz, FadeBGPalIntoTemp2 + bit 0, c + call nz, FlushAllPalettes + ld a, [wd317] + dec a + ld [wd317], a + ret |