Skip to content

Commit

Permalink
Merge pull request #3 from scottjmoore/sprites
Browse files Browse the repository at this point in the history
Merge sprites into main branch
  • Loading branch information
scottjmoore authored Oct 31, 2021
2 parents 882caad + 3a6da95 commit a3642cd
Show file tree
Hide file tree
Showing 16 changed files with 1,161 additions and 637 deletions.
6 changes: 5 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,9 @@
Make sure git-lfs is installed and setup.

> sudo zypper in git-lfs
>
>
> git lfs install
Build the test sprite with:

> ./scripts/compilesprite.py -i assets/sprites/test_40x48.png -o build/test_40x48.asm -sw 40 -sh 48
3 changes: 3 additions & 0 deletions assets/sprites/batman.aseprite
Git LFS file not shown
3 changes: 3 additions & 0 deletions assets/sprites/batman.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions assets/sprites/explosion.aseprite
Git LFS file not shown
3 changes: 3 additions & 0 deletions assets/sprites/explosion.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 2 additions & 2 deletions assets/sprites/test_40x48.aseprite
Git LFS file not shown
4 changes: 2 additions & 2 deletions assets/sprites/test_40x48.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 2 additions & 2 deletions assets/tiles/intro_font.aseprite
Git LFS file not shown
4 changes: 2 additions & 2 deletions assets/tiles/intro_font.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
14 changes: 12 additions & 2 deletions makefile
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ ARCULATOR = ../../sarah-walker-pcem/arculator/hostfs

all: build/batman

build/batman: src/batman.asm src/tiles.asm build/level-1.bin build/main_title.bin build/intro_screen.bin build/intro_font.bin build/status_bar.bin build/palette_fade.bin build/level_1_map.asm
build/batman: src/batman.asm src/tiles.asm src/vidc.asm src/memc.asm build/level-1.bin build/main_title.bin build/intro_screen.bin build/intro_font.bin build/status_bar.bin build/palette_fade.bin build/level_1_map.asm build/batman_sprites.asm build/explosion.asm build/sincos.asm
vasmarm_std src/batman.asm -a2 -m2 -opt-ldrpc -opt-adr -L build/batman.lst -Fbin -o build/batman

build/level-1.bin: build/level-1.asm
Expand All @@ -15,7 +15,8 @@ build/intro_font.bin: build/intro_font.asm
vasmarm_std build/intro_font.asm -a2 -m2 -opt-ldrpc -opt-adr -L build/intro_font.lst -Fbin -o build/intro_font.bin

build/intro_font.asm: assets/tiles/intro_font.png
./scripts/png2asm.py -i assets/tiles/intro_font.png -o build/intro_font.asm -sw 8 -sh 8
# ./scripts/png2asm.py -i assets/tiles/intro_font.png -o build/intro_font.asm -sw 8 -sh 8
./scripts/compilesprite.py -i assets/tiles/intro_font.png -o build/intro_font.asm -sw 8 -sh 8

build/main_title.bin: build/main_title.asm
vasmarm_std build/main_title.asm -a2 -m2 -opt-ldrpc -opt-adr -L build/main_title.lst -Fbin -o build/main_title.bin
Expand Down Expand Up @@ -44,6 +45,15 @@ build/palette_fade.asm: assets/images/palette_fade.png
build/level_1_map.asm: assets/maps/level-1.tmx
./scripts/tmx2asm.py -i assets/maps/level-1.tmx -o build/level_1_map.asm

build/batman_sprites.asm: assets/sprites/batman.png
./scripts/compilesprite.py -i assets/sprites/batman.png -o build/batman_sprites.asm -sw 32 -sh 48

build/explosion.asm: assets/sprites/explosion.png
./scripts/compilesprite.py -i assets/sprites/explosion.png -o build/explosion.asm -sw 32 -sh 32

build/sincos.asm:
./scripts/sincos.py

