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