APPLICATIONSDIVERS ★ QUICK 55 (AMSTAR&CPC) ★

Quick 55 (Amstar&CPC)Applications Divers

QUICK 55 vous permet d'accéder à 55 RSXs : ce sont des instructions supplémentaires, comparables à celles du BASIC excepté le fait qu'elles ne résident pas en permanence en
mémoire.

La syntaxe est semblable à celle du BASIC : on tape d'abord le nom de l'instruction, SUIVI D'UNE VIRGULE, puis on tape les paramètres nécessaires séparés par une virgule :
ÙNNNNNNN, paramètre!, paramètre2,...

Le nom de l'instruction est en fait précédé d'un ù ou | (symbole employé dans l'instruction ùCPM). Un exemple :

ùcircle,0,100,300,200 tracera un cercle de centre de coordonnées (300, 200) et de rayon 100.

Les paramètres pourront en fait être de 2 types :

- Des paramètres d'entrée : c'est le cas dans l'instruction ci-dessus. Ces paramètres permettent la réalisation d'une action (ici le tracé d'un cercle).

- Des paramètres de sortie : ce sont des variables qui, après l'appel d'une RSX, contiendront un résultat, ici, ce seront des variables de type entier, donc elles s'écriront A%,B%,C%... (le nom suivi de %) ; ces paramètres, avant l'utilisation de la RSX devront impérativement être initialisés : A%=0. B%=0... Les paramètres ainsi initialisés figureront dans les RSX comme suit :

ùNNNNNN,àA%,àB%,.. .(la variable entière précédée du @)

Par exemple : A%=0

ùPRIBUSY,àA%

renverra 0 dans A% si l'imprimante est prête à fonctionner, sinon 1. " Remarquons enfin qu'une combinaison des 2 types de paramètres est tout à fait possible.

UTILISATION DE POKE ET PEEK

QUICK 55 vous offre l'accès aux 64 K de mémoire supplémentaire dont dispose votre Amstrad ; malheureusement, cette mémoire ne peut être utilisée sous la forme d'un programme BASIC. Elle ne peut servir qu'à stocker des nombres, par le biais des instructions POKE et PEEK :

— POKE adresse, nombre stocke le nombre au niveau de l'adresse ; par exemple poke 27000,200 place le nombre 200 à l'adresse 27000. Il est indispensable que le nombre stocké soit compris entre 0 et 255 ; pour des nombres plus importants, on stocke à l'adresse voulue le reste de la division du nombre par 256 puis au niveau adresse+1 le quotient de cette division. Par exemple, on veut stocker 258 à partir de 27000 :
POKE 27000,2:POKE 27001,1

Pour stocker des chaînes de caractères, il suffira de stocker une succession de codes ASCII.

  • PEEK permet de connaître le contenu d'une case mémoire : après avoir tapé le dernier exemple, si vous faites A=PEEK (27000) A contiendra 2 ; il est ainsi possible de reconstituer des chaînes de caractères.

GESTION DE LA MÉMOIRE
STRUCTURE DE LA RAM ET LOGEMENT DE QUICK 55

2 possibilités vous sont offertes :

  • Vous êtes décidé à faire un programme BASIC de grande envergure : le MEMORY qui précède le lancement de QUICK 55 doit être un MEMORY 39849 : vous disposerez ainsi de 39 K pour votre programme BASIC, mais vous serez dans l'Impossibilité d'utiliser les 64 K supplémentaires de la mémoire si votre programme dépasse 16 K.
  • Le programme que vous avez décidé de créer ne dépassera pas 16 K : le MEMORY qui précède le lancement de QUICK 55 doit être un MEMORY 16383 ; vous pourrez alors utiliser lees 64 K de la mémoire supplémentaire grâce à QUICK 55 pour stocker des Images compilées, des SPRITES, ou encore des Informations par le biais de PEEK et POKE (cf Introduction ou tout autre manuel de référence).
  • Toute tentative d'utilisation des 64 K supplémentaires avec un programme BASIC de plus de 16 K entraînera un plantage assuré II!

Ceci étant clalrifié. voici les RSX relatives à la gestion de la mémoire...

* ùCONNECT, (N° de bloc)
avec : n° de bloc compris entre 1 et 5.

Permet de connecter l'un des blocs de mémoire de 16 K (en fait 16,384 K) compris entre 1 et 5 et situés entre 16384 et 32767 : ces blocs de mémoire sont dits "parallèles" : initialement, le bloc n° 1 est connecté ; c'est celui qui est utilisé soit pour le programme BASIC, soit pour stocker des informations, et qui fait partie de la mémoire directement accessible à l'initialisation. Les 4 autres constituent la mémoire supplémentaire (16*4=64 K)- sont interchangeables avec le bloc n° 1, mais ne peuvent en aucun cas être utilisés simultanément. Un petit exemple :

10 REM EXEMPLE 1
20 FOR I=1 T0 5
30 ùCONNECT,I 'connecte le bloc I
40 POKE 16384,I:POKE 32767,I '1 en 16384 et 32767 pour chaque bloc
50 NEXT I
60 END

Le programme ci-dessus connecte les différents BLOCS de RAM et place au début et à la fin de chacun d'eux leur numéro ; ainsi, après avoir lancé le programme ci-dessus, si vous faites :

ùCONNECT,I:? PEEK (16384):? PEEK (32767)

Vous obtiendrez deux fois 3. Comme vous le verrez plus loin, cette instruction est particulièrement utile et est l'un des atouts majeurs de QUICK 55 ; elle simplifie considérablement l'utilisation de la mémoire supplémentaire : le bloc désiré ayant été connecté, il devient aussi accessible que le reste de la RAM ; vous comprenez maintenant qu'on ne puisse utiliser la RAM supplémentaire avec un programme de plus de 16 K : en effet, un programme de ce type aurait une partie de son listing placé dans le bloc 1, à partir de 16384 K ; un ùconnect.2 déconnecterait (certes sans l'effacer) ce bloc indispensable au bon fonctionnement de votre programme et le remplacerait par un bloc neuf, le bloc 2 : essayez, le plantage est quasiment assuré !!!

* ùTRANSCHAR, (adresse de départ), (premier caractère)

avec : adresse de départ inférieure à 39849 premier caractère étant un code ASCII

Permet de déplacer la table des caractères redéfinissables. Explication : le MEMORY qui précède le lancement de QUICK 55 condamne théoriquement la redéfinition de caractères ; en effet, si vous tentez un SYMBOL AFTER 32, par exemple, vous obtiendrez un Improper Argument. ùTRANSCHAR permet de résoudre ce problème en réallouant une place aux caractères.redéfinissables : vous devez pour cela Indiquer une adresse de stockage de la table, ainsi que le code ascii du premier caractère que vous souhaitez redéfinir ; la place mémoire occupée par la table est variable : elle peut aller jusqu'à 2 Ksi le premier code ASCII choisi est 32 ; il est bien sûr impossible de placer cette table entre 16384 et 32767 si on utilise la mémoire supplémentaire... la table serait en quelque sorte déconnectée et donc Inutilisable. Evitez également de la placer en 39000, par exemple, si le premier caractère devant être redéfini est 32 : la table mordrait sur les routines de QUICK 55, et le plantage serait assuré. Il est possible de prévoir la place prise par la table en la plaçant d'abord dans un endroit sûr, puis. à l'aide de PEEKs. en en cherchant la fin (lorsqu'une série suffisamment importante de 0 est trouvée, on peut être assuré que la table s'arrête à l'endroit correspondant ; on soustrait alors cette adresse finale à l'adresse de placement de la table et on obtient la longueur) ; la longueur ayant été calculée, on peut replacer la table à un autre endroit. Un exemple :

Si vous faites ùconnect,37840,32 vous pourrez sans aucun problème faire un SYMBOL 32................... (le SYMBOL AFTER n'est pas nécessaire) : mais la mémoire située au-delà de 37840 sera désormais condamnée (s'y trouveront la table suivie des routines de QUICK55).

* ùTRANSCHARQ,àX%,àY%

avec : X% et Y% deux entiers naturels AYANT ETE DEFINIS AU MOINS UNE FOIS AUPARAVANT PAR X%=0. Y%=0.
Renvoie les paramètres de la routine précédente (le Q qui termine la RSX est le symbole de QUESTION) : supposons qu'auparavant, vous ayez fait un ùTRANSCHAR, 31000,74; tapez les instructions suivantes :

A%=0:B%=0
ùTRANSCHARQ,àA%,àB%
? "A% = ";A%
? "B% = ";B%

Vous obtiendrez à l'écran A% = 31000 et B% = 74 ; on remarquera que si l'adresse dépasse 32768,A% ne contiendra pas l'adresse mais :
adresse-65536 : un nombre négatif vous sera donc renvoyé, une conversion sera nécesssalre (la valeur d'une variable entière ne peut dépasser 32768).

* ùFILLRAM, (octet remplissage),
(adres.déport), (adres.arrivée)

Remplit la zone mémoire qui commence à 'adresse de départ' et se termine à 'adresse d'arrivée par l'octet de remplissage ; si on appelle X et Y ces deux adresses, la RSX est équivalente à :

FOR I=X TO Y:POKE I,OCTETremplissage: NEXT I

Cette Instruction à l'avantage d'être nettement plus rapide (essayez pour voir) que son équivalent BASIC. Elle est particulièrement utile lorsqu'on décide de nettoyer une partie de la RAM. Par exemple, supposons que vous vouliez nettoyer les 5 blocs de mémoire parallèles de 16 K : il suffit de faire :

10 REM EXEMPLE 2
20 FOR I=1 TO 5
30 ùCONNECT,I 'connection du bloc I
40 ùFILLRAM,0,16384,32767 'nettoyage du bloc connecté
50 NEXT I
60 END

* ùTRANS, (adres.deparî), (adres. arrivée), (nb octets)

Provoque la recopie de 'nb octets'placés à partir de 'adresse départ" vers la zone débutant à 'adresse arrivée' : en appelant x, y, z ces 3 paramètres, l'équivalent BASIC est :

FOR I=0 TO X-1
POKE Z+1, PEEK(Y+I)
NEXT I

Là encore, le temps gagné par la RSX est très Important. Un exemple d'utilisation : supposons que vous ayez 5 'écrans'enregistrés sur votre disquette (par le classique SAVE "NNNNNN", B,49152,16384:

'ECRAN1', 'ECRAN2', 'ECRAN3', 'ECRAN4', 'ECRAN5' ; le programme qui suit permet de charger ces écrans, de les stocker dans la mémoire supplémentaire (rem: cela aurait pu être fait plus simplement en chargeant directement les écrans en 16384, mais le programme qui suit est destiné à expliciter l'utilisation de ùTRANS).

10 REMEXEMPLE 3
20 FOR I=1 T0 5
30 ùCONNECT,I 'connection du bloc I
40 A$="ECRAN"+CHRS(48+I)
50 LOAD A$ 'chargement de 'ECRAN I' (à partir de 49152)
60 ùTRANS.16384,49152,16384 'transfert de l'écran vers bloc I
70 NEXT I
80 END

Dans le programme ci-dessus, les blocs mémoire sont connectés un à un ; puis l'écran correspondant est chargé à l'écran, c'est-à-dire à partir de l'adresse 49152 ; de là. l'écran est transféré dans le bloc connecté (à partir 16384) ; on remarque que la longueur du transfert correspond à la longueur de l'écran : 16384 octets.
Cette Instruction permet en outre des déplacements de blocs de mémoire particulièrement utiles : transfert de tables de caractères redéfinissables, déplacerr^nt d'informations stockées...

* ùCOMP,àX%, (adres.compll), (longueur), (adres.stockage)
avec : X% une variable entière définie à l'avance (X%=0)

Provoque la compilation d'une zone mémoire de taille longueur' située à partir de 'adresse de compilation' : la zone compilée est stockée à partir de 'adresse de stockage'. La longueur de la compilation est renvoyée dans X%. Pour ceux qui ne savent pas ce qu'est une compilation, voici quelques explications : supposons que vous ayez à sauvegarder sur disquette une zone de la mémoire : disons la sauvegarde d'une partie du bloc de RAM connecté, de 16384 à 20383 ; cette zone contient Inévitablement des séries d'octets identiques : en particulier, des séries de zéro successifs ; d'où l'idée de regrouper ces octets successifs identiques en deux octets : l'un Indiquant le type de l'octet (0255...), l'autre le nombre de successions de l'octet ; la zone mémoire peut donc par ce moyen être considérablement réduite : dans le cas général, on peut estimer la réduction à une division par deux ; mais cela reste très variable, et comme nous le verrons plus loin, la zone compilée peut même être plus longue que la zone initiale... Il est bien sûr Indispensable de conserver la compilation de la zone dans un endroit de la mémoire, pas forcément le même que la zone mémoire elle-même (cela est même à éviter, car des phénomènes de superposition lors de la compilation peuvent se produire) ; il faut d'autre part anticiper la longueur de la compilation : il serait regrettable de prévoir le stockage de la compilation en 38000 alors que celle-ci à toutes les chances de dépasser 2 K... Revenons à notre exemple : on choisit de stocker la compilation en 32768, juste après la fin du bloc connecté (la compilation est supposée ne pas dépasser 7 K). Il suffit de faire pour cela :

A%=0
ùCOMP, àA%,16384,4000,32768

La compilation des octets situés de 16384 à 20383 est maintenant placée à partir de 32768 (la zone mémoire située à partir de 16384 n'a bien sûr pas été altérée) ; la longueur de la compilation, qui Je le rappelle, ne peut être connue à l'avance, est placée en sortie dans A%. Pour sauvegarder la compilation de la zone mémoire concernée, il suffit alors de faire :
SAVE "NNNNNN", B. 32768 A%

Vous pouvez ensuite rappeler ultérieurement cette compilation sauvegardée, qui, dans l'état actuel des choses EST BIEN SUR INUTILISABLE. D'où nécessité de 'décompiler' la zone mémoire : c'est ce que permet l'instruction qui suit...

* ùDECOMP, (adres.stockage), (adros. decompllation)

Provoque la décompilation de la zone mémoire située à 'l'adresse de stockage' ; la zone décompilée est placée à partir de 'adresse de décompilation' ; dans l'exemple précédent, après avoir fait un LOAD "NNNNNN" (Le bloc compilé est replacé en 32768, sauf si on précise une autre adresse), pour décompiler le bloc, vous devez entrer :

ùDECOMP,32768,16384

Une des principales applications de la compilation/décompilation est la compilation d'écran : l'écran constitue un bloc de 16,384 K (17 K sur le catalogue d'une disquette) ; le nombre d'écrans stockables sur une face de disquette est donc très limité ; d'où l'idée d'utiliser la compilation :

10 REM EXEMPLE 4:COMPILATION D'ECRAN (STOCKAGE PROVISOIRE A PARTIR
20 REM DE 16384)
30 A%=0
40 ùCOMP,àA%,49152,16384,16384 'compilation à partir de 16384
50 SAVE "COMPILE", B. 16384. A% 'sauvegarde
60 END

Pour recharger l'écran, ultérieurement. Il vous suffira alors d'Intégrer le petit programme suivant :

10 REM DECOMPILATION D'ECRAN (STOCKAGE PROVISOIRE A PARTIR DE
20 REM 20000
30 LOAD "COMPILE", 20000 'chargement de compile à partir de 20000
40 ùDECOMP. 20000,49152 'décompilation
40 END

Dans le programme ci-dessus, on a choisi de charger le COMPILE' à un endroit différent de la compilation, pour bien montrer que la localisation de cette compilation n'a aucune importance ; puis l'écran est décompi-ié. Quelques remarques : comme il a été précisé précédemment, la compilation peut à la limite être plus longue que la zone initiale elle-même ; c'est en particulier le cas lorsque vous tentez de compiler une compilation... L'utilisation conjuguée de la mémoire supplémentaire et de ces instructions vous permet donc de garder un nombre d'écrans en mémoire assez important : vous connectez un à un les blocs mémoire parallèles, puis vous compilez dans le bloc connecté autant d'écrans que vous le pouvez ; puis vous passez à un autre bloc, et ainsi de suite.

SYSTEME DISQUE
FORMAT D'UNE DISQUETTE

La disquette sur laquelle vous stockez vos Informations dispose d'une organisation Interne qui permet de gérer les 178 K disponibles : les 178 K se décomposent en 'pistes'(40) qui elies-même se décomposent en 'secteurs', généralement 9, de 512 octets.

La numérotation des pistes est toujours la même : de 0 à 39 ; mais pour ce qui concerne les secteurs, tout dépend du 'format' choisi au moment du formatage.

  • Format système : vous disposez de 9 secteurs par piste, numérotés de 65 à 73 ; inconvénient : les deux premières pistes, 0 et 1 sont réservées à l'installation du CPM.
  • Format données : vous disposez encore de 9 secteurs par piste, numérotés de 193 à 201 ; mais cette fois-ci, aucune piste n'est réservée.
  • Format IBM : 8 secteurs par pistes numérotés de 0 à 7 (format très peu utilisé).

Comme vous le verrez plus loin, il est possible de stocker des informations sur disquette sans passer par le SAVE habituel : Il suffit tout simplement d'écrire sur la disquette une zone mémoire de 512 octets en indiquant la piste et le secteur sur laquelle elle peut être stockée. Voici les RSX concernant l'utilisation du lecteur de disquette :

* ùDISCQ, àX%(0)

avec : X% un tableau unidimen-sionnel d'entiers naturels ayant été ini-tialisé par : DIM X%(6).

Analyse des paramètres de la disquette insérée, à condition que celle-ci ait été utilisée au moins une fols par l'ordinateur après son insertion (par le biais d'un CAT, d'un SAVE...) ; sinon les paramètres renvoyés dans le tableau X% sont ceux par défaut, ou ceux de la disquette précédemment utilisée. Après envoi de la RSX, vous aurez dans X%(0), X%( 1 ), X%(2), X%(3), X%(4), X%(5), X%(6) les paramètres du système disque :

  • X%(0) : contient le numéro du lecteur utilisé : 0 ou 1
  • X%(1) : renvoie le numéro USER en cours, c'est-à-dire le numéro de zone du catalogue (pour plus de détail sur USER, consulter ùUSER2).
  • X%(2) : contient 255 si aucun fichier n'est actuellement en lecture (fichier ouvert par un OPENIN), sinon renvoie le numéro du lecteur de disquette concerné.
  • X%(3) : même principe que pour X%(2), sauf que cette fois-ci, ce sont les fichiers en écriture qui sont concernés (ouverts par un OPENOUT).
  • X%(4) : indique le numéro de premier secteur de chaque piste de la disquette (65,193. ou 0).
  • X%(5) : Indique le nombre de secteurs par piste (9 ou 8).
  • X%(6) : renvoie l'octet de remplissage des secteurs vierges : généralement 229.

Cette instruction est indispensable pour connaître le premier numéro de secteur des pistes, donc pour utiliser les RSX ùRSEC et ùWSEC (voir plus loin). Elle permet également de voir si la lecture ou l'écriture d'un fichier est en cours, et plus spécialement sur quel lecteur de disquette. La connaissance du numéro USER est souvent très intéressante, comme vous allez le voir dans l'instruction qui suit.

* ùUSER2, (numéro user)

avec : numéro USER compris entre 0 et 255.

sélectionne le n° USER. Explication pour ce qui ne connaissent pas les avantages de la fonction USER : la commande BASIC (disponible dès l'initialisation) ùUSER, (numéro USER) avec numéro user compris entre 0 et 15 permet de morceller l'accès aux fichiers contenus sur disquette : initialement.

le numéro USER est 0 ; c'est celui qui apparaît lorsque vous faites la commande CAT. Si maintenant, vous faites ùUSER, 1 puis un CAT, vous obtiendrez un catalogue vide ; en effet, aucun fichier n'a été enregistré alors que le numéro USER était de 1. De même, si vous tentez de lire un fichier enregistré alors que le numéro USER était de 0, vous obtiendrez un message d'erreur ; par contre, si vous enregistrez un programme sous ce numéro USER, Il sera Invisible et Indisponible sous le numéro USER 0. L'Intérêt ? Vous pouvez ainsi rassembler les fichiers d'un logiciel sous un même numéro USER, et ainsi séparer les logiciels dans les différents numéros USER. Le problème avec l'Instruction BASIC ùUSER, c'est qu'elle ne permet d'avoir accès qu'à 16 USERs. Avec ùUSER2, vous en avez 256 possibles.

Autre avantage de ùUSER2 : vous pouvez récupérer des fichiers effacés par un ùERA : en effet, lorsque vous faites ùERA, "NNNNNN", (s'il reste de la place sur la disquette), le fichier NNNNNN n'est pas directement effacé : Il est simplement transféré dans le USER 229. Il suffit donc de faire un ùUSER2,229, et vous avez accèsà l'ensemble des fichiers effacés. Vous pouvez alors faire un load, repasser sur le USER 0 et réenregistrer ledit fichier.

* ùERRO, (Indicateur)

avec : Indicateur égal à 0 ou 255.

Autorise l'affichage des messages d'erreur concernant le disque si l'indicateur est égal à 0, sinon ces messages sont Inhibés.

* ùFORMAT, (numéro lecteur), (type format)

avec : numéro de lecteur égal à 0 ou 1 et type de format égal à 65, 193 oui.

Sélectionne un type de format :

  • type = 65 => format système.
  • type = 193 => format données.
  • type = 1 => format IBM.

* ùDIRE, (adres. stockage)

Stocke le catalogue de la disquette à partir de l'adresse de stockage' ; une zone de 2,048 K libres suivant l'adresse est nécessaire. L'avantage de cette RSX est qu'elle vous permet d'avoir accès au catalogue de la disquette sans que celui-ci apparaisse à l'écran. LA RSX ayant été exécutée, le catalogue est représenté comme suit (on appelle x l'adresse de stockage) :

  • PEEK(X) : 255 pour indiquer la présence du premier fichier
  • PEEK(X+1). PEEK(X+2),... PEEK(X+8) : codes ASCII du nom du fichier
  • PEEK(X+9), PEEK(X+10), PEEK(X+11) : codes ASCII de l'extension (BAS, BIN,...) avec addition éventuelle de 128 sur chacun de ces octets
  • PEEK(X+12) : nombre de K du fichier
  • PEEK(X+13) : 0 pour conclure.
  • PEEK(X+14) ; 255 pour Indiquer ta présence d'un second fichier............ (répétition de la même série).

Le problème des 128 ajoutés aux codes ascil de l'extension (Il s'agit en fait de la validation de certaines options) peut être résolu par le biais de l'instruction AND : A AND 127 ne modifie pas A si A? 65 and 127 donnera 65.
? 193 and 127 donnera 65. Notez bien que le stockage du catalogue nécessite 2048 octets : attention aux recouvrements des routines de QUICK55 !

Pour terminer sur cette instruction, voici un petit programme (incluant le chargement de QUICK 55 qui permet de stocker les noms de fichier du catalogue dans un tableau unidimensiorv nel (le tableau a été dlmenslonné à 40 pour ne pas trop prendre de place en mémoire, mais il peut bien sûr être dlmenslonné au nombre d'entrées maximum du catalogue.

1 REM EXEMPLE 5
10 DIMNS(40)
20 MEMORY 16383
30 LOAD "QUICK55"
40 CALL &9BAA:CALL &A1E5:L=1
50 CLS:? "INSEREZ LA DISQUETTE SOURCE"
60 C$=INKEYS:IF C$='" THEN 60 ELSE ùDIRE,16384
70 FOR I= 16384 TO 18432 STEP 14
80 IF PEEK(I) < > 255 THEN 130
90 M$=":FOR J=1 T0 8:M$=M$+CHRS(PEEK(I+J)):NEXT J
100 M$=M$+V
110 FOR K=0 TO 2:M$=M$+CHR$(PEEK(I+J+K) AND 127):NEXT K
120 N$(L)=M$:L=L+1
130 NEXT I

Le programme ci-dessus dlmenslonné d'abord le tableau de stockage des noms : N$.
Puis "QUICK55" est chargé ; on demande à l'utilisateur de placer la disquette dont il veut avoir le catalogue (attente de la frappe d'une touche) ; le catalogue est alors placé en 16384. Une boucle (I) permet de balayer les 2048 octets du catalogue de 14 en 14 octets : le nom du fichier en cours de formation est stocké dans M$: d'abord le nom en lui-même (boucle J), puis l'extension (boucle K).
Le nom final est stocké dans N$(L) ; L est incrémenté.
Le ligne 80 permet de vérifier s'il y a effectivement un fichier à partir de I.

* ùHEAD, àX%(0), (adres.stocka-ge), àZ$

avec : ZS une chaîne de caractères contenant le nom d'un fichier.
X% un tableau unldimensionnel d'entiers naturels ayant été dimension-né par DIM X%(2).
Lecture du header du fichier de nom ZS ; l'adresse de stockage doit précéder 2 K libres (tampon de réception) ; en sortie.

  • X%(0) contient le type du fichier : 0 si le fichier est un fichier BASIC, 1 si le fichier est BASIC et sauvegardé en protégé, 2 s'il est binaire, 22 s'il est de type séquentiel.
  • X%(1) contient l'adresse de début du fichier en mémoire sauf s'il s'agit d'un fichier ASCII : l'adresse du tampon que vous avez proposé est renvoyée.
  • X%(2) contient ta longueur du fichier (nombre exact d'octets).

Remarquez que l'adresse de stockage et les 2 K libres nécessaires ne sont d'aucune utilité pour vous, mais sont Indispensables au bon fonctionnement de la RSX. Un exemple d'utilisation:

DIM A%(2)
B$="QUICK55"
ùHEAD,àA%(0), 16384, àB$

vous donnera :

A%(0)=2
HEXS(A%(1))=&9BAA
A%(2)=2727

Cette Instruction vous permet donc de déterminer le type d'un fichier dont l'extension n'est pas une extension habltuelle ; pour les programmeurs en assembleur, elle permet de déterminer l'endroit à partir duquel Ils peuvent désassembler.

* ùRSEC, (rf de lecteur), (rf de piste), (n° de secteur), (adres.stockage)

Lecture du secteur *n° de secteur1, situé dans la piste 'n° de piste' ; le numéro du lecteur doit être précisé (0 ou 1 ) ; le secteur de 512 octets est placé à partir de l'adresse de stockage. Le numéro de secteur dépend du type de format (voir plus haut).

Exemple :
ùRSEC, 0, 5, 193, 16384 lit le premier secteur de la piste 5 et le stocke à partir de 16384 (le format est supposé être format données).

* ùWSEC, (rf de lecteur), (n° de piste), (n° de secteur), (adres.stockage)

Effectue l'opération Inverse de la précédente : les 512 octets placés à partir de ad.stock sont sauvegardés dans le secteur dont on donne les coordonnées.

Quelques remarques sur ces deux Instructions : si vous désirez utiliser les secteurs et que le format de la disquette est inconnu, vous pouvez vous servir de ùDISCQ. Ces deux Instructions vous permettent en outre de faire des copies Intégrales de disquette : vous chargez au moyen de deux boucles Imbriquées les secteurs de chaque piste, et vous les stockez en mémoire ; puis vous changez de disquette et vous les sauvegarder grâce à ùWSEC. Cette opération ne pourra bien sûr pas s'effectuer en une seule fois : vous pouvez cependant utiliser la mémoire supplémentaire pour charger un maximum de secteurs, puis vous les sauvegardez et vous recommencez l'opération avec les secteurs restants. Vous remarquerez dans certains cas que des disquettes n'ont pas un format constant ; en cas d'erreur, changez donc le numéro de secteur. Enfin, n'oubliez pas que l'utilisation des secteurs pour le stockage d'informations vous condamne à ne pas avoir de fichier sur la disquette : en effet, vous ne savez pas (sauf par le biais de logiciels spécialisés) dans quels secteurs est contenu votre fichier ; il risquerait donc d'être détruit. Ceci reste malgré tout un faible Inconvénient face aux possibilités énormes qui vous sont offertes par la manipulation des secteurs.

LE CLAVIER INTRODUCTION

Le clavier constitue l'un des éléments principaux du micro-ordinateur :
seul lien entre l'utilisateur et la machine. Il est bien souvent source de 'ralentissements* liés à la lenteur du BASIC ; Or, spécialement dans les Jeux, Il est Indispensable. Voici donc quelques RSX qui ont pour principal but de pallier au manque de rapidité du BASIC en ce qui concerne la scrutation du clavier ; quelques autres routines vous permettront simplement d'étendre les possibilités du BASIC dans ce domaine : tests de positionnement deCAPSLOCK...
Vous ne trouverez pas de routines spécialisées AZERTY ou QWERTY, puis-qu'actuellement la répartition est à peu près équitable, et qu'il n'y aurait aucune raison valable de privilégier tel ou tel autre type de clavier. Voici les RSX du clavier...

* ùCLRESET, (Indicateur)

avec : Indicateur compris entre 0 et 1

SI l'Indicateur est à 0 : provoque un simple reset du clavier : réinitialisation des touches de fonction.
SI l'Indicateur est à 1 : provoque une réinitialisation totale du clavier : outre le reset précédent, les états et les valeurs de touches, les délais d'attente et de répétition reprennent leurs valeurs par défaut.

Cette routine vous permet par exemple de remettre CAPS LOCK dans son état Initial, mais aussi de faire un 'nettoyage' du clavier sans avoir à passer par une succession d'Instructions BASIC.

* ùREP, (numéro de touche), (Indicateur)

avec : Indicateur égal à 0 ou 255

Donne à la touche dont le numéro est fourni la possibilité de se répéter si l'Indicateur est à 255. Inhibe cette possibilité si l'indicateur est à 0 (cette fonction est également accessible en BASIC par KEY DEF).

* ùREPQ, (numéro de touche), àX%

avec : x% une variable entière Initiallsée auparavant.

Renvoie 0 dans X% si la touche dont le numéro est fourni ne peut pas se répéter automatiquement, sinon renvoie 1 dans X%. Cette instruction est la complémentaire de la précédente.

* ùCLWAIT1, àX%

avec ; X% une variable entière ayant été Initialisée auparavant.

Cette routine provoque l'attente de la trappe d'une touche par l'utilisateur ; en sortie, le code ASCII du caractère frappé est placé dans X% ; cette RSX permet d'éviter le fameux :

[code1000 C$=INKEY$:IF C$="" THEN 1000 ELSE X%=ASC(C$)

Remarquez que cette attente de frappe n'est pas une attente dynamique : elle convient dans le défilement de menus, par exemple, mais ne peut être utilisée dans le cas ou des actions doivent être exécutées si l'opérateur n'appuie sur aucune touche (|eu d'action...) ; l'ordinateur attend simplement la frappe d'une touche, et, tant qu'une touche ne sera pas frappée, il attendra. D'où nécessité d'utiliser la RSX suivante dans le cas où l'on veut dynamiser l'attente.

* ùCLWAIT2, (code ascii 1), (code ascii2).....àX%

avec : X% une variable entière Initialisée auparavant.

Cette routine teste si l'une des touches dont le code ASCII est fourni est enfoncée. En sortie, X% contient 0 si aucun caractère n'a été frappé (parmi ceux proposés) sinon renvoie 1 si le premier caractère a été frappé, 2 pou le deuxième, et ainsi de suite. Par exemple, l'Instruction ùCLWAIT2, 65, 67,69, àX% équivaut à:

10 C$=INKEY$
20 IF C$=" " THEN X%=0
30 IF C$="A" THEN X%=1
40 IF C$="C" THEN X%=2
50 IF C$="E" THEN X%=3

Cette RSX vous permet donc d'éviter une belle série de IF THEN, en particulier dans le cas où l'Instruction est suivie d'un ON GOSUB. Par exemple, en reprenant le cas précédent, et en supposant qu'un sous-programme doit être effectué si aucune touche n'est frappée :

10 X%=0
20 ùCLWAIT2,65,67,69,àX%
30 ON X%+1 GOSUB...........
40 GOTO 20

La minimisation du nombre d'Instructions permet ainsi de gagner un temps souvent précieux, comme c'est le cas pour les jeux d'action. Notez qu'à la différence de l'instruction précédente, l'instruction est dynamique : la RSX n'attend pas la frappe d'une touche, mais regarde simplement si l'une des touches qui lui est proposées est frappée.

* ùCAPSQ. àX%,àY%

avec : X% et Y% deux variables entières Inltlallsées auparavant.

Contrôle l'état de la touche CAPS LOCK et de la combinaison CONTROL CAPS LOCK ;
En sortie :

  • X% contient 0 si la combinaison CONTROL CAPS LOCK n'est pas active (verrouillage du clavier pour shift) ; si cette combinaison a été enclenchée, X% contiendra 255 en sortie.
  • Y% contient 0 si CAPS LOCK est dans son état par défaut (majuscules seulement accessibles avec SHIFT ou verrouillage du clavier par CONTROL CAPS LOCK). contient 255 si CAPS LOCK a été enfoncé.

Notez que les deux variables renvoient des résultats Indépendants ; X% peut très bien donner 255 alors que Y% contient 0 : ce n'est pas parce que CONTROL CAPS LOCK a été enfoncé que CAPS LOCK seul l'a été.

* ùCAPS, (état CTRL CAPS LOCK), (état CAPS LOCK)

Cette Instruction permet d'agir sur les résultats de la précédente :

  • Si 'état CTRL CAPS LOCK' vaut 0, la combinaison CONTROL CAPS LOCK est désactivée ; au contraire, si la valeur envoyée est 255, la combinaison est activée.
  • Si 'état CAPS LOCK' vaut 0. on repasse en mode minuscules (le clavier peut cependant être verrouillé par l'indicateur ci-dessus) ; s'il vaut 255, on passe en mode majuscules.

Par exemple : ùCAPS, 0, 255 fait passer en mode majuscules et déverrouille le clavier. Cette RSX permet donc d'éviter les UPPERS... en agissant directement sur le clavier : vous serez ainsi sûr que ce sont des majuscules ou des minuscules qui sont frappées.

L'ECRAN
INTRODUCTION

L'écran est l'un des éléments centraux de l'ordinateur ; pourtant, la programmation de la mémoire vidéo sur CPC est loin d'être aisée, d'autant moins que la tâche du programmeur n'a pas été facilitée : une organisation de la RAM écran à passer des nuits blanches, absence de sprltes, descrol-llngs... Bref, Il y a beaucoup à faire, et les routines qui vont suivre ont pour but de vous simplifier la programmation.
Vous allez trouver dans les pages qui suivent de nombreuses routines 'd'analyse' de l'écran : elles vous permettront par exemple de savoir en quel mode vous êtes, de connaître le numéro de PAPER utilisé... Cela peut paraître paradoxal de proposer des routines qui vous signalent que vous êtes en MODE 1 alors que vous avez tapez quelques lignes plus haut MODE 1 ; ces routines sont en fait destinées à être utilisées dans le cas d'une manipulation d'un écran extérieur au logiciel que vous avez créé : à priori, le logiciel ne connaît pas le mode, les encres de l'écran sur lequel il va avoir à travailler, et ces routines lui donnent des Informations souvent indispensables.
De nombreuses Instructions, telles que SCROLL2 utilisent des coordonnées texte (ligne, colonne) ; même si vous travaillez en mode 0, ces coordonnées sont celles du mode 2 (25 lignes, 80 colonnes).

Voici les RSX de l'écran:

* ùSRESET

Provoque une réinitialisation de l'écran : le MODE 1 est restitué avec les couleurs par défaut ; Il s'agit à proprement parier d'un nettoyage radical, la base écran étant remise en &c000.

* ùSINIT

Initialisation du mode texte : encres, fenêtres, mode opaque reprennent leur valeurs ou position par défaut.

* ùMODQ, àX%

avec : X% une variable entière Initialisée auparavant.

Renvoie le mode de l'écran dans X%: 0,1 ou 2.

* ùWINDQ, àX%, àY%, àZ%. àl%

avec : X%, Y%, Z%, T% des variables entières Initlallsées auparavant.

Envoie dans X%, Y%. Z%, T% les limites de la fenêtre courante : dans X% et Y% les coordonnées du coin en haut à gauche, dans Z% et T% les coordonnées du coin en bas à droite.

* ùINKQ, X, àY%, àZ%

avec : Y% et Z% deux variables entières Initlallsées auparavant.

Permet d'accéder aux paramètres de couleur de l'INK dont le numéro est fourni dans X : en sortie, dans Y% et Z%, sont placées les deux numéros de couleur (le second numéro correspond à la couleur qui apparaît en alternance avec la première lors d'un affichage clignotant).

* ùPENQ, àX%

avec X% une variable entière Inl-tialisée auparavant.

Renvoie dans X% le numéro du PEN en cours.

* ùPAPERQ, àX%

avec X% une variable entière Ini-tlalisée auparavant.

Renvoie dans X% le numéro de PAPER en cours.

* ùOPAQ, àX%

avec X% une variable entière ini-tialisée auparavant.

Renvoie 0 DANS X% si l'on est en mode OPAQUE, sinon renvoie 1.

* ùSPINKQ, àX%, àY%

avec X% et Y% des variables entières Initlallsées auparavant.

Renvoie dans X% et Y% les deux paramètres de l'Instruction SPEEDINK correspondant aux périodes d'affichage des deux couleurs composant les encres.

* ùBORDERQ, àX%, àY%

avec X% et Y% deux variables entières inltialisées auparavant.

Renvoie dans X% et Y% les deux paramètres de la commande BORDER, c'est-à-dire les deux couleurs qui s'affichent en alternance.

* ùUMITQ, àX%, àY%

avec X% et Y% deux variables entières Initlallsées auparavant.

Renvoie dans X% et Y% les limites de l'écran ; cette Instruction, peut-être la plus Importante de toute cette série, permet non seulement de déterminer le mode mais permet en fait de connaître les limites de l'écran, qui diffèrent selon que l'on est en mode 0, 1 ou 2. Par exemple, si l'on est en mode 2. X% et Y% contiendront respectivement 80 et 25. Cette RSX vous permet donc, par exemple dans le cas de tests liés à la dimension de l'écran, de vérifier si tel ou tel objet se trouve dans les limites correctes de l'écran, sans pour cela avoir à connaître le mode dans lequel le programme se trouve.

* ùCNON, (Indicateur)

Inhibe l'affichage des caractères si l'indicateur est 0 ; si l'Indicateur est à 1, l'affichage des caractères est autorisé. C'est cette RSX qui est utilisé directement en assembleur pour la RSX ùDIRE: l'affichage des caractères est inhibé, le catalogue est alors uniquement stocké en mémoire ; puis l'affichage des caractères est à nouveau autorisé. La routine permet donc d ' effectuer des opérations liées à I ' affichage des caractères (c'est le cas de l'Instruction CAT), sans pour cela que l'utilisateur du logiciel en soit averti.

* ùNOIR

Provoque un 'flash' à l'écran : à utiliser dans les jeux pour les effets spéciaux.

* ùSCROLL1, (direction)

Provoque un scrolllng de l'ensemble de l'écran, dans la direction indiquée par le paramètre :

'direction'=1 => scrolllng vers la gauche.
'dlrection'=2 => scrolllng vers la droite.
'direction'=3 => scrolllng vers le haut.
'direction'=4 => scrolllng vers le bas.

Cette instruction permet ainsi d'éviter de longues procédures BASIC (ce qui est non négligeable dans un jeu d'action) pour déplacer ce qui apparaît à l'écran. Quelques remarques : la partie de l'écran qui disparaît réapparaît à l'autre bout après scrol-ling ; toutefois, le scrolllng horizontal provoque le déplacement des caractères effacés une ligne plus bas, à l'autre bout de l'écran. D'où un décalage de l'ensemble. Voici un petit exemple pour fixer les Idées :

10 MEMORY 16383
20 LOAD "QUICK55.BIN"
30 CALL &9BAA:CALL &A1E5
40 A%=0
50 ùCLWAIT2.242,243,240,241.àA%
60 IF A%=0 THEN 50 ELSE ùSCROLL1,A%:GOTO 50
70 END

Ce programme, après le chargement de QUICK55, et Initialisation de la variable A%. effectue une attente dynamique de touches : les codes ASCII correspondent aux codes des touches du déplacement curseur. Dès que l'une des touches est enfoncée, le scrolling correspondant de l'écran est effectué ; puis on retourne à l'attente touche.

Ce type de scrolllng n'est cependant pas Idéal pour être utilisé dans un jeu, du fait des problèmes liés aux remplacements des caractères décalés. D'où la nécessité de l'instruction qui suit.

* ùSCROLL2, (direction), (co1), (co2), (co3), (co4), (octet remplissage)

Provoque un scrolling d'une partie de l'écran ; deux directions sont possibles pour le scrolling : vers le haut (directions ) ou vers le bas (direction=0). La fenêtre qui doit défiler est définie par les coordonnées du coin en haut à gauche (co1 et co2) et par les coordonnées du coin en bas à droite (co3 et co4), ces coordonnées étant bien sûr comprises dans l'écran TEXTE. Ici, la ligne texte qui disparaît ne réapparaîtra pas à l'autre bout de la fenêtre mais la ligne libérée par le décalage sera remplie avec 'octet remplissage'. Il est bien sûr possible de prévoir l'apparition de nouveaux caractères qui viendront sur la place libérée : on retrouve en fait le principe du Jeu IKARI WARRIOR. Ce type de scrolling, certes plus difficile à manier que le précédent, me paraît cependant plus puissant, dans la mesure où l'on sait exactement ce qui va disparaître, ce qui va réapparaître. Voici un petit exemple d'application de SCROLL2 :

10 MODE 2
20 MEMORY 16383:LOAD "QUICK55.BIN":CALL &9BAA:CALL &A1E5
30 FOR I=1 TO 14 : ùSCROLL2,1,10, 10,62,18,0
40 LOCATE 17, 18:READ A$:PRINT A$:NEXT I
50 RESTORE:GOTO 30
100 DATA"............................."
110 DATA"- ;-"
120 DATA"- ;-"
130 DATA"- ;QUICK 55 -"
140 DATA"- ;-"
150 DATA"- ;SCROLL2 vous -"
160 DATA"- permet de -"
170 DATA"- dynamiser -"
180 DATA"- l'affichage de -"
190 DATA"- notices,textes -"
200 DATA"- en tous genres. -"
210 DATA"- ;-"
220 DATA"- ;-"
230 DATA"............................."

Dans le programme ci-dessus, après chaque scrolling, une nouvelle ligne de DATAS est lue et placée à l'endroit "nettoyé' par l'octet 0 qui a été choisi dans la commande SCROLL2. Dans de tels types de programmes, un réglage de la vitesse de défilement est bien sûr indispensable (boucle d'attente ou commande ùTIME. voir plus loin. L'avantage d'un vez faire défiler juste une partie de l'écran, le reste étant fixe (scores dans un jeu...).

* ùSPRITE2, (adres.stock), (co1), (co2), (co3), (co4)

Voici la première instruction concernant les sprites : cette RSX 'photo-grapnie' une partie de l'écran et la stocke en mémoire ; la zone écran est stockée à partir de 'adresse stockage'. La partie de l'écran stockée est donnée par co1, co2, co3 et co4, ces 4 nombres étant les coordonnées dans le mode texte 2 du rectangle-écran stocké : co1 la ligne du coin en haut à gauche, co2 la colonne de ce même coin ; co3 le nombre de colonnes du sprlte et co4 le nombre de lignes. La place prise en mémoire par le SPRITE est donnée par : co3*co4*8.

ùSPRITE2,21000,1,10,13.15

Le rectangle affiché à l'écran (qui peut contenir aussi bien des dessins que des caractères), donné par (1, 10) pour le coin en haut à gauche, de longueur 13 et de hauteur 15. sera stocké à partir de 21000. Vous pouvez ainsi stocker plusieurs sprites en mémoire, et les rappeler successivement avec l'instruction qui suit.

* ùSPRITE1, (adres.stock), (co1), (co2), (co3), (co4)

Cette instruction effectue l'opération inverse de la précédente, et replace à l'écran un sprite stocké en mémoire : c'est l'adresse de stockage qui est donnée en premier, suivie des coordonnées du sprite. Les coordonnées doivent bien sûr aboutir à un rectangle de même taille que le rectangle qui avait été stocké, sinon des problèmes surviendront automatiquement : Chaque SPRITE 1 qui pointe sur une zone mémoire doit inévitablement avoir été précédé d'un SPRITE2 pointant sur cette même zone mémoire et ayant stocké un rectangle d'octets de même dimension.

Cette instruction peut facilement être combinée avec la précédente pour le déplacement d'objets ou personnages à l'écran : voici le type d'algorithme à employer :

  • stockage de l'objet dessiné en mémoire (à partir de AD1).
  • affichage d'un décor.
  • stockage provisoire de la partie du décor qui va être effacée par l'objet (à partir de AD2).
  • affichage de l'objet à l'endroit correspondant (avec SPRITE 1. à partir de AD1).
  • l'objet se déplace : la partie du décor provisoirement effacée est réaffichée sur l'objet (avec SPRITE 1, à partir de AD2). Puis l'ensemble des opérations se répète à côté, pour simuler le déplacement.

Vous pouvez ainsi multiplier le nombre d'animations, en utilisant au besoin les 64 K supplémentaires de la mémoire. Les sprites vous permettront également de réaliser des programmes de mise en page, des menus déroulants en suraffichage.... L'éventail des possibilités est assez large.

* ùFILLC, (co1), (co2), (co3), (co4), (octet remplissage)

Remplit une zone de l'écran avec un type d'octet : l'octet remplissage ; en particulier, si vous choisissez 0, l'instruction provoque un nettoyage de la partie de l'écran concerné. La zone écran concernée est donnée par des coordonnées de type texte Oigne, colonne) ; co1 et co2 donnent la ligne et la colonne du coin supérieur gauche. co3 et co4 la ligne et la colonne du coin inférieur droit. De même que précédemment, les coordonnées sont celles du mode 2, même si vous vous trouvez en mode 0. L'octet choisi est naturellement compris entre 0 et 255. Cette instruction vous permet, outre des 'nettoyages'de réaliser par exemple des histogrammes : vous indiquez la taille de votre colonne histogramme, et celle-ci sera remplie avec l'octet choisi.

* ùFILLQ (adres.depart), (co1), (co2), (octet remplissage)

Cette instruction est semblable à la précédente, à la différence près que les coordonnées ne sont plus des coordonnées texte mais des adresses mémoires (davantage réservée aux connaissseurs de la mémoire vidéo) : l'adresse départ est l'adresse du premier octet à l'écran qui va être changé en octet de remplissage : il correspond au coin supérieur gauche ; co1 et co2 donnent la longueur et la hauteur du rectangle devant être rempli, cette fois-ci en terme d'octets (80 disponibles en longueur, 200 en hauteur). L'avantage par rapporta la RSX précédente est la précision gagnée en hauteur.

* ùSOCTET, (adres.stock), (co1), (co2)

Renvoie dans adres.stock est adres.stock+1 l'adresse de l'octet correspondant au caractère dont les coordonnées sont données par co1 et co2 (coordonnées en mode 2). L'adresse de l'octet est :
(contenu de adres.stock+1 )*256+ (contenu de adres.stock)
Cette routine sera particulièrement utile pour se servir de ùFILLO. Toutefois, de même que FILLO. cette instruction est à réserver à ceux qui ont des connaissances de base sur la mémoire vidéo.

LES GRAPHIQUES
INTRODUCTION

Voici l'avant-demler groupe d'Instructions de QUICK55 : les routines qui suivent vous proposent ;
— d'analyser les paramètres graphiques (coordonnées de la fenêtre graphique...)
— d'améliorer la vitesse de tracé de vos graphiques, tant sur le plan programmation que sur le plan vitesse d'exécution.
Comme vous pourrez le constater, le gain de temps d'exécution pour le tracé du cercle est assez important ; pour des tracés du type triangle, rectangle, le gain de temps est plutôt du côté de la programmation.

Voici les RSX graphiques :

* ùGINIT

Provoque une réinitialisation des graphiques : l'encre graphique est remise à 1, celle du fond à 0 ; l'origine est remise à (0.0) ; la fenêtre graphique est annulée.

* ùORIQ, àX%, àY%

avec : X% et Y% deux variables entières Inlttalisées auparavant.

Renvoie dans X% et Y% les coordonnées physiques de l'origine (celles définies par ORIGIN).

* ùWGRAQ, àX%, àY%, àZ%, àT%

avec : X%, Y%, Z% et 7% des variables entières inltlalisées auparavant.

Renvoie dans X%, Y%, 2%, TO> les coordonnées de la fenêtre graphique : dans X% et Y% les coordonnées du sommet gauche, dans 2% et T% les coordonnées du coin en bas à droite.

* ùGPENQ, àX%

avec : X% une variable entière Inl-tlallsée auparavant.

Renvoie dans X% le numéro de GRAPHICS PEN.

* ùGPAPERQ, àX%

avec : X% une variable entière Initlalisée auparavant

Renvoie dans X% le numéro de GRAPHICS PAPER.

* ùRECT, Onde), (co 1), (co2), (co3), (co4)

Trace un rectangle défini par les coordonnées du sommet gauche : co1 et co2 ; sa longueur : co3 et sa hauteur : co4. Si l'Indicateur est à 1, le rectangle tracé est un rectangle plein ; si cet Indicateur est à 0, le rectangle tracé est un rectangle simple.

Par exemple :

ùRECT, 1,10,10,10,1000,50

trace un rectangle plein ; les coordonnées du sommet gauche sont 10 et 10 ; la longueur est de 100, la hauteur est de 50 ; les coordonnées sont les coordonnées normales, celles qui se rapportent à l'origine.

* ùTRIANG, (co1), (co2), (co3), (co4), (co5), (co6)

Trace un trtangte défini par les coordonnées des 3 sommets : (co1, co2), (co3, co4) et (co5, co6). Les coordonnées sont celles qui se rapportent à l'origine.

Par exemple :

ùTRIANG, 10,10,100,100,300,200

* ùCIRCLE, (indic), (rayon), (co1), (co2)

Trace un cercle défini par le rayon et les coordonnées du centre (co 1 et co2). SI l'indicateur est à 1, le cercle tracé est un cercle plein, sinon le cercle est simple. Les coordonnées du centre, contrairement aux instructions précédentes, sont les coordonnées physiques, qui ne tiennent pas compte d'un éventuel changement d'origine. Par exemple, supposons que vous ayez fait un ORIGIN -500. -500, si vous faites :

ùCIRCLE, 1.50,320,200

vous obtiendrez un cercle plein qui s'affichera au centre de l'écran ; ceci s'explique par le fait que lors du tracé du cercle, pour faciliter le travail, un changement d'origine aux coordonnées du centre est effectué ; ce changement d'origine se fait selon les coordonnées physiques. Indépendamment de l'ancienne origine.

* ùSOCTET2, (adres.stock), (co1), (co2)

Renvoie dans adres.stock et adres.stock+1 l'adresse de l'octet sur lequel se situe le point dont les coordonnées ont été placées dans co1 et co2 : pour plus de détail, voir SOC-TET, qui est basé sur le même principe, à ta différence près qu'Ici les coordonnées envoyées sont des coordonnées graphiques et non pas texte ; à réserver aux habitués de la programmation de la mémoire vidéo.

COMPLEMENTS
INTRODUCTION

Voici les dernières Instructions de QUICK55 : une routine d'attente, une pour la réinitialisation du son, deux pour l'imprimante.

* ùTIME, (temps d'attente)
Provoque une attente correspondant au temps demandé : permet d'éviter le traditionnel
FOR I=1 TO...:NEXT I

Une attente de 120 correspond à peu près à 10s.

* ùSDRESET

Provoque une réinitialisation complète des sons : tous les sons de tous les canaux sont éliminés, les files d'attente vidées ; mais les enveloppes sont conservées.

* ùPRIRESET

Provoque un reset de la sortie parallèle, celle de l'imprimante.

* ùPRIBUSY, àX%

avec X% une variable entière ini-tialisée auparavant.

Regarde si l'imprimante est prête (allumée, papier présent...) : en sortie, X% vaut 0 si l'imprimante est prête, sinon vaut 1.

Jean Louis Benard, AMSTAR&CPC n°44
QUICK55 a été réalisé en assembleur, et les 55 instructions supplémentaires qu'il représente ne tiennent que sur à peine 3K de mémoire. Ceci n 'a été possible qu'au prix d'un certain sacrifice, que les programmeurs comprendront : les instructions ne protègent pas d'un mauvais passage de paramètres et une instruction mal utilisée peut provoquer un blocage de la machine. Il est donc vivement recommandé de sauvegarder les programmes utilisant QUICK 55 avant de les lancer.

En outre, il est conseillé de sauvegarder QUICK55 sur une disquette à part : une manipulation des secteurs sur la disquette contenant les RSX pourrait effacer celles-ci . D'ailleurs, l'idéal est de sauvegarder QUICK 55 sur chaque disquette contenant un logiciel qui utilise les RSX : leur chargement à partir de votre programme sera ainsi facilité. Pour cela. Il suffit de faire :

MEMORY 16383:LOAD 'QUICK55.BIN'

puis d'introduire fa nouvelle disquette et de taper :

SAVE 'QUICK55',B,&9BAA,2728

QUICK 55 sera ainsi transféré sur la disquette contenant votre logiciel.

Cliquez sur l'image pour l'agrandirCliquez sur l'image pour l'agrandir
UN EXEMPLE:
L'EDITEUR-COPIEUR DE SECTEURS

INTRODUCTION

Pour illustrer l'utilisation de ces RSX. Je vous propose un exemple de programme. Il s'agltd'un éditeur-copieur de secteurs disquette ; Il a été entièrement réalisé en BASIC, à l'aide de QUICK55, en 104 lignes. EDITEUR est l'exemple d'une réalisation habituellement réservée aux programmeurs assembleur, maintenant accessible en BASIC.

UTILISATION

ÉDITEUR nécessite la présence en permanence d'une disquette dans le lecteur ; il s'agit de votre disquette de travail, sur laquelle le menu principal, dans une fenêtre, vous donne des informations ; IL NE DOIT S'AGIR EN AUCUN CAS DE LA DISQUETTE COMPORTANT QUICK55, puisque des modifications peuvent avoir lieu, susceptibles d'effacer QUICK55. Le menu principal vous propose plusieurs options :

— Effacer un secteur : le secteur dont vous rentrez les coordonnées (n° de piste, n° de secteur) est effacé, et rempli avec l'octet de remplissage (&E5 au départ).

- Editer un secteur : le secteur dont vous entrez les coordonnées appa-raltà l'écran (octets en hexadécimal, pour que les 512 octets soient visibles à l'écran). La frappe d'une touche vous fait revenir au menu principal.

— Copie de secteurs : vous entrez le numéro de la piste, les numéros de secteurs devant être copiés d'une disquette à l'autre. Le programme vous Indique les disquettes (source ou but) à introduire, et attend après la frappe d'une touche.

- Copie Intégrale : la face entière d'une disquette est recopiée sur une autre ; l'ordinateur vous Indique les moments où vous devez changer de disquette. Remarque : la copie n'est possible que si la disquette est formatée de la même manière sur toute la face.

- Octet de remplissage : vous pouvez modifier l'octet avec lequel sont remplis les secteurs effacés.
L'ensemble de ces options est accessible en frappant le numéro lié à l'option.

STRUCTURE DU PROGRAMME

— Chargement de QUICK55 ; Initialisation

— Affichage du menu principal, après analyse de la disquette de travail (ÙDISQ) ; le ùDIRE permet simplement d'avoir un premier contact avec la disquette sur laquelle vont s'effectuer les opérations.

— Attente d'une touche, envol vers les différentes options.

— OPTION EFFACER : le ÙFILLC et le ÙRECT permettent d'obtenir un rectangle en surimpression (procédé utilisé également après). Le secteur virtuel est placé de 16384 à 16395. Il est rempli avec l'octet de remplissage, puis le secteur virtuel est sauvegardé.

- OPTION EDITION : le secteur virtuel est placé au même endroit que précédemment, puis il est affiché.

- OPTION MODIFICATION : chargement du secteur à partir de 16384, modifications par l'utilisateur, pub sauvegarde.

- OPTION COPIE SECTEURS : la piste ayant été choisie, les secteurs concernés sont chargés à partir de 16384, puis sauvegardés sur l'autre disquette.

— OPTION COPIE INTEGRALE : 2 fois de suite, 15 pistes sont charges dans les blocs de mémoire parallèle et sauvegardées sur la disquette destination. Pour les 10 dernières pistes, le principe est le même.

— OPTION OCTET DE REMPLISSAGE : l'octet est modifié.

Jean Louis Benard, AMSTAR&CPC n°45

★ EDITEUR: AMSTAR&CPC
★ ANNÉE: 1990
★ CONFIG: ???
★ LANGAGE:
★ LiCENCE: LISTING
★ AUTEUR: Jean-Louis Benard
 

★ AMSTRAD CPC ★ DOWNLOAD ★

Type-in/Listing:
» QUICK55DATE: 2010-08-24
DL: 282
TYPE: ZIP
SiZE: 6Ko
NOTE: 40 Cyls
.HFE: Χ

★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Applications » RSX Disk-Utility (Computer Partner)
» Applications » Disc-RSX
» Applications » Page RSX / PageEditor (CPC Amstrad International)
» Applications » RSX Pack Graphique n01 (Deuuligne #03)
» Applications » RSX String to Extra bank (Amstrad Action)
» Applications » RSX Rota (Amstrad User)
Je participe au site:
» Vous avez des infos personnel, des fichiers que nous ne possédons pas concernent ce programme ?
» 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.7-desktop
Page créée en 436 millisecondes et consultée 1994 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.