Add a 2bpp CGB boot ROM logo, pending palettes

This commit is contained in:
Jakub Kądziołka 2020-05-03 22:44:13 +02:00
parent 19126df7f4
commit cb738190be
No known key found for this signature in database
GPG Key ID: E315A75846131564
4 changed files with 152 additions and 45 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 479 B

View File

@ -87,20 +87,24 @@ ELSE
.tilemapRowLoop .tilemapRowLoop
call .write_with_palette
; Repeat the 3 tiles common between E and B. This saves 27 bytes after
; compression, with a cost of 17 bytes of code.
push af push af
; Switch to second VRAM Bank sub $20
ld a, 1 sub $3
ldh [$4F], a jr nc, .notspecial
ld [hl], 8 add $20
; Switch to back first VRAM Bank call .write_with_palette
xor a dec c
ldh [$4F], a .notspecial
pop af pop af
ldi [hl], a
add d add d ; d = 3 for SameBoy logo, d = 1 for Nintendo logo
dec c dec c
jr nz, .tilemapRowLoop jr nz, .tilemapRowLoop
sub 47 sub 44
push de push de
ld de, $10 ld de, $10
add hl, de add hl, de
@ -116,6 +120,19 @@ ELSE
ld l, $a7 ld l, $a7
ld bc, $0107 ld bc, $0107
jr .tilemapRowLoop jr .tilemapRowLoop
.write_with_palette
push af
; Switch to second VRAM Bank
ld a, 1
ldh [$4F], a
ld [hl], 8
; Switch to back first VRAM Bank
xor a
ldh [$4F], a
pop af
ldi [hl], a
ret
.endTilemap .endTilemap
ENDC ENDC
@ -532,7 +549,7 @@ TrademarkSymbol:
db $3c,$42,$b9,$a5,$b9,$a5,$42,$3c db $3c,$42,$b9,$a5,$b9,$a5,$42,$3c
SameBoyLogo: SameBoyLogo:
incbin "SameBoyLogo.pb8" incbin "SameBoyLogo.pb12"
AnimationColors: AnimationColors:
dw $7FFF ; White dw $7FFF ; White
@ -634,30 +651,28 @@ ReadCGBLogoHalfTile:
ld a, e ld a, e
ret ret
; LoadTileset using PB8 codec, 2019 Damian Yerrick ; LoadTileset using PB12 codec, 2020 Jakub Kądziołka
; ; (based on PB8 codec, 2019 Damian Yerrick)
; The logo is compressed using PB8, a form of RLE with unary-coded
; run lengths. Each block representing 8 bytes consists of a control
; byte, where each bit (MSB to LSB) is 0 for literal or 1 for repeat
; previous, followed by the literals in that block.
SameBoyLogo_dst = $8080 SameBoyLogo_dst = $8080
SameBoyLogo_length = (128 * 24) / 64 SameBoyLogo_length = (128 * 24) / 64
LoadTileset: LoadTileset:
ld hl, SameBoyLogo ld hl, SameBoyLogo
ld de, SameBoyLogo_dst ld de, SameBoyLogo_dst - 1
ld c, SameBoyLogo_length ld c, SameBoyLogo_length
.pb8BlockLoop: .refill
; Register map for PB8 decompression ; Register map for PB12 decompression
; HL: source address in boot ROM ; HL: source address in boot ROM
; DE: destination address in VRAM ; DE: destination address in VRAM
; A: Current literal value ; A: Current literal value
; B: Repeat bits, terminated by 1000... ; B: Repeat bits, terminated by 1000...
; C: Number of 8-byte blocks left in this block
; Source address in HL lets the repeat bits go straight to B, ; Source address in HL lets the repeat bits go straight to B,
; bypassing A and avoiding spilling registers to the stack. ; bypassing A and avoiding spilling registers to the stack.
ld b, [hl] ld b, [hl]
dec b
jr z, .sameboyLogoEnd
inc b
inc hl inc hl
; Shift a 1 into lower bit of shift value. Once this bit ; Shift a 1 into lower bit of shift value. Once this bit
@ -665,26 +680,53 @@ LoadTileset:
scf scf
rl b rl b
.pb8BitLoop: .loop
; If not a repeat, load a literal byte ; If not a repeat, load a literal byte
jr c,.pb8Repeat jr c, .simple_repeat
ld a, [hli]
.pb8Repeat:
; Decompressed data uses colors 0 and 1, so write once, inc twice
ld [de], a
inc de
inc de
sla b sla b
jr nz, .pb8BitLoop jr c, .shifty_repeat
ld a, [hli]
dec c jr .got_byte
jr nz, .pb8BlockLoop .shifty_repeat
sla b
; End PB8 decoding. The rest uses HL as the destination jr nz, .no_refill_during_shift
ld h, d ld b, [hl] ; see above. Also, no, factoring it out into a callable
ld l, e inc hl ; routine doesn't save bytes, even with conditional calls
scf
rl b
.no_refill_during_shift
ld c, a
jr nc, .shift_left
srl a
db $fe ; eat the add a with cp d8
.shift_left
add a
sla b
jr c, .go_and
or c
db $fe ; eat the and c with cp d8
.go_and
and c
jr .got_byte
.simple_repeat
sla b
jr c, .got_byte
; far repeat
dec de
ld a, [de]
inc de
.got_byte
inc de
ld [de], a
sla b
jr nz, .loop
jr .refill
; End PB12 decoding. The rest uses HL as the destination
.sameboyLogoEnd .sameboyLogoEnd
ld h, d
ld l, $80
; Copy (unresized) ROM logo ; Copy (unresized) ROM logo
ld de, $104 ld de, $104
.CGBROMLogoLoop .CGBROMLogoLoop

