CODING ★ Cours CPC Plus par AST / IMPACT ★

Cours CPC Plus par AST / IMPACT

» Cours CPC Plus par AST - Utiliser les Fonctionnalitées supplémentaires du CPC+
» Cours CPC Plus par AST - Gestion des Couleurs CPC+
» Cours CPC Plus par AST - Gestion des Couleurs des Sprites Hard
» Cours CPC Plus par AST - Les Sprites Hard
» Cours CPC Plus par AST - Les Sprites Hard ( Suite et Fin )
» Cours CPC Plus par AST - La Gestion des SplitScreens
» Cours CPC Plus par AST - La Gestion des Canaux DMA

CODINGUtiliser les Fonctionnalitées supplémentaires du CPC+ ( volume 1 ) ★

Pour l'inauguration de notre Forum CPC+, j'ai décidé de faire une série d'article sur la Programmation de l'Asic.

Il faut savoir que l'Asic permet d'utiliser beaucoup de nouvelles fonctions absentes sur les Cpc Old (Ancienne génération) comme, 4096 couleurs, 16 Sprites Hard Zoomables, des Splits Screens facilités, les Interruptions, les canaux Dma...

Pour cette première partie, j'ai trouvé utile de vous livrer la séquence de Delockage de l'Asic... Entrons tout de suite dans le vif du sujet...

Routine réalisée sous Dams...

Delock DI ; ; Interdit les Interruptions
LD E,17 ; 17 octets à envoyer aux Crtc
LD HL,ASIC ; Table des valeurs à envoyer
LD BC,#BC00
Loop LD A,(HL) ; Met la valeur de la table dans le reg A
OUT (C),A ; Envoie la valeur au Crtc
INC HL ; HL=HL+1
DEC E ; E=E-1
JR NZ,Loop ; Tant que E n'est pas égal à 0, on continue...
EI ;; Merci Iron... même si ce n'était pas nécessaire !
RET
ASIC DEFB 255,0,255,119,179
DEFB 81,168,212,98,57,156
DEFB 70,43,21,138,205,238 ; Voilà les 17 valeurs à envoyer au Crtc.

Une fois cette routine Lancée, Il reste encore deux fonctions a retenir.

LD BC,#7FB8
OUT (C),C ; ; Active les Fonctions supp. du CPC+
...

et

LD BC,#7FA0
OUT (C),C ; ; Désactive les Fonctions supp. du CPC+

...

Voilà, pour ce premier Jet... Si vous avez des questions... Vous savez ou nous trouver...');

AsT / Impact - http://impact-cpc.fr.nf/index.php/topic,19.0.html

CODINGGestion des couleurs CPC+ ★

Ah... Enfin... voici le second volume de la Programmation sur CPC+...
Aujourd'hui nous allons passer aux choses sérieuses et voir comment utiliser les 4096 couleurs du CPC+.

Ps : J'espère que cette fois-ci ce volume ne passera pas aux oubliettes, n'est-ce pas Eno ?

Entrons maintenant dans le vif du sujet.

