!--------------------------------------------------
!- HANOI-10 venerdì 14 agosto 2026 10:12:44
!- Import of : HANOI-10.PRG
!- From Disk : c:\users\alessandro\documents\d64\hanoi-tower.d64
!- Commodore 64
!--------------------------------------------------
10 rem ***************     la torre di hanoy        ***************
40 rem ***************   by alessandro scola 2024   ***************
70 rem ***************   www.alessandroscola.com    ***************
100 poke 53280,15:poke 53281,0:poke 646,1:rem colore sfondo,bordo scritte
130 poke 53269,0:rem spegne tutti gli sprites eventualmente visibili
160 rem *************************************************************************
190 rem *************************    variabili    *******************************
220 rem dm        :numero dichi massimi che il programma gestisce
250 rem d         :numero dischi scelti dal giocatore per la partita
280 rem mm       :numero mosse minime per vincere = 2^d-1
310 rem p1       :peso disco in alto su piolo 1
340 rem p2       :peso disco in alto su piolo 2
370 rem p3       :peso disco in alto su piolo 3
391 if(j and 16)=0 and pc=2 and pi=2 then pi=0:rem deseleziono p2   
400 rem p1(dm)   :situazione pesi dischi su piolo 1
430 rem p2(dm)   :situazione pesi dischi su piolo 2
460 rem p3(dm)   :situazione pesi dischi su piolo 3
490 rem q1,q2,q3 :numero dischi presenti su ogni piolo
520 rem x1,x2,x3 :coordinate x degli sprites su ogni piolo
550 rem y0       :coordinata y minima sprites (il punto piu in alto)
580 rem y9       :coordinata y massima sprites (il punto piu in basso)
610 rem ad       :altezza sprite di un singolo disco in pixels
640 rem sn       :sprite number
670 rem sp       :stack pointer (per la soluzione ricorsiva)
700 rem v        :registro del vic di partenza per gestion sprites
730 rem b        :banco memoria di partenza per gli sprite
760 rem ************************************************************************
790 rem ************************************************************************
820 if peek(44)=64 then 1090
850 print "{clear}attenzione!!"
880 print "{down}per eseguire questo programma"
910 print "devi prima eseguire il seguente comando:"
940 print "{down}{red}poke 43,1:poke 44,64:poke 16384,0{down*2}"
970 print "{white}poi ricarica il programma da disco"
1000 print "con ,8 e non con ,8,1{space*3}!! "
1030 print "{down}alla fine eseguilo con il comando run"
1060 end
1090 dm=8:rem fino a 8 dischi massimo
1120 dim p1(dm):rem stato presenza dei pioli su piolo 1, da 1 a 7
1150 dim p2(dm):rem stato presenza dei pioli su piolo 2, da 1 a 7
1180 dim p3(dm):rem stato presenza dei pioli su piolo 3, da 1 a 7
1210 x1=76:x2=156:x3=236:rem coordinate x degli sprites su pioli
1240 y0=60:rem y mimina (punto piu in alto quando muovo disco)
1270 y9=168:rem y massima (coord y pputno di appoggio dei dischi al piano)
1300 ad=12:rem altezza disco in pixels(sprite espanso =6 x 2 = 12)
1330 v=53248:rem registro del vic di partenza per gestion sprites
1360 print "{clear}"spc(9)"{down*3}{red}la{space*2}torre{space*2}di{space*2}hanoi"
1390 print spc(6)"{down*4}{cyan}by alessandro scola (c)2024"
1420 print spc(8)"{white}www.alessandroscola.com"
1450 print spc(6)"{down*2}{blue}gioca alla torre di hanoi"
1480 print spc(6)"o{space*2}falla risolvere al tuo"
1510 print spc(6)"commodore 64 con il metodo"
1540 print spc(6)"ricorsivo."
1570 print "{down*4}{yellow}{space*2}inizializzazione sprites, attendi..."
1600 rem ***************************
1630 rem * ridefinisce gli sprites *
1660 rem ***************************
1690 b=245:rem banco memoria di partenza per gli sprite 245
1720 rem legge i data per i dischi che utilizzero
1750 for sn=0 to dm-1
1780 poke 1862,56-sn:rem visualizza conto alla rovescia
1810 poke 2040+sn,b+sn:rem setta banco di memoria per ogni sprite
1840 for i=0 to 62
1870 read a:poke 64*b+(sn*64)+i,a:next i
1900 next sn
1930 print "{yellow}{up}{space*3}premi fire in porta 2 per giocare{space*3}"
1960 if(peek(56320) and 16)=0 goto 2020:rem attente pressione fire
1990 goto 1960
2020 poke 53269,0:poke 53280,15:poke 53281,0:poke 646,1:rem colore sfondo,bordo scritte
2050 d=2:print"{clear}{down*11}{right*9}{green}quanti dischi ? (1-8)"
2080 print "{yellow}{right*11}{down*3}(joystick up/down)"
2110 print"{home}{down*11}{right*31}{space*2}<{up}"
2140 print"{home}{down*10}":print tab(31);d:j=peek(56320)
2170 if(d<=7 and (j and 1)=0) then d=d+1
2200 if(d>=2 and (j and 2)=0) then d=d-1
2230 if(j and 16)=0 then 2320
2260 for i=1 to 25:next i
2290 poke 56320,255:goto 2140
2320 gm$="g":print "{clear}"
2350 poke 56320,255
2380 if(gm$="g") then print"{home}{down*9}{space*11}{yellow}>{reverse on}{space*4}giocare{space*5}{reverse off}<"
2410 if(gm$="g") then print"{home}{down*11}{space*11}{green}>vedere soluzione<"
2440 if(gm$="s") then print"{home}{down*9}{space*11}{green}>{space*4}giocare{space*5}<"
2470 if(gm$="s") then print"{home}{down*11}{space*11}{yellow}>{reverse on}vedere soluzione{reverse off}<"
2500 print "{yellow}{right*11}{down*3}(joystick up/down)"
2530 poke 56320,255:j=peek(56320)
2560 if(gm$="s" and (j and 1)=0) then gm$="g":goto 2350
2590 if(gm$="g" and (j and 2)=0) then gm$="s":goto 2350
2620 if(j and 16)=0 then 2710
2650 for i=1 to 50:next i
2680 goto 2530
2710 rem
2740 rem memorizza in un array lo stato presenza dischi pesati su piolo 1
2770 for i=1 to d:p1(i)=i:next i
2800 p1=1:p2=0:p3=0:rem peso del disco in alto su un dato piolo
2830 q1=d:q2=0:q3=0:rem q1, q2, q3 = quanti dischi ha ciascun piolo
2860 rem posiziona gli sprites dei dischi uno sull'altro su piolo 1
2890 rem disegna la base del gioco
2920 i=0:rem variabile offset resgistri sprites
2950 oc=0: rem offfset colore per saltare il numero 8
2980 for sn=d-1 to 0 step -1:rem setta posizione x e y dischi
3010 poke v+(sn*2),x1:i=i+1:poke v+((sn*2)+1),y9-((i-1)*ad/2)
3040 i=i+1
3070 if (sn+4)=7 then oc=1:rem per saltare il colore giallo
3100 poke 53287+sn,sn+4-oc:rem setta i colori dei dischi
3130 next sn
3160 rem abilita sprites e espandili in larghezza e altezza
3190 va=0:for n=0 to d-1:va=va+(2^n):next
3220 poke 53269,va:rem abilita sprites
3250 poke 53277,va:rem espansione in larghezza
3280 poke 53271,va:rem espansione in altezza
3310 rem *************************************************
3340 rem *************************************************
3370 mm=2^d-1:m=1:rem mm=numero mosse minime x risolvere, m=numero mossa
3400 rem sposta il disco piu in alto dal piolo selezionato
3420 print "{clear}{cyan}si risolve in "+str$(mm)+" mosse.{white}"
3430 poke 646,1:poke 53280,15:print "{home}{cyan}si risolve in "+str$(mm)+" mosse.{white}"
3460 gosub 9730:rem disegna i pioli e la base
3490 if gm$="s" then 10000
3520 rem gm$="g" giocare
3525 pi=0:pf=0:pc=1:rem piolo inizio,fine,corrente
3550 poke 646,1:poke 214,2:sys 58732:print "fai la mossa n."+str$(m)
3580 pi=0:pf=0:rem piolo inizio,fine
3610 if(pc=1) then poke 1872,62:poke1874,60
3640 if(pc=1) then poke 1882,32:poke1884,32
3670 if(pc=1) then poke 1892,32:poke1894,32
3700 if(pc=2) then poke 1872,32:poke1874,32
3730 if(pc=2) then poke 1882,62:poke1884,60
3760 if(pc=2) then poke 1892,32:poke1894,32
3790 if(pc=3) then poke 1872,32:poke1874,32
3820 if(pc=3) then poke 1882,32:poke1884,32
3850 if(pc=3) then poke 1892,62:poke1894,60
3880 j=peek(56320):if(j and 4)=0 and pc>1 then pc=pc-1:rem joy a sinistra
3910 if(j and 8)=0 and pc<3 then pc=pc+1:rem joy a destra
3911 if(j and 16)=0 and pc=1 and pi=0 then pi=1:goto3920:rem seleziono p1
3912 if(j and 16)=0 and pc=1 and pi=1 then pi=0:rem deseleziono p1
3913 if(j and 16)=0 and pc=2 and pi=0 then pi=2:goto3920:rem seleziono p2
3914 if(j and 16)=0 and pc=2 and pi=2 then pi=0:goto3920:rem deseleziono p2
3915 if(j and 16)=0 and pc=3 and pi=0 then pi=3:goto3920:rem seleziono p3
3916 if(j and 16)=0 and pc=3 and pi=3 then pi=0:goto3920:rem deseleziono p3
3917 if(j and 16)=0 and pi<>0 and pc<>pi then pf=pc:goto 4120
3920 if(pi=0) then poke56145,1:poke56155,1:poke56165,1
3921 if(pi=1) then poke56145,4
3922 if(pi=2) then poke56155,4
3923 if(pi=3) then poke56165,4
3940 goto 3610
3970 if a$="f" then 9520
4000 if(pi=0 or pf=0)then 4300
4030 poke 214,4:sys 58732:input "muovi disco a{space*2}piolo # (f=fine)";b$
4060 if b$="f" then 9550
4090 if asc(b$)<49 or asc(b$)>55 then 4300
4120 if pi=1 and pf=2 and q1>0 and (p2=0 or p2>p1) then 4480
4150 if pi=1 and pf=3 and q1>0 and (p3=0 or p3>p1) then 5320
4180 if pi=2 and pf=1 and q2>0 and (p1=0 or p1>p2) then 6130
4210 if pi=2 and pf=3 and q2>0 and (p3=0 or p3>p2) then 6940
4240 if pi=3 and pf=1 and q3>0 and (p1=0 or p1>p3) then 7750
4270 if pi=3 and pf=2 and q3>0 and (p2=0 or p2>p3) then 8560
4300 poke 53280,2:print "{home}{down*5}{right*9}{red}***********************""
4360 PRINT "{right*9}* mossa non possibile *"
4450 FOR I=1 TO 255:NEXT I:FOR I=1 TO 255:NEXT I:GOTO 3430
4480 REM ******************************************
4510 REM * SPOSTAMENTO DISCO DA PIOLO 1 A PIOLO 2 *
4540 REM ******************************************
4570 REM P1 = VALORE DEL DISCO PIU IN ALTO,CHE CORRISPONDE ALLO SPRITES P1-1
4600 FOR Y=PEEK(V+1+(2*(P1-1))) TO Y0 STEP -2
4630 POKE (V+1+(2*(P1-1))),Y:REM SOLLEVO DISCO
4660 NEXT Y
4690 FOR X=PEEK(V+(2*(P1-1))) TO X2 STEP 2
4720 POKE (V+(2*(P1-1))),X:REM SPOSTO DISCO A DX
4750 NEXT X
4780 REM APPOGGIO DISCO:
4810 REM Y1= COORD Y DI PARTENZA  Y2 = COORD Y DI ARRIVO DELLO SPRITE
4840 Y1=PEEK(V+1+(2*(P1-1))):REM ALTRIMENTI Y DI ARRIVO E' APPENA SOPRA DISCO
4870 IF P2=0 THEN Y2=Y9:GOTO 4930
4900 Y2=Y9-(AD*Q2)
4930 FOR Y=Y1 TO Y2 STEP 2
4960 POKE (V+1+(2*(P1-1))),Y
4990 NEXT Y
5020 REM AGGIORNO PESO PILA DI DESTINAZIONE 2
5050 FOR I=Q2+1 TO 1 STEP -1:P2(I)=P2(I-1):NEXT I:REM SCALO IN ALTO I PESI
5080 P2(1)=P1:P2=P1:Q2=Q2+1
5110 REM AGGIORNO PRESENZA DISCHI PILA DI PARTENZA 1
5140 IF Q1>1 THEN:FOR I=1 TO Q1-1:P1(I)=P1(I+1):NEXT I:REM SCALO IN BASSO I PESI
5170 P1(Q1)=0:Q1=Q1-1
5200 IF Q1>=1 THEN P1=P1(1)
5230 IF Q1=0 THEN P1(1)=0:P1=0
5260 IF GM$="g" THEN 9310
5290 RETURN:REM ELSE IF GM$="s"
5320 REM ******************************************
5350 REM * SPOSTAMENTO DISCO DA PIOLO 1 A PIOLO 3 *
5380 REM ******************************************
5410 FOR Y=PEEK(V+1+(2*(P1-1))) TO Y0 STEP -2
5440 POKE (V+1+(2*(P1-1))),Y:REM SOLLEVO DISCO
5470 NEXT Y
5500 FOR X=PEEK(V+(2*(P1-1))) TO X3 STEP 2
5530 POKE (V+(2*(P1-1))),X:REM SPOSTO DISCO A DX
5560 NEXT X
5590 REM APPOGGIO DISCO:
5620 REM Y1= Y DI PARTENZA  Y2 = Y DI ARRIVO
5650 Y1=PEEK(V+1+(2*(P1-1)))
5680 IF P3=0 THEN Y2=Y9:GOTO 5740
5710 Y2=Y9-(AD*Q3):REM ALTRIMENTI Y DI ARRIVO E' APPENA SOPRA DISCO
5740 FOR Y=Y1 TO Y2 STEP 2
5770 POKE (V+1+(2*(P1-1))),Y
5800 NEXT Y
5830 REM AGGIORNO PESO PILA DI DESTINAZIONE 3
5860 FOR I=Q3+1 TO 1 STEP -1:P3(I)=P3(I-1):NEXT I:REM SCALO IN BASSO I PESI
5890 P3(1)=P1:P3=P1:Q3=Q3+1
5920 REM AGGIORNO PRESENZA DISCHI PILA DI PARTENZA 1
5950 IF Q1>1 THEN:FOR I=1 TO Q1-1:P1(I)=P1(I+1):NEXT I:REM SCALO IN ALTO I PESI
5980 P1(Q1)=0:Q1=Q1-1
6010 IF Q1>=1 THEN P1=P1(1)
6040 IF Q1=0 THEN P1(1)=0:P1=0
6070 IF GM$="g" THEN 9310
6100 RETURN:REM ELSE IF GM$="s"
6130 REM *******************************************
6160 REM * SPOSTAMENTO DISCO DA PIOLO 2 A PIOLO 1  *
6190 REM *******************************************
6220 FOR Y=PEEK(V+1+(2*(P2-1))) TO Y0 STEP -2
6250 POKE (V+1+(2*(P2-1))),Y:REM SOLLEVO DISCO
6280 NEXT Y
6310 FOR X=PEEK(V+(2*(P2-1))) TO X1 STEP -2
6340 POKE (V+(2*(P2-1))),X:REM SPOSTO DISCO A SX
6370 NEXT X
6400 REM APPOGGIO DISCO:
6430 REM Y1= COORD Y DI PARTENZA  Y2 = COORD Y DI ARRIVO DELLO SPRITE
6460 Y1=PEEK(V+1+(2*(P2-1))):REM ALTRIMENTI Y DI ARRIVO E' APPENA SOPRA DISCO
6490 IF P1=0 THEN Y2=Y9:GOTO 6550
6520 Y2=Y9-(AD*Q1)
6550 FOR Y=Y1 TO Y2 STEP 2
6580 POKE (V+1+(2*(P2-1))),Y
6610 NEXT Y
6640 REM AGGIORNO PESO PILA DI DESTINAZIONE 1
6670 FOR I=Q1+1 TO 1 STEP -1:P1(I)=P1(I-1):NEXT I:REM SCALO IN BASSO I PESI
6700 P1(1)=P2:P1=P2:Q1=Q1+1
6730 REM AGGIORNO PRESENZA DISCHI PILA DI PARTENZA 2
6760 IF Q2>1 THEN:FOR I=1 TO Q2-1:P2(I)=P2(I+1):NEXT I:REM SCALO IN ALTO I PESI
6790 P2(Q2)=0:Q2=Q2-1
6820 IF Q2>=1 THEN P2=P2(1)
6850 IF Q2=0 THEN P2(1)=0:P2=0
6880 IF GM$="g" THEN 9310
6910 RETURN:REM ELSE IF GM$="s"
6940 REM *******************************************
6970 REM * SPOSTAMENTO DISCO DA PIOLO 2 A PIOLO 3  *
7000 REM *******************************************
7030 FOR Y=PEEK(V+1+(2*(P2-1))) TO Y0 STEP -2
7060 POKE (V+1+(2*(P2-1))),Y:REM SOLLEVO DISCO
7090 NEXT Y
7120 FOR X=PEEK(V+(2*(P2-1))) TO X3 STEP 2
7150 POKE (V+(2*(P2-1))),X:REM SPOSTO DISCO A SX
7180 NEXT X
7210 REM APPOGGIO DISCO:
7240 REM Y1= COORD Y DI PARTENZA  Y2 = COORD Y DI ARRIVO DELLO SPRITE
7270 Y1=PEEK(V+1+(2*(P2-1))):REM ALTRIMENTI Y DI ARRIVO E' APPENA SOPRA DISCO
7300 IF P3=0 THEN Y2=Y9:GOTO 7360
7330 Y2=Y9-(AD*Q3)
7360 FOR Y=Y1 TO Y2 STEP 2
7390 POKE (V+1+(2*(P2-1))),Y
7420 NEXT Y
7450 REM AGGIORNO PESO PILA DI DESTINAZIONE 3
7480 FOR I=Q3+1 TO 1 STEP -1:P3(I)=P3(I-1):NEXT I:REM SCALO IN BASSO I PESI
7510 P3(1)=P2:P3=P2:Q3=Q3+1
7540 REM AGGIORNO PRESENZA DISCHI PILA DI PARTENZA 2
7570 IF Q2>1 THEN:FOR I=1 TO Q2-1:P2(I)=P2(I+1):NEXT I:REM SCALO IN ALTO I PESI
7600 P2(Q2)=0:Q2=Q2-1
7630 IF Q2>=1 THEN P2=P2(1)
7660 IF Q2=0 THEN P2(1)=0:P2=0
7690 IF GM$="g" THEN 9310
7720 RETURN:REM ELSE IF GM$="s"
7750 REM ******************************************
7780 REM * SPOSTAMENTO DISCO DA PIOLO 3 A PIOLO 1 *
7810 REM ******************************************
7840 FOR Y=PEEK(V+1+(2*(P3-1))) TO Y0 STEP -2
7870 POKE (V+1+(2*(P3-1))),Y:REM SOLLEVO DISCO
7900 NEXT Y
7930 FOR X=PEEK(V+(2*(P3-1))) TO X1 STEP -2
7960 POKE (V+(2*(P3-1))),X:REM SPOSTO DISCO A DX
7990 NEXT X
8020 REM APPOGGIO DISCO:
8050 REM Y1= Y DI PARTENZA  Y2 = Y DI ARRIVO
8080 Y1=PEEK(V+1+(2*(P3-1)))
8110 IF P1=0 THEN Y2=Y9:GOTO 8170
8140 Y2=Y9-(AD*Q1):REM ALTRIMENTI Y DI ARRIVO E' APPENA SOPRA DISCO
8170 FOR Y=Y1 TO Y2 STEP 2
8200 POKE (V+1+(2*(P3-1))),Y
8230 NEXT Y
8260 REM AGGIORNO PESO PILA DI DESTINAZIONE 1
8290 FOR I=Q1+1 TO 1 STEP -1:P1(I)=P1(I-1):NEXT I:REM SCALO IN BASSO I PESI
8320 P1(1)=P3:P1=P3:Q1=Q1+1
8350 REM AGGIORNO PRESENZA DISCHI PILA DI PARTENZA 3
8380 IF Q3>1 THEN:FOR I=1 TO Q3-1:P3(I)=P3(I+1):NEXT I:REM SCALO IN ALTO I PESI
8410 P3(Q3)=0:Q3=Q3-1
8440 IF Q3>=1 THEN P3=P3(1)
8470 IF Q3=0 THEN P3(1)=0:P3=0
8500 IF GM$="g" THEN 9310
8530 RETURN:REM ELSE IF GM$="s"
8560 REM ******************************************
8590 REM * SPOSTAMENTO DISCO DA PIOLO 3 A PIOLO 2 *
8620 REM ******************************************
8650 FOR Y=PEEK(V+1+(2*(P3-1))) TO Y0 STEP -2
8680 POKE (V+1+(2*(P3-1))),Y:REM SOLLEVO DISCO
8710 NEXT Y
8740 FOR X=PEEK(V+(2*(P3-1))) TO X2 STEP -2
8770 POKE (V+(2*(P3-1))),X:REM SPOSTO DISCO A SX
8800 NEXT X
8830 REM APPOGGIO DISCO:
8860 REM Y1= Y DI PARTENZA  Y2 = Y DI ARRIVO
8890 Y1=PEEK(V+1+(2*(P3-1)))
8920 IF P2=0 THEN Y2=Y9:GOTO 8980
8950 Y2=Y9-(AD*Q2):REM ALTRIMENTI Y DI ARRIVO E' APPENA SOPRA DISCO
8980 FOR Y=Y1 TO Y2 STEP 2
9010 POKE (V+1+(2*(P3-1))),Y
9040 NEXT Y
9070 REM AGGIORNO PESO PILA DI DESTINAZIONE 2
9100 FOR I=Q2+1 TO 1 STEP -1:P2(I)=P2(I-1):NEXT I:REM SCALO IN BASSO I PESI
9130 P2(1)=P3:P2=P3:Q2=Q2+1
9160 REM AGGIORNO PRESENZA DISCHI PILA DI PARTENZA 3
9190 IF Q3>1 THEN:FOR I=1 TO Q3-1:P3(I)=P3(I+1):NEXT I:REM SCALO IN ALTO I PESI
9220 P3(Q3)=0:Q3=Q3-1
9250 IF Q3>=1 THEN P3=P3(1)
9280 IF Q3=0 THEN P3(1)=0:P3=0
9310 IF GM$="s" THEN RETURN
9340 REM DEBUG
9370 IF Q3<>D THEN 9640:REM HO FINITO IL GIOCO (Q3=D ?)
9400 PRINT"{clear}":GOSUB 9730:POKE 646,5:POKE 53280,5
9430 PRINT"{up*24}{down}{space*3}complimenti,hai risolto il gioco!"
9460 IF(M=MM) THEN PRINT "{space*3}nel numero minimo di mosse ("STR$(MM)")"
9490 POKE 646,1:IF(M<>MM) THEN PRINT "{space*3}hai fatto"STR$(M)" mosse su"STR$(MM)" previste"
9520 PRINT "{down*3}"
9550 INPUT "{space*5}vuoi giocare ancora (s/n)";A$:IF A$="" THEN 9550
9580 IF A$="s" THEN 2110
9610 PRINT "{clear}":POKE 53269,0:END
9640 M=M+1:REM INCREMENTO MOSSE FATTE
9670 GOTO 3550
9700 REM DISEGNO I PIOLI E LA BASE
9730 PRINT "{down*5}":POKE 646,1
9760 FOR I=1 TO 13
9790 PRINT "{space*9}{reverse on} {reverse off}{space*9}{reverse on} {reverse off}{space*9}{reverse on} "
9820 NEXT I
9850 PRINT "{space*2}{reverse on}{space*36}"
9880 PRINT "{space*2}{reverse on}{space*6}{reverse off} 1 {reverse on}{space*7}{reverse off} 2 {reverse on}{space*7}{reverse off} 3 {reverse on}{space*7}"
9910 PRINT "{space*2}{reverse on}{space*36}"
9940 RETURN
9970 REM ***********************
10000 REM * SOLUZIONE RICORSIVA:*
10030 REM ***********************
10060 N=D:SP=49151:A=1:B=2:C=3:M=0
10090 REM SALVO LE VARIABILI NELLO STACK A PARTIRE DALLA LOCAZIONE 49152:
10120 SP=SP+1:POKE SP,N:SP=SP+1:POKE SP,A:SP=SP+1:POKE SP,B:SP=SP+1:POKE SP,C
10150 GOSUB 10210:REM 1A CHIAMATA  HANOI($N, $A, $B ,$C);
10180 GOTO 9370
10210 IF N>1 THEN 10450:REM RAMO1:E' COME DIRE IF N=1 ESEGUI LE RIGHE SEGUENTI
10240 M=M+1:A$=MID$(STR$(A),2,1):B$=MID$(STR$(C),2,1)
10270 PRINT "{home}{down*2}mossa "STR$(M)": #"A$" -> #"B$:GOSUB 4120
10300 REM RITORNO DALLA RICORSIONE,RIPRISTINO LE VARIABILI DALLO STACK
10330 C=PEEK(SP):SP=SP-1:B=PEEK(SP):SP=SP-1:A=PEEK(SP):SP=SP-1:N=PEEK(SP):SP=SP-1
10360 REM PRINT "ritorno dalla ricorsione ramo 1"
10390 RETURN
10420 REM ELSE (N>1): RAMO 2
10450 N=N-1
10480 REM SALVO LE VARIABILI NELLO STACK:
10510 SP=SP+1:POKE SP,N:SP=SP+1:POKE SP,A:SP=SP+1:POKE SP,B:SP=SP+1:POKE SP,C
10540 X=B:B=C:C=X:REM SCAMBIO B CON C  HANOI($N, $A, $C ,$B);
10570 GOSUB 10210
10600 M=M+1:A$=MID$(STR$(A),2,1):B$=MID$(STR$(C),2,1)
10630 PRINT "{home}{down*2}mossa "STR$(M)": #"A$" -> #"B$:GOSUB 4120
10660 REM SALVO LE VARIABILI NELLO STACK:
10690 SP=SP+1:POKE SP,N:SP=SP+1:POKE SP,A:SP=SP+1:POKE SP,B:SP=SP+1:POKE SP,C
10720 X=A:A=B:B=X:REM SCAMBIO A CON B  HANOI($N, $B, $A ,$C);
10750 GOSUB 10210
10780 REM RITORNO DALLA RICORSIONE,RIPRISTINO LE VARIABILI DALLO STACK
10810 C=PEEK(SP):SP=SP-1:B=PEEK(SP):SP=SP-1:A=PEEK(SP):SP=SP-1:N=PEEK(SP):SP=SP-1
10840 REM PRINT "ritorno dalla ricorsione ramo 2"
10870 RETURN
10900 REM
10930 DATA 0,0,0,0,0,0,0,0,0,0
10960 DATA 0,0,0,0,0,0,0,0,0,0
10990 DATA 0,0,0,0,0,0,0,0,0,0
11020 DATA 0,0,0,0,0,0,0,0,0,0
11050 DATA 0,0,0,0,0,0,247,0,1,231
11080 DATA 128,1,247,128,1,247,128,1,247,128
11110 DATA 0,255,0
11140 REM
11170 DATA 0,0,0,0,0,0,0,0,0,0
11200 DATA 0,0,0,0,0,0,0,0,0,0
11230 DATA 0,0,0,0,0,0,0,0,0,0
11260 DATA 0,0,0,0,0,0,0,0,0,0
11290 DATA 0,0,0,0,0,1,231,128,3,219
11320 DATA 192,3,247,192,3,239,192,3,195,192
11350 DATA 1,255,128
11380 REM
11410 DATA 0,0,0,0,0,0,0,0,0,0
11440 DATA 0,0,0,0,0,0,0,0,0,0
11470 DATA 0,0,0,0,0,0,0,0,0,0
11500 DATA 0,0,0,0,0,0,0,0,0,0
11530 DATA 0,0,0,0,0,3,231,192,7,219
11560 DATA 224,7,247,224,7,219,224,7,231,224
11590 DATA 3,255,192
11620 REM
11650 DATA 0,0,0,0,0,0,0,0,0,0
11680 DATA 0,0,0,0,0,0,0,0,0,0
11710 DATA 0,0,0,0,0,0,0,0,0,0
11740 DATA 0,0,0,0,0,0,0,0,0,0
11770 DATA 0,0,0,0,0,7,247,224,15,239
11800 DATA 240,15,215,240,15,195,240,15,247,240
11830 DATA 7,255,224
11860 REM
11890 DATA 0,0,0,0,0,0,0,0,0,0
11920 DATA 0,0,0,0,0,0,0,0,0,0
11950 DATA 0,0,0,0,0,0,0,0,0,0
11980 DATA 0,0,0,0,0,0,0,0,0,0
12010 DATA 0,0,0,0,0,15,199,240,31,223
12040 DATA 248,31,199,248,31,251,248,31,199,248
12070 DATA 15,255,240
12100 REM
12130 DATA 0,0,0,0,0,0,0,0,0,0
12160 DATA 0,0,0,0,0,0,0,0,0,0
12190 DATA 0,0,0,0,0,0,0,0,0,0
12220 DATA 0,0,0,0,0,0,0,0,0,0
12250 DATA 0,0,0,0,0,31,231,248,63,223
12280 DATA 252,63,199,252,63,219,252,63,231,252
12310 DATA 31,255,248
12340 REM
12370 DATA 0,0,0,0,0,0,0,0,0,0
12400 DATA 0,0,0,0,0,0,0,0,0,0
12430 DATA 0,0,0,0,0,0,0,0,0,0
12460 DATA 0,0,0,0,0,0,0,0,0,0
12490 DATA 0,0,0,0,0,63,195,252,127,251
12520 DATA 254,127,247,254,127,239,254,127,239,254
12550 DATA 63,255,252
12580 REM
12610 DATA 0,0,0,0,0,0,0,0,0,0
12640 DATA 0,0,0,0,0,0,0,0,0,0
12670 DATA 0,0,0,0,0,0,0,0,0,0
12700 DATA 0,0,0,0,0,0,0,0,0,0
12730 DATA 0,0,0,0,0,127,231,254,255,219
12760 DATA 255,255,231,255,255,219,255,255,231,255
12790 DATA 127,255,254
