[Reverse-engineering] [th02/th04/th05] Hardcoded spark sprites

As seen when killing stage enemies or grazing.

Funded by -Tom-.
This commit is contained in:
nmlgc 2019-02-27 18:05:22 +01:00
parent 2ea2e0ddf9
commit da284cacaf
6 changed files with 653 additions and 3258 deletions

51
th02/spark_render.asm Normal file
View File

@ -0,0 +1,51 @@
; Draws the hardcoded spark sprite with the given ID, with ([x], [vram_y])
; pointing to the top-left point. Assumptions:
; • The GRCG is active, and set to the intended color
; • [sprite_id] ≤ SPARK_SPRITES
; void pascal near spark_render(int x, int vram_y, int sprite_id);
spark_render proc near
@@sprite_id = word ptr 4
@@vram_y = word ptr 6
@@x = word ptr 8
push bp
mov bp, sp
push si
push di
mov ax, GRAM_400
mov es, ax
mov bx, [bp+@@x]
mov ax, bx
sar ax, 3 ; x /= 8
mov dx, [bp+@@vram_y]
shl dx, 6 ; [vram_y] * 64
add ax, dx
shr dx, 2 ; (([vram_y] * 64) / 4) = [vram_y] * 16
add ax, dx
mov di, ax ; ([vram_y] * 64) + ([vram_y] * 16) = [vram_y * ROW_SIZE]
mov ax, bx
and ax, 7 ; [x] & 7
shl ax, 7 ; *= SPARK_SIZE * SPARK_SPRITES (offset of X-shifted sprite)
mov dx, [bp+@@sprite_id]
shl dx, 4 ; sprite_ptr = [sprite_id] * SPARK_SIZE
add ax, dx
add ax, offset sSPARKS
mov si, ax
mov cx, SPARK_H
@@blit_loop:
movsw
add di, (ROW_SIZE - SPARK_VRAM_W)
cmp di, (ROW_SIZE * RES_Y)
jl short @@next_row
sub di, (ROW_SIZE * RES_Y)
@@next_row:
loop @@blit_loop
pop di
pop si
pop bp
retn 6
spark_render endp
even

529
th02/sprites/sparks.asm Normal file
View File

