Changes
<pre>
;;------------------------------------------------------------------------
;; RLE compressed hardware sprites
;;
;; This example will only run on the CPC+.
;;
;; In this example:
;;
;; - An animation sequence is defined by a sequence of images (frames)
;; - The first frame is stored completely, subsequent frames are stored in a compressed
;; format, where the data represents the differences between the new frame and the
;; previous frame. (Each frame is a "delta" of the previous frame)
;; - The sequence must be played from the beginning to the end for the
;; result to be correct; otherwise there will be errors.
;; this code must not be in the range &4000-&7fff, because it must
;; run when the CPC+ hardware registers are active in this range.
org &8000
nolist
;;----------------------------------------------------------------------
;; unlock asic to gain access to asic registers
di
ld b,&bc
ld hl,sequence
ld e,17
.seq
ld a,(hl)
out (c),a
inc hl
dec e
jr nz,seq
;;----------------------------------------------------------------------
;; set initial sprite frame
xor a
ld (sprite_frame),a
call update_sprite
ld a,(sprite_frame)
inc a
ld (sprite_frame),a
;;----------------------------------------------------------------------
;; update sprite ram with image data
;;
;; DE = points to CPC+ hardware sprite RAM
;; A = index of sprite frame
.update_sprite
;; page in ASIC hardware registers
ld bc,&7fb8
out (c),c
ld a,(sprite_frame) ;; sprite frame
ld l,a
add hl,hl ;; x2 to get offset in table
ld bc,sprite_frames ;; base of table
add hl,bc ;; address of entry in table
ld a,(hl) ;; get entry from table (address of sprite frame)
inc hl
ld h,(hl)
ld l,a
call rle_decode_sprite
;; page out ASIC hardware registers
ld bc,&7fa0
out (c),c
ret
;;----------------------------------------------------------------------
;; decode compressed sprite pixel data into the CPC+ hardware sprite RAM
;;
;; HL = points to compressed sprite data pixel data
;; DE = points to CPC+ hardware sprite RAM
;; HL,DE,BC corrupt
;;
;; compressed sprite pixel data format:
;;
;; The data is a list of one or more "packets".
;; Each packet has a code byte with parameters dependant on the value of the code byte.
;;
;; code byte:
;; 0 = end of compressed data, no parameters
;; -ve = no parameters. negate code byte to get number of bytes to add onto current DE
;; +ve = number of bytes to copy to hardware sprite RAM, followed by the actual bytes
.rle_decode_sprite
.rle_next
ld a,(hl) ;; get code
inc hl
or a
ret z ;; quit if end of compressed data code
jp m,rle_move
;; +ve code. Code is the number of bytes to copy to hardware sprite RAM
;; the bytes to copy follow the code.
ld b,a
ld c,0 ;; BC = count
ldir ;; transfer
jr next
.rle_move
neg
add a,e
ld e,a
jr next
;;----------------------------------------------------------------------
.sprite_frame
defb 0 ;; index of current frame
;; pointer to data for each sprite frame
.sprite_frames
defw frame0
defw frame1
defw frame2
defw frame3
;;----------------------------------------------------------------------
;; this is the sequence to unlock the ASIC extra features
.sequence
defb &ff,&00,&ff,&77,&b3,&51,&a8,&d4,&62,&39,&9c,&46,&2b,&15,&8a,&cd,&ee
</pre>
;;------------------------------------------------------------------------
;; RLE compressed hardware sprites
;;
;; This example will only run on the CPC+.
;;
;; In this example:
;;
;; - An animation sequence is defined by a sequence of images (frames)
;; - The first frame is stored completely, subsequent frames are stored in a compressed
;; format, where the data represents the differences between the new frame and the
;; previous frame. (Each frame is a "delta" of the previous frame)
;; - The sequence must be played from the beginning to the end for the
;; result to be correct; otherwise there will be errors.
;; this code must not be in the range &4000-&7fff, because it must
;; run when the CPC+ hardware registers are active in this range.
org &8000
nolist
;;----------------------------------------------------------------------
;; unlock asic to gain access to asic registers
di
ld b,&bc
ld hl,sequence
ld e,17
.seq
ld a,(hl)
out (c),a
inc hl
dec e
jr nz,seq
;;----------------------------------------------------------------------
;; set initial sprite frame
xor a
ld (sprite_frame),a
call update_sprite
ld a,(sprite_frame)
inc a
ld (sprite_frame),a
;;----------------------------------------------------------------------
;; update sprite ram with image data
;;
;; DE = points to CPC+ hardware sprite RAM
;; A = index of sprite frame
.update_sprite
;; page in ASIC hardware registers
ld bc,&7fb8
out (c),c
ld a,(sprite_frame) ;; sprite frame
ld l,a
add hl,hl ;; x2 to get offset in table
ld bc,sprite_frames ;; base of table
add hl,bc ;; address of entry in table
ld a,(hl) ;; get entry from table (address of sprite frame)
inc hl
ld h,(hl)
ld l,a
call rle_decode_sprite
;; page out ASIC hardware registers
ld bc,&7fa0
out (c),c
ret
;;----------------------------------------------------------------------
;; decode compressed sprite pixel data into the CPC+ hardware sprite RAM
;;
;; HL = points to compressed sprite data pixel data
;; DE = points to CPC+ hardware sprite RAM
;; HL,DE,BC corrupt
;;
;; compressed sprite pixel data format:
;;
;; The data is a list of one or more "packets".
;; Each packet has a code byte with parameters dependant on the value of the code byte.
;;
;; code byte:
;; 0 = end of compressed data, no parameters
;; -ve = no parameters. negate code byte to get number of bytes to add onto current DE
;; +ve = number of bytes to copy to hardware sprite RAM, followed by the actual bytes
.rle_decode_sprite
.rle_next
ld a,(hl) ;; get code
inc hl
or a
ret z ;; quit if end of compressed data code
jp m,rle_move
;; +ve code. Code is the number of bytes to copy to hardware sprite RAM
;; the bytes to copy follow the code.
ld b,a
ld c,0 ;; BC = count
ldir ;; transfer
jr next
.rle_move
neg
add a,e
ld e,a
jr next
;;----------------------------------------------------------------------
.sprite_frame
defb 0 ;; index of current frame
;; pointer to data for each sprite frame
.sprite_frames
defw frame0
defw frame1
defw frame2
defw frame3
;;----------------------------------------------------------------------
;; this is the sequence to unlock the ASIC extra features
.sequence
defb &ff,&00,&ff,&77,&b3,&51,&a8,&d4,&62,&39,&9c,&46,&2b,&15,&8a,&cd,&ee
</pre>