Architecture et programmation de la calculatrice HP-41

"... Souvent, vous devez exécuter une instruction synthétique de deux octets à partir du clavier. Cela peut se produire lors de votre utilisation quotidienne du HP-41 ..."

/ HP-41 Advanced Programming Tips /






Comme beaucoup le savent, à la fin des années 1980, les microcalculateurs programmables compatibles avec le B3-34 étaient très populaires en URSS: MK-54, MK-61, MK-52 . Pour eux, ils ont créé des programmes, des jeux, exploré des fonctionnalités non documentées, écrit des articles. J'ai moi-même vécu cela en temps voulu. Et tout récemment, j'ai pensé: mais aux États-Unis aussi, il aurait dû y avoir quelque chose de similaire, proche de tout ce qui s'est passé autour de nos calculatrices programmables. Et oui - j'avais raison. Découvrez le HP-41.



Comme le B3-34, le HP-41 est un calculateur RPN programmable (RPN - notation polonaise inversée, calculs sous la forme «2 2 +», pas «2 + 2 =») avec une idéologie similaire, mais beaucoup plus fonctionnelle. Il est apparu presque en même temps que notre B3-34 - 1979 et est rapidement devenu une année culte: de nombreux programmes ont été écrits pour lui, des livres - y compris sur des fonctionnalités non documentées, et même des modules complémentaires sont toujours en cours de publication. Au total, 1,5 million de ces calculatrices ont été produites.



À un destin similaire, nous pouvons ajouter que, tout comme notre MK-52 a volé sur le Soyouz en tant que périphérique informatique de sauvegarde, le HP-41 a volé sur la navette.



Bien qu'il existe trois modifications du HP-41 (C, CV, CX), elles peuvent être considérées comme entièrement compatibles, car elles diffèrent très légèrement - en fait, uniquement par la quantité de mémoire. Les calculatrices HP avec d'autres nombres ne sont pas compatibles avec le HP-41, bien qu'elles aient certaines caractéristiques communes.



L'une des caractéristiques du HP-41 est un indicateur à 14 segments, ce qui est assez rare pour les calculatrices. Cela vous permet d'afficher des lettres et divers symboles sur le HP-41, ce qui, avec les modules de son et d'extension, est un grand avantage par rapport au B3-34.



La mémoire du HP-41C du point de vue de l'utilisateur est de 63 registres de 7 octets chacun. Dans ce cas, vous pouvez choisir combien est utilisé pour le programme et combien pour les données. Les modules d'extension augmentent la quantité de mémoire disponible - disons 82106A - soit 64 registres supplémentaires. Au maximum, avec l'aide de tels modules, vous pouvez obtenir environ 2 Ko si vous occupez les quatre emplacements.



Le processeur est le sien, spécifique. Il est plus communément appelé CPU NUT, bien qu'il s'agisse d'un nom générique pour plusieurs processeurs différents. Fréquence d'horloge 0,35 MHz. Quant à la profondeur de bits, comme c'est souvent le cas avec les calculatrices, en raison des spécificités de l'architecture, il est difficile de nommer le chiffre exact.



En plus des modules de mémoire (pour HP-41C), il existe de nombreux autres modules d'extension - bibliothèques de programmes sur ROM, un graveur / lecteur de carte magnétique, un lecteur de code-barres, etc.



Outre le mode de commande traditionnel pour toutes les calculatrices, lorsque les calculs sont effectués directement trois façons de programmer le HP-41.



Le premier et principal est le langage standard de la calculatrice programmable. Idéologiquement, il est similaire au langage B3-34 et, bien qu'il s'appelle FOCAL, il n'a rien à voir avec le langage de programmation du même nom - le mot signifie "Forty One Calculator Language". Les commandes FOCAL sont, en fait, des appels à des sous-programmes dans des codes machine - quelque chose comme des instructions dans une machine virtuelle, affinées pour les calculs, le système décimal et la virgule flottante.



La deuxième méthode, très populaire, est appelée programmation synthétique et est un ensemble d'extensions FOCAL non documentées basées sur l'exploitation d'une vulnérabilité dans le firmware de la calculatrice qui permet de créer de nouvelles commandes.



Le troisième moyen, rare, consiste à programmer directement dans les codes machine du microprocesseur de la calculatrice, appelé MCODE. Cette méthode est assez compliquée pour les raisons qui seront discutées ci-dessous.



