1 REM FLIP.BAS - ADAPTED FROM:
2 REM
https://archive.org/details/programming-tricks-and-skills
3 REM DIM QBTST AS INTEGER: IF VARPTR(QBTST) < 65536 THEN LET ISQBASIC = 1: ELSE LET ISQBASIC = 0
6 REM CLEAR
7 LET MX = 30: LET SC = 0: LET CL = 7: LET ML = 6
8 DIM C(MX * CL) AS STRING
9 DIM M(ML) AS STRING, H(CL) AS STRING
10 GOSUB 1260: REM INITIALIZATION
20 LET X$ = "WOULD YOU LIKE TO:"
30 LET LMAX = ML: LET L = CHOICE
40 GOSUB 1170
50 LOCATE TP, 1, 0, 0: PRINT ""
60 FOR I = 1 TO ML
70 PRINT TAB(1); " "; M$(I)
80 IF S = 2 THEN PRINT
90 NEXT I
100 LET Y$ = W$ + " TO MOVE CURSOR UP & DOWN"
110 LET Z$ = "PRESS ENTER TO CHOOSE AN OPTION"
120 GOSUB 1140
130 GOSUB 890: IF KP <> ENTER THEN GOTO 130
140 LET CHOICE = L
150 IF CHOICE = 1 AND LAST = MX - 1 THEN LET X$ = "FILE FULL-SAVE CARDS": GOTO 30
160 IF LAST = 0 AND CHOICE > 1 AND CHOICE <> 5 THEN LET X$ = "NO CARDS IN FILE": GOTO 30
170 LET X$ = M$(CHOICE): LET LMAX = CL
180 LET Z$ = "PRESS ENTER FOR MENU": LET L = 1
190 ON CHOICE GOSUB 230, 290, 350, 390, 690, 690
200 IF CHOICE < 6 THEN GOTO 20
210 CLS : PRINT "CARDS SAVED. YOU ARE NO LONGER IN FLIP-FILE."
220 END
225 REM ADD A CARD TO FILE
230 LET CARD = LAST + 1
240 LET LAST = LAST + 1
250 GOSUB 810: GOSUB 1140
260 GOSUB 990
270 IF KP <> ENTER THEN GOTO 250
280 RETURN
285 REM DELETE A CARD
290 GOSUB 810
300 LET Y$ = "PRESS TAB TO": LET Z$ = X$
310 GOSUB 1140
320 GOSUB 890
330 IF KP = OTHER THEN LET C$(CARD * CL + CL) = D$: LET ND = ND + 1: GOTO 290
340 RETURN
345 REM ALTER A CARD
350 GOSUB 810: GOSUB 1140
360 GOSUB 990
370 IF KP <> ENTER THEN GOTO 360
380 RETURN
385 REM FLIP THROUGH CARDS MANUALLY
390 REM LET CARD = 1
400 LET Y$ = W$ + " TO FLIP, TAB TO SEARCH": GOSUB 810
410 GOSUB 1140: LET L = 1: GOSUB 890
420 IF (KP = UP OR KP = RIGHT) AND CARD < LAST THEN LET CARD = CARD + 1
430 IF (KP = DOWN OR KP = LEFT) AND CARD > 1 THEN LET CARD = CARD - 1
440 IF KP = OTHER THEN GOSUB 470
450 IF KP <> ENTER THEN GOTO 400
460 RETURN
465 REM SEARCH ROUTINE
470 LET CT = CARD: LET CARD = SC
480 FOR I = 1 TO CL: LET C$(SC + I) = "": NEXT I
490 LET X$ = "FLIP-SEARCH": LET Y$ = "MOVE TO A LINE THEN TYPE SUBJECT"
500 LET Z$ = "PRESS ENTER TO START SEARCH"
510 GOSUB 810: GOSUB 1140
520 LET KP = 0: GOSUB 990
530 IF C$(SC + L) = "" THEN LET CARD = CT: RETURN
540 LET Y$ = "SEARCHING FOR: " + C$(SC + L): LET Z$ = "PRESS ANY KEY TO CONTINUE"
550 LET KP = 0: LET FOUND = 0
560 FOR I = 1 TO LAST
570 LET FLAG = 0
580 IF C$(I * CL + L) = C$(SC + L) THEN LET CT = I: LET FLAG = 1
590 LET CARD = I
600 GOSUB 810: GOSUB 1140
610 IF FLAG = 1 THEN GOSUB 960: LET FOUND = FOUND + 1
620 IF KP = ENTER THEN LET I = LAST
630 NEXT I
640 LET CARD = CT
650 LET X$ = "SEARCH OVER": GOSUB 1170
660 IF FOUND > 0 THEN LET Z$ = "FOUND: " + STR$(FOUND) + " TIMES"
670 IF FOUND = 0 THEN LET Z$ = "DIDN'T FIND: " + C$(SC + L)
680 RETURN
685 REM LOAD AND SAVE CARDS
690 IF CHOICE = 5 THEN OPEN F$ FOR INPUT AS #10: INPUT #10, NC
700 IF CHOICE = 6 THEN OPEN F$ FOR OUTPUT AS #10: PRINT #10, LAST - ND
710 GOSUB 1170: GOSUB 1140
720 LET J = 0: IF CHOICE = 5 THEN LET J = LAST: LET LAST = LAST + NC
730 LET J = J + 1
740 FOR K = 1 TO CL
750 IF CHOICE = 5 THEN LINE INPUT #10, C$(J * CL + K)
760 IF CHOICE = 6 AND C$(J * CL + CL) <> D$ THEN PRINT #10, C$(J * CL + K)
770 NEXT K
780 IF J < MX AND J < LAST THEN GOTO 730
790 CLOSE #10
800 RETURN
805 REM DISPLAY CONTENTS OF CARD
810 GOSUB 1170
820 LOCATE TP, 1, 0: PRINT ""
830 FOR K = 1 TO CL
840 LET T$ = C$(CARD * CL + K)
850 PRINT TAB(2); H$(K); TAB(DENT); T$
860 REM IF S = 2 THEN PRINT
870 NEXT K
880 RETURN
885 REM MOVE CURSOR UP & DOWN
890 LOCATE TP + L * S, 1, 0: PRINT ">";
900 LET OL = L
910 GOSUB 960
920 IF (KP = UP OR KP = LEFT) AND L > 1 THEN LET L = L - 1
930 IF (KP = DOWN OR KP = RIGHT) AND L < LMAX THEN LET L = L + 1
935 IF KP = ESC THEN END
940 IF L <> OL THEN LOCATE TP + OL * S, 1, 0: PRINT " "
950 RETURN
955 REM WAIT FOR A KEY TO BE PRESSED
960 LET A$ = INKEY$: IF A$ = "" GOTO 960
970 LET KP = ASC(A$)
975 IF LEN(A$) = 2 AND KP = 0 THEN LET KP = 255 + ASC(RIGHT$(A$, 1))
980 RETURN
985 REM INPUT ONE OR MORE LINES OF "IL" LENGTH
990 LET L = 1: LET OL = 1: LET B$ = ""
1000 LET B$ = C$(CARD * CL + L)
1010 LET BL = LEN(B$): LET X = 0
1020 IF BL < IL AND KP <> UP AND KP <> DOWN AND KP <> BACK AND KP > 31 AND KP < 256 THEN LET X = 1
1030 IF X = 1 THEN B$ = B$ + CHR$(KP)
1040 IF KP = BACK AND BL > 0 THEN LET B$ = LEFT$(B$, BL - 1)
1050 LOCATE TP + L * S, DENT, 0: PRINT B$; "* "
1060 GOSUB 890
1070 IF L <> OL OR KP = ENTER THEN GOSUB 1100
1080 IF KP <> ENTER THEN GOTO 1010
1090 RETURN
1095 REM UPDATE CARD WITH LINE TYPED IN
1100 LET C$(CARD * CL + OL) = B$
1110 LOCATE TP + OL * S, DENT, 0: PRINT C$(CARD * CL + OL); " "
1120 LET B$ = C$(CARD * CL + L)
1130 RETURN
1135 REM DISPLAY PROMPTS AT BASE OF SCREEN
1140 LOCATE TP + DP + 1, 1, 0: PRINT S$;
1150 LOCATE TP + DP + 1, 1, 0: PRINT Y$: PRINT Z$;
1160 RETURN
1165 REM GENERAL SCREEN LAYOUT WITH CARD NUMBER
1170 CLS
1180 PRINT "FLIP--FILE"
1185 IF LAST = 0 THEN PRINT "NO CARDS IN FILE"
1190 IF LAST > 0 THEN PRINT LAST; " CARDS";
1200 IF CARD < MX + 1 AND LAST > 0 THEN PRINT " ON CARD "; CARD; " "
1210 LET XC = W2 - (LEN(X$) / 2)
1220 PRINT TAB(XC); X$
1230 PRINT L$
1240 LOCATE TP + DP, 1, 0: PRINT L$
1250 RETURN
1255 REM INITIALIZATION
1260 GOSUB 1440
1270 REM LET MX = 30: LET SC = 0: LET CL = 7: LET ML = 6
1280 REM DIM C(MX * CL) AS STRING
1290 REM DIM M(ML) AS STRING, H(CL) AS STRING
1300 DATA"ADD A CARD","REMOVE A CARD","ALTER A CARD"
1310 DATA"FLIP CARDS","LOAD CARDS","FILE THESE CARDS"
1320 FOR I = 1 TO ML: READ M$(I): NEXT I
1330 DATA"NAME","STREET","TOWN","COUNTY","CODE","PHONE","INFO"
1340 FOR I = 1 TO CL: READ H$(I): NEXT I
1350 LET LAST = 0: LET CARD = 1: LET ND = 0
1360 LET F$ = "FLIP.DAT": LET D$ = "' CARD DELETED '"
1380 LET CHOICE = 1
1390 LET UP = 255 + 72: LET DOWN = 255 + 80: LET LEFT = 255 + 75: LET RIGHT = 255 + 77: LET OTHER = 9: LET BACK = 8: LET ENTER = 13: LET ESC = 27
1400 LET W$ = "USE ARROW KEYS"
1410 LET L$ = "": FOR I = 1 TO W: LET L$ = L$ + "*": NEXT I
1420 LET S$ = "": FOR I = 1 TO W * 2: LET S$ = S$ + " ": NEXT I
1430 RETURN
1435 REM SCREEN SET UP DETAILS
1440 LET W = 80: LET TP = 4: LET DP = 8
1450 LET S = 1
1460 LET W2 = W / 2: LET DENT = 9: LET IL = W - DENT - 3
1470 RETURN