Pour les différentes fonctions inclues dans les ROM, on distingue 4 catégories.
1/ Les fonctions 'extraites' directement des ROM et reintroduites dans une nouvelles ROM sans changement (sauf eventuellement le nom pour eviter les doublons ou dans un soucis homogenisation). Cela concerne le plus grand nombre de fonctions, comme celles venant des ROM HP: XFUNCTIONS, EXT-IO, ILDEV. Sauf precision de ma part, c'est ce cas. Il faut donc se reporter au manuel d'ou les fonctions sont extraites pour connaitre leur utilisation. J'ai changer de nom les fonctions logiques pour eviter que les instructions 56-BITS de l'ASSEMBLER ne se melangent avec les 32-BITS du IL-DEV et elles-meme se melangent avec celles du CCD. De meme, ALEFT,AMID et ARIGHT sont respectivement LEFT$, MID$ et RIGHT$ du ALPHABOX. Dans le meme esprit, a>A et A>a sont UPR$ et LOW$.
2/ Les fonctions que je me suis permis d'ameliorer ou de modifier, voire de corriger,
Dans les ROMs presentes, l'instruction HP-IL
FLTYPE, que j'ai etendues avec le type RO (pour ROM41 ou .r41). De plus, dans les images de l'IOBOX*, l'entete - IOBOX (code XROM 18,00) renvoit sur la fonction SEND du EXT-IO.
3/ Les fonctions de mon cru, inspirees et/ou reecrites d'apres une fonction, voire directement crees par mes soins.
Cela concerne sutout une implementation d'un gestion de buffer (inspiree du BUFFERLAND), des fonctions 'synthetiques', comme LX, LB, LA, et enfin des fonctions sur les chaines (A>ST, ST>A, RHASHF, et AIS?).
3.1/ J'ai developpe les fonctions suivantes pour gerer le RGBF (identifiant 9).
RGBF cree le buffer de la taille N en registres specifiee en X. Si X=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.
?X=RGBF teste si X est egal au RGBF.
?0=RGBF teste si le RGBF est nul.
?$RGBF teste si le RGBF 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...
?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'incremente pas le pointeur L.
RGX>BF sauve les registres S.D dans le buffer en 0. Cette fonction vient de BUFFERLAND.
BF>RGX le contraire.
3.2/ Les fonctions
LX,
LA et
LB sont basees sur la capacite de lire l'octet qui suit en mode execution de programme et permettent des modifications sans acces a la pile.
LX nnn charge nnn en X[1:0] apres un SXR.
LA nnn ajoute le caractere nnn en ALPHA.
LB nnn insere le mot nnn au PC courant en mode direct. En execution de programme, LB va inserer nnn a l'adresse absolue pointee par X[3:0]. Attention X doit etre une chaine. A noter, que LB peut perturber le decodage des programmes. Faire PACK pour tout resoudre.
3.3/ Concernant les chaines,
RHASHF est equivalent a ASHF mais agit sur les 6 caracteres de droite.
A>ST et
ST>A chargent ALPHA dans X,Y,Z et T et inversement. A noter que A>ST et ST>A utilisent de vraies strings dans la pile. A>ST va donc stocker le registre ALHPA en T Z Y X, mais ce seront de vraies strings.
4/ Enfin un groupe de fonctions regroupees en une super-fonction (comme HEPAX et HEPAXA du module HEPAX). Je n'aimais pas ce style de fonctions multiple, mais je dois avouer que j'ai compris la frustration des programmeurs devant l'impossibilite d'ajouter une nouvelle fonction car la FAT est pleine (64 fonctions) et il reste plein de place dans la page. J'ai ainsi repris et modifie le code de HEPAX/HEPAXA et j'ai fait evoluer l'assembleur pour pouvoir creer des fonctions multiples. Ce n'est pas encore aussi simple que je le veux, mais cela fonctionne. Les fonctions multiples sont
AIS? AIS?A,
AX AXA et
CDDCD et
CDDCDA.
4.1/ AIS? nnn et AIS?A 'alpha'
000 :: ABC : Teste si le 1er caractere de ALPHA est une lettre majuscule, renvoit la lettre en X si oui, saute l'instruction suivante sinon.
001 :: abc : Idem mais teste une minuscule
002 :: DGT : Idem mais teste un chiffre decimal (0..9)
003 :: HEX : Idem mais teste un chiffre hexa-decimal (0..9, A..F)
004 :: PNC : Idem mais teste un caractere de ponctuation !,.:?
005 :: MTH : Idem mais teste un operateur +-*/^<>= et different
006 :: INX : Idem mais teste un des caractere specifie en X (1 a 6 caracteres)
Comme on voit 7 fonctions, pour somme toute une action similaire, d'autant que ce ne sont pas forcement des fonctions que l'on va utiliser souvent.
Alors regroupons les en une "super"-fonction: AIS? (Alpha Is ?). Cette fonction attend un chiffre de 000 a 006 et appelle la "sous fonction demandee (000 = ABC, 001 = abc... 006 = INX).
Sympa ! Mais, j'ai un peu de mal a me souvenir que PNC c'est 004. Dans ce cas, il y a une autre fonction AIS?A qui attend quant a elle, non pas un prompt numerique, mais ALPHA (nous sommes sur une HP-41C !!!!!).
Ainsi, au lieu de AIS? 004, nous entrons AIS?A [ALPHA]PUC[ALPHA] et la fonction 004 sera appelee et executee
Ouaip, mon gars, c'est bien ton truc, mais ca, la, c'est en mode direct !!! Moi, je programme, moi, mONsieur !
Qu'a cela ne tienne, en mode programme, AIS? et AIS?A vont s'auto-programmer !!!!
va generer le code:
et l'execution se passera nickel. Ce code produira un BEEP si le premier caractere ALPHA est un chiffre décimal ou un signe mathématique
.
4.2/ Les fonctions AX et AXA sont extraites de la ROM PARIO, il s'agit de:
000 :: A-XB
001 :: A-XD
002 :: A-XH
003 :: A-XO
004 :: X-AB
005 :: X-AD
006 :: X-AH
007 :: X-AO
008 :: F-X
009 :: X-F
010 :: XE-M
011 :: XM-E
012 :: XE-SYL
013 :: SXL-XM
Je me permets de vous renvoyer au manuel de la ROM PARIO (avec le PROTOCODER) pour leur description.
4.3/ La fonction CDDCD est un multipleur sur CODE et DECODE, comme suit. Je ne donne que les chaines pour CDDCDA.
000 :: CD = Code ALPHA en X (= CODE du MLROM)
001 :: DC = Decode X en ALPHA (= DECODE du MLROM)
002 :: CR = Code ALPHA dans le registre d'adresse absolue donne par X entier.
003 :: DR = contraire de CR
004 .. 015 :: Cx = Code ALPHA en registre
x avec
x = t a b c d e
Dx = contraire de Cx
016 :: =ROM = Code AAAAMMM et execute un WMLDL, donc ecrit MMM en AAAA (accede aux RAM HEPAX)
017 :: ?ROM = Code AAAAxxx et execute un RDROM, donc lit le mot MMM en AAAA (accede aux RAM HEPAX) et le decode en ALPHA -> AAAAMMM.
018 :: 1D = Decode 1 digit de X
029 :: 2D = Decode 2 digits de X
020 :: 3D = Decode 3 digits de X
021 :: 4D = Decode 4 digits de X
022 :: C$ = Code ALPHA en X sous forme d'une chaine
023 :: X>$ = Converti le nombre dans X en string
024 :: X?$ = Teste si X contient une string; saute l'instruction suivante sinon
025 :: XCL$ = Efface le bit de string de X
Voila, voila... Bonne decouverte
Une petite mise a jour de l'archive avec un debut de documentation (DOCUMENTATION) et une correction des fonctions CDDCD et CDDCDA.