Le reset à... tiède !
On connaissait le reset à froid: le système vérifie qu'il se trouve à l'adresse $60FE ($20FE pour les MO) une valeur autre que
$A55A. Auquel cas tous les registres, y compris les registres système de $6000 à $60FF ($2000 à $20FF
pour les MO) sont réinitialisés.
On connaissait le reset à chaud: le système vérifie qu'il se trouve à la même adresse la valeur
$A55A. Auquel cas les registres système ne sont pas réinitialisés.
Mais on méconnaît le reset à tiède. Sur les TO9, TO8, TO8D et TO9+, le système
propose pourtant cette alternative pour le moins intéressante: le système, lors du reset, vérifie alors
qu'il se trouve à l'adresse $60FE la valeur $A559. Auquel cas, il réinitialise les registres, y compris
la palette, sans toucher aux registres système. Mais attention! Pas n'importe quelle palette: celle
qui est sauvée en initialisation à l'adresse $5F40 dans la RAMB.
La possibilité apparaît alors de demander la réinitialisation de la palette
au reset sans passer par une programmation du vecteur de reset. Cela est avantageux du fait que le reset
peut être effectué logiciellement en sautant à l'adresse adéquate ou en utilisant l'instruction idoine,
mais aussi matériellement en appuyant sur le poussoir du reset. Dans ce dernier cas, la réinitialisation
de la palette ne pouvait être assurée.
Ainsi donc, avec le programme assembleur suivant:
...
LDB $E7C3 |
ANDB #$FE | Passe en RAMB
STB $E7C3 |
LDX #PALETT Pointe sur la palette TO7
LDU #$5F40 Pointe sur le buffer de palette
LDA #32 32 caractères à transférer
PRESET LDB ,X+ | Transfère
STB ,U+ | un caractère
DECA | Pour toute
BNE PRESET | la palette
LDB #$59 | Active le
STB $60FF | reset à tiède
...
PALETT FDB $0000,$000F,$00F0,$00FF
FDB $0F00,$0F0F,$0FF0,$0FFF
FDB $0777,$033A,$03A3,$03AA
FDB $0A33,$0A3A,$0EE7,$007B
... ou le programme Basic:
10 POKE&HE7C3,PEEK(&HE7C3)AND254 <Passe en RAMB
20 FORI=&H5F40 TO &H5F40+31 <Balayage du buffer de palette
30 READ A <Lit une donnée
40 POKE I,A <Transfère le caractère
50 NEXT <Pour toute la palette
60 POKE&H60FF,&H59 <Active le reset à tiède
70 DATA 0,0,0,15,0,240,0,255,15,0,15,15,15,240,15,255,
7,119,3,58,3,163,3,170,10,51,10,58,14,231,0,123
... vous assurerez une réinitialisation automatique de la palette au reset!
Le MO6, quant à lui, na pas de reset à tiède à proprement parler.
Pour réinitialiser les couleurs naturelles au reset sur MO6, effacer loctet
contenu en $20FF pourrait être suffisant, du moment que la valeur contenue en $20FE-$20FF est différente
de $A55A. La palette des applications est alors réinitialisée. Mais, pour peu que la valeur contenue
dans $1FDF en RAMB soit à $A5 (il ny a jamais quune chance sur 256 quelle le soit),
cest la palette contenue dans cette même RAMB de ladresse $1FE0 à $1FFF qui servira à lentrée
dans lapplication, par exemple du Basic. Après initialisation de la palette, ce registre $1FDF
est généralement mis à 0 dès lentrée dans une application. Mais il est préférable, dans le bénéfice
du doute, de leffacer aussi. Dès lors, au début de vos programmes, insérez :
CLR $20FF 20 POKE &H20FF,0 Efface flag de reset moniteur
... et si vous utilisez le registre $1FDF en RAMB, veillez à ne pas le laisser à $A5 :
CALL $04 10 POKE &HA7C0,PEEK(&HA7C0)AND 254 Passe en RAMB
CLR $1FDF 30 POKE &H1FDF,0 Efface flag de reset palette
|