2019-06-03 14:08:29 +00:00
|
|
|
|
2019-06-06 19:40:31 +00:00
|
|
|
; FAST SPRITE ROUTINES FOR ASTROCADE
|
|
|
|
; fast_sprite_8: 8 (2 bytes) by H pixels, unexpanded
|
|
|
|
; fast_sprite_16: 16 (4 bytes) by H pixels, unexpanded
|
|
|
|
; Pattern format: bytewidth height data...
|
2019-06-03 14:08:29 +00:00
|
|
|
.area _CODE_ACFAST
|
|
|
|
|
|
|
|
;void fast_sprite_8(const byte* src, byte* dst) {
|
|
|
|
.globl _fast_sprite_8
|
|
|
|
_fast_sprite_8:
|
|
|
|
push ix
|
|
|
|
ld ix,#0
|
2019-06-06 19:40:31 +00:00
|
|
|
add ix,sp ; IX = arg pointer
|
2019-06-03 14:08:29 +00:00
|
|
|
ld l,4(ix) ; src (HL)
|
|
|
|
ld h,5(ix)
|
|
|
|
ld e,6(ix) ; dst (DE)
|
|
|
|
ld d,7(ix)
|
|
|
|
inc hl ; skip width
|
|
|
|
ld c,(hl) ; load height -> C
|
|
|
|
sla c ; C *= 2
|
|
|
|
ld b,#0 ; B always 0 (BC < 256)
|
2019-06-06 19:40:31 +00:00
|
|
|
inc hl ; move HL to pattern start
|
2019-06-03 14:08:29 +00:00
|
|
|
001$:
|
|
|
|
ldi
|
|
|
|
ldi ; copy 2 bytes src to dst
|
|
|
|
ld a,b ; 0 -> A, doesnt affect flags
|
|
|
|
ld (de),a ; copy 3rd 0 (for shifts)
|
|
|
|
jp po,002$ ; exit if BC == 0
|
|
|
|
ld a,e ; E -> A
|
|
|
|
add a,#38 ; next scanline (dest += 38)
|
|
|
|
ld e,a ; A -> E
|
|
|
|
jr nc,001$ ; loop unless lo byte overflow
|
|
|
|
inc d ; inc hi byte of dest. addr
|
|
|
|
jr 001$ ; loop to next line
|
|
|
|
002$:
|
|
|
|
pop ix
|
|
|
|
ret
|
2019-06-06 19:40:31 +00:00
|
|
|
|
|
|
|
;void fast_sprite_16(const byte* src, byte* dst) {
|
|
|
|
.globl _fast_sprite_16
|
|
|
|
_fast_sprite_16:
|
|
|
|
push ix
|
|
|
|
ld ix,#0
|
|
|
|
add ix,sp ; IX = arg pointer
|
|
|
|
ld l,4(ix) ; src (HL)
|
|
|
|
ld h,5(ix)
|
|
|
|
inc hl ; skip width
|
|
|
|
ld c,(hl) ; load height -> C
|
2019-07-06 18:41:15 +00:00
|
|
|
fast_sprite_16_clip_entry:
|
2019-06-06 19:40:31 +00:00
|
|
|
sla c
|
|
|
|
sla c ; C *= 4
|
|
|
|
ld b,#0 ; B always 0 (BC < 256)
|
|
|
|
inc hl ; move HL to pattern start
|
2019-07-06 18:41:15 +00:00
|
|
|
ld e,6(ix) ; dst (DE)
|
|
|
|
ld d,7(ix)
|
2019-06-06 19:40:31 +00:00
|
|
|
001$:
|
|
|
|
ldi
|
|
|
|
ldi
|
|
|
|
ldi
|
|
|
|
ldi ; copy 4 bytes src to dst
|
|
|
|
ld a,b ; 0 -> A, doesnt affect flags
|
|
|
|
ld (de),a ; copy 3rd 0 (for shifts)
|
|
|
|
jp po,002$ ; exit if BC == 0
|
|
|
|
ld a,e ; E -> A
|
|
|
|
add a,#36 ; next scanline (dest += 38)
|
|
|
|
ld e,a ; A -> E
|
|
|
|
jr nc,001$ ; loop unless lo byte overflow
|
|
|
|
inc d ; inc hi byte of dest. addr
|
|
|
|
jr 001$ ; loop to next line
|
|
|
|
002$:
|
|
|
|
pop ix
|
|
|
|
ret
|
2019-07-06 18:41:15 +00:00
|
|
|
|
|
|
|
;void fast_sprite_16_yclip(const byte* src, byte* dst, byte height) {
|
|
|
|
.globl _fast_sprite_16_yclip
|
|
|
|
_fast_sprite_16_yclip:
|
|
|
|
push ix
|
|
|
|
ld ix,#0
|
|
|
|
add ix,sp ; IX = arg pointer
|
|
|
|
ld l,4(ix) ; src (HL)
|
|
|
|
ld h,5(ix)
|
|
|
|
ld c,8(ix) ; height (C)
|
|
|
|
inc hl ; skip width
|
|
|
|
jp fast_sprite_16_clip_entry
|