L'adresse à laquelle une routine RSX doit être chargée est fixée (à la lettre) par son auteur. l'utilisateur peut souhaiter modifier cette adresse pour 2 raisons : - récupération de mémoire par élévation de l'adresse ;
- chargement de plusieurs RSX qui se recouvrent.
Les utilisateurs pratiquant l'Assembleur résolvent ce problème en principe aisément. .... Les autres en sont généralement réduits a mettre la ou les routines au frigidaire pour une durée indéterminée. Nous sommes ici pour venir en aide à ces derniers. En effet, il existe un procédé EXTREMEMENT SIMPLE permettant de transformer CERTAINES (nous verrons la raison de cette restriction) routines RSX en routines "ordinaires" (CALL adresse, paramètres). Prenons l'exemple de la routine RSX |KDOKE (Double pOKE avec déKalage) qui implante une valeur sur 16 bits aux adresses Base +Decal et Base +Decal + 1. La syntaxe en est la suivante : CALL &A000 |KDOKE, Adresse de base, Decalage, Valeur à implanter Voici cette routine (fort utile au demeurant) : DATA 01,09,A0,21,14,A0,C3,D1, 8C,0E,A0,C3.18,A0,4B,44 DATA 4F,4B,C5.00,00,00,00,00, DD,6E,04,DD,66,05.DD,5E DATA 02,DD,56,03,DD,4E,00,DD, 46,01,19,71,23,70,09Le processus de transformation est le suivant : Trouver 2 octets D1,BC Ces deux octets figurent toujours au début d'une routine RSX. Ils sont précédés soit de C3, soit de CD. Nous trouvons effectivement C3,D1 ,BC en positions 7, 8 et 9. Chercher le nom de la commande (KDOKE) Ce nom est toujours au-delà de D1,BC. Avec une table des codes ASCII, nous trouvons que KDOKE se dit 4B,44,4F,4B,45 en hexadécimal. A partir de la position 15, nous trouvons 4B.44,4F,4B,C5. Cette différence tient au fait qu'au dernier caractère est toujours ajouté 128 décimal, c'est-à-dire 80 hexa. Nous avons donc bien trouvé le nom. Attention : le nom est toujours suivi d'un octet 00, mais pas forcément de plusieurs. Entre D1 BC et le nom, chercher un octet C3 Nous le trouvons en position 12. Immédiatement après, nous trouvons 18,A0 qui est une adresse que nous devons lire en l'inversant : A018. Cette adresse est celle de la routine "ordinaire" lorsque la routine RSX se trouve à son adresse de chargement, &A000 dans le cas présent. Si nous faisons en mode direct PRINT &A018-&A000, nous obtenons 24 (&18). 24 est le nombre d'octets à SUPPRIMER ou à REMPLACER par 00 pour enlever à la routine son préambule RSX. LE RESULTAT Nous admettrons que la routine CALL est : DATA 00,00,00,00,00,00,00,00, 00,00,00,00,00,00,00,00 DATA 00,00.00,00,00,00,00,00, DD,6E,04,DD,66,05,DD,5E DATA 02,DD,56,03,DD,4E,00,DD, 46,01,19,71,23,70,C9ou bien DATA DD,6E,04,DD,66,05,DD,5E, 02,DD,56,03,DD,4E,00,DD DATA 46,01,19,71,23,70,C9Dans le cas présent, cette dernière routine peut effectivement être chargée à une adresse "quelconque" et mise en œuvre de la façon suivante : 100 KDOKE = &A500 110 MEMORY KDOKE - 1 200 LOAD "KDOKE", KDOKE 500 CALL KDOKE, ADR, 22, VALEUR'--KDOKE plus parlant que &A500 VALIDITE DU PROCEDE Le procédé qui vient d'être exposé ne permettra pas de DEVERROUILLER toutes les routines RSX. En premier lieu, il ne traite pas le cas des routines RSX ayant plusieurs points d'entrée (plusieurs noms de commande). Ensuite, il se peut que la disparition du préambule RSX soit insuffisante pour rendre sa mobilité à la routine. Prenons un exemple : Un message d'erreur concernant le NOMBRE de PARAMETRES est incorporé à la routine RSX initiale "KDOKE". Ce message est affiché lorsque ce nombre est différent de 3. En enlevant le préambule RSX de cette routine modifiée, nous obtenons : DATA 00,00,00,00,00,00,00,00, 00,00,00,00,00,00,00,00 DATA 00,00,00,00,00,00,00,00, FE,03,20,17,DD,6E,04,DD DATA 66,05,DD,5E,02,DD,56,03, DD,4E,00,DD,46,01,19,71 DATA 23,70,C9,21,3F,A0,7E,B7, C8,CD,5A,BB,23,18,F7,6E DATA 62,72,65,20,70,61,72,61, 6D,2E,6E,27,65,73,74,20 DATA 70,61,73,20,33,0D,0A,00Le message commence en position 64 par 6E 62 72 65 20 70 61 ..(nbre pa..). Mais la routine a besoin de l'adresse du message, adresse donnée en positions 53 et 54 : 3F, A0, c'est-à-dire &A03F. On voit bien que si la routine est chargée à une autre adresse que A000, A03F ne correspondra plus du tout au début du message. On dit en bon franglais que la routine n'est pas relogeable (anglais RELOCATABLE), "to locate", signifiant TROUVER ou FIXER LA POSITION; la notion de logement ou de local en est absente. Nous vous engageons, malgré cette aberration linguistique à DEVERROUILLER les Routines RSX. Vous en serez récompensés par la possession de petites merveilles RELOGEABLES que vous chargerez aux adresses convenant à vos divers programmes BASIC. RSX ou pas RSX Nous prenons le risque de donner une opinion personnelle sur cette question. Sans être exhaustif, voici quelques propositions : - Si une routine CALL n'est pas relogeable, la transformer en RSX.
- Si une routine CALL est relogeable, ne pas la transformer en RSX.
Néanmoins, un élément supplémentaire est à prendre en compte : — Si la routine CALL relogeable doit être utilisée en mode COMMANDE (ou mode DIRECT) sa transformation en RSX peut être souhaitable. Il sera alors éventuellement nécessaire de lui adjoindre un message d'erreur, message qui aura d'ailleurs pour effet de la rendre encore moins relogeable. Dans ces conditions, il peut être utile d'avoir 2 versions de la même routine, l'une CALL, l'autre RSX. Bernard BESSE , CPC n°19 ★ AMSTRAD CPC ★ DOWNLOAD ★ |
|
CPCrulez[Content Management System] v8.7-desktop Page créée en 474 millisecondes et consultée 1413 foisL'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. |
|
|