10 REM ************************
20 REM *    initialisation    *
30 REM ************************
40 MEMORY &7FFF
50 DEFINT a-z
60 RANDOMIZE TIME
70 SYMBOL 255,16,16,16,254,16,16,16,0
80 inv$=CHR$(24)
90 ex$=CHR$(23)+CHR$(1)
100 norm$=CHR$(23)+CHR$(0)
110 POKE &80E6,0:POKE &80E7,0
120 DIM depx(59),depxx(59),depy(59),depyy(59),arx(59),arxx(59),ary(59),aryy(59)
130 DIM px(59,3),py(59,3),pxx(59,3),pyy(59,3)
140 DIM seg(3)
150 PLOT -2,-2,0
160 FOR n=0 TO 160
170 MOVE 2*n,1.25*n
180 DRAW 2*n,399-1.25*n
190 DRAW 639-2*n,399-1.25*n
200 DRAW 639-2*n,1.25*n
210 DRAW 2*n,1.25*n
220 NEXT n
230 MODE 2:INK 0,0:INK 1,26:PEN 1:BORDER 0:PAPER 0
240 PLOT -1,-1,1
250 REM ************************
260 REM *       menu p.p       *
270 REM ************************
280 CLS:a=FRE("")
290 a$="    EDITER    "\
   :b$="   COMPILER   "\
   :C$="    ANIMER    "\
   :d$="  SAUVEGARDE  "
300 MOVE 0,0:DRAW 0,399:DRAW 639,399:DRAW 639,0:DRAW 0,0
310 RESTORE 7020
320 MOVE 130,270:FOR n=1 TO 12:READ x,y:DRAW x,y:NEXT n
330 MOVE 230,280:FOR n=1 TO 8:READ x,y:DRAW x,y:NEXT n
340 MOVE 245,290:FOR n=1 TO 8:READ x,Y:DRAW x,y:NEXT n
350 MOVE 330,370:FOR n=1 TO 7:READ x,y:DRAW x,y:NEXT n
360 MOVE 430,270:FOR n=1 TO 12:READ x,y:DRAW x,y:NEXT n
370 LOCATE 37,12:PRINT inv$;" MENU ";inv$
380 MOVE 285,204:DRAW 338,204:DRAW 338,226:DRAW 285,226:DRAW 285,204
390 MOVE 252,92:DRAW 252,162:DRAW 371,162:DRAW 371,92:DRAW 252,92
400 PRINT inv$;:GOSUB 540:PRINT inv$; 
410 GOSUB 550:GOSUB 560:GOSUB 570 
420 LOCATE 17,24:PRINT "Presser une touche pour selectionner une option!"
430 t$="":ch=1
440 EVERY 25 GOSUB 500
450 t$=INKEY$:IF t$="" THEN GOTO 450
460 a=REMAIN(0)
470 GOSUB 6810
480 FOR n=1 TO 5:ON ch GOSUB 540,550,560,570:FOR tp=1 TO 75:NEXT tp:PRINT inv$;:ON ch GOSUB 540,550,560,570:PRINT inv$;:FOR tp=1 TO 75:NEXT tp,n
490 ON ch GOTO 610,2840,5210,5910
500 ON ch GOSUB 540,550,560,570
510 ch=ch+1:IF ch=5 THEN ch=1
520 PRINT inv$;:ON ch GOSUB 540,550,560,570:PRINT inv$;
530 RETURN
540 LOCATE 33,16:PRINT a$;:RETURN
550 LOCATE 33,17:PRINT b$;:RETURN
560 LOCATE 33,18:PRINT c$;:RETURN
570 LOCATE 33,19:PRINT d$;:RETURN
580 REM ***********************
590 REM *       editeur       *
600 REM ***********************
610 CLS
620 ima=0: tr=1:xi=320:yi=200:dep=1:px(seg(0),0)=320: py(seg(0),0)=200: compil=0:imin=0:imfi=0
630 a$=" Image "\
   :b$=" Tracer "\
   :c$=" Corriger "\
   :d$=" Options "\
   :e$=" Menu "\
   :f$=" Annulation "\
   :f1$=f$+"   "\
   :f2$=f$+" "\
   :f3$=f$+"     "\
   :g$=" Image 0    "\
   :h$=" Image 1    "\
   :i$=" Image 2    "\
   :j$=" Image 3    "
   640 k$=" Deplacement   "\
      :l$=" Ligne a ligne "\
      :m$=" Ligne brisee  "\
      :n$=" Effacer         "\
      :o$=" Dernier segment "\
      :q$=" Symetrie Ox "\
      :r$=" Symetrie Oy "\
      :s$=" Symetrie O  "\
      :u$=" Retour Menu "
