10REM ** The file location is the 20REM drive in DFS mode, and the 30REM directory in ADFS mode. ADFS% 40REM sets the mode of this (FALSE= 50REM drive, TRUE=dir) ** 60ADFS%=FALSE 70ON ERROR GOTO1620 80*FX4 1 90M%=100 100DIM NAME$(M%),LOC$(M%),FILE$(M%),TYPE$(M%) 110*FX12,2 120*FX229 0 130DIM MSGBUF% 120 140: 150REM ***************************** 160REM * * 170REM * Enhanced menu program * 180REM * ===================== * 190REM * Copyright (C) 1995, by * 200REM * Tom Seddon * 210REM * * 220REM ***************************** 230: 240MODE7:VDU23;8202;0;0;0;28,0,24,39,0 250PROCasm 260PROCscreen 270PROCmsg("Reading names...") 280PROCinit:PROCunmsg 290PROCmsg("Sorting names...") 300PROCsortnames 310PROCunmsg 320K%=FNselect 330IF K%=-1 THEN CALL((!&FFFC) AND &FFFF) 340*FX4,0 350*FX12,2 360*FX229 0 370: 380PROCmsg("Loading "+NAME$(CSEL%)) 390IF ADFS% THEN $&700="DIR "+LOC$(CSEL%) ELSE $&700="DRIVE "+LOC$(CSEL%) 400X%=0:Y%=7:CALL&FFF7 410IF (ASC(TYPE$(CSEL%))AND&DF)=ASC("M") THEN $&700="RUN "+FILE$(CSEL%):X%=0:Y%=7:CALL&FFF7:END 420IF (ASC(TYPE$(CSEL%))AND&DF)=ASC("B") THEN CHAIN FILE$(CSEL%):END 430CLS:PRINT"Unknown file type ";TYPE$(CSEL%) 440: 450: 460: 470: 480: 490: 500: 510: 520END 530DEFPROCscreen 540LOCALT% 550: 560?&FE00=1:?&FE01=0 570FORT%=0TO1:PRINTTAB(12,T%)CHR$141CHR$132CHR$157CHR$131"DISK MENU "CHR$156:NEXT 580PRINT'CHR$131"Use the"CHR$130"cursor keys"CHR$131"to move the box."'CHR$131"Press"CHR$130"return"CHR$131"when the program you want"'CHR$131"is highlighted." 590PRINTTAB(0,6)CHR$148STRING$(39,",") 600PRINTTAB(0,22)CHR$148STRING$(39,",")CHR$131"Disk menu version"CHR$129"2.0"CHR$131"(C) 1995 T.Seddon"; 610FORT%=0TO39STEP4:T%!&7FC0=T%!&7F98:T%!&7F98=T%!&7F70:T%!&7F70=&20202020:NEXT 620: 630?&FE00=1:?&FE01=40 640ENDPROC 650: 660DEFPROCmsg(X$) 670LOCALX% 680: 690REM &7DB8,&7DE0,&7E08... 700FORX%=0 TO 39 STEP 4 710!(MSGBUF%+X%)=X%!&7DB8 720!(MSGBUF%+40+X%)=X%!&7DE0 730!(MSGBUF%+80+X%)=X%!&7E08 740X%!&7DB8=0:X%!&7DE0=0 750X%!&7E08=0:NEXT 760!&7DB8=&20839D84 770!&7DE0=&20839D84 780!&7E08=&20839D84 790PRINTTAB(20-LEN(X$)DIV2,12);X$ 800ENDPROC 810: 820DEFPROCunmsg 830FORX%=0 TO 39 STEP 4 840X%!&7DB8=!(MSGBUF%+X%) 850X%!&7DE0=!(MSGBUF%+40+X%) 860X%!&7E08=!(MSGBUF%+80+X%) 870NEXT 880ENDPROC 890: 900DEFPROCinit 910NUMNAMES%=0 920REPEAT 930READ NAME$(NUMNAMES%) 940IF NAME$(NUMNAMES%)<>"DONE" THEN READ LOC$(NUMNAMES%),FILE$(NUMNAMES%),TYPE$(NUMNAMES%):NUMNAMES%=NUMNAMES%+1 950UNTILNAME$(NUMNAMES%)="DONE" 960ENDPROC 970: 980ENDPROC 990: 1000DEFFNselect 1010TLA%=0:CX%=0:CY%=0 1020FORY%=7TO22:PRINTTAB(2,Y%)CHR$131TAB(20,Y%)CHR$156CHR$131:NEXT 1030TSEL%=0 1040REPEAT 1050TXY%=TSEL% DIV 2 1060IF (TSEL% MOD 2)=0 THEN TXX%=3 ELSE TXX%=22 1070PRINTTAB(TXX%,7+TXY%)LEFT$(NAME$(TSEL%),15); 1080TSEL%=TSEL%+1 1090UNTILTSEL%=32 OR TSEL%>=NUMNAMES% 1100CX%=0:CY%=0:CSEL%=0 1110REPEAT 1120IF (CSEL% MOD 2)=0 PRINTTAB(0,7+CY%)CHR$132CHR$157TAB(20,7+CY%)CHR$156; ELSE PRINTTAB(19,7+CY%)CHR$132CHR$157 1130*FX19 1140*FX21 1150G%=GET 1160IF G%>=136 AND G%<=139 THEN PRINTTAB((CSEL% MOD 2)*20,7+CY%)CHR$131CHR$131:D%=EVAL("FN"+STR$(G%)) 1170: 1180: 1190: 1200: 1210: 1220: 1230: 1240: 1250UNTILG%=13 OR G%=27 1260IF G%=13 THEN =CSEL% ELSE =-1 1270: 1280: 1290: 1300: 1310: 1320: 1330: 1340: 1350DEFFN139:REM UP 1360IF CSEL%<2 THEN =0 1370IF CY%>0 THEN CY%=CY%-1:CSEL%=CSEL%-2:=0 1380IF CY%=0 THEN CSEL%=CSEL%-2:PROCSCROLLUP:=0 1390=0 1400=0 1410DEFFN138:REM DOWN 1420IF (CY%<15 AND CSEL%<(NUMNAMES%-2)) THEN CY%=CY%+1:CSEL%=CSEL%+2:=0 1430IF CY%=15 AND CSEL%<(NUMNAMES%-2) THEN CSEL%=CSEL%+2:PROCSCROLLDOWN 1440=0 1450: 1460DEFFN136:REM LEFT 1470LOCALD% 1480: 1490IF CSEL%=0 THEN =0 1500IF CX%=1 THEN CX%=0:CSEL%=CSEL%-1:=0 1510IF CX%=0 THEN CX%=1:CSEL%=CSEL%+1:D%=FN139:=0 1520=0 1530: 1540DEFFN137:REM RIGHT 1550LOCALD% 1560: 1570IF (CX%=0 AND CSEL%<(NUMNAMES%-1)) THEN CX%=1:CSEL%=CSEL%+1:=0 1580IF CX%=1 AND CSEL%<(NUMNAMES%-1) THEN CX%=0:CSEL%=CSEL%-1:D%=FN138:=0 1590=0 1600: 1610END 1620MODE7 1630REPORT:PRINT" at line ";ERL 1640*FX4,0 1650*FX12,2 1660*FX229 0 1670END 1680: 1690DEFPROCasm 1700ctr=&70:from=&71:to=&73 1710FORT%=0TO2STEP2:P%=&900:[opt T% 1720.moveup 1730.scrolldown 1740lda #16:sta ctr 1750lda #&70:sta to 1760lda #&7F:sta to+1 1770lda #&48:sta from 1780lda #&7F:sta from+1 1790.scrolldownloop 1800ldy #39 1810.scrolldownloop2 1820lda (from),Y:sta (to),Y 1830dey:bpl scrolldownloop2 1840sec 1850lda from:sbc #40:sta from 1860lda from+1:sbc #0:sta from+1 1870sec 1880lda to:sbc #40:sta to 1890lda to+1:sbc #0:sta to+1 1900dec ctr 1910bne scrolldownloop 1920lda #32:ldx #39:.downclrlp sta &7D18,X:dex:bpl downclrlp 1930rts 1940: 1950.movedown 1960.scrollup 1970lda #16:sta ctr 1980lda #&18:sta to 1990lda #&7D:sta to+1 2000lda #&40:sta from 2010lda #&7D:sta from+1 2020.scrolluploop 2030ldy #39 2040.scrolluploop2 2050lda (from),Y:sta (to),Y 2060dey:bpl scrolluploop2 2070clc 2080lda from:adc #40:sta from 2090lda from+1:adc #0:sta from+1 2100clc 2110lda to:adc #40:sta to 2120lda to+1:adc #0:sta to+1 2130dec ctr 2140bne scrolluploop 2150lda #32:ldx #39:.upclrlp sta &7F70,X:dex:bpl upclrlp 2160rts 2170] 2180NEXT 2190ENDPROC 2200: 2210DEFPROCSCROLLDOWN 2220LOCALOCS% 2230OCS%=CSEL% 2240CSEL%=CSEL%-CX% 2250CALLmovedown 2260PRINTTAB(2,22)CHR$131LEFT$(NAME$(CSEL%),15) 2270IF CSEL%<(NUMNAMES%-1) PRINTTAB(21,22)CHR$131LEFT$(NAME$(CSEL%+1),15); 2280CSEL%=OCS% 2290ENDPROC 2300: 2310DEFPROCSCROLLUP 2320LOCALOCS% 2330OCS%=CSEL% 2340CSEL%=CSEL%-CX% 2350CALLmoveup 2360PRINTTAB(2,7)CHR$131LEFT$(NAME$(CSEL%),15)TAB(21,7)CHR$131LEFT$(NAME$(CSEL%+1),15) 2370CSEL%=OCS% 2380ENDPROC 2390: 2400DEFPROCsortnames 2410PROCquick(0,NUMNAMES%-1) 2420ENDPROC 2430: 2440DEFPROCquick(llo%,rhi%) 2450LOCALmid$,lhi%,rlo% 2460mid$=NAME$((llo%+rhi%) DIV 2) 2470lhi%=rhi%:rlo%=llo% 2480REPEAT 2490IF NAME$(rlo%)=mid$ 2500IF NAME$(lhi%)>mid$ REPEAT:lhi%=lhi%-1:UNTILNAME$(lhi%)<=mid$ 2510IF rlo%<=lhi% PROCSWAP(rlo%,lhi%):lhi%=lhi%-1:rlo%=rlo%+1 2520UNTILrlo%>lhi% 2530IF llo%