10 REM Pull Down Menu System
20 REM Marcus Williams
30 REM Amstrad Action November 1985
40 |DISC
50 GOSUB 10010
60 WINDOW#1,2,79,3,23
70 CLS#1:x=1:y=2:d=21:w=78:GOSUB 11430
80 GOSUB 11550
90 no%=6:GOSUB 10160
100 DATA 1,2,"Exit Menu System and list","Version"
110 DATA 2,2,"Tape","Disc"
120 DATA 3,2,"Screen & Printer","Screen"
130 DATA 4,4,"Catalog","Erase File","Change Drive","Change User Number"
140 DATA 5,2,"Clear Screen","Notepad"
150 DATA 6,3,"Exit to CP/M","Exit to BASIC","Reset AMSTRAD"
160 INK 0,0:INK 1,26:BORDER 15
170 t$="About Input Output Toolbox Options Exit":GOSUB 11340
180 iy=25:GOSUB 10810
190 CLEAR INPUT
200 meno%=2:opt%=2:GOSUB 10700
210 meno%=3:opt%=2:GOSUB 10700
220 a=320:b=200:meno%=0
230 GOSUB 11550
240 GOSUB 11120
250 IF meno%=0 THEN 240
260 ON meno% GOSUB 290,320,350,380,550,580
270 meno%=0:GOTO 240
280 RETURN
290 ON opt% GOTO 280,300,310
300 MODE 2:LIST
310 x=20:GOTO 10620
320 ON opt% GOTO 280,330,340
330 |TAPE:opt%=1:meno%=2:GOSUB 10700:RETURN
340 |DISC:opt%=2:meno%=2:GOSUB 10700:RETURN
350 ON opt% GOTO 280,360,370
360 prtflag=1:opt%=1:meno%=3:GOSUB 10700:RETURN
370 prtflag=0:opt%=2:meno%=3:GOSUB 10700:RETURN
380 ON opt% GOTO 280,390,420,500,460
390 CLS#1:WINDOW SWAP 1,0:CAT
400 IF prtflag=1 THEN x=1:y=1:d=20:w=77:GOSUB 11660
410 WINDOW SWAP 0,1:RETURN
420 CLS#1:WINDOW SWAP 1,0:CAT
430 CLEAR INPUT:INPUT "Filename :",f$
440 |ERA,@f$
450 WINDOW SWAP 0,1:RETURN
460 WINDOW SWAP 1,0
470 CLEAR INPUT:INPUT "User:",us%
480 IF us%>=0 AND us%<16 THEN |USER,us% ELSE PRINT "Invalid User."
490 WINDOW SWAP 0,1:GOSUB 10810:RETURN
500 WINDOW SWAP 1,0
510 CLEAR INPUT:PRINT "Drive (A,B) ?"
520 dr$=INKEY$:IF dr$="" THEN 520
530 IF UPPER$(dr$)<>"A" AND UPPER$(dr$)<>"B" THEN PRINT "Invalid Drive." ELSE |DRIVE,@dr$
540 WINDOW SWAP 0,1:GOSUB 10810:RETURN
550 ON opt% GOTO 280,560,570
560 CLS#1:RETURN
570 GOSUB 10830:RETURN
580 ON opt% GOTO 280,590,600,610
590 |CPM
600 CLEAR INPUT:MODE 2:END
610 CALL 0
620 CLEAR INPUT:MODE 2:END
630 RETURN
10000 REM * * * Set up Graphics * * *
10010 CALL &BC02:MODE 2:IF PEEK(&A1FE)=&E5 THEN 10030
10020 SYMBOL AFTER 140:MEMORY &5FFF:POKE &A1FE,&E5
10030 POKE &A1FF,0
10040 SYMBOL 255,3,3,6,6,76,108,56,24
10050 SYMBOL 150,255,128,191,160,160,160,160,160
10060 SYMBOL 155,0,0,0,0,0,255,0,255
10070 SYMBOL 156,255,1,253,5,5,5,5,5
10080 SYMBOL 154,255,0,255
10090 SYMBOL 147,160,160,160,160,160,191,128,255
10100 SYMBOL 151,5,5,5,5,5,5,5,5
10110 SYMBOL 153,5,5,5,5,5,253,1,255
10120 SYMBOL 149,160,160,160,160,160,160,160,160
10130 SYMBOL 254,255,0,255,0,255,0,255,0
10140 RETURN
10150 REM * * * Set up MENUS & the MACHINE CODE * * *
10160 GOSUB 11760
10170 DIM num(25),wid(25),menu$(25,25),omeno%(25),oopt%(25),men(25)
10180 DIM nt$(10),top$(40),topx%(40),topxx%(40)
10190 FOR t=1 TO no%
10200 menu$(0,0)=SPACE$(10)
10210 omeno%(t)=0:oopt%(t)=0
10220 j%=0:g%=0:READ meno%,num(meno%)
10225 men(t)=meno%
10230 FOR x=1 TO num(meno%)
10240 READ menu$(meno%,x)
10250 g%=LEN(menu$(meno%,x)):IF g%>9 AND g%>j% THEN j%=g%
10260 menu$(meno%,x)=menu$(meno%,x)+" "
10270 NEXT:menu$(meno%,0)="QUIT MENU "
10280 IF j%>9 THEN wid(meno%)=j%+1 ELSE wid(meno%)=10
10290 NEXT
10300 FOR t=1 TO 10:nt$(t)=SPACE$(59):NEXT
10310 RETURN
10320 REM * * * Pull down menu * * *
10330 CALL &A000:LOCATE x1,1:PRINT top$(meno%)
10340 y=2:d=num(meno%)+1:w=wid(meno%)+1:GOSUB 11430
10350 m$=menu$(meno%,0)
10360 LOCATE x+1,3:PRINT m$
10370 FOR y=1 TO num(meno%)
10380 m$=menu$(meno%,y)
10390 LOCATE x+1,y+3:PRINT m$
10400 NEXT
10410 REM * * * Move bar up and down * * *
10420 fl=-2:y=2:oy=y:WHILE fl=-2:fl=INKEY(47)+INKEY(76)
10430 oy=y
10440 GOSUB 10530
10450 IF INKEY(2)+INKEY(0)+INKEY(73)+INKEY(72)=-4 THEN 10510
10460 y=y+INKEY(2):y=y-INKEY(0)
10470 y=y+INKEY(73):y=y-INKEY(72)
10480 IF y<2 THEN y=2
10490 IF y>num(meno%)+2 THEN y=num(meno%)+2
10500 IF y=oy THEN 10510 ELSE GOSUB 10570
10510 WEND
10520 meno%=men(meno%):opt%=y-1:CALL &A07D:RETURN
10530 LOCATE x+1,y+1
10540 m$=menu$(meno%,y-2)
10550 PRINT CHR$(24)+m$+STRING$(wid(meno%)-LEN(m$)+1,CHR$(32))+CHR$(24)
10560 RETURN
10570 LOCATE x+1,oy+1
10580 m$=menu$(meno%,oy-2)
10590 PRINT m$+STRING$(wid(meno%)-LEN(m$)+1,CHR$(32))
10600 oy=y:RETURN
10610 REM * * * Version 1.2 * * *
10620 CLEAR INPUT:CALL &A000
10630 ver$=CHR$(24)+"Version 1.2 - "+CHR$(164)+" 1988 Marcus Williams"+CHR$(24)
10640 y=10:d=2:w=LEN(ver$):PAP=1:GOSUB 11430
10650 LOCATE x+1,11:PRINT ver$
10660 LOCATE x+1,12:PRINT CHR$(24)+SPACE$(11)+"Press Any Key"+CHR$(24)
10670 WHILE INKEY$="":WEND:CALL &A07D
10680 RETURN
10690 REM * * * Ticks (Select on) * * *
10700 e$=menu$(omeno%(meno%),oopt%(meno%))
10710 menu$(omeno%(meno%),oopt%(meno%))=LEFT$(e$,LEN(e$)-2)+" "
10720 m$=menu$(meno%,opt%)
10730 l=wid(meno%)-LEN(m$):a$=""
10740 IF l>0 THEN a$=SPACE$(wid(meno%)-LEN(m$))
10750 a$=a$+CHR$(255)
10760 m$=m$+a$
10770 menu$(meno%,opt%)=m$
10780 omeno%(meno%)=meno%:oopt%(meno%)=opt%
10790 RETURN
10800 REM * * * Copyright,drive,user display line * * *
10810 LOCATE 1,iy:PRINT CHR$(24)+"Pull Down Menu System "+ CHR$(164)+" 1988 M Williams        Drive is "+CHR$(PEEK(&A702)+65)+":  User Number is "+STR$(PEEK(&A701))+CHR$(18)+CHR$(24):RETURN
10820 REM * * * Notepad * * *
10830 ti=1:t$="NotePad CTRL P/CLR to Print notepad, CTRL E to End"
10840 CLEAR INPUT:CALL &A000:x=10:y=2:d=11:w=59:GOSUB 11430
10850 FOR t=4 TO 13:LOCATE x+1,t:PRINT nt$(t-3):NEXT
10860 x=11:y=4
10870 a$=INKEY$:ox=x:oy=y
10880 LOCATE x,y:un$=COPYCHR$(#0):PRINT CHR$(211)
10890 IF a$="" THEN LOCATE x,y:PRINT un$:GOTO 10870
10900 e=ASC(a$):IF e=13 AND y<14 THEN x=10:y=y+1
10910 IF e=242 THEN x=x-2
10920 IF e=240 THEN y=y-1:x=x-1
10930 IF e=241 THEN y=y+1:x=x-1
10940 IF e=5 THEN CALL &A07D:RETURN
10950 IF e=16 THEN GOSUB 11060:x=x-1
10960 IF e=127 THEN del=1
10970 IF e>31 AND e<125 THEN LOCATE x,y:PRINT a$:MID$(nt$(y-3),x-10,1)=a$ ELSE LOCATE ox,oy:PRINT un$
10980 IF del=1 THEN x=x-2
10990 IF x<69 THEN x=x+1 ELSE x=11:y=y+1
11000 IF y>13 THEN y=13
11010 IF x<11 AND y>4 THEN x=69:y=y-1
11020 IF x<11 AND y=4 THEN x=11
11030 IF y<4 THEN y=4
11040 IF del=1 THEN LOCATE x,y:PRINT " ":MID$(nt$(y-3),x-10,1)=" ":del=0
11050 GOTO 10870
11060 GOSUB 11090:IF prt=1 THEN FOR t=1 TO 10:PRINT #8,nt$(t):NEXT
11070 RETURN
11080 REM * * * Printer ON LINE test * * *
11090 IF INP(&7500) AND 64 THEN SOUND 1,142,10:prt=0 ELSE prt=1
11100 RETURN
11110 REM * * * Pointer Routine * * *
11120 oa=a:ob=b:TAG:MOVE a,b,1,1:PRINT CHR$(240);
11130 a=a+INKEY(1):a=a-INKEY(8)
11140 a=a+INKEY(75):a=a-INKEY(74)
11150 b=b+INKEY(0):b=b-INKEY(2)
11160 b=b+INKEY(72):b=b-INKEY(73)
11170 IF a>639 THEN a=639
11180 IF a<0 THEN a=0
11190 IF b<0 THEN b=0
11200 IF b>399 THEN b=399
11210 ch=INKEY(47)+INKEY(76)
11220 TAG:MOVE oa,ob,1,1:PRINT CHR$(240);
11230 IF ch=-2 THEN 11120
11240 TAGOFF
11250 IF b>382 THEN 11270 ELSE RETURN
11260 REM * * * Find which menu pulled and to pull it * * *
11270 t=1:WHILE t<=no%
11280 IF a>=topx(t) AND a<=topxx(t)-8 THEN meno%=t:GOTO 11300 ELSE meno%=0
11290 t=t+1:WEND
11300 IF meno%=0 THEN RETURN
11310 x1=(topx(meno%)+8)/8
11315 IF x1+wid(meno%)>78 THEN x=78-wid(meno%) ELSE x=x1
11320 GOSUB 10330:RETURN
11330 REM * * * TOP options * * *
11340 m=1:FOR t=1 TO LEN(t$)
11350 IF MID$(t$,t,1)<>" " THEN top$(m)=top$(m)+MID$(t$,t,1) ELSE m=m+1
11360 NEXT
11370 FOR t=1 TO m
11380 topx(t)=topxx(t-1):topxx(t)=((LEN(top$(t))+1)*8)+topxx(t-1)
11390 NEXT
11400 LOCATE 1,1:PRINT CHR$(24)+t$+" "+CHR$(18)+CHR$(24)
11410 RETURN
11420 REM * * * Empty Box + title if needed * * *
11430 IF PAP=1 THEN PEN #2,0:PAPER #2,1:PEN 0:PAPER 1
11435 WINDOW#2,x+1,x+w,y+1,y+d
11440 CLS#2:LOCATE x,y:PRINT CHR$(150)+STRING$(w,CHR$(154))+CHR$(156)
11450 FOR t=1 TO d
11460 LOCATE x,y+t:PRINT CHR$(149):LOCATE x+w+1,y+t:PRINT CHR$(151)
11470 NEXT
11480 LOCATE x,y+t:PRINT CHR$(147)+STRING$(w,CHR$(155))+CHR$(153)
11490 IF ti<>1 THEN 11525
11500 LOCATE x+1,y+1:am=(w-LEN(t$))/2
11510 e$=STRING$(am-1,CHR$(254))+" "+t$+" "
11515 e$=e$+STRING$(w-LEN(e$),CHR$(254))
11520 PRINT e$:ti=0
11525 IF PAP=1 THEN PEN #2,1:PAPER #2,0:PEN 1:PAPER 0:pap=0
11530 RETURN
11540 REM * * * Please wait * * *
11550 IF flag=1 THEN CALL &A000
11560 LOCATE 32,11:IF PEEK(&A1FF)=&E5 THEN 11610
11570 w=11:d=1:x=32:y=11:GOSUB 11430
11580 LOCATE x+1,y+1:PRINT "Please wait"
11590 POKE &A1FF,&E5
11600 RETURN
11610 IF flag=1 THEN CALL &A07D:flag=0:RETURN
11620 FOR t=11 TO 14:LOCATE 32,t:PRINT SPACE$(w+2):NEXT
11630 POKE &A1FF,0
11640 RETURN
11650 REM * * * Print out window * * *
11660 GOSUB 11090
11670 IF prt=0 THEN RETURN
11680 FOR t=y TO y+d
11690 FOR q=x TO x+w
11700 LOCATE q,t:a$=a$+COPYCHR$(#0)
11710 NEXT
11720 PRINT #8,a$:a$=""
11730 NEXT
11740 RETURN
11750 REM * * * Poke Machine Cede * * *
11760 DATA 21,00,C0,22,F9,A0,22,FB,3B9
11770 DATA A0,22,FD,A0,21,00,60,22,302
11780 DATA FF,A0,3E,08,32,05,A1,3E,2FB
11790 DATA 00,32,01,A1,3E,18,32,03,15F
11800 DATA A1,3E,50,32,04,A1,3A,03,243
11810 DATA A1,32,06,A1,2A,FD,A0,ED,42E
11820 DATA 5B,FF,A0,3A,04,A1,4F,06,32E
11830 DATA 00,ED,B0,13,ED,53,FF,A0,48F
11840 DATA 2A,FB,A0,11,00,08,19,22,219
11850 DATA FB,A0,22,FD,A0,3A,05,A1,43A
11860 DATA 3D,28,07,21,05,A1,35,C3,22B
11870 DATA 2C,A0,3E,08,32,05,A1,2A,214
11880 DATA F9,A0,11,50,00,19,22,F9,32E
11890 DATA A0,22,FB,A0,22,FD,A0,3A,456
11900 DATA 06,A1,3D,28,07,21,06,A1,1DB
11910 DATA 35,C3,2C,A0,C9,21,00,C0,36E
11920 DATA 22,F9,A0,22,FB,A0,22,FD,497
11930 DATA A0,21,00,60,22,FF,A0,3E,320
11940 DATA 08,32,05,A1,3E,00,32,01,151
11950 DATA A1,3E,18,32,03,A1,3E,50,25B
11960 DATA 32,04,A1,3A,03,A1,32,06,1ED
11970 DATA A1,ED,5B,FD,A0,2A,FF,A0,54F
11980 DATA 3A,04,A1,4F,06,00,ED,B0,2D1
11990 DATA 23,22,FF,A0,2A,FB,A0,11,3BA
12000 DATA 00,08,19,22,FB,A0,22,FD,2FD
12010 DATA A0,3A,05,A1,3D,28,07,21,20D
12020 DATA 05,A1,35,C3,A9,A0,3E,08,32D
12030 DATA 32,05,A1,2A,F9,A0,11,50,2FC
12040 DATA 00,19,22,F9,A0,22,FB,A0,391
12050 DATA 22,FD,A0,3A,06,A1,3D,28,305
12060 DATA 07,21,06,A1,35,C3,A9,A0,310
12070 DATA C9,00,C0,00,C0,00,C0,00,309
12080 DATA 00,00,00,00,00,00,00,00,00
12090 IF PEEK(&A000)=&21 AND PEEK(&A07D)=&21 THEN RETURN
12100 RESTORE 11760:FOR x=&A000 TO &A100 STEP 8
12110 FOR t=0 TO 7:READ a$
12120 POKE x+t,VAL("&"+a$)
12130 sum=sum+VAL("&"+a$)
12140 NEXT t
12150 READ d$:IF sum<>VAL("&"+d$) THEN PRINT "Error":END
12160 sum=0:NEXT
12170 RESTORE:RETURN
12180 REM If of course you don't mind having the Venetian Blind Version -
12190 REM the typing is a lot less. Just leave out lines 11760-12170 and
12200 REM Type the following ones in. Then Edit line 10160 to read;
12210 REM 10160 GOSUB 12220
12220 DATA 21,00,c0,11,ff,5f,01,00,40,ed,b0,c9,END
12230 DATA 11,00,c0,21,ff,5f,01,00,40,ed,b0,c9,END
12240 RESTORE 12220:t=&A000:WHILE a$<>"END":READ a$
12250 POKE t,VAL("&"+a$)
12260 t=t+1:WEND
12270 a$=""
12280 t=&A07D:WHILE a$<>"END":READ a$
12290 POKE t,VAL("&"+a$)
12300 t=t+1:WEND
12310 RESTORE:RETURN