Initiation à la programmation de l'Asic.
J'ai décidé de faire une série d'articles 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 la gestion de 4096 couleurs (au lieu de 27), 16 sprites hard zoomables (absent sur les Cpc Old) , une gestion facilitée des splits screens (Technique appelée autrefois Rupture par ce bon vieux Longshot), une gestion facilitée des Interruptions, ainsi que la gestion de 3 canaux Dma... Que du bon en fait...
Pour commencer cette initiation, j'ai donc décidé de vous livrer la séquence de "Delockage" de l'Asic, car si nous voulons accéder aux différentes fonctions proposées par l'Asic, il faut d'abord en passer par là !
Delock
DI ; Interdit les Interruptions
LD HL,ASIC ; Table des valeurs à envoyer
LD BC,#BC00
LD A,17 ; 17 Octets à envoyer au Crtc
Loop LD E,(HL) ; Met la valeur de la table dans le reg E
OUT (C),E ; Envoie la valeur au Crtc
INC HL ; HL=HL+1
DEC A ; A=A-1
JR NZ,Loop ; Tant que A n'est pas égal à 0, on continue...
EI ; Rétablir les interruptions
RET
ASIC DEFB 255,0,255,119,179 ; Voilà les 17 valeurs à envoyer au Crtc.
DEFB 81,168,212,98,57,156
DEFB 70,43,21,138,205,238
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+
Vous devez vous demander pourquoi Activer ou Désactiver les fonctions supplémentaires du Cpc+... Et oui, ça sert à quoi ?
Il faut savoir que lorsque vous activer les fonctions supplémentaires du Cpc+ (lorsque l'on passe en Mode Asic), vous activez alors une page mémoire qui va de #4000 à #7fff et qui se substitue à celle située en bank #c0.... C'est en quelque sorte, une nouvelle bank.
Vous devrez donc désactiver le Mode Asic quand vous voudrez écrire dans cette portion de la mémoire, que ce soit en Bank #c0 ou si vous voulez utiliser les 64Kb supplémentaires (Bank #c4, #c5, #c6 & #c7) car tant que vous serez en Mode Asic On, vous ne pourrez plus utiliser la partie mémoire qui va de #4000 à #7fff. Il faudra donc désactiver l'Asic pour pouvoir utiliser cette partie de la Ram.
J'espère avoir été clair sur ce point !
Comment utiliser les 4096 couleurs du CPC+ ?
La palette du CPC+ est composée de 4096 (de #000 à #FFF) couleurs dont 31 utilisables simultanément, 32 si nous comptons le border. Nous pouvons distinguer :
A. Changement des couleurs de l'écran
Contrairement au Cpc Old, le changement de couleur ne s'opère pas grace au PPi et à quelques "OUT" bien placés. Il Suffit de connecter la page I/O asic et de poker les bonnes valeurs aux adresses suivantes :
Le changement de couleur se révèle être assez simple quand même :
DI ; On interdit les interruption (Disable Interrupt)
CALL Delock ; Fonction vue au chapitre 1
LD BC,#7FB8
OUT (C),C ; Asic on
LD HL,#8af ; chargement de la couleur (GRB - dans cet ordre)
LD (#6420),HL ; La couleur du border sera #8af (adresse #6420=Border)
;
LD HL,#FFF ; Chargement de la couleur au format GRB
LD (#642A),HL ; Change la couleur du Pen 5 des sprites Hard.
Le principe est assez simple : on charge le registre hl avec la valeur de la couleur puis on l'affecte à la bonne adresse Asic.
Voici donc un complément d'explication sur les couleurs. Dans l'exemple du border, la couleur chargée dans HL est #8af.
Sachez que les couleurs de l'Asic sont gérées en RGB (Rouge, Vert, Bleu) ou plutôt devrais-je dire au format GRB (Vert, Rouge, Bleu) sur votre bon vieil Amstrad Cpc Plus.
Dans l'exemple cité plut haut :
G=8, R=#a et B=#f
A suivre...
Pour commencer cette initiation, j'ai donc décidé de vous livrer la séquence de "Delockage" de l'Asic, car si nous voulons accéder aux différentes fonctions proposées par l'Asic, il faut d'abord en passer par là !
Delock
DI ; Interdit les Interruptions
LD HL,ASIC ; Table des valeurs à envoyer
LD BC,#BC00
LD A,17 ; 17 Octets à envoyer au Crtc
Loop LD E,(HL) ; Met la valeur de la table dans le reg E
OUT (C),E ; Envoie la valeur au Crtc
INC HL ; HL=HL+1
DEC A ; A=A-1
JR NZ,Loop ; Tant que A n'est pas égal à 0, on continue...
EI ; Rétablir les interruptions
RET
ASIC DEFB 255,0,255,119,179 ; Voilà les 17 valeurs à envoyer au Crtc.
DEFB 81,168,212,98,57,156
DEFB 70,43,21,138,205,238
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+
Vous devez vous demander pourquoi Activer ou Désactiver les fonctions supplémentaires du Cpc+... Et oui, ça sert à quoi ?
Il faut savoir que lorsque vous activer les fonctions supplémentaires du Cpc+ (lorsque l'on passe en Mode Asic), vous activez alors une page mémoire qui va de #4000 à #7fff et qui se substitue à celle située en bank #c0.... C'est en quelque sorte, une nouvelle bank.
Vous devrez donc désactiver le Mode Asic quand vous voudrez écrire dans cette portion de la mémoire, que ce soit en Bank #c0 ou si vous voulez utiliser les 64Kb supplémentaires (Bank #c4, #c5, #c6 & #c7) car tant que vous serez en Mode Asic On, vous ne pourrez plus utiliser la partie mémoire qui va de #4000 à #7fff. Il faudra donc désactiver l'Asic pour pouvoir utiliser cette partie de la Ram.
J'espère avoir été clair sur ce point !
Comment utiliser les 4096 couleurs du CPC+ ?
La palette du CPC+ est composée de 4096 (de #000 à #FFF) couleurs dont 31 utilisables simultanément, 32 si nous comptons le border. Nous pouvons distinguer :
- -> 16 couleurs maxi pour l'écran (mode 0)
-> 15 couleurs maxi pour les sprites hard
-> 1 couleur pour le border
A. Changement des couleurs de l'écran
Contrairement au Cpc Old, le changement de couleur ne s'opère pas grace au PPi et à quelques "OUT" bien placés. Il Suffit de connecter la page I/O asic et de poker les bonnes valeurs aux adresses suivantes :
- | #6400 - Pen 0 | #6402 - Pen 1 | #6404 - Pen 2 | #6406 - Pen 3 | <- Couleurs des encres (Pen 0 à 15)
- | #6408 - Pen 4 | #640a - Pen 5 | #640c - Pen 6 | #640e - Pen 7 |
- | #6410 - Pen 8 | #6412 - Pen 9 | #6414 - Pen 10 | #6416 - Pen 11 |
- | #6418 - Pen 12 | #641a - Pen 13 | #641c - Pen 14 | #641e - Pen 15 |
- | #6420 - Border |
- | #6422 - Pen 1 | #6424 - Pen 2 | #6426 - Pen 3 | #6428 - Pen 4 | <- Couleurs des Sprites (Pen 1 à 15)
- | #642a - Pen 5 | #642c - Pen 6 | #642e - Pen 7 | #6430 - Pen 8 | L'encre 0 des sprites est celle transparente.
- | #6432 - Pen 9 | #6434 - Pen 10 | #6436 - Pen 11 | #6438 - Pen 12 |
- | #643a - Pen 13 | #643c - Pen 14 | #643e - Pen 15 |
Le changement de couleur se révèle être assez simple quand même :
DI ; On interdit les interruption (Disable Interrupt)
CALL Delock ; Fonction vue au chapitre 1
LD BC,#7FB8
OUT (C),C ; Asic on
LD HL,#8af ; chargement de la couleur (GRB - dans cet ordre)
LD (#6420),HL ; La couleur du border sera #8af (adresse #6420=Border)
;
LD HL,#FFF ; Chargement de la couleur au format GRB
LD (#642A),HL ; Change la couleur du Pen 5 des sprites Hard.
Le principe est assez simple : on charge le registre hl avec la valeur de la couleur puis on l'affecte à la bonne adresse Asic.
Voici donc un complément d'explication sur les couleurs. Dans l'exemple du border, la couleur chargée dans HL est #8af.
Sachez que les couleurs de l'Asic sont gérées en RGB (Rouge, Vert, Bleu) ou plutôt devrais-je dire au format GRB (Vert, Rouge, Bleu) sur votre bon vieil Amstrad Cpc Plus.
Dans l'exemple cité plut haut :
G=8, R=#a et B=#f
A suivre...