650 LOCATE 1,1:PRINT inv$;"   ";a$;"        ";b$;"         ";c$;"        ";d$;"        ";e$;"   "
660 LOCATE 1,25:PRINT"   ";g$;"   ";k$;"           Segment             x=    y=       ";inv$;
670 GOSUB 6830
680 PRINT ex$;:TAG
690 GOSUB 2620
700 GOSUB 2690
710 x=320:y=200:GOSUB 2710:GOSUB 2730:GOSUB 2750
720 PLOT 320,200
730 IF INKEY(35)=0 OR INKEY(35)=32 THEN GOSUB 6850:GOTO 1160
740 IF INKEY(51)=0 OR INKEY(51)=32 THEN GOSUB 6850:GOTO 1450
750 IF INKEY(62)=0 OR INKEY(62)=32 THEN GOSUB 6850:GOTO 1690
760 IF INKEY(34)=0 OR INKEY(34)=32 THEN GOSUB 6850:GOTO 2030
770 IF INKEY(38)=0 OR INKEY(34)=32 THEN GOSUB 6850:GOTO 2430
780 IF INKEY(47)=0 OR INKEY(47)=32 THEN GOSUB 6850:GOTO 970
790 IF INKEY(1)=0 THEN GOSUB 2710:x=x+1:GOSUB 880:GOSUB 2710:GOSUB 2730:GOTO 730
800 IF INKEY(8)=0 THEN GOSUB 2710:x=x-1:GOSUB 900:GOSUB 2710:GOSUB 2730:GOTO 730
810 IF INKEY(0)=0 THEN GOSUB 2710:y=y+2:GOSUB 920:GOSUB 2710:GOSUB 2750:GOTO 730
820 IF INKEY(2)=0 THEN GOSUB 2710:y=y-2:GOSUB 940:GOSUB 2710:GOSUB 2750:GOTO 730
830 IF INKEY(1)=32 THEN GOSUB 2710:x=x+10:GOSUB 880:GOSUB 2710:GOSUB 2730:GOTO 730
840 IF INKEY(8)=32 THEN GOSUB 2710:x=x-10:GOSUB 900:GOSUB 2710:GOSUB 2730:GOTO 730
850 IF INKEY(0)=32 THEN GOSUB 2710:y=y+10:GOSUB 920:GOSUB 2710:GOSUB 2750:GOTO 730
860 IF INKEY(2)=32 THEN GOSUB 2710:y=y-10:GOSUB 940:GOSUB 2710:GOSUB 2750:GOTO 730
870 GOTO 730
880 IF x>631 THEN x=631
890 RETURN
900 IF x<8 THEN x=8
910 RETURN
920 IF y>366 THEN y=366
930 RETURN
940 IF y<32 THEN y=32
950 RETURN
960 REM ***** graphisme *****
970 IF seg(ima)>=59 THEN TAGOFF:PRINT CHR$(7);:TAG:GOTO 730
980 GOSUB 2710
990 TAGOFF:PRINT norm$;
1000 ON tr GOSUB 1040,1080,1100
1010 TAGOFF:PRINT ex$;:TAG
1020 GOSUB 2710
1030 GOTO 730
1040 dep=1:PLOT -1,-1,0:PLOT xi,yi
1050 PLOT -1,-1,1:xi=x:yi=y:PLOT xi,yi
1060 px(seg(ima),ima)=x:py(seg(ima),ima)=y
1070 RETURN
1080 IF dep=0 THEN GOSUB 1040 ELSE GOSUB 1100
1090 RETURN
1100 dep=0:MOVE xi,yi:DRAW x,y:xi=x:yi=y
1110 px(seg(ima)+1,ima)=x:py(seg(ima)+1,ima)=y:pxx(seg(ima),ima)=x:pyy(seg(ima),ima)=y
1120 seg(ima)=seg(ima)+1
1130 GOSUB 2690
1140 RETURN
1150 REM ****** image ******
1160 GOSUB 6810:GOSUB 2710
1170 TAGOFF:PRINT norm$;
1180 LOCATE 4,1:PRINT a$;
1190 wg=2:wd=15:wh=2:wb=9:GOSUB 6870
1200 PRINT inv$;:GOSUB 1270:PRINT inv$;
1210 GOSUB 1280:GOSUB 1290:GOSUB 1300:GOSUB 1310
1220 xvali=0:ch=1:ach=1:xmaxi=5
1230 GOSUB 6930
1240 IF ch<>ach THEN ON ach GOSUB 1270,1280,1290,1300,1310:PRINT inv$;:ON ch GOSUB 1270,1280,1290,1300,1310:PRINT inv$;:ach=ch:GOTO 1230
1250 IF xvali=1 THEN GOTO 1320
1260 GOTO 1230
1270 LOCATE 3,3:PRINT f$;:RETURN
1280 LOCATE 3,5:PRINT g$;:RETURN
1290 LOCATE 3,6:PRINT h$;:RETURN
1300 LOCATE 3,7:PRINT i$;:RETURN
1310 LOCATE 3,8:PRINT j$;:RETURN
1320 IF ch=1 THEN CLS#2:MOVE 7,368:DRAW 632,368:GOTO 1400
1330 ima=ch-2:GOSUB 2770
1340 GOSUB 2690
1350 IF tr<>1 THEN tr=1:st$=k$:GOSUB 2790
1360 x=320:y=200:GOSUB 2730:GOSUB 2750
1370 xi=x:yi=y:px(seg(ima),ima)=x:py(seg(ima),ima)=y
1380 CLS#2:MOVE 7,368:DRAW 632,368:CLS#1
1390 PLOT 320,200:dep=1
1400 PLOT xi,yi:GOSUB 2620
1410 TAGOFF:LOCATE 4,1:PRINT inv$;a$;inv$;
1420 PRINT ex$;:TAG:GOSUB 2710
1430 GOTO 730
1440 REM ***** tracer *****
1450 GOSUB 6810:GOSUB 2710
1460 TAGOFF:PRINT norm$;
1470 LOCATE 19,1:PRINT b$;
1480 wg=15:wd=31:wh=2:wb=8:GOSUB 6870
1490 xvali=0:ch=1:ach=1:xmaxi=4
1500 PRINT inv$;:GOSUB 1560:PRINT inv$;
1510 GOSUB 1570:GOSUB 1580:GOSUB 1590
1520 GOSUB 6930
1530 IF ch<>ach THEN ON ach GOSUB 1560,1570,1580,1590:PRINT inv$;:ON ch GOSUB 1560,1570,1580,1590:PRINT inv$;:ach=ch:GOTO 1520
1540 IF xvali=1 THEN GOTO 1600
1550 GOTO 1520
1560 LOCATE 16,3:PRINT f1$;:RETURN
1570 LOCATE 16,5:PRINT k$;:RETURN
1580 LOCATE 16,6:PRINT l$;:RETURN
1590 LOCATE 16,7:PRINT m$;:RETURN
1600 IF ch=1 THEN GOTO 1630
1610 tr=ch-1:IF tr=1 THEN st$=k$ ELSE IF tr=2 THEN st$=l$ ELSE st$=m$
1620 GOSUB 2790
1630 CLS#2:MOVE 7,368:DRAW 632,368
1640 PLOT xi,yi:GOSUB 2620
1650 TAGOFF:LOCATE 19,1:PRINT inv$;b$;inv$;
1660 PRINT ex$;:TAG:GOSUB 2710
1670 GOTO 730
1680 REM ***** corriger *****
1690 IF seg(ima)=0 THEN GOTO 730
1700 GOSUB 6810:GOSUB 2710
1710 TAGOFF:PRINT norm$;
1720 LOCATE 36,1:PRINT c$;
1730 wg=32:wd=50:wh=2:wb=7:GOSUB 6870
1740 PRINT inv$;:GOSUB 1810:PRINT inv$;
1750 GOSUB 1820:GOSUB 1830
1760 xvali=0:ch=1:ach=1:xmaxi=3
1770 GOSUB 6930
1780 IF ch<>ach THEN ON ach GOSUB 1810,1820,1830:PRINT inv$;:ON ch GOSUB 1810,1820,1830:PRINT inv$;:ach=ch:GOTO 1770
1790 IF xvali=1 THEN GOTO 1840
1800 GOTO 1770
1810 LOCATE 33,3:PRINT f3$;:RETURN
1820 LOCATE 33,5:PRINT n$;:RETURN
1830 LOCATE 33,6:PRINT o$;:RETURN
1840 CLS#2:MOVE 7,368:DRAW 632,368
1850 IF ch=1 THEN GOTO 1890
1860 ON ch-1 GOSUB 1940,1990
1870 GOSUB 2690
1880 CLS#1
1890 IF dep=1 OR tr=3 OR tr=1 THEN PLOT xi,yi
1900 GOSUB 2620
1910 TAGOFF:LOCATE 36,1:PRINT inv$;c$;inv$;
1920 PRINT ex$;:TAG:GOSUB 2710
1930 GOTO 730
1940 seg(ima)=0
1950 iF tr<>1 THEN tr=1:st$=k$:GOSUB 2790
1960 x=320:y=200:GOSUB 2730:GOSUB 2750
1970 xi=x:yi=y:px(0,ima)=x:py(0,ima)=y
1980 RETURN
1990 seg(ima)=seg(ima)-1
2000 IF tr=3 THEN xi=px(seg(ima),ima):yi=py(seg(ima),ima) ELSE px(seg(ima),ima)=xi:py(seg(ima),ima)=yi
2010 RETURN
2020 REM ***** options *****
2030 IF seg(ima)=0 THEN GOTO 730
2040 GOSUB 6810:GOSUB 2710
2050 TAGOFF:PRINT norm$;
2060 LOCATE 54,1:PRINT d$;
2070 wg=51:wd=65:wh=2:wb=8:GOSUB 6870
2080 PRINT inv$;:GOSUB 2150:PRINT inv$;
2090 GOSUB 2160:GOSUB 2170:GOSUB 2180
2100 xvali=0:ch=1:ach=1:xmaxi=4
2110 GOSUB 6930
2120 IF ch<>ach THEN ON ach GOSUB 2150,2160,2170,2180:PRINT inv$;:ON ch GOSUB 2150,2160,2170,2180:PRINT inv$;:ach=ch:GOTO 2110
2130 IF xvali=1 THEN GOTO 2190
2140 GOTO 2110
2150 LOCATE 52,3:PRINT f2$;:RETURN
2160 LOCATE 52,5:PRINT q$;:RETURN
2170 LOCATE 52,6:PRINT r$;:RETURN
2180 LOCATE 52,7:PRINT s$;:RETURN
2190 CLS#2:MOVE 7,368:DRAW 632,368
2200 IF ch=1 THEN GOTO 2240
2210 CLS#1
2220 ON ch-1 GOSUB 2280,2340,2400
2230 GOSUB 2730:GOSUB 2750
2240 PLOT xi,yi:GOSUB 2620
2250 TAGOFF:LOCATE 54,1:PRINT inv$;d$;inv$;
2260 PRINT ex$;:TAG:GOSUB 2710
2270 GOTO 730
2280 yi=yi+2*(199-yi):py(seg(ima),ima)=yi:y=y+2*(199-y)
2290 FOR n=0 TO seg(ima)-1
2300 py(n,ima)=py(n,ima)+2*(199-py(n,ima))
2310 pyy(n,ima)=pyy(n,ima)+2*(199-pyy(n,ima))
2320 NEXT n
2330 RETURN
2340 xi=xi+2*(319.5-xi):px(seg(ima),ima)=xi:x=x+2*(319.5-x)
2350 FOR n=0 TO seg(ima)-1
2360 px(n,ima)=px(n,ima)+2*(319.5-px(n,ima))
2370 pxx(n,ima)=pxx(n,ima)+2*(319.5-pxx(n,ima))
2380 NEXT n
2390 RETURN
2400 GOSUB 2280:GOSUB 2340
2410 RETURN
2420 REM ***** menu *****
2430 GOSUB 6810:GOSUB 2710
2440 TAGOFF:PRINT norm$;
2450 LOCATE 71,1:PRINT e$,
2460 wg=65:wd=79:wh=2:wb=6:GOSUB 6870
2470 PRINT inv$;:GOSUB 2540:PRINT inv$;
2480 GOSUB 2550
2490 xvali=0:ch=1:ach=1:xmaxi=2
2500 GOSUB 6930
2510 IF ch<>ach THEN ON ach GOSUB 2540,2550:PRINT inv$;:ON ch GOSUB 2540,2550:PRINT inv$;:ach=ch:GOTO 2500
2520 IF xvali=1 THEN GOTO 2560
2530 GOTO 2500
2540 LOCATE 66,3:PRINT f2$;:RETURN
2550 LOCATE 66,5:PRINT u$;:RETURN
2560 IF ch=2 THEN PRINT norm$;:GOSUB 6850:GOTO 280
2570 CLS#2:MOVE 7,368:DRAW 632,368
2580 PLOT xi,yi:GOSUB 2620
2590 TAGOFF:LOCATE 71,1:PRINT inv$;e$;inv$;
2600 PRINT ex$:TAG:GOSUB 2710
2610 GOTO 730
2620 IF seg(ima)=0 THEN RETURN
2630 TAGOFF:PRINT norm$;:TAG
2640 FOR n=0 TO seg(ima)-1
2650 MOVE px(n,ima),py(n,ima) :DRAW pxx(n,ima),pyy(n,ima)
2660 NEXT n
2670 TAGOFF:PRINT ex$;:TAG
2680 RETURN
2690 TAGOFF:LOCATE 53,25:PRINT inv$;:PRINT USING"##";seg(ima);:PRINT inv$;:TAG
2700 RETURN
2710 MOVE x-3,y+6:PRINT CHR$(255);
2720 RETURN
2730 TAGOFF:LOCATE 67,25:PRINT inv$;:PRINT USING"###";x;:PRINT inv$;:TAG
2740 RETURN
2750 TAGOFF:LOCATE 73,25:PRINT inv$;:PRINT USING"###";y;:PRINT inv$;:TAG
2760 RETURN
2770 TAGOFF:LOCATE 10,25:PRINT inv$;:PRINT ima;:PRINT inv$;:TAG
2780 RETURN
2790 TAGOFF:LOCATE 19,25:PRINT inv$;st$;inv$;:TAG
2800 RETURN
2810 REM **********************
2820 REM *     compilateur    *
2830 REM **********************
2840 CLS
2850 a$=" image Initiale ":b$=" image Finale ":c$=" Pas ":d$=" Compilation ":e$=" Menu ":f$=" Annulation  ":f1$=f$+"     ":f2$=f$+"        ":g$=" Image 0          ":h$=" Image 1          ":i$=" Image 2          ": j$=" Image 3          "
2860 k$=" Points au hasard ":l$=" Point central    ":m$=" Rotation Ox      ":n$=" Rotation Oy      ":o$="Nombre de pas: ":q$=" Retour Menu "
2870 LOCATE 1,1:PRINT inv$;"   ";a$;"     ";b$;"     ";c$;"     ";d$;"     ";e$;"   ";
2880 LOCATE 1,25:PRINT"            \
                                  P\
as:                              ";inv$;
2890 GOSUB 6830
2900 IF ( seg(0) OR seg(1) OR seg(2) OR seg(3) )=0 THEN er=8:GOSUB 4250:GOTO 280
2910 IF compil=1 THEN GOSUB 4570:GOSUB 4600:pas=cpas ELSE pas=10
2920 GOSUB 4710
2930 IF INKEY(35)=0 OR INKEY(35)=32 THEN GOSUB 6850:GOTO 3000
2940 IF INKEY(53)=0 OR INKEY(53)=32 THEN GOSUB 6850:GOTO 3230
2950 IF INKEY(27)=0 OR INKEY(27)=32 THEN GOSUB 6850:GOTO 3480
2960 IF INKEY(62)=0 OR INKEY(62)=32 THEN GOSUB 6850:GOTO 3680
2970 IF INKEY(38)=0 OR INKEY(38)=32 THEN GOSUB 6850:GOTO 4410
2980 GOTO 2930
2990 REM *** image initiale ***
3000 GOSUB 6810
3010 LOCATE 4,1:PRINT a$;
3020 wg=2:wd=21:wh=2:wb=11:GOSUB 6870
3030 PRINT inv$;:GOSUB 3100:PRINT inv$;
3040 GOSUB 3110:GOSUB 3120:GOSUB 3130:GOSUB 3140:GOSUB 3150:GOSUB 3160
3050 xvali=0:ch=1:ach=1:xmaxi=7
3060 GOSUB 6930
3070 IF ch<>ach THEN ON ach GOSUB 3100,3110,3120,3130,3140,3150,3160:PRINT inv$;:ON ch GOSUB 3100,3110,3120,3130,3140,3150,3160:PRINT inv$;:ach=ch:GOTO 3060
3080 IF xvali=1 THEN GOTO 3170
3090 GOTO 3060
3100 LOCATE 3,3:PRINT f1$;:RETURN
3110 LOCATE 3,5:PRINT g$;:RETURN
3120 LOCATE 3,6:PRINT h$;:RETURN
3130 LOCATE 3,7:PRINT i$;:RETURN
3140 LOCATE 3,8:PRINT j$;:RETURN
3150 LOCATE 3,9:PRINT k$;:RETURN
3160 LOCATE 3,10:PRINT l$:RETURN
3170 CLS#2:MOVE 7,368:DRAW 632,368
3180 IF ch=1 THEN GOTO 3200
3190 imin=ch-1:GOSUB 4580
3200 LOCATE 4,1:PRINT inv$;a$;inv$;
3210 GOTO 2930
3220 REM **** image finale ****
3230 GOSUB 6810
3240 LOCATE 25,1:PRINT b$;
3250 wg=22:wd=41:wh=2:wb=13:GOSUB 6870
3260 PRINT inv$;:GOSUB 3330:PRINT inv$;
3270 GOSUB 3340:GOSUB 3350:GOSUB 3360:GOSUB 3370:GOSUB 3380:GOSUB 3390:GOSUB 3400:GOSUB 3410
3280 xvali=0:ch=1:ach=1:xmaxi=9
3290 GOSUB 6930
3300 IF ch<>ach THEN ON ach GOSUB 3330,3340,3350,3360,3370,3380,3390,3400,3410:PRINT inv$;:ON ch GOSUB 3330,3340,3350,3360,3370,3380,3390,3400,3410:PRINT inv$;:ach=ch:GOTO 3290
3310 IF xvali=1 THEN GOTO 3420
3320 GOTO 3290
3330 LOCATE 23,3:PRINT f1$;:RETURN
3340 LOCATE 23,5:PRINT g$;:RETURN
3350 LOCATE 23,6:PRINT h$;:RETURN
3360 LOCATE 23,7:PRINT i$;:RETURN
3370 LOCATE 23,8:PRINT j$;:RETURN
3380 LOCATE 23,9:PRINT k$;:RETURN
3390 LOCATE 23,10:PRINT l$;:RETURN
3400 LOCATE 23,11:PRINT m$;:RETURN
3410 LOCATE 23,12:PRINT n$;:RETURN
3420 CLS#2:MOVE 7,368:DRAW 632,368
3430 IF ch=1 THEN GOTO 3450
3440 imfi=ch-1:GOSUB 4610
3450 LOCATE 25,1:PRINT inv$;b$,inv$;
3460 GOTO 2930
3470 REM ***** pas *****
3480 GOSUB 6810
3490 LOCATE 44,1:PRINT c$;
3500 wg=37:wd=56:wh=2:wb=6:GOSUB 6870
3510 PRINT inv$;:GOSUB 3600:PRINT inv$;
3520 GOSUB 3610
3530 apas=pas:hi=99:lo=1:nb=pas
3540 xvali=0:ch=1:ach=1:xmaxi=2
3550 GOSUB 6930
3560 IF ch<>ach THEN ON ach GOSUB 3600,3610:PRINT inv$;:ON ch GOSUB 3600,3610:PRINT inv$;:ach=ch:GOTO 3550
3570 IF ch=2 THEN GOSUB 6970:pas=nb:LOCATE 53,5:PRINT inv$;:PRINT USING"##";pas;:PRINT" ";:PRINT inv$;
3580 IF xvali=1 THEN GOTO 3620
3590 GOTO 3550
3600 LOCATE 38,3:PRINT f1$;:RETURN 
3610 LOCATE 38,5:PRINT o$;:PRINT USING"##";pas;:PRINT" ";:RETURN
3620 IF ch=1 THEN pas=apas:GOTO 3640
3630 GOSUB 4710
3640 CLS#2:MOVE 7,368:DRAW 632,368
3650 LOCATE 44,1:PRINT inv$;c$;inv$;
3660 GOTO 2930
3670 REM **** compilation ****
3680 GOSUB 6810
3690 LOCATE 54,1:PRINT d$;
3700 GOSUB 4070:IF er<>0 THEN GOSUB 4250:GOTO 4050
3710 GOSUB 4130:IF er<>0 THEN GOSUB 4250:GOTO 4050
3720 CLS#1
3730 compil=1:cimin=imin:cimfi=imfi:cpas=pas
3740 IF imin=5 THEN GOSUB 4760:GOSUB 5080:GOTO 3810
3750 IF imin=6 THEN GOSUB 4760:GOSUB 4970:GOTO 3810
3760 IF imfi=5 THEN GOSUB 4720:GOSUB 5130:GOTO 3810
3770 IF imfi=6 THEN GOSUB 4720:GOSUB 5020:GOTO 3810
3780 IF imfi=7 THEN GOSUB 4720:GOSUB 4890:GOTO 3810
3790 IF imfi=8 THEN GOSUB 4720:GOSUB 4810:GOTO 3810
3800 GOSUB 4720:GOSUB 4760
3810 LOCATE 58,25:PRINT inv$;"Pas en cours:";inv$;
3820 POKE &80E3,seg:POKE &80E2,pas
3830 xtab1=&80FF:xtab2=&88FF:xtab3=&90FF:xtab4=&98FF
3840 FOR i=0 TO pas
3850 POKE &80E1,i
3860 FOR n=0 TO seg-1
3870 POKE &80E0,n+1
3880 coord=depx(n)+i*(arx(n)-depx(n))/pas
3890 POKE xtab1,coord AND 255:xtab1=xtab1+1:POKE xtab1,(coord AND &FF00)/256:xtab1=xtab1+1
3900 coord=depy(n)+i*(ary(n)-depy(n))/pas
3910 POKE xtab2,coord AND 255:xtab2=xtab2+1:POKE xtab2,(coord AND &FF00)/256:xtab2=xtab2+1
3920 coord=depxx(n)+i*(arxx(n)-depxx(n))/pas
3930 POKE xtab3,coord AND 255:xtab3=xtab3+1:POKE xtab3,(coord AND &FF00)/256:xtab3=xtab3+1
3940 coord=depyy(n)+i*(aryy(n)-depyy(n))/pas
3950 POKE xtab4,coord AND 255:xtab4=xtab4+1:POKE xtab4,(coord AND &FF00)/256:xtab4=xtab4+1
3960 LOCATE 71,25:PRINT inv$;:PRINT USING"##";i;:PRINT inv$;
3970 CALL &8074
3980 t$=INKEY$:IF t$<>"" THEN GOSUB 4200
3990 NEXT n,i
4000 IF compil=0 THEN GOTO 4030
4010 LOCATE 58,25:PRINT inv$;"Compilation terminee";inv$;
4020 FOR tp=1 TO 3000:NEXT tp
4030 CLS#1
4040 LOCATE 58,25:PRINT inv$;"     \
               ";inv$;
