En fait ca marche un peu comme la fameuse WP 34S ... toutes proportions gardées bien sûr !
On prend une machine hôte - j'ai choisi la merveilleuse PC-1360 pour son écran 4 lignes parfaitement contrasté (on le répétera jamais assez) mais ca doit marcher avec plein d'autres, on verra à la fin.
Contrairement à la WP34S, on ne touche pas à la ROM mais à la RAM que l'on modifie ainsi :
Code : Tout sélectionner
10 CLS :WAIT 5:PRINT "******SHARP16C *******"
20 PRINT "***V0.1 By BABA *******"
30 CLEAR :WAIT 0:DIM PA$(4)*20,PB(4)
40 GOSUB 200:END
50 "A"GOSUB 200:END
60 "S"GOSUB 300:END
200 WAIT 0:REM **AFF**
210 FOR I=4TO 1STEP -1:PRINT CHR$ (48+I);":";PA$(I):NEXT I:RETURN
250 REM ***ENTER***
260 FOR I=4TO 2STEP -1
270 PA$(I)=PA$(I-1):PB(I)=PB(I-1)
280 NEXT I:RETURN
300 REM ***R***
310 FOR I=2TO 4
320 PA$(I-1)=PA$(I):PB(I-1)=PB(I):NEXT I:RETURN
350 REM ***X<>Y***
360 D=PB(1):K$=PA$(1):PB(1)=PB(2):PB(2)=D
370 PA$(1)=PA$(2):PA$(2)=K$
380 RETURN
900 "B"AREAD NN$:BB=2:GOSUB 250:PA$(1)="%"+NN$:GOTO 980
930 "H"AREAD NN$:BB=16:GOSUB 250:PA$(1)="&"+NN$:GOTO 980
960 "D"AREAD NN$:BB=10:GOSUB 250:PA$(1)="d"+NN$:GOTO 980
980 GOSUB 1000:PB(1)=D:IF E=1THEN GOSUB 300
990 GOSUB 200:END
1000 REM ***BaseN->10***
1005 CURSOR 94:PRINT "*"
1010 D=0:E=0:FOR I=1TO LEN NN$
1020 G=ASC (MID$ (NN$,LEN NN$-I+1,1))
1030 IF G<58THEN LET G=G-48
1040 IF G>64THEN LET G=G-55
1045 IF G>=BBTHEN PRINT "ERROR BASE":E=1
1050 D=D+G*BB^(I-1)
1070 NEXT I
1080 RETURN
1100 REM ****BASE10 -> N****
1105 CURSOR 94:PRINT "*"
1110 J=0:NN$=""
1120 J=J+1:IF BB^J<=NTHEN 1120
1130 FOR I=J-1TO 0STEP -1
1140 C=INT (N/BB^I)
1150 IF C>9THEN LET NN$=NN$+CHR$ (55+C)
1160 IF C<10THEN LET NN$=NN$+CHR$ (48+C)
1170 N=N-C*BB^I
1180 NEXT I
1190 RETURN
1200 REM ***OPERATION***
1210 "="WAIT 0:PRINT "+,-,Or,And,Hx,Dc,Bi,Z"
1230 K$=INKEY$ :IF K$=""THEN 1230
1235 IF K$="Z"THEN END
1240 U$=LEFT$ (PA$(1),1)
1250 IF U$="%"THEN LET BB=2
1260 IF U$="d"THEN LET BB=10
1270 IF U$="&"THEN LET BB=16
1280 IF K$="+"THEN LET N=PB(1)+PB(2):PB(2)=N:GOSUB 300:GOTO 1350
1290 IF K$="-"THEN LET N=ABS (PB(1)-PB(2)):PB(2)=N:GOSUB 300:GOTO 1350
1300 IF K$="H"THEN LET BB=16:U$="&":N=PB(1):GOTO 1350
1310 IF K$="D"THEN LET BB=10:U$="d":N=PB(1):GOTO 1350
1320 IF K$="B"THEN LET BB=2:U$="%":N=PB(1):GOTO 1350
1330 IF K$="A"THEN LET N=PB(1)AND PB(2):PB(1)=N:GOSUB 300:GOTO 1350
1340 IF K$="O"THEN LET N=PB(1)OR PB(2):PB(1)=N:GOSUB 300
1350 GOSUB 1100:PA$(1)=U$+NN$:GOSUB 200:END
1400 REM ***PILE***
1410 "K"WAIT 0:PRINT "Enter,R,X<>y,Clear,Z"
1420 K$=INKEY$ :IF K$=""THEN 1420
1425 IF K$="Z"THEN END
1430 IF K$="E"THEN GOSUB 250:GOSUB 200:END
1440 IF K$="R"THEN GOSUB 300:GOSUB 200:END
1450 IF K$="X"THEN GOSUB 350:GOSUB 200:END
1460 IF K$="C"THEN GOTO 30
1470 END
1500 REM ***SHIFT***
1520 "L"WAIT 0:PRINT "Right,Left,Z"
1530 K$=INKEY$ :IF K$=""THEN 1530
1535 IF K$="Z"THEN END
1540 U$=LEFT$ (PA$(1),1)
1550 CURSOR 94:PRINT "*"
1560 BB=2:N=PB(1):GOSUB 1100
1570 IF K$="L"THEN LET NN$=RIGHT$ (NN$,LEN NN$-1)+"0"
1580 IF K$="R"THEN LET NN$="0"+RIGHT$ (NN$,LEN NN$-1)
1590 IF U$="%"THEN LET BB=2
1600 IF U$="d"THEN LET B=10
1610 IF U$="&"THEN LET B=16
1620 GOSUB 1000:N=D:GOSUB 1100:PA$(1)=U$+NN$:GOSUB 200:END 
bon ... a quoi ca sert ?
--> juste à pouvoir faire des conversions et des calculs dans les bases 16,10 et 2. (on peut ajouter la base 8 très facilement si besoin, moi j'en ai pas eu le besoin).
Comme j'essaye de bidouiller en assembleur (je pars de rien c'est laborieux), je me suis très vite demandé comment j'allais m'en sortir entre les instructions données en binaires, les adresses en hexa et moi qui parle en base 10 ...
EDIT1 : on peut faire RUN une seule fois, après le programme fonctionne a partir des commandes DEF, même après extinction et réallumage de la machine. Les valeurs sont gardées en mémoire dans des tableaux - si il y a un pb (et il y en aura sûrement, suis pas développeur...) , juste refaire RUN qui réinitialise le programme
EDIT2 : A tout moment, lorsque l'invite > est affichée, DEF A rappelle la pile à l'affichage (j'avais oublié de le dire ...)
Quelques explications :
Vous disposez d'une pile de 4 registres (tien tien ..) et cette machine virtuelle fonctionne en notation polonaise inverse (tien tien tien).
Pour entrer un chiffre : vous saisissez le chiffre puis :
DEF H si c'est un nombre hexadécimal
DEF D si c'est un nombre décimal
DEF B si il est binaire
Par exemple C0C5 DEF H puis 1200 DEF D : je rentre dans la pile C0C5 en hexa et 1200 en décimal - on obtient :

les deux chiffres sont dans la pile précédés de "&" si il est en hexa, "d" si il est décimal et "%" si il est binaire.
Pour faire une opération DEF =
affiche un "menu" : +,-,Or,And,Hx,Dc,Bi,Z

en choississant "+" on additionne les 2 premiers registres de la pile, quelque soient leurs bases, comme sur une HP classique, vous connaissez. Le résultat est donné dans la base du chiffre contenu dans le registre 1 initialement. Dans cette version, les opérations disponibles, sur les 2 premiers registres sont : +, -, Or et And.
Hx, Dc et Bi permettent de convertir le premier registre de la pile dans la base indiquée
Z sort du menu sans rien faire.
et si on choisi + :

J'obtiens mon résultat en base 10 (base du dernier chiffre entré)
et que je peux convertir si besoin DEF = H
pour obtenir &C575
Pour manipuler la pile, il faur accéder au menu par DEF K, vous avez les options Enter, R, X<>y, clear, Z
qui correspondent grosso modo aux fonctions équivalentes HP (pour accéder à l'opération, saisir le terme en majuscule : E, R, X, C ou Z qui permet toujours de sortir sans rien faire)
Il existe aussi un menu qui permet des opérations de Shifting par DEF L. Vous accéder aux options Right et Reft (en appuyant sur R ou L) - A tester, je ne garanti pas le total fonctionnement la dessus ...
je termine en précisant que le programme ne tourne que pendant les opérations. Entre 2 opérations, on peut se servir du PC-16C comme un PC-1360 !!!
voilà pour ce samedi matin pluvieux ... a compléter si vous avez d'autres besoins ...
et pour l'adapter à d'autres pocket moins gâté coté affichage, modifier simplement la routine AFF à la ligne 210 (là je vous laisse faire).
EDIT3 : Je précise que, comme les opérations ne sont pas immédiates, j'ai fais afficher une "*" en bas à droite pour indiquer le le calcul est en cours. Pour la portabilité, attention donc aux lignes 1005 1105 et 1550 (je crois que c'est les seules) - Le pgm fonctionne sans ces 3 lignes - et le "CURSOR 94" est éventuellement à adapter à la taille de l'écran sur un autre pocket multilignes





