La meine est pareille!!!

HP 48

Bienvenue à la HP49!!

 

 La voici enfin la derniere née des labos de chez HP!!

depuis le temps qu'on en parlait!!!

Tout vous sera devoilé sur la page HP49.

HP49

Telechargement

Liens

Go back??RETOUR

 Des questions?

E-mail me !!

 

 

 

 

La programmation en assembleur sur HP48

ATTENTION certaines parties ne sont que de vulgaires copies de la documentation de Julien Meyer. :(

Cette documentation ne comporte que des éléments nécessaire à une bonne approche de la programmation en assembleur

Pour pouvoir programmer en assembleur il faut tout d'abord:

 

bien connaitre la notation hexadecimale et binaire

 

 

bien connaitre l'architecture interne du calculateur

microprocesseur (pile, registres,pointeurs...)

péripheriques (écran, buzzer, port infrarouge, port serie...)

La mémoire (RAM, ROM, I/O...)

 

bien comprendre certain aspects de la programmation.


Introduction

La HP 48 est une association de systemes electroniques(memoire RAM, ROM, clavier, écran, port de sortie infrarouge...). Ces composants sont dirigés par une puce qui gère tout dans la HP c'est le microprocesseur. Dans notre cas il s'agit du saturn qui est un microprocesseur 4 bits (bien que l'on puisse le comparer parfois à un 64 bits) et qui "tourne" grace à une horloge à une vitesse de 4 Mhz (la HP effectue donc un cycle d'horloge en 0,25µs et une instruction de base necessite en moyenne 7 à 10 cycle d'horloge.)

Le saturn étant un composant electronique que je qualifierais de logique ne comprend que deux etats logique : le niveau 0 (pas d'elecricitée dans le fil) et le niveau 1 (il y a de l'electricité qui passe dans le fil).

Ce sont ces deux états que l'on retrouve dans la notation binaire.

 

I) La notation binaire et hexadecimale

La notation binaire est une facon de compter mais seulement avec deux chiffres: le 0 et le 1 (alors que nous comptons d'habitude avec 10 chiffres de 0 à9).

Le premier nombre est donc 0; le second 1; le troisième 10( qui se lit 1, 0); le quatrième 11(qui se lit "un un"):

on obtient donc:

notation  décimale/binaire

Le microprocesseur ne comprend que ça et les programmes de la HP ne sont en fait que des suites de 0 et de 1:

on a donc en memoire: 0110110001110111 et ce n'est pas tres comprehensible!!!

Pour comprendre ce que l'on ecrit on passe de la notation binaire à la notation hexadecimale.

Celle ci comporte non plus 2 ou 10 chiffres mais 16 (0 à9 puis A à F) on a donc la correspondance

notaion décimale/binaire/hexadécimale

Si on reprend l'exemple de tout à l'heure on obtient en hexadecimal #6C77h (le dièse est pour prevenir que l'on est pas en decimal et le h à la fin est pour hexadecimal). On comprend déjà un peu plus ce qu'on écrit.

Les programmeurs ne voulant pas apprendres par coeur des nombres hexadecimaux pour pouvoir programmer, on définis des mnémoniques qui sont des mots très explicites par exemple A=A+B A et qui est codé en hexa par #C0h . Je reviendrais sur ces mnémoniques plus tard car avant de commencer la programmation pure il faut bien comprendre comment est organisée la HP.

II) L'architecture du calculateur (HP48)

La HP48 est un système électronique qui regroupe plusieurs composants (la mémoire, le buzzer, le clavier...) qui sont disposé dirigés par le microprocesseur.

Le microprocesseur SATURN

la structure interne du Saturn

Le Saturn est constitué de plusieurs registres qui sont des mémoires vives dans le microprocesseur (ne pas confondre avec la RAM de la HP). On peut mettre des valeurs dans ces registres et suivant le registre qu'on utilise on peut faire différentes choses. Les registres principaux du Saturn sont les regitres appelés A, B, C et D . On les appele aussi registres de travail et ce sera toujours avec ces registres qu'il faudras jongler pour faire un programme en assembleur.

Les autres registres sont :

La RSTK: c'est la pile des retour; quand on fait un saut vers un sous-programme c'est dans cette pile qu'est placée l'adresse de retour au programme principal. Elle fait 8 fois 20 bits.

Les registres R4 à R1: Ce sont des registres de sauvegarde; on peut y mettre une valeur et la recupérer plus tard dans le programme. Il ont exactement la même taille que les regitres de calculs soit 64 bits.

PS: Un octet correspond à deux quartets et un quartet correspond à 4 bits.

Les registres IN et OUT: ce sont les registres qui vont nous permettre de gérer en assembleur le clavier et le buzzer.

Les pointeurs D0 et D1: ce sont les deux registres de 20 bits qui permettent d'avoir accès à la mémoire RAM de la HP.On met dans ces registres une adresse et le Saturn "pointe" a cette adresse dans la mémoire.

le pointeur PC: c'est le Program Counter; Il contient l'adresse de la prochaine instruction que le Saturn doit éxécuter. Il a une taille de 20 bits. Modifier ce qu'il contient correspond à continuer le programme à un autre endroit de la mémoire.

Les registres ST et HS: il peuvent parfois servir mais il est souvent déconseillé aux débutants de jouer avec (moi-même je n'y touche pas).

Le registre P ne sert qu'en association avec les registres de calculs.

Les registres de calculs:

 Ils sont la base même de la programmation en assembleur car l'assembleur se résume en fait des calculs arithmétiques et logiques à partir des registres de travail. Les échanges de données ne se font qu'à travers des adresses logiques placées dans les registres spécialisés du microprocesseur.

Les registres de calculs s'étendent sur 64 bits ou 16 quartets. Mais on n'utilise jamais les 16 quartets d'un registre en même temps d'ou l'idée de diviser ces quatres registres en champs:

 Les champs des registres de calculs.

Le champ W regroupe tout les quartets du registre; le champ S ne comprend que le 16eme quartet ect...

Par exemple on veut ajouter à une adresse un certain nombre(pour pouvoir pointer sur un object précis) on place dans le champ A du registre A l'adresse de départ(codée sur 5 quartets) et dans le champ A du registre B le nombre de quartets dont on veut avancer( sur 5 quartet max). On aditionne lechamp A du registre A et le champ A du registre B et on obtient le résultat.

Pour faire les tests de touches on n'a besoin que de trois quartets; on utilisera donc le champ X

Le registre P est particulier: il permet de définir nous-même la taille d'un champ. On l'appelle aussi le pointeur de champ. Imaginons qu'il y ait dans le registre P la valeur #Bh,

le champ P est donc le douzième quartet (en partant de la droite).

le champ WP est donc le champ qui correspond aux douze premiers quartets (du quartet #0h au quartet #Bh).

De plus les registres de calculs ne peuvent pas ètres utilisés dans tout les sens; il faut avoir ce schémas en tête:

 Ce schéma résume les manipulations possibles entre les registres de travail. Lorsque l'on utilise deux registres, on manipule l'un des quatres couples possibles de registre de caculs: (A,B) (A,C) (B,C) ou (C,D).

Pour ce faciliter la tache les programmeurs en assembleur ne font des programmes qu'avec des mnémoniques qui sont en général très èxplicites: A=A+B A (on additionne les champs A des regitres A et B et le résultat se retrouvera dans le registre A.

Je ne dévellopperait pas ici le langage de programmation car mon seul but est d'aider les débutants à comprendre les bases de l'assembleur; la documentation de SunHP en parle très bien et vous pouvez la télécharger sur se site à la page téléchargement/programmation.

Les périphériques

l'écran: ATTENTION piège!! Nous avons affaire à un écran de 131 pixels en horizontal sur 64 en vertical. L'écran ne fait qu'afficher une portion de mémoire au bit près. Une ligne de l'écran est donc codée sur 33 quartets soit sur 132 bits donc 132 pixels; le dernier pixel de chaque ligne étant toujours invisible.

Pour ceux qui veulent s'assayer aux niveaux de gris il suffit de superposer deux ou trois images légèrement différentes. Par exemple si on a trois dessins à superposer, le pixel qui sera allumé durant les trois passages sera plus sombre que celui qui n'était allumé que durant deux passages.(pour ceux qui n'ont pas compris, tant pis.). C'est de cette façon qu'on peut obtenir 3 ou 4 niveaux de gris.

Le buzzer: En assembleur il est difficile de produire un son exact avec le buzzer car les seules chose qu'on peut faire c'est le mettre sous et hors tension ce qui produit à chaque fois un "clic"; pour avoir un son il faut que ces clics se répetent a une fréquence donnée et durant un temps donné ce qui ne peut se faire qu'avec deux boucles ibriquées l'une dans l'autre(l'une gère la fréquence, l'autre le temps de la note).Heureusement il existe une routinie que l'on peut appeler d'un programme en assembleur qui gère cela; on l'appelle en mettant dans le registre C(A) (champ A du registre C) la durée en millisecondes et dans le registre D(A) la fréquence en hertz. L'appel en lui-même se fait par GOSBVL 017A6 sur HP 48 G/GX.

Les ports de communications: suffit pour transmettre une donnée de la mettre dans le tampon d'émission série ou de le transférer bit à bit par infrarouge mais je n'ais pas assez de docs sur ce point pour pouvoir en dire plus.Désolé.

La mémoire:

La mémoire morte (ROM): Ce type de mémoire est appelé "mémoire morte" car on ne peut pas écrire de données dedans et la programmation de cette mémoire a été faite une seule fois en usine.

Ce qui nous intéresse en mémoire morte ce sont des bouts de programmes que la HP utilise pour faire toutes ses fonctions (SIN, DUP, SWAP...) et qui peuvent ètres appelées par un programme en assembleur. On peut comparer ces routines à des sous-programmes. L'appel se fait par un GOSBVL (qui est le mnémonique correspondant ) ou par un GOVLNG suivit de l'adresse de la routine en mémoire. les plus utiles de ces routines sont: celle qui sauvegardent les registres D0, D1, B(A) et D(A) et celle qui réstaure ces registres. certaines permettent de gérer l'écran, d'autres le buzzer...

ATTENTION certaines de ces routines modifient les contenu de certains regitres; il faut donc y faire gaffe!!!!

La mémoire vive (RAM): c'est là que sont enregistré tous les programmes qui ne sont pas d'origine dans la HP. C'est aussi là que se trouve la partie de mémoire utilisée par l'écran .

ATTENTION écrire n'importe ou en RAM entraine quasi toujours à un plantage de la HP.

Il existe des zones ou on peut écrire sans trop de risque, ce sont des zone de préparation:

On trouve 44 quartets dispo en #80092h (préparation de l'affichage)

et 532 quartets en #800F5h (zone de transfert)

( P.S. Merci à Phillipe Pamart!!)

La RAM I/O:

On trouve au début de la RAM une partie réservée à la HP ou celle-ci enregistre les paramètres de sa configuration tels que le contraste, l'allumage des indicateurs(shifts, alpha...), on y trouve aussi l'adresse de la portion de mémoire qui est reproduit sur l'écran (ça c'est interessant!!!).

Cependant gérer la mémoire est assez difficile car la ROM se retouve parfois cachée derriere une partie de la RAM (la RAM I/O "cache" les adresses #100h à #13Fh de la ROM par exemple) :

 

III) Les aspects de la programmation

 Pour bien programmer en assembleur il faudrait être consciencieux, ordonné et patient. Les deux premieres nécessitée sont souvent ignorée mais la derniere est de loin la plus grande qualité du programmeur car sur la HP les MEMORY LOST sont fréquents et très chiants quand il s'agit de réstaurer les 100K octets de programmes que la HP avait avant le bug.

Petit conseil: faites régulièrement des sauvegardes du contenus de votre HP.

De plus Programmer en assembleur ne vient pas tout seul comme peuvent venir d'autres langages de programmation, en assembleur il vaut mieux planifier légèrement, faire au moins un organigramme du programme que l'on souhaite faire en y mettant seulement les choses importantes (tests, boucles...).

Si après ces légers conseil vous arrivez à créer un programme et que vous souhaitez le diffuser; je peut le faire pour vous sur mes pages téléchargement.