La palette du CPC+ est composée de 4096 (de #000 à #FFF) couleurs dont 32 utilisables simultanément.

On peut distinguer :

— 16 couleurs maxi pour l'ecran (mode 0)
— 15 couleurs maxi pour les Sprites Hard (que nous verrons dans le prochain volume)
— 01 couleur pour le Border.

A. Changement des couleurs de l'ecran

#6400 - Pen 0 - #6412 - Pen 9
#6402 - Pen 1 - #6414 - Pen 10
#6404 - Pen 2 - #6416 - Pen 11
#6406 - Pen 3 - #6418 - Pen 12
#6408 - Pen 4 - #641a - Pen 13
#640a - Pen 5 - #641c - Pen 14
#640c - Pen 6 - #641e - Pen 15
#640e - Pen 7 - #6420 - Border
#6410 - Pen 8

Le changement de couleur se révèle être assez simple quand même :

Ex:

DI
CALL Delock ;(Effacé par mégarde par Eno - Vu Chapitre 1)
LD BC,#7FB8
OUT (C),C ; Asic on
LD HL,#000 ; chargement de la couleur (GRB - dans cet ordre)
LD (#6420),HL ; adresse #6420=Border... Ici on met le border à Zéro!

... etc...

Le principe est assez simple : on charge le registre hl avec la valeur de la couleur puis on l'affecte à une adresse Asic.

Voilà qui clôt aujourd'hui le Volume 2, sur la gestion des couleurs...

Prochain Volume, gestions des couleurs Sprites Hard avec une petite routine pour afficher un raster !

Sur ce, Bonne continuation à tous !

AsT / Impact - http://impact-cpc.fr.nf/index.php/topic,51.0.html

CODINGGestion des Couleurs des Sprites Hard ★

Pour continuer où nous en étions, je vais cette fois-ci vous aider à vous familiariser avec la Table des Couleurs des Sprites Hard du CPC+...

A. Tables des couleurs des Sprites Hard

#6422 - Couleur Spr Pen 1
#6424 - Couleur Spr Pen 2
#6426 - Couleur Spr Pen 3
#6428 - Couleur Spr Pen 4
#642a - Couleur Spr Pen 5
#642c - Couleur Spr Pen 6
#642e - Couleur Spr Pen 7
#6430 - Couleur Spr Pen 8
#6432 - Couleur Spr Pen 9
#6434 - Couleur Spr Pen 10
#6436 - Couleur Spr Pen 11
#6438 - Couleur Spr Pen 12
#643a - Couleur Spr Pen 13
#643c - Couleur Spr Pen 14
#643e - Couleur Spr Pen 15

Le principe de changement des couleurs pour les sprites demeure le même que celui du changement de la palette de couleur de l'ecran.

Ex :

DI ; On interdit les Interruptions...
CALL Delock ; Routine citée dans le premier article pour Deverrouiller l'Asic.
LD BC,#7FB8
OUT (C),C ; Autorise les Fonctions supp du CPC+
LD HL,#0F0 ; Comme dans l'article précèdent les couleurs sont de type GRB soit ici, on demande du rouge
LD (#642A),HL ; On envoie la val à l'adresse de l'Asic Pen 5 des Spr.
... ; #642A=Pen 5
..... etc
...

B. Exemple Concret

Voici maintenant, juste pour se détendre une petite routine pour afficher un dégradé de couleurs (Raster, of course ;-) )

Ld hl,#000 ; Selectionne encre noire
Ld (#6400),hl ; Pen 0
Ld hl,#F00 ; On selectionne le vert
Ld b,16 ; nbre de couleurs (ici 16)
loop1
Ld (#6400),hl ; 3 Nops
Inc hl ; 2 Nops
Defs 64-3-2-3-1,0
Djnz loop1 ; 3 Nops

Ret ; 1 Nop

Voilà, vous devriez vous retrouver à l'écran avec un simple dégradé de couleurs sur 16 nuances... héhé...
Bien entendu, cette routine peut bien évidement être optimisée, n'est-ce pas Cmp ?

Sur cette belle lecture, je vous laisse jusqu'au prochain volume : La Gestion des Sprites Hard.

Hasta la vista Babies !

AsT / Impact - http://impact-cpc.fr.nf/index.php/topic,58.0.html

CODINGLes Sprites Hard ★

Une des choses les plus intéressantes sur CPC+, est l'utilisation des sprites Hard.

En effet, nous pouvons redéfinir 16 sprites hard zoomables (3 modes, 640*200, 320*200 et 160*200) avec 16 couleurs complètement différentes de celle utilisées par l'ecran. (Je vous rappelle que l'on a déjà vu cela dans le volume précédent...)
Voyons donc cela d'un peu plus près...

Les sprites Hard du CPC+ sont définis à partir de manière linéaire de l'adresse #4000 à #4FFF. Chaque sprite à une taille correspondante à 256 Octets.

#4000 - Sprite 0
#4100 - Sprite 1
#4200 - Sprite 2
#4300 - Sprite 3
#4400 - Sprite 4
#4500 - Sprite 5
#4600 - Sprite 6
#4700 - Sprite 7
#4800 - Sprite 8
#4900 - Sprite 9
#4A00 - Sprite #0A (10)
#4B00 - Sprite #0B (11)
#4C00 - Sprite #0C (12)
#4D00 - Sprite #0D (13)
#4E00 - Sprite #0E (14)
#4F00 - Sprite #0F (15)

Les sprites sont définis de manière linéaire soit 16 octets sur 16 lignes. Plus concrètement, chaque Octet peut avoir une valeur comprise entre 0 et 15. Cette valeur est définie comme étant la couleur du pixel.

ex : pixel 0=coul1; pixel 2=coul3; pixel 4=coul5;pixel15=coul3
pour le reste des pixels, ils seront tous à zéro.
Je rappelle que pour le CPC+ la couleur 0 des sprites est transparente (on voit à travers).
ça donne pour la première ligne du sprite :

#01,#03,0,0,#05,0,0,0,0,0,0,0,0,0,#03 ; il reste encore 15 lignes à definir pour ce sprite (!)

Voilà pour les explications aujourd'hui...
Le prochain volume parlera de la position des sprites (x,y) ainsi que de leurs possibilités de zoom (0,1,2,3)...

Vous avez des questions, n'hésitez pas, n'est ce pas Grumly ?!?

AsT / Impact (sans le Di, aujourd'hui...) - http://impact-cpc.fr.nf/index.php/topic,429.0.html

CODINGLes Sprites Hard (Volume 4 - Suite et Fin) ★

Aujourd'hui nous allons donc clôturer ce Volume 4 sur les Sprites Hard...
Commençons d'abord par expliquer comment ça marche...

1-On Delock l'Asic

Delock DI ;; Interdit les Interruptions
; ; (Ne sert à rien si on ne fait
; ; pas joujou avec les interruptions...)
LD E,17 ; 17 octets à envoyer aux Crtc
LD HL,ASIC ; Table des valeurs à envoyer
LD BC,#BC00
Loop LD A,(HL) ; Met la valeur de la table dans le reg A
OUT (C),A ; Envoie la valeur au Crtc
INC HL ;; HL=HL+1
DEC E ; E=E-1
JR NZ,Loop ; Tant que E n'est pas égal à 0, on continue...
RET
ASIC DEFB 255,0,255,119,179
DEFB 81,168,212,98,57,156
DEFB 70,43,21,138,205,238 ; Voilà les 17 valeurs à envoyer au CRTC
; ;; (Un grand merci à Longshot pour avoir
; ;; fourni ces "précieux" octets !)

2-On active les fonctions supp. de l'Asic

LD BC,#7FB8 ; Active les fonctions suppl. de l'Asic
OUT (C),C

3-On défini ses sprites...

Petit Rappel : chaque sprites fait 256 octets... chaque octet du sprite est en fait un pixel de couleur qui peut varier de 0 à 15... soit 256 pixels/sprite. 0 étant la couleur transparente.
D'autres infos : voir chapitre précédent (Les Sprites Hard)

4-On Défini la résolution du sprite

00- Sprite pas affiché
01 -Sprite résolution 640 (magnify x1 - mode 2)
10 -Sprite résolution 320 (magnify x2 - mode 1)
11 -Sprite résolution 160 (magnify x4 - mode 0)

La résolution s'applique pour X et Y...

#6004 - Sprite 0 reso
#600c - Sprite 1 reso
#6014 - Sprite 2 reso
#601c - Sprite 3 reso
#6024 - Sprite 4 reso
#602c - Sprite 5 reso
#6034 - Sprite 6 reso
#603c - Sprite 7 reso
#6044 - Sprite 8 reso
#604c - Sprite 9 reso
#6054 - Sprite 10 reso
#605c - Sprite 11 reso
#6064 - Sprite 12 reso
#606c - Sprite 13 reso
#6074 - Sprite 14 reso
#607c - Sprite 15 reso

un exemple concert :

pour définir la résolution du sprite 0 :

LD A,%00001001 ; reso x=mode 1 (#10), reso y=mode 2(#01)
LD (#6004),A ; le sprite 0 sera affiché en résolution X x2 et Y x1.

5-On défini ses coordonnées à l'écran :

Chaque coordonnée est définie par un registre 16 bits... Chaque sprite se déplace au pixel près soit pour un écran de 80 octets de large et de 25 lignes de haut (val normale du reg 1 et du reg 6 du crtc) 640 pixel de large (x) et 200 lignes de haut (y)...
Ces valeurs peuvent changer selon les valeurs données au registre 1 et 6 du crtc. Le border défini la valeur maximum de x ainsi que de y. Ainsi un sprite ne pourra jamais être affiché avant et après le border.

Comme d'habitude, quelques adresses :

#6000 - Spr 0 Pos X
#6002 - Spr 0 Pos Y
#6008 - Spr 1 Pos X
#600a - Spr 1 Pos Y
#6010 - Spr 2 Pos X
#6012 - Spr 2 Pos Y
#6018 - Spr 3 Pos X
#601a - Spr 3 Pos Y
#6020 - Spr 4 Pos X
#6022 - Spr 4 Pos Y
#6028 - Spr 5 Pos X
#602a - Spr 5 Pos Y
#6030 - Spr 6 Pos X
#6032 - Spr 6 Pos Y
#6038 - Spr 7 Pos X
#603A - Spr 7 Pos Y
#6040 - Spr 8 Pos X
#6042 - Spr 8 Pos Y
#6048 - Spr 9 Pos X
#604a - Spr 9 Pos Y
#6050 - Spr 10 Pos X
#6052 - Spr 10 Pos Y
#6058 - Spr 11 Pos X
#605a - Spr 11 Pos Y
#6060 - Spr 12 Pos X
#6062 - Spr 12 Pos Y
#6068 - Spr 13 Pos X
#606a - Spr 13 Pos Y
#6070 - Spr 14 pos X
#6072 - Spr 14 Pos Y
#6078 - Spr 15 Pos X
#607a - Spr 15 Pos Y

Continuons l'exemple plus haut :
donc pour la position (x,y) du Sprite 0 :

2 adresses importantes : #6000 (x) et #6002 (y)

exemple : je veux afficher mon sprite 0 au coordonnées (300, 200)

LD HL,#6000 ; Position X
LD DE,#6002 ; Position Y
LD BC,300 ; X
LD A,200 ; Y
LD (HL),C
INC L
LD (HL),B ; Envoie de la position x à l'adresse Spr0X
LD (DE),A ; Envoie de la position y à l'adresse Spr0Y

....

Conclusion

Voilà donc qui conclut ce Volume 4 sur les Sprites Hard... Vos questions sont les bienvenues... Pour les réfractaires Anti-CPC+, je vous donne rendez vous pour le Volume 5... La gestions des Splits Screen... Raaahhhh...

AsT / Impact - http://impact-cpc.fr.nf/index.php/topic,545.0.html

CODINGLa Gestion des SplitScreens ★

Avant de commencer à entrer dans le vif du sujet, je voudrais faire un bref rappel concernant les SplitScreen, technique plus connue sous le nom de Rupture. (cf : Longshot – Merci à toi vieux pour nous avoir offert tant de plaisir)

Mais alors quezako la Rupture ? La Rupture est une technique qui permet de séparer l'écran en plusieurs zones (horizontale ou verticale, selon le type de ruptures souhaitées) ce qui permet alors de changer l'adresse écran plusieurs fois par VBL et pourquoi pas, plusieurs fois par ligne comme on le ferait avec un Raster.

Sur CPC+, cette facilité est autorisée grâce à plusieurs adresses situées dans la Page I/O de l'Asic.

Vous l'aurez certainement deviné, il faut avant toute chose, Delocker l'Asic (Voir Volume 1 pour plus d'explications), puis ensuite activer les fonctions supplémentaires du CPC+ ou la page Asic par la commande qui commence déjà à être bien connue, j'ai nommé : out &7f00,&b8...

En Assembleur :

LD BC,#7FB8
OUT (C),C ; ; Active les Fonctions supp. du CPC+
...

Pour le reste, les adresses importantes à retenir pour réaliser une Rupture :

#6800 - PRI
#6801 - SPLT
#6802 - SSA
#6804 - SSCR

Voyons maintenant plus en détail ces 4 Adresses...

  • Le PRI (#6800) ou Programmable Raster Interrupt scan line est en fait l'adresse qui sert à demander un interruption à la ligne numéro X. Le PRI est codé sur 8 Bits (0-255). Une valeur à 0 du PRI fera fonctionner les interruption normalement. Le PRI peut être programmé plusieurs fois et produire plusieurs interruptions par VBL.
  • Le SPLT (#6801) ou screen SPLiT scan line est l'adresse qui permet de demander à quelle ligne doit se produire la Rupture d'écran. Le SPLT est aussi codé sur 8 Bits (0-255). Mettre la valeur du SPLT à zéro revient à ne faire aucun split. Le SPLT peut être aussi reprogrammé plusieurs fois et produire ainsi plusieurs Splits par VBL.
  • Le SSA (#6802-#6803) ou Screen Split secondary start Adress est l'adresse qui permet de gérer les adresses écran... L'adresse #6802 correspond au Reg 13 et #6803 au Reg 12 du Crtc.
  • Le SSCR (#6804) ou Soft Scroll Control Register est l'adresse qui permet de gérer des Scrollings Hard Horizontaux ou Verticaux au pixel près. Le SSCR est codé sur 8 Bits. Mettre sa valeur à 0 réinitialise son compteur... Modifier le Bits 0 à 3 permet de réaliser un scrolling horizontal au pixel (Attention aux Mode 0, 1 et 2). Modifier les Bits 4 à 6 permet de réaliser un scrolling vertical à la ligne. Mettre 1 dans la Bit 7 permet de faire disparaître le Bug des scrolling horizontaux qui apparaissaient à gauche de l'écran...

Maintenant que nous avons vu les différentes adresse de l'Asic se rapportant aux SplitScreens voyons tout de suite comment gérer celà.

  1. Créer une Interruption à la ligne X
  2. Positionner son Split
  3. Entrer son adresse écran

Passons maintenant au code c'est bien plus marquant...

; Définition des adresses Asic.
PRI equ #6800
SPLT equ PRI+1
SSA equ PRI+2
SSCR equ PRI+4
;
LD A,31-1 ; Créer une interruption à la ligne 31
LD (PRI),A
INC A
LD (SPLT),A ; Le Split sera à la ligne Interruption+1
HALT
LD HL,#0030 ; Le poids fort et le Poids Faible sont inversés. H=reg 13 L=Reg 12
LD (SSA),HL ; Adresse écran #C000
...
LD A,47-1 ; Créer une interruption à la ligne 47
LD (PRI),A
INC A
LD (SPLT),A ; Le Split sera à la ligne Interruption+1
HALT
LD HL,#0020 ; Le poids fort et le Poids Faible
; ; sont inversés. H=reg 13 L=Reg 12
LD (SSA),HL ; Adresse écran #8000
....

Dans cet exemple, nous avons 3 Zones Splits :

  • De la ligne 0 à la ligne 31 appelés Zone 1
  • De la ligne 32 à la ligne 47 appelés Zone 2
  • De la ligne 48 à la fin appelés Zone 3

Donc 3 Ruptures... Il ne faudra pas oublier de donner une adresse écran à la Zone 1...

Voilà qui clôt donc aujourd'hui ce Volume 5, sur la gestion des SplitScreens. Je pensais peut être développer un peu plus ce chapitre pour votre parler de la Rupture ligne à ligne sur CPC+... Mais est-ce bien nécessaire ?

Petit concours perso... Vous avez du remarquer que j'ai omis d'utiliser l'adresse du SSCR (#6804)... Vous savez maintenant faire une Rupture sur CPC+... Qui nous proposera le listing source d'une rupture Simple 2 écrans (zone 1 et zone 2) avec un scroll hard horizontal en mode 1 au pixel ?

Petit indice : utiliser seulement les bits 0 à 3 du SSCR... sans oublier le Bit 7, héhé... sacré bit 7 !

Si vous avez des questions, ou si vous voyez des erreurs dans cet article, faites nous en part.

Allez, je vous laisse savourer le plaisir des Ruptures sur CPC+. On attend vos Démos !

AsT / Impact - http://impact-cpc.fr.nf/index.php/topic,1336.0.html

CODINGLa Gestion des Canaux DMA ★

Nous attaquons maintenant un des sujets dont j'ai le plus à cœur... Les fameux canaux DMA... Sur nos cher CPC+, nous avons accès à 3 canaux DMA. DMA=Direct Memory Acces (Accès Direct à la mémoire)... Mais à quoi ça sert d'avoir des canaux Dma ?

Et bien, ces canaux Dma servent à envoyer des données au PSG (Programmable Sound Generator, le générateur de son quoi !) sans déranger le Z80 dans son travail....

Ca permet de faire des choses impressionnantes et encore jamais vues sur cette machine telle que, les Sons Sid, du Sync Buzzer ou même plus récemment des musiques de type MOD, bien connues sur nos cher Amiga !

Il ne faut absolument pas confondre les canaux Dma, qui sont rappelons le au nombre de 3, avec les 3 canaux A,B et C du Processeur sonore...

Ce qu'il faut savoir, c'est que lorsque vous utilisez les instructions Dma, celles ci seront exécutées pendant la HBL (Horizontal Blanking ou balayage horizontal).

Par défaut, la fréquence des canaux Dma est à 15,625 Khz mais cette fréquence peut être modifiée si l'on modifie le registre 0 du Crtc pour faire de la rupture verticale par exemple....

Les Dma ont leur propre langage... Ceux ci sont donc utilisés dans ce que nous appellerons, une Liste AY ou AY-List.

Voyons tout de suite quelles sont ces instructions.

________________________________________________________________________________
0RDD | LOAD R,D | Envoie Data (D) 8 Bits dans le Registre (R) du PSG
________________________________________________________________________________
1NNN | PAUSE NNN | Attends NNN (0 à #FFF)
________________________________________________________________________________
2NNN | REPEAT NNN | Répète NNN fois ce qu'il y a dans la boucle (For I)
________________________________________________________________________________
4000 | No Operation | Nop. Attends 64 us
________________________________________________________________________________
4001 | LOOP ;| C'est l'instruction de boucle qui est utilisée
; après le For I (Next I)
________________________________________________________________________________
4010 | INT | Interrompt le CPU
________________________________________________________________________________
4020 | STOP ;| Fin de l'AY-LIST

Concernant les différents registres du PSG, un petit rappel s'impose...

  • Le registre 0 et le registre 1 sont la période pour le Canal A (12 Bits)
  • Le registre 2 et le registre 3 sont la période pour le Canal B (12 Bits)
  • Le registre 4 et le registre 5 sont la période pour le Canal C (12 Bits)
  • Le registre 6 est le registre de bruit (5 Bits)
  • Le registre 7 est le registre de mixage des canaux (8 Bits)
  • Le registre 8 est le registre de volume du canal A (5 Bits)
  • Le registre 9 est le registre de volume du canal B (5 Bits)
  • Le registre 10 est le registre du volume du cana C (5 Bits)
  • Le registre 11 et le registre 12 contrôlent la période de l'enveloppe (16 Bits)
  • Le registre 13 contrôle la forme de la modulation utilisée. (4 Bits)

La suite au prochaine épisode....

Si vous avez des questions concernant le sujet vous savez où nous trouver....

AsT / Impact - http://impact-cpc.fr.nf/index.php/topic,2956.0.html

★ ANNÉE: ???
★ AUTEUR: AST

★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Coding » LOGON CPCPLUS 38: Dessinez en 4096 couleurs
» Coding » LOGON CPCPLUS 44: Des Rasters sur CPC+
» Coding » LOGON CPCPLUS 48: En avant l'ASIC
» Coding » CPCplus : "Arnold V" Specification
» Coding » Chronique A100% CPC+ (Logon System)
» Coding Src's » Disassembly of AMSDOS ROM CPCplus
Je participe au site:

» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.7-desktop/c
Page créée en 319 millisecondes et consultée 6090 fois

L'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.