@ -0,0 +1,529 @@
; 1bpp spark sprites, pre-shifted for all 8 possible X positions within a
; single VRAM byte.
SPARK_H = 8
SPARK_VRAM_W = (16 / 8)
SPARK_SIZE = (SPARK_VRAM_W * SPARK_H)
SPARK_SPRITES = 8
public sSPARKS
label sSPARKS byte
; x + 0
db 10000b, 0b
db 10000b, 0b
db 10000b, 0b
db 11111b, 0b
db 11111000b, 0b
db 1000b, 0b
db 1000b, 0b
db 1000b, 0b
db 1000000b, 0b
db 100001b, 0b
db 10010b, 0b
db 11100b, 0b
db 111000b, 0b
db 1001000b, 0b
db 10000100b, 0b
db 10b, 0b
db 0b, 0b
db 1000010b, 0b
db 100100b, 0b
db 11000b, 0b
db 11000b, 0b
db 100100b, 0b
db 1000010b, 0b
db 0b, 0b
db 0b, 0b
db 0b, 0b
db 100100b, 0b
db 11000b, 0b
db 11000b, 0b
db 100100b, 0b
db 0b, 0b
db 0b, 0b
db 1000000b, 0b
db 100001b, 0b
db 10010b, 0b
db 11100b, 0b
db 111000b, 0b
db 1001000b, 0b
db 10000100b, 0b
db 10b, 0b
db 0b, 0b
db 1000010b, 0b
db 100100b, 0b
db 11000b, 0b
db 11000b, 0b
db 100100b, 0b
db 1000010b, 0b
db 0b, 0b
db 0b, 0b
db 0b, 0b
db 100100b, 0b
db 11000b, 0b
db 11000b, 0b
db 100100b, 0b
db 0b, 0b
db 0b, 0b
db 111100b, 0b
db 1000010b, 0b
db 10000001b, 0b
db 10011001b, 0b
db 10011001b, 0b
db 10000001b, 0b
db 1000010b, 0b
db 111100b, 0b
; x + 1
db 1000b, 0b
db 1000b, 0b
db 1000b, 0b
db 1111b,10000000b
db 1111100b, 0b
db 100b, 0b
db 100b, 0b
db 100b, 0b
db 100000b, 0b
db 10000b,10000000b
db 1001b, 0b
db 1110b, 0b
db 11100b, 0b
db 100100b, 0b
db 1000010b, 0b
db 1b, 0b
db 0b, 0b
db 100001b, 0b
db 10010b, 0b
db 1100b, 0b
db 1100b, 0b
db 10010b, 0b
db 100001b, 0b
db 0b, 0b
db 0b, 0b
db 0b, 0b
db 10010b, 0b
db 1100b, 0b
db 1100b, 0b
db 10010b, 0b
db 0b, 0b
db 0b, 0b
db 100000b, 0b
db 10000b,10000000b
db 1001b, 0b
db 1110b, 0b
db 11100b, 0b
db 100100b, 0b
db 1000010b, 0b
db 1b, 0b
db 0b, 0b
db 100001b, 0b
db 10010b, 0b
db 1100b, 0b
db 1100b, 0b
db 10010b, 0b
db 100001b, 0b
db 0b, 0b
db 0b, 0b
db 0b, 0b
db 10010b, 0b
db 1100b, 0b
db 1100b, 0b
db 10010b, 0b
db 0b, 0b
db 0b, 0b
db 11110b, 0b
db 100001b, 0b
db 1000000b,10000000b
db 1001100b,10000000b
db 1001100b,10000000b
db 1000000b,10000000b
db 100001b, 0b
db 11110b, 0b
; x + 2
db 100b, 0b
db 100b, 0b
db 100b, 0b
db 111b,11000000b
db 111110b, 0b
db 10b, 0b
db 10b, 0b
db 10b, 0b
db 10000b, 0b
db 1000b, 1000000b
db 100b,10000000b
db 111b, 0b
db 1110b, 0b
db 10010b, 0b
db 100001b, 0b
db 0b,10000000b
db 0b, 0b
db 10000b,10000000b
db 1001b, 0b
db 110b, 0b
db 110b, 0b
db 1001b, 0b
db 10000b,10000000b
db 0b, 0b
db 0b, 0b
db 0b, 0b
db 1001b, 0b
db 110b, 0b
db 110b, 0b
db 1001b, 0b
db 0b, 0b
db 0b, 0b
db 10000b, 0b
db 1000b, 1000000b
db 100b,10000000b
db 111b, 0b
db 1110b, 0b
db 10010b, 0b
db 100001b, 0b
db 0b,10000000b
db 0b, 0b
db 10000b,10000000b
db 1001b, 0b
db 110b, 0b
db 110b, 0b
db 1001b, 0b
db 10000b,10000000b
db 0b, 0b
db 0b, 0b
db 0b, 0b
db 1001b, 0b
db 110b, 0b
db 110b, 0b
db 1001b, 0b
db 0b, 0b
db 0b, 0b
db 1111b, 0b
db 10000b,10000000b
db 100000b, 1000000b
db 100110b, 1000000b
db 100110b, 1000000b
db 100000b, 1000000b
db 10000b,10000000b
db 1111b, 0b
; x + 3
db 10b, 0b
db 10b, 0b
db 10b, 0b
db 11b,11100000b
db 11111b, 0b
db 1b, 0b
db 1b, 0b
db 1b, 0b
db 1000b, 0b
db 100b, 100000b
db 10b, 1000000b
db 11b,10000000b
db 111b, 0b
db 1001b, 0b
db 10000b,10000000b
db 0b, 1000000b
db 0b, 0b
db 1000b, 1000000b
db 100b,10000000b
db 11b, 0b
db 11b, 0b
db 100b,10000000b
db 1000b, 1000000b
db 0b, 0b
db 0b, 0b
db 0b, 0b
db 100b,10000000b
db 11b, 0b
db 11b, 0b
db 100b,10000000b
db 0b, 0b
db 0b, 0b
db 1000b, 0b
db 100b, 100000b
db 10b, 1000000b
db 11b,10000000b
db 111b, 0b
db 1001b, 0b
db 10000b,10000000b
db 0b, 1000000b
db 0b, 0b
db 1000b, 1000000b
db 100b,10000000b
db 11b, 0b
db 11b, 0b
db 100b,10000000b
db 1000b, 1000000b
db 0b, 0b
db 0b, 0b
db 0b, 0b
db 100b,10000000b
db 11b, 0b
db 11b, 0b
db 100b,10000000b
db 0b, 0b
db 0b, 0b
db 111b,10000000b
db 1000b, 1000000b
db 10000b, 100000b
db 10011b, 100000b
db 10011b, 100000b
db 10000b, 100000b
db 1000b, 1000000b
db 111b,10000000b
; x + 4
db 1b, 0b
db 1b, 0b
db 1b, 0b
db 1b,11110000b
db 1111b,10000000b
db 0b,10000000b
db 0b,10000000b
db 0b,10000000b
db 100b, 0b
db 10b, 10000b
db 1b, 100000b
db 1b,11000000b
db 11b,10000000b
db 100b,10000000b
db 1000b, 1000000b
db 0b, 100000b
db 0b, 0b
db 100b, 100000b
db 10b, 1000000b
db 1b,10000000b
db 1b,10000000b
db 10b, 1000000b
db 100b, 100000b
db 0b, 0b
db 0b, 0b
db 0b, 0b
db 10b, 1000000b
db 1b,10000000b
db 1b,10000000b
db 10b, 1000000b
db 0b, 0b
db 0b, 0b
db 100b, 0b
db 10b, 10000b
db 1b, 100000b
db 1b,11000000b
db 11b,10000000b
db 100b,10000000b
db 1000b, 1000000b
db 0b, 100000b
db 0b, 0b
db 100b, 100000b
db 10b, 1000000b
db 1b,10000000b
db 1b,10000000b
db 10b, 1000000b
db 100b, 100000b
db 0b, 0b
db 0b, 0b
db 0b, 0b
db 10b, 1000000b
db 1b,10000000b
db 1b,10000000b
db 10b, 1000000b
db 0b, 0b
db 0b, 0b
db 11b,11000000b
db 100b, 100000b
db 1000b, 10000b
db 1001b,10010000b
db 1001b,10010000b
db 1000b, 10000b
db 100b, 100000b
db 11b,11000000b
; x + 5
db 0b,10000000b
db 0b,10000000b
db 0b,10000000b
db 0b,11111000b
db 111b,11000000b
db 0b, 1000000b
db 0b, 1000000b
db 0b, 1000000b
db 10b, 0b
db 1b, 1000b
db 0b,10010000b
db 0b,11100000b
db 1b,11000000b
db 10b, 1000000b
db 100b, 100000b
db 0b, 10000b
db 0b, 0b
db 10b, 10000b
db 1b, 100000b
db 0b,11000000b
db 0b,11000000b
db 1b, 100000b
db 10b, 10000b
db 0b, 0b
db 0b, 0b
db 0b, 0b
db 1b, 100000b
db 0b,11000000b
db 0b,11000000b
db 1b, 100000b
db 0b, 0b
db 0b, 0b
db 10b, 0b
db 1b, 1000b
db 0b,10010000b
db 0b,11100000b
db 1b,11000000b
db 10b, 1000000b
db 100b, 100000b
db 0b, 10000b
db 0b, 0b
db 10b, 10000b
db 1b, 100000b
db 0b,11000000b
db 0b,11000000b
db 1b, 100000b
db 10b, 10000b
db 0b, 0b
db 0b, 0b
db 0b, 0b
db 1b, 100000b
db 0b,11000000b
db 0b,11000000b
db 1b, 100000b
db 0b, 0b
db 0b, 0b
db 1b,11100000b
db 10b, 10000b
db 100b, 1000b
db 100b,11001000b
db 100b,11001000b
db 100b, 1000b
db 10b, 10000b
db 1b,11100000b
; x + 6
db 0b, 1000000b
db 0b, 1000000b
db 0b, 1000000b
db 0b, 1111100b
db 11b,11100000b
db 0b, 100000b
db 0b, 100000b
db 0b, 100000b
db 1b, 0b
db 0b,10000100b
db 0b, 1001000b
db 0b, 1110000b
db 0b,11100000b
db 1b, 100000b
db 10b, 10000b
db 0b, 1000b
db 0b, 0b
db 1b, 1000b
db 0b,10010000b
db 0b, 1100000b
db 0b, 1100000b
db 0b,10010000b
db 1b, 1000b
db 0b, 0b
db 0b, 0b
db 0b, 0b
db 0b,10010000b
db 0b, 1100000b
db 0b, 1100000b
db 0b,10010000b
db 0b, 0b
db 0b, 0b
db 1b, 0b
db 0b,10000100b
db 0b, 1001000b
db 0b, 1110000b
db 0b,11100000b
db 1b, 100000b
db 10b, 10000b
db 0b, 1000b
db 0b, 0b
db 1b, 1000b
db 0b,10010000b
db 0b, 1100000b
db 0b, 1100000b
db 0b,10010000b
db 1b, 1000b
db 0b, 0b
db 0b, 0b
db 0b, 0b
db 0b,10010000b
db 0b, 1100000b
db 0b, 1100000b
db 0b,10010000b
db 0b, 0b
db 0b, 0b
db 0b,11110000b
db 1b, 1000b
db 10b, 100b
db 10b, 1100100b
db 10b, 1100100b
db 10b, 100b
db 1b, 1000b
db 0b,11110000b
; x + 7
db 0b, 100000b
db 0b, 100000b
db 0b, 100000b
db 0b, 111110b
db 1b,11110000b
db 0b, 10000b
db 0b, 10000b
db 0b, 10000b
db 0b,10000000b
db 0b, 1000010b
db 0b, 100100b
db 0b, 111000b
db 0b, 1110000b
db 0b,10010000b
db 1b, 1000b
db 0b, 100b
db 0b, 0b
db 0b,10000100b
db 0b, 1001000b
db 0b, 110000b
db 0b, 110000b
db 0b, 1001000b
db 0b,10000100b
db 0b, 0b
db 0b, 0b
db 0b, 0b
db 0b, 1001000b
db 0b, 110000b
db 0b, 110000b
db 0b, 1001000b
db 0b, 0b
db 0b, 0b
db 0b,10000000b
db 0b, 1000010b
db 0b, 100100b
db 0b, 111000b
db 0b, 1110000b
db 0b,10010000b
db 1b, 1000b
db 0b, 100b
db 0b, 0b
db 0b,10000100b
db 0b, 1001000b
db 0b, 110000b
db 0b, 110000b
db 0b, 1001000b
db 0b,10000100b
db 0b, 0b
db 0b, 0b
db 0b, 0b
db 0b, 1001000b
db 0b, 110000b
db 0b, 110000b
db 0b, 1001000b
db 0b, 0b
db 0b, 0b
db 0b, 1111000b
db 0b,10000100b
db 1b, 10b
db 1b, 110010b
db 1b, 110010b
db 1b, 10b
db 0b,10000100b
db 0b, 1111000b

