summaryrefslogtreecommitdiff
path: root/engine/battle/scale_sprites.asm
diff options
context:
space:
mode:
authorxCrystal <rgr.crystal@gmail.com>2015-04-01 16:16:43 +0200
committerxCrystal <rgr.crystal@gmail.com>2015-04-01 17:05:49 +0200
commit77d0e5ff84cc61ae625da19f184094241eddd4dc (patch)
tree921ae74206ff3b396cc3423a0b699b4563239a96 /engine/battle/scale_sprites.asm
parent46c2a38c7c55ff01e8787dfd624cb1c771248b6c (diff)
Rename battle files and split move effects Part 3
b.asm, b_2.asm, c.asm, and d.asm
Diffstat (limited to 'engine/battle/scale_sprites.asm')
-rw-r--r--engine/battle/scale_sprites.asm85
1 files changed, 85 insertions, 0 deletions
diff --git a/engine/battle/scale_sprites.asm b/engine/battle/scale_sprites.asm
new file mode 100644
index 00000000..dae4ad42
--- /dev/null
+++ b/engine/battle/scale_sprites.asm
@@ -0,0 +1,85 @@
+; scales both uncompressed sprite chunks by two in every dimension (creating 2x2 output pixels per input pixel)
+; assumes that input sprite chunks are 4x4 tiles, and the rightmost and bottommost 4 pixels will be ignored
+; resulting in a 7*7 tile output sprite chunk
+ScaleSpriteByTwo: ; 2fe40 (b:7e40)
+ ld de, S_SPRITEBUFFER1 + (4*4*8) - 5 ; last byte of input data, last 4 rows already skipped
+ ld hl, S_SPRITEBUFFER0 + SPRITEBUFFERSIZE - 1 ; end of destination buffer
+ call ScaleLastSpriteColumnByTwo ; last tile column is special case
+ call ScaleFirstThreeSpriteColumnsByTwo ; scale first 3 tile columns
+ ld de, S_SPRITEBUFFER2 + (4*4*8) - 5 ; last byte of input data, last 4 rows already skipped
+ ld hl, S_SPRITEBUFFER1 + SPRITEBUFFERSIZE - 1 ; end of destination buffer
+ call ScaleLastSpriteColumnByTwo ; last tile column is special case
+
+ScaleFirstThreeSpriteColumnsByTwo: ; 2fe55 (b:7e55)
+ ld b, $3 ; 3 tile columns
+.columnLoop
+ ld c, 4*8 - 4 ; $1c, 4 tiles minus 4 unused rows
+.columnInnerLoop
+ push bc
+ ld a, [de]
+ ld bc, -(7*8)+1 ; $ffc9, scale lower nybble and seek to previous output column
+ call ScalePixelsByTwo
+ ld a, [de]
+ dec de
+ swap a
+ ld bc, 7*8+1-2 ; $37, scale upper nybble and seek back to current output column and to the next 2 rows
+ call ScalePixelsByTwo
+ pop bc
+ dec c
+ jr nz, .columnInnerLoop
+ dec de
+ dec de
+ dec de
+ dec de
+ ld a, b
+ ld bc, -7*8 ; $ffc8, skip one output column (which has already been written along with the current one)
+ add hl, bc
+ ld b, a
+ dec b
+ jr nz, .columnLoop
+ ret
+
+ScaleLastSpriteColumnByTwo: ; 2fe7d (b:7e7d)
+ ld a, 4*8 - 4 ; $1c, 4 tiles minus 4 unused rows
+ ld [H_SPRITEINTERLACECOUNTER], a ; $ff8b
+ ld bc, -1 ; $ffff
+.columnInnerLoop
+ ld a, [de]
+ dec de
+ swap a ; only high nybble contains information
+ call ScalePixelsByTwo
+ ld a, [H_SPRITEINTERLACECOUNTER] ; $ff8b
+ dec a
+ ld [H_SPRITEINTERLACECOUNTER], a ; $ff8b
+ jr nz, .columnInnerLoop
+ dec de ; skip last 4 rows of new column
+ dec de
+ dec de
+ dec de
+ ret
+
+; scales the given 4 bits in a (4x1 pixels) to 2 output bytes (8x2 pixels)
+; hl: destination pointer
+; bc: destination pointer offset (added after the two bytes have been written)
+ScalePixelsByTwo: ; 2fe97 (b:7e97)
+ push hl
+ and $f
+ ld hl, DuplicateBitsTable
+ add l
+ ld l, a
+ jr nc, .noCarry
+ inc h
+.noCarry
+ ld a, [hl]
+ pop hl
+ ld [hld], a ; write output byte twice to make it 2 pixels high
+ ld [hl], a
+ add hl, bc ; add offset
+ ret
+
+; repeats each input bit twice
+DuplicateBitsTable: ; 2fea8 (b:7ea8)
+ db $00, $03, $0c, $0f
+ db $30, $33, $3c, $3f
+ db $c0, $c3, $cc, $cf
+ db $f0, $f3, $fc, $ff