Trevor Merritt e29ac45c84 scroll down works on CHIP-8 and High-Res modes
scroll left and right work in stdef and hidef
adds octo test roms
adds schip fonts to memory
2024-10-27 11:41:25 -04:00

105 lines
2.4 KiB
Plaintext

###########################################
#
# Vertical Clip
#
# Sprite drawing routines which are capable
# of clipping a sprite along the top and
# bottom edges of the screen.
#
# These routines are designed with 'lores'
# 64x32 pixel graphics in mind.
#
# Sprite y coordinates must range between
# 17 and 64- at either extreme the sprite
# is completely invisible. If only a partial
# clip along one edge is necessary or
# other constraints can be added these
# routines could be simplified.
#
###########################################
:const HEIGHT 15 # sprite height
:const N_EDGE 32
:calc N_LIMIT { N_EDGE - HEIGHT }
:const S_EDGE 64
:calc S_LIMIT { S_EDGE - HEIGHT }
:alias offset vd # could be a temp register
:alias height vc # could be a temp register
:alias y vb
:alias x va
: flower
0x3C 0x66 0x57 0xB7 0xFB 0x7A 0x1A
0xC4 0x64 0x79 0x12 0x26 0x2C 0x10 0x08
: draw-sprite
# If our sprite is below the north edge,
# we don't need to perform top clipping:
if y >= N_EDGE then jump clip-s
# Calculate the number of pixels we should
# draw and the corresponding offset into
# the sprite data which should be used:
offset := N_EDGE
offset -= y
height := HEIGHT
height -= offset
# If we're entirely off the top edge,
# we don't need to draw anything:
if height == 0 then return
# Overwrite the lowest nybble of the 'sprite instruction
# to reflect the desired height:
v0 := height
i := nrows
save v0
v0 := 0
i := flower
i += offset
:next nrows sprite x v0 HEIGHT
;
: clip-s
# Calculate the number of pixels we
# should draw based on the height of the screen:
height := S_EDGE
height -= y
# Drawing a 0-height sprite has the unintended
# consequence of drawing a SuperChip 16x16 sprite,
# so we must break if the sprite is fully offscreen:
if height == 0 then return
# On the other hand, if we're far enough away from the
# bottom edge we should display the full sprite.
# We could skip this step if the sprite was always
# against the bottom edge:
if y < S_LIMIT then height := HEIGHT
# Overwrite the lowest nybble of the 'sprite' instruction
# to parameterize the sprite height on the fly.
# We must also preserve the y register setting, but
# that is known statically:
v0 := 0xB0
v0 += height
i := srows
save v0
i := flower
:next srows sprite x y HEIGHT
;
: main
x := 28
y := 32
loop
clear
draw-sprite
v0 := key
if v0 == 5 then y += -1
if v0 == 8 then y += 1
again