zx81 code ?

Tous les Sinclair. Du Mk14 au QL

Modérateur : Politburo

Répondre
era
Fonctionne à 75 bauds
Fonctionne à 75 bauds
Messages : 4
Enregistré le : 05 oct. 2012 11:45

zx81 code ?

Message par era »

Bonjour,
sur un petit programme il y a une ligne:
28 if x>13 then goto code "M"
je cherche à savoir ce qu'est CODE "M" pour l'utiliser sur un autre basic.
Par quoi remplacer print at x,y sur un autre basic.
Merci.
Okinawok
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 401
Enregistré le : 12 avr. 2011 15:07

Re: zx81 code ?

Message par Okinawok »

CODE "M" ne serait-il pas le code ASCII de la lettre "M" ?
Une fois connue cette valeur, tu sauras peut-être à quelle ligne il se branche.
Si c'est bien çà :roll: c'est une drôle de façon de coder :lol:
razzmoket
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 420
Enregistré le : 17 mai 2007 13:21
Localisation : montbeliard (25)

Re: zx81 code ?

Message par razzmoket »

code"M"=50 sur le ZX81
GOTO CODE "M" c'est GOTO 50

c'est un moyen d'economiser des octets de programme sur le ZX
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3405
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: zx81 code ?

Message par C.Ret »

En fait, oui CODE est au Zx81 ce qu'est ASC sur d'autres systèmes.

A la diffèrence que CODE("ABCD") renvoit 38 car 38 est le code du caractère A dans un Zx80, alors que sur d'autres systèmes plus proche de la norme ascii, on trouvera que ASC("ABCD") renvoi 65 qui est le code ascii de A.
Sur un Commodore 8bit, par eemple , asc("ABCD") renvois 193, car le code 65 est celui représentant le caractère a.

Donc, il faut interpréter GO TO CODE "M" comme étant un saut vers la ligne dont le code est celui de la lettre M. A mon avis la ligne 50. Mais je n'est aucun moyen de vérifier.


EDIT: Le lapin de razmoket vient de confirmer

Source:http://fjkraan.home.xs4all.nl/comp/zx80 ... html#INTRO


Sinon, pour transposer le code PRINT AT x,y "Texte" où x et y indiquent la position ligen,colonne de l'écran il y a diffèrentes façon de faire qui dépendant du Basic de la machine destination.

Sur certains Commodore 8bit récents, il existait une commande LOCATE x,y : PRINT "Texte" ou une instruction CHAR c,x,y,"Texte"
Sur les plus ancient, on utilisé une particularité du contrôle des mouvemetn du curseur; en fait il était facile de déplacer la position de l'écran où PRINT affiche en déplaçant le curseur à l'aide de caractère spéciaux: on faisait donc un truc du type :

PRINT "[home]"LEFT$("[bas][bas][bas][bas][bas][bas][bas][bas][bas]",x)LEFT$("[droite][droite][droite][droite][droite][droite]",y) "Texte"

où [Home] est le caractère de contrôle de la touche Home qui remet le curseur en haut à gauche de l'écran,
[bas] est le caractère de contrôle touche vers le bas qui déplace le curseur d'une ligne vers le bas,
et [droite] est le caractère de contrôle touche à droite qui déplace le curseur d'un caractère vers la droite.

Il y avait aussi ceux qui utilisaient des POKEs pour placer directement la position currente du curseur. L'inconvénient de ce dernier moye est que les adresses à utiliser change entre chaque Commodore et surtout pour un même modèle en fonction des extensions mémoires ou cartouche d'extention en place.
Modifié en dernier par C.Ret le 05 oct. 2012 17:30, modifié 1 fois.
SHARP PC-1211 PC-1360 EL-5150 PC-E500 | Commodore C=128D | Texas Instruments Ti-57LCD Ti-74BASICalc Ti-92II Ti-58c Ti-95PROCalc Ti-30XPROMathPrint | Hewlett-Packard HP-28S HP-41C HP-15C HP-Prime HP-71B | CASIO fx-602p | NUMWORKS | Graphoplex Rietz Neperlog | PockEmul | Sommaire des M.P.O. | Ma...dov'il sapone.
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3405
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: zx81 code ?

Message par C.Ret »

razzmoket a écrit :c'est un moyen d'economiser des octets de programme sur le ZX
Voilà qui devrait surprendre :

En effet, comment GO TO CODE "M" peut être du point de vue des octets utilisés plus court que GO TO 50 ?

