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 |