| ★ CODING ★ Apprendre pas à pas la programmation en assembleur Z80 par Roudoudou ★ Annexe hardware de la machine ★ |
| Fonctionnalités étendues de la gamme Plus |
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 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 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) |
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 : 0000xxyy00 : sprite non affiché
01 : zoom x 1
02 : zoom x 2
03 : 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 |
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 queles encres classiques du Plus.
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)* | |||||
| É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 | |
| ... | ... | ... | ... |
Le plus possède un port analogique sur lequel on peut brancher deux joysticks (les manettes sont hélas impossibles à trouver mais on peut se bricoler des choses avec des potentiomètres et un coup de fer à souder). Il y a 4 lignes analogiques, deux par manette puisque chaque manette envoie l'axe X et l'axe Y.
Les valeurs peuvent être lue aux adresses #6808, #6809, #680A et #680B. Le résultat est compris entre 0 et 63. Avec une manette correctement calibrée le centre correspond à la valeur 32.
| Lecture des valeurs du port analogique | |
|---|---|
| Adresse ASIC | Correspondance |
| #6808 | Joystick 0 - Axe horizontal X |
| #6809 | Joystick 0 - Axe vertical Y |
| #680A | Joystick 1 - Axe horizontal X |
| #680B | Joystick 2 - Axe vertical Y |
ACE-DL disposera dans la prochaine version SDL3 d'un module de visualisation des joysticks dans la fenêtre de débug de l'ASIC :)

La suite plus tard ;)
|
Page créée en 665 millisecondes et consultée 41 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. |