Si je me souvient bien, cela provient essentiellement de deux faits :
- l'un commun à de nombreux BASIC de l'époque, les instructions sont codées par des 'token code', aussi GO TO, PRINT, THEN ou IF utilisent tous le même nombre d'octet car ce n'est pas le nombre de caractère qui entre en jeu, uniquement un code par instruction.

- contrairement aux autres systèmes de l'époque, le Zx81 a une façon très personnelle de mémoriser les nombres dans les lignes de programme. Si je me souviens bien, chaque nombre est mémorisé deux fois: un octet par code caractère puis deux octets pour mémoriser la valeur codé en binaire le tout encadré par deux (ou un ?) octet(s) délimitant le champ.

Donc, GO TO CODE M doit faire 3 octets (le "M" est codé sur un seul octet avec un code signifiant caractère M - mais je ne suis plus sûr c'est peut-être 4) alors que GO TO 50 nécessiterait jsuqu'à 7 octets !


Notons qu'il y avait un avantage, lors de l'utilisation du programme, les valeurs binaires sont directemetn utilisées, ce qui fait gagner un temps non négligeable par rapport , par exemple à un VIC-20 de la même époque qui dans les boucles passe un temps infini à toujours interpréter chaque instruction token par token et chaque nombre caractères par caractère. Là où le génial Zx80 charge directement son micro-processeur avec la valeur binaire !!
Modifié en dernier par C.Ret le 05 oct. 2012 17:30, modifié 2 fois.
SHARP PC-1211 PC-1360 EL-5150 PC-E500 | Commodore C=128D | Texas Instruments Ti-57LCD Ti-74BASICalc Ti-92II Ti-58c Ti-95PROCalc Ti-30XPROMathPrint | Hewlett-Packard HP-28S HP-41C HP-15C HP-Prime HP-71B | CASIO fx-602p | NUMWORKS | Graphoplex Rietz Neperlog | PockEmul | Sommaire des M.P.O. | Ma...dov'il sapone.
Avatar du membre
kweeky
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1777
Enregistré le : 05 oct. 2007 19:46
Localisation : Pas très loin de Bordeaux

Re: zx81 code ?

Message par kweeky »

Salut

Dans le même principe, on trouve souvent des lignes du type : LET A=PI/PI. Car PI / PI, ça prend 3 octets, alors que dans LET A=1, le 1 prend 6 ou 7 octets.

Cela dit, c'est surtout utilisé pour des listings destinés à la version de base (1 Ko). Quand on a le rampack de 16 Ko, on peut se permettre de faire plus lisible.

Une particularité intéressante aussi, c'est que tu peux faire des GOTO ou des GOSUB calculés : genre GOTO A*B/C+10 : ça permet dans une certaine mesure de se passer de ON ... GOTO et ON ... GOSUB.

@+
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3405
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: zx81 code ?

Message par C.Ret »

Très juste, ce type de ON ... GOTO est aussi très en vogue sur les Pockets BASIC de SHARP
C'est ce qui remplacait la structure SELECT CASE ... CASE ... CASE ... CASE ELSE ... END SELCET

Toutes les machines de cette époque avait des astuces pour économiser ou optimiser l'utilisation de la mémoire et des ressources.

Je me souviens que pour les Commodores, nous avions des programmes de "compression"; ils constitaient à retirer d'un programme les espaces inutile que l'on laisse pour rendre plus lisible les instructions. Il y avait aussi le fait que le nombre d'instruction par ligne était surtout limlté par les performances de l'écrant d'édition (22 col. VIC, 2x40 commodore C64, 2x80 col. C128) mais en interne les lignes pouvaient être infiniement plus longue (en fait s'il n'y avait pas de GOTO, une ligne pouvait faire tout le programme (64 ko). Un des programme permettait de renuméroter les lignes en regroupant les instructions bien au-delà de cette limite d'édition.

Comme chaque ligne nécessitait un en-tête de 7 octets, on gagnait ainsi pas mal d'octets et surtout il devenait impossible de modifier ou d'afficher convenablement le programme ainsi optimisé qui était donc aussi protégé. Inconvénient le programme n'était plus "relocable", c'est à dire qu'il ne pouvait être exécuté que aux adresses mémoires où il avait été "compressé", ce qui posait problème parfois lorsque nous partagions de tels programmes sur des machine n'ayant pas les mêmes extension/cartouches !
SHARP PC-1211 PC-1360 EL-5150 PC-E500 | Commodore C=128D | Texas Instruments Ti-57LCD Ti-74BASICalc Ti-92II Ti-58c Ti-95PROCalc Ti-30XPROMathPrint | Hewlett-Packard HP-28S HP-41C HP-15C HP-Prime HP-71B | CASIO fx-602p | NUMWORKS | Graphoplex Rietz Neperlog | PockEmul | Sommaire des M.P.O. | Ma...dov'il sapone.
era
Fonctionne à 75 bauds
Fonctionne à 75 bauds
Messages : 4
Enregistré le : 05 oct. 2012 11:45

Re: zx81 code ?

Message par era »

Bonjour,
Merci à vous tous,
j’avais bien essayé avec le asc("M"), mais 77 n'est pas dans mon programme,
alors que 50 est bien présent. (Ça il fallait le savoir!)
Pour info, c'est un petit programme "La planche de Galton" qui avait paru
dans la revue Électronique Pratique dont je ne me souviens pas de la date !
Bon week-end.
.
Xavier
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 684
Enregistré le : 10 mars 2006 15:48
Contact :

Re: zx81 code ?

Message par Xavier »

Salut,

Oui, je valide les réponses. (Tout le mode a gagné!)
- Contrairement aux autres systèmes de l'époque, le Zx81 a une façon très personnelle de mémoriser les nombres dans les lignes de programme. Si je me souviens bien, chaque nombre est mémorisé deux fois: un octet par code caractère puis deux octets pour mémoriser la valeur codé en binaire le tout encadré par deux (ou un ?) octet(s) délimitant le champ.
Donc, GO TO CODE M doit faire 3 octets (le "M" est codé sur un seul octet avec un code signifiant caractère M - mais je ne suis plus sûr c'est peut-être 4) alors que GO TO 50 nécessiterait jsuqu'à 7 octets !
Le Zx81, a en effet une lourdeur d'encombrement mémoire au niveau des chiffres en virgule flotantes.
Le but était en effet, à l'époque, d'éviter le recalcule de cette valeur afin d'augmenter la vitesse d'execution de la machine.
Le programme prend plus de place mémoire, mais gagne en vitesse.
Le seul problème était évidement les configurations 1k de l'époque. Je rappelle que seullement dans les 700 octets étaient disponibles à la programmation, car il fallait prendre en compte la mémoire variables et la mémoire vidéo (toutes deux extensibles).
Donc, au niveau codage en virgule flottante, on perd 6 octets rendu invisibles au listing Basic.

Le codage est identique sur le Spectrum et sur le CPC (ordre diffèrent).
[Mentisia][Exp][B3];[B2];[B1];[B0]
Donc un 10 LET A=1 donne en mémoire.
00;0A;0B;00,F1;26;14;1D; 7E;81;00;00;00;00;76

Donc, tout code donnant une valeur de 1 avec moins de 7 octets (6+1 ascii) est bon à prendre.
10 LET A=VAL"1"
00;0A;0B;00,F1;26;14;C5;0B;1D;0B (4octets) [-2]

10 LET A=PI/PI
00;0A;0B;00,F1;26;14;42;18;42 (3octets) [-3]

Il est vrai que cela est indispensable pour le zx81 en configuration minimale...
Mais cette technique ralentie considérablement la vitesse d'execution du basic.
De plus, comme le soulignait Kweeky,la visibilité du programme se trouve compliquée!
On peut tester la fonction "Optimiser le Basic" sur un programme basic de 16k sur le Xur...
On gagne près de 3 Ko... mais cela rend le programme, impossible à modifier!

Il est préférable d'utiliser des variables tel que:
10 LET O=0
20 LET I=1
30 LET Z=I+I
Car la valeur en virgule flotante n'est présente qu'une seule fois dans la mémoire variable.
Un "IF M=Z THEN" ne prendra que 3 octets au lieu des 6 avec "IF M=2 THEN"
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3405
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: zx81 code ?

Message par C.Ret »

Merci Xavier pour ces explications claires et précise; je ne me souvenais plus des détails, je ne me souvenais que des grandes lignes.
SHARP PC-1211 PC-1360 EL-5150 PC-E500 | Commodore C=128D | Texas Instruments Ti-57LCD Ti-74BASICalc Ti-92II Ti-58c Ti-95PROCalc Ti-30XPROMathPrint | Hewlett-Packard HP-28S HP-41C HP-15C HP-Prime HP-71B | CASIO fx-602p | NUMWORKS | Graphoplex Rietz Neperlog | PockEmul | Sommaire des M.P.O. | Ma...dov'il sapone.
Répondre

Retourner vers « Sinclair »