Revenir au plan du site
Bénéficier de la palette étendue de 4096 couleurs d'un Amstrad Plus ou d'une GX-4000.
Pour l'utilisation de la plus évidente des fonctionnalités du Plus (en fait la seule mise en avant dans les publicités) nous allons afficher une image avec la palette étendue de 4096 couleurs.
Pour cela, il faut d'abord débloquer les fonctionnalités. Oui, car un gars s'était dit à la conception, que ça serait bien de mettre sous license l'utilisation des cartouches, l'utilisation des fonctionnalités...
Le déblocage se fait par l'envoi d'une suite logique d'octets sur le port de sélection du registre CRTC (#BC00).
; séquence classique de déverouillage de l'Asic
defb <tout sauf zéro>,#00,#ff,#77,#b3,#51,#a8,#d4,#62,#39,#9c,#46,#2b,#15,#8a,#cd,<peu importe>
|
Ce code qui exploite cette liste est gros et ne rend pas justice au fonctionnement interne de l'Asic, qui se contente d'utiliser quelques décalages en injectant quelques bits.
Séquence de déverrouillage visuelle...
courtesy of Hwikaa
Un petit challenge avait été réalisé et c'est
Madram (
Gloire! Gloire!) qui nous propose cette routine d'unlock de l'Asic.
Bien qu'il soit possible de verrouiller l'Asic après un déverrouillage, sachez que c'est complètement inutile.
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
|
Pour pouvoir choisir les couleurs dans la palette, vous devez utiliser un codage 16 bits de type
0VRB, c'est à dire que les 4 premiers bits sont nuls, les 4 suivants correspondent au niveau de VERT de 0 à 15, viennent ensuite le ROUGE et le BLEU aussi sur 4 bits pour 16 niveaux de 0 à 15.
Vous pouvez consulter la
page sur le changement de couleurs CPC et voir des exemples dans la colonne ASIC.
Pour pouvoir envoyer ces valeurs dans l'ASIC, il faut que celui-ci soit connecté, cela se fait via le registre RMR2 dont voici le schéma ci-desous, grâcieusement offert par le site
Quasar-CPC.
La valeur du RMR2 est à envoyer sur le port #7Fxx du "Gate Array". On voit que ce registre ne sert pas qu'à connecter la page ASIC en mettant les deux bits supérieurs de commande à 1, mais aussi de choisir à quelle adresse la ROM basse peut être mappée en mémoire, ainsi que le choix de la ROM basse de 0 à 7. Dans un premier temps, nous pouvons oublier toutes ces possibilités de connexion.
Sur la base de ces informations, je vous invite à définir quelques constantes et une macro pour manipuler plus facilement la connexion. C'est tellement dépassé d'utiliser #B8 et #A0!
;*** 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
|
Pour connecter l'ASIC, vous pourrez appeler la macro ainsi
RMR2 ASICON ; c'est tout ^_^
|
Pour déconnecter l'ASIC, vous pourrez appeler la macro ainsi
RMR2 ASICOFF ; ou bien l'une des configurations ROM
|
Ok, on sait comment déverrouiller l'ASIC, on sait comment activer la page, on connait le format de la palette, mais où est-ce qu'on envoie les couleurs?
Le tableau des encres commence à l'adresse #6400 et s'étend sur 64 octets. Comment se fait-il que nous ayions 32 couleurs 16 bits? Hé bien il y a les 16 encres 'classiques', pour le bitmap de la mémoire graphique traditionnelle, suivies à l'adresse #6420/#6421 de l'encre pour le BORDER et les 15 couleurs restantes sont pour les sprites hard. Là encore nous y reviendrons. Dans un premier temps, nous allons charger la palette d'une image et c'est tout.
Avant d'assembler ce source, je vous invite à télécharger le
[fichier bitmap] suivant (pour avoir quelque chose à l'écran)
;*** RMR tags ***
MODE_0 equ 0
MODE_1 equ 1
MODE_2 equ 2
MODE_3 equ 3
CLEAR_INT equ %10000
ROM_OFF equ %1100
ROM_BOTH equ 0
ROM_UP equ %100
ROM_LOW equ %1000
INTRESET equ %10000
;*** 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 RMR tags
ld a,{tags}+%10000000
ld b,#7F
out (c),a
mend
macro RMR2 tags
ld a,{tags}+%10100000
ld b,#7F
out (c),a
mend
BUILDSNA
SNASET CPC_TYPE,4 ; indiquer un 6128 Plus dans le snapshot
BANKSET 0
ORG #100
RUN #100
RMR ROM_OFF|MODE_0 ; surtout pas les ROM!
call UnlockAsic
RMR2 ASICON
; et on recopie la palette dans l'ASIC
ld hl,palette
ld de,#6400
ld bc,32
ldir
termine jr termine
palette defw #112,#224,#432,#533,#435,#271,#454,#556,#5D1,#898,#9E5,#BD9,#0FE,#DEB,#EFC
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
ORG #C000
incbin 'teepee.bin' ; notre binaire écran
|
Et voilà notre image à l'écran!
Mais? Mais? Qu'est-ce que c'est que ce rose dans le ciel là?
C'est ce qui va nous servir pour le deuxième article dédié à la gamme Amstrad Plus ;)