Something went wrong. Try again.
Monorepo for Aesthetic.Computer aesthetic.computer
Something went wrong. Try again.
9.6 kB · 543 lines
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544; Rainbow Bars - GameBoy Color Demo; Scrolling rainbow colored barsINCLUDE "hardware.inc"SECTION "Header", ROM0[$100] jp EntryPoint ds $143 - @, 0 db $C0 ; GBC only flag ds $150 - @, 0SECTION "Variables", WRAM0wScrollY: dbwFrameCounter: dbwColorCycle: dbSECTION "EntryPoint", ROM0[$150]EntryPoint: ; Wait for VBlank.waitVBlank: ld a, [rLY] cp 144 jp c, .waitVBlank ; Turn off LCD xor a ld [rLCDC], a ; Copy tiles ld de, Tiles ld hl, $9000 ld bc, TilesEnd - Tiles.copyTiles: ld a, [de] ld [hl+], a inc de dec bc ld a, b or c jp nz, .copyTiles ; Fill tilemap with horizontal bars ld hl, $9800 ld b, 18 ; 18 rows xor a ; Tile index.rowLoop: ld c, 32 ; 32 columns.colLoop: ld [hl+], a dec c jr nz, .colLoop inc a ; Next tile for next row and $07 ; Cycle 0-7 dec b jr nz, .rowLoop ; Set up GBC palettes call SetupPalettes ; Set tilemap attributes for colors ld a, 1 ld [rVBK], a ; Switch to VRAM bank 1 (attributes) ld hl, $9800 ld b, 18 xor a.attrRowLoop: ld c, 32.attrColLoop: ld [hl+], a dec c jr nz, .attrColLoop inc a and $07 ; Cycle through palettes 0-7 dec b jr nz, .attrRowLoop xor a ld [rVBK], a ; Back to VRAM bank 0 ; Set DMG palette fallback ld a, %11100100 ld [rBGP], a ; Initialize variables xor a ld [wScrollY], a ld [wFrameCounter], a ld [wColorCycle], a ; Turn on LCD ld a, LCDC_ON | LCDC_BG_ON ld [rLCDC], aMain: ; Wait for VBlank ld a, [rLY] cp 144 jp nc, Main.waitVBlank2: ld a, [rLY] cp 144 jp c, .waitVBlank2 ; Update every frame for smooth scroll ld a, [wScrollY] inc a ld [wScrollY], a ld [rSCY], a ; Cycle colors every 30 frames ld a, [wFrameCounter] inc a ld [wFrameCounter], a cp 30 jp nz, Main xor a ld [wFrameCounter], a ld a, [wColorCycle] inc a and $1F ld [wColorCycle], a call UpdatePalettes jp MainSetupPalettes: ; Set up 8 different colored palettes ; Palette 0 - Red shades ld a, $80 ; Auto-increment, palette 0 ld [rBCPS], a ld a, $00 ; Black ld [rBCPD], a ld [rBCPD], a ld a, $15 ; Dark red ld [rBCPD], a ld a, $00 ld [rBCPD], a ld a, $1F ; Red ld [rBCPD], a ld a, $00 ld [rBCPD], a ld a, $3F ; Bright red ld [rBCPD], a ld a, $00 ld [rBCPD], a ; Palette 1 - Green shades ld a, $88 ld [rBCPS], a ld a, $00 ld [rBCPD], a ld [rBCPD], a ld a, $A0 ; Dark green ld [rBCPD], a ld a, $02 ld [rBCPD], a ld a, $E0 ; Green ld [rBCPD], a ld a, $03 ld [rBCPD], a ld a, $E0 ; Bright green ld [rBCPD], a ld a, $07 ld [rBCPD], a ; Palette 2 - Blue shades ld a, $90 ld [rBCPS], a ld a, $00 ld [rBCPD], a ld [rBCPD], a ld a, $00 ; Dark blue ld [rBCPD], a ld a, $0A ld [rBCPD], a ld a, $00 ; Blue ld [rBCPD], a ld a, $1F ld [rBCPD], a ld a, $00 ; Bright blue ld [rBCPD], a ld a, $3F ld [rBCPD], a ; Palette 3 - Yellow shades ld a, $98 ld [rBCPS], a ld a, $00 ld [rBCPD], a ld [rBCPD], a ld a, $B5 ; Dark yellow ld [rBCPD], a ld a, $02 ld [rBCPD], a ld a, $DF ; Yellow ld [rBCPD], a ld a, $03 ld [rBCPD], a ld a, $FF ; Bright yellow ld [rBCPD], a ld a, $03 ld [rBCPD], a ; Palette 4 - Cyan shades ld a, $A0 ld [rBCPS], a ld a, $00 ld [rBCPD], a ld [rBCPD], a ld a, $A0 ld [rBCPD], a ld a, $0A ld [rBCPD], a ld a, $E0 ld [rBCPD], a ld a, $1F ld [rBCPD], a ld a, $E0 ld [rBCPD], a ld a, $3F ld [rBCPD], a ; Palette 5 - Magenta shades ld a, $A8 ld [rBCPS], a ld a, $00 ld [rBCPD], a ld [rBCPD], a ld a, $15 ld [rBCPD], a ld a, $0A ld [rBCPD], a ld a, $1F ld [rBCPD], a ld a, $1F ld [rBCPD], a ld a, $3F ld [rBCPD], a ld a, $3F ld [rBCPD], a ; Palette 6 - Orange shades ld a, $B0 ld [rBCPS], a ld a, $00 ld [rBCPD], a ld [rBCPD], a ld a, $95 ld [rBCPD], a ld a, $01 ld [rBCPD], a ld a, $1F ld [rBCPD], a ld a, $02 ld [rBCPD], a ld a, $9F ld [rBCPD], a ld a, $03 ld [rBCPD], a ; Palette 7 - Purple shades ld a, $B8 ld [rBCPS], a ld a, $00 ld [rBCPD], a ld [rBCPD], a ld a, $0A ld [rBCPD], a ld a, $05 ld [rBCPD], a ld a, $1F ld [rBCPD], a ld a, $0F ld [rBCPD], a ld a, $3F ld [rBCPD], a ld a, $1F ld [rBCPD], a retUpdatePalettes: ; Rotate palette colors dynamically ; Each palette shifts through the color spectrum ld a, [wColorCycle] ld b, a ; Update all 8 palettes with shifted colors ld c, 0 ; Palette counter.paletteLoop: ; Calculate palette address ld a, c sla a sla a sla a ; Multiply by 8 or $80 ; Auto-increment ld [rBCPS], a ; Calculate color offset for this palette ld a, b ; wColorCycle ld d, a ld a, c ; Palette number sla a sla a ; Multiply by 4 for offset add d ; Add cycle offset and $1F ; Keep in 0-31 range ; Generate colors based on position in cycle call GenerateShiftingColor ; Next palette inc c ld a, c cp 8 jr nz, .paletteLoop retGenerateShiftingColor: ; Generate a color based on value in A (0-31) ; Creates a smooth rainbow effect push bc ld b, a ; Color 0 - always black xor a ld [rBCPD], a ld [rBCPD], a ; Color 1 - Dark shade ld a, b call .calcRGB srl d ; Halve brightness srl e srl c ld a, d ld [rBCPD], a ld a, e or c ld [rBCPD], a ; Color 2 - Medium shade ld a, b add 5 ; Offset for variation and $1F call .calcRGB ld a, d ld [rBCPD], a ld a, e or c ld [rBCPD], a ; Color 3 - Bright shade ld a, b add 10 ; More offset and $1F call .calcRGB ; Boost brightness ld a, d or $1F ld [rBCPD], a ld a, e or c or $1F ld [rBCPD], a pop bc ret.calcRGB: ; Calculate RGB values based on position (0-31) in A ; Returns: D=low byte, E=high byte (bits 0-4), C=high byte (bits 5-7) push af ; Determine which third of spectrum (0-10=red, 11-21=green, 22-31=blue) cp 11 jr c, .redPhase cp 22 jr c, .greenPhase .bluePhase: ; Blue to Red transition sub 22 ld b, a ld a, 9 sub b ; Inverse for fade ; Red component (fading in) sla a and $1F ld d, a ; Low byte = red (bits 0-4) ; Blue component (high, fading out) ld a, b sla a sla a and $1F ld c, a sla c sla c sla c ; Shift to bits 5-7 of high byte xor a ld e, a ; Green in middle bits jr .done .greenPhase: ; Green to Blue transition sub 11 ld b, a ; Green component (fading out) ld a, 10 sub b and $1F sla a sla a sla a ld e, a ; Green in bits 5-7 of low byte ; Blue component (fading in) ld a, b sla a and $1F ld c, a sla c sla c sla c ; Blue in high byte xor a ld d, a ; No red jr .done .redPhase: ; Red to Green transition ld b, a ; Red component (high, fading out) ld a, 10 sub b sla a and $1F ld d, a ; Red in low byte ; Green component (fading in) ld a, b sla a and $1F sla a sla a sla a ld e, a ; Green in low byte bits 5-7 xor a ld c, a ; No blue .done: pop af retTiles: ; Tile 0 - Solid dw `33333333 dw `33333333 dw `33333333 dw `33333333 dw `33333333 dw `33333333 dw `33333333 dw `33333333 ; Tile 1 dw `22222222 dw `22222222 dw `22222222 dw `22222222 dw `22222222 dw `22222222 dw `22222222 dw `22222222 ; Tile 2 dw `11111111 dw `11111111 dw `11111111 dw `11111111 dw `11111111 dw `11111111 dw `11111111 dw `11111111 ; Tile 3 - Gradient dw `33333333 dw `33333333 dw `22222222 dw `22222222 dw `22222222 dw `11111111 dw `11111111 dw `00000000 ; Tile 4 dw `33332222 dw `33332222 dw `33332222 dw `33332222 dw `22221111 dw `22221111 dw `22221111 dw `22221111 ; Tile 5 dw `22221111 dw `22221111 dw `22221111 dw `22221111 dw `11110000 dw `11110000 dw `11110000 dw `11110000 ; Tile 6 dw `33333333 dw `22222222 dw `11111111 dw `00000000 dw `33333333 dw `22222222 dw `11111111 dw `00000000 ; Tile 7 dw `33221100 dw `33221100 dw `33221100 dw `33221100 dw `33221100 dw `33221100 dw `33221100 dw `33221100TilesEnd: