Les sprites hard de l'ASIC PrésentationLa 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 AsicChaque 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 Zune 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, activationChaque 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 : 0000xxyy00 : 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 transparenceLes 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 queles encres classiques du Plus.
Un programme exemple avec les sprites hardPour 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 onutilise 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 plusieurscombinaisons 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 mendcall 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! Roudoudou CPCrulez[Content Management System] v8.732-desktop/c Page créée en 147 millisecondes et consultée 46 foisL'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko. |
|