File diff suppressed because it is too large Load Diff

64
th04/spark_render.asm Normal file
View File

@ -0,0 +1,64 @@
; Draws the hardcoded spark sprite with the given ID, with ([x], [vram_y])
; pointing to the top-left point. Assumptions:
; • ES is already be set to the beginning of a VRAM segment
; • The GRCG is active, and set to the intended color
; void near fastcall spark_render(int x, int vram_y, int sprite_id);
public @spark_render
@spark_render proc near
push si
push di
mov si, ax ; SI = [x]
mov bx, dx ; BX = [vram_y]
sar ax, 3 ; x / 8
shl dx, 6 ; [vram_y] * 64
add ax, dx
shr dx, 2 ; (([vram_y] * 64) / 4) = [vram_y] * 16
add ax, dx
mov di, ax ; ([vram_y] * 64) + ([vram_y] * 16) = [vram_y * ROW_SIZE]
and si, 7 ; [x] & 7
mov ax, si
shl si, 7 ; *= SPARK_SIZE * SPARK_SPRITES (offset of X-shifted sprite)
add si, offset sSPARKS
and cx, 7 ; & (SPARK_SPRITES - 1)
shl cx, 4 ; * SPARK_SIZE
add si, cx
cmp bx, RES_Y - SPARK_H
ja short @@ywrap_needed
mov cx, SPARK_H ; CX = # of rows copied *before* Y wrap
xor bx, bx ; BX = # of rows copied *after* Y wrap
jmp short @@blit_loop
@@ywrap_needed:
mov cx, RES_Y
sub cx, bx
mov bx, SPARK_H
sub bx, cx
@@blit_loop:
lodsw
or ah, ah
jz short @@8px
mov es:[di], ax
jmp short @@next_row
@@8px:
or al, al
jz short @@next_row
mov es:[di], al
@@next_row:
add di, ROW_SIZE
loop @@blit_loop
or bx, bx
jz short @@ret
sub di, (ROW_SIZE * RES_Y)
xchg cx, bx
jmp short @@blit_loop
@@ret:
pop di
pop si
retn
@spark_render endp
even

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff