Revenir au plan du site
Annexe technique ASIC
déverrouillage ASIC
Le code qui exploite la séquence classique de déverrouillage 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. Un petit challenge avait été réalisé et c'est Madram 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
|
RMR2 pour connecter la page ASIC
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
|
Les sprites hard de l'ASIC
Présentation
La 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 Asic
Chaque 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 Z
une 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, activation
Chaque 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 :
0000xxyy
00 : 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 transparence
Les 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 que
les encres classiques du Plus.
Le registre de scrolling de l'ASIC
Certains l'appellent SSR, d'autres SSCR, peu importe, on retiendra son adresse dans la page ASIC : #6804
Soft Scroll Register (registre de scroll) |
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Si activé, continue d'afficher le border pendant 2 octets |
Décalage vertical vers le haut(de 0 à 7) |
Décalage horizontal vers la droite (de 0 à 15)* |
*Si vous utilisez un décalage inapproprié avec la résolution, vos pixels ne seront pas correctement affichés. Par exemple, en mode 0, n'utilisez que les valeurs 0, 4, 8 et 12
Étapes de scrolling horizontal |
position X en pixel mode 1 | scroll CPC | scroll CPC et registre 3 | scroll ASIC + SSR | adresse écran |
0 | CRTC Adr = #0000 | CRTC Adr = #0000 R3 = #8C | CRTC Adr = #0000 SSR = 0 | #C000 |
1 | | | CRTC Adr = #0000 SSR = 2 | #C000 |
2 | | | CRTC Adr = #0000 SSR = 4 | #C000 |
3 | | | CRTC Adr = #0000 SSR = 6 | #C000 |
4 | | CRTC Adr = #0000 R3 = #85 | CRTC Adr = #0000 SSR = 8 | #C001 |
5 | | | CRTC Adr = #0000 SSR = 10 | #C001 |
6 | | | CRTC Adr = #0000 SSR = 12 | #C001 |
7 | | | CRTC Adr = #0000 SSR = 14 | #C001 |
8 | CRTC Adr = #0001 | CRTC Adr = #0001 R3 = #8C | CRTC Adr = #0001 SSR = 0 | #C002 |
9 | | | CRTC Adr = #0001 SSR = 2 | #C002 |
10 | | | CRTC Adr = #0001 SSR = 4 | #C002 |
... | ... | ... | ... | ... |
Étapes de scrolling vertical |
position Y | scroll CPC | scroll ASIC + SSR | adresse écran |
0 | CRTC Adr = #0000 | CRTC Adr = #0000 SSR = #00 | #C000 |
1 | | CRTC Adr = #0000 SSR = #10 | #C800 |
2 | | CRTC Adr = #0000 SSR = #20 | #D000 |
3 | | CRTC Adr = #0000 SSR = #30 | #D800 |
3 | | CRTC Adr = #0000 SSR = #40 | #E000 |
5 | | CRTC Adr = #0000 SSR = #50 | #E800 |
6 | | CRTC Adr = #0000 SSR = #60 | #F000 |
7 | | CRTC Adr = #0000 SSR = #70 | #F800 |
8 | CRTC Adr = largeur / 2 | CRTC Adr = largeur / 2 SSR = #00 | #C000 + largeur |
9 | | CRTC Adr = largeur / 2 SSR = #10 | #C800 + largeur |
... | ... | ... | ... |
La suite plus tard ;)