ASMtrad CPC

Apprenez l'assembleur Z80

RSX.

Nous allons voir ici comment créer des RSX afin de les utiliser depuis le basic.
Avant toute chose, sachez que pour les créer dans les ROMs il vous faudra aller voir l'article "Les ROMs - Fonctionnement et structure.".

Les RSXs (Resident System extension.) sont des programmes directement appelables depuis le basic.
Ces programmes portent un nom et l'on peut directement les appeler quand nous le désirons avec un ùnom.
Sur qwerty le "ù"" n'existant pas vous devrez utiliser le caractère "|" suivit du nom du RSX.

Mais, et c'est la le plus interessant: on peut aussi passer des paramètres à nos RSXs afin de les rendre plus adaptables.
Par exemple un RSX d'affichage de sprite pourrait permettre d'avoir en entrée (donc en paramètres envoyés au RSX), le Y, le X et le numéro du sprite à afficher.

Voyons maintenant comment "installer" un RSX dans le système de notre CPC.

Construction des RSXs:

Nous utiliserons pour cela le vecteur système #BCD1.

Celui-ci nous dit: "INTRODUIT UN RSX DANS LE LOGICIEL INTERNE."
En entrée il demande:
BC contient l’adresse de la table des commandes RSX.
HL contient l’adresse de 4 octets disponibles en RAM pour le noyau.

Pour ce qui est de HL, il vous suffit de mettre quelque part un buffer de 4 octets disponibles. Il n'y a rien de particulier à préciser là dessus

Voyons un peu ce que doit contenir la table des commandes RSX pointée par BC:

Celle-ci doit contenir dans l'ordre:
-L'adresse (donc sur 2 octets) de la table des noms des RSXs (que vous en ajoutiez un ou plus). -Les Sauts aux routines, JP inclu. (donc pour chaque routine, vous devrez bien mettre dans la table: JP routine1,JP routine2). -Votre fameuse table de noms des RSXs. -Un 0 pour terminer.

Pour la table des noms des RSX, le système a besoin de detecter la fin d'un nom.
Pour cela le bit 7 du dernier caractère est mis à 1. Il suffira donc d'ajouter +#80 sur le dernier caractère du nom pour que sa fin soit detectée.
Notez bien aussi car c'est important que le nom des RSXs est TOUJOURS en majuscule, que celui-ci ne contient ni espace ni caractères autres que alphanumériques.

Exemple:

            TAB_RSX
                        DEFW    RSX_NOMS    ;les deux premiers octets pointent sur la table des noms
                        JP      SPRITE      ;premier jump vers le premier RSX
                        JP      COULEUR     ;Deuxième jump vers le deuxième RSX
            RSX_NOMS
                        DEFM    "SPRIT"
                        DB      "E"+#80     ;on ajoute #80 au dernier caractère pour signifier la fin du nom
                        DEFM    "COULEU"
                        DB      "R"+#80
                        DB      0           ;0 pour fin de la table

Votre BC avant l'appel du vecteur #BCD1 contiendra donc l'adresse TAB_RSX

Variables:

Comme je l'ai dit plus haut, nous pouvons passez des valeurs du basic vers vos routines RSX:

Imaginons un RSX de type: ùraster,encre,couleur1,couleur2

Lorsque vous entrerez vos paramètres, le registre A sera augmenté à chacun de ceux-ci.
Ainsi dans le cas présent, nous avons 3 paramètres (encre, couleur1,couleur2).
A sera donc égal à 3.

Les valeurs de ses paramètres entrés sont stockés dans une table. L'adresse du dernier octet de cette table est stocké dans IX.
Ainsi IX pointera sur la valeur "couleur2".
Il suffira ensuite de decrementer IX pour passer a la valeur "couleur1" puis "encre"