clean:
@rm -f build/*
@rm -rf $(ARCULATOR)/!Batman
Expand Down
100 changes: 83 additions & 17 deletions scripts/compilesprite.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@

from pathlib import Path
from PIL import Image
from array import *

CLIP_BOTTOM=184
SCANLINE=352

parser = argparse.ArgumentParser(description='Compile indexed color PNG sprite to Acorn ARM assembler.')
parser.add_argument('-i', '--infile', nargs='+', type=argparse.FileType('rb'),default=sys.stdin)
Expand All @@ -27,6 +31,7 @@

sprite_width = args.spritewidth
sprite_height = args.spriteheight
sprite_frames = int(image_width / sprite_width) * int(image_height / sprite_height)

palette_name = filename + "_palette"
palette_type,palette_data = image.palette.getdata()
Expand All @@ -37,38 +42,99 @@

print("\ncompilesprite: '"+infile.name+"' => '"+outfile.name+"'")
print("\tImage size : "+f'{image_width}'+"x"+f'{image_height}')
print("\tSprite size : "+f'{sprite_width}'+"x"+f'{sprite_height}')
print("\tSprite size : "+f'{sprite_width}'+"x"+f'{sprite_height}'+f' * {sprite_frames} frames')

label_name = image_name.replace("-","_")
f_out.write(label_name+':\n')

f_out.write('\n'+label_name+'_sprites:\n')

for frame in range(0,sprite_frames):
f_out.write('\t.4byte\t\t'+label_name+f'_sprite_{frame}\n')

f_out.write('\ndraw_'+label_name+'_sprite:\n')

f_out.write('\tSTMFD SP!, {R0-R2,R11}\n')
f_out.write('\tCMP R1,#-16\n')
f_out.write('\tBLT draw_'+label_name+'_sprite_exit\n')
f_out.write('\tCMP R1,#'+f'{SCANLINE - 16}\n')
f_out.write('\tBGE draw_'+label_name+'_sprite_exit\n')
f_out.write('\tCMP R2,#'+f'{CLIP_BOTTOM}\n')
f_out.write('\tBGE draw_'+label_name+'_sprite_exit\n')
f_out.write('\tCMP R2,#'+f'{0 - sprite_height}\n')
f_out.write('\tBLE draw_'+label_name+'_sprite_exit\n')
f_out.write('\tCMP R0,#0\n')
f_out.write('\tMOVLT R0,#0\n')
f_out.write('\tCMP R0,#'+f'{sprite_frames}\n')
f_out.write('\tMOVGE R0,#0\n')
f_out.write('\tMOV R0,R0,LSL #2\n')
f_out.write('\tADD R11,R11,R1\n')
f_out.write('\tMOV R1,#'+f'{SCANLINE}\n')
f_out.write('\tCMP R2,#0\n')
f_out.write('\tMLAGT R11,R1,R2,R11\n')
f_out.write('\tADR R1,'+label_name+'_sprites\n')
f_out.write('\tLDR PC,[R1,R0]\n')
f_out.write('\ndraw_'+label_name+'_sprite_exit:\n')
f_out.write('\tLDMFD SP!, {R0-R2,R11}\n')
f_out.write('\tMOV PC, R14\n')

iy = 0
tile = 0

while iy < image_height:
ix = 0
while ix < image_width:
f_out.write(label_name+f'_sprite_{tile}'+':\n')
frame = {}

for y in range(0,sprite_height):
for colour in range(0,256):
frame[y,colour] = []

f_out.write('\n'+label_name+f'_sprite_{tile}_scanlines:\n')

y = 0
while y < sprite_height:
f_out.write('\t.4byte\t\t'+label_name+f'_sprite_{tile}_scanline_{y}\n')

x = 0
while x < sprite_width:
# b0 = image_pixels[ix + x + 0,iy + y]
# b1 = image_pixels[ix + x + 1,iy + y]
# b2 = image_pixels[ix + x + 2,iy + y]
# b3 = image_pixels[ix + x + 3,iy + y]
# b4 = image_pixels[ix + x + 4,iy + y]
# b5 = image_pixels[ix + x + 5,iy + y]
# b6 = image_pixels[ix + x + 6,iy + y]
# b7 = image_pixels[ix + x + 7,iy + y]
# f_out.write(f'0x{b0:02x},'+f'0x{b1:02x},'+f'0x{b2:02x},'+f'0x{b3:02x},'+f'0x{b4:02x},'+f'0x{b5:02x},'+f'0x{b6:02x},'+f'0x{b7:02x}')
x += 8
# if x >= sprite_width:
# f_out.write('\n')
# else:
# f_out.write(',')
colour = image_pixels[ix + x, iy + y]
if (colour != 159):
frame[y,colour].append(x)
x += 1
y += 1

f_out.write('\n'+label_name+f'_sprite_{tile}:\n')

f_out.write('\tCMP R2,#0\n')
f_out.write('\tBGE '+label_name+f'_sprite_{tile}_scanline_0\n')
f_out.write('\tMOV R0,#0\n')
f_out.write('\tSUB R0,R0,R2\n')
f_out.write('\tMOV R0,R0,LSL #2\n')
f_out.write('\tADR R1,'+label_name+f'_sprite_{tile}_scanlines\n')
f_out.write('\tLDR PC,[R1,R0]\n')

for i in range(0,sprite_height):
jj = -1
f_out.write('\n'+label_name+f'_sprite_{tile}_scanline_{i}:\n')

for j in range(0,256):
if len(frame[i,j]) > 0:
if jj != j:
f_out.write('\tMOV R0,#'+f'0x{j:02x}\n')
ii = i

for x in frame[i,j]:
f_out.write('\tSTRB R0,[R11,#'+f'{x:d}]\n')

f_out.write('\tADD R11,R11,#'+f'{SCANLINE}\n')
f_out.write('\tADD R2,R2,#1\n')
f_out.write('\tCMP R2,#'+f'{CLIP_BOTTOM}\n')
f_out.write('\tBEQ '+label_name+f'_sprite_{tile}_exit\n')

f_out.write('\n'+label_name+f'_sprite_{tile}_exit:\n')
f_out.write('\tLDMFD SP!, {R0-R2,R11}\n')
f_out.write('\tMOV PC,R14\n')

tile = tile + 1

ix += sprite_width
Expand Down
15 changes: 15 additions & 0 deletions scripts/sincos.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
#!/usr/bin/python3

import math

f_out = open("./build/sincos.asm","w")

f_out.write("sin:\n")
for deg in range(0,1024):
f_out.write(f"\t.4byte {int(math.sin(math.radians(deg * (360/1024))) * (1 << 20))}\n")

f_out.write("cos:\n")
for deg in range(0,1024):
f_out.write(f"\t.4byte {-1 * int(math.cos(math.radians(deg * (360/1024))) * (1 << 20))}\n")

f_out.close
Loading

0 comments on commit a3642cd

Please sign in to comment.