#program TILECUT
#autostart
  10 REM +====================+
  11 REM |    TILE  CUTTER    |
  12 REM |   by J. Waterman   |
  13 REM |   11-14 Jan 2023   |
  14 REM +====================+
  20 RUN AT 3: LAYER 2,1: CLS 
  30 %b=47: %m=46
  40 BANK %b ERASE 0,16383,0
  50 BANK %m ERASE 0,16383,0
  60 %t=173: PALETTE OVER %t
  70 PAPER %t: CLS 
  80 z$="                                "
  90 PROC inputarea()
 100 PROC outputarea()
 110 PAPER %t
 120 PRINT CHR$ 30; CHR$ 5; AT 23,47;"v1.0";
 130 PRINT CHR$ 30; CHR$ 8; CHR$ 29; CHR$ 0; AT 16,0; PAPER 240; INK 255;"          TILE  CUTTER          "
 140 PRINT AT 18,7; PAPER 240;"L"; PAPER %t;"oad an .SL2 file, "; AT 20,3; PAPER 240;"V"; PAPER %t;"iew list of .SL2 files or"; AT 22,8; PAPER 240;"D"; PAPER %t;"raw test tiles?"
 150 REPEAT 
 160 %c=0: i$= INKEY$ 
 170 IF i$="l" OR i$="L" THEN %c=1
 180 IF i$="v" OR i$="V" THEN %c=3
 190 IF i$="d" OR i$="D" THEN %c=2
 200 REPEAT UNTIL %c>0
 210 IF %c=3 THEN PROC viewcat()
 220 IF %c=1 THEN PROC loadsl2()
 230 PRINT AT 17,0;z$;z$;z$;z$;z$;z$;z$;
 240 PRINT CHR$ 30; CHR$ 8; POINT 60,144;"Select tile size:"
 250 PRINT CHR$ 30; CHR$ 8; AT 19,2; PAPER 240;"S"; PAPER %t;"mall (8x8) or "; PAPER 240;"L"; PAPER %t;"arge (16x16)"
 260 REPEAT 
 270 %s=0: i$= INKEY$ 
 280 IF i$="s" OR i$="S" THEN %s=8
 290 IF i$="l" OR i$="L" THEN %s=16
 300 REPEAT UNTIL %s>0
 310 IF %s=8 THEN PRINT AT 19,17; PAPER %t;"L"; PAPER 156; AT 19,2;"Small (8x8)"
 320 IF %s=16 THEN PRINT AT 19,2; PAPER %t;"S"; PAPER 156; AT 19,17;"Large (16x16)"
 330 IF %c+s=10 THEN PROC testtiles8()
 340 IF %c+s=18 THEN PROC testtiles16()
 350 IF %s=8 THEN PROC cut8()
 360 IF %s=16 THEN PROC cut16()
 370 BANK 10 COPY TO %b
 380 TILE BANK %b
 390 %k=%16384/(s*s): %w=%256/s
 400 PROC deftilemap()
 410 TILE DIM %m,0,%w,%s
 420 PRINT POINT 52,184;"TESTING TILE MAP...";: PROC examples()
 430 PRINT AT 17,0;z$;z$;z$;z$;z$;z$;z$; POINT 12,144;"Input file name to save tiles"; AT 19,2;"(or leave blank to not save)"; AT 21,8;"""        "" .BIN"
 440 POKE 23658,8: INPUT OVER 1; AT 21,9; LINE f$: POKE 23658,0
 450 IF LEN f$=0 THEN PRINT AT 21,0;z$; AT 21,7; PAPER 96; INK 240;" TILES NOT SAVED! "
 460 IF LEN f$>8 THEN f$=f$( TO 8)
 470 IF LEN f$>0 THEN PROC savetiles()
 480 PRINT CHR$ 30; CHR$ 8; CHR$ 29; CHR$ 0; AT 23,0;z$; AT 23,0;
 490 STOP 
 500 REM =======================
 510 DEFPROC inputarea()
 520 BANK 9 ERASE 0,16384,0
 530 PAPER 0: INK 255: PRINT CHR$ 30; CHR$ 8; CHR$ 29; CHR$ 0;
 540 FOR %n=0 TO 255 STEP 6: PLOT %n,0: DRAW 2,0: PLOT %n,63: DRAW 2,0: NEXT %n
 550 FOR %n=0 TO 63 STEP 6: PLOT 0,%n: DRAW 0,2: PLOT 255,%n: DRAW 0,2: NEXT %n
 560 PRINT AT 2,6;"     "; AT 3,7;"        "; AT 4,7;"       "; AT 5,6;"        "
 570 PAPER 255: INK 0
 580 ENDPROC 
 590 REM =======================
 600 DEFPROC outputarea()
 610 BANK 10 ERASE 0,16384,2
 620 PAPER 2: INK 22: PRINT CHR$ 30; CHR$ 8; CHR$ 29; CHR$ 0;
 630 FOR %n=0 TO 255 STEP 6: PLOT %n,64: DRAW 2,0: PLOT %n,127: DRAW 2,0: NEXT %n
 640 FOR %n=64 TO 127 STEP 6: PLOT 0,%n: DRAW 0,2: PLOT 255,%n: DRAW 0,2: NEXT %n
 650 PRINT AT 10,5;"      "; AT 11,4;"            "; AT 12,4;"           "; AT 13,5;"            "
 660 PAPER 255: INK 0
 670 ENDPROC 
 680 REM =======================
 690 DEFPROC viewcat()
 700 CLS : CAT "*.SL2" 
 710 PRINT AT 23,0; PAPER 115; INK 255;"     PRESS ENTER TO RESTART     ";
 720 REPEAT : i$= INKEY$ : REPEAT UNTIL i$<>""
 730 RUN 
 740 ENDPROC 
 750 REM =======================
 760 DEFPROC testtiles16()
 770 LOCAL %r,%c,%x,%y,%i,%p,%n,%z
 780 FOR %r=0 TO 3: FOR %c=0 TO 15
 790 %x=%16*c: %y=%16*r: %p=%80*r+c: %i=%255-p
 800 INK %p: FOR %n=0 TO 15: PLOT %x,%y+n: DRAW 15,0: NEXT %n
 810 INK %i: FOR %n=0 TO 15 STEP 6
 820 PLOT %x+n,%y: DRAW 2,0: PLOT %x+15,%y+n: DRAW 0,2: PLOT %x+15-n,%y+15: DRAW -2,0: PLOT %x,%y+15-n: DRAW 0,-2
 830 NEXT %n
 840 %z=%(16*r)+c
 850 PRINT PAPER %p; CHR$ 30; CHR$ 3; CHR$ 29; CHR$ 2; POINT %x+2,%y+2;"Ti"; POINT %x+7,%y+2;"l"; POINT %x+11,%y+1;"e"; CHR$ 30; CHR$ 5; CHR$ 29; CHR$ 0; POINT %x+2,%y+7;" "; POINT %x+2+(3*(z<10)),%y+7;%z
 860 PLOT %x+9,%y+6: PLOT INK %p;%x+8,%y+6
 870 NEXT %c: NEXT %r
 880 INK 0
 890 ENDPROC 
 900 REM =======================
 910 DEFPROC testtiles8()
 920 LOCAL %r,%c,%x,%y,%i,%p,pl,ph,h$
 930 FOR %r=0 TO 7: FOR %c=0 TO 31
 940 %x=%8*c: %y=%8*r: %p=%32*r+c: %i=%255-p
 950 INK %p: FOR %n=0 TO 7: PLOT %x,%y+n: DRAW 7,0: NEXT %n
 960 INK %i: ph=%p>>4: pl=%p: pl=pl-16*ph
 970 ph=ph+48: IF ph>57 THEN ph=ph+7
 980 pl=pl+48: IF pl>57 THEN pl=pl+7
 990 h$= CHR$ ph+ CHR$ pl
1000 PRINT PAPER %p; CHR$ 29; CHR$ 0; CHR$ 30; CHR$ 4; AT %r,%2*c;h$
1010 NEXT %c: NEXT %r
1020 INK 0
1030 ENDPROC 
1040 REM =======================
1050 DEFPROC cut16()
1060 LOCAL %a,%r,%c,%x,%y,%i,d
1070 %a=0: PRINT CHR$ 30; CHR$ 8; AT 21,8;"Cutting...  0/64"
1080 FOR %r=0 TO 48 STEP 16: FOR %c=0 TO 240 STEP 16
1090 FOR %y=0 TO 15: FOR %x=0 TO 15
1100 POINT %c+x,%r+y TO %i
1110 BANK 10 POKE %a,%i: %a=%a+1
1120 NEXT %x: NEXT %y
1130 d=%1+r+(c/16): PRINT AT 21,21- LEN STR$ d;d
1140 NEXT %c: NEXT %r
1150 ENDPROC 
1160 REM =======================
1170 DEFPROC cut8()
1180 LOCAL %a,%r,%c,%x,%y,%i,d
1190 %a=0: PRINT CHR$ 30; CHR$ 8; AT 21,7;"Cutting...   0/256"
1200 FOR %r=0 TO 56 STEP 8: FOR %c=0 TO 248 STEP 8
1210 FOR %y=0 TO 7: FOR %x=0 TO 7
1220 POINT %c+x,%r+y TO %i
1230 BANK 10 POKE %a,%i: %a=%a+1
1240 NEXT %x: NEXT %y
1250 d=%1+(4*r)+(c/8): PRINT AT 21,21- LEN STR$ d;d
1260 NEXT %c: NEXT %r
1270 ENDPROC 
1280 REM =======================
1290 DEFPROC deftilemap()
1300 LOCAL %n
1310 FOR %n=0 TO %k-1
1320 BANK %m POKE %n,%n
1330 NEXT %n
1340 ENDPROC 
1350 REM =======================
1360 DEFPROC examples()
1370 LOCAL %r,%c,%x,%y,%v
1380 BANK 10 ERASE 0,16384,%t
1390 FOR %r=%(w/4) TO %(w/2)-1: FOR %c=0 TO %w-1
1400 %x=% RND w:%y=% RND (k/w)
1410 TILE 1,1 AT %x,%y TO %c,%r
1420 NEXT %c: NEXT %r
1430 ENDPROC 
1440 REM =======================
1450 DEFPROC loadsl2()
1460 BANK 10 COPY TO %b
1470 BANK 11 COPY TO %m
1480 PRINT AT 18,0;z$;z$;z$;z$;z$;z$; AT 18,8;"Input file name:"; AT 20,8;"""        "" .SL2"
1490 POKE 23658,8: INPUT OVER 1; AT 20,9; LINE f$: POKE 23658,0
1500 IF LEN f$>8 THEN f$=f$( TO 8)
1510 f$=f$+".SL2"
1520 ON ERROR GO TO %1570
1530 LOAD f$ LAYER 
1540 BANK %b COPY TO 10
1550 BANK %m COPY TO 11
1560 ENDPROC 
1570 PRINT AT 18,0;z$;z$;z$; POINT 60-4* LEN f$,144; PAPER 96; INK 240;" FILE ";f$;" NOT FOUND " 
1580 PRINT AT 20,4;"PRESS "; PAPER 240;"F"; PAPER %t;" FOR ANOTHER FILE"; POINT 20,168;"OR ANY OTHER KEY TO RESTART"
1590 REPEAT : i$= INKEY$ : REPEAT UNTIL i$<>""
1600 IF i$="f" OR i$="F" THEN GO TO %1480
1610 RUN 
1620 ON ERROR 
1630 ENDPROC 
1640 REM =======================
1650 DEFPROC savetiles()
1660 LOCAL i$,%j,j
1670 f$=f$+".BIN"
1680 PRINT AT 18,0;z$;z$;z$;z$; AT 18,4;"Number of tiles to save?"; AT 19,4;"(max. ";%k;")"; AT 21,1;"(Leave blank for the maximum.)"
1690 REPEAT 
1700 %j=0
1710 INPUT AT 19,25; LINE i$
1720 IF i$="" THEN %j=%k: PRINT AT 19,25;%j: GO TO %1760
1730 ON ERROR GO TO %1700
1740 %j= INT VAL i$
1750 ON ERROR 
1760 REPEAT UNTIL %j>0
1770 IF %j>k THEN %j=%k
1780 SAVE f$ BANK %b,0,%s*s*j
1790 j=%j: PRINT AT 21,0; PAPER 156;z$; POINT 64-4* LEN (f$+ STR$ j)+4*(j=1),168; PAPER 156;%j;" TILE";("S" AND j<>1);" SAVED AS ";f$
1800 BANK 10 ERASE 0,16384,%t
1810 BANK %b ERASE 0,16384,0
1820 LOAD f$ BANK %b
1830 TILE %256/s,%64/s AT 0,0 TO 0,%64/s
1840 ENDPROC 
1850 REM =======================
