10REM ********************************* 20REM * C-Tree (C) Jon Welch 09-07-88 * 30REM ********************************* 40REM * Version 2 - Uses sideways RAM * 50REM ********************************* 60: 70ON ERROR GOTO 600 80maxd% = 40 90DIM tree%(maxd%,1) 100DIM files%(maxd%, 3), files$(maxd%) 110DIM buffer% 600, parm% 32, name% 32 120DIM name_buffer% 40, temp% 40 130DIM screen% 1 140DIM ram% 12 150ram%!5=29 160DIM match%(47) 170*FX 11,0 180*FX225,128 190*FX4,1 200*SRDATA 4 210*SRDATA 5 220*SRDATA 6 230*SRDATA 7 240drive$="A" 250VDU 23, 255, 0, &18, &3C, &7E, &FF, &7E, &3C, &18 260PROCmc 270MODE128 280PROCinit_screen 290mask$="*" 300dir$="$" 310OSCLI"MOUNT "+drive$ 320OSCLI"DIR "+dir$ 330free%=FNget_free 340title$=FNget_title 350t_f% = 0 360t_b% = 0 370m_f% = 0 380m_b% = 0 390tg_f% = 0 400tg_b% = 0 410mode% = 0 420FORA% = 0 TO maxd% 430files%(A%, 0) = 0 440files%(A%, 1) = 0 450files%(A%, 2) = 0 460files%(A%, 3) = 0 470tree%(A%, 0) = 0 480tree%(A%, 1) = 0 490NEXT 500PROCshow_disk(drive$, title$, free%) 510PROCshow_mask(mask$) 520PROCshow_stats(t_f%, t_b%, m_f%, m_b%, tg_f%, tg_b%) 530last% = 0 540end%=0 550PROCread(dir$, 0) 560PROCdo_main 570PROCkeys 580END 590: 600REM Error routine 610IF ERL = 7640:PROCbad_drive:PROCshow_main:GOTO570:GOTO7680 620IF ERL = 7990:PROCbad_drive:PROCshow_main:GOTO570:GOTO8030 630IF ERL = 8020:GOTO270:GOTO8060 640IF ERL = 8280:PROCbad_make:PROCshow_main:GOTO570:GOTO8310 650IF ERL = 8730 OR ERL = 8740:PROCbad_delete:PROCshow_main:GOTO570:GOTO8760 660*FX15 670*FX11,50 680*FX4 690*FX225,1 700REPORT 710PRINT" at line ";ERL 720VDU 23, 1, 1| 730END 740: 750DEF PROCmc 760DIM Q% 100 770FORA% = 0 TO 2 STEP 2 780P% = Q% 790[OPT A% 800.compare 810lda &601: sta &70:lda &602: sta &71 820ldy#0:lda (&70), y:sta &72 830iny:lda (&70), y:sta &73 840iny:iny 850lda (&70), y:tax 860lda &604: sta &70:lda &605: sta &71 870ldy#0:lda (&70), y:sta &74 880iny:lda (&70), y:sta &75 890lda &607: sta &70:lda &608: sta &71 900ldy #0 910.loop 920lda (&72), y:cmp (&74), y 930beq loop1 940lda (&74), y: cmp #ASC("#"):beq loop1 950lda #0: jmp loop2 960.loop1 970iny:dex:bne loop 980lda #255 990.loop2 1000ldy #0:ldx #3 1010.loop3 1020sta (&70), y:iny:dex:bne loop3 1030rts 1040] 1050NEXT 1060ENDPROC 1070: 1080DEF FNupper(A$) 1090LOCAL B$, A%, C$ 1100B$="" 1110FORA%=1 TO LEN(A$) 1120C$=MID$(A$, A%, 1) 1130IF C$>="a" AND C$ <= "z" C$=CHR$(ASC(C$)-32) 1140B$=B$+C$ 1150NEXT 1160=B$ 1170: 1180DEF PROCramstore(addr%,num%) 1190LOCAL A%, X%, Y% 1200?ram%=&C0 1210ram%!1=addr% 1220ram%!8=(num% - 1) * 29 1230X%=ram% AND 255 1240Y%=ram% DIV 256 1250A%=66 1260CALL&FFF1 1270ENDPROC 1280: 1290DEF PROCramrestore(addr%, num%) 1300LOCAL A%, X%, Y% 1310?ram%=&40 1320GOTO1210 1330: 1340DEF PROCread(dir$, parent%) 1350LOCAL Z%, nextone%, index%, found% 1360LOCAL fi%, by% 1370fi% = 0: by% = 0 1380found% = 0 1390S%=INSTR(dir$, " ") 1400IF S% > 0 dir$=LEFT$(dir$, S% - 1) 1410last%=last%+1 1420index%=last% 1430files$(index%)=dir$ 1440tree%(index%, 0) = parent% 1450tree%(index%, 1) = 0 1460nextone%=0 1470: 1480?parm% = 0 1490parm%!1=buffer% 1500parm%!5=1 1510parm%!9=nextone% 1520A%=8:X%=parm% AND 255:Y%=parm% DIV 256 1530CALL &FFD1 1540nextone%=parm%!9 1550: 1560IF parm%!5 = 1 GOTO1920 1570S%=buffer% 1580B%=name_buffer% 1590FORA%=1 TO ?S% 1600?(B%+A%-1)=S%?A% 1610NEXT 1620S%=S%+?S%+1 1630?(B%+A%-1)=13 1640!parm% = B% 1650A%=5 1660A%=USR&FFDD AND 255 1670: 1680IF A% = 2 GOTO1880 1690t_f% = t_f% + 1 1700t_b% = t_b% + parm%!10 1710fi%=fi% + 1 1720by%=by% + parm%!10 1730end%=end%+1 1740IF files%(index%,0) = 0 files%(index%,0) = end% 1750prev%=files%(index%,1) 1760files%(index%,1)=end% 1770B%?11 = A% :REM dir%(end%) = A% 1780B%!12 = parm%!2 :REM load%(end%) = parm%!2 1790B%!16 = parm%!6 :REM exec%(end%) = parm%!6 1800B%!20 = parm%!10 :REM len%(end%) = parm%!10 1810B%?24 = (parm%?14) AND 15 :REM attrib%?end% = (parm%?14) AND 15 1820B%!25 = (B%!25 AND &FFFF0000) + prev%:REM pointer to previous filename 1830B%!27 = (B%!27 AND &FFFF0000) + 0 :REM pointer to next filename 1840PROCramstore(B%, end%) 1850IF prev% <> 0:PROCramrestore(B%, prev%):B%!27 = (B%!27 AND &FFFF0000) + end%:PROCramstore(B%, prev%) 1860GOTO1480 1870: 1880IF found% <> 0 tree%(found%, 1) = last%+1 1890found% = last%+1 1900OSCLI"DIR "+$name_buffer%:PROCread($name_buffer%, index%):OSCLI"DIR ^" 1910GOTO1480 1920: 1930files%(index%, 2) = fi% 1940files%(index%, 3) = by% 1950PROCshow_stats(t_f%, t_b%, m_f%, m_b%, tg_f%, tg_b%) 1960ENDPROC 1970: 1980DEF PROCinit_screen 1990VDU 23, 1, 0| 2000PRINTTAB(0, 1); 2010PRINTCHR$163;STRING$(57, CHR$166);CHR$167;STRING$(20, CHR$166);CHR$165; 2020PRINTCHR$169;STRING$(57, " ");CHR$169;STRING$(20, " ");CHR$(169); 2030PRINTCHR$169;STRING$(57, " ");CHR$171;STRING$(20, CHR$166);CHR$173; 2040FORA% = 1 TO 3 2050PRINTCHR$169;STRING$(57, " ");CHR$169;STRING$(20, " ");CHR$(169); 2060NEXT 2070PRINTCHR$169;STRING$(57, " ");CHR$171;STRING$(20, CHR$166);CHR$173; 2080FORA% = 1 TO 20 2090PRINTCHR$169;STRING$(57, " ");CHR$169;STRING$(20, " ");CHR$(169); 2100NEXT 2110PRINTCHR$170;STRING$(57, CHR$166);CHR$174;STRING$(20, CHR$166);CHR$172; 2120PRINTTAB(59, 2);"FILE: *" 2130PRINTTAB(59, 4);"DISK:" 2140PRINTTAB(59, 5);" Available" 2150PRINTTAB(59, 6);" Bytes:" 2160PRINTTAB(59, 8);"DISK Statistics" 2170PRINTTAB(59,10);" Total" 2180PRINTTAB(59,11);" Files:" 2190PRINTTAB(59,12);" Bytes:" 2200PRINTTAB(59,14);" Matching" 2210PRINTTAB(59,15);" Files:" 2220PRINTTAB(59,16);" Bytes:" 2230PRINTTAB(59,18);" Tagged:" 2240PRINTTAB(59,19);" Files:" 2250PRINTTAB(59,20);" Bytes:" 2260VDU 23, 42, 0, 0, 0, 0, 255, 255, 255, 255 2270PRINTTAB(7, 4);" ***** ******** ******* ****** ****** tm" 2280PRINTTAB(7, 5);"** ** ** *** *** ** **" 2290PRINTTAB(7, 6);"** ** ******* **** ****" 2300PRINTTAB(7, 7);"** ** ** ** ** ** **" 2310PRINTTAB(7, 8);" ***** ** ** ** ****** ******" 2320PRINTTAB(13, 12);"(c) Jons Fabo Software, INC. 1988" 2330*FX 20 2340PRINTTAB(15, 16);"All Rights Reserved Worldwide" 2350PRINTTAB(15, 20);"Version 1.01 Serial # 104945" 2360PRINTTAB(1, 31);"Installed For Master 128 or Compatible (Megga Slow Display)"; 2370ENDPROC 2380: 2390DEF FNget_free 2400LOCAL A%, X%, Y% 2410A%=113 2420X%=parm% AND 255 2430Y%=parm% DIV 256 2440CALL&FFF1 2450=!parm% 2460: 2470DEF FNget_title 2480LOCAL A%, X%, Y% 2490A%=5 2500X%=parm% AND 255:Y%=parm% DIV 256 2510parm%!1=name% 2520CALL&FFD1 2530title$="" 2540FORA%=1 TO ?name% 2550title$=title$+CHR$(A%?name%) 2560NEXT 2570=title$ 2580: 2590DEF FNform_string(A%) 2600LOCAL A$ 2610A$=STR$(A%) 2620B$="" 2630REPEAT 2640B$=","+RIGHT$(A$,3)+B$ 2650A$=LEFT$(A$, LENA$ - 1) 2660A$=LEFT$(A$, LENA$ - 1) 2670A$=LEFT$(A$, LENA$ - 1) 2680UNTILA$="" 2690B$=MID$(B$,2) 2700=B$ 2710: 2720DEF PROCshow_mask(mask$) 2730LOCAL A% 2740A%=0 2750m$="" 2760fmask$=mask$ 2770A%=INSTR(mask$, "*") 2780IF A% = 0 GOTO2810 2790m$=LEFT$(mask$, A% - 1) 2800fmask$=LEFT$(m$+"##########", 10) 2810fmask$=LEFT$(fmask$+" ", 10) 2820PRINTTAB(65, 2);LEFT$(mask$+" ", 10) 2830ENDPROC 2840: 2850DEF PROCshow_disk(drive$, title$, free%) 2860PRINTTAB(65, 4);" "; 2870PRINTTAB(65, 4);drive$;": ";LEFT$(title$, 10); 2880PRINTTAB(68, 6);RIGHT$(" "+FNform_string(free%), 9) 2890ENDPROC 2900: 2910DEF PROCshow_stats(t_f%, t_b%, m_f%, m_b%, tg_f%, tg_b%) 2920PRINTTAB(68, 11);RIGHT$(" "+FNform_string(t_f%), 9) 2930PRINTTAB(68, 12);RIGHT$(" "+FNform_string(t_b%), 9) 2940PRINTTAB(68, 15);RIGHT$(" "+FNform_string(m_f%), 9) 2950PRINTTAB(68, 16);RIGHT$(" "+FNform_string(m_b%), 9) 2960PRINTTAB(68, 19);RIGHT$(" "+FNform_string(tg_f%), 9) 2970PRINTTAB(68, 20);RIGHT$(" "+FNform_string(tg_b%), 9) 2980ENDPROC 2990: 3000DEF PROCdo_main 3010VDU 28, 1, 27, 57, 2, 12, 26 3020PRINTTAB(0, 8);CHR$171;STRING$(57, CHR$166);CHR$173; 3030PROCshow_main 3040PRINTTAB(2, 0);"Path: "; 3050PRINTTAB(59, 22);"Current " 3060PRINTTAB(59, 24);" Bytes:" 3070dir%=1 3080dir$=files$(dir%) 3090PROCcount_match 3100PROCshow_stats(t_f%, t_b%, m_f%, m_b%, tg_f%, tg_b%) 3110PROCshow_dir(dir%) 3120start% = 1 3130end% = match% 3140PROCshow_tree(dir%, last%) 3150PROCshow_files(match%, mode%) 3160PROCin(diro%, diro% - dir%) 3170ENDPROC 3180: 3190DEF FNextract(dir$) 3200LOCAL A%, B% 3210B%=INSTR(dir$, ".") 3220A% = B% 3230IF B% = 0 GOTO 3280 3240REPEAT 3250A% = B% 3260B%=INSTR(dir$, ".", A%+1) 3270UNTIL B% = 0 3280=MID$(dir$, A% + 1) 3290: 3300DEF PROCshow_dir(dir%) 3310LOCAL A%, B% 3320dir$=FNflevel(dir%) 3330PRINTTAB(8, 0);LEFT$(dir$+STRING$(70, " "), 72); 3340PRINTTAB(67, 22);"Directory" 3350dir$ = files$(dir%) 3360PRINTTAB(61, 23);LEFT$(dir$+" ", 10) 3370size% = files%(dir%, 3) 3380PRINTTAB(68, 24);RIGHT$(" "+FNform_string(size%), 9) 3390match%=0 3400tm_f%=0 3410tm_b%=0 3420ttg_f%=0 3430ttg_b%=0 3440A%=files%(dir%, 0) 3450IF A% = 0 GOTO3540 3460REPEAT 3470PROCramrestore(temp%, A%) 3480IF ((temp%?24) AND 16) = 16 ttg_f% = ttg_f% + 1:ttg_b% = ttg_b% + temp%!20 3490name$=$temp% 3500CALL compare, name$, fmask$, B% 3510IF B% match%=match%+1:match%(match%) = A%:tm_f%=tm_f%+1:tm_b%=tm_b%+temp%!20 3520A%=(temp%!27) AND &FFFF 3530UNTILA%=0 3540ENDPROC 3550: 3560DEF FNlevel(dir%) 3570LOCAL level% 3580level% = 0 3590dir%=tree%(dir%, 0) 3600IF dir% <> 0 level%=level%+1:GOTO3590 3610=level% 3620: 3630DEF FNflevel(dir%) 3640LOCAL dir$ 3650dir$=files$(dir%) 3660dir%=tree%(dir%, 0) 3670IF dir% <> 0 dir$=files$(dir%)+"."+dir$:GOTO3660 3680=dir$ 3690: 3700DEF PROCshow_tree(dir%, last%) 3710LOCAL dir$ 3720LOCAL A% 3730VDU 28, 1, 7, 57, 2, 12, 26 3740diro% = dir% 3750dire% = dir% + 5 3760IF dire% > last% dire% = last% 3770FOR A% = dir% TO dire% 3780PRINTTAB(2, A% - dir% + 2); 3790PROCshow_treepath(A%) 3800NEXT 3810ENDPROC 3820: 3830DEF PROCshow_treepath(A%) 3840l=171:c=170:h=166 3850L%=FNlevel(A%) 3860V%=VPOS 3870PRINT TAB(3*L%+2,V%);files$(A%); 3880P%=A% 3890N%=tree%(P%, 1) 3900P%=tree%(P%, 0) 3910IF P% = 0 GOTO3980 3920L%=L%-1 3930PRINTTAB(3*L%+2, V%); 3940IF N% VDU l ELSE VDU c 3950VDU h, h 3960l=169:c=32:h=32 3970GOTO3890 3980PRINT 3990ENDPROC 4000: 4010DEF PROCshow_files(match%, mode%) 4020LOCAL A% 4030VDU 28, 1, 27, 57, 9, 12, 26 4040IF match% = 0:PRINTTAB(2, 9);"No Files !":ENDPROC 4050FOR A% = 0 TO match% - 1 4060pos%=match%(A% + 1) 4070ON mode% + 1 GOSUB 4110, 4160, 4280 4080NEXT 4090ENDPROC 4100: 4110PROCramrestore(temp%, pos%) 4120PRINTTAB(A% DIV 19 * 20 + 2, A% MOD 19 + 9);$temp%; 4130IF ((temp%?24) AND 16) = 16 VDU 255 ELSE VDU 32 4140RETURN 4150: 4160PROCramrestore(temp%, pos%) 4170PRINTTAB(A% DIV 19 * 30 + 2, A% MOD 19 + 9);$temp%; 4180PRINT" ";RIGHT$(" "+FNform_string(temp%!20), 9); 4190IF ((temp%?24) AND 16) = 16 VDU 255 ELSE VDU 32 4200B% = temp%?24 4210IF (B% AND 1) = 1 PRINT"r"; ELSE PRINT"."; 4220IF (B% AND 2) = 2 PRINT"w"; ELSE PRINT"."; 4230IF (B% AND 4) = 4 PRINT"e"; ELSE PRINT"."; 4240IF (B% AND 8) = 8 PRINT"l"; ELSE PRINT"."; 4250IF A% >= 19 * 2 - 1:A% = 10000 4260RETURN 4270: 4280PROCramrestore(temp%, pos%) 4290PRINTTAB(2, A% + 9);$temp%; 4300PRINT" ";RIGHT$(" "+FNform_string(temp%!20), 9); 4310IF ((temp%?24) AND 16) = 16 VDU 255 ELSE VDU 32 4320PRINT" "; 4330GOSUB 4200 4340PRINT" "; 4350PRINTRIGHT$("00000000"+STR$~temp%!12, 8);" "; 4360PRINTRIGHT$("00000000"+STR$~temp%!16, 8); 4370IF A% >= 19 * 1 - 1:A% = 10000 4380RETURN 4390: 4400DEF PROCin(dir%, off%) 4410COLOUR0:COLOUR129 4420level% = FNlevel(dir%) 4430PRINTTAB(level% * 3 + 2, 2 + off%); 4440PRINT files$(dir%) 4450COLOUR1:COLOUR128 4460ENDPROC 4470: 4480DEF PROCout(dir%, off%) 4490COLOUR1:COLOUR128 4500GOTO4420 4510: 4520DEF PROCkeys 4530LOCAL A$ 4540A$=GET$ 4550IF A$=CHR$135:PROCalt_menu:PROCshow_main 4560IF A$=CHR$139:PROCup 4570IF A$=CHR$138:PROCdown 4580IF A$=CHR$129:PROCend:PROCshow_main 4590IF A$=CHR$13:IF match% > 0:PROCret_menu:PROCshow_main 4600IF A$="F":PROCnew_mask:PROCshow_main 4610IF A$="A":PROCavail:PROCshow_main 4620IF A$="D":PROCdelete:PROCshow_main 4630IF A$="L":PROClog:PROCshow_main 4640IF A$="M":PROCmake:PROCshow_main 4650IF A$="P":PROCprint:PROCshow_main 4660IF A$="R":PROCrename:PROCshow_main 4670GOTO4540 4680: 4690DEF PROCup 4700IF diro% = 1 ENDPROC 4710IF diro% <> dir% GOTO4790 4720PROCout(diro%, diro% - dir%) 4730dir% = dir% - 1 4740VDU 28, 1, 7, 57, 2, 31, 0, 0, 11, 26 4750PRINTTAB(2, 2); 4760PROCshow_treepath(dir%) 4770diro% = dir% 4780GOTO4800 4790PROCout(diro%, diro% - dir%):diro% = diro% - 1 4800PROCin(diro%, diro% - dir%) 4810dir$=files$(diro%) 4820PROCshow_dir(diro%) 4830start%=1 4840end%=match% 4850PROCshow_files(match%, mode%) 4860PROCshow_stats(t_f%, t_b%, m_f%, m_b%, tg_f%, tg_b%) 4870ENDPROC 4880: 4890DEF PROCdown 4900IF diro% = last% ENDPROC 4910IF diro% <> dir% + 5 GOTO4990 4920PROCout(diro%, diro% - dir%) 4930dir% = dir% + 1 4940VDU 28, 1, 7, 57, 2, 31, 0, 5, 10, 26 4950PRINTTAB(2, 7); 4960PROCshow_treepath(dir%+5) 4970diro% = dir% + 5 4980GOTO4800 4990PROCout(diro%, diro% - dir%):diro% = diro% + 1 5000GOTO4800 5010: 5020DEF PROCret_menu 5030LOCAL A$ 5040PROCshow_file 5050PROCshow_stats(files%(diro%, 2), files%(diro%, 3), tm_f%, tm_b%, ttg_f%, ttg_b%) 5060: 5070starto% = start% 5080tstart% = start% 5090tend% = end% 5100PROCin_file(starto%, starto% - tstart%) 5110A$=GET$ 5120IF A$=CHR$139:PROCup_file 5130IF A$=CHR$138:PROCdown_file 5140IF A$=CHR$136:PROCleft_file 5150IF A$=CHR$137:PROCright_file 5160IF A$=CHR$13 GOTO5210 5170IF A$="T" PROCtag 5180IF A$="U" PROCuntag 5190GOTO5110 5200: 5210PROCout_file(starto%, starto% - tstart%) 5220PROCshow_stats(t_f%, t_b%, m_f%, m_b%, tg_f%, tg_b%) 5230PROCshow_dir(diro%) 5240ENDPROC 5250: 5260DEF PROCtag 5270PROCramrestore(temp%, match%(starto%)) 5280IF ((temp%?24) AND 16) = 0:ttg_f% = ttg_f% + 1:tg_f% = tg_f% + 1:ttg_b% = ttg_b% + temp%!20:tg_b% = tg_b% + temp%!20 5290temp%?24=(temp%?24) OR 16 5300PROCramstore(temp%, match%(starto%)) 5310PROCin_file(starto%, starto% - tstart%) 5320PROCdown_file 5330PROCshow_stats(files%(diro%, 2), files%(diro%, 3), tm_f%, tm_b%, ttg_f%, ttg_b%) 5340ENDPROC 5350: 5360DEF PROCuntag 5370PROCramrestore(temp%, match%(starto%)) 5380IF ((temp%?24) AND 16) = 16:ttg_f% = ttg_f% - 1:tg_f% = tg_f% - 1:ttg_b% = ttg_b% - temp%!20:tg_b% = tg_b% - temp%!20 5390temp%?24 = (temp%?24) AND 15 5400PROCramstore(temp%, match%(starto%)) 5410PROCin_file(starto%, starto% - tstart%) 5420PROCdown_file 5430PROCshow_stats(files%(diro%, 2), files%(diro%, 3), tm_f%, tm_b%, ttg_f%, ttg_b%) 5440ENDPROC 5450: 5460DEF PROCin_file(pos%, A%) 5470pos%=match%(pos%) 5480COLOUR0:COLOUR129 5490ON mode% + 1 GOSUB 4110, 4160, 4280 5500COLOUR1:COLOUR128 5510PROCshow_cfile(starto%) 5520ENDPROC 5530: 5540DEF PROCout_file(pos%, A%) 5550pos%=match%(pos%) 5560COLOUR1:COLOUR128 5570ON mode% + 1 GOSUB 4110, 4160, 4280 5580ENDPROC 5590: 5600DEF PROCleft_file 5610ttemp%=starto% 5620starto% = starto% - 19 5630IF (starto% < start%) OR (starto% < tstart%) starto% = ttemp%:ENDPROC 5640PROCout_file(ttemp%, ttemp% - tstart%) 5650PROCin_file(starto%, starto% - tstart%) 5660ENDPROC 5670: 5680DEF PROCright_file 5690ttemp%=starto% 5700starto% = starto% + 19 5710IF (starto% > end%) OR (starto% > tstart% + (3 - mode%) * 19 - 1) starto% = ttemp%:ENDPROC 5720GOTO5640 5730: 5740DEF PROCup_file 5750IF starto% = start% ENDPROC 5760IF starto% <> tstart% GOTO 5830 5770PROCout_file(starto%, starto% - tstart%) 5780tstart% = tstart% - 1 5790IF mode% = 1:VDU 28, 32, 27, 57, 9, 31, 0, 0, 11, 26:PROCout_file(tstart% + 19, 19):VDU 28, 1, 27, 31, 9, 31, 0, 0, 11, 26 5800IF mode% = 2:VDU 28, 1, 27, 57, 9, 31, 0, 0, 11, 26 5810starto% = tstart% 5820GOTO5840 5830PROCout_file(starto%, starto% - tstart%):starto% = starto% - 1 5840PROCin_file(starto%, starto% - tstart%) 5850ENDPROC 5860: 5870DEF PROCdown_file 5880IF starto% = end% ENDPROC 5890IF starto% <> tstart% + (3 - mode%) * 19 - 1 GOTO5960 5900PROCout_file(starto%, starto% - tstart%) 5910tstart% = tstart% + 1 5920IF mode% = 1:VDU 28, 1, 27, 31, 9, 31, 0, 18, 10, 26:PROCout_file(tstart% + 18, 18):VDU 28, 32, 27, 57, 9, 31, 0, 18, 10, 26 5930IF mode% = 2:VDU 28, 1, 27, 57, 9, 31, 0, 18, 10, 26 5940starto% = tstart% + (3 - mode%) * 19 - 1 5950GOTO5840 5960PROCout_file(starto%, starto% - tstart%):starto% = starto% + 1 5970GOTO5840 5980: 5990DEF PROCshow_cfile(start%) 6000start%=match%(start%) 6010PROCramrestore(temp%, start%) 6020PRINTTAB(67, 22);"File " 6030name$=$temp% 6040PRINTTAB(61, 23);LEFT$(name$+" ", 10) 6050size% = temp%!20 6060PRINTTAB(68, 24);RIGHT$(" "+FNform_string(size%), 9) 6070ENDPROC 6080: 6090DEF PROCalt_menu 6100LOCAL A$ 6110PROCshow_alt 6120A$=INKEY$(0) 6130IF A$=CHR$129:PROCend:GOTO6110 6140IF A$="F":mode%=(mode%+1)MOD 3:PROCshow_files(match%, mode%) 6150IF A$="S" : REM Sort 6160IF A$="T" : REM Tag 6170IF A$="U" : REM Untag 6180IF A$="X" : REM eXecute 6190IF NOT INKEY -106 ENDPROC 6200GOTO6120 6210: 6220DEF PROCend 6230LOCAL A$ 6240PROCshow_end 6250A$=GET$ 6260IF A$="Y":GOTO6310 6270IF A$="N":ENDPROC 6280IF A$=CHR$131:ENDPROC 6290GOTO6250 6300: 6310*FX15 6320*FX11,50 6330*FX4 6340*FX225,1 6350CLS 6360VDU 23, 1, 1| 6370END 6380: 6390DEF PROCsave(x, y) 6400LOCAL X%, Y%, A% 6410B%=0 6420FOR Y% = x TO y 6430FOR X% = 0 TO 79 6440VDU 31, X%, Y% 6450A%=135 6460screen%?B%=((USR &FFF4) AND &FFFF) DIV 256 6470B%=B%+1 6480NEXT 6490NEXT 6500ENDPROC 6510: 6520DEF PROCrestore(x, y) 6530LOCAL A% 6540PRINTTAB(0, x); 6550FOR A% = 0 TO (y-x+1)*80 -2 6560VDU screen%?A% 6570NEXT 6580ENDPROC 6590: 6600DEF PROCshow_main 6610VDU 28, 0, 31, 79, 29, 12, 26 6620PRINTTAB(0, 29);"DIR Available Delete Filespec Log disk Makedir Print Rename" 6630PRINTTAB(0, 30);"COMMANDS ^Showall ^Tag ^Untag Volume eXecute" 6640PRINTTAB(0, 31);" ";CHR$139;CHR$138;" scroll RETURN file commands COPY menu F1 quit F2 help"; 6650ENDPROC 6660: 6670DEF PROCshow_alt 6680VDU 28, 0, 31, 79, 29, 12, 26 6690PRINTTAB(0, 29);"COPY DIR File display Sort criteria Tag Untag eXecute" 6700PRINTTAB(0, 30);"COMMANDS"; 6710PRINTTAB(54, 31);"F1 quit"; 6720ENDPROC 6730: 6740DEF PROCshow_file 6750VDU 28, 0, 31, 79, 29, 12, 26 6760PRINTTAB(0, 29);"FILE ^Attributes ^Copy ^Delete Filespec Log disk ^Move ^Print" 6770PRINTTAB(0, 30);"COMMANDS ^Rename ^Tag ^Untag View eXecute" 6780PRINTTAB(0, 31);CHR$136;CHR$139;CHR$138;CHR$137;" scroll RETURN expand display COPY menu F1 quit F2 help F3 cancel"; 6790ENDPROC 6800: 6810DEF PROCshow_end 6820VDU 28, 0, 31, 79, 29, 12, 26 6830PRINTTAB(0, 29);"QUIT" 6840PRINTTAB(0, 31);"Are you sure ?"; 6850ENDPROC 6860: 6870DEF PROCmask_menu 6880VDU 28, 0, 31, 79, 29, 12, 26 6890PRINTTAB(0, 29);"FILE specification: "; 6900PRINTTAB(0, 31);"enter a file spec or press RETURN for * F1 quit F2 help F3 cancel"; 6910ENDPROC 6920: 6930DEF PROCnew_mask 6940LOCAL A$ 6950A$="" 6960PROCmask_menu 6970VDU 23, 1, 1| 6980PRINTTAB(20, 29); 6990K$=GET$ 7000IF K$=CHR$131:GOTO7150 7010IF K$=CHR$129:PROCend:PROCmask_menu:PRINTTAB(20, 29);A$;:GOTO6990 7020IF ASC K$>32 AND ASC K$<127 AND LENA$ < 10 A$=A$+K$:PRINTK$; 7030IF ASC K$=127 AND LEN A$ > 0:VDU 127:A$=LEFT$(A$, LEN A$ - 1) 7040IF ASC K$ <> 13 GOTO6990 7050IF LEN A$=0 A$="*" 7060mask$=A$ 7070VDU 23, 1, 0| 7080PROCshow_mask(mask$) 7090PROCcount_match 7100PROCshow_dir(diro%) 7110start%=1 7120end%=match% 7130PROCshow_files(match%, mode%) 7140PROCshow_stats(t_f%, t_b%, m_f%, m_b%, tg_f%, tg_b%) 7150VDU 23, 1, 0| 7160ENDPROC 7170: 7180DEF PROCcount_match 7190LOCAL A%, B%, C% 7200m_f% = 0:m_b% = 0 7210FOR A% = 1 TO last% 7220B%=files%(A%, 0) 7230IF B% = 0 GOTO7310 7240REPEAT 7250PROCramrestore(temp%, B%) 7260name$=$temp% 7270CALL compare, name$, fmask$, C% 7280IF C% m_f% = m_f% + 1:m_b% = m_b% + temp%!20 7290B%=(temp%!27) AND &FFFF 7300UNTILB%=0 7310NEXT 7320ENDPROC 7330: 7340DEF PROCcount_tagged 7350tg_f% = 0:tg_b% = 0 7360FOR A% = 1 TO last% 7370B%=files%(A%, 0) 7380IF B% = 0 GOTO7440 7390REPEAT 7400PROCramrestore(temp%, B%) 7410IF ((temp%?24) AND 16) = 16 tg_f% = tg_f% + 1:tg_b% = tg_b% + temp%!20 7420B%=(temp%!27) AND &FFFF 7430UNTILB% = 0 7440NEXT 7450ENDPROC 7460: 7470DEF PROCavail_menu 7480VDU 28, 0, 31, 79, 29, 12, 26 7490PRINTTAB(0, 29);"AVAILABLE SPACE on disk:" 7500PRINTTAB(0, 31);"enter disk drive specifier F1 quit F2 help F3 cancel"; 7510ENDPROC 7520: 7530DEF PROCavail 7540PROCavail_menu 7550VDU 23, 1, 1| 7560PRINTTAB(25, 29); 7570K$=GET$ 7580IF K$=CHR$131:GOTO 7640 7590IF K$=CHR$129:PROCend:PROCavail_menu:GOTO7560 7600IF (K$>="0" AND K$<="7") OR (K$>="A" AND K$ <="H") GOTO 7670 7610IF ASC K$ > 32 PRINT":";K$; 7620PRINTTAB(0, 31);"Error: Invalid Entry, press RETURN to continue "; 7630REPEAT UNTIL GET = 13 7640VDU 23, 1, 0| 7650ENDPROC 7660: 7670PRINT":";K$; 7680OSCLI"MOUNT "+K$ 7690f%=FNget_free 7700OSCLI"MOUNT "+drive$ 7710PRINTTAB(30, 29); 7720PRINTRIGHT$(" "+FNform_string(f%), 9) 7730PRINTTAB(0, 31);"press RETURN to continue "; 7740GOTO7630 7750: 7760DEF PROCbad_drive 7770PRINTTAB(0, 31);"Error: Invalid Disc Drive, press RETURN to continue "; 7780REPEAT UNTIL GET = 13 7790VDU 23, 1, 0| 7800ENDPROC 7810: 7820DEF PROClog_menu 7830VDU 28, 0, 31, 79, 29, 12, 26 7840PRINTTAB(0, 29);"LOG DISK:" 7850PRINTTAB(0, 31);"enter new default drive F1 quit F2 help F3 cancel"; 7860ENDPROC 7870: 7880DEF PROClog 7890VDU 23, 1, 1| 7900PROClog_menu 7910PRINTTAB(10, 29); 7920K$=GET$ 7930IF K$=CHR$131:GOTO 7990 7940IF K$=CHR$129:PROCend:PROClog:GOTO7910 7950IF (K$>="0" AND K$<="7") OR (K$>="A" AND K$ <="H") GOTO 8020 7960IF ASC K$ > 32 PRINT":";K$; 7970PRINTTAB(0, 31);"Error: Invalid Entry, press RETURN to continue 7980REPEAT UNTIL GET = 13 7990VDU 23, 1, 0| 8000ENDPROC 8010: 8020PRINT":";K$; 8030OSCLI"MOUNT "+K$ 8040drive$=K$ 8050: 8060 restart program !! 8070: 8080ENDPROC 8090: 8100DEF PROCmake_menu 8110VDU 28, 0, 31, 79, 29, 12, 26 8120PRINTTAB(0, 29);"MAKE sub-directory under: ";files$(diro%); 8130PRINTTAB(0, 30);" as:"; 8140PRINTTAB(0, 31);"enter new directory name F1 quit F2 help F3 cancel"; 8150ENDPROC 8160: 8170DEF PROCmake 8180LOCAL A$, A% 8190temp$=FNflevel(diro%) 8200o%=diro% 8210A$="" 8220PROCmake_menu 8230VDU 23, 1, 1| 8240PRINTTAB(26, 30); 8250K$=GET$ 8260IF K$=CHR$131:GOTO 8500 8270IF K$=CHR$129:PROCend:PROCmake_menu:PRINTTAB(26, 30);A$;:GOTO8250 8280IF ASC K$>32 AND ASC K$<127 AND LENA$ < 10 A$=A$+K$:PRINTK$; 8290IF ASC K$=127 AND LEN A$ > 0:VDU 127:A$=LEFT$(A$, LEN A$ - 1) 8300IF ASC K$ <> 13 GOTO8250 8310OSCLI"CDIR "+temp$+"."+A$ 8320diro% = diro% + 1 8330IF diro% > last% GOTO 8410 8340IF FNupper(A$) > FNupper(files$(diro%)) GOTO8320 8350FORA% = last% TO diro% STEP -1 8360files$(A%+1)=files$(A%) 8370FORB%=0 TO 3 8380files%(A%+1,B%)=files%(A%,B%) 8390NEXT 8400NEXT 8410last%=last%+1 8420files$(diro%) = A$ 8430files%(diro%,0)=files%(diro%-1,1)+1 8440files%(diro%,1)=files%(diro%,0)-1 8450files%(diro%,2)=0 8460files%(diro%,3)=0 8470PROCshow_tree(dir%, last%) 8480diro%=o% 8490PROCin(diro%, diro% - dir%) 8500VDU 23, 1, 0| 8510ENDPROC 8520: 8530DEF PROCbad_make 8540PRINTTAB(0, 31);"Error: Unable to Make Directory, press RETURN to continue "; 8550REPEAT UNTIL GET = 13 8560VDU 23, 1, 0| 8570ENDPROC 8580: 8590DEF PROCdelete_menu 8600VDU 28, 0, 31, 79, 29, 12, 26 8610PRINTTAB(0, 29);"DELETE sub-directory: ";files$(diro%); 8620PRINTTAB(0, 31);"delete this directory (Y/N) ? F1 quit F2 help F3 cancel"; 8630ENDPROC 8640: 8650DEF PROCdelete 8660LOCAL A%, B% 8670PROCdelete_menu 8680VDU 23, 1, 1| 8690PRINTTAB(30, 31); 8700K$ = GET$ 8710IF K$=CHR$131:GOTO 8890 8720IF K$=CHR$129:PROCend:PROCdelete_menu:GOTO8690 8730IF K$="N" GOTO 8890 8740IF K$ <> "Y" VDU 7:GOTO8690 8750PRINTK$; 8760OSCLI"ACCESS "+files$(diro%)+" RW" 8770OSCLI"DELETE "+files$(diro%) 8780FORA% = diro% TO last% - 1 8790files$(A%)=files$(A%+1) 8800FORB%=0 TO 3 8810files%(A%,B%)=files%(A%+1,B%) 8820NEXT 8830NEXT 8840last%=last%-1 8850o%=diro% 8860PROCshow_tree(dir%, last%) 8870diro%=o% 8880PROCin(diro%, diro% - dir%) 8890VDU 23, 1, 0| 8900ENDPROC 8910: 8920DEF PROCbad_delete 8930PRINTTAB(0, 31);"Error: Unable to Delete Directory, press RETURN to continue "; 8940REPEAT UNTIL GET = 13 8950VDU 23, 1, 0| 8960ENDPROC 8970: