Multiplication par décalage

un pet, un vic, un 64...

Modérateur : Politburo

Répondre
Ben
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1549
Enregistré le : 21 août 2016 19:04

Multiplication par décalage

Message par Ben »

Salut,

Un petit programme sur C-128 qui simule une multiplication binaire par décalage sur 16 bits. Un peu comme peuvent le faire les instructions assembleurs ASL/LSR.

L'output du programme montre les 16 bits, l'équivalent décimal et hexa

Code : Tout sélectionner

00000000 00011101  N= 29  001D
Le programme est un peu "spaghetti", mais on voit bien les blocs.
"+" sert à décaler vers la gauche
"-" sert à décaler vers la droite
"1" positionne le 1e bit à 1

Code : Tout sélectionner

10 FAST:DIM A(2,8):T$="0123456789ABCDEF"
20 GOTO 170
30 GET A$:IF A$="" THEN 30
40 IF A$="+" THEN 80
50 IF A$="-" THEN 120
60 IF A$="1" THEN 160
70 GOTO 30
80 C=A(2,1)
90 FOR J=2 TO 1 STEP -1:FOR I=2 TO 8:A(J,I-1)=A(J,I):NEXT I,J:A(2,8)=0
100 A(1,8)=C
110 GOTO 170
120 C=A(1,8)
130 FOR J=1 TO 2:FOR I=8 TO 2 STEP -1:A(J,I)=A(J,I-1):NEXT I,J:A(1,1)=0
140 A(2,1)=C
150 GOTO 170
160 A(2,8)=1
170 SCNCLR:N=0:M=8
180 FOR J=1 TO 2:FOR I=1 TO 8:PRINT RIGHT$(STR$(A(J,I)),1);:IF A(J,I)=1 TH
EN N=N+2^(8-I+M)
190 NEXT I:M=0:PRINT " ";:NEXT J:PRINT " N=";N;" ";
200 N=0
210 FOR J=1 TO 2
220 FOR I=1 TO 4
230 IF A(J,I)=1 THEN N=N+2^(4-I)
240 NEXT I
250 N$=MID$(T$,N+1,1)
260 PRINT N$;:N=0
270 FOR I=5 TO 8:IF A(J,I)=1 THEN N=N+2^(8-I)
280 NEXT I
290 N$=MID$(T$,N+1,1)
300 PRINT N$;:N=0
310 NEXT J
320 GOTO 30
Ben
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3405
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Multiplication par décalage

Message par C.Ret »

Pas mal du tout !

C'est spagetti dès la seconde ligne. Mais le plus surprenant est d'avoir fait cela sans les fonction HEX$() ou DEC() !

J'ai remis au propre une vielle version que j'avais en archive où j'utilisais HEX$() DEC() et BIN$() :
decalage_40col_RUN_.gif
decalage_40col_RUN_.gif (38.03 Kio) Vu 8935 fois
Dans cet exemple deux nombres sont testés: 43690 décalé à gauche puis à droite (+-) et 1.5 décalé deux fois à gauche (++).

En fait BIN$() n'est pas une instruction native du C128; il s'agit d'un tableau construit au début du programme (linge 10 à 70).
D'où le listing des valeurs binaires hexa et décimales de 0 à 15 . héhé !
decalage_C128D_BASIC_without_GOTO_.gif
decalage_C128D_BASIC_without_GOTO_.gif (18.25 Kio) Vu 8935 fois
SHARP PC-1211 PC-1360 EL-5150 PC-E500 | Commodore C=128D | Texas Instruments Ti-57LCD Ti-74BASICalc Ti-92II Ti-58c Ti-95PROCalc Ti-30XPROMathPrint | Hewlett-Packard HP-28S HP-41C HP-15C HP-Prime HP-71B | CASIO fx-602p | NUMWORKS | Graphoplex Rietz Neperlog | PockEmul | Sommaire des M.P.O. | Ma...dov'il sapone.
Ben
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1549
Enregistré le : 21 août 2016 19:04

Re: Multiplication par décalage

Message par Ben »

