3 ' by Nelson Ford, P.O.Box 61565, Houston, TX 77035
4 '
5 ' (A simplified version of this program with explanations appeared in the ' June 1984 issue of PC TECH JOURNAL. The added code allows input to be ' controlled on a character-by-character basis.)
6 '
7 ' This code is taken from DISKCAT, (C) 1983,1984 N. FORD, a disk file ' catalog program. The compiled versions of the DISKCAT programs are ' available in user group libraries and bulletin boards. The latest
8 ' version of DISKCAT with the complete BASIC source code may be ordered ' for $35 from the above address. Placing this portion of the code in ' the public domain does not abrogate the DISKCAT copyrights.
9 '
10 DEFINT A-Z: SCREEN 0,1: COLOR 7,0,0: WIDTH 80: CLS: KEY OFF
240 IF MID$(IN$,WL,1)=" " THEN WL=WL-1: IF WL>0 THEN 240
250 COLOR BG,FG
260 LOCATE QY,QX,1: PRINT IN$;
270 LOCATE QY,QX+WI-1
280 W$=INKEY$: DEF SEG=&H40: QK=PEEK(&H17) AND 96:
290 IF QK1<>QK THEN LOCATE 25,73: PRINT LOCKS$(QK/32);: QK1=QK: SOUND 400+QK,.3: GOTO 270
300 IF W$="" THEN 280
310 IF W$=BREAK$ THEN STOP
320 IF LEN(W$)=1 THEN 480 ELSE KY= ASC(RIGHT$(W$,1))
330 IF QC THEN 350
340 IF KY= INS.KEY THEN IF INSERT=NO THEN INSERT=YES: LOCATE,,,4,13: GOTO 260 ELSE INSERT=NO: LOCATE,,,13: GOTO 280
350 IF KY= RT.CURSOR THEN WI=WI-(WI<WL): GOTO 270
360 IF KY= LF.CURSOR THEN WI=WI+(WI> 1): GOTO 270
370 IF KY=DEL.KEY THEN IF NOT QC THEN IN$= LEFT$(IN$,WI-1)+RIGHT$(IN$,FL-WI)+" ": WL=WL-1: GOTO 260 ELSE MID$(IN$,WI,1)=" ": GOTO 260
380 IF INSERT THEN INSERT=NO: LOCATE,,,13
390 IF KY= HOME THEN WI=1: GOTO 270
400 IF KY= END.KEY THEN WI= WL+1: GOTO 270
410 IF KY= CTRL.END THEN IN$=LEFT$(IN$,WI-1)+SPACE$(FL-WI+1): WL=WI-1: GOTO 260
420 IF KY<>CTRL.RT OR WI=WL+1 THEN 440
430 WI=WI+1: IF WI=WL+1 THEN 270 ELSE IF MID$(IN$,WI-1,1)=" " THEN 270 ELSE 430
440 IF KY<>CTRL.LF OR WI=1 THEN 470
450 QC$=CONTROL$: CONTROL$="": IF QC$="" THEN QC=NO ELSE QC=YES
460 WI=WI-1: IF WI=1 THEN 270 ELSE IF MID$(IN$,WI-1,1)=" " THEN 270 ELSE 460
470 MOVE.IT= YES: GOTO 790
480 IF W$= NTR$ THEN 790
490 IF W$= ESC$ THEN KY=ESC: MOVE.IT=YES: GOTO 790
500 IF NOT QC THEN 600
510 IF W$ <> BKSP$ THEN 540
520 IF WI>1 THEN WI=WI-1: Q$=MID$(QC$,WI,1) ELSE 260
530 IF INSTR("#U_",Q$) =0 THEN 500 ELSE MID$(IN$,WI,1)=" ": GOTO 260
540 IF WI>FL THEN 600
550 Q$= MID$(QC$,WI,1)
560 IF Q$="#" THEN CHAR.CODE=NUMS: GOTO 600
570 IF Q$="U" THEN CHAR.CODE=CAPS: GOTO 610
580 IF Q$="_" THEN CHAR.CODE=0: GOTO 610
590 W$=Q$: GOTO 680
600 IF CHAR.CODE=NUMS THEN IF (W$="-" AND WI>1) OR W$="+" THEN IN$=W$+IN$: GOTO 790
610 IF WI>FL THEN 650
620 IF CHAR.CODE=0 THEN IF W$>=" " AND W$<="~" THEN 680
630 IF CHAR.CODE=NUMS THEN IF W$>="0" AND W$<="9" THEN 680
640 IF CHAR.CODE=CAPS THEN IF W$>="a" AND W$<="z" THEN W$=CHR$(ASC(W$)-32): GOTO 680 ELSE IF W$>=" " AND W$<"a" THEN 680
650 IF W$=BKSP$ THEN IF WI>1 THEN IN$=LEFT$(IN$,WI-2)+RIGHT$(IN$,FL-WI+1)+" ": WL=WL-1: WI=WI-1: GOTO 260
660 GOTO 280
670 '
680 IF NOT INSERT THEN MID$(IN$,WI,1)=W$ ELSE IF WL < FL THEN WL=WL+1: IN$= LEFT$( LEFT$(IN$,WI-1) +W$ +RIGHT$(IN$,FL-WI+1), FL): WI=WI+1: GOTO 260 ELSE 280
690 IF WI>1 THEN 740
700 IF NOT QC THEN IN$=W$+SPACE$(FL-1): GOTO 730
710 FOR QQ=2 TO FL: IF INSTR("#u=UI_",MID$(QC$,QQ,1))>0 THEN MID$(IN$,QQ,1)=" "
720 NEXT
730 LOCATE,QX: PRINT IN$;: LOCATE,QX: WL=1
740 PRINT W$;
750 WI=WI+1: IF WI>WL THEN WL=WI-1
760 IF WI=>FL THEN 780
770 IF QC THEN Q$=MID$(QC$,WI,1): IF INSTR("#Ul_",Q$)=0 THEN W$=Q$: GOTO 680
780 IF FL>2 OR WL<FL THEN 260
790 COLOR FG,BG: LOCATE QY,QX,,13: PRINT IN$;: IN$=LEFT$(IN$,WL): INSERT=NO: RETURN