Canon X-07

Un article de Wikipédia, l'encyclopédie libre.
Canon X-07
Fabricant
Présentation
Date de sortie
Septembre 1983
Fonctions
Type
Connectique
Port parallèle, port série, port magnétophone cassette (3 câbles read, write, remote), bus d'extension
Écran
Caractéristiques
Alimentation

4 piles AA (1,5 V)

Adaptateur secteur AD-4II (120 ou 230 VAC -> 4.5 VDC 600mA)
Processeur
  • National Semiconductors NSC800 (compatible Z80 et bus Intel 8085) (4 MHz)
  • sous-processeur T6834 (contrôle clavier, vidéo, horloge)
  • puce entrées/sorties (contrôle ACIA, ports série, parallèle et buzzer)
Mémoire
  • RAM : 8 Ko extensibles à 24 Ko par une puce de 8 Ko et une carte de 4 ou 8 Ko
  • RAM interne : 2 Ko (sous-processeur T6834)
  • ROM : 20 Ko
  • Interface vidéo X-720

    • ROM module extension : 2 Ko bankable × 4
    • RAM vidéo : 6 Ko
    • ROM : 4 Ko

    Cartes RAM et applications

    • RAM : 4 Ko (XM-100, applications) ou 8 Ko (XM-101)
    • ROM : 8 Ko (cartes application)
    Stockage
  • magnétophone à cassette
  • cartes RAM 4 Ko ou 8 Ko utilisées comme disque virtuel
  • Système d'exploitation
    BASIC Microsoft
    Pavé tactile
    4 flèches curseur et bouton central
    Mesures
    Dimensions
    200 × 130 × 30 mm
    Masse
    630 g avec les piles

    Le Canon X-07 est un ordinateur portable commercialisé par Canon fin 1983. C'est l'un des premiers ordinateurs totalement portables, autonomes et extensibles avec des capacités inspirées des ordinateurs personnels 8-bits de bureau (notamment le TRS-80 de 1976 dont le Microsoft BASIC Level II est « l'ancêtre » direct de celui du X-07).

    Sa conception est axée sur la portabilité et l'autonomie :

    • l'électronique est basée sur des circuits CMOS à faible consommation ;
    • l'écran est de type LCD non rétro-éclairé et de petite taille ;
    • le clavier utilise des touches de petite taille pour en réduire l'encombrement ;
    • le boitier contient l'unité centrale, l'affichage, le clavier ainsi que le haut-parleur du système sonore ;
    • les extensions mémoires prennent place à l'intérieur du boitier et n'altèrent pas l'encombrement ;
    • les cartes d'extension mémoire sont alimentées par leur propre pile.

    En version de base, il se distingue de la concurrence en étant équipé de 8 ko de RAM dont presque 6,5 ko pour l'utilisateur, la plupart de ses concurrents ne proposant que 4 ko voire 2 ko. Cette mémoire peut être étendue à 24 ko par deux extensions de 8 ko. Équipé de nombreuses instructions et fonctions spécifiques au matériel du Canon X-07, son BASIC Microsoft occupe 20 ko de ROM ce qui en fait l'un des plus complets de la famille Microsoft avant la version 5.

    Le Canon X-07 présente des possibilités encore peu courantes en 1983 sur les petits ordinateurs BASIC portables : un écran graphique contrôlable au pixel, un système sonore souple, une horloge interne qui conserve la date et l'heure, 12 touches de fonction programmables, 64 caractères graphiques programmables, un port série de communication utilisable en RS-232C (avec un boitier d'extension), un port parallèle compatible Centronics (avec un câble spécifique), un bus d'extension pour une interface vidéo.

    Canon France adopte une attitude très dynamique pour faire connaitre le Canon X-07. Commercialement, il se pose en concurrent direct d'autres machines japonaises comme le Casio FP-200, l'Epson HX-20 (en) ou le TRS-80 Modèle 100 aux caractéristiques proches mais d'un encombrement plus important notamment en raison de leur clavier utilisant des touches de taille classique et d'un écran souvent de plus grande définition. Il représente une succession possible pour les possesseurs d'ordinateurs de plus petite taille et puissance comme les familles Sharp PC-1500 ou Casio PB-700, tout en étant sensiblement plus encombrant.

    Son positionnement sur le marché est original : il présente une taille proche des plus petites machines tout en étant un peu plus grand et plus puissant et une puissance proche des plus grands ordinateurs tout en étant un peu plus petit mais en restant extensible.

    Ses publicités le présentent également comme un ordinateur de bureau complet, doté de logiciels pour les professionnels comme un tableur et une base de données et de périphériques de communication et d'impression. La large gamme de produits annexes est mise en avant dans les publicités mais également dans les bancs d'essais des revues de 1983.

    Caractéristiques techniques[modifier | modifier le code]

    Ses caractéristiques matérielles sont orientées autour du processeur 8-bits National Semiconductor NSC800 (compatible avec le Z80 sur le plan des instructions et l'Intel 8085 pour le bus) et plutôt bonnes pour 1983 :

    • conception CMOS à faible consommation, alimentation 4 piles AA ou adaptateur secteur ;
    • CPU NSC800 (compatible Z80) à 4 MHz
    • Affichage LCD 4 × 20 caractères avec jeu de caractères 5×7 (sur matrice 6x8) avec accentuées dont 64 caractères reprogrammables, accessible également en 120 × 32 pixels
    • Mixage possible graphisme au pixel et texte
    • Possibilités sonores avec haut-parleur intégré
    • Clavier standard QWERTY de bonne qualité accompagné d'un pavé curseur de cinq touches et cinq touches de fonctions programmables. La façade inclinée des touches indique le caractère principal séparément du caractère shift, ce qui est assez rare et rappelle les calculatrices programmables Hewlett-Packard
    • Coprocesseur T6834 avec 2 ko RAM interne pour gérer l'horloge, le clavier, l'affichage LCD, les touches programmées
    • 8 ko de RAM (dont 6 748 octets disponibles pour l'utilisateur), extensible jusqu'à 24 ko par une puce de 8 ko et des cartes de 4 ou 8 ko. La RAM conserve son contenu lors de l'extinction
    • 20 ko de ROM contenant le système de démarrage et le BASIC Microsoft. Ce BASIC est proche du Level II du TRS-80 et dispose d'instructions spécifiques pour contrôler les périphériques du X-07, l'écran LCD au pixel (avec tracé de cercle et de ligne), les imprimantes, l'interface série, l'horloge interne, les alarmes, etc.
    • Logement pour carte :
      • soit une carte d'application préprogrammée intégrant 8 ko de ROM et 4 ko de RAM
      • soit une carte d'extension RAM de 4 ou 8 ko
    • Logement pour une puce d'extension mémoire 8 ko RAM Page d'aide sur l'homonymie
    • Horloge interne conservant date et heure, avec possibilité d'alarme
    • Auto-exécution d'instructions à l'allumage
    • Ports de communication : parallèle Centronics, série (RS-232C ou coupleur optique), bus pour boitier d'extension, audio, magnétophone
    • Taille : 200 × 130 mm (environ une demi page A4), épaisseur 30 mm
    • Poids : 630 g avec les piles

    Logiciel[modifier | modifier le code]

    Le Canon X-07 est équipé d'un BASIC Microsoft de 20 ko proche du Level II du TRS-80 de 1976, avec des instructions spécifiques pour les périphériques série et parallèle, l'affichage, les imprimantes, l'horloge, le son. Il est possible de découper la RAM disponible en une zone principale pour le programme en cours et une seconde zone comme disque virtuel pour stockage de programmes et fichiers. On peut exécuter un programme directement à partir du disque sans le charger dans la zone principale.

    En même temps que le X-07 sont commercialisées des cartes d'application dotées de 8 ko de ROM + 4 ko de RAM. Elles contiennent des programmes prêts à l'emploi comme une gestion de fichiers, une feuille de calcul, un moniteur pour la programmation en langage machine et autres.

    En France, au moins deux sociétés commercialisent des logiciels sur cassette pour le X-07 : Logi'stick, Power Soft.

    Plusieurs magazines proposent régulièrement des programmes pour le Canon X-07 entre 1984 et 1987 :

    • Le club C7 publie la gazette Le Son du Canon pendant 8 numéros avec de nombreuses informations techniques, des essais de logiciels (principalement Logi'stick, qui soutient le club), des programmes.
    • Le magazine Hebdogiciel[1] publie des programmes envoyés par ses lecteurs
    • Le mensuel L'Ordinateur de poche propose de temps en temps des programmes pour le X-07

    Extension vidéo[modifier | modifier le code]

    Outre ses périphériques (voir plus bas), le X-07 peut être accompagné d'une extension pour écran vidéo, le X-720.

    Sa conception transforme le Canon X-07 en un ensemble beaucoup plus encombrant. Bien qu'équipé d'une batterie qui lui donne une certaine autonomie, sa connexion à une télévision le rend alors intransportable, et certains choix techniques limitent les possibilités de son hôte :

    • l'extension place sa ROM et ses 6 ko de RAM dans l'espace mémoire du processeur mais n'augmente pas la RAM disponible même lorsque l'affichage ne consomme pas les 6 ko (cette place avait été réservée lors de la conception du X-07) ;
    • le X-720 augmente l'encombrement de la machine, doublant la taille du Canon X-07 en longueur et en épaisseur ;.

    La perte de portabilité est un handicap important, d'autant que la machine devient alors deux fois plus longue que large, un format inhabituel pour un petit ordinateur. La batterie intégrée ne peut pas s'éloigner longtemps de son adaptateur secteur pour la recharger.

    Les caractéristiques vidéo sont celles du processeur 6847 de Motorola (employé dans l'ordinateur Alice de Matra et d'autres ordinateurs bas de gamme). La mémoire vidéo a été limitée à 6 ko pour ne pas trop emprunter à l'espace du Z80. Le processeur 6847 peut gérer jusqu'à 16 ko, aussi les 6 ko ne permettent pas de l'exploiter au mieux :

    • Processeur graphique Motorola 6847
    • 6 ko de RAM vidéo
    Modes graphiques
    Mode Définition texte (colonnes x lignes) Définition pixels (H x V) Couleurs
    1 32 × 16 4
    2 32 × 16 semi graphique 64 x 48 (caractères de 2 × 3 pixels) 8+ noir
    3 16 × 8 128 × 96 4
    4 16 × 16 128 × 192 2
    5 16 × 16 128 × 192 4
    6 32 × 16 256 × 192 2

    Les définitions graphiques et texte sont sensiblement en retrait par rapport à ce qu'espère le public fin 1983. Plusieurs ordinateurs familiaux d'une puissance similaire comme le Thomson TO7 (8 ko de RAM extensible à 32, processeur 8 bits 6809 à 1 MHz) font beaucoup mieux graphiquement : 25 × 40 en texte, 320 × 200 graphique en 8 couleurs (avec une contrainte de deux couleurs seulement pour chaque ensemble horizontal de 8 pixels consécutifs).

    Vendu plus cher que le X-07, encombrant, limité sur le plan graphique, le X-720 ne rencontre pas le succès escompté par Canon. Cela a une lourde conséquence sur le positionnement de la machine qui ne parvient pas à transfigurer son statut d'ordinateur de poche malgré les efforts de Canon.

    Conséquence de ses faibles ventes, le X-720 est de nos jours un périphérique rare et très recherché par les collectionneurs. Sa batterie Cadnium Nickel est généralement hors service et ces matériaux ne sont plus disponibles, l'adaptateur/chargeur est donc essentiel pour pouvoir l'exploiter.

    Périphériques et extensions[modifier | modifier le code]

    Ses périphériques assez nombreux sont disponibles dès la sortie de la machine (à l'exception du X-720 qui paraitra avec quelques mois de retard).

    Concernant les extensions de mémoire, le Canon X-07 permet d'agrandir sa mémoire de base (8 ko) de deux manières :

    • Directement sur la carte mère, par une puce RAMko qui prend place dans un support accessible par un petit cache au dos de l'appareil. Cette extension se comporte exactement comme la première puce mémoire de 8 ko, elle double simplement la mémoire interne. Un interrupteur dans le logement permet de placer une puce ROM préprogrammée au lieu de la RAM, permettant de figer le X-07 sur une application client (cette possibilité ne semble pas avoir été exploitée par Canon).
    • Via un bus interne spécifique, par une carte de la taille d'une carte de crédit qui prend place dans un logement avec un couvercle verrouillable. Le verrou fait office d'interrupteur général du X-07, protégeant les circuits de la carte pendant l'insertion ou l'extraction. La carte est alimentée par sa propre pile bouton lorsqu'elle est extraite de l'ordinateur. Cette carte peut aussi fonctionner comme un disque virtuel pour y stocker des programmes ou des fichiers de données.

    Le modèle X-07R commercialisé uniquement au Japon[2] est pré-équipé de l'extension de 8 ko interne pour un total de 16 ko de mémoire de base.

    Concernant les autres périphériques, Canon propose la sauvegarde/lecture des programmes et données sur magnétophone à cassette (à l'aide d'un câble qui se branche sur une mini prise DIN), un port série, un port parallèle et un bus d'extension, auxquels correspondent des périphériques proposés par Canon.

    Périphériques
    Référence Description
    XR-100 Extension de mémoire interne 8 ko RAM
    XC-910 câble pour raccordement d'un magnétophone
    XC-930 câble pour raccorder une imprimante parallèle Centronics
    X-710 table traçante 4 couleurs dotée d'une batterie pour son alimentation
    X-711 imprimante thermique
    X-720 interface vidéo pour raccordement à une télévision NTSC, avec convertisseur Péritel intégré en France
    X-721 coupleur optique par infrarouge permettant à deux X-07 de communiquer sans fil
    X-722 convertisseur du port série au niveau TTL pour communiquer avec d'autres ordinateurs en RS-232C
    X-730 magnétophone pour les sauvegarde programmes et données

    Plusieurs cartes mémoire et applications sont également disponibles pour le logement au dos de l'ordinateur. Les cartes d'applications préprogrammées sont dotées de 4 ko de RAM qui s'ajoutent au reste de la mémoire RAM et utilisent une pile bouton pour conserver leur contenu lorsqu'elles sont extraites du X-07. L'espace réservé pour les cartes est de 12 ko : 8 ko pour une ROM et 4 ko pour de la RAM. La RAM de 4 ko est au même endroit que pour une carte 8 ko RAM (XM-101) de sorte que toute la RAM est contigüe, et la ROM de 8 ko se situe plus haut.

    Cartes RAM et applications
    Référence Description
    XM-100 RAM de 4 ko
    XM-101 RAM de 8 ko
    XP-110F[3] gestion de fichiers + 4 ko RAM
    XP-120F[3] tableur + 4 ko RAM
    XP-130F[3] tracés graphiques sur X-710 + 4 ko RAM
    XP-140 moniteur langage machine + 4 ko RAM
    XP-150 fonctions mathématiques pour le BASIC + 4 ko RAM

    À noter : il existe au moins une extension mémoire qui pousse la RAM utilisateur à 40 ko en empruntant les espaces mémoires réservés du X-720. Ces matériels n'étaient pas fabriqués par Canon et ont connu une diffusion confidentielle, il est difficile de trouver de la documentation sur eux et encore plus difficile de les trouver en vente.

    Succès français[modifier | modifier le code]

    Dans les années 1980, les marchés nationaux sont plus différenciés qu'à l'époque actuelle. Ils font souvent la part belle à des machines qui ne rencontrent pas le même succès dans d'autres pays parfois voisins. Le Canon X-07 est représentatif de ces succès locaux : il connaitra de belles ventes en France, mais moins dans les autres pays européens et reste peu connu aux États-Unis dont le portable le plus répandu est alors le TRS-80 modèle 100. L'ambition affichée de Canon France pour le X-07 est de séduire à la fois les utilisateurs professionnels, les scientifiques et les étudiants qui sont alors les principaux demandeurs de machines portables et autonomes. En 1984, la société a beaucoup investi en publicité dans tous les magazines de l'époque.

    Auprès des étudiants, le X-07 peut incarner le successeur d'un ordinateur de poche du type Sharp PC-1500 ou Casio FX-702P ou d'une calculatrice programmable comme la HP-41. Ces machines ont généralement une orientation scientifique plus marquée, mais le processeur du X-07 est rapide et puissant. Soutenu par 8 à 24 ko de mémoire, il permet des applications bien au-delà de ce que permettent les machines de poche. La plus puissante des calculatrices de 1984 est la HP-41CX : elle ne possède qu'environ 2 ko de mémoire pour les programmes et les registres mémoire et son processeur est beaucoup plus lent (ce qui ne l'empêchera pas de poursuivre sa carrière jusqu'en 1990, date à laquelle le Canon X-07 aura disparu des vitrines). Bien que peu répandu, le concurrent le plus direct du X-07 à sa sortie est le Casio PB-700. Proche par ses caractéristiques techniques et sa puissance, il est également doté d'un écran large et peut être étendu à 16 ko de mémoire. Son encombrement est plus réduit et il est sorti plus d'un an avant le Canon. Casio bénéficie d'une large base de clients grâce à ses modèles précédents (dont le FX-702P qui avait eu un grand succès). Malgré ses atouts, le PB-700 ne rencontre pas un très grand succès, alors que l'attitude commerciale très offensive de Canon France alliée à la conception très ouverte du X-07 entraine ses bonnes ventes en France.

    Concurrence[modifier | modifier le code]

    À la présentation du Sharp PC-1211 en 1980, le marché des calculatrices de poche alors dominé par Texas Instruments et Hewlett-Packard bascule. Malgré les faiblesses du PC-1211, sa facilité de programmation, sa bonne autonomie ainsi que son écran capable pour la première fois d'afficher autre chose qu'une dizaine de chiffres et de façon très lisible séduisent non seulement beaucoup d'étudiants et de scientifiques mais aussi des curieux qui y voient un moyen peu couteux de toucher à la programmation en BASIC. A sa sortie, on aurait pu considérer le PC-1211 comme un OVNI sans suite, mais l'apparition peu après du Casio Fx-702P plus petit, plus rapide et moins cher chasse cette idée : les fabricants Japonais se sont engagés dans une piste différente des calculatrices et ils ne vont visiblement pas revenir en arrière.

    Dans les années qui suivent, de très nombreuses machines Casio et Sharp en BASIC voient le jour et mener la vie dure aux fabricants américains, qui réagissent finalement avec sérieux et implication. Les machines vont gagner en puissance et aussi en taille notamment de clavier et d'écran. Quand le Canon X-07 sort en 1983, il possède déjà quelques concurrents sérieux et d'autres sortiront aussi en 1984 et 1985. Le tableau suivant résume les caractéristiques des concurrents les plus directs, ainsi que de machines dont le prix et les capacités sont très nettement supérieurs mais qui revendiquent des parts du même marché.

    La carrière de toutes ces machines va cependant être écourtée par la désaffection relativement brutale du public pour les ordinateurs à programmer soi-même à partir de 1984 environ, qui entraine une chute des ventes dans tous les secteurs du marché grand public. Certains fabricants abandonneront leurs modèles propriétaires pour se lancer dans le compatible IBM-PC, mais la plupart abandonneront purement et simplement. Canon reportera un temps ses efforts sur ses ordinateurs MSX (V20, V30) au Japon avant d'abandonner le secteur des micro-ordinateurs personnels.

    (travail en cours)
    Fabricant Modèle Année Système d'exploitation Processeur RAM (disponible) RAM maximum) RAM Extensions ROM Écran texte (lignes x colonnes) Écran (graphique) Son Encombrement H × L × épaisseur (mm) Poids Prix (version de base) Euros 2023 (convertisseur Insee)
    Casio PB-700 1983 BASIC Casio 4 ko (2 683 octets) 16 ko 3 modules 4 ko 32 ko 4 × 20 160 × 32 simple bip 200 × 88 × 23 315 g 1750 F 615 €
    Casio FP-200 1983 BASIC Casio Intel 80C85, 4 MHz 8 ko 32 ko 3 modules 8 ko 32 ko + 8 ko extension 8 × 20 160 × 64 310 × 220 × 55.5 1,5 kg 3850 F 1354 €
    Canon X-07 1983 BASIC Microsoft NSC800 (Z80), 4 MHz 8 ko (6 748 octets) 24 ko Extension 8 ko + carte 8 ko ou 4 ko, mémoire constante 20 ko + 4 ko X-720 + 8 ko cartes 4 × 20 120 × 32 freq ou 4 octaves, durée 200 × 130 × 30 2170 F 763 €
    Epson HX-20 1981 BASIC 2 x Hitachi 6301 0,6 MHz 16 ko 32 ko boitier extension 32 ko extensible à 40 ko + 32 ko boitier extension 4 × 20 120 × 32 290 × 215 × 44 1,6 kg 7500 F 3233 €
    Epson PX-4 1985 CP/M uPD 70008 (Z80), 3,68 MHz 64 ko 128 ko Disque RAM 64 ko 32 ko + 2 modules 32 ko 8 × 40 240 × 64 oui
    Hewlett-Packard HP-71B 1984 BASIC Hewlett-Packard HP Saturn 4 bits 17,5 ko (16 955 octets) 32 ko 4 modules de 4 ko 64 ko 1 × 22 132 × 8 hauteur, durée 192 × 96 × 25 305 g 4890 F 1601 €
    Hewlett-Packard HP-75C 1982 BASIC Hewlett-Packard H Capricorn 8 bits, 625 KHz 16 ko 24 ko 1 module 8 ko 48 ko, 3 modules 32 ko 1 × 32 - 250 × 120 × 30 740 g 10000 F 3855 €
    Sharp PC-1500 1982 BASIC Sharp LH-5801 2 ko (1 850 octets) 18 ko 1 module 4, 8 ou 16 ko 16 ko 1 × 26 156 × 7 195 × 86 × 25 375 g 1890 F 728 €
    Tandy Radio Shack TRS-80 Mod 100 1983 BASIC Microsoft Oki 80C85, 2,4 MHz (compatible Intel 8085) 8 Ko 32 Ko 3 modules de 8 Ko 32 Ko 8 x 40 240 x 64 300 x 215 x 50 1,4 Kg 10000 F 3516 €
    Texas Instruments CC-40 1983 BASIC Texas Instruments TMS 70C20, 8/16 bits, 2,5 MHz 6 Ko 22 Ko 1 module 16 Ko, mémoire constante 34 Ko 1 x 31 - 228 * 152 * 25 600 3000 F 1055 €

    Tarifs 1984[modifier | modifier le code]

    Issus de publicités de magasins qui commercialisaient le Canon X-07 (Duriez).

    Tarifs Canon X-07
    Référence Description Tarifs 10/1984 Euros 2023 (convertisseur INSEE)
    X-07 Unité centrale 2170 F 710 
    XM-100 Carte 4 ko RAM 412 F 134 
    XM-101 Carte 8 ko RAM 850 F 278 
    XR-100 Extension 8 ko RAM 750 F 245 
    XC-910 Câble magnétophone 49 F 16 
    XC-930 Câble Centronics 245 F 80 
    X-710 Table traçante 1850 F 605 
    X-720 Extension vidéo 2380 F 779 
    X-721 Coupleur optique 420 F 137 
    X-722 Convertisseur RS-232C + cordon 690 F 225 
    XP-110F Carte ROM Fichiers 495 F 162 
    XP-130F Carte ROM Graphiques 530 F 173 
    AD-4 II Adaptateur secteur 69 F 22 

    Utilisation[modifier | modifier le code]

    Le Canon X-07 se comporte comme tout ordinateur doté d'un BASIC Microsoft : ce dernier initialise la machine puis donne la main à l'utilisateur qui peut alors taper des commandes, enregistrer des programmes et les exécuter. Le X-07 possède aussi quelques particularités qui n'entrent pas dans le cadre d'un BASIC classique et pour lesquelles Microsoft et Canon ont créé des instructions et fonctions spéciales.

    Une bonne partie des explications de cette section peuvent être consultées en plus amples détails dans le Guide Utilisateur[4] livré avec le Canon X-07 (le livre avec la couverture jaune).

    Calculs mathématiques[modifier | modifier le code]

    Comme la plupart des ordinateurs BASIC équipés d'un BASIC Microsoft, le Canon X-07 ne possède pas de mode calculatrice. Il ne propose aucune touche pour les fonctions les plus utiles (trigonométrie, logarithmes et inverses, conversions angulaires et horaires, statistiques, exponentiation...) et les fonctions dont il dispose ne sont pas très étendues. Le BASIC Microsoft fait particulièrement grise mine face au HP-71B qui est l'un des ordinateurs de poche BASIC les plus conçu pour une utilisation scientifique.

    tous calcul doit être explicitement envoyé à l'affichage par la commande PRINT. Microsoft a toujours offert la possibilité d'utiliser le point d'interrogation comme synonyme de PRINT, ce qui simplifie légèrement la saisie d'autant que Canon lui a alloué une touche spécifique en bas à droite du clavier :

    ?2*SIN(3.1415927)
    -9.282061687022E-08
    

    Ce raccourci fonctionne dans tous les cas de figure, y compris la saisie des lignes de programme :

    10 ? 1
    LIST
    10 PRINT 1
    

    Bien qu'assez sommaire et ne rivalisant pas avec les BASIC des machines Casio ou Sharp, le jeu de fonctions et opérateurs est un peu plus étendu qu'à l'accoutumée pour un BASIC Microsoft :

    • Les calculs sont effectués en double précision par défaut (valeurs stockées sur 8 octets). Ceci diffère par exemple du TRS-80 où le type numérique par défaut est la simple précision. Toutefois l'encodage utilisé limite davantage la gamme des valeurs possibles (+/-9.99999999999 E62) que sur la plupart des calculatrices et le Casio FP-200 (+/-9.9999999 E99) ou le très puissant HP-71B (+/-9.99999999999 E499).
    • Les fonctions trigonométriques COS SIN TAN ATAN travaillent exclusivement en radians et renvoient un nombre en double précision. Il n'y a pas de constante disponible pour Pi, bien sûr on peut créer une variable avec PI=4*ATN(1). Il n'y a pas de fonction pour arccosinus et arcsinus, il faut utiliser une formule (on les trouve dans le tableau de comparaison des BASIC de Marcus von Cube[5])
    • Les nombres entiers de 0 à 65535 peuvent être saisis en octal avec le préfixe & et en hexadécimal avec le préfixe &h. La conversion en chaine de caractères en hexadécimal est possible avec la fonction HEX$() en revanche il n'existe pas de conversion octale.
    • La division entière est disponible avec l'opérateur ¥ (touche SHIFT+?), et le reste de la division entière par l'opérateur modulo MOD.
    • On peut spécifier des constantes en simple précision en leur ajoutant le suffixe !, en double précision avec le suffixe # (inutile cependant puisque c'est le type par défaut), en nombre entier avec le suffixe %. Ces suffixes sont identiques à ceux des types de variable. Les conversions vers un autre type sont possibles avec CINT, CSNG et CDBL.
    • La conversion de n'importe quel résultat d'expression numérique en chaîne de caractères est disponible avec la fonction STR$(), sa réciproque VAL() évalue une chaîne représentant une expression et en renvoie la valeur numérique.
    • Pour les logarithmes on dispose uniquement du logarithme népérien avec la fonction LOG() et de sa réciproque exponentielle avec EXP().
    • On peut obtenir la partie entière d'un nombre avec INT(): mathématiquement c'est le nombre entier immédiatement inférieur donc INT(-1.5) vaut -2. Si l'on souhaite simplement la partie avant la virgule on utilisera FIX() qui dans l'exemple précédent renverra -1. La valeur absolue est calculée par ABS() et le signe d'une expression par SNG().
    • On dispose d'un générateur de nombre semi-aléatoire avec RND() qui renvoie un nombre décimal entre 0 et 1 (exclu). L'opérande détermine si la séquence de nombre est initialisée ou poursuivie, ce qui permet soit de s'assurer que la séquence sera toujours la même, soit qu'on laisse l'interpréteur en décider :
      • avec une valeur strictement négative, celle-ci sert à générer une semence de départ et initialise la séquence. Une même valeur donnera toujours la même séquence ;
      • avec une valeur nulle une semence est générée automatiquement, chaque exécution pourra être différente ;
      • avec une valeur strictement positive, la séquence se poursuit.

    Clavier et affichage[modifier | modifier le code]

    Le clavier du X-07 saisit les caractères affichés sur la façade penchée. Les minuscules sont obtenues en maintenant SHIFT enfoncée, à l'inverse d'un clavier standard. Deux touches bascule GRPH et NUM modifient les caractères fournis par toutes ou certaines touches. L'ordinateur est livré avec un cache plastifié sur lequel figurent les caractères graphiques du mode GRPH, tandis que les touches correspondant au pavé NUM sont sérigraphiées directement sur le boitier. Il faut noter que parmi les 128 caractères graphiques, 64 sont reprogrammables sur leur matrice de 6x8 pixels.

    L'affichage de 4 × 20 caractères possède sa propre mémoire, et l'interpréteur BASIC se base sur ce qui se trouve dans cette mémoire lorsque l'utilisateur tape la touche Enter. C'est un système assez rudimentaire, inférieur par exemple à l'écran virtuel du PB-700 qui est beaucoup plus puissant en terme d'édition. Cela limite la longueur des lignes de programme à environ 80 caractères alors que l'interpréteur BASIC Microsoft accepte 255 octets[6]. Cela oblige aussi à effacer tout ou partie de l'écran quand on a saisi les instructions souhaitées, pour éviter que le reste de ce qui était affiché soit considéré comme une partie des instructions.

    Plusieurs touches d'édition sont disponibles pour aider la saisie :

    • le pavé de flèches déplace le curseur librement sur l'écran (la touche centrale n'a pas de fonction par défaut)
    • la combinaison CTRL+E supprime tout ce qui suit le curseur
    • la touche HOME place le curseur tout en haut à gauche sans changer le contenu de l'écran
    • la combinaison SHIFT+HOME efface tout l'écran et place le curseur en haut à gauche
    • la touche INS insère un espace à l'endroit du curseur en poussant tout ce qui suit vers la droite
    • la touche DEL supprime le caractère à l'emplacement du curseur en ramenant toute la suite vers la gauche

    Malgré ses limites, l'éditeur procure un confort très supérieur au système d'édition de ligne habituel des BASIC Microsoft (comme le TRS-80 modèle 1) où le curseur n'est ni visible ni déplaçable et où des touches de contrôle spécifiques sont utilisées pour insérer ou supprimer des caractères à l'aveugle.

    Touches de fonction programmables[modifier | modifier le code]

    Les cinq touches de fonction bleues F1 à F5 sous l'écran ainsi que le carré au milieu du pavé curseur qui est F6 sont programmables. Elles ont des fonctions par défaut par exemple F1 affiche l'heure et F5 démarre le programme. Elles peuvent être combinées à SHIFT et deviennent alors F7 à F12, on a donc 12 touches de fonctions programmables.

    Un aide mémoire de F1 à F5 peut être affiché avec CONSOLE,,1 mais la zone de saisie et d'affichage est alors réduite aux trois lignes du haut.

    Le contenu des touches programmables est contrôlé par le tableau système KEY$(). On peut directement modifier la touche en affectant la chaine de caractères voulue dans la case 1 à 12 du tableau, et la connaitre en l'affichant. Les trois premiers caractères sont ceux affichés comme aide mémoire quand on affiche ce dernier.

    Pour connaitre ce qui est dans la touche F2, on le demande avec un simple PRINT :

    PRINT KEY$(2)
    cldCLOAD"
    

    Les caractères cld seront affichés dans l'aide mémoire, le reste de la chaine sera saisi par le X-07 lorsque l'utilisateur tapera la touche F2, soit l'instruction CLOAD suivie d'un guillemet ".

    Pour remplacer cela par un PRINT avec prt comme aide mémoire, on tape la commande suivante pour remplacer le contenu de la case du tableau :

    KEY$(2)="prtPRINT"+CHR$(34)
    

    La fonction CHR$(34) fournit une chaine de caractères contenant un guillemet : nous devons utiliser cette fonction car le guillemet sert de délimiteur à la chaine de caractères située après le signe = et ne peut pas être placé directement à l'intérieur d'une chaîne, le BASIC ne proposant pas de caractère d'échappement (comme le \ du langage C par exemple).

    Chaque touche de fonction dispose de son propre espace de stockage de 42 octets dans la mémoire du sous-processeur T6834 : ceci inclut les trois caractères du préfixe de l'aide-mémoire, ainsi qu'un octet nul à la fin de la chaîne envoyée au T6834. En raison de ces 4 octets spécifiques, la chaîne programmée ne peut dépasser 38 caractères.

    Pour afficher l'aide mémoire, on utilise la commande CONSOLE,,1. Pour le désactiver, il faut aussi rétablir les 4 lignes car le défilement a été limité aux trois lignes du haut. La commande est alors CONSOLE,4,0.

    Jeu de caractères[modifier | modifier le code]

    Les caractères standards affichés sur le clavier sont saisis avec les touches shiftées ou non, mais il existe aussi deux modes particuliers du clavier qui changent les caractères accessibles :

    • un mini pavé numérique est accessible sur les touches 7 8 9, I O P, J K L et , ; / : on l'active ou désactive avec la touche NUM
    • des caractères spéciaux sont accessibles par la bascule GRPH

    Il existe par ailleurs 64 caractères reprogrammables dans le jeu de caractères. Les caractères normaux sont définis sur une matrice de 5×7 avec une colonne vide à droite et une ligne vide en bas pour qu'ils apparaissent séparés à l'affichage, mais la matrice réelle est de 6×8 pour tous les caractères y compris les programmables.

    Les caractères reprogrammables sont ceux qui occupent les codes 159 à 128 (32 caractères) et 224 à 255 (32 caractères). Ils sont programmés par le biais du tableau spécial FONT$ qui contient, pour chaque case correspondant aux codes autorisés, une chaine de caractères définissant chaque ligne de la matrice.

    Par exemple, le caractère 255 (qui est le signe de division alternatif en standard) est composé comme suit :

    ?FONT$(255)
    [00,20,00,F8,00,20,00,00]
    

    Les huit nombres hexadécimaux représentent chacun une ligne à partir du haut, avec les six premiers bits représentant les six pixels accessibles. Pour allumer le premier pixel qui est donc sur le bit 7, on ajoute 128 (soit 80 en hexadécimal), pour le second pixel, on ajoute 64 et ainsi de suite. Les bits 1 et 0 sont inutilisés et peuvent rester à 0. Dans notre exemple, le premier 20 représente un point au centre des 5 pixels utilisés pour les caractères standards, le F8 deux lignes plus bas est la barre de division et le 20 deux lignes encore plus bas est le point en dessous de la barre.

    Sons[modifier | modifier le code]

    L'instruction BEEP permet de jouer un son sur 48 notes de la gamme (4 octaves), avec une durée en vingtièmes de seconde.

    La note est en premier paramètre et va de 1 pour une note DO à 48 pour le SI trois octaves plus haut. Le 2 par exemple est le DO# de l'octave la plus basse, le 3 est RE et ainsi de suite avec un demi ton par nombre.

    La durée en vingtièmes de seconde arrive en second paramètre après une virgule, par exemple 20 durera une seconde.

    Pour jouer un DO de la deuxième octave pendant une demi seconde :

    BEEP 25,10
    

    Sous l'instruction BEEP se cache un générateur de son monophonique assez puissant que l'on peut contrôler avec le sous-processeur T6834 via les instructions OUT sur les ports F2 à F4. Cette méthode est décrite dans un exemplaire de la revue Le son du Canon (par l'auteur de ces lignes dans Wikipedia) et dans une vidéo assez récente sur YouTube[7].

    Horloge et alarme[modifier | modifier le code]

    Le X-07 est doté d'un circuit d'horloge et conserve l'heure et la date même lors de l'extinction. Une alarme peut être programmée et une action effectuée lorsqu'elle est déclenchée.

    L'heure peut être obtenue avec la fonction spéciale TIME$ qui la renvoie sous la forme d'une chaine de caractères hh:mm:ss. On peut aussi la changer directement pour effectuer la mise à l'heure :

    TIME$="13:33:00"
    

    De la même manière, la fonction spéciale DATE$ permet de consulter ou modifier la date. Elle est renvoyée sous la forme yy/mm/jj, dayday indique le jour de la semaine sous forme anglaise (MON pour Monday soit lundi, et ainsi de suite). Quand on reprogramme la date, il est inutile de spécifier le jour de semaine mais on doit indiquer l'année sur 4 chiffres :

    DATE$="2024/03/13"
    PRINT DATE$
    24/03/13, WED
    

    De façon similaire, l'alarme est programmable et consultable avec la fonction ALM$. La chaine de caractères utilisée est au format YYYY/MM/DD/weekdays/hh/mm.

    Chacun des champs peut être absent, on conserve juste le / séparateur. On peut ainsi programmer une alarme pour un jour précis, ou une heure précise, ou certains jours de la semaine ou toute autre combinaison.

    • YYYY est l'année sur 4 chiffres
    • MM est le mois (1 à 12)
    • DD est le jour (1 à 31)
    • weekdays est un nombre 8-bits où chaque bit représente un des jours de la semaine en commençant par le dimanche sur le bit 6 (ajouter 64), puis le lundi sur le bit 5 (ajouter 32) et ainsi de suite jusqu'au samedi sur le bit 0 (ajouter 1). On peut ainsi indiquer quels jours l'alarme se déclenchera.
    • hh est l'heure (0 à 23)
    • mm indique les minutes (0 à 59)

    Une fois programmée, l'alarme doit être activée avec CONSOLE@1 ou désactivée avec CONSOLE@0.

    L'alarme sonne pendant une minute, on peut la stopper avec CTRL+S.

    Si l'on veut exécuter un programme ou un bout de code lors de l'alarme, il faut utiliser le programme de démarrage (chapitre suivant) et, une fois l'alarme programmée, éteindre le X-07 par la commande OFF1 et non avec le bouton OFF.

    Programme de démarrage[modifier | modifier le code]

    Le X-07 peut exécuter du code lorsqu'il est allumé. Il effectue cela uniquement s'il a été éteint précédemment par la commande spéciale OFF1. On désactive ce programme de démarrage par la commande OFF2. Chacune de ces deux commandes conditionne ce qui arrivera ensuite avec les boutons ON et OFF ou la commande OFF, il n'est pas nécessaire de les répéter pour éteindre l'ordinateur.

    Pour contrôler et afficher le code de démarrage, on utilise la fonction spéciale START$ similaire au tableau des touches programmables.

    START$="PRINT DATE$:PRINT TIME$"+CHR$(13)
    

    Ici le programme de démarrage affichera la date et l'heure, le CHR$(13) représente l'appui de la touche Enter.

    Pour activer le démarrage de START$, il faut éteindre le X-07 avec la commande spéciale OFF1 et pour le désactiver il faut utiliser OFF2, par la suite les boutons ON et OFF agiront en conséquence.

    Périphériques et fichiers[modifier | modifier le code]

    Le Canon X-07 peut être connecté à de nombreux périphériques. Ces derniers peuvent être exploités par certaines instructions BASIC, mais aussi par le biais des fichiers.

    Sur le X-07, un fichier n'est pas toujours ce qu'on entend généralement, à savoir un ensemble de données stockées quelque part avec un nom. Ici, un fichier est un canal par lequel peuvent être envoyées ou reçues des données. Elles peuvent effectivement être stockées dans un fichier classique sur le disque virtuel, mais pas nécessairement : elles peuvent aussi être simplement lues en mémoire, écrite sur du papier, envoyées à un autre ordinateur.

    Le Canon X-07 gère cinq canaux de fichier, dont l'un (le cinquième) a un comportement un peu particulier qui sera détaillé plus loin.

    L'instruction INIT# permet de créer un fichier avec un numéro de 1 à 5 et de lui affecter l'un des périphériques possibles tout en spécifiant ses éventuels paramètres de communication. Ceci va définir exactement le rôle et le comportement du fichier.

    Une fois créé, le numéro du fichier peut être utilisé dans les instructions PRINT#, DIR#, LIST# pour l'écriture et INPUT# pour la lecture.

    Fichiers du disque virtuel[modifier | modifier le code]

    La syntaxe pour ouvrir un fichier sur le disque virtuel est : INIT#<numéro>,"<nom>","<taille>","<type>"

    • numéro est un chiffre de 1 à 5
    • nom est le nom du fichier (1 à 6 caractères significatifs)
    • taille est le nombre d'octets à réserver pour le fichier, cette taille ne peut pas être modifiée
    • type est une lettre de A à Z au choix, par défaut le type sera D (pour un fichier de données)

    Fichiers de périphériques[modifier | modifier le code]

    La syntaxe générale pour ouvrir un fichier sur un périphérique est : INIT#<numéro>,"<descripteur>","<vitesse>","<mode>"

    • numéro est un chiffre de 1 à 5
    • descripteur est le nom d'un des périphériques autorisés (par exemple "GPR:" pour l'imprimante graphique X-710 ou RAM:<nom> pour un fichier sur le disque virtuel)
    • vitesse est la vitesse de transmission en bauds (300 ou 1200 par exemple)
    • mode est le mode de transmission ACIA (indique le contrôle des bits de parité et la longueur en bits) - voir le tableau plus bas

    La syntaxe réelle dépend du périphérique. Les périphériques de type série reçoivent une vitesse et un mode de transmission alors que les imprimantes n'en ont pas besoin (les imprimantes parallèles et la X-710 sont synchronisées par des lignes de contrôle, l'imprimante thermique X-711 a une vitesse et un mode prédéfini et connu du X-07).

    Certains instructions du BASIC supposent un périphérique par défaut. Par exemple, SAVE et LOAD vont implicitement adresser le disque virtuel RAM:si l'on ne spécifie pas un numéro de fichier. Par défaut, les instructions LLIST et LPRINT enverront les données sur l'imprimante parallèle ou série si l'une d'entre elles est connectée. À défaut d'un numéro de fichier, PRINT envoie ses données sur la console CON:, INPUT les lit sur le clavier KBD:.

    Le tableau ci-dessous résume les différents périphériques possibles.

    Périphériques
    Descripteur Périphérique Entrée Sortie vitesse mode
    CON: Console (saisie et affichage) o o
    KBD: Clavier o
    RAM: Disque virtuel o o
    COM: Port série (RS-232C avec X-722) o o 100 à 8000 bauds, 4800 par défaut A à H, B par défaut
    OPT: Coupleur optique X-721 o o 100 à 8000 bauds, 1200 par défaut A à H, B par défaut
    GPR: Imprimante graphique X-710 o
    LPT: Imprimante Centronics (câble XC-930) o
    PRT: Imprimante thermique X-711 o (300 bauds fixe)
    CASI: Lecture magnétophone o (1200 bauds fixe)
    CASO: Écriture magnétophone o (1200 bauds fixe)

    Les modes de transmission ACIA sont codés par une lettre qui indique les différents paramètres :

    Modes ACIA
    Mode type de parité Validation de parité Nombre de bits
    A 7
    B 8
    C impair oui 7
    D impair oui 8
    E 7
    F 8
    G pair oui 7
    H pair oui 8

    Canal de fichier #5[modifier | modifier le code]

    - TBD -

    Disque virtuel[modifier | modifier le code]

    L'une des grandes particularités du BASIC du X-07 est qu'il peut réserver une partie de la mémoire sous la forme d'un disque virtuel, dans lequel le BASIC peut enregistrer des programmes ou des données dans des fichiers.

    Bien entendu, ce disque est emprunté à la mémoire principale, et réduit d'autant ce qui est disponible pour l'exécution des programmes et les données du programme actuel.

    Cependant, les programmes peuvent être exécutés directement à partir du disque sans être chargés, ce qui libère la mémoire centrale pour les données.

    Pour connaitre le contenu du disque et sa taille, on exécute la commande DIR :

    DIR
    RAM:
    13/0
    

    Ce rapport indique que le disque est vide et qu'il est dimensionné à 13 octets dont 0 sont disponibles. Ces 13 octets sont réservés par le BASIC pour la gestion du disque, il est impossible de les récupérer.

    On note aussi que RAM: est l'identifiant de périphérique du disque virtuel, il est utile dans diverses commandes et instructions BASIC et permet de le distinguer d'autres périphériques comme les ports de communication ou l'imprimante.

    Pour changer la taille du disque, on utilise FSET suivi de la taille souhaitée. Pour créer un disque de 2 ko par exemple :

    FSET 2048
    

    On peut vérifier ensuite l'effet de cette commande avec DIR :

    DIR
    RAM:
    2048/2035
    

    Le disque possède bien 2 048 octets, ce qui donne 2035 disponibles une fois les 13 octets système déduits.

    Pour enregistrer le programme actuel dans le disque, on utilise SAVE et on choisit un nom pour le fichier qui contiendra le programme.

    Mettons un simple programme en mémoire : NEW pour vider la mémoire, puis saisie du code suivant :

    NEW
    10 PRINT "Hello world!"
    20 GOTO 10
    

    Pour enregistrer ce programme dans le disque virtuel, on utilise la commande suivante :

    SAVE "HELLO"
    

    Et on vérifie le contenu du disque :

    DIR
    RAM:
    HELLO  P
    2048/1981
    

    Notre fichier HELLO est bien présent, le P est son type qui indique programme. La mémoire disponible dans le disque est désormais de 1 981 octets, notre programme en a donc consommé 54, composés de son code auquel s'ajoute un enregistrement dans la table des fichiers du disque virtuel (cet enregistrement consomme un peu moins de 30 octets).

    À partir de cet instant, on peut exécuter le programme à partir du disque, ce que l'on constate en effaçant d'abord la mémoire :

    NEW
    RUN"HELLO"
    Hello world!
    Hello world!
    ...
    

    Pour supprimer le fichier, on utilise DELETE en spécifiant le nom du programme et son type : omettre le type provoquera une erreur.

    DELETE "HELLO"
    

    Programmation BASIC[modifier | modifier le code]

    Le Canon X-07 se programme à l'aide du langage BASIC, ou bien en langage machine Z80. Le BASIC est issu de la grande famille Microsoft qui à partir d'un socle commun, peut adapter son interpréteur BASIC à de nombreuses machines. On retrouve les caractéristiques générales du Level II du TRS-80 mais aussi sa structure et une grande partie de ses routines internes. Pour ce qui est de l'édition des lignes de code, la présence de l'éditeur plein écran de 80 caractères avec gestion d'un curseur en hauteur et en largeur est inhabituelle pour un BASIC Microsoft qui propose généralement uniquement le déplacement horizontal du curseur.

    Les possibilités du langage sont de deux natures :

    • celles qui proviennent du socle commun de la famille BASIC Microsoft, en particulier les instructions standard du langage BASIC comme IF, GOTO, PRINT, INPUT et GOSUB+RETURN mais aussi les variables de quatre types (numérique entier, simple précision, double précision, et chaine de caractères), les numéros de ligne (de 0 à 65200) ou les instructions et fonctions pour gérer un espace mémoire dédié aux routines en langage machine (USR, PEEK, POKE)
    • celles qui correspondent au matériel spécifique du Canon X-07 par exemple l'affichage (PSET, PRESET, LOCATE, CIRCLE, LINE), le son (BEEP), l'alarme (ALM$), l'horloge (TIME$ et DATE$), le disque virtuel (SAVE, LOAD), les touches de fontcion programmables (KEY$) ou les caractères graphiques programmables (FONT$) et autres : on ne trouve pas ces instructions et fonctions dans la majorité des autres BASIC Microsoft

    Les interpréteurs BASIC des années 1980 fonctionnent à partir de numéros de ligne : chaque ligne de programme possède un numéro, et les instructions de branchement comme IF THEN, GOTO ou GOSUB font directement référence à ces numéros. En l'absence de branchement, l'exécution se déroule dans l'ordre des numéros de ligne.

    Édition et exécution du code[modifier | modifier le code]

    Le BASIC Microsoft du Canon X-07 donne la main à l'utilisateur sous la forme d'un prompt : un marqueur > en début de ligne suivi d'un curseur clignotant.

    À partir de cet instant, l'utilisateur peut effectuer différents types d'actions :

    • saisir du code BASIC en séparant les éventuelles instructions par le caractère :, et en lancer l'exécution en tapant la touche Enter :
      PRINT"Bonjour"
      Bonjour
      
    • saisir une ligne de programme commençant par un numéro de ligne compris entre 1 et 65200 suivi du code et le stocker dans le programme actuellement en mémoire avec la touche Enter (ceci provoque l'insertion entre deux lignes de numéros inférieur et supérieur ou l'écrasement d'une ligne existant avec ce numéro) :
      10 PRINT"Bonjour"
      _
      
    • utiliser l'une des commandes d'exécution du BASIC pour démarrer le programme actuellement en mémoire (RUN, GOTO, GOSUB) ou ceux stockés dans le disque virtuel :
      RUN
      Bonjour
      
    • utiliser l'une des commandes de listage du programme pour l'examiner ou le modifier : LIST pour le faire défiler, LIST@ pour faire défiler ligne par ligne et entrer en édition avec la touche ON/BREAK, LLIST pour l'imprimer :
      LIST
      10 PRINT"Bonjour"
      

    La saisie des lignes de code ou du code direct se font à l'aide d'un éditeur plein écran, le pavé curseur à droite de l'écran permettant de déplacer le curseur au sein de la ligne saisie. Deux touches INS et DEL permettent d'insérer ou supprimer des caractères.

    À noter, cet éditeur confortable est cependant contraint par la mémoire de l'écran : l'interpréteur ne récupère que le contenu visible à l'écran (c'est littéralement ce qui est dans la mémoire des circuits contrôleurs de l'écran) ce qui limite la saisie à 79 caractères (le dernier étant réservé à l'appui de la touche Enter). Si on tape un 80e caractère, l'écran défile vers le haut et toute la première ligne de code est perdue.

    Variables et tableaux[modifier | modifier le code]

    Les variables et tableaux du BASIC Microsoft reçoivent un nom de un ou deux caractères :

    • le premier caractère doit être une lettre de A à Z
    • le second caractère, si présent, peut être une lettre ou un chiffre
    • les éventuels caractères suivants sont ignorés (ex: AVION et AV sont la même variable)

    Les tableaux sont dimensionnés avec l'instruction DIM qui leur donne une ou plusieurs dimensions ainsi qu'une taille dans chaque dimension. Ils respectent les mêmes règles de nommage et de typage que les variables.

    Au démarrage de l'ordinateur ou après une commande NEW, aucune variable ni tableau n'existe. Il suffit d'affecter une valeur à un nom de variable ou de tableau pour le créer. On peut utiliser des variables mais si elles n'existent pas, elles seront simplement remplacées par une valeur nulle (0 pour les types numériques ou une chaine de caractères vide). Dans la séquence ci-dessous, on affiche la mémoire disponible, puis on affiche la variable A qui n'existe pas encore et qui indique donc une valeur nulle. On affiche de nouveau la mémoire disponible et l'on constate qu'elle n'a pas changé : la variable n'a pas été créée. Enfin, on affecte une valeur à la variable et on constate alors qu'elle occupe désormais 11 octets (3 pour la gestion du nom de la variable et 8 pour sa valeur numérique en double précision).

    CLEAR
    PRINT FRE(0)
     23132
    PRINT A
     0
    PRINT FRE(0)
     23132
    A=1
    PRINT FRE(0)
     23121
    

    Types de données[modifier | modifier le code]

    Les variables et tableaux peuvent être typés à l'aide de suffixes :

    • les entiers 16 bits (valeurs entières de -32768 à +32767) avec le suffixe %
    • les nombres à virgule flottante en simple précision (4 octets) avec le suffixe !
    • les nombres à virgule flottante en double précision (8 octets) avec le suffixe #
    • les chaines de caractères avec le suffixe $

    Plusieurs variables de même nom peuvent ainsi coexister avec des types différents.

    Il existe un pseudo type logique (booléen) employé dans les tests IF : toute expression numérique non nulle est considérée comme vraie et la valeur 0 est considérée comme false, mais il n'y a pas de type de données booléen pour les variables. Par convention on utilise généralement une variable de type entier quand on veut travailler avec des booléens et on adopte alors la convention false = 0 (les 16 bits à zéro) et true = NOT 0 soit -1(les 16 bits à 1). Ceci permet de travailler avec toutes les opérations logiques AND OR XOR NOT.

    Création de variable[modifier | modifier le code]

    Pour stocker une valeur dans une variable on utilise l'affectation avec l'opérateur = et une expression appropriée à droite de l'opérateur. Le mot-clé historique LET du BASIC peut être omis (initialement le BASIC imposait que toute ligne de code commence par un mot-clé d'instruction) :

    A$="Bonjour"
    A%=1024
    A!=123/45
    

    Les erreurs de type sont signalées par l'interpréteur. Ici on essaie d'affecter une chaine de caractères à une variable en simple précision :

    A!="Bonjour"
    TM Error
    >
    

    Création de tableau[modifier | modifier le code]

    L'instruction DIM permet de créer des tableaux à autant de dimensions que souhaité, avec un indice maximal pour chaque dimension. Par défaut l'index maximal est de 10 ce qui donne 11 cases dans la dimension. Dans l'exemple ci-dessous, le tableau M aura une dimension de 4 lignes de 4 colonnes, avec des indices allant de 0 à 3 dans chaque dimension :

    DIM M(3,3)
    

    Si l'on affecte ou référence un tableau inexistant avec des indices et dimensions, l'interpréteur créera ce tableau en lui donnant autant de dimensions que spécifié et un indice maximal de 10 dans chaque dimension. Dans le code suivant, la première ligne crée implicitement le tableau A avec deux dimensions et avec des indices maximum par défaut de 10 : la case A(20,2) n'existe donc pas et provoque une erreur mais le tableau est bien créé, comme le montre la différence de mémoire disponible (989 octets) :

    CLEAR
    PRINT FRE(0)
     23132
    A(20,2)=12
    BS Error
    PRINT FRE(0)
     22143
    

    On voit qu'il est facile de se tromper sur les intentions aussi l'usage général est de dimensionner les tableaux en début de programme pour éviter les confusions et ambiguïtés.

    Une fois dimensionné, un tableau ne peut pas changer de taille ni de nombre de dimensions : le seul moyen si l'on a besoin de davantage de stockage est de recopier son contenu dans un autre tableau plus grand puis d'effacer l'original avec l'instruction ERASE.

    Types par défaut[modifier | modifier le code]

    Par défaut, si l'on ne spécifie pas de préfixe, la variable sera considérée de type double précision (à la différence du BASIC du TRS-80), à moins que l'on utilise les instructions pour choisir un autre type par défaut. L'instruction DEFINT A indique qu'à partir de cet instant, les variables dont le nom commence par A et dont le suffixe ne sera pas spécifié seront de type nombre entier. DEFSNG X-Z indique que les variables commençant par X, Y ou Z seront par défaut en simple précision.

    Les instructions DEFINT(type entier), DEFSNG(simple précision), DEFDBL (double précision) et DEFSTR (chaine de caractères) ont l'avantage d'économiser des octets en mémoire en permettant de ne pas spécifier le suffixe. Mais elles peuvent aussi provoquer des surprises dans les programmes. Par exemple considérons le code suivant :

    DEFINT A-I
    B=65/100
    PRINT B
     0
    >
    

    On aurait pu s'attendre à obtenir le résultat 0.65 mais comme la variable commence par B et que l'instruction DEFINT a associé le type entier aux lettres A jusque I, la variable B est de type entier et ne retient donc que la partie entière soit 0.

    On use donc avec précaution de ces instructions et en général uniquement en début de programme.

    Il est courant d'utiliser le type entier pour les variables compteur des boucles FOR mais aussi dans des algorithmes lorsqu'on n'a pas besoin de plus de 65536 valeurs dénombrables. Les variables entières sont traitées plus rapidement que les simple et double précisions, occupent moins de place en mémoire, permettent les opérations booléennes et tiennent nativement dans les registres 16-bits du processeur.

    Globalité des variables[modifier | modifier le code]

    Avec les BASIC de cette époque, toutes les variables sont globales : un sous-programme peut modifier tous les tableaux et variables du programme. C'est l'un des principaux pièges des interpréteurs des années 1980 de ce langage, aussi il est d'usage de réserver certains noms de variables à des emplois locaux comme I, J et K pour les compteurs de boucles FOR. On s'impose de ne pas utiliser ces variables pour conserver des données utiles au programme et de les employer uniquement pour intervenir sur le code à l'intérieur de la boucle. À la fin de la boucle, on considère la variable comme réutilisable pour une autre portion de code, et toujours pas pour conserver des données vitales du programme. De façon similaire, on réserve quelques noms pour les travaux dans les routines appelées par GOSUB.

    Il faut prendre en considération que le BASIC ne permet pas à une routine de renvoyer une valeur, donc ceci doit se faire à l'aide d'une variable dont la routine affecte la valeur avant le RETURN. Le programmeur BASIC de 1983 doit conserver une liste écrite de ses variables de transmission de valeur et des routines où elles interviennent.

    Pour des routines analogues à une fonction, on peut employer DEF FN qui a l'avantage de renvoyer la valeur calculée et donc d'éviter de passer par une variable globale servant de transmission, mais on ne peut généralement programmer que des expressions calculatoires sans code algorithmique.

    Enfin, on évite d'utiliser les définitions de types par défaut en dehors des programmes, pour éviter que le programme soit perturbé par des définitions qui ne correspondent pas à l'usage qu'il fait de certaines variables. Par exemple, si le programme effectue des calculs en simple précision sur la variable A et que l'on a tapé DEFSTR A avant de lancer le programme, celui-ci s'interrompra rapidement sur une erreur TM Error. Tout comme les variables, les définitions de types par défaut sont globales.

    Instructions et fonctions[modifier | modifier le code]

    Les mots clés du BASIC du X-07 peuvent être regroupés en deux catégories : ceux qui proviennent du langage BASIC, et ceux qui sont ajoutés pour manipuler les spécificités du Canon X-07.

    Comme les tokens des mots-clés occupent les codes 128 à 255, il ne peut y avoir que 128 mots-clés. Bien que Microsoft ait parfois employé des mots-clés analysés caractère par caractère dans certains de ses BASIC, ce n'est pas le cas du X-07.

    À noter, les minuscules et majuscules ne sont pas différenciées en BASIC, tant pour les mots-clés que pour les noms de variables. Néanmoins, l'interpréteur BASIC ne conservera pas les minuscules dans les mots-clés car après tokenisation il apparaitront en majuscules dans le programme.

    Dans ce qui suit, les mots-clés sont regroupés par catégorie fonctionnelle.

    • les mots-clés de type commande ne sont pas destinés à être placées dans les programmes mais plutôt à contrôler la machine en mode direct (lorsque aucun programme n'est en cours d'exécution et que l'utilisateur n'est pas en train de saisir une ligne de programme commençant par un numéro de ligne)
    • les mots-clés instruction ne fonctionnent qu'à l'intérieur des programmes
    • si rien n'est indiqué dans la colonne type, le mot-clé peut être utilisé dans les deux contextes.

    Notations[modifier | modifier le code]

    La notation de syntaxe utilise quelques symboles spéciaux qui ne doivent pas être saisis :

    • < > : encadre un paramètre, un nom de variable, une expression ou autre élément de la syntaxe
    • [ ] : encadre une partie facultative de la syntaxe
    • ... : indique que la partie précédente de la syntaxe peut-être répétée

    BASIC (langage)[modifier | modifier le code]

    Instructions
    Instruction Type Syntaxe Commentaire Exemple
    CLEAR CLEAR Efface les variables, tableaux et définitions de types par défaut
    CONT commande CONT Relance l'exécution du programme après un arrêt par la touche break (on/break) ou CTRL+Cou une instruction STOP.
    DATA instruction DATA <constante [,...] Marque une série de valeurs constantes que le programme peut lire avec READ après avoir positionné la lecture sur la ligne avec RESTORE DATA 1, 3.14, "Bonjour"
    DEFFN instruction DEFFN <nom>([<param[,...]])=<expression> Définit une fonction appelable ensuite dans le programme. <nom> est un nom sur un ou deux caractères suivant les mêmes règles que les noms de variables, <param> est un nom de paramètre suivant les règles des noms de variable, et <expression> est une expression utilisant les paramètres. Lors des appels, la fonction sera calculée avec les valeurs transmises en paramètres. 10 DEFFN S(X,Y)=COS(X)/Y20 PRINT FNS(3.14, 2)
    DEFINT DESSNG DEFDBL DEFSTR DEF<type> <lettre>

    ou DEF<type> <lettre>-<lettre>

    Définit le type par défaut des variables dont le nom commence par la ou les lettres indiquées DEFINT I-K

    DEFSTR S

    DIM DIM <nom>(<indice max>[,...]),... Déclare un tableau avec une ou plusieurs dimensions de l'indice 0 à <indice max>. Par défaut, l'indice max vaut 10, ce qui donne une dimension de 11 (l'indice commence à 0). DIM A(12),M(3,3)
    END instruction END Met fin à l'exécution du programme. Les variables restent présentes en mémoire.
    ERASE ERASE <variable>[,...] Supprime une ou plusieurs variables ou tableaux de la mémoire ERASE A$, TM, SP!
    ERROR ERROR <code erreur> Déclenche une erreur BASIC d'après son code numérique. ERROR 10DD Error

    >

    FOR/TO/STEP/NEXT FOR <variable>=<valeur1> TO <valeur2> [STEP <valeur3>]

    ...<instructions>... NEXT  [<variable>]

    Effectue les instructions qui suivent autant de fois qu'indiqué, en utilisant la variable indiquée comme compteur : valeur1 est la valeur initiale du compteur, valeur2 est la valeur qui mettra fin à la boucle dès qu'elle sera atteinte ou dépassée et valeur3 permet d'indiquer de combien la variable est augmentée à chaque pas de boucle, par défaut cet incrément est de 1. Dans l'instruction NEXT qui termine la boucle, il n'est pas obligatoire de spécifier la variable car NEXT s'appliquera à la boucle la plus récemment démarrée. FOR I=1 TO 10 STEP 2 : PRINT I : NEXT I
    GOSUB/RETURN GOSUB <numéro de ligne> Exécute un sous-programme situé à un autre endroit dans le programme, et revient au point de l'appel lorsque l'instruction RETURN est rencontrée. Permet de factoriser du code souvent exécuté et de modulariser le programme.

    Il n'y a pas de limite au nombre d'appels GOSUB imbriqués sauf celle de la mémoire car chaque appel stocke son adresse de retour.

    10 A=10:GOSUB 100

    20 A=20:GOSUB 100

    30 END

    100 PRINT "A*2=";A*2:RETURN

    GOTO GOTO <numéro de ligne> Poursuit l'exécution à un autre endroit du programme. On peut l'utiliser pour démarrer le programme à partir d'une autre ligne que la première. 10 A=1

    20 IF A > 0 GOTO 100

    30 PRINT "Nombre nul ou négatif":END

    100 PRINT "Nombre positif":END

    IF/THEN/ELSE IF <expression>

    THEN <instructions>|<numéro de ligne> GOTO <numéro de ligne> [ELSE <instructions>|<numéro de ligne>]

    Si le résultat de l'expression est vrai (c'est-à-dire non nul), le programme exécute les instructions indiquées derrière THEN ou saute à la ligne indiquée par THEN ou GOTO.

    Sinon, si une clause ELSE est indiquée, il exécute cette clause au lieu du THEN/GOTO.

    Contrairement à FOR/TO/NEXT, les instructions dans IF/THEN/ELSE ne peuvent pas être placées sur une autre ligne, la totalité des clauses doit se situer dans la même ligne, ce qui peut être problématique avec la limite de 80 caractères sur le X-07.

    Si THEN et ELSE n'ont pas effectué de saut vers un numéro de ligne, l'exécution se poursuit à l'instruction ou ligne suivante.

    10 A=12

    20 PRINT "Nombre "; 30 IF A>0 THEN PRINT "positif" ELSE IF A=0 THEN PRINT "nul" ELSE PRINT "négatif"

    LET LET <variable>=<expression> Facultatif, le BASIC Microsoft n'a pas besoin de LET pour les affectations de valeur aux variables (ce mot-clé est un héritage des premiers BASIC où toute instruction devait commencer par une mot-clé d'instruction).
    LIST LIST [<début>][-[<fin>]] Fait défiler le listing du programme de la ligne début à la ligne fin. On peut suspendre le défilement avec CTRL+S et le poursuivre en tapant une touche. Les deux numéros de ligne sont facultatifs, par défaut le listing se fera à partir de la première ligne jusqu'à la dernière.
    LIST@ LIST@ [<début>][-[<fin>]] Fait défiler le listing du programme ligne par ligne de la ligne début à la ligne fin. Les deux numéros de ligne sont facultatifs, par défaut, le listing se fera à partir de la première ligne jusqu'à la dernière.

    La commande s'arrête à chaque ligne, on peut alors entrer en édition et modifier la ligne en tapant la touche ON/BREAK ou passer à la suivante en tapant une autre touche.

    LLIST commande LIST [<début>][-[<fin>]] Envoie le listing du programme vers une imprimante.
    NEW commande NEW Efface le programme et les variables.
    NEXT NEXT [<variable> [,...]] Continue la dernière boucle ou celle indiquée par la variable. Voir FOR.
    ON ERROR GOTO ON ERROR GOTO <numéro> Programme un saut vers la ligne numéro si une erreur BASIC survient ultérieurement pendant l'exécution du programme. Ce saut peut être désactivé par ON ERROR GOTO 0. Toute instruction ON ERROR GOTO remplace la précédente.
    ON GOSUB/ON GOTO ON <expression> GOTO|GOSUB <numéro> [,...] Calcule l'expression en nombre entier et :
    • si le résultat est nul ou négatif, passe à l'instruction suivante
    • si le résultat est un nombre entre 1 et le nombre de numéros de ligne indiqués dans la liste, effectue le saut ou le sous-programme à la ligne correspondante (1 pour le premier numéro etc).
    • si le résultat est trop grand par rapport à la liste, passe à l'instruction suivante
    READ READ <variable> [,...] Lit les données à la position actuelle des lecture des instructions DATA te les stocke dans les variables indiquées, qui doivent être de type approprié. La position de lecture est mise à jour et pointera sur la prochaine donnée DATA.
    REM REM [commentaire] Place du texte explicatif dans le programme, qui ne sera pas interprété. La fin de la ligne à partir de REM est ignorée.
    RESTORE RESTORE [<numéro>] Place le pointeur de lecture DATA au début de la ligne indiquée, ou par défaut au début du programme.
    RESUME RESUME [<numéro> | NEXT] Reprend l'exécution après un ON ERROR GOTO :
    • par défaut, à l'instruction qui a provoqué l'erreur et le GOTO
    • avec RESUME NEXT, à l'instruction située après celle qui a provoqué l'erreur
    • avec RESUME <numéro>, au début de la ligne indiquée
    RETURN RETURN Revient à l'instruction qui suit le GOSUB précédemment exécuté, ou termine le programme s'il n'y en avait aucun en cours.
    RUN RUN ["<descripteur>" [,"<type>"] | <numéro>] Nettoie la mémoire des données (chapins, variables, taleaux, FOR et GOSUB en cours etc) et démarre l'exécution du programme :
    • si "<descripteur>" est spécifié, le programme nommé est exécuté directement à partir du disque virtuel (RAM: peut être spécifié dans le descripteur mais n'est pas obligatoire) ; le <type> est facultatif et sera "P" par défaut
    • si <numéro> est spécifié, le programme en mémoire centrale est démarré à la ligne indiquée
    • si rien n'est spécifié, l'exécution démarre à la première ligne du programme en mémoire centrale

    Note : on ne peut pas démarrer un programme du disque virtuel à une ligne choisie

    STOP STOP Interrompt l'exécution du programme. Elle peut être relancée à l'instruction suivante avec CONT.
    TRON/TROFF TRON [#numéro] | TROFF Active ou désactive le mode de trace de l'exécution du programme. Dans ce mode, les numéros de lignes sont affichés au fur et à mesure de leur exécution. Si #numéro est spécifié, la trace est envoyée sur le canal de fichier spécifié, sinon elle est affichée sur l'écran.

    Les fonctions du BASIC ne peuvent apparaître qu'à la droite d'un signe =, à l'exception de MID$ qui peut être utilisée pour modifier le contenu d'une variable de chaîne.

    Fonctions
    Fonction Syntaxe Commentaire Exemple
    ABS ABS(<expression>) Renvoie la valeur absolue d'une expression (neutralisation du signe négatif éventuel)
    ASC ASC(<chaîne>) Renvoie le code ASCII du premier caractère d'une expression de type chaîne
    ATN ATN(<expression>) Renvoie la valeur de l'arctangente de l'expression (en radians)
    CDBL CDBBL(<expression>) Renvoie la valeur de l'expression au format double précision
    CHR$ CHR$(<expression>) Renvoie une chaîne contenant le caractère dont le code ASCII ou étendu est indiqué. L'expression doit être un nombre entre 0 et 255.
    CINT CINT(<expression>) Renvoie la valeur de l'expression au format entier. L'expression doit donner une valeur entre -32768 et 32767.
    COS COS(<expression>) Renvoie la valeur du cosinus de l'expression en radians
    CSNG CSNG(<expression>) Renvoie la valeur de l'expression au format simple précision.
    ERL ERL Renvoie le numéro de ligne où a eu lieu la dernière erreur,ou 65535 en mode direct
    ERR ERR Renvoie le code numérique de la dernière erreur ou 0
    EXP EXP(<expression>) Renvoie la valeur de l'exponentielle de l'expression (soit e<expression>)
    FIX FIX(<expression>) Renvoie la partie à gauche de la virgule de l'expression
    HEX$ HEX$(<expression>) Renvoie une chaîne représentant l'expression en hexadécimal.
    INSTR INSTR( [position], <chaîne1>, <chaine2>) Si la chaine2 se trouve dans chaine1, renvoie sa position (à partir de 1 pour le premier caractère). Si position est spécifiée, la recherche commence à cette position sinon au début de chaine1. Renvoie 0 si chaine2 n'est pas trouvé.
    INT INT(<expression>) Renvoie la partie entière de l'expression, c'est-à-dire le nombre entier immédiatement inférieur (donc INT(-1.5) renvoie -2)
    LEFT$
    LEN
    LOG
    MID$
    RIGHT$
    RND
    SNG
    SIN
    SQR
    STR$
    STRING$
    TAN
    VAL

    Affichage[modifier | modifier le code]

    Instructions
    Instruction Syntaxe Commentaire Exemple
    CIRCLE CIRCLE [STEP](<x>,<y>),r Trace un cercle de centre (x,y) et de rayon r. Si STEP est indiqué, le centre est le dernier point référencé (ou le dernier centre si l'instruction graphique précédente était CIRCLE) déplacé de (x,y). 10 CLS

    20 CIRCLE(20,10),5 30 CIRCLE STEP(5,0),4

    CLS CLS Efface l'écran et place les curseurs (texte et graphique) en haut à gauche à la position (0,0).
    LINE LINE [STEP][(<x1>,<y1>)]-[STEP][(<x2>,<y2>)] Trace une ligne des coordonnées (x1,y1) jusque (x2,y2). Si STEP est précisé devant des coordonnées, elles sont considérées comme des offsets et non des coordonnées et sont alors relatives au dernier point tracé.
    LOCATE LOCATE <x>,<y> Place le curseur texte à la position indiquée. x est un nombre entre 0 et 19, et y entre 0 et 3. La position verticale peut être invalide si une partie des lignes a été verrouillée avec CONSOLE.
    PRESET PRESET [STEP] <x>,<y> Eteint le point aux coordonnées (x,y). Si STEP est précisé, les coordonnées sont considérées comme des offsets et sont alors relatives au dernier point tracé.
    PSET PSET [STEP] <x>,<y> Allume le point aux coordonnées (x,y). Si STEP est précisé, les coordonnées sont considérées comme des offsets et sont alors relatives au dernier point tracé.
    Fonctions
    Fonction Syntaxe Commentaire Exemple
    CSRLIN CSRLIN Renvoie le numéro de ligne du curseur, où 0 est la ligne en haut de l'écran (LDC ou vidéo)
    POINT
    POS
    SCREEN
    TAB

    Entrées/sorties[modifier | modifier le code]

    Instruction Syntaxe Commentaire Exemple
    INIT# INIT#<numéro, "<descripteur>"

    [,<dimension>|<cadence> [,"<type>"|<mode>]]

    Initialise un fichier avec le numéro indiqué. Le fichier peut ensuite recevoir des données ou en fournir avec PRINT#, DIR#, LIST#, INPUT#.

    descripteur est un nom de périphérique du Canon X-07 éventuellement suivi d'un nom de fichier. Pour ouvrir un fichier dans le disque virtuel, on utilise par exemple "RAM:<nom>"ou simplement "<nom>" (RAM est le périphérique par défaut), pour l'imprimante X-710 ce sera "GPR:" sans besoin de spécifier un nom de fichier. dimension, type définissent la taille du fichier en octet (pour RAM:) et son type (généralement "D" pour les fichiers de données mais on peut choisir la lettre que l'on veut)

    cadence, mode indiquent la vitesse (en bauds) et le mode de transmission pour les ports de communication comme COM: ou OPT:.

    INPUT INPUT ["prompt";] <variable>[,...] Affiche le message prompt si spécifié, puis un caractère ? et attend la saisie par l'utilisateur d'autant de valeur qu'il y a de variables demandées, séparées par des virgules.
    INPUT# INPUT#<numéro>,<variable>[,...] Lit des données sur le fichier de numéro indiqué et les place dans les variables. S'il y a plusieurs valeurs, elles doivent être séparées par des virgules.
    LINE INPUT LINE INPUT ["prompt";] <variable chaîne> Affiche le message prompt si spécifié, puis attend la saisie par l'utilisateur d'une chaîne de caractères. Le signe ? n'est pas ajouté donc il faut l'ajouter dans prompt si on le souhaite. L'instruction ne saisit qu'une seule variable et obligatoirement de type chaîne de caractères. Les virgules et guillemets sont autorisés dans la saisie.
    LINE INPUT# LINE INPUT#<numéro>,<variable chaîne> Lit une chaine de caractères sur le fichier de numéro indiqué et la stocke dans la variable chaîne indiquée.
    LIST# LIST#<numéro>,[<début>][-[<fin>]] Fait défiler le listing du programme de la ligne début à la ligne fin vers le fichier indiqué. On peut suspendre le défilement avec CTRL+S et le poursuivre en tapant une touche. Les deux numéros de ligne sont facultatifs, par défaut, le listing se fera à partir de la première ligne jusqu'à la dernière.
    LIST@# LIST@#<numéro>,[<début>][-[<fin>]] Fait défiler le listing du programme sur un fichier ligne par ligne de la ligne début à la ligne fin. Les deux numéros de ligne sont facultatifs, par défaut le listing se fera à partir de la première ligne jusqu'à la dernière.

    La commande s'arrête à chaque ligne, on peut alors entrer en édition et modifier la ligne en tapant la touche ON/BREAK ou passer à la suivante en tapant une autre touche.

    LPRINT Imprime des données sur l'imprimante parallèle si le câble Centronic est utilisé, et l'imprimante graphique si la X-710 est connectée. Les commandes X-710 sont détaillées plus loin.
    OUT OUT <port>,<expression> Calcule le résultat de l'expression en nombre entier, et envoie son octet de poids faible sur le port de sortie du NSC800 de numéro indiqué. Le numéro de port peut être spécifié par une expression, il sera également ramené à une valeur entre 0 et 255.
    OUT# OUT#<numéro>,<expression> Envoie des données sur le fichier de numéro indiqué.
    PRINT PRINT [<expression][,|;[...]] Affiche une série de données sur l'écran. Si un point-virgule sépare des données, elles sont inscrites à la suite l'une de l'autre. Si une virgule les sépare, le curseur passe à la ligne entre chaque. Si un point virgule termine l'instruction, il n'y a pas de saut de ligne.

    Les expression numériques sont toujours précédées et suivies d'un espace, les chaînes de caractères ne le sont pas.

    PRINT 1;2;3

    1 2 3 PRINT 1,2,3 1 2 3

    PRINT USING PRINT USING "<format>";[<expression][,|;[...]] Affiche une série de données sur l'écran selon un format spécifique. Les formats de PRINT USING sont détaillés plus loin.
    PRINT# PRINT#<numéro>, [<expression][,|;[...]]

    PRINT#<numéro>, USING "<format>";[<expression][,|;[...]]

    Comme PRINT et PRINT USING mais envoie les données sur le canal de fichier indiqué.
    TRON# TRON#<numéro> Active le mode trace de l'exécution et envoie les traces des numéros de ligne sur le canal de fichier indiqué.
    Fonction Syntaxe Commentaire Exemple
    INKEY$ INKEY$ Si une touche a été tapée et enregistrée dans le tampon de saisie, renvoie le premier caractère ainsi dispo,nible dans ce tampon. Sinon, renvoie une chaîne vide. L'exécution du programme n'est pas suspendue comme avec INPUT et se poursuit, qu'une touche soit disponible ou non.
    INP INP( <numéro_port> | #<numéro> ) Saisit une donnée 8 bits soit sur un port d'entrée/sortie de 0 à 255, soit sur l'un des canaux de fichier 1 à 5.
    SNS
    STICK
    STRIG
    TKEY

    Horloge[modifier | modifier le code]

    Les fonctions liées à l'horloge s'utilisent comme des variables et on ne spécifie pas les parenthèses pour ces fonctions :

    • à droite du signe =, elles renvoient la chaîne actuelle représentant la donnée concernée
    • à gauche du signe =, elles modifient le contenu de la donnée
    Instruction Syntaxe Commentaire Exemple
    ALM$ ALM$ Représente l'alarme actuelle (active ou non).

    La chaine de caractères est au format YYYY/MM/DD/weekdays/hh/mm.

    Chacun des champs peut être absent, on conserve juste le / séparateur. On peut ainsi programmer une alarme pour un jour précis, ou une heure précise, ou certains jours de la semaine ou toute autre combinaison.

    • YYYY est l'année sur 4 chiffres
    • MM est le mois (1 à 12)
    • DD est le jour (1 à 31)
    • weekdays est un nombre 8-bits où chaque bit représente un des jours de la semaine en commençant par le dimanche sur le bit 6 (ajouter 64), puis le lundi sur le bit 5 (ajouter 32) et ainsi de suite jusqu'au samedi sur le bit 0 (ajouter 1). On peut ainsi indiquer quels jours l'alarme se déclenchera.
    • hh est l'heure (0 à 23)
    • mm indique les minutes (0 à 59)
    DATE$ DATE$ La chaîne est au format yy/mm/jj, dayday indique le jour de la semaine sous forme anglaise (MON pour Monday soit lundi, et ainsi de suite). Quand on reprogramme la date, il est inutile de spécifier le jour de semaine mais on doit indiquer l'année sur 4 chiffres.
    TIME$ TIME$ La chaîne est au format hh:mm:ss sur 24 heures

    Touches de fonction[modifier | modifier le code]

    Instruction Syntaxe Commentaire Exemple
    KEY$ KEY$(<n>) Renvoie ou programme la valeur d'une touche de fonction programmable. n vaut de 1 à 12 :
    • 1 à 5 pour les touches F1 à F5
    • 6 pour le carré central du pavé de flèches curseurs
    • 7 à 11 pour les touches SHIFT+F1 à SHIFT+F5
    • 12 pour SHIFT+carré central.

    La chaîne est au format suivant :

    • les trois premiers caractères sont un aide-mémoire affichable avec CONSOLE,,1 et désactivable avec CONSOLE,4,1
    • on peut concaténer du texte avec des CHR$() par exemple pour déclencher la touche Enter : KEY$(5)="runRUN"+CHR$(13)

    Caractères graphiques programmables[modifier | modifier le code]

    Instruction Syntaxe Commentaire Exemple
    FONT$ FONT$(<expression>) Renvoie la chaîne de définition d'un caractère ou en programme un. L'expression doit être comprise entre 0 et 255 à droite du signe égal, en revanche pour la programmation les codes possibles sont 128 à 159 (80 à 9F en hexadécimal) et 224 à 255 (E0 à FF).

    Les caractères peuvent être réinitialisés à leur valeur d'usine par CONSOLE@,1. La chaîne est au format [aa,bb,cc,dd,ee,ff,gg,hh] ou chacun des nombre hexadécimaux aa, bb et ainsi de suite représente une des 8 lignes de pixels du caractère. Chaque nombre est composé d'un bit à 1 pour un pixel allumé ou 0 pour éteint, le bit le plus significatif (à gauche) étant le premier pixel. les deux bits les plus à droite sont ignorés, les 6 les plus à gauche représentant les 6 pixels de la ligne.

    Pour calculer le nombre de chaque ligne on ajoute 128 pour le pixel le plus à gauche (80 hexa), 64 pour celui à sa droite (40 hexa), puis 32 (20 hexa), 16 (10 hexa), 8 et enfin 4 pour le plus à droite.

    Son[modifier | modifier le code]

    Instruction Syntaxe Commentaire Exemple
    BEEP BEEP <son>,<durée> Joue un son pendant la durée indiquée.

    son : 0 pour aucun son, 1 à 48 pour les demi-tons à partir de DO grave (4 octaves), 49 à 4095 pour un son de fréquence 19200/son Hz durée : de 0 à 255, nombre de 20e de secondes (soit 50 ms)

    BEEP 24,20

    Joue le DO de la troisième octave pendant une seconde

    Système[modifier | modifier le code]

    Instruction Syntaxe Commentaire Exemple
    CLEAR CLEAR [<taille zone chaînes>][,<adresse max BASIC>] Efface les variables, tableaux et types par défaut. Dimensionne la taille de la zone de stockage des chaines de caractères. Réserve une partie haute de la mémoire pour l'utilisateur (programmes en langage machine etc).

    Si adresse max BASIC est spécifiée, le X-07 réservera toute la mémoire au-delà de cette adresse pour l'utilisateur et placera ses zones de travail en dessous (y compris la zone des chaînes de caractères et celle du disque virtuel). Toutes les extensions mémoire prennent place en début de la zone des 64 ko.

    CLOAD CLOAD? CLOAD ["<fichier>"]

    CLOAD? ["<fichier>"]

    Charge un programme à partir du magnétophone à cassette ou le compare à celui en mémoire. Si un nom est spécifié, la bande défilera jusqu'à ce que le X-07 ait trouvé le programme portant le même nom sinon le premier programme trouvé est chargé.
    CONSOLE CONSOLE [<première ligne>]

    [,[<nombre de lignes>] [,[<aide-mémoire>] [,[<déclic clavier>] [,[<répétition>]]]]]

    Définit les propriété de la console de saisie sur l'écran 4x20? chaque paramètre est facultatif mais le dernier paramètre doit être précédé du nombre de virgules qui lui correspond.
    • première ligne : de 0 à 3, fixe la ligne à partir de laquelle la console fait défiler le texte (ligne 0 par défaut)
    • nombre de lignes : de 1 à 4, indique le nombre de lignes qui défilent (4 par défaut)
    • aide-mémoire : 1 pour afficher le rappel des touches de fonctions, 0 pour les cacher
    • déclic clavier : 1 pour activer le signal sonore lors de l'appui des touches, 0 pour le désactiver
    • répétition : 1 pour activer l'auto-répétition des touches quand on les laisse enfoncées
    CONSOLE ,,1,0,0

    affiche l'aide mémoire des touches de fonction programmable, désactive le son clavier et la répétition des touches

    CONSOLE@ CONSOLE@[<alarme>]

    [,[<définition>] [,[mode clavier]]]

    Active ou désactive l'alarme, les caractères et touches de fonctions utilisateur, et le mode du clavier.
    • alarme : 1 pour activer la fonction alarme, 0 pour la désactiver
    • définition : 1 pour réinitialiser les caractères définis par l'utilisateur (FONT$) à leur valeur usine, 0 pour initialiser les touches définies par l'utilisateur (KEY$) à leur valeur d'usine
    • mode clavier : 0 pour le clavier normal, 1 pour l'alphabet Kana (japonais), 2 pour les caractères graphiques (équivaut à l'appui de la touche GRPH), 3 pour activer le pavé numérique (équivaut à l'appui de la touche NUM)
    CONSOLE@0,0

    désactive l'alarme et reprogramme les touches de fonction avec leur valeur par défaut

    CSAVE CSAVE "<fichier>" Enregistre le programme actuel sur le magnétophone. La vitesse de transmission est de 1200 bauds, soit environ 120 octets par seconde (un peu plus d'une minute pour un programme de 8 ko)
    MOTOR MOTOR ON | OFF Démarre ou arrête le moteur du magnétophone.
    OFF OFF[1|2] OFF éteint le X-07 sans autre effet.

    OFF1active le programme de démarrage START$ puis éteint l'ordinateur OFF2 désactive le programme de démarrage puis éteint l'ordinateur. Une fois activé, le programme START$ reste actif tant qu'une commande OFF2 ne l'a pas désactivé ou que START$ n'est pas vidé. Le bouton OFF du clavier et la commande OFFne modifient pas l'état d'activation.

    L'extinction de l'ordinateur conserve le programme en mémoire centrale et le contenu du disque virtuel mais efface les variables. Pour les conserver au prochain allumage il faut utiliser SLEEP.

    SLEEP SLEEP Eteint l'ordinateur en conservant l'endroit actuel de l'exécution si l'instruction SLEEP est effectuée pendant celle-ci, et en préservant toutes les variables, tableaux, états FOR et GOSUB de l'exécution. Au démarrage de la machine, les opérations se poursuivent après l'instruction SLEEP. Si la commande est exécutée en dehors d'un programme, elle éteint l'ordinateur en préservant toutes les données en mémoire lorsqu'il sera rallumé.
    VARPTR
    Fonction Syntaxe Commentaire Exemple
    FRE FRE(<expression>) Si l'expression est numérique, renvoie la mémoire disponible en zone centrale. Si l'expression est une chaîne, renvoie l'espace disponible dans la zone réservée des chaînes de caractères (par l'instruction CLEAR n). L'expression peut être un simple nom de variable typé comme A! et A$.
    START$

    Disque virtuel[modifier | modifier le code]

    Instruction Syntaxe Commentaire Exemple
    DELETE DELETE "fichier" [,"<type>"] Supprime le fichier indiqué du disque virtuel. Le type est par défaut "D" qui indique un fichier de données. Pour supprimer un programme il faut obligatoirement spécifier le type "P". DELETE "HELLO","P"

    supprime le programme "HELLO"

    DIR DIR [#<numéro>] Envoie la liste des fichiers du disque virtuel vers la sortie indiquée, par défaut sur l'écran sinon vers le périphérique ou fichier créé avec le numéro indiqué (voir INIT#) INIT#1,"GPR:"

    DIR#1 envoie la liste sur l'imprimante X-710

    FSET FSET <taille> Fixe la taille du disque virtuel en octets. La taille ne peut pas être inférieure à ce qui est nécessaire pour les fichiers actuellement stockés dans le disque. Cette instruction ne modifie pas le contenu du disque. FSET 1024

    DIR RAM: 1024/1011

    LOAD LOAD "<descripteur>"

    [,<dimension>|<cadence>

    [,"<type>"|<mode>]]

    Charge un programme à partir du descripteur de fichier indiqué (un descripteur de périphérique ou un nom de fichier situé dans le disque virtuel). Si le descripteur est un périphérique série (par exemple COM:), la cadence et le mode de transmission doivent être spécifiés. Si c'est un fichier du disque virtuel on indique sa taille et son type ("P" par défaut).
    LOAD? LOAD? "<descripteur>"

    [,<dimension>|<cadence>

    [,"<type>"|<mode>]]

    Compare un programme à celui en mémoire centrale à partir du descripteur de fichier indiqué (voir LOAD pour les détails des paramètres)
    RUN"" RUN "<descripteur>"

    [,"<type>"]

    Exécute le programme du disque virtuel nommé sans le charger en mémoire centrale. Le type facultatif est "P" par défaut.
    SAVE SAVE "<descripteur>"

    [,<dimension>|<cadence>

    [,"<type>"|<mode>]]

    Envoie le programme de la mémoire centrale vers le descripteur de fichier indiqué (un descripteur de périphérique ou un nom de fichier situé dans le disque virtuel). Si le descripteur est un périphérique série (par exemple COM:), la cadence et le mode de transmission doivent être spécifiés. Si c'est un fichier du disque virtuel (le descripteur spécifieRAM: ou ne spécifie pas de périphérique ) on peut indiquer son type ("P" par défaut).

    Langage machine[modifier | modifier le code]

    Instruction Syntaxe Commentaire Exemple
    EXEC EXEC <adresse> Démarre le programme en langage machine à l'adresse indiquée. Ce programme peut se trouver en ROM ou être placé en mémoire avec POKE, dans une zone utilisateur réservée avec CLEAR. La technique du string packing[8] permet de placer des programmes en langage machine à l'intérieur de chaines de caractères ou ligne de remarques du programme BASIC, mais dans ce cas, il faut se méfier des sauts en adresse absolue puisque le programme BASIC peut être modifié, ce qui change l'emplacement du programme en langage machine et invalide les adresses absolues qui y sont utilisées.

    Si le programme se termine par une instruction Z80 RET (&C9), le programme BASIC continue son exécution après le EXEC. L'adresse peut être rédigée en décimal (0 à 32767 puis -32768 à -1 qui est l'adresse la plus haute) ou de façon plus pratique en hexadécimal avec le préfixe & (&0000 à &FFFF)

    POKE POKE <adresse>, <expression> Calcule l'adresse en nombre entier (entre 0 et 65536 ou &hFFFF), calcule l'expression en nombre entier, et inscrit l'octet de poids faible de ce résultat à l'adresse indiquée en mémoire. Si l'adresse se situe dans une zone ROM ou inexploitée, l'instruction n'a aucun effet. ible de ce ré&sultazt
    PEEK PEEK <adresse>
    USR

    LPRINT sur l'imprimante X-710[modifier | modifier le code]

    - TBD -

    Formats PRINT USING[modifier | modifier le code]

    - TBD -

    Optimisation du code BASIC[modifier | modifier le code]

    Le BASIC Microsoft du X-07 provient d'une famille née en 1976 sur le TRS-80 avec son BASIC Level II. Les programmeurs ont progressivement découvert comment économiser au mieux le temps CPU et le maigre espace mémoire, et ces techniques sont tout à fait applicables sur le X-07.

    Regrouper les instructions[modifier | modifier le code]

    Le BASIC Microsoft permet de mettre plusieurs instructions sur une même ligne en les séparant par un :. Sans réduire énormément la lisibilité, ceci économise une ligne de programme à chaque fois et comme chaque ligne occupe trois octets de plus que le code (2 pour le numéro de ligne et 1 pour la fin de la ligne), chaque instruction ainsi placée économise 3 octets. Cela parait peu mais pour un Canon X-07 de base avec 6 748 octets disponibles, 3 octets ne sont pas négligeables.

    NEW
    10 INPUT"Nom";N$
    20 PRINT"Bonjour ";N$
    PRINT FRE(0)
    6715
    NEW
    10 INPUT"Nom",N$:PRINT"Bonjour ";N$
    PRINT FRE(0)
    6719
    

    Eviter les espaces[modifier | modifier le code]

    Grâce à la tokénisation, les lignes de programmes n'ont pas besoin qu'un caractère espace sépare les mots-clés et les paramètres des fonctions et instructions. Les deux blocs de code suivants fonctionnent de la même manière mais le second économise 9 octets. Outre l'économie de mémoire, l'exécution est aussi légèrement plus rapide puisqu'il n'y a plus besoin d'analyser les espaces.

    10 INPUT "Quel est votre nom",N$
    20 PRINT "Bonjour ";:IF N$="Francis" THEN PRINT "maître !" ELSE PRINT N$
    
    10 INPUT"Quel est votre nom",N$
    20 PRINT"Bonjour ";:IFN$="Francis"THENPRINT"maître !"ELSEPRINTN$
    

    Placer les sous-programmes en début de programme[modifier | modifier le code]

    Quand l'interpréteur rencontre un saut vers un numéro de ligne (GOTO, GOSUB, IF/THEN...) il recherche cette ligne à partir du début du programme en mémoire. Il regarde le premier numéro de ligne qu'il trouve, si ce n'est pas le bon, il saute par dessus la ligne et examine la suivante et ainsi de suite.

    La convention dans les magazines et parmi les programmeurs amateurs dans les années 1980 était de placer le programme en début de listing et les sous-programmes à la fin pour des raisons de lisibilité. Mais avec le BASIC Microsoft et son fonctionnement, ceci ralentit énormément les appels des sous-programmes :

    10 REM début du programme
    
    999 END
    1000 REM sous-programme gosub n°1
    
    1190 RETURN
    1200 REM sous-programme gosub n°2
    
    1299 RETURN
    

    Pour cette raison il est préférable de mettre en première ligne un GOTO vers un numéro lointain comme GOTO 1000 qui sera atteint quand on lance le programme avec RUN, puis de placer les sous-programme les plus souvent appelés au début du listing, et ensuite à partir de la ligne 1000 on met le code du programme principal :

    10 GOTO 1000
    20 REM sous-programme gosub n°1
    
    190 RETURN
    200 REM sous-programme gosub n°2
    
    299 RETURN
    1000 REM début du programme
    
    1999 END
    

    Définir les types par défaut des variables[modifier | modifier le code]

    Par défaut, le Canon X-07 suppose qu'en l'absence de typage, les variables sont de type double précision avec une valeur stockée sur 8 octets. C'est le type de données le plus couteux en termes de temps de calcul. Si l'on préfère utiliser des nombres en simple précision (4 octets) ou même des entiers (2 octets généralement directement utilisables dans les registres du NSC800/Z80), on peut ajouter le suffixe de typage aux variables, mais le plus simple est de profiter des instructions DEF… qui donnent un type aux variables en fonction du premier caractère de leur nom.

    Par exemple, dans la plupart des boucles FOR/TO/NEXT, on utilise un indice entier et donc la variable utilisée peut être définie par DEFINT et ainsi utiliser les instructions arithmétiques du Z80 (INC A) au lieu des routines en virgule flottante du BASIC qui demandent beaucoup plus de temps d'exécution et ceci à chaque boucle.

    Pour cette raison, l'idéal est réserver les variables dont les noms commencent par certains caractères à des usages spécifiques : par exemple I à K pour les compteurs des boucles FOR/TO/NEXT, X à Z pour les calculs mathématiques en virgule flottante, certaines autres lettres pour des chaines de caractères. Par sécurité, on fait précéder ces déclarations d'un CLEAR qui supprime toutes les variables et types par défaut (la commande RUN qui démarre le programme les efface également) :

    10 CLEAR:DEFINT I-K:DEFSNG X-Z:DEFSTR N,P,S
    

    L'avantage est aussi d'économiser un octet (espace mémoire et vitesse d'analyse lexicale) dans le stockage du programme à chaque référence d'une de ces variables puisqu'on n'a plus besoin d'indiquer le suffixe de type.

    Déclarer les variables et tableaux les plus utilisés en premier[modifier | modifier le code]

    Comme pour les lignes de programme, lorsque l'interpréteur recherche une variable dans sa table de toutes les variables existantes, il commence par la première qui a été déclarée, puis la suivante et ainsi de suite jusqu'à la plus récente.

    Les variables ne sont pas triées par nom en mémoire, elles remplissent simplement la table des variables au fur et à mesure de leur création, donc celles créées en premier seront trouvées plus rapidement.

    Là également, l'idée pour optimiser l'accès à une variable très utilisée est de la déclarer au début du programme. On déclare en tout début de programme toutes les variables les plus utilisées en leur affectant une valeur sans importance, et après leur avoir affecté un type par défaut (voir partie précédente) afin d'économiser le suffixe de type.

    La même optimisation vaut pour les tableaux, qui sont stockés dans une table différente de celle des variables simples.

    Dimensionner la zone des chaines de caractères[modifier | modifier le code]

    Les chaines de caractères sont stockées dans une zone réservée en haut de mémoire. Lorsqu'une opération déclenche un manque d'espace disponible dans cette zone, le BASIC active son garbage collector pour regrouper les chaines encore en usage, supprimer celles qui ont été effacées et au final voir si l'opération demandée est possible ou s'il faut déclencher une erreur OM Error.

    Comme avec tous les garbage collectors même les plus récents, ce processus de compactage fige le programme pendant une durée qui, sur le X-07, peut atteindre plusieurs minutes. Aussi, si le programme n'est pas trop encombrant, l'idéal est de réserver un maximum de place à la zone des chaines avec l'instruction CLEAR. De cette manière, le programme ne sera pas gêné, mais les opérations sur les chaines de caractères déclencheront moins souvent le garbage collector et ne ralentiront pas le programme.

    Bien entendu, plus d'espace mémoire pour les chaines de caractères signifie qu'il en reste moins pour le programme et les autres données et davantage de chaines de caractères entraine un compactage plus long, donc il faut ajuster cet espace en procédant à des essais.

    Attention également à comprendre que les expressions de type chaîne ont besoin de cet espace pour leur stockage temporaire. Dans l'exemple ci-dessous, l'instruction qui concatène les deux chaînes de caractères (avec +) ne peut pas travailler car il n'y a pas assez d'espace disponible en zone réservée (le CLEAR 10 ayant affecté seulement 10 octets à cette zone). La seconde instruction s'effectue correctement car elle ne calcule pas d'expression et n'a donc pas besoin d'espace de stockage temporaire :

    CLEAR 10
    PRINT "Bonjour "+ "cher ami."
    OS Error
    
    PRINT "Bonjour "; "cher ami."
    Bonjour cher ami.
    >
    

    Optimiser les opérations booléennes[modifier | modifier le code]

    Le BASIC Microsoft ne possède pas de type booléen, mais il utilise le type entier (variables %) pour le simuler. Au lieu d'opérateurs logiques, les opérateurs comme AND OR NOT et ^ (soit XOR) sont effectués par les opérateurs binaires du NSC800 sur chacun des 16-bits.

    La définition de true et false dans ce mode opératoire est la suivante : false est équivalent à 0 avec tous les bits de valeur 0, tandis que true est NOT false soit -1 avec tous les bits à 1.

    Plus généralement, n'importe quelle expression non nulle sera considérée comme valant true derrière une instruction de test IF, toutefois ceci ne s'applique qu'au résultat final de l'expression. Il faut se méfier car le AND restant une opération binaire, l'expression 2 AND 4 par exemple dont les deux opérandes ne sont pas nuls donne pourtant un résultat nul et donc false, chacun des bits 1 tombant face à un bit 0.

    Cette analogie permet de nombreux raccourcis. NOT 0 donne -1 en entier, et NOT -1 donne 0. En combinant ceci avec les opérateurs AND, OR, NOT ou ^ (qui signifie XOR), on peut manipuler des concepts booléens complexes.

    On utilise abondamment les raccourcis les plus classiques de l'algèbre de Boole :

    • NOT(A AND B) équivaut à NOT A OR NOT B
    • NOT(A OR B) équivaut à NOT A AND NOT B
    • A => B équivaut à NOT A OR B

    Détails internes BASIC[modifier | modifier le code]

    Tokenisation[modifier | modifier le code]

    Une des particularités du BASIC Microsoft est la tokenisation des lignes de code lors de leur entrée en mémoire. C'est un procédé d'analyse lexicale tout à fait standard pour l'interpréteur d'un langage de programmation mais Microsoft l'utilise aussi dans d'autres buts[6].

    Le principe de la tokenisation est d'identifier les constituants atomiques de la ligne de programme : les mots-clés des instructions et fonctions, les nombres, une chaine de caractères, les symboles comme les parenthèses ou le séparateur :, en résumé tout ce qui constitue un élément unitaire du langage que l'on ne décompose plus en sous-éléments. Ces éléments sont ensuite remplacés par des tokens, qui retiennent leur contenu éventuel et indiquent leur type à l'analyseur syntaxique.

    Dans le BASIC Microsoft, la tokenisation se s'occupe que des mots-clés du langage. Lorsque l'utilisateur tape la touche ENTER pour une ligne de programme ou une ligne de code direct, les instructions du langage comme PRINT et les fonctions comme INKEY$ qui s'y trouvent sont transformés en un token, un code numérique unique qui va de 128 à 255. Ils occupent ainsi un seul octet dans le code en mémoire, contrairement à ce qui est saisi par l'utilisateur caractère par caractère. S'il s'agit d'une ligne de programme avec un numéro avant les instructions, celui-ci est transformé en un entier 16 bits et l'interpréteur vérifie qu'il est inférieur à 65200. L'ensemble est alors inséré dans le programme entre les lignes correspondant au numéro, ou en écrasant une ligne de même numéro.

    La ligne de code ainsi stockée contient une succession d'octets de différentes natures :

    • à l'intérieur des chaines de caractères entre guillemets " (dont le code est 34), n'importe quels caractères dont les codes vont de 0 à 255 (certains codes entre 0 et 32 sont interdits ou inertes) ;
    • des caractères ASCII dont le code se situe entre 32 (pour l'espace) et 127 (pour le point d'interrogation inversé) : ceci peut inclure les divers symboles de ponctuation des instructions comme les parenthèses des fonctions ;
    • des tokens de mots-clés dont les codes vont de 128 à 255.

    Dans les BASIC Microsoft, le token d'un mot-clé joue plusieurs rôles :

    • il sert aux vérifications lexicales lors de l'exécution ;
    • il réduit la taille du code stocké en mémoire, le code stocké étant celui tokenisé et non la source saisie par l'utilisateur ;
    • l'exécution ultérieure n'a pas besoin de refaire la tokenisation et est accélérée par rapport à un interpréteur qui analyserait chaque caractère des mots-clé à chaque exécution ;
    • il constitue (une fois multiplié par deux) l'offset dans une table d'adressage en ROM où l'interpréteur récupère l'adresse de la routine qui effectue le travail du mot-clé.

    Cette conception token/offset dans une table d'adressage est au cœur de tous les BASIC Microsoft des ordinateurs familiaux à partir de 1976. Deux des trois premiers ordinateurs grand public en sont équipés : le TRS-80 avec le BASIC Level II, l'Apple II avec Applesoft BASIC (en). L'avantage de cette technique est l'optimisation en vitesse d'exécution et en mémoire occupée, mais elle a l'inconvénient de réserver les octets 128 à 255. Cela n'empêche cependant pas le Canon X-07 de proposer des caractères graphiques utilisant ces mêmes codes, car les chaînes de caractères entre guillemets ne sont pas tokénisées par l'interpréteur. Enfin cela limite le nombre de mots-clé à 128 mais rare sont les langages qui en utilisent autant (en général ce sont les librairies de fonctions qui ajoutent des mots-clés, mais cette famille de BASIC Microsoft ne dispose pas d'un système de librairies).

    Il faut noter que le travail en amont de l'exécution s'arrête à la tokenisation des mots-clés. Il n'y a par exemple aucune tokenisation des numéros de ligne présents dans les instructions comme GOTO GOSUB ou IF THEN, ni des nombres entiers par exemple dans les limites des boucles FOR, ni de vérification syntaxique (oubli de parenthèses, virgules ou autre). Les parenthèses qui entourent les paramètres des fonctions, le signe égal des expressions ne sont pas tokénisés car ils n'occupent déjà qu'un octet, mais les opérateurs (logiques, arithmétiques) le sont ce qui permet de pointer vers leur routine d'exécution.

    Grâce à la tokenisation, les espaces sont inutiles dans le code et on peut écrire des mots clés collés à des variables sous forme très compacte sans que cela provoque d'erreur :

    10 IFA=0THENPRINT"OK"
    RUN
    OK
    

    La lisibilité du code en est très réduite par rapport à la forme classique (IF A=0 THEN PRINT "OK") mais cela permet une économie de 4 octets sur 14. L'exécution est également légèrement plus rapide puisque l'interpréteur n'a pas à analyser les espaces. Ces gains semblent négligeables de nos jours mais avec un processeur fonctionnant à 4 MHz et ne disposant que de 65535 octets, ils ne le sont pas (pour un Canon X-07 équipé de 16 Ko de mémoire, 4 octets représentent 0,024% de la mémoire disponible : sur une machine récente avec 16 Go, ce pourcentage représente plus de 400 Mo de mémoire).

    Le tableau suivant indique la valeur des tokens de chaque mot-clé du BASIC. Les mots-clés destinés à l'interface vidéo X-720 sont particuliers car dans la table d'adressage, leur adresse pointe vers le début de la mémoire RAM où un autre vecteur envoie par défaut sur une erreur. Quand l'interface X-720 est connectée, son initialisation remplace ces vecteurs en RAM par l'adresse dans la ROM du X-720 qui gère l'instruction. Le même système était utilisé sur le TRS-80 pour les instructions destinées aux lecteurs de disquettes.

    Pour cette raison, les mots-clé spécifiques à l'extension comme COLOR ou SCREEN sont déjà prévus dans la ROM d'origine mais comme ils ne disposent pas encore de leur routine, ils pointent sur une adresse en début de mémoire dans la zone de travail du BASIC qui les envoie, par défaut, vers une routine d'erreur. En l'absence du X-720, on peut donc les réutiliser pour un autre emploi en les faisant pointer à l'initialisation vers des adresses en RAM protégée utilisateur où l'on place une extension BASIC ou vers une EPROM logée dans le compartiment XR-100.

    Les noms des mots-clés sont stockés dans une table située en EE83 : dans cette table, ils sont rangés séquentiellement à partir du token 128. Le premier caractère de chaque mot-clé a son bit 7 positionné (cela ajoute 128 au caractère), ce qui permet d'identifier le début du mot-clé suivant lors de la recherche. On trouve ainsi à l'adresse EE83 le caractère E de l'instruction END auquel a été ajouté 128, ce qui donne 197, suivi en EE84 du code de N puis de D en EE85. Le processus se poursuit jusqu'au token 254 (fonction POINT) puis on trouve un pseudo token 255 qui termine la table.

    L'adresse en ROM de la routine correspondant à une instruction est issue de la table de vecteurs située en F076h : cette table contient l'adresse de chaque routine pour les tokens 128 (80h pour END) à 185 (B9h pour NEW). Les adresses des fonctions à partir du token 186 (BAh) sont issues de la page 91 de l'ouvrage Les mystères du Canon X-07 [9].

    Le programme suivant procure la liste des mots-clés pour chaque token ainsi que l'adresse (quand elle peut être calculée à partir de la table F076). Les noms sont scannés à partir de EE83, le premier caractère est débarrassé de son bit 7 en soustrayant 128 puis les caractères suivants sont ajoutés jusqu'à ce que l'on trouve le prochain caractère avec un bit 7 à 1 (donc supérieur à 128). Dans le code, la variable V qui calcule le vecteur de la routine est placée en simple précision car en entier, l'opération de la ligne 50 provoque un dépassement de capacité au delà de +32767, les variables entières étant signées. Comme expliqué précédemment, le vecteur des fonctions est situé dans une autre table que celle des instructions et n'est pas affiché par ce programme.

    10	DEFINT A-Z:DEFSNG V
    20	S=&HEE83
    30	FOR T=128 TO 255
    40	A=&HF076 + 2*(T-128)
    50	V=PEEK(A)+256*PEEK(A+1)
    60	S$=CHR$(PEEK(S)-128)
    70	S=S+1
    80	IF PEEK(S)<128 THEN S$=S$+CHR$(S):GOTO 70
    90	PRINT T;" ";S$;:IF T<186 THEN PRINT ":";HEX$(V) ELSE PRINT
    100	NEXT
    
    Token (hexa) Mot clé Adresse en ROM (ou RAM) Token (hexa) Mot clé Adresse en ROM (ou RAM)
    80 END D2B0 C0 STRING$ D835
    81 FOR F3F7 C1 INSTR DCD6
    82 NEXT D30C C2 INKEY$ C103
    83 DATA F66A C3 INP E931
    84 INPUT F82F C4 VARPTR E9A7
    85 DIM B005 C5 USR E9BB
    86 READ F86B C6 SNS E961
    87 LET F685 C7 ALM$ D928
    88 GOTO F621 C8 DATE$ D8CE
    89 RUN F5B7 C9 TIME$ D868
    8A IF F797 CA START$ DA99
    8B RESTORE D296 CB FONT$ D739
    8C GOSUB F610 CC KEY$ DA39
    8D RETURN F63D CD SCREEN 0087
    8E REM F666 CE THEN
    8F STOP D2C0 CF NOT FC1A
    90 ELSE F666 D0 STEP F537
    91 TR D1B7 D1 +
    92 MOTOR E0B9 D2 -
    93 DEFSTR F54E D3 *
    94 DEFINT F551 D4 /
    95 DEFSNG F554 D5 ^
    96 DEFDBL F557 D6 AND FC68
    97 LINE F7C6 D7 OR
    98 ERROR F78C D8 XOR
    99 RESUME F734 D9 EQV FC72
    9A OUT E98C DA MOD
    9B ON F691 DB ¥
    9C LPRINT E9DE DC >
    9D DEFFN FC96 DD +
    9E POKE FC80 DE <
    9F PRINT EA05 DF SGN C9F1
    A0 CONT D178 E0 INT CC23
    A1 LIST FE75 E1 ABS C9DC
    A2 LLIST FE6B E2 FRE DDD7
    A3 CLEAR D1D0 E3 POS FC8C
    A4 CIRCLE 009C E4 SQR B694
    A5 CONSOLE E243 E5 RND B771
    A6 CLS CE9E E6 LOG B609
    A7 COLOR 008A E7 EXP B6DD
    A8 EXEC CEB8 E8 COS B530
    A9 LOCATE E212 E9 SIN B549
    AA PSET 008D EA TAN D593
    AB PRESET 0090 EB ATN B5AC
    AC OFF C5B1 EC PEEK FC7A
    AD SLEEP C59B ED CINT CAE0
    AE DIR E5E3 EE CSNG CB08
    AF DELETE E682 EF CDBL CB90
    B0 FSET BF56 F0 FIX CC14
    B1 PAINT 0099 F1 LEN D72D
    B2 LOAD DF38 F2 HEX$ D538
    B3 SAVE DEFE F3 STR$ D53D
    B4 INIT E699 F4 VAL DCB3
    B5 ERASE E3CF F5 ASC D81A
    B6 BEEP C2CD F6 CHR$ D828
    B7 CLOAD DF30 F7 TKEY D7CC
    B8 CSAVE DEF9 F8 LEFT$ DC5A
    B9 NEW D214 F9 RIGHT$ DC8A
    BA TAB FA MID$ DC93
    BB TO FB CSRLIN CEAF
    BC FN FCB5 FC STICK D7E3
    BD USING FD STRIG D7F8
    BE ERL FAC4 FE POINT 0093
    BF ERR FAB6 FF

    Table des variables[modifier | modifier le code]

    Le BASIC stocke toutes les variables du programme dans une table qui est stockée immédiatement après le programme en mémoire. Si une ligne est insérée dans le programme, ou si l'utilisateur exécute la commande RUN, cette table est vidée et la mémoire libérée.

    Chaque variable est stockée à la fin de la table à sa création en stockant selon son type :

    • un octet indiquant à la fois son type et le nombre d'octets de son contenu : 2 pour un nombre entier, 3 pour une chaine de caractères, 4 pour un nombre simple précision et 8 pour un nombre double précision ;
    • son nom sur deux octets, le second étant à 0 pour les variables A à Z ;
    • pour une variable numérique, sa valeur sur 2 (entiers 16 bits), 4 (simple précision) ou 8 octets (double précision) ;
    • ou pour une chaine de caractères, sa longueur sur un octet (de 0 à 255 caractères) puis l'adresse sur 16 bits de son contenu dans la zone réservée aux chaînes (voir le chapitre suivant sur les chaînes de caractères).

    Étant donné que les variables ne sont pas triées par leur nom, le BASIC doit examiner toute la table séquentiellement lorsqu'il en cherche une. Si le nom ne correspond pas il utilise l'octet de type pour sauter par dessus le contenu (2, 3, 4 ou 8 octets) et examiner la variable suivante. Il procède ainsi jusqu'à trouver la variable ou la fin de la table. On comprend que ce mode de fonctionnement a deux conséquences directes :

    • les variables dont le nom est constitué d'une seule lettre sont identifiées deux fois plus vite ;
    • le temps pour localiser une variable dans la table est proportionnel au nombre de variables qui ont été créées avant elles lors de l'exécution du programme.

    Ceci implique deux méthodes d'optimisation des programmes BASIC : utiliser le plus possible des variables d'une seule lettre, et déclarer en premier les variables les plus utilisées.

    L'adresse de la table des variables elle-même est stockée dans une variable interne du BASIC appelée VARTAB : celle-ci se trouve à l'adresse 0322h sur deux octets[4]. Le programme suivant affiche le début de la table des variables : une variable A est créée, puis on récupère la valeur de VARTAB à l'adresse 322h dans une variable P%, enfin on affiche les 20 octets à partir de cette adresse.

    10 A=1
    20 P%=PEEK(&H322)+256*PEEK(&H323)
    30 FOR I%=P% TO P%+20
    40 PRINT HEX$(PEEK(I%));" ";
    50 NEXT
    RUN
    8 41 0 41 10 0 0 0 0
     0 0 2 50 0 9E 5 2 4
    9 0 B1 5
    

    On voit apparaître successivement les trois variables créées lors de l'exécution :

    • le 8 suivi de 41 0 correspond à la variable A en double précision créée en ligne 10, sa valeur sur 8 octets est 41 10 0 0 0 0 0 0;
    • le 2 suivi de 50 0 correspond la variable P% créée en ligne 20, sa valeur sur 2 octets est 9E 5 ce qui correspond à l'adresse mémoire 059E (c'est le contenu de la variable interne VARPTR indiquant l'emplacement de la table des variables) ;
    • le 2 suivi de 49 0 (le saut de ligne intervient entre le 4 et le 9) correspond à la variable I% créée par la boucle FOR de la ligne 30, sa valeur est B1 5 soit 05B1 en hexadécimal au moment de l'exécution de la ligne 40. En réalité, à la fin du programme sa valeur est 05B2 car la boucle l'a incrémentée une fois de plus.

    Comme on le voit, la variable I% ayant été créée en dernier apparait après la variable P% dans la table.

    Chaines de caractères et garbage collector[modifier | modifier le code]

    Le BASIC Microsoft stocke les chaines de caractères dans un espace mémoire réservé de taille fixe. En dehors de celles exprimées directement dans les instructions PRINT, les chaines sont stockées dans des variables dont le nom est suffixé par $, comme dans la ligne suivante :

    10 T$="Exemple"
    

    À l'exécution, ce programme va créer une variable nommée T$ et lui associer l'endroit en mémoire où sera stocké le texte Exemple.

    Avec ce système, la création par exemple d'une variable A déplacera T$ dans la table des variables en mémoire mais elle ne déplace pas son contenu qui reste à la même adresse dans la zone réservée.

    Initialement, cette zone est dimensionnée à 50 octets. On peut connaître sa taille avec la fonction FRE() appliquée à une variable chaine :

    PRINT FRE(Z$)
     50
    >
    

    On peut changer cette taille avec l'instruction CLEAR qui prend en premier paramètre la taille de l'espace réservé aux chaines. Ainsi, pour réserver 200 octets aux chaines, on fera ceci :

    CLEAR 200
    

    Quand la création ou modification d'une variable chaine amène à manquer d'espace dans cette zone (par exemple, on doit ajouter 10 caractères à une variable mais l'espace disponible n'est plus que de 5 octets), le BASIC procède en deux temps :

    • d'abord, à l'aide d'un garbage collector, il compacte toutes les variables chaines existantes pour regrouper leurs contenus à la fin de la zone réservée. En déplaçant les contenus, il met à jour les variables.
    • ensuite, si ce compactage a permis de libérer suffisamment d'espace en début de zone, il effectue le travail normalement. Sinon, il arrête le programme sur une erreur de dépassement de capacité mémoire (OM ERROR pour Out of Memory)

    Le garbage collector du BASIC Microsoft est par nature assez lent et peut suspendre le travail du programme pendant quelques secondes. Si le programme effectue beaucoup de travaux sur des chaines de caractères, il est donc judicieux de réserver une assez grande zone pour tout ce qui doit être stocké, mais aussi pour éviter que le garbage collector ne se déclenche trop souvent. Bien entendu, plus il y aura de variables et de grands contenus à déplacer lors du compactage, plus l'opération sera lente donc un grand espace n'est pas nécessairement la garantie d'une plus grande vitesse : lorsque le garbage collector se déclenche, la suspension du travail est fonction de la quantité de contenus à déplacer.

    Le BASIC utilise trois variables internes pour gérer la zone des chaines de caractères[4] :

    • MEMSIZ (stockée sur 16 bits en01DF) indique l'adresse la plus haute utilisable (juste avant la zone réservée par l'utilisateur pour le langage machine avec le second paramètre de CLEAR) ;
    • FRETOP (stockée sur 16 bits en 0204) indique l'adresse la plus haute utilisée par les chaines de caractères, l'allocation se faisant à reculons en mémoire ;
    • STKTOP (stockée sur 16 bits en 01DD) indique le haut de la pile, qui est aussi le début de la zone des chaînes de caractères.

    Détails internes X-07[modifier | modifier le code]

    La conception du Canon X-07 est originale pour son époque, en partie par les nombreux périphériques connus de son BASIC mais aussi par ses possibilités sonores et spécifiques comme les différents modes de clavier, les touches de fonction programmables, l'horloge, le pavé curseur, le programme de démarrage, les alarmes, les caractères graphiques programmables, les cartes d'extension mémoire amovibles ou l'interface vidéo.

    Une partie de ces possibilités est gérée par la combinaison d'une puce de contrôle entrées sorties qui sert d'interface entre le sous-processeur T6834 et le processeur principal NSC800. Le sous-processeur possède sa propre mémoire vive de 2 ko, afin de stocker par exemple les touches programmables mais aussi le tampon des touches tapées en avance au clavier sans que le processeur principal n'ait à dépenser de temps ou de mémoire pour cela.

    Une autre partie des possibilités est apportée par l'interface vidéo X-720, qui apporte sa propre extension du BASIC sur 4 ko de ROM, 6 ko de mémoire pour l'écran et réserve un espace de 2 ko de mémoire avec 4 banques possibles pour ses propres besoins d'extension (sous la forme de module externe qui n'a jamais été commercialisé).

    Enfin, le reste des particularités du X-07 en termes de conception provient des dispositifs qui permettent de reconnaitre une ROM 8 ko dans le compartiment d'extension qui reçoit généralement la RAM 8 ko XR-100, de reconnaitre une ROM située sur une carte XP ou la RAM sur une carte XM située dans le connecteur de carte amovible et plus généralement, de prendre le contrôle du X-07 à l'allumage avec une ROM située dans un emplacement d'extension ou accessible via le us d'extension (comme la ROM du X-720).

    Espace d'adressage 64 ko[modifier | modifier le code]

    Comme la majorité des processeurs 8 bits, le processeur NSC800 gère les adresses mémoire sur 16 bits (deux registres 8-bits) et peut donc adresser directement 64 ko de mémoire, de l'adresse 0000 (hexadécimal) à FFFF. Certains ordinateurs ont exploité des processeurs 8-bits comme le Z-80 tout en permettant de dépasser cette limite, en utilisant un système de pagination (comme l'Amstrad CPC 464), mais quoi que l'on fasse, à un moment donné les instructions du processeur Z80 ne peuvent accéder qu'à 65536 adresses différentes soit 64 * 1 024 octets.

    Cet espace mémoire a été scindé en différentes zones par Canon (et Microsoft en ce qui concerne le BASIC) pour les besoins de la machine. Selon qu'une puce XR-100 ou ROM est placée ou non dans le logement d'extension mémoire, le rôle de quelques zones est légèrement différent car le X-07 regroupe les zones RAM pour constituer la plus large mémoire centrale possible.

    Espace d'adressage NSC800
    Zone Taille Type Contenu avec XR-100 Contenu avec ROM 8 ko (différences) Contenu sans puce 8 ko (différences)
    0000-1FFF 8 ko RAM RAM pré-équipée
    2000-3FFF 8 ko RAM RAM de la puce d'extension XR-100 RAM de la carte mémoire RAM de la carte mémoire
    4000-5FFF 8 ko RAM RAM de la carte mémoire XM-101 (XM-100 : 4 ko en 4000-4FFF) ROM ou EPROM du logement d'extension vide
    6000-7FFF 8 ko ROM Application de la carte application (XP-...)
    8000-97FF 6 ko RAM Mémoire vidéo du X-720
    9800-9FFF 2 ko ROM Zone ROM d'extension (4 banques X-720)
    A000-AFFF 4 ko ROM Logiciel interne du X-720 (instructions graphiques BASIC etc)
    B000-FFFF 20 ko ROM BASIC Microsoft

    Au tout début des 8 ko du début de la mémoire, le BASIC Microsoft réserve une zone de travail pour ses besoins. Ceci explique qu'il reste 6 748 octets disponibles à l'allumage sur les 8192. Les adresses 0000h à 0551h sont réservées pour le BASIC, soit 1 362 octets.

    Sur un processeur Z80 le tout début de la mémoire est réservé aux vecteurs d'interruptions pour les instructions RST (0000, 0008 etc jusque 0038) et les interruptions non masquables en 0066. Mais le NSC800 diffère du Z80 et ne possède que trois vecteurs d'interruption. Comme les instructions RST ne consomment qu'un octet pour effectuer la même chose que CALL qui en prendrait 3 et que les vecteurs du NSC800 sont à des endroits différents, Microsoft utilise abondamment ces vecteurs pour appeler des routines majeures de son BASIC, notamment RST8 que l'analyseur syntaxique utilise pour vérifier le prochain octet de la ligne de programme et déclencher une SN Error en cas de non conformité. Pour connaitre les détails on se reportera à l'ouvrage Microsoft BASIC Decoded[6] dont beaucoup de contenu peut être transposé au BASIC du X-07.

    Note : en n'utilisant ni extension XR-100 ni carte mémoire et en l'absence du X-720 on constate que l'on dispose d'un espace de 44 ko de 0000 à AFFF qui pourrait accueillir de la RAM. Au moins un fabricant a réalisé une extension qui porte la mémoire disponible à 40 ko via un boitier que l'on connecte sur le bus d'extension réservé au X-720.

    Espace mémoire du T6834[modifier | modifier le code]

    Le sous-processeur T6834 gère l'horloge, les touches programmables, le programme de démarrage START$, l'alarme, les caractères graphiques programmables. Toutes ces tâches sont commandées par l'utilisateur à travers des commandes et fonctions BASIC, mais en réalité celles-ci ne sont que des raccourcis pratiques pour accéder aux fonctions du T6834 et à sa mémoire interne qui stocke les données programmables susnommées.

    Le processeur principal communique avec le T6834 à travers une puce d'entrée/sortie à laquelle il parle sur les ports d'entrée sortie F0 à F7. Il se sert de ces ports pour envoyer des codes de commande et des paramètres ou pour recevoir des données : ceci sera détaillé plus loin. Ces ports servent également à commander le son et d'autres fonctionnalités indépendantes du T6834.

    Quoi qu'il fasse le processeur central ne peut pas accéder directement à la mémoire interne du T6834, mais il existe deux commandes pour lire ou écrire ce qu'il s'y trouve et le BASIC possède deux routines internes qui effectuent le travail.

    Les adresses mémoires utilisées pour écrire ou lire dans les 2 ko du T6834 sont exprimées de C000h à CFFFh (juste en dessous de D000) de façon non linéaire (certaines zones ne correspondent pas à de la RAM). La partie haute dans le tableau ci-dessous est la mémoire de l'écran LCD qui n'est pas comprise dans les 2 Ko accessibles au T6834 mais se trouve directement dans les deux puces de contrôle de l'écran.

    Espace d'adressage T6834
    Zone Taille (octets) Contenu
    C000-C0FF 256 Données système
    C100-C7FF - -
    C800-C9FF 512 12 touches programmables
    CA00-CBFF 512 64 caractères programmables
    CC00-CCFF 256 Tampon clavier (127 touches)
    CD00-CDFF - -
    CE00-CFFF 512 Programme de démarrage
    CD00-DFFF - -
    E000-E1FF 512 Écran LCD (120 x 32)

    Démarrage en C3C3[modifier | modifier le code]

    Le processeur Z-80 démarre à l'adresse 0000. Sur le Canon X-07 le NSC800 procède de la même manière, mais comme la mémoire située à cet emplacement est de la RAM, son contenu n'est pas prévisible.

    Pour cette raison, Canon s'est débrouillé pour qu'à l'allumage, le début de la mémoire RAM soit rempli avec la valeur C3 hexadécimal (195 décimal). C3 est l'opcode de l'instruction JP inconditionnelle : les premiers octets étant C3 C3 C3, le processeur les interprète comme une instruction JP C3C3 et poursuit l'exécution à l'adresse C3C3 qui pour sa part se trouve en ROM.

    Le code situé à cet emplacement, quant à lui, procède au nettoyage du début de la RAM en recopiant diverses images qu'il possède en ROM et met ainsi en place la zone RAM système du BASIC qui se situe de 0000 à 0551 (ou 0552 si la carte XP-140 est installée). Il écrase ainsi les C3 qui se trouvaient à ces emplacements.

    Ports E/S F0 à F7[modifier | modifier le code]

    $$TBD

    Bibliographie[modifier | modifier le code]

    Il n'existe pas beaucoup de documentation sur les rouages du Canon X-07 mais grâce à la similarité de son BASIC Microsoft avec celui du TRS-80 modèle 1, la majorité de la très large documentation existant sur ce dernier peut servir de base pour explorer le X-07 ou adapter des programmes. En particulier, l'ouvrage Microsoft BASIC Decoded and Other Mysteries[6] de James Lee Farvour qui détaille la structure et le code désassemblé du BASIC Microsoft Level II du TRS-80.

    Le reste est constitué de quelques livres le plus souvent édités entre 1983 et 1985 et de manuels provenant de Canon, ainsi que d'articles et bancs d'essais dans des revues périodiques. La revue Hebdogiciel a publié beaucoup de programmes réalisés par les lecteurs pour le Canon X-07. Certains livres ont été écrits par les fondateurs du fanzine Le Son du Canon, lui-même soutenu par la société éditrice de logiciels pour X-07 Logi'Stick. Quelques ouvrages proposent juste une collection de programmes BASIC relativement simples en BASIC, mais les autres ouvrages fouillent à l'intérieur du logiciel du Canon X-07 et procurent de précieux renseignements et des programmes sophistiqués.

    Manuels officiels (Canon)[modifier | modifier le code]

    Le Canon X-07 est livré avec divers documents :

    • un manuel d'apprentissage du BASIC de niveau très élémentaire
    • un manuel de référence[10] qui décrit en détail toutes les instructions et fonctions du BASIC
    • un aide mémoire sous forme de carte repliable[11]
    • un manuel utilisateur[4] qui décrit comment utiliser les nombreux dispositifs internes et externes du X-07. Il donne aussi quelques informations techniques qui correspondent à certaines des explications fournies dans l'ouvrage de James Lee Farvour[6].

    Guide technique de maintenance (Canon)[modifier | modifier le code]

    Canon a édité pour ses besoins en interne un manuel de maintenance[12] avec liste des pièces, procédures de démontage et de test du Canon et ses périphériques.

    On peut consulter les schémas électroniques de l'ordinateur[13],[14],[15], bien que la résolution ne soit pas très bonne ce sont des documents d'une grande valeur technique.

    Il existe un document interne de Canon sur le sous-processeur T6834[16] qui décrit sa communication avec le NSC800.

    Carte XP-140[modifier | modifier le code]

    La carte d'application XP-140 Monitor est accompagnée de deux livrets :

    • le guide utilisateur décrit l'utilisation des commandes du moniteur et du dés-assembleur Z80
    • le guide technique[17] contient des informations très complètes sur la structure et le fonctionnement interne du Canon X-07 et de ses sous-systèmes, par exemple les commandes interne du sous-processeur qui contrôle le son, l'horloge, l'affichage et divers dispositifs ou encore la gestion des différentes zones de l'espace mémoire du Z80.

    Interface vidéo X-720[modifier | modifier le code]

    On peut consulter le manuel utilisateur[18] livré avec l'interface vidéo X-720.

    Convertisseur RS-232C X-722[modifier | modifier le code]

    On peut consulter le manuel[19] livré avec le convertisseur X-722.

    Ouvrages[modifier | modifier le code]

    Ce tableau liste les ouvrages connus de deux genres : d'un côté des recueils de programmes en BASIC, de l'autre des outrages très techniques dont les auteurs exploraient les profondeurs du système, du BASIC ou des processeurs.

    Éditeur Titre Type Description
    Éditions Neptune Les mystères du Canon X-07[9] Livre technique Cet ouvrage de haut niveau aborde la programmation du processeur NSC800 et l'architecture interne du X-07 et du BASIC, les routines systèmes utiles et les zones mémoire, et propose plusieurs programmes utilitaires en assembleur. C'est probablement l'ouvrage le plus riche en informations au-delà des manuels techniques provenant de Canon.
    Éditions Neptune Applications en assembleur dans l'univers du Canon X-07[20] Livre technique Suite du premier volume, il fournit de nombreuses explications sur le fonctionnement interne du BASIC et plusieurs programmes rédigés en assembleur Z80.
    ETSF 40 programmes pour Canon X-07[21] Recueil de programmes Les éditions ETSF partenaires de la revue Micro-Systèmes ont publié un recueil de programmes assez simples en BASIC sous la plume du fondateur de la société Logi'Stick, Gilles Probst.
    Soracom Informatique Plus loin avec le Canon X-07[22] Livre technique La société Soracom Informatique a édité un ouvrage confidentiel (aucune publicité à l'époque) qui présente un grand intérêt tant sur le plan technique avec des explications et des schémas pour interfacer le Canon X-07 avec des périphériques non prévus pour lui, que sur le plan logiciel avec de nombreux programmes de très bon niveau exploitant parfaitement l'imprimante traceuse X-719 et l'écran.
    Eyrolles Faites vos jeux avec Canon X07[23] Recueil de programmes Les éditions Eyrolles ont publié ce recueil de programmes. La présentation est sérieuse en dehors d'illustrations au graphisme et à l'humour un peu rudimentaires, mais les programmes ne sont ni originaux ni sophistiqués. Cet ouvrage est surtout destiné aux débutants en BASIC.

    Presse et fanzines[modifier | modifier le code]

    • Sans être exactement de la presse, le fanzine Le Son du Canon publié par le club C7 est une mine d'or qui malgré sa courte durée de vie (8 numéros) reste 40 ans plus tard une source d'informations incontournable. Ces documents sont disponibles sur le site Abandonware Magazines.
    • Un autre club d'utilisateurs Club Canon X-07 a publié une douzaine de bulletins. Ces documents sont disponibles sur le site Abandonware Magazines.
    • Le sous-site Abandonware Magazines du magazine Hebdogiciel[1] donne libre accès, dans les limites d'un usage exclusivement privé, à tous les numéros de cet hebdomadaire dans lesquels on trouve de nombreux programmes pour le Canon X-07.
    • Le magazine L'ordinateur de poche a publié un banc d'essai de Xavier de La Tullaye, « Le Canon X-07 », L'Ordinateur de poche, no 19,‎ , p. 24-27 (lire en ligne, consulté le ). Cet auteur est à l'époque l'un des grands spécialistes des bancs d'essai de machines, tant dans l'Ordinateur Individuel que dans L'Ordinateur de poche.
    • Le magazine Votre Ordinateur a publié en 1983 un petit banc d'essai du Canon X-07[24] de Olivier Arbey. Cet auteur participe à des tournois de programmes Othello sur HP-41C en 1981 et est ensuite auteur dans plusieurs magazines.

    Liens externes[modifier | modifier le code]

    Notes et références[modifier | modifier le code]

    1. a et b « Site Abandonware du magazine Hebdogiciel », sur Hebdogiciel, Hebdogiciel (consulté le )
    2. « Site du Canon x-07 de ledudu », sur canonx07.ledudu.com (consulté le )
    3. a b et c Le F en suffixe indique qu'elle est en version française. Les cartes en anglais n'ont pas de suffixe.
    4. a b c et d (en) User's Guide, Canon Inc., , 150 p. (ISBN PUB.IE03-147C (édité erroné), lire en ligne)
    5. (en) Marcus von Cube, BASIC Comparison Sheet (lire en ligne)
    6. a b c d et e (en) James Lee Farvour, Microsoft BASIC decoded & other mysteries, IJG Computer Services, coll. « TRS-80 information series », (ISBN 978-0-936200-01-9, lire en ligne)
    7. (fr-fr) Découvrons et programmons : Canon X-07 (Partie 1) Consulté le .
    8. (en) Ira Goldklang, « TRS-80 Tips and Tricks – String Packing and USR() Routines », sur TRS-80 Revived Site (consulté le )
    9. a et b André Tonic, Edward Arevian et Philippe Millet, Les mystères du Canon X-07, Club C7, , 164 p. (lire en ligne)
    10. Manuel de référence BASIC, Canon Inc., , 186 p. (lire en ligne)
    11. (en) BASIC Reference Card, Canon Inc., (lire en ligne)
    12. (en) Technical Guide / Parts Catalog, Canon Inc., , 112 p. (ISBN EY8-0310-211 (édité erroné), lire en ligne)
    13. CPU Board (lire en ligne)
    14. Memory board 2 (lire en ligne)
    15. LCD board (lire en ligne)
    16. (en) SUB CPU T6834, Canon Inc., (lire en ligne)
    17. (en + fr) Guide Technique, Canon Inc., , 96 p. (ISBN PUB.IF03-097 (édité erroné), lire en ligne)
    18. Canon X-720 Manuel d'utilisation, Canon Inc., , 52 p. (lire en ligne)
    19. (en) Canon X-722 Instructions, Canon Inc., , 11 p. (lire en ligne)
    20. Applications en assembleur dans l'univers du Canon X-07, Editions Neptune, , 166 p. (lire en ligne)
    21. Gilles Probst, 40 Programmes pour Canon X-07, ETSF, , 128 p. (ISBN 2-85535-103-0, lire en ligne)
    22. Michel Gantier, Plus loin avec le Canon X-07, Soracom Informatique, , 122 p. (ISBN 2-904032-31-2, lire en ligne)
    23. Philippe Ifrah, Faites vos jeux avec Canon X07, Eyrolles, , 110 p. (lire en ligne)
    24. Olivier Arbey, Canon X-07 : Un beau coup de canon, Votre Ordinateur, , 2 p. (lire en ligne)