1 REM Ins{nt av 1789
1 REM Ins{nt av 1789
10 ! -----------------------------------!
20 ! *        H A N O I . B A C         !
30 ! *        =================         !
40 ! * K|r  'Tower of Hanoi' p} sk{rmen !
50 ! * Torbj|rn Alm   ABC-116 831112    !
60 ! * Efter HANOI.C  DECUS C-tape      !
70 ! *                                  !
80 ! -----------------------------------!
85 INTEGER : EXTEND 
90 ; CHR$(12) TAB(25) 'Tornet i HANOI' : ; TAB(25) '=============='
100 ; : INPUT 'Ange antal skivor (max 13): ';N : IF N<1 OR N>13 GOTO 90
105 FOR I=0 TO 2 : Top(I)=22 : NEXT I 
110 H=FNSetup(N)
120 Depth=0
130 H=FNHanoi(N,0,2,1)
140 ; CUR(23,75) 'Done'; : GET A$ : GOTO 90
150 ! ---------------------------------
160 ! FNHanoi(n,a,b,c) Rekursiv rutin
170 ! ---------------------------------
180 DEF FNHanoi(N,A,B,C)
190   IF N=0 RETURN 0
195   Depth=Depth+1 : ; CUR(0,70) Depth '   ';
200   H=FNHanoi(N-1,A,C,B) : H=FNMovering(N,A,B) : H=FNHanoi(N-1,C,B,A)
205   Depth=Depth-1 : ; CUR(0,70) Depth '   ';
210   RETURN 0
220 FNEND 
230 ! ----------------------------------
240 ! * FNSetup(n) Set up discs on stick 1
250 ! ----------------------------------
260 DEF FNSetup(N) LOCAL I
270   I=11 : WHILE I<23 : ; CUR(I,15) '!' CUR(I,40) '!' CUR(I,65) '!'; : I=I+1 : WEND 
280   ; CUR(23,5) STRING$(70,45);
290   I=N : WHILE I>0 : H=H=FNDraw(I,15,Top(0),ASCII('x')) : Top(0)=Top(0)-1 : I=I-1 : WEND 
300   RETURN 0
310 FNEND 
320 ! ----------------------------------
330 ! * FNDraw(Ring,Centre,Y,Ch) 
340 ! * Insert/Delete a ring
350 ! ----------------------------------
360 DEF FNDraw(Ring,Centre,Y,Ch)
370   ; CUR(Y,Centre-Ring) STRING$(Ring,Ch) CUR(Y,Centre+1) STRING$(Ring,Ch);
380   RETURN 0
390 FNEND 
400 ! -----------------------------------
410 ! * FNMovering(Ring,From,To) Move a ring
420 ! -----------------------------------
430 DEF FNMovering(Ring,From,To) LOCAL Fromc,Toc,Fromy,Toy
440   Fromc=15+From*25 : Toc=15+To*25
450   Top(From)=Top(From)+1 : Fromy=Top(From)
460   Toy=Top(To) : Top(To)=Top(To)-1
470   WHILE Fromy<>10 : H=FNDraw(Ring,Fromc,Fromy,ASCII(' '))
480     Fromy=Fromy-1 : H=FNDraw(Ring,Fromc,Fromy,ASCII('x'))
490   WEND 
510   WHILE Fromc