Dans cet article, je parlerai principalement de la première méthode, les deux autres que je n'évoquerai que brièvement.



Clavier et mode de commande



Malgré l'indicateur alphanumérique avancé, le clavier de la calculatrice est le plus courant. Cela, avec un grand nombre de modes et de fonctions différents, rend la saisie du programme et les opérations avec lui une tâche très fastidieuse (tout à fait comparable à celle des calculatrices compatibles B3-34).



Chaque touche a trois fonctions (dans certains cas plus). Par exemple, le bouton "0", en plus du chiffre 0, est destiné à saisir un espace et le nombre Pi.

Toutes les fonctions ne sont pas disponibles via des combinaisons de boutons - certaines doivent être saisies en lettres, en mode "ALPHA". Les lettres sont étiquetées en bas des boutons dans l'ordre "ABCDEF ...".





Je dois dire que le clavier est de très haute qualité. Une technique typique pour le matériel HP a été utilisée - le bouton a un axe en bas et, lorsqu'il est enfoncé, tourne autour de lui. L'indicateur, malgré le manque de rétroéclairage, est également assez lisible. Seul le rafraîchissement lent de l'image est fatigant (ce qui est probablement dû à un processeur lent).



Il est intéressant de noter que les opérateurs disponibles via une combinaison de boutons peuvent être saisis lettre par lettre. Par exemple, le bip ("BEEP") est obtenu en appuyant sur SHIFT 4, mais vous pouvez appuyer sur le bouton XEQ, puis ALPHA, épeler le mot "BEEP", appuyer à nouveau sur ALPHA.



En fait, XEQ (du mot «exécuter») vous permet d'exécuter immédiatement n'importe quelle fonction intégrée ou d'appeler une fonction existante dans la RAM ou la ROM - y compris dans un module d'extension.



Une liste de toutes les fonctions actuellement disponibles dans la calculatrice peut être obtenue via SHIFT CATALOG 3 (contrôle de la vue via R / S, SST, BST)



S'enregistre et travaille avec eux



Ci-dessous, nous parlons des registres directement accessibles à l'utilisateur de la calculatrice. Ce ne sont pas des registres de microprocesseur!



Registre ALPHA (A) - peut stocker jusqu'à 24 caractères et son contenu est affiché à l'écran.

0,1,2,3, ... - registres de données, peuvent stocker un nombre ou jusqu'à 6 caractères (ou jusqu'à 7 étapes de programme)

X, Y, Z, T - registres de pile (en fait, aussi des registres de données, mais organisés en vue pile). X - haut.

L - le dernier, avant le changement, le contenu du registre X est stocké

PC - le pas de programme en cours



L'affichage montre généralement le contenu du registre X ou ALPHA, mais d'autres peuvent être affichés.



