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