Mais c'est très sympa tout ça !Marge a écrit : ↑10 févr. 2020 18:29 Pour info, ce type propose d'autres programmes de maths pour d'autres machines, dont la Numworks.
Merci pour le lien
Modérateur : Politburo
Mais c'est très sympa tout ça !Marge a écrit : ↑10 févr. 2020 18:29 Pour info, ce type propose d'autres programmes de maths pour d'autres machines, dont la Numworks.
Code : Tout sélectionner
LBL A 61 41 A
STO 0 21 0 'X
STO 3 21 3 'M
0 0
STO 2 21 2 'C
LBL 1 61 41 1 'Boucle principale
RCL 0 22 0 'Test si X=1
- 65
1 1
= 74
X=0? 61 43
GTO 3 51 41 3 'Exit du programme
2 2
STO / 0 21 45 0
RCL 0 22 0
FP 61 45
X=0? 61 43
GTO 2 51 41 2
RCL 0 22 0
* 55
6 6
+ 75
1 1
= 74
INPUT 31 'Test si X>M
RCL 3 22 3
SWAP 51 31
X<=Y? 61 42
STO 3 21 3
STO 0 21 0
LBL 2 61 41 2
1 1 'C=C+1
STO + 2 21 75 2
GTO 1 51 41 1
LBL 3 61 41 3
RCL 3 22 3 'Affiche M Altitude
RTN
Faire RCL 2 pour avoir le vol
Code : Tout sélectionner
200 CLS:PRINT "Syracuse multi"
210 L=0:I=0:E=0:C=0:W=0:R=0
220 DIM A(255):DIM X$(1)*255
230 INPUT "Nbr=";X$(1)
240 L=LEN(X$(1))
250 IF L<6 THEN A(1)=VAL(X$(1)):E=1:GOTO320
260 FOR I=L-5 TO 1 STEP -6
270 E=E+1
280 A(E)=VAL(MID$(x$(1),I,6))
290 NEXT I
300 IF E*6=L THEN 320
310 E=E+1:A(E)=VAL(MID$(X$(1),1,L-(E-1)*6))
320 W=0
330 FOR I=0 TO E
340 IF A(I)>0 LET W=1
350 NEXT I
360 IF W=0 AND A(1)=1 THEN BEEP 1:PRINT "C=";C:END
370 W=A(1)/2:C=C+1
380 IF W=INT(W) THEN 470
390 R=0
400 FOR I=1 TO E
410 A(I)=A(I)*3+R
420 R=INT(A(I)/1E6):A(I)=A(I)-R*1E6
430 NEXT I
440 IF R>0 LET E=E+1:A(E)=R
450 A(1)=A(1)+1
460 GOTO 320
470 R=0
480 FOR I=E TO 1 STEP -1
490 W=A(I)/2
500 A(I)=INT(W)+R*1E5
510 R=W-INT(W))*10
520 NEXT I
530 IF A(E)=0 THEN E=E-1:GOTO 530
540 GOTO 320
C'est bien ce que je compte faire. Et concernant la multi-précision, mon idée est de le faire en assembleur afin d'optimiser la vitesse. Je compte profiter de l'écran 40col pour faire et afficher très simplement et très directement les calculs
Code : Tout sélectionner
LXI H ,80h ; HL = 80h
LXI B ,0h ; B = 0
MOV L,M ; L = Contenu de la mémoire (80h)
MOV H ,B ; H = 0
loop:MOV A ,H ; On va tester si HL = 1 (càd si on a fini)
CPI 0 ; H = 0 ?
JNZ suite ; Si non, on n'a pas fini
MOV A ,L ; A = L
CPI 1 ; A = 1 ?
JZ fin ; On a fini
suite:INR B ; B = B+1 (temps de vol)
MOV A,L ; On regarde si le nb est impair
ANI 1 ; en faisant L AND 1 (unité de L)
JNZ impair ; Si le résultat n'est pas nul, le nb est impair
MOV A,L ; Il s'agit de diviser la valeur de HL par 2, si vous trouvez mieux dites-le moi !
ANI feh ; Je supprime l'unité de L (par ex: 11110011 debient 11110010) en fas
MOV L,A ; L = A
XRI 0 ; Je remets le drapeau des retenues à 0
MOV A ,H ; A = H
RAR ; Décalage d'un bit vers la droite (donc division par 2 de la valeur) ET en même temps l'unité va dans le drapeau des retenues
MOV H,A ; H = A
MOV A,L ; A = L
ACI 0 ; A = A + valeur du drapeau des retenues (donc si H se terminait par un "1", on le récupère dans l'unité de L)
RRC ; Rotation de tous les bits de L vers la droite, donc l'unité se retrouve à gauche ! (mon astuce est là)
MOV L,A ; L = A
JMP loop
impair:PUSH H ; Il faut faire *3 + 1 pour ça ajoutons HL dans la pile
POP D ; on récupère la valeur dans la paire DE (donc DE = HL)
DAD H ; HL = HL + HL
DAD D ; HL = HL + DE soit 3 * le contenu initial de HL
INX H ; +1
JMP loop
fin:LXI H ,81h ; HL = 81h
MOV M,B ; On met le temps de vol à cette adresse
HLT
Code : Tout sélectionner
[33,128,0,1,0,0,110,96,124,254,0,194,20,0,125,254,1,202,53,0,4,125,230,1,194,45,0,125,230,254,111,238,0,124,31,103,125,206,0,15,111,124,195,8,0,229,209,41,25,35,195,8,0,33,129,0,112,118].map((v,k) => MemWrite(k,v))
Je viens d'obtenir le même résultat est en dix fois moins de temps sur mon Commodore C128D avec un petit code en assembleur pour 6502/6510/8502 qui exploite bien le matériel. (449 OCTETS)
Code : Tout sélectionner
:SYR(n)
:Func
:If mod(n,2)=0 Then
: n/2
:Else
: 3n+1
:EndIf
:EndFunc
Code : Tout sélectionner
FnOff
PlotsOff
NewPlot 1,1,x,l,,,,3
NewPlot 2,4,x,,s,,,,1
DispG
Code : Tout sélectionner
:Prgm : ClrDraw : Line x+1,s[x] , x+1, 0
: 1→xmin : PtText "N="&string(n),.8t,.8m : If s[x]=m
: 1→ymin : For x,1,dim(s) : PtText string(m),1+x,m
: t→xmax : Line x ,l[x] , x+1,l[x] : EndFor
: m→ymax : Line x , 0 , x ,s[x] : DispG
: FnOff : Line x ,s[x] , x+1,s[x] :EndPrgm
Bonjour Schraf !Schraf a écrit : ↑16 mars 2020 09:40 Bonjour,
Sur certaines pages de Silicium on m'appelle "le gars" et sur d'autres "le type", vous pouvez aussi m'appeler Eric ou Schraf
Je suis en train de préparer une vidéo sur Syracuse en langage machine pour le ZX81(microprocesseur Z80A) et en discutant sur http://www.silicium.org/forum/viewtopic ... 65&t=45035 d'autres avaient dans l'idée de le programmer pour des processeurs différents. Comme j'avais fait 2 vidéos sur l'Altair 8800 (https://youtu.be/0tIUWQEq0-0 et https://youtu.be/GVICaX8MWIo) je me suis dit qu'il fallait aussi que je le tente pour cette mémorable machine. Bref, ça marche ! Le programme ne donne pour le moment que le temps de vol (et pas l'altitude max) mais bon.