CODINGLA BIBLE DU CPC 6128

La bible du CPC 6128 : 3.03.02 Extensions du Basic avec RSX
3.3.2 Extensions du Basic avec RSX

Le système d'exploitation et le Basic du CPC soutiennent la possibilité d'intégrer ses propres instructions dans le Basic. C'est ce qu'on appelle RSX 'Résident System extension'. Ces extensions peuvent être appelées en Basic à travers un nom, et elles permettent une transmission de paramètres comme nous l'avons déjà décrite pour l'instruction CALL.
Si nous voulons par exemple écrire une extension graphique qui dessine un carré sur l'écran, l'appel de cette fonction se présentera ainsi:

|QUADRAT,100,100,50
Nous voulons ainsi dessiner un carré dont l'angle supérieur gauche aura les coordonnées 100, 100 avec un côté d'une longueur de 50 points.

Comme vous voyez, une extension d'instruction est marquée par un trait vertical (SHIFT @) placé devant le mot instruction.

Une telle extension d'instruction peut figurer dans une ROM d'extension, comme celle par exemple qui gère le lecteur de disquette, ou bien également en RAM. Cela nous donne donc la possibilité d'écrire nos propres extensions d'instruction. Pour que le système d'exploitation sache où il doit chercher une telle extension, l'extension doit d'abord être 'intégrée'. On emploie pour cela une routine du système d'exploitation: KL LOG EXT. L'exemple suivant réalise l'instruction évoquée ci-dessus pour dessiner un carré et montre comment l'intégration se réalise.

;RSX - EXTENSIONS D'INSTRUCTION ;L.E. X5/6/85
BCD1    LOGEXT EQU  &BCD1   ; intégrer extension
BBC6    ASKCUR EQU  &BBC6   ; amener curer graphique
BBC0    MOVABS EQU  &BBC0   ; fixer curseur graphique
BBF9    DRAWRE EQU  &BBF9   ; tracer ligne relativ.
BDC7    CHGSGN EQU  &BDC7   ; modifier signe
8000       ORG  &8000
8000 010980    LD   BC.RSX   ; adresse table instr.RSX
8003 211680    LD   HL,KERNAL ; 4 oct.Ram pour Kernl
8006 C3D1BC    JP   LOGEXT   ; intégrer extension
8009 0E80  RSX &emspDEFW TABLE   ; Adresse des mots inatr.
800B C31A80    JP   QUADRAT
800E 51554144 TABLE DEFM "QUADRA"
8014 D4     DEFB "T"+&80
8015 00     DEFB 0    ; fin de la table
8016    KERNAL DEFS 4    ; mémoire pour Kernal
801A FE0S  QUADRA CP   3    ; trois paramètres?
801C C0     RET  NZ
801D CDC6BB    CALL ASKCURS  ; amener cursr graphique
8020 D5     PUSH DE    ; ranger coordonnée X
8021 E5     PUSH HL    ; ranger coordonnée Y
8022 DD5605    LD   D,(IX+5)
8025 DD5E04    LD   E,(IX+4) ; coordonnée X
8028 DD6603    LD   H,(DC+3)
802B DD6E02    LD   L,(IX+2) ; coordonnée Y
802E CDC0BB    CALL MOVABS   ; CursrGraph sur Coord XY
8031 DD5601    LD   D,(IX+1)
8034 DD5E00    LD   E,(IX)   ; ranger longueur dans de
8037 D5     PUSH DE    ; comme offset X
8038 210000    LD   HL,0   ; offset Y
803B CDF9BB    CALL DRAWREL  ; tracer ligne horiz.
803E El     POP  HL
803F E5     PUSH HL
8040 CDC7BD    CALL CHGSGN   ; offset Y négatif
8043 E8     PUSH HL
8044 110000    LD   DE,0
8047 CDF9BB    CALL DRAWREL  ; tracer ligne verticale
804A Dl     POP  DE    ; offset X négatif
804B 210000    LD   HL,0   ; offset Y nul
804E CDF9BB    CALL DRAWREL   ; tracer ligne horiz.
8051 E1     POP HL
8052 110000    LD  DE,0
8055 CDF9BB    CALL DRAWREL   ; tracer ligne verticale
8058 El     POP HL
8059 Dl     POP DE
805A C3C0BB    JP  MOVABS   ; rétablir coordonnées

Après que ce programme ait été chargé (comme fichier binaire à partir de la disquette) ou qu'il ait été placé en mémoire avec un programme de chargement de DATA, il doit être initialisé une seule fois. Il faut pour cela utiliser l'appel CALL &8000. La nouvelle instruction est alors disponible. Deux tables sont utilisées pour l'intégration. La première, appelée RSX dans notre exemple, contient tout d'abord l'adresse de la seconde table, appelée ici TABLE, suivie des instructions de saut à l'extension proprement dite.

La seconde table contient les noms sous lesquels les nouvelles instructions peuvent être appelées. Les majuscules et les points sont autorisés. Le dernier caractère d'un mot instruction est marqué par son bit 7 qui est mis. La fin de la table est indiquée par un octet nul. Chaque table doit bien sûr contenir le même nombre d'entrées. Pour chaque mot d'instruction doit figurer l'adresse de saut correspondante dans la première table. Sous l'étiquette KERNAL, nous devons mettre 4 octets à la disposition du système d'exploitation qui sont utilisés pour la gestion de l'extension. Les 4 octets doivent être placés entre l'adresse &4000 et l'adresse &BFFF.

La routine de dessin d'un carré commence par l'étiquette QUADRAT (quadrate en anglais=carré). On contrôle d'abord si trois paramètres ont bien été transmis. Si ce n'est pas le cas, on quitte la routine immédiatement. Mais si c'est le cas, on va chercher la position actuelle du curseur graphique et on la range sur la pile. On va ensuite chercher dans de et hl les coordonnées X et Y transmises. La base du bloc de paramètres se trouve en IX. Après que le curseur graphique ait été fixé sur ces coordonnées, la routine de dessin d'une ligne relativement à la position actuelle peut être appelée quatre fois. Pour calculer un offset négatif, on appelle la routine CHGSGN de l'arithmétique entière. Pour finir, on rétablit la position originelle du curseur.

Voici un exemple d'utilisation de cette routine:

10 CLS
20 FOR i=35 TO 400 STEP 20
30 |QUADRAT,i,i,30
40 NEXT

★ ANNÉE: ???

Page précédente : La Bible du CPC 6128 - 3.03.01 : L'instruction CALL
Je participe au site:

» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.732-desktop/c
Page créée en 634 millisecondes et consultée 2200 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.