| ★ CODING ★ Apprendre pas à pas la programmation en assembleur Z80 ★ Annexe hardware de la machine ★ |
| Fonctionnalités étendues de la gamme Plus |
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
UnlockAsic |

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 *** |
| 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) |
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
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 |
| 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 | |
| ... | ... | ... | ... |
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 :)

|
Page créée en 136 millisecondes et consultée 5 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. |