Dis, Coconut, dessine-moi un buffer

Ici, on fait dans le petit, le LCD qui déchire sa race, on y cause même calculatrices quand on est en manque !

Modérateur : Politburo

Répondre
cgh
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2386
Inscription : 30 août 2011 12:23
Localisation : Vous êtes ici -> .

Dis, Coconut, dessine-moi un buffer

Message par cgh » 08 juil. 2014 23:23

En decoupant, corrigeant et developpant mes propres routines MCODE sur HP-41C, j'ai decouvert les BUFFERS.

De quoi s'agit-il ?
Les buffers sont stockes entre le .END. et le registre d'adresse 192 (0C0). Ils contiennent des informations, etats, alarmes, assignations, ... qui doivent rester accessibles, mais hors de la zone des programmes et des registres (R00...).
Chaque buffer est identifie par un id unique de 1 a 15. Une liste exhaustive de ces id:

Code : Tout sélectionner

  1 - David Assembler : Labels
  2 - David Assembler : Labels irresolus
  3 - CCD : Taille du mot, seed, matrice courante (Idem ADVANTAGE)
  7 - Extended IL
  9 - XTRABOX : RGBUF de CGH ;)
 10 - TIME : Alarmes
 11 - Plotter
 12 - HPILDEV
 13 - CMT300
 14 - ADVANTAGE : Donnees temporaires pour INTG et SOLVE)
      - DATAFILE et RSU
 15 - MAIN-FRAME : Assignations
Cependant, a la difference des programmes et registres, lles buffers doivent etre reclames par leur ROM.
Et oui, le MAIN-FRAME (MF) est d'une maturite epoustouflante !!!
En effet, quand on allume la machine, le MF va invalider tous les buffers (sauf le 15 qui est toujours stocke a partir de 0C0), puis il va appeller le vecteur de "Deep-Sleep Wake-Up" (adresse xFF9) de toutes les ROMs presentes. Celles-ci devront alors RE-valider leur buffer, sinon le MF le supprimera. Et voila, comment et pourquoi un buffer est detruit si la ROM est extraite de la machine :geek:

Et comment accede-t-on au buffer ?
En fait, le buffer n'est pas forcement accessible directement, mais sert de tampon ou de stockage d'etat a des fonctions des ROMs. Seul HPILDEV permet un acces direct au buffer; celui-ci etant utilise comme zone d'echange avec un peripherique HP-IL.
Les alarmes, par exemples, sont stokees dans le buffer du TIME. On ne peut pas les lires directement, mais on peut agir sur celles-ci via les instructions dediees.

A quoi ca ressemble un buffer ?
Un buffer est un espace d'au-moins 1 registre (7 octets) code comme suit:

Code : Tout sélectionner

BB LL x2 x3 x4 x5 x6
N0 y1 y2 y3 y4 y5 y6
BB est l'identifiant repete. Dans le cas du RGBF (id 9), la valeur de BB sera 99.
LL est le nombre de registres de 01 a FF soit 255 registres (d'ou les 1771 octets max de BSIZEX dans le HPILDEV: 255 x 7 - 2 registres)
Les codes x2..x6 et 0..y6 sont les donnees utilisateurs. Il est conseille de ne jamais laisser de registre a la valeur 0, car celui-ci sera considere comme libre et donc recupere par ex. pour les programmes, d'ou un N non-nul. Le cas echeant (HPILDEV, RGBF), un n+1eme registre non nul est ajoute en fin de buffer. C'est aussi comme cela que le nombre de registres disponibles decroit quand on cree un buffer.
Ci dessous, le buffer de l'HPILDEV (cree par 14 BSIZEX):

Code : Tout sélectionner

> r 0c0 c4
Registers: R00 at 19C, SIZE 100
 0C0: CC040000000000   <- Header (id 12 = C), 4 registres
 0C1: 00000000000000    <- donnees
 0C2: 00000000000000    <- donneee
 0C3: 104D4F4E495452   <- String "MONITR" pour fin de buffer.
 0C4: 00000000000000    <- Registre libre
Le fait que l'identifiant est repete (ex CC) n'est pas anodin. C'est ainsi que le MF invalide les buffers: de CC on aura 0C. Le MF appelle le vecteur xFF9 du HPILDEV qui recherche un buffer xC. Si HPILDEV veut reclamer son buffer, il va retablir le CC. Ainsi le MF est prevenu que le buffer est revalide et il echappera a la suppression... Simple et tres efficace !!!!
J'adore parler de rien, c'est le seul domaine où j'ai de vagues connaissances ! - Oscar Wilde
Ce n'est pas parce que les choses sont difficiles que nous n'osons pas. C'est parce que nous n'osons pas que les choses sont difficiles. - Sénèque

cgh
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2386
Inscription : 30 août 2011 12:23
Localisation : Vous êtes ici -> .

Re: Dis, Coconut, dessine-moi un buffer

Message par cgh » 08 juil. 2014 23:40

Introduit avec l'XTRABOX, voici les instructions de gestion du RGBF. J'ai developpe ces fonctions en m'inspirant des HPILDEV et en commencant a corriger les bugs du BUFFERLAND (d'ou sont extraites et portees les RGX>BF et BF>RGX).
  • RGBF cree le buffer de la taille N en registres specifiee en X. Si N=0, le buffer est detruit. Une fois cree le buffer sera conserve tant qu'il ne sera pas detruit par la fonction adequate ou que la ROM ne sera pas retiree.
  • ?RGBF renvoit la taille si le buffer existe, sinon saute l'instruction suivante.
  • CLRGBF remet le RGBF a zero et reset le pointeur.
  • X>RGBF stocke X en RGBF a l'adresse pointee par L (0..N-1). Le pointeur L est incremente si >0. Il est decremente sinon.
  • RGBF>X contraire de X>RGBF.
  • X<>RGBF comme precedents mais echange X et le RGBF a l'adresse pointee par L.
  • ?X=RGBF teste si X est egal au RGBF a l'adresse pointee par L.
  • ?0=RGBF teste si le RGBF a l'adresse pointee par L est nul.
  • ?$RGBF teste si le RGBF a l'adresse pointee par L est une string
  • L=RGBF charge en L le pointeur du RGBF.
  • RGBF=L sauve le pointeur du RGBF avec le pointeur L.
  • L<>RGBF echange le pointeur du RGBF avec le pointeur L.
  • ?L=RGBF teste si L est egal au pointeur RGBF.
  • A>RGBF sauve ALPHA dans le RGBF a partir du pointeur L.
  • RGBF>A charge ALPHA depuis le RGBF a partir du pointeur L.
  • ST>RGBF et RGBF>ST de meme avec X Y Z T de la pile.
    A noter que les fonctions entre le RGBF et A ou ST n'incrementent pas le pointeur L.
  • RGX>BF sauve les registres sss.eee en X dans le buffer en 0. Cette fonction vient de BUFFERLAND.
  • BF>RGX le contraire.
J'adore parler de rien, c'est le seul domaine où j'ai de vagues connaissances ! - Oscar Wilde
Ce n'est pas parce que les choses sont difficiles que nous n'osons pas. C'est parce que nous n'osons pas que les choses sont difficiles. - Sénèque

Répondre

Revenir vers « Tous les Pockets »

Qui est en ligne ?

Utilisateurs parcourant ce forum : Gege34 et 9 invités