68
BootROMs/pb12.py Normal file
View File

@ -0,0 +1,68 @@
import sys
def opts(byte):
# top bit: 0 = left, 1 = right
# bottom bit: 0 = or, 1 = and
if byte is None: return []
return [
byte | (byte << 1) & 0xff,
byte & (byte << 1),
byte | (byte >> 1) & 0xff,
byte & (byte >> 1),
]
def pb12(data):
data = iter(data)
literals = bytearray()
bits = 0
control = 0
prev = [None, None]
gotta_end = False
chunk = bytearray()
while True:
try:
byte = next(data)
except StopIteration:
if bits == 0: break
byte = 0
chunk.append(byte)
if byte in prev:
bits += 2
control <<= 1
control |= 1
control <<= 1
if prev[1] == byte:
control |= 1 # 10 = out[-2], 11 = out[-1]
else:
bits += 2
control <<= 2
options = opts(prev[1])
if byte in options:
# 01 = modify
control |= 1
bits += 2
control <<= 2
control |= options.index(byte)
else:
# 00 = literal
literals.append(byte)
prev = [prev[1], byte]
if bits >= 8:
outctl = control >> (bits - 8)
assert outctl != 1 # that's the end byte
yield bytes([outctl]) + literals
bits -= 8
control &= (1 << bits) - 1
literals = bytearray()
chunk = bytearray()
yield b'\x01'
_, infile, outfile = sys.argv
with open(infile, 'rb') as f:
data = f.read()
with open(outfile, 'wb') as f:
f.writelines(pb12(data))

View File

@ -382,21 +382,18 @@ $(BIN)/SDL/Shaders: Shaders
# Boot ROMs # Boot ROMs
$(OBJ)/%.1bpp: %.png $(OBJ)/%.2bpp: %.png
-@$(MKDIR) -p $(dir $@) -@$(MKDIR) -p $(dir $@)
rgbgfx -d 1 -h -o $@ $< rgbgfx -h -u -o $@ $<
$(OBJ)/BootROMs/SameBoyLogo.pb8: $(OBJ)/BootROMs/SameBoyLogo.1bpp $(PB8_COMPRESS) $(OBJ)/BootROMs/SameBoyLogo.pb12: $(OBJ)/BootROMs/SameBoyLogo.2bpp BootROMs/pb12.py
$(realpath $(PB8_COMPRESS)) -l 384 $< $@ python3 BootROMs/pb12.py $< $@
$(PB8_COMPRESS): BootROMs/pb8.c
$(CC) $< -o $@
$(BIN)/BootROMs/agb_boot.bin: BootROMs/cgb_boot.asm $(BIN)/BootROMs/agb_boot.bin: BootROMs/cgb_boot.asm
$(BIN)/BootROMs/cgb_boot_fast.bin: BootROMs/cgb_boot.asm $(BIN)/BootROMs/cgb_boot_fast.bin: BootROMs/cgb_boot.asm
$(BIN)/BootROMs/sgb2_boot: BootROMs/sgb_boot.asm $(BIN)/BootROMs/sgb2_boot: BootROMs/sgb_boot.asm
$(BIN)/BootROMs/%.bin: BootROMs/%.asm $(OBJ)/BootROMs/SameBoyLogo.pb8 $(BIN)/BootROMs/%.bin: BootROMs/%.asm $(OBJ)/BootROMs/SameBoyLogo.pb12
-@$(MKDIR) -p $(dir $@) -@$(MKDIR) -p $(dir $@)
rgbasm -i $(OBJ)/BootROMs/ -i BootROMs/ -o $@.tmp $< rgbasm -i $(OBJ)/BootROMs/ -i BootROMs/ -o $@.tmp $<
rgblink -o $@.tmp2 $@.tmp rgblink -o $@.tmp2 $@.tmp