4050 LOCATE 54,1:PRINT inv$;d$;inv$;
4060 GOTO 2930
4070 IF imin=0 THEN er=1:RETURN
4080 IF imfi=0 THEN er=2:RETURN
4090 IF (imin>4 AND imfi>4) THEN er=3:RETURN
4100 IF imin<5 THEN seg=seg(imin-1) ELSE seg=seg(imfi-1)
4110 er=0
4120 RETURN
4130 IF imin=imfi THEN er=4:RETURN
4140 IF imin<5 THEN IF seg(imin-1)=0 THEN er=6:RETURN
4150 IF imfi<5 THEN IF seg(imfi-1)=0 THEN er=7:RETURN
4160 IF (imin<5 AND imfi<5) THEN IF seg(imin-1)<>seg(imfi-1) THEN er=5:RETURN
4170 IF (pas+1)*seg*2>2048 THEN er=9:RETURN
4180 er=0
4190 RETURN
4200 LOCATE 58,25:PRINT inv$;"Interruption ? (O/N)";inv$;
4210 GOSUB 6850
4220 IF INKEY(34)=0 OR INKEY(34)=32 THEN LOCATE 58,25:compil=0:n=seg-1:i=pas:RETURN
4230 IF INKEY(46)=0 OR INKEY(46)=32 THEN LOCATE 58,25:PRINT inv$;"Pas en cours:";:PRINT USING"##";i;:PRINT"     ";inv$;:GOSUB 6850:RETURN
4240 GOTO 4220
4250 PRINT CHR$(7);
4260 MOVE 179,244:DRAW 460,244:DRAW 460,170:DRAW 179,170:DRAW 179,244
4270 LOCATE 24,11:PRINT inv$;"     Compilation inpossible !     ";inv$;
4280 ON er GOSUB 4310,4320,4330,4340,4350,4360,4370,4380,4390
4290 FOR tp=1 TO 5000:NEXT tp:CLS#1
4300 RETURN
4310 LOCATE 28,13:PRINT"Image initiale non defini.";:RETURN
4320 LOCATE 29,13:PRINT"Image finale non defini.";:RETURN
4330 LOCATE 32,13:PRINT"Image non utilisee";:RETURN
4340 LOCATE 32,13:PRINT"Images identiques ";:RETURN
4350 LOCATE 27,13:PRINT"Nombre de segments different";:RETURN
4360 LOCATE 29,13:PRINT"Image initiale non creee ";:RETURN
4370 LOCATE 30,13:PRINT"Image finale non creee";:RETURN
4380 LOCATE 33,13:PRINT"Image non creee";:RETURN
4390 LOCATE 29,13:PRINT"Nombre de pas trop grand";:RETURN
4400 REM ***** menu *****
4410 GOSUB 6810
4420 LOCATE 72,1:PRINT e$;
4430 wg=65:wd=79:wh=2:wb=6:GOSUB 6870
4440 PRINT inv$;:GOSUB 4510:PRINT inv$;
4450 GOSUB 4520
4460 xvali=0:ch=1:ach=1:xmaxi=2
4470 GOSUB 6930
4480 IF ch<>ach THEN ON ach GOSUB 4510,4520:PRINT inv$;:ON ch GOSUB 4510,4520:PRINT inv$;:ach=ch:GOTO 4470
4490 IF xvali=1 THEN GOTO 4530
4500 GOTO 4470
4510 LOCATE 66,3:PRINT f$;:RETURN
4520 LOCATE 66,5:PRINT q$;:RETURN
4530 IF ch=2 THEN GOSUB 6850:GOTO 280
4540 CLS#2:MOVE 7,368:DRAW 632,368
4550 LOCATE 72,1:PRINT inv$;e$;inv$;
4560 GOTO 2930
4570 ON cimin GOSUB 4630,4640,4650,4660,4670,4680
4580 ON imin GOSUB 4630,4640,4650,4660,4670 4680
4590 LOCATE 4,25:PRINT inv$;st$;inv$; :RETURN
4600 ON cimfi GOSUB 4630,4640,4650,4660,4670,4680,4690,4700
4610 ON imfi GOSUB 4630,4640,4650,4660,4670,4680,4690,4700
4620 LOCATE 25,25:PRINT inv$;st$;inv$;:RETURN
4630 st$=g$:RETURN
4640 st$=h$:RETURN
4650 st$=i$:RETURN
4660 st$=j$:RETURN
4670 st$=k$:RETURN
4680 st$=l$:RETURN
4690 st$=m$:RETURN
4700 st$=n$:RETURN
4710 LOCATE 51,25:PRINT inv$;:PRINT USING"##";pas;:PRINT inv$;:RETURN
4720 FOR n=0 TO seg-1
4730 depx(n)=px(n,imin-1):depy(n)=py(n,imin-1)
4740 depxx(n)=pxx(n,imin-1):depyy(n)=pyy(n,imin-1)
4750 NEXT n:RETURN
4760 FOR n=0 TO seg-1
4770 arx(n)=px(n,imfi-1):ary(n)=py(n,imfi-1)
4780 arxx(n)=pxx(n,imfi-1):aryy(n)=pyy(n,imfi-1)
4790 NEXT n:RETURN
4800 REM ***** rotation Oy *****
4810 FOR n=0 TO seg-1
4820 arx(n)=depx(n)+2*(319.5-depx(n))
4830 arxx(n)=depxx(n)+2*(319.5-depxx(n))
4840 ary(n)=depy(n)
4850 aryy(n)=depyy(n)
4860 NEXT n
4870 RETURN
4880 REM ***** rotation Ox *****
4890 FOR n=0 TO seg-1
4900 arx(n)=depx(n)
4910 arxx(n)=depxx(n)
4920 ary(n)=depy(n)+2*(199-depy(n))
4930 aryy(n)=depyy(n)+2*(199-depyy(n))
4940 NEXT n
4950 RETURN
4960 REM ***** image point ******
4970 FOR n=0 TO seg-1
4980 depx(n)=320:depy(n)=200
4990 depxx(n)=320:depyy(n)=200
5000 NEXT n
5010 RETURN
5020 FOR n=0 TO seg-1
5030 arx(n)=320:ary(n)=200
5040 arxx(n)=320:aryy(n)=200
5050 NEXT n
5060 RETURN
5070 REM **** pts au hasard ****
5080 FOR n=0 TO seg-1
5090 depx(n)=RND*623+8:depy(n)=RND*334+32
5100 depxx(n)=depx(n):depyy(n)=depy(n)
5110 NEXT n
5120 RETURN
5130 FOR n=0 TO seg-1
5140 arx(n)=RND*623+8:ary(n)=RND*334+32
5150 arxx(n)=arx(n):aryy(n)=ary(n)
5160 NEXT n
5170 RETURN
5180 REM **********************
5190 REM *      animation     *
5200 REM **********************
5210 CLS
5220 a$=" Pause ":b$=" Menu ":c$=" Animation ":d$=" Annulation ":d1$=d$+" ":d2$=d$+"       ":e$=" Temps de pause:":f$=" Retour Menu "
5230 LOCATE 1,1:PRINT inv$;"              ";a$;"              ";c$;"              ";b$;"              ";
5240 LOCATE 1,25:PRINT"            \
                                  P\
as:       Pause:                 ";inv$;
5250 GOSUB 6830
5260 IF compil=0 THEN GOSUB 5820:GOTO 280
5270 GOSUB 4570:GOSUB 4600:GOSUB 4710:GOSUB 5530
5280 IF INKEY(27)=0 OR INKEY(27)=32 THEN GOSUB 6850:GOTO 5330
5290 IF INKEY(69)=0 OR INKEY(69)=32 THEN GOSUB 6850:GOTO 5560
5300 IF INKEY(38)=0 OR INKEY(38)=32 THEN GOSUB 6850:GOTO 5660
5310 GOTO 5280
5320 REM ***** pause *****
5330 GOSUB 6810
5340 LOCATE 15,1:PRINT a$;
5350 wg=8:wd=28:wh=2:wb=6:GOSUB 6870
5360 PRINT Inv$;:GOSUB 5450:PRINT Inv$;
5370 GOSUB 5460
5380 apause=pause:hi=99:lo=0:nb=pause
5390 xvali=0:ch=1:ach=1:xmaxi=2
5400 GOSUB 6930
5410 IF ch<>ach THEN ON ach GOSUB 5450,5460:PRINT inv$;:ON ch GOSUB 5450,5460:PRINT Inv$;:ach=ch:GOTO 5400
5420 IF ch=2 THEN GOSUB 6970:pause=nb:LOCATE 25,5:PRINT inv$;:PRINT USING"##";pause;:PRINT" ";:PRINT inv$;
5430 IF xvali=1 THEN GOTO 5470
5440 GOTO 5400
5450 LOCATE 9,3:PRINT d2$;:RETURN
5460 LOCATE 9,5:PRINT e$;:PRINT USING"##";pause;:PRINT" ";:RETURN
5470 IF ch=1 THEN pause=apause:GOTO 5500
5480 GOSUB 5530
5490 POKE &80E6,(pause*65535/199) AND 255:POKE &80E7,((pause*65535/199) AND &FF00)/256
5500 CLS#2:MOVE 7,368:DRAW 632,368
5510 LOCATE 15,1:PRINT inv$;a$;inv$;
5520 GOTO 5280
5530 LOCATE 64,25:PRINT inv$;:PRINT USING"##";pause;:PRINT inv$;
5540 RETURN
5550 REM ***** animation *****
5560 GOSUB 6810
5570 LOCATE 36,1:PRINT c$;
5580 POKE &80E1,0
5590 CALL &8000
5600 FOR tp=1 TO 500:NEXT tp:t$=INKEY$:IF t$="" THEN GOTO 5580
5610 LOCATE 36,1:PRINT inv$;c$;inv$;
5620 GOSUB 6850
5630 CLS#1
5640 GOTO 5280
5650 REM ***** Menu *****
5660 GOSUB 6810
5670 LOCATE 60,1:PRINT b$;
5680 wg=56:wd=70:wh=2:wb=6:GOSUB 6870
5690 PRINT inv$;:GOSUB 5760:PRINT inv$;
5700 GOSUB 5770
5710 xvali=0:ch=1:ach=1:xmaxi=2
5720 GOSUB 6930
5730 IF ch<>ach THEN ON ach GOSUB 5760,5770:PRINT Inv$;:ON ch GOSUB 5760,5770:PRINT Inv$;:ach=ch:GOTO 5720
5740 IF xvali=1 THEN GOTO 5780
5750 GOTO 5720
5760 LOCATE 57,3:PRINT d1$;:RETURN
5770 LOCATE 57,5:PRINT f$;:RETURN
5780 IF ch=2 THEN GOSUB 6850:GOTO 280
5790 CLS#2:MOVE 7,368:DRAW 632,368
5800 LOCATE 60,1:PRINT inv$;b$;inv$;
5810 GOTO 5280
5820 PRINT CHR$(7);
5830 MOVE 179,244:DRAW 460,244:DRAW 460,170:DRAW 179,170:DRAW 179,244
5840 LOCATE 24,11:PRINT inv$;"       Animation impossible!      ";inv$;
5850 LOCATE 28,13:PRINT"Compilation non effectuee";
5860 FOR tp=1 TO 5000:NEXT tp:CLS#1
5870 RETURN
5880 REM **********************
5890 REM *     sauvegarde     *
5900 REM **********************
5910 CLS
5920 a$=" Aide ":b$=" Sauvegarde ":c$=" Menu ":d$=" Annulation ":d1$=d$+" ":e$=" Retour Menu "
5930 LOCATE 1,1:PRINT inv$;"              ";a$;"              ";b$;"              ";c$;"              ";
5940 LOCATE 1,25:PRINT"            \
                                  P\
as:       Pause:                 ";inv$;
5950 GOSUB 6830
5960 IF compil=0 THEN GOSUB 6750:GOTO 280
5970 GOSUB 4570:GOSUB 4600:GOSUB 4710:GOSUB 5530
5980 IF INKEY(69)=0 OR INKEY(69)=32 THEN GOSUB 6850:GOTO 6030
5990 IF INKEY(60)=0 OR INKEY(60)=32 THEN GOSUB 6850:GOTO 6330
6000 IF INKEY(38)=0 OR INKEY(38)=32 THEN GOSUB 6850:GOTO 6590
6010 GOTO 5980
6020 REM ***** aide *****
6030 GOSUB 6810
6040 LOCATE 15,1:PRINT a$;
6050 WINDOW#2,18,63,6,20:WINDOW#1,2,79,3,23:PAPER#2,1:CLS#2
6060 MOVE 131,324:DRAW 508,324:DRAW 508,74:DRAW 131,74:DRAW 131,324
6070 PRINT inv$;
6080 LOCATE 19,7:PRINT"UTILISATION DES ANIMATIONS A PARTIR DU BASIC"
6090 LOCATE 19,8:PRINT STRING$(44,208)
6100 LOCATE 24,9:PRINT"Pour la sauvegarde taper:"
6110 LOCATE 29,10:PRINT"MEMORY &7FFF"
6120 LOCATE 29,11:PRINT"SAVE";CHR$(34);"fichier";CHR$(34);",&8000,&20FF,&8000"
6130 LOCATE 24,13:PRINT"Pour le chargement taper:"
6140 LOCATE 29,14:PRINT"MEMORY &7FFF"
6150 LOCATE 29,15:PRINT"LOAD";CHR$(34);"fichier";CHR$ (34)
6160 LOCATE 24,17:PRINT"Pour l'animation taper:"
6170 LOCATE 29,18:PRINT"POKE &80E1,0 (RAZ de l'animation)"
6180 LOCATE 29,19:PRINT"CALL &8000 (Lancer l'animation)"
6190 PRINT inv$;
6200 GOSUB 6850
6210 t$=INKEY$:IF t$="" THEN GOTO 6210
6220 FOR n=0 TO 6 STEP 2
6230 FOR i=0 TO 45
6240 LOCATE 18+i,6+n:PRINT" ";:LOCATE 63-i,20-n:PRINT" ";
6250 NEXT i
6260 FOR i=0 TO 45
6270 LOCATE 63-i,7+n:PRINT" ";:LOCATE 18+i,19-n:PRINT" ";
6280 NEXT i,n
6290 CLS#1
6300 LOCATE 15,1:PRINT  inv$;a$;inv$;
6310 GOTO 5980
6320 REM ***** sauvegarde *****
6330 GOSUB 6810
6340 LOCATE 35,1:PRINT b$;
6350 wg=34:wd=47:wh=2:wb=6:GOSUB 6870
6360 PRINT inv$;:GOSUB 6430:PRINT inv$;
6370 GOSUB 6440
6380 xvali=0:ch=1:ach=1:xmaxi=2
6390 GOSUB 6930
6400 IF ch<>ach THEN ON ach GOSUB 6430,6440:PRINT inv$;:ON ch GOSUB 6430,6440:PRINT inv$;:ach=ch:GOTO 6390
6410 IF xvali=1 THEN GOTO 6450
6420 GOTO 6390
6430 LOCATE 35,3:PRINT d$;:RETURN
6440 LOCATE 35,5:PRINT b$;:RETURN
6450 CLS#2:MOVE 7,368:DRAW 632,368
6460 IF ch=1 THEN GOTO 6560
6470 GOSUB 6550
6480 WINDOW#2,23,58,10,16:WINDOW#1,2,79,3,23:PAPER#2,1:PEN#2,0:CLS#2
6490 MOVE 171,260:DRAW 468,260:DRAW 468,138:DRAW 171,135:DRAW 171,260
6500 LOCATE#2,4,2,INPUT#2,"Nom du fichert";fich$
6510 LOCATE#2,4,4:PRINT#2,"Preparer un support magnetique"
6520 LOCATE#2,4,6:PRINT#2,"puis presser la touche -ENTER-"
6530 t$=INKEY$:IF t$=CHR$(13) THEN GOTO 6540 ELSE 6530
6540 SPEED WRITE 1:SAVE"!"+fich$,b,&8000,&20FF,&8000
6550 CLS#1
6560 LOCATE 35,1:PRINT inv$;b$;inv$;
6570 GOTO 5980
6580 REM ***** Menu *****
6590 GOSUB 6810
6600 LOCATE 61,1:PRINT c$;
6610 wg=57:wd=71:wh=2:wb=6:GOSUB 6870
6620 PRINT inv$;:GOSUB 6690:PRINT inv$;
6630 GOSUB 6700
6640 xvali=0:ch=1:ach=1:xmaxi=2
6650 GOSUB 6930
6660 IF ch<>ach THEN ON ach GOSUB 6690,6700:PRINT inv$;:ON ch GOSUB 6690,6700:PRINT inv$;:ach=ch:GOTO 6650
6670 IF xvali=1 THEN GOTO 6710
6680 GOTO 6650
6690 LOCATE 58,3:PRINT d1$;:RETURN
6700 LOCATE 58,5:PRINT e$;:RETURN
6710 IF ch=2 THEN GOSUB 6850:GOTO 280
6720 CLS#2:MOVE 7,368:DRAW 632,368
6730 LOCATE 61,1:PRINT inv$;c$;inv$;
6740 GOTO 5980
6750 PRINT CHR$(7);
6760 MOVE 179,244:DRAW 460,244:DRAW 460,170:DRAW 179,170:DRAW 179,244
6770 LOCATE 24,11:PRINT inv$;"      Sauvegarde Impossible !     ";inv$;
6780 LOCATE 29,13:PRINT"Compilation non effectuee"
6790 FOR tp=1 TO 5000:NEXT tp:CLS#1
6800 RETURN
6810 SOUND 1,36,5,6,1,1:SOUND 1,48,5,6,1,1
6820 RETURN
6830 MOVE 7,31:DRAW 7,368:DRAW 632,368:DRAW 632,31:DRAW 7,31
6840 RETURN
6850 FOR tp=1 TO 20:t$=INKEY$:NEXT tp
6860 RETURN
6870 WINDOW#2,wg,wd,wh,wb:PAPER#2,0:CLS#2
6880 fg=8*(wg-1)+2:fd=8*wd-3:fh=390-16*(wh-1):fb=408-16*wb
6890 MOVE fg,fh:DRAW fg,fb:DRAW fd,fb:DRAW fd,fh:DRAW fg,fh
6900 MOVE fg,fh-32:DRAW fd,fh-32
6910 WINDOW#1,2,79,3,23
6920 RETURN
6930 IF INKEY(2)=0 OR INKEY(2)=32 THEN ch=ch+1:IF ch>xmaxi THEN ch=xmaxi
6940 IF INKEY(0)=0 OR INKEY(0)=32 THEN ch=ch-1:IF ch<1 THEN ch=1
6950 IF INKEY(47)=0 OR INKEY(47)=32 THEN xvali=1
6960 RETURN
6970 IF INKEY(1)=0 THEN nb=nb+1:IF nb>hi THEN nb=hi
6980 IF INKEY(1)=32 THEN nb=nb+10:IF nb>hi THEN nb=hi
6990 IF INKEY(8)=0 THEN nb=nb-1:IF nb<lo THEN nb=lo
7000 IF INKEY(8)=32 THEN nb-nb-10:IF nb<lo THEN nb=lo
7010 RETURN
7020 DATA 130,370,145,370,170,330,195,370,210,370,210,270,195,270,195,330,170,290,145,330,145,270,130,270
7030 DATA 230,360,240,370,300,370,310,360,310,280,300,270,240,270,230,280
7040 DATA 245,350,250,355,290,355,295,350,295,290,290,285,250,285,245,290
7050 DATA 345,370,370,290,390,370,405,370,380,270,360,270,330,370
7060 DATA 430,370,510,370,510,355,445,355,445,327,500,327,500,312,445,312,445,285,510,285,510,270,430,270