C.Ret a écrit : 04 janv. 2019 18:53 Pas mal du tout !
Merci :-)
C.Ret a écrit : 04 janv. 2019 18:53 C'est spagetti dès la seconde ligne
Euh...oui, j'avoue que ce n'est pas le plus beau programme que j'ai fait. En fait, les idées sont venues petit à petit et je n'ai pas pris le temps de le refaire.
C.Ret a écrit : 04 janv. 2019 18:53 Mais le plus surprenant est d'avoir fait cela sans les fonction HEX$() ou DEC() !
A la base, j'ai commencé le programme sur PC-1500. HEX$ et DEC sont spécifiques C-128. En plus, je voulais vraiment simuler les deux instructions assembleurs.

Astucieux ton BI$ qui devient BIN$ :-)
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3405
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Multiplication par décalage

Message par C.Ret »

Ben a écrit : 05 janv. 2019 10:24 [ … ] En fait, les idées sont venues petit à petit et je n'ai pas pris le temps de le refaire.[...]
J'ai moi aussi des milliers de programmes qui ont suivi exactement le même mode de développement.

C'est bien le propre même de cette machine sur laquelle j'ai découvert et expérimenté tant de choses. Et c'est vrai que les ajouts se font au fur et à mesure des idées, qui ne viennent que lorque l'on découvre pas à pas ce que l'on peut faire...

Alors, moi aussi j'ai des bibliothèques entières de programmes très spagetti avec des numéro de ligne qui révèlent plus l'acharnement à contourner les difficultés, écueils ou simplement les erreurs et étourderie qui parfois font devenir chèvre.

Et surtout, ne jamais utiliser RENUM au risque de tout mélanger et de ne jamais plus retrouver ses petits :)

Ce qui me surprend le plus c'est que ces programmes sauvegardés sur disquette 5"1/4 il y a 30 ans sont toujours lu par mon lecteur 1571 intégré.

Et que bien souvent, je me perds moi même dans les sous-parties et sous-programmes sans plus réellement comprendre ce que j'avais voulu faire.
Ni me souvenir pourquoi j'avais fais cela de cette façon ! La documentation qui les accompagne était souvent inexistante ou alors très sommaire. Je dois retrouver les indices sur des brouillons où tout est mélangé dans de vielles boites d'archives sur des papiers griffonnés jaunis par le temps et un peu effacé (surtout les listings). Et je n'ai jamais pensé à faire le lien entre ces notes et schéma et les noms des programmes (ni même de répertoire correct du contenu des disquettes !)

Le programme que j'ai publié ci-dessus a été remanié et mis au propre.

Entre temps, j'ai beaucoup programmé en RPL ce qui fait que j'abuse des structures DO ... LOOP (l'avantage du C128 est d'avoir une EXIT contrairement aux RPL) et sous matLab ce qui fait que je n'envisage plus de la même façon l'utilisation des tableaux qui sont devenu vecteurs, matrices ou liste d'indices... Approches que je n'avaient biensûr pas en 1987.
SHARP PC-1211 PC-1360 EL-5150 PC-E500 | Commodore C=128D | Texas Instruments Ti-57LCD Ti-74BASICalc Ti-92II Ti-58c Ti-95PROCalc Ti-30XPROMathPrint | Hewlett-Packard HP-28S HP-41C HP-15C HP-Prime HP-71B | CASIO fx-602p | NUMWORKS | Graphoplex Rietz Neperlog | PockEmul | Sommaire des M.P.O. | Ma...dov'il sapone.
Avatar du membre
Capitaine
Fonctionne à 300 bauds
Fonctionne à 300 bauds
Messages : 97
Enregistré le : 15 avr. 2007 11:55

Re: Multiplication par décalage

Message par Capitaine »

J'ai pas essayé car mon C128 n'est pas en réseau lol mais t'aurais pu multiplier ou diviser par 2 non ?
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3405
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Multiplication par décalage

Message par C.Ret »

Oui, c'est pas ce que font les lignes 190 et 200 non ?
SHARP PC-1211 PC-1360 EL-5150 PC-E500 | Commodore C=128D | Texas Instruments Ti-57LCD Ti-74BASICalc Ti-92II Ti-58c Ti-95PROCalc Ti-30XPROMathPrint | Hewlett-Packard HP-28S HP-41C HP-15C HP-Prime HP-71B | CASIO fx-602p | NUMWORKS | Graphoplex Rietz Neperlog | PockEmul | Sommaire des M.P.O. | Ma...dov'il sapone.
Répondre

Retourner vers « Commodore 8bits »