Revenir au plan du site
Les sprites hard de l'ASIC
Présentation
La gamme Plus est capable de gérer des sprites hard. Attention, ils ont quelques particularités rapport aux sprites hard conventionnels que l'on peut trouver sur des consoles :
- Ils sont au nombre de 16 et possèdent leur propre mémoire. Cela veut dire qu'il faut copier les données dedans!
- Ils ont leur propre palette indépendante du fond de celle de l'écran : 15 couleurs + transparence pour l'encre 0
- Leur résolution est de 16x16 pixels sur 256 octets (4 bits utiles par octet)
- Leur taille à l'écran est propre à chaque sprite et indépendante de la résolution de l'écran
- Ils peuvent chevaucher des zones de scrolling SI le scrolling est réalisé avec les fonctionnalités du Plus
- Ils seront sujets à être tronqués/répétés si on mélange leur utilisation avec des techniques de scrolling de CPC
- On peut multiplexer leurs positions (si on change très vite leurs coordonnées, il est possible de les voir plusieurs fois sur l'écran visible)
Mémoire de stockage des sprites hard dans la page Asic
Chaque adresse de sprite tombant sur un multiple de 256, on peut index les sprites hard en utilisant uniquement le poids fort de l'adresse, et les remplir avec une incrémentation 8 bits qui déclenchera le flag Z
une fois arrivé au début du sprite suivant.
| Adresse | Taille | | Adresse | Taille |
Données du sprite 0 | #4000 | #100 (256) |
Données du sprite 8 | #4800 | #100 (256) |
Données du sprite 1 | #4100 | #100 (256) |
Données du sprite 9 | #4900 | #100 (256) |
Données du sprite 2 | #4200 | #100 (256) |
Données du sprite A | #4A00 | #100 (256) |
Données du sprite 3 | #4300 | #100 (256) |
Données du sprite B | #4B00 | #100 (256) |
Données du sprite 4 | #4400 | #100 (256) |
Données du sprite C | #4C00 | #100 (256) |
Données du sprite 5 | #4500 | #100 (256) |
Données du sprite D | #4D00 | #100 (256) |
Données du sprite 6 | #4600 | #100 (256) |
Données du sprite E | #4E00 | #100 (256) |
Données du sprite 7 | #4700 | #100 (256) |
Données du sprite F | #4F00 | #100 (256) |
Coordonnées des sprites, zoom, activation
Chaque sprite dispose de coordonnées écran indépendantes de la résolution de l'écran. La précision du X est analogue à la résolution mode 2.
La coordonnée Y correspond au numéro de ligne. le registre de zoom permet de désactiver le sprite si l'un des zooms est à zéro.
Les coordonnées sont minimisées et maximisées (-16/1024 pour le X, -64/512 pour le Y). Bien qu'elles paraissent lisibles, il est fortement déconseillé
de les lire, SAUF si vous n'utilisez que le poids faible. En effet, tous les bits ne renvoient pas de données, vous lisez la haute impédance!
Le zoom en X s'exprime dans les bits 2 et 3, le zoom en Y s'exprimt dans les bits 0 et 1 :
0000xxyy
00 : sprite non affiché
01 : zoom x 1
02 : zoom x 2
04 : zoom x 4
Le zoom minimal correspond à un pixel de taille mode 2, le zoom maximal correspond à un pixel de taille mode 0, étalé sur 4 lignes.
Note : Les registres ne sont pas contigus dans l'espace mémoire, ils sont alignés sur une adresse multiple de 8.
| Adresse | Taille | | Adresse | Taille |
position X du sprite 0 | #6000 | 2 | position X du sprite 1 | #6008 | 2 |
position Y du sprite 0 | #6002 | 2 | position Y du sprite 1 | #600A | 2 |
zoom du sprite 0 | #6004 | 1 | zoom du sprite 1 | #600C | 1 |
position X du sprite 2 | #6010 | 2 | position X du sprite 3 | #6018 | 2 |
position Y du sprite 2 | #6012 | 2 | position Y du sprite 3 | #601A | 2 |
zoom du sprite 2 | #6014 | 1 | zoom du sprite 3 | #601C | 1 |
position X du sprite 4 | #6020 | 2 | position X du sprite 5 | #6028 | 2 |
position Y du sprite 4 | #6022 | 2 | position Y du sprite 5 | #602A | 2 |
zoom du sprite 4 | #6024 | 1 | zoom du sprite 5 | #602C | 1 |
position X du sprite 6 | #6030 | 2 | position X du sprite 7 | #6038 | 2 |
position Y du sprite 6 | #6032 | 2 | position Y du sprite 7 | #603A | 2 |
zoom du sprite 6 | #6034 | 1 | zoom du sprite 7 | #603C | 1 |
position X du sprite 8 | #6040 | 2 | position X du sprite 9 | #6048 | 2 |
position Y du sprite 8 | #6042 | 2 | position Y du sprite 9 | #604A | 2 |
zoom du sprite 8 | #6044 | 1 | zoom du sprite 9 | #604C | 1 |
position X du sprite A | #6050 | 2 | position X du sprite B | #6058 | 2 |
position Y du sprite A | #6052 | 2 | position Y du sprite B | #605A | 2 |
zoom du sprite A | #6054 | 1 | zoom du sprite B | #605C | 1 |
position X du sprite C | #6060 | 2 | position X du sprite D | #6068 | 2 |
position Y du sprite C | #6062 | 2 | position Y du sprite D | #606A | 2 |
zoom du sprite C | #6064 | 1 | zoom du sprite D | #606C | 1 |
position X du sprite E | #6070 | 2 | position X du sprite F | #6078 | 2 |
position Y du sprite E | #6072 | 2 | position Y du sprite F | #607A | 2 |
zoom du sprite E | #6074 | 1 | zoom du sprite F | #607C | 1 |
Palette et transparence
Les sprites bénéficient d'une palette spécifique de 15 couleurs. L'encre 0 n'a pas de couleur, c'est la transparence. Les couleurs s'écrivent dans la page Asic sur la plage #6422-#643F de la même façon que
les encres classiques du Plus.
Un programme exemple avec les sprites hard
Pour notre exemple, nous avons besoin d'un sprite hard que voici (2 couleurs seulement et la transparence), le fichier converti est
[celui-ci, téléchargez-le!!!].
Vous remarquez qu'il fait 256 octet, c'est la taille exacte d'un sprite hard. Nous le copierons dans le sprite 0 et avec le clavier, on pourra le déplacer et jouer avec le zoom.

Et voici le source de démonstration : Le curseur pour déplacer le sprite (vous remarquerez que le déplacement plus précis en X est par conséquent deux fois plus lent car on
utilise le même incrément, il faudrait incrémenter deux fois pour avoir la même vitesse qu'en vertical). Touche espace pour changer le zoom de 0 à 15 (attention, il y a plusieurs
combinaisons qui font disparaitre le sprite!)
; initialisation, le grand classique, on commence à avoir l'habitude ;)
BUILDSNA : BANKSET 0 : ORG #38 : EI : RET
SNASET CPC_TYPE,4 ; modèle 6128+ conseillé
ORG #100 : RUN #100 : ld sp,#100
;*** RMR2 tags ***
ASICOFF equ 0
ROM0000 equ 0
ROM4000 equ %01000
ROM8000 equ %10000
ASICON equ %11000
ROM0 equ 0 : ROM1 equ 1 : ROM2 equ 2 : ROM3 equ 3 : ROM4 equ 4 : ROM5 equ 5 : ROM6 equ 6 : ROM7 equ 7
macro RMR2 tags
ld a,{tags}+%10100000
ld b,#7F
out (c),a
mend
call UnlockAsic : RMR2 ASICON
ld hl,#000 : ld (#6422),hl ; noir sur l'encre 1
ld hl,#FFF : ld (#6424),hl ; blanc sur l'encre 2
ld hl,sablier : ld de,#4000 : ld bc,256 : ldir ; copier le sprite
ei
;*************************
BouclePrincipale
;*************************
ld b,10
.attente halt : djnz .attente
call lectureMatriceClavier
ld a,(OCTET_CURSEUR_HAUT) : and BIT_CURSEUR_HAUT : jr nz,.pasHaut : ld hl,(posy) : dec hl : ld (posy),hl : .pasHaut
ld a,(OCTET_CURSEUR_BAS) : and BIT_CURSEUR_BAS : jr nz,.pasBas : ld hl,(posy) : inc hl : ld (posy),hl : .pasBas
ld a,(OCTET_CURSEUR_DROITE) : and BIT_CURSEUR_DROITE : jr nz,.pasDroite : ld hl,(posx) : inc hl : ld (posx),hl : .pasDroite
ld a,(OCTET_CURSEUR_GAUCHE) : and BIT_CURSEUR_GAUCHE : jr nz,.pasGauche : ld hl,(posx) : dec hl : ld (posx),hl : .pasGauche
ld a,(OCTET_TOUCHE_ESPACE) : and BIT_TOUCHE_ESPACE : jr nz,.pasEspace
ld a,(zoom) : inc a : and 15 : ld (zoom),a
; pour éviter changer trop vite le zoom, on attend le relâchement de la touche
.relacheEspace call lectureMatriceClavier
ld a,(OCTET_TOUCHE_ESPACE) : and BIT_TOUCHE_ESPACE : jr z,.relacheEspace
.pasEspace
; valider les positions et le zoom
ld hl,(posx) : ld (#6000),hl
ld hl,(posy) : ld (#6002),hl
ld a,(zoom) : ld (#6004),a
jp BouclePrincipale
; valeurspar défaut, au centre et en équivalent mode 1
posx defw 312
posy defw 92
zoom defb %1001
;---------------------------------------
OCTET_CURSEUR_HAUT equ matriceClavier : BIT_CURSEUR_HAUT equ 1
OCTET_CURSEUR_DROITE equ matriceClavier : BIT_CURSEUR_DROITE equ 2
OCTET_CURSEUR_BAS equ matriceClavier : BIT_CURSEUR_BAS equ 4
OCTET_CURSEUR_GAUCHE equ matriceClavier+1 : BIT_CURSEUR_GAUCHE equ 1
OCTET_TOUCHE_ESPACE equ matriceClavier+5 : BIT_TOUCHE_ESPACE equ 128
;---------------------------------------
lectureMatriceClavier
di ; Vous n'avez pas besoin de couper les interruptions
; si il n'y a pas de routine sonore sous interruption
ld hl,matriceClavier
ld bc,#f782
out (c),c
ld bc,#f40e
ld e,b
out (c),c
ld bc,#f6c0
ld d,b
out (c),c
out (c),0
ld bc,#f792
out (c),c
ld a,#40
ld c,d
.loop ld b,d
out (c),a ; sélectionner la ligne
ld b,e
ini ; lire et stocker dans notre tableau
inc a
inc c
jr nz,.loop
ld bc,#f782
out (c),c
ei ; pas besoin d'activer les interruptions si on ne les a pas coupées
ret
matriceClavier defs 10,#FF
;---------------------------------------
UnlockAsic
ld bc,#BCFF
out (c),c
out (c),0
ld hl,%1001000011101010
.loop
out (c),c
ld a,h:rlca:ld h,l:ld l,a
srl c:res 3,c
and #88
or c
ld c,a
cp #4D
jr nz,.loop
ld a,#CD
out (c),a : out (c),a
ret
sablier incbin 'sablier.bin' ; notre sprite hard de sablier!
|