10 REM          Disc Catalogue
20 REM          by Robin Nixon
30 REM  (c) Computing with the Amstrad
40 REM ------------- CPC -------------
50 CALL &BB4E
60 MODE 2:INK 0,0:INK 1,20:DEFINT a-g,i-o,q-z:DIM a$(100)
61 hym=HIMEM:SYMBOL AFTER 256
70 BORDER 13:WINDOW 2,79,1,24:PEN 1:PAPER 0:MEMORY &8FFF:ON ERROR GOTO 90
80 —USER,15:INK 1,0:CAT:h=HIMEM:MEMORY h-&800:GOSUB 200:MEMORY h
90 IF j=0 THEN 110 ELSE OPENIN "TITLE.DSC"
100 INPUT#9,title$
110 CLS:INK 1,26:PEN 1:CLOSEIN:CLS:—USER,0
120 PLOT 0,0,1:DRAW 638,0:DRAW 638,398:DRAW 0,398:DRAW 0,0
130 LOCATE 35,2:PRINT "CATALOGUE":LOCATE 79-LEN(title$),2:PRINT title$;
140 LOCATE 1,1:CAT:h=HIMEM:MEMORY h-&800:GOSUB 200:MEMORY h
150 IF j=0 THEN a$(1)="<< No files >>"
160 BORDER 13:WINDOW 2,79,2,24:PEN 1:PAPER 0
170 num=(j‡ 4)-((j MOD 4)>0)
180 GOSUB 510:x=1:y=1:PEN 0:PAPER 1:GOSUB 250
190 GOSUB 270:CLS:WINDOW 2,79,1,24:ERASE a$:DIM a$(100):GOTO 120
200 j=0:p=h-&7FF
210 IF PEEK(p)=&FF THEN j=j+1:p=p+1 ELSE RETURN
220 a$(j)="":FOR k=1 TO 8:a$(j)=a$(j)+CHR$(PEEK(p) AND &7F):p=p+1:NEXT
230 a$(j)=a$(j)+".":FOR k=1 TO 3:a$(j)=a$(j)+CHR$(PEEK(p) AND &7F):p=p+1:NEXT
240 p=p+2:GOTO 210
250 LOCATE (x-1)*20+1,y+2:GOSUB 1060
260 PRINT a$(num1);:RETURN
270 WHILE INKEY$<>"":WEND
280 ik$=UPPER$(INKEY$):i1=INKEY(1):i2=INKEY(8):i3=INKEY(0):i4=INKEY(2)
290 IF ik$="" THEN 280
300 inf=0:PEN 1:PAPER 0:GOSUB 250
310 IF j=0 THEN 420
320 IF i1>-1 THEN x=x+1:GOSUB 1130:IF x>4 OR x>j THEN x=1:y=y+1
330 IF i2>-1 THEN x=x-1:GOSUB 1150:IF x<1 THEN x=4:y=y-1:IF y>(j-num*3) THEN x=x-1
340 IF i3>-1 THEN y=y-1:inf=1:GOSUB 1170:IF y<1 THEN y=num:IF x=4 THEN y=(j-num*3)
350 IF inf=1 THEN GOSUB 1060:IF a$(num1)="" THEN y=y-1:GOTO 350
360 IF i4>-1 THEN y=y+1:GOSUB 1190:IF y>num OR x=4 AND y>(j-num*3) THEN y=1
370 IF x=1 AND y>num THEN y=1
380 IF y<1 THEN x=4:y=num:IF y>(j-num*3) THEN x=x-1
390 IF x=4 AND y>(j-num*3) THEN x=1:y=y+1:IF y>num THEN y=1
400 IF x>j THEN x=x-1:y=1:GOTO 400
410 GOSUB 1060:IF num1>j THEN x=x-1
420 IF ik$="T" THEN 550
430 IF ik$="U" THEN GOSUB 650:RETURN
440 IF ik$="R" AND j>0 THEN 680
450 IF ik$="X" AND j>0 THEN 710
460 IF ik$="E" AND j>0 THEN GOSUB 770:RETURN
470 IF ik$="L" AND j>0 THEN 860
480 IF ik$="D" THEN 910
490 IF ik$="N" AND j>0 THEN 990
500 PEN 0:PAPER 1:GOSUB 250:GOTO 270
510 PEN 0:PAPER 1:LOCATE 2,23
520 PRINT " R=RUN  L=LOAD  U=USER  D=DRIVE  ";
530 PRINT "E=ERASE  X=ERASE *.BAK  T=TITLE  ";
540 PRINT "N=RENAME  ";:PEN 1:PAPER 0:RETURN
550 GOSUB 640:LOCATE 2,23:INPUT "ENTER TITLE? ",title$
560 title$=LEFT$(title$,25)
570 —USER,15
580 ON ERROR GOTO 630
590 LOCATE 2,20
600 e$="TITLE.DSC":—ERA,àe$
610 OPENOUT "TITLE.DSC"
620 PRINT#9,title$
630 CLOSEOUT:—USER,0:PEN 1:RUN
640 PEN 1:PAPER 0:LOCATE 2,23:PRINT STRING$(76,32);:RETURN
650 GOSUB 640:LOCATE 2,23:INPUT "ENTER USER NUMBER (0-15)? ",user
660 IF user>15 OR user<0 THEN 650
670 —USER,user:RETURN
680 GOSUB 640:LOCATE 2,23:PRINT "RUNNING ";
690 GOSUB 1060
700 PRINT r$:MEMORY hym:SYMBOL AFTER 240:RUN r$
710 GOSUB 640:LOCATE 2,23:PRINT "ERASING *.BAK";
720 LOCATE 2,20
730 ON ERROR GOTO 760
740 e$="*.bak"
750 —ERA,àe$
760 RUN
770 GOSUB 1060:e$=r$
780 GOSUB 640:LOCATE 2,23:PRINT "ERASE ";e$;" Are you sure? ";
790 ik$=UPPER$(INKEY$):IF ik$="" THEN 790
800 IF ik$="N" THEN RETURN
810 IF ik$<>"Y" THEN 790
820 PRINT ik$:LOCATE 2,20
830 ON ERROR GOTO 850
840 —ERA,àe$
850 RUN
860 GOSUB 1060
870 MODE 2:PEN 1:PAPER 0:PRINT "LOADING ";r$
880 ON ERROR GOTO 900
890 LOAD r$:END
900 FOR x=1 TO 5000:NEXT:RUN
910 GOSUB 640:LOCATE 2,23:PRINT "ENTER DRIVE (A-B)? ";
920 ik$=UPPER$(INKEY$):IF ik$="" THEN 920
930 IF ik$<"A" OR ik$>"B" THEN 920
940 PRINT ik$:LOCATE 2,20
950 ON ERROR GOTO 980
960 —DRIVE,àik$
970 RUN
980 FOR j=1 TO 5000:NEXT:RUN
990 GOSUB 1060
1000 GOSUB 640:LOCATE 2,23:PRINT "RENAME ";r$;
1010 INPUT " as? ",nn$
1020 LOCATE 2,20
1030 ON ERROR GOTO 980
1040 —REN,ànn$,àr$
1050 RUN
1060 num1=(x-1)*(j‡ 4)+y-2+x-((j MOD 4)>0)
1070 IF ((j MOD 4)>0) THEN 1090
1080 num1=num1-(x=1)+(x=3)+((x=4)*2)
1090 r$=a$(num1)
1100 is=INSTR(z$," ")
1110 IF is THEN r$=LEFT$(r$,is-1)+RIGHT$(r$,LEN(z$)-is):GOTO 1100
1120 RETURN
1130 GOSUB 1060:IF a$(num1)="" THEN x=x+1
1140 RETURN
1150 IF x=0 THEN RETURN ELSE GOSUB 1060:IF a$(num1)="" THEN x=x-1
1160 RETURN
1170 IF y=0 THEN RETURN ELSE GOSUB 1060:IF a$(num1)="" THEN y=y-1:GOTO 1170
1180 RETURN
1190 GOSUB 1060:IF a$(num1)="" THEN y=1
1200 RETURN