scroll left and right work in stdef and hidef adds octo test roms adds schip fonts to memory
105 lines
2.4 KiB
Plaintext
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
|