Si vous tapez simplement un nombre sur le clavier, il tombe dans le registre X (en conséquence, il est affiché à l'écran).

Si vous tapez une chaîne de caractères sur le clavier (après avoir appuyé sur le bouton ALPHA), la chaîne est placée dans le registre ALPHA (de même, elle est affichée à l'écran).



Cependant, la présence même de toute information sur l'écran ne signifie pas qu'elle se trouve dans le registre. Cela s'applique, par exemple, aux messages d'erreur et aux résultats VIEW. Ils ferment en quelque sorte le registre affiché en haut. Dans de tels cas, pour effacer le message sans changer le contenu des registres, utilisez la touche "<-".

Dans le cas où le contenu du registre est affiché à l'écran, la même touche "<-" supprime son contenu.



Appuyez sur ENTRÉE pour pousser une copie du numéro sur la pile. Autrement dit, si vous tapez 1 ENTER, alors 1 apparaîtra à la fois dans le registre X et dans le registre Y. Si vous tapez ensuite 2, alors le registre X sera 2, le registre Y sera 1.



CLX efface X, CLA efface ALPHA



X <> Y échange le contenu de X et Y

+, -, *, / effectue une opération sur le contenu de X et Y et place le résultat dans X, tandis que ce qui était dans le registre Y est perdu et ce qui était dans X est placé dans le registre L (peut être recopié sur X avec la commande LASTX si nécessaire).



RCL register_number - copie le contenu du registre de données avec le nombre spécifié vers X (c'est-à-dire le mappe)

ARCL register_number - ajoute le contenu du registre de données avec le numéro spécifié au registre ALPHA



ASHF décale le contenu du registre ALPHA vers la gauche de 6 caractères (les 6 premiers caractères sont perdus).



Vous pouvez visualiser le contenu du registre sans le placer dans le X affiché. Pour ce faire, utilisez la commande VIEW (pour visualiser les registres de pile) et AVIEW (pour visualiser le registre ALPHA).



Il faut noter qu'il n'y a pas d'autres opérations avec des chaînes dans le système de commande. Et ce n'est pas un hasard - le fait est qu'il y a si peu de mémoire que travailler avec des chaînes, même avec un module d'extension de mémoire, n'a pas beaucoup de sens. Cependant, il existe des modules d'extension où des opérations de chaîne sont implémentées.



STO register_number - copie le contenu du registre X dans le registre de données spécifié

ASTO register_num - copie le contenu du registre ALPHA (seulement les 6 premiers caractères!) Dans le registre de données spécifié



Pour que RCL et STO fonctionnent avec des registres de pile nommés, ajoutez ".": STO .Z



La commande SIZE définit le nombre de registres de données qui peuvent être utilisés (respectivement, le nombre d'étapes de programme disponibles augmente ou diminue):

Plus la TAILLE est petite, plus il y a d'espace pour le code.



Pour effacer toute la mémoire, vous devez allumer la calculatrice en maintenant enfoncée la touche "<-" et après l'avoir allumée, relâchez-la immédiatement. Le message "MEMORYLOST" devrait apparaître (pas très stable).



Mode programme



Passage au mode de programmation (et retour) - en appuyant sur la touche PRGM. S'il n'y a pas de programme, "00 REG nn" s'affiche. Le nombre nn indique le nombre de registres disponibles pour les étapes du programme (voir ci-dessus à propos de SIZE). Au fur et à mesure que vous tapez le programme, la calculatrice écrit parfois PACKING pour essayer de compacter le code. S'il n'y a pas assez de mémoire pour la commande suivante, écrivez TRY AGAIN.



Lors de la saisie d'un programme, l'étape en cours est affichée à gauche. Une étape - une commande (peu importe, entrée par une touche ou lettre par lettre). Mais il faut garder à l'esprit qu'une étape peut occuper une quantité de mémoire différente - peu s'il s'agit d'une simple commande comme CLA, et beaucoup s'il s'agit, par exemple, d'une longue chaîne de texte.

Déplacement par étapes - SST (avant) et BST (arrière). Suppression de l'étape actuelle - "<-".



Le programme est lancé à partir du mode commande (c'est-à-dire que PRGM doit être à nouveau enfoncé) avec la touche R / S. Elle s'arrête également.



En mode programme, presque toutes les fonctions disponibles en mode commande sont disponibles. La saisie des commandes marquées sur les touches se fait simplement en appuyant sur. Le reste des commandes est entré via XEQ. Par exemple, pour entrer TONE 3, appuyez sur XEQ, puis appuyez sur ALPHA, puis tapez TONE lettre par lettre, appuyez à nouveau sur ALPHA puis appuyez sur 3.



Effacement du programme: étiquette CLP (effacée de l'étiquette jusqu'à END)



Passez à une étape spécifique: GTO.002 (vous devez d'abord quitter le programme mode).

Aller au début: SHIFT RTN



Vous pouvez trouver la position actuelle à partir du mode de commande en appuyant et en maintenant la touche R / S ou SST



Les étiquettes, auxquelles il est possible de sauter par la suite, sont définies via «l'étiquette LBL» et sont de deux types - globales (noms de texte, saisis en mode ALPHA) et locales (noms de texte numériques ou à une seule lettre). Les chiffres prennent moins de mémoire.

Aller à l'étiquette «étiquette GTP»



Il est utile de toujours mettre une étiquette dans la première étape du programme. Cela vous permet de l'exécuter sans aller au début à chaque fois - via une étiquette XEQ ou une étiquette GTO.



Il y a aussi une transition indirecte vers GTO IND (les fans du HP-41 citent cela comme une preuve que la machine de Turing est complète;).



A la fin du programme, GTO… est entré (le message PACKING apparaît). À ce stade, END apparaît à l'écran



Par exemple, un programme pour multiplier un nombre par 2 ressemble à ceci:



LBL "PRGNAME"
2
*
END

      
      





Travailler avec des sous-programmes (jusqu'à six imbrications sont autorisées):



XEQ 04
...
LBL 04
......
RTN

      
      





Branches conditionnelles:



X=Y?
2
1

      
      





Dans cet exemple, si X est égal à Y, alors 2 est poussé sur la pile (registre X) Sinon 1

En d'autres termes, si la condition n'est pas remplie, alors la commande suivant le contrôle est ignorée.



Boucles



ISG - Incrémenter et sauter si plus grand

DSE - Décrémenter et sauter si égal ou inférieur à



Exemple



1.00301
STO 01
LBL 01     
BEEP
ISG 01     
GTO 01     

      
      





Cet extrait peut être utilisé dans une interview à la place des couvercles de regard. Avec la question "Combien de fois BEEP fonctionnera-t-il et pourquoi?" La bonne réponse est 3 fois.



Explication: Les paramètres de boucle sont spécifiés avec un seul nombre fractionnaire qui est poussé sur la pile. Le nombre a le format iiiii.fffcc, où:



iiii - l'initiale, c'est le courant, la valeur du compteur (index),

fff - la valeur finale

cc - le pas



Ainsi, 1.00301 signifie le compte de 1 à 3 avec un pas de 1

Evidemment, une telle solution particulière vous permet d'économiser mémoire, bien que la lisibilité du code, disons, souffre légèrement.



Un peu sur l'affichage des chaînes:



AVIEW affiche le registre ALPHA, VIEW affiche le registre X.



La commande APPEND ajoute les caractères spécifiés à une chaîne dans le registre ALPHA. Il est entré à partir du clavier comme SHIFT K, dans la source il ressemble à> "TEXT"



Exemple:



"HELLO WORLD!"	;   ALPHA 
AVIEW ;   
PSE ;  
CLD ;  

      
      





Lorsque l'écran est effacé, le symbole standard «oie volante» revient pour indiquer que le programme est en cours d'exécution. S'il y a du texte à l'écran, l'oie n'apparaît pas.



Bien que l'écran ait 12 espaces de caractères, la longueur de ligne maximale dans une étape de programme est de 15. En utilisant APPEND, vous pouvez obtenir 24 (c'est-à-dire, la longueur totale du registre ALPHA). Lorsqu'une longue ligne est affichée à l'écran, elle défile automatiquement:



"1234567890"
>"ABCDEFGHIJKLMN"
AVIEW

      
      





Les opérations avec des chaînes sont limitées à trois commandes:

ASTO X - met les 6 premiers caractères de ALPHA dans le registre spécifié

ARCL X - ajoute à la fin de ALPHA une chaîne du registre spécifié

ASHF - décale ALPHA de 6 caractères vers la gauche (ils sont perdus)



Entrée de données:



PROMPT - affiche le contenu du registre ALPHA et arrête le programme (respectivement, vous pouvez entrer quelque chose et appuyer sur R / S, poursuivant ainsi l'exécution)

PSE - met en pause l'exécution du programme pendant environ une seconde. Dans ce cas, si des chiffres ou des lettres ont été enfoncés, la pause est prolongée d'une seconde supplémentaire et la valeur totale est placée dans un registre pour un traitement ultérieur.



À propos du son:



BEEP - joue une séquence standard du même

numéro de tonalité à quatre notes - un court grincement de l'une des 10 fréquences (0 - le plus bas ... 9 - le plus élevé). Les fréquences sont choisies de manière assez étrange. Apparemment, cela était dû à des économies de mémoire.



Une explication
«The biggest problem is the fact that the high or low time of the signal driving the piezo element has to be a multiple of the instruction cycle time. This cycle time is nominally 155.6uS. So, for example TONE 9 has a three-instruction low and high time, giving a frequency of 1071Hz. TONE 8 has a four-instruction low and high time, giving a frequency of 803Hz. TONE 7 has a five-instruction low and high time, giving a frequency of 643Hz. These tones are individually coded. The remainder of the tones use a common routine to save code space. This common routine is 6+n instruction time long (for each phase of the piezo drive). And n is set by the TONE number as follows: TONE 6 has n=2, TONE 5 has n=4, and so on, down to TONE 0 with n=14. So, you could get better control at the low end of the frequency range, but it would take more code space. I guess that what they came up with was a reasonable compromise.»





Périphérie



Les périphériques comprennent des modules d'extension de mémoire, une ROM avec des programmes prêts à l'emploi, un lecteur / graveur de bande magnétique (HP 82161A), des cartes magnétiques (HP82104A), un lecteur de code-barres, un port infrarouge, une imprimante, un traceur, une horloge, une interface HP-IL (via qui peut connecter la calculatrice à divers équipements) et plus encore.



J'ai un lecteur / graveur de carte magnétique complet avec HP-41. Les cartes sont des bandes de bande magnétique sur une base de papier (le métro de Moscou avait autrefois un type de carte de voyage similaire).





Chaque bande a deux pistes - c.-à-d. il peut être inséré avec le côté gauche ou droit. 112 octets tiennent de chaque côté. Un programme typique s'étend sur plusieurs cartes.

Vous pouvez protéger le côté de la carte contre l'écriture en coupant le coin.

Lorsqu'un module est inséré dans la calculatrice, sa ROM est utilisée. En conséquence, de nombreuses nouvelles commandes permettant de travailler avec des cartes apparaissent dans la calculatrice. Vous pouvez lire et écrire des programmes, des registres, etc. Vous pouvez même protéger le programme en cours d'enregistrement contre la visualisation (c'est-à-dire que vous pouvez le télécharger et l'exécuter, mais vous ne pouvez pas voir le programme lui-même).



Ici, vous pouvez voir comment fonctionne le lecteur de carte magnétique.



Malheureusement, cet appareil n'est pas fiable et très gourmand en batterie (alimenté par la calculatrice elle-même). Le mien n'a pas fonctionné - il a bourdonné avec un moteur, mais n'a pas étiré la bande. Il s'est avéré que le rouleau de pression à l'intérieur ne s'est pas simplement effondré, mais a complètement disparu, ne laissant qu'une goutte de saleté visqueuse. J'ai changé le rouleau pour un rouleau fait maison, mais il étire évidemment le ruban avec difficulté - vous devez ajuster le diamètre avec précision. Le problème est si courant qu'ebay vend même des kits de ces vidéos.



Un autre appareil intéressant. Un lecteur de codes-barres, qui est utilisé, entre autres, pour charger des programmes dans la calculatrice directement à partir de livres, est également assez courant chez les propriétaires de HP-41. Imaginez - pas longtemps à conduire dans les programmes à partir du clavier! .. Cela ressemble à ceci:







Développement



Bien sûr, vous pouvez écrire en FOCAL directement sur la calculatrice. Mais c'est assez fastidieux - il est beaucoup plus pratique d'écrire le programme dans un fichier texte. Mais la situation avec les compilateurs et les émulateurs est compliquée. Tous sont assez étranges et pas très stables. Parmi ceux qui fonctionnent sous Win10, il y a sim41 et v41 (v.7b). Le premier est lancé uniquement à partir de Visual Runfox, mais il dispose d'un éditeur de programme séparé (c'est-à-dire qu'il n'est pas nécessaire de le saisir et de le modifier à partir du clavier de la calculatrice).

Le second est lancé sans préludes, il émule beaucoup mieux la calculatrice (mais pas au niveau matériel, ce qui est indiqué, par exemple, par la désynchronisation du son avec le code), mais le programme doit être saisi soit complètement manuellement, soit chargé sous forme de binaire .raw, qui n'est pas du code machine , et la représentation binaire FOCAL). Le problème est que pour compiler une source de texte en raw, vous devrez utiliser l'utilitaire HP41UC.EXE, qui ne peut être exécuté que sous DOS. J'ai utilisé des vDos avec un fichier batch, après avoir mappé le répertoire requis sur le disque via use f: c: \ tmp



Compilation de la source dans un binaire:

hp41uc /t=test.txt /r=test.raw Décompilation



du binaire dans une source:

hp41uc /r=text.raw / t = text.txt



Pour avoir une meilleure idée de la plate-forme, j'ai écrit une petite intro de 256 octets pour la soirée de démonstration DiHALT.





C'est 256 octets, simplement parce que la calculatrice ne rentrerait pas plus, même avec un module d'extension de RAM installé. Il est clair qu'il ne faut pas s'attendre à des effets visuels spéciaux de la part de la calculatrice. La sortie de différentes lignes est utilisée, y compris le défilement automatique des longues lignes. Animation avec un visage - affiche deux lignes en boucle. Le DTMF est simulé de manière très conditionnelle, la musique est également complètement différente de l'original - en raison du fait qu'il ne sera pas possible de choisir la clé ou la durée souhaitée. Néanmoins, cela ressemble toujours à de la musique. À la fin, une fonction de calculatrice standard est utilisée - pour afficher une "oie volante" lorsque le processeur est occupé et que le registre ALPHA est vide.



Au départ, l'intro était deux fois plus longue, même en utilisant des sous-programmes. Mais lorsque tout a été débogué dans l'émulateur et que j'ai commencé à insérer ce cas dans la calculatrice, il s'est avéré qu'il ne rentre pas là (j'espérais que l'émulateur rapporterait un manque de mémoire, mais non). J'ai dû raccourcir et réécrire.



Ici vous pouvez voir les deux sources.



Programmation synthétique



La programmation synthétique est une technique basée sur l'exploitation d'une vulnérabilité trouvée dans l'éditeur de programme de la calculatrice. Les instructions standard régulières sont encodées dans la mémoire de la calculatrice en plusieurs octets. La vulnérabilité permet (après une procédure préparatoire assez compliquée) de changer ces octets, en recevant de nouvelles instructions avec diverses fonctionnalités. Par exemple, vous pouvez obtenir plus de sons de la commande TONE que ce qui est autorisé par défaut. Vous pouvez afficher plus de caractères (à partir d'un ensemble dans la ROM), accéder aux indicateurs système et à un certain nombre d'autres choses utiles. Là encore, il est difficile et fastidieux d'utiliser cette technique dans la pratique. Certes, il existe des modules avec des sous-programmes qui facilitent cela.





Des situations peuvent survenir lorsque, à la suite d'actions synthétiques incorrectes ou inexactes, la calculatrice se fige (par exemple, ne répond pas aux touches) jusqu'à ce qu'il soit nécessaire de retirer et d'insérer les piles. Ça m'est arrivé. Il est intéressant de noter que dans la littérature, il y a des avertissements selon lesquels, dans certains cas, pour que la calculatrice se rallume, les piles doivent être retirées pendant deux jours (!).



Un autre problème avec les instructions synthétiques est qu'elles sont parfois composées de caractères non ASCII. Là, des difficultés spécifiques surviennent à la fois avec leur entrée et avec l'impression d'un tel programme sur une imprimante HP-41 standard. Oui, même la simple publication d'un tel programme dans un livre ou un magazine est tout un problème (généralement, à côté des commandes, ils écrivent des explications sur la façon dont ils doivent être compris). L'une des solutions au problème consiste à lire chaque caractère à l'aide d'un lecteur de code-barres à partir d'une table spéciale:







En fait, la programmation synthétique est très proche dans l'esprit de «l'égogologie» des calculatrices compatibles B3-34. A titre d'illustration, vous pouvez voir cette lettre .



Les gens ont même écrit de la poésie sur ce sujet! (tiré de la programmation synthétique pour le HP41C (WCWickes)



KEYBOARDLOCKY
KEYBOARDLOCKY



'Twas octal, and the synthetic codes

were scanned without a loss.

In and out of PRGM mode,

Byte-jumpers nybbled the CMOS.



«Beware 0 STO c, my son,

The MEMORY LOST, the keyboard lock.

Beware the NNN, and shun

The curious phase 1 clock.»



He took his black box codes in hand,

Long time the backwards goose he sought;

The secret beast from Aitchpee land--

All searches came to nought.



In demented thought he stood, and then:

The goose, with LCD's alight,

A leap for every LBL 10,

Came honking left-to-right!



STO b! STO d!, and RCL P!

His keyboard went clickety-clack.

With the proper code in number mode

The goose came flapping back.



«And hast thou found the phantom fowl?

Come to my arms, my binary boy.

Let Corvallis hear us howl

As we chortle in our joy!»



'Twas octal, and the synthetic codes

Were scanned without a loss.

In and out of PRGM mode,

Byte-jumpers nybbled the CMOS.



--Apologies to Lewis Carroll





MCODE



Le code machine exécuté directement par le microprocesseur dans les calculatrices HP-41 appelé MCODE est 5 à 120 fois plus rapide que le FOCAL standard.



Pour fonctionner sur la calculatrice, le programme dans MCODE doit être écrit sur la ROM (ou sur un émulateur de ROM). Il existe des modules spéciaux qui vous permettent de charger du code via USB ou RS232 et même d'écrire dans M-CODE directement sur la calculatrice. Ils sont collectivement appelés MLDL et sont à la fois anciens, de HP lui-même, et modernes .

De cross-assemblers, je n'ai trouvé que l'ancien - pour DOS.



Quelques mots sur l'architecture du processeur. Puisqu'il est principalement axé sur les mathématiques, il y a des spécificités. Les registres principaux (et les registres du processeur ne sont pas les registres utilisés dans FOCAL!) A, B, C, N, M sont de 56 bits.

Il existe également des registres plus courts pour les drapeaux, le clavier, le haut-parleur, les pointeurs, un compteur d'instructions 16 bits et une pile de retour à quatre niveaux (quatre registres 16 bits).



Dans la ROM, qui est reliée au processeur par un bus série et où se trouve le programme de contrôle de la calculatrice écrit en MCODE, les octets ont une largeur de 10 bits. Le processeur adresse 64 Ko de ROM, dont 12 Ko sont occupés par le système d'exploitation. Quant à la RAM, elle n'est pas mappée dans l'espace d'adressage et est un périphérique pour le processeur. Les octets de RAM ont une largeur de 8 bits, mais le processeur traite logiquement la RAM comme des registres de 56 bits.



Comme je n'ai pas écrit en MCODE (étranglé par un crapaud pour 250 $ pour un émulateur de ROM), je ne peux pas partager mon expérience personnelle de la programmation en MCODE.



Les instructions y sont assez traditionnelles, bien que la plupart des mnémoniques soient assez spécifiques. Par exemple:



B=A	;    A  B
A<>C	;   A  C
A=A+B 	;  A  B     A
A=B=C=0	;  0   A,B,C
C=0 M	;  0   ( 3-12)  C
?A<C	;   ,  A  C
JC -02	;   ,    
READ n	;     ( 1  15)   C
PUSH addr	;     
GOSUB 815B ;   

      
      







Un analogue MCODE approximatif de la commande FOCAL TONE n:



178 C=REG 5/M	; recalls status register M
358 ST=C	; rightmost byte (nybbles 1 and 0 ) are loaded in status bits (flags 0 to 7)
379 *
05A NCGO 16DE ;     XTONE  

      
      





Quant au contrôle de l'indicateur, son contrôleur ne permet pas d'activer et de désactiver des segments arbitraires - vous ne pouvez afficher que les symboles existants dans le générateur de caractères. C'est également devenu la raison pour laquelle je ne me suis pas préoccupé de l'émulateur ROM et de la programmation en MCODE.



Pour afficher les symboles, vous devez sélectionner l'indicateur par l'instruction du processeur PRPH SLCT FD, puis travailler avec les registres d'indicateur via WRIT / READ



Épilogue



Pour être honnête, la logique et le système de commande de la calculatrice sont plutôt déroutants. À mon avis, pour une personne qui peut maîtriser cela, il n'y a pas de problème à écrire simplement dans les codes machine d'un processeur simple. Dans nos calculatrices compatibles B3-34, tout n'est bien sûr pas non plus facile, mais il y a aussi beaucoup moins de possibilités, c'est pourquoi il n'y avait pas de sentiment d'une telle confusion.

Fondamentalement, l'argument pour empiler un pseudo-code au-dessus d'un microprocesseur dans le HP-41 est la nécessité de calculs mathématiques, car après tout, cela devrait être facile pour l'utilisateur typique de la calculatrice.



Il en va de même pour le clavier - il serait possible de créer tout de suite un clavier alphanumérique ordinaire, sans suspendre les commandes aux boutons. Après tout, la fonctionnalité de saisie de commande lettre par lettre a déjà été implémentée (cependant, des calculatrices avec un clavier à part entière ont rapidement commencé à être produites).



J'ai rassemblé divers documents HP41 dans une archive, si quelqu'un est intéressé, vous pouvez le télécharger (je l'ai posté pendant un moment, puis je le supprimerai).



All Articles