Jacket Lister
Gregory JackmondThe more disks you have, the more you'll enjoy this novel utility, it prints a disk jacket with an alphabetized directory of all the programs on a disk. The original version of "Jacket Lister" runs on the Commodore 64 and 128 (in 64 mode). We've added new versions for the IBM PC/PCjr, Apple II series (DOS 3.3 and ProDOS), and Atari 400, 800, XL, and XE. A printer is required. The Atari version requires at least 32K of memory.
How many times have you picked up a disk, only to realize that you can't remember which programs are on it? You can always get a disk directory in the usual way—by putting the disk in the drive and listing the directory on the screen—but that's slow and tedious when you're looking for a specific program.
"Jacket Lister" is a unique, time-saving solution to this perennial problem: It not only allows you to create a personalized jacket out of ordinary paper, but also lists an alphabetized directory on the jacket itself. In a glance, you can see which programs are on each of your disks. A date is also included so that you can tell whether the listing is obsolete. The jacket listing may include as many as 88 filenames, using the front and back of the jacket. (Some computers can store more than 88 files on a disk, but the jacket does not have room for more than that number.)
Type in the appropriate program for your computer, then save a copy before you run it. The variable NS$ in line 420 (NAME$ in line 15 for the Atari version) defines your personalized title for the jacket, which you can change to whatever you like. You may substitute any characters in the definition of NS$, but don't make the string longer than 26 characters.
Jacket Lister is a self-prompting program, so you don't need elaborate instructions. Simply run the program, insert the disk that you want to catalog, then follow the screen prompts to create a custom jacket for that disk. When the jacket has finished printing, all that's left to do is to cut the cover to size, fold it along the printed fold lines, and glue the flaps.
Commodore 64 Version
Commodore Jacket Lister (Program 1) runs on a Commodore 64 or Commodore 128 in 64 mode. The program is written for standard Commodore printers (and for non-Commodore printers that can emulate the standard Commodore graphics characters), but can easily be modified to work on other printers as well. Simply change the graphics symbols to dashes (-) or exclamation points (!) in lines 510, 1100, and 1240. (Horizontal lines are formed from the dashes, and vertical lines from the exclamation points.) The program also uses characters 17 and 145 as control codes to set the printer for lowercase/uppercase or uppercase/graphics printing, respectively. You may need to substitute other control codes for these in lines 100 and 110.
If you have a Commodore Plus/4, 16, PET/CBM, or VIC-20 with expansion memory, you should be able to make Jacket Lister work with only slight modifications. The POKEs that change the screen color and create sound effects are specific to the Commodore 64; if you delete these statements, the program should run on nearly any Commodore computer.
Atari Version
The Atari version (Program 2) runs on any Atari 400, 800, XL, or XE computer with at least 32K of memory, and should work with any standard-width printer. No special instructions are required; simply follow the directions on the screen.
Apple II Version
With the Apple II version of Jacket Lister, all output is in uppercase. If you are using DOS 3.3, type in Program 3 as listed. For ProDOS, start with Program 3, but omit lines 80-200 and add the lines listed as Program 4. In either case, you may have to modify line 450 to suit your particular printer configuration.
IBM PC/PCjr Version
In this version of Jacket Lister (Program 5), all output is in uppercase.
Program 1: Commodore Jacket Lister
For instructions on entering this listing, please refer to "COMPUTERS Guide to Typing In Programs" in this issue of COMPUTE!.
GD 10 REM ***** PROGRAM SET UP ****** RH 20 DIM TB$(144):DIM AB$(144) KR 30 PRINT"{CLR}[<7>]":POKE 53280,14;POKE 53281,6 PS 40 PRINT"{4 DOWN}{9 RIGHT}{RVS}{WHT} WHAT IS TODAY'S DATE: ":PRINT: EK 50 PRINT"{5 RIGHT}{RVS}{WHT} ENTER MO/DY/YR THEN <RETURN> {OFF}" MD 60 PRINT"{2 DOWN}";SPC(11);:INPUT DT$ QA 70 PRINT"{CLR}{4 DOWN}{9 RIGHT}{RVS}{CYN} UPPER AND LOWER CASE ? ":PRINT: RC 80 PRINT"{10 RIGHT}{RVS}{CYN} {WHT}Y{CYN} OR {WHT}N{CYN} THEN <RETURN> {OFF}" CB 90 PRINT "{2 DOWN}";SPC(11);:INPUT CC$ PR 100 IF CC$="Y" THEN CM$=CHR$(17):REM LOWER CASE RC 110 IF CC$<>"Y" THEN CM$=CHR$(145):REM UPPER CASE QF 120 PRINT"{CLR}[<7>]":POKE 53280,14:POKE 53281,6 SX 130 PRINT"{4 DOWN}{RIGHT}{YEL}WHICH DISK DRIVE DO YOU WANT TO LIST?" JC 140 PRINT"{2 DOWN}";SPC(11);:INPUT DI MG 150 REM ***** READ DISK MENU ****** XF 160 PRINT"{CLR}{CYN}":POKE 53280,2:POKE 53281,0 HK 170 PRINT "{6 DOWN}{3 RIGHT}{RVS}{2 SPACES}READING{2 SPACES} DATA : PLEASE STANDBY{2 SPACES}" ED 180 GOSUB 1630 JD 190 OPEN8,DI,0,"$0":FORC=1TO8:GET #8,A$:NEXT:C=1:DN$="":FORC=1TO16 JA 200 GET#8,A$:DN$=DN$+A$:NEXT:GET#8,A$:GET#8,A$:DN$=DN$+"{2 SPACES}":GET#8,A$ ED 210 DN$=DN$+A$:GET#8,A$:DN$=DN$+A$:GET#8,A$:GET#8,A$ GE 220 GET#8,A$:GET#8,A$:C=1 FH 230 FORA=1TO4:GET#8,A$:NEXT:PN$="":TY$="" PM 240 GET#8,A$:IFST<>0THEN310 FP 250 IFA$=""THEN310 MC 260 IFASC(A$)<>34THEN240 BA 270 GET#8,A$:IFASC(A$)<>34THENPN$=PN$+A$:GOTO270 FA 280 GET#8,A$:IFASC(A$)=32THEN280 RR 290 TY$=TY$+A$:GET#8,A$:IFA$<>""THEN290 RD 300 TB$(C)=PN$:C=C+1:IFST=0THEN230 XC 310 CLOSE8 GH 320 IF C>88 THEN GOSUB1310 JE 330 REM *** ALPHABETIZE LISTING *** CA 340 PRINT "{CLR}{CYN}": POKE53280,4:POKE53281,0 QX 350 PRINT "{6 DOWN}{3 RIGHT}{RVS}{2 SPACES}SORTING{2 SPACES} DATA : PLEASE STANDBY{2 SPACES}" JS 360 GOSUB1570 HA 370 Z$="ZZZZZZZZZZZZZZZZ":E=1 GS 380 FORA=1TOC-1:C$=Z$:FORB=1TOC-1:IFC$<TB$(B)THEN400 JB 390 C$=TB$(B):D=B QF 400 NEXT:AB$(E)=C$:E=E+1:TB$(D)=Z$:NEXT BM 410 REM{2 SPACES}**** JACKET NAME = NS$ *** MA 420 NS$="*****{3 SPACES}REFERENCE{3 SPACES}*****" SJ 430 REM ***** PRINT ALPHA LIST ***** AA 440 PRINT "{CLR}":POKE 53280,5:POKE53281,0 GR 450 PRINT "{6 DOWN}{2 RIGHT}{RVS}{2 SPACES} PRINTING JACKET : PLEASE STANDBY{2 SPACES)" MA 460 GOSUB1510 EP 470 DD=0:CD=INT(C/2):OPEN1,4 JS 480 FOR CR=1TO2 FS 490 PRINT#1,CHR$(10):REM LINEFEED XA 500 NEXT CR JE 510 TL$ ="[<O>]" FS 520 PRINT#1,TAB(2);:FOR TL=1 TO 72:PRINT#1,TL$;:NEXTTL: PRINT #1," CUT" KC 530 GOSUB1130:GOSUB1140 RE 540 GOSUB1130 DC 550 PRINT#1,CHR$(14);NS$;CHR$(15);:REM 14 DOUBLE WIDTH 15 SINGLE JG 560 GOSUB1140 PD 570 FOR LE=1TO2 RG 580 GOSUB1130:GOSUB1140 AD 590 NEXT LE MK 600 GOSUB1130 FX 610 PRINT#1,TAB(15);CM$;DN$;SPC(5);DT$;:GOSUB1140:GOSUB1160 CJ 620 IF C>32 THEN790 QA 630 REM ** PRINT : < 32 PROGRAMS ** HC 640 FORDD=1TOCD:GOSUB1130 JE 650 PRINT#1,CHR$(16);CHR$(50);CHR$(48);CM$;AB$(DD);:REM PRINT HEAD POSITION KS 660 PRINT#1,CHR$(16);CHR$(52);CHR$(53);CM$;AB$(CD+DD);:GOSUB1140 MC 670 REM PRINT HEAD POSITION AE 680 NEXT DD KB 690 GOSUB1130:GOSUB1140:DD=DD+1 FR 700 IF DD>17 THEN720 JF 710 GOTO690 XB 720 GOSUB1220 QF 730 FOR SL=1TO29 FK 740 GOSUB1200:GOSUB1210 AE 750 NEXT SL FE 760 GOSUB1240 HG 770 GOSUB1260 SE 780 REM ** PRINT : > 32 PROGRAMS ** BB 790 FORDD=1TO16:GOSUB1130 RX 800 PRINT#1,CHR$(16);CHR$(50);CHR$(48);CM$;AB$(DD);:REM PRINT HEAD POSITION QM 810 PRINT#1,CHR$(16);CHR$(52);CHR$(53);CM$;AB$(DD+16);:GOSUB1140 KF 820 REM PRINT HEAD POSITION CR 830 NEXT DD BB 840 GOSUB1130:GOSUB1140 GJ 850 GOSUB1220 HG 860 GOSUB1200:GOSUB1210 FM 870 CX=(C-33)/2:CZ=CX+32 QD 880 FORDD=33TOCZ:GOSUB1200 BE 890 PRINT#1,CHR$(16);CHR$(50);CHR$(48);CM$;AB$(DD);:REM PRINT HEAD POSITION JQ 900 PRINT#1,CHR$(16);CHR$(52);CHR$(48);CM$;AB$(DD+CX);:GOSUB1210 AD 910 REM PRINT HEAD POSITION GC 920 NEXT DD XH 930 GOSUB1200:GOSUB1210:DD=DD+1 JB 940 IF DD>60 THEN960 FD 950 GOTO930 AG 960 GOSUB1240:GOSUB1260 RG 970 REM *** CLOSING REMARKS *** PA 980 PRINT "{CLR}{CYN}":POKE53280,9:POKE53281,0 CC 990 PRINT"{6 DOWN}{2 RIGHT}{RVS}{2 SPACES}ALPHABETIZED DISK COVER COMPLETE{2 SPACES}" MH 1000 GOSUB1460 QC 1010 PRINT"{5 DOWN}{2 RIGHT}{2 SPACES}DO YOU WANT ANOTHER DISK COVER :" RX 1020 INPUT "{6 RIGHT}'Y' OR 'N' THEN <RETURN>";AG$ FC 1030 FOR DD=0TO144:AB$(DD)="":NEXTDD BX 1040 IF AG$<>"Y"THEN1070 EP 1050 PRINT"{CLR}[<7>]":POKE53280,14:POKE53281,6:GOTO70 FP 1060 REM ** TERMINATE PROGRAM ** HC 1070 PRINT "{CLR}{CYN}":POKE53280,7:POKE53281,11 BP 1080 PRINT "{8 DOWN}{8 RIGHT}{WHT}{RVS}{2 SPACES}PROGRAM TERMINATED !{2 SPACES}" FJ 1090 GOSUB1410 EJ 1100 FOR WT=1TO 1000:NEXT WT GE 1110 PRINT"{CLR}[<7>]":POKE53280,14:POKE53281,6:END RS 1120 REM *** DISK JACKET OUTLINE *** SA 1130 PRINT#1,"{2 SPACES}[<J>]{7 SPACES}[<G>]*";:RETURN EM 1140 PRINT#1,CHR$(16);CHR$(54);CHR$(52);"*[<M>]{7 SPACES}[<L>]":RETURN KE 1150 REM PRINT HEAD POSITION JB 1160 PRINT#1,"{2 SPACES}[<J>]{7 SPACES}[<G>]*"; HQ 1170 PRINT#1,TAB(15);"[<20 U>]";: JS 1180 PRINT#1,CHR$(16);CHR$(54);CHR$(52);"*[<M>]{7 SPACES}[<L>]":RETURN FB 1190 REM PRINT HEAD POSITION MP 1200 PRINT#1,"{10 SPACES}[<J>]";:RETURN: CS 1210 PRINT#1,CHR$(16);CHR$(54);CHR$(53);"[<L>]":RETURN:REM PRINT HEAD POSITION GS 1220 CL$="C" BD 1230 PRINT#1,TAB(2);:FOR CL=1 TO 72:PRINT#1,CL$;:NEXTCL:PRINT#1," FOLD":RETURN XR 1240 LL$="[<U>]" DS 1250 PRINT#1,TAB(10);:FOR LL=1 TO 56:PRINT#1,LL$;:NEXTLL:PRINT#1," CUT":RETURN MR 1260 PRINT#1:FOR CR=1TO3 KM 1270 PRINT#1,CHR$(10) DG 1280 NEXT CR:CLOSE1:GOTO980 DE 1290 REM ** MENU TOO LONG TO LIST ** FS 1300 REM ** CAN ONLY LIST 88 PGMS ** HR 1310 PRINT"{CLR}{CYN}":POKE53280,1:POKE53281,7 BJ 1320 PRINT "{5 DOWN}";SPC(10);"{CYN}TOO{2 SPACES}MANY{2 SPACES}PROGRAMS" CA 1330 PRINT SPC(10);"{CYN} TO LIST ON JACKET" DR 1340 GOSUB1460 JG 1350 PRINT "{3 DOWN}";SPC(8);"{RED}PRINT{2 SPACES}THOSE{2 SPACES}THAT{2 SPACES}FIT?" MC 1360 PRINT SPC(9);"({RVS}Y{OFF} OR {RVS}N{OFF} THEN <RETURN>) HE 1370 PRINT"{2 DOWN}";SPC(15);:INPUT AW$ FX 1380 IF AW$<>"Y" THEN1070 XR 1390 C=88:RETURN SG 1400 REM{2 SPACES}**** SOUND SUBROUTINES *** SA 1410 REM{2 SPACES}##### BUZZER ##### KR 1420 POKES,240 GF 1430 H=54273:S=54278:W=54276:V=54296 BK 1440 POKEV,15:POKEH,5:POKEW,33:FORT=0TO500:NEXT CP 1450 FORT=H-1TOV:POKET,0:NEXT:RETURN QM 1460 REM{2 SPACES}##### DONG ##### MG 1470 H=54273:S=54278:W=54276:V=54296 QG 1480 POKES-1,9:POKEH,36:POKES+9,16:POKEV,15:FORU=1TO4:POKEW,21:FORT=0TO500 EM 1490 NEXT:POKEW,20:NEXT KJ 1500 FORT=H-1TOV:POKET,0:NEXT:RETURN XF 1510 REM{2 SPACES}##### DING ##### MJ 1520 H=54273:S=54278:W=54276:V=54296 XQ 1530 FOR AA=1TO3 CE 1540 POKEV,15:POKEH,40:POKES-1,9:POKEW,17:FORT=1TO500:NEXTT AK 1550 FORT=H-1TOV:POKET,0:NEXT SX 1560 NEXTAA:RETURN JD 1570 REM{2 SPACES}##### BING-BONG ##### JX 1580 H=54273:S=54278:W=54276:V=54296 DE 1590 POKEV,15:POKES-1,88:POKES,89:POKEW-1,1:FORU=1TO6:POKEW,65 XR 1600 POKEH,20:FORT=0TO120:NEXT BG 1610 POKEW,64:POKEH,50:POKEW,65:FORT=0TO120:NEXT:POKEW,64:NEXT KA 1620 FORT=H-1TOV:POKET,0:NEXT:RETURN JD 1630 REM{2 SPACES}##### BELLS ###### XS 1640 V=54296:W=54276:POKEW+1,96 BQ 1650 POKEW+1,9 DM 1660 POKEV,15:FORL=1TO5:POKEW,21 PX 1670 POKEW-3,99*RND(1):POKEW+11,99*RND(1) XK 1680 FORT=1TO600:NEXT:POKEW,20:NEXT XD 1690 FORI=W-4TOV:POKEI,0:NEXT:RETURN
Program 2: Jacket Lister for Atari 400, 800, XL, and XE
Version by Kevin Mykytyn, Editorial Programmer
For instructions on entering this listing, please refer to "COMPUTE!'s Guide to Typing In Programs" in this issue of COMPUTE!.
DC 10 DIM DATE$(12),UPPER$(1),K$(1),DN$(10),DIR$(17*88),T$(20),NAME$(26),SPC$(80) FB 15 FOR A=1 TO 80:SPC$(A,A)=" ":NEXT A:NAME$="***** REFERENCE DISK *****": REM THIS MUST BE 26 CHARACTERS JM 20 OPEN #4,4,0,"K:" KD 100 GRAPHICS 0:POKE 710,15:POKE 709,0:POKE 712,55 FO 110 POSITION 10,6:PRINT " WHAT IS TODAY'S DATE " JG 120 POSITION 6,8:PRINT " ENTER MO/DY/YR THEN <RETURN> " PH 130 POSITION 15,13:INPUT DATE$:PRINT "{CLEAR}":POKE 752,1 GA 160 PRINT "{CLEAR}":POSITION 2,5:PRINT "WHICH DISK DRIVE DO YOU WANT TO LIST": POSITION 17,7:PRINT "(1-9)" FE 170 GOSUB 1000:IF K$<"1" OR K$>"9" THEN 170 HO 180 DN$="D1:*.*":DN$(2,2)=K$ JP 190 PRINT "{CLEAR}":POSITION 3,8: PRINT " READING DATA : PLEASE STANDBY ":POKE 712,136 IF 200 TRAP 220:FILE=1:OPEN#1,6,0,DN$ FM 210 INPUT #1,T$:DIR$((FILE-1)*17+1,FILE*17)=T$:FILE=FILE+1:IF FILE<90 THEN 210 MJ 220 FILE=FILE-2:TRAP 65000:CLOSE #1:IF PEEK(195)=136 OR FILE=88 THEN 250 LG 230 PRINT "{CLEAR}":POSITION 12,11:PRINT "DISK ERROR #";PEEK(195) PN 240 POSITION 8,13:PRINT "PRESS ANY KEY TO RETRY":GOSUB 1000:GOTO 190 BH 250 POSITION 5,8:PRINT "SORTING":POKE 712,200 NJ 260 G=INT(FILE/2) GH 265 N=0:FOR I=1 TO FILE-G CC 270 IF DIR$((I-1)*17+1,I*17)<=DIR$((I+G-1)*17+1,(I+G)*17) THEN 290 BJ 280 T$=DIR$((I-1)*17+1,I*17):DIR$((I-1)*17+1,I*17)=DIR$((I+G-1)*17+1,(I+G)*17): DIR$((I+G-1)*17+1,(I+G)*17)=T$:N=1 HE 290 NEXT I:IF N=1 THEN 265 ID 300 G=INT(G/2):IF G>=1 THEN 265 AO 310 POSITION 2,8:PRINT " PRINTING JACKET : PLEASE STANDBY ": POKE 712,104:OPEN #1,4,4,"P:" MH 320 FOR A=1 TO 3:PRINT #1;CHR$(13):NEXT A GG 330 GOSUB 3070:PRINT #1;" CUT" NH 340 GOSUB 3000:GOSUB 3010:GOSUB 3020 NO 350 GOSUB 3000:PRINT #1;CHR$(14);NAME$;CHR$(20);:GOSUB 3020: REM 14 IS DOUBLE WIDTH, 20 IS NORMAL WIDTH DI 360 FOR A=1 TO 2:GOSUB 3000:GOSUB 3010:GOSUB 3020:NEXT A HL 370 GOSUB 3000:PRINT #1;SPC$(1,22);DATE$;SPC$(1,30-LEN(DATE$));:GOSUB 3020 HD 380 CD=INT(FILE/2):IF FILE>32 THEN 480 CA 390 FOR DD=1 TO CD:GOSUB 3000 JK 400 PRINT #1;SPC$(1,8);DIR$((DD-1)*17+1,DD*17-3);SPC$(1,9); DIR$((CD+DD-1)*17+1,(CD+DD)*17-3);SPC$(1,7); NL 410 GOSUB 3020:NEXT DD LJ 420 GOSUB 3000:GOSUB 3010:GOSUB 3020:DD=DD+1 BM 430 IF DD>17 THEN 450 GH 440 GOTO 420 KC 450 GOSUB 3070:PRINT #1;" FOLD" CJ 460 FOR SL=1 TO 29:GOSUB 3050:GOSUB 3060:GOSUB 3065 LK 470 NEXT SL:GOSUB 3090:PRINT #1;" CUT":GOTO 2000 AA 480 FOR DD=1 TO 16:GOSUB 3000 GD 490 PRINT #1;SPC$(1,8);DIR$((DD-1)*17+1,DD*17-3);SPC$(1,9); DIR$((16+DD-1)*17+1,(16+DD)*17-3);SPC$(1,7); NL 500 GOSUB 3020:NEXT DD NG 510 GOSUB 3000:GOSUB 3010:GOSUB 3020 CN 520 GOSUB 3070:PRINT #1;" FOLD":GOSUB 3050:GOSUB 3060:GOSUB 3065 FA 530 CX=INT((FILE-33)/2):CZ=CX+32 GN 540 FOR DD=33 TO CZ:GOSUB 3050 FG 550 PRINT #1;SPC$(1,9);DIR$((DD-1)*17+1,DD*17-3);SPC$(1,6); DIR$((DD+CX-1)*17+1,(DD+CX)*17-3);SPC$(1,11);"!" GC 560 NEXT DD NC 570 GOSUB 3050:GOSUB 3060:GOSUB 3065:DD=DD+1 CC 580 IF DD<61 THEN 570 KF 590 GOSUB 3090:PRINT #1;" CUT":GOTO 2000 HA 1000 POKE 752,1:GET #4,K:K$=CHR$(K):RETURN KA 2000 FOR CR=1 TO 3:PRINT #1;CHR$(13):NEXT CR:CLOSE #1 PL 2010 PRINT "{CLEAR}":POSITION 3,10:PRINT "ALPHABETIZED DISK COVER COMPLETE" ML 2020 POSITION 3,13:PRINT "DO YOU WANT ANOTHER DISK COVER?" DM 2030 GOSUB 1000:IF K$="Y" THEN RUN ME 2040 IF K$<>"N" THEN 2030 KD 2050 PRINT "{CLEAR}{2 DOWN}BYE":POKE 752,0:END OE 3000 PRINT #1;" !{8 SPACES}!*";:RETURN FE 3010 PRINT #1;SPC$(1,52);:RETURN KL 3020 PRINT #1;"*!{8 SPACES}!":RETURN JO 3050 PRINT #1;"{10 SPACES}!";:RETURN FL 3060 PRINT #1;SPC$(1,54);:RETURN GJ 3065 PRINT #1;"!":RETURN BH 3070 PRINT #1;" ";:FOR A=1 TO 72:PRINT #1;"-";:NEXT A:RETURN BJ 3090 PRINT #1;"{11 SPACES}";:FOR A=1 TO 54:PRINT #1;"-";:NEXT A:RETURN
Program 3: Apple II Jacket Lister
Version by Tim Midkiff, Editorial Programmer
For instructions on entering this listing, please refer to "COMPUTE!'s Guide to Typing In Programs" in this issue of COMPUTE!.
79 10 REM ***** PROGRAM SET UP ***** 6D 20 DIM TB$(144),AB$(144),WS(1000) CA 30 HOME:PRINT:PRINT "WHAT IS TODAY'S DATE (MO/DY/YR)";:INPUT DT$ 5F 40 HOME:PRINT:PRINT "WHICH DRIVE DO YOU WANT TO LIST (1/2)";:INPUT D1 AC 50 IF D1<1 OR D1>2 THEN 40 2B 60 REM ***** READ DISK MENU ***** 37 70 GOSUB 1320:HOME:PRINT "READING DATA : PLEASE STANDBY" 78 80 FOR I=768 TO 779:READ A:POKE I,A:NEXT:P1=0:P2=0:A$="":C=0 60 90 P1=WS(0)-WS(0)+PEEK(131):P2=WS(0)-WS(0)+PEEK(132) 34 100 POKE 769,P1:POKE 770,P2 AE 110 POKE 54,0:POKE 55,3:POKE 56,11:POKE 57,3:CALL 1002 9A 120 PRINT CHR$(4);"CATALOG,D";D1 F8 125 PRINT 15 130 POKE 768,173:POKE 769,P1:POKE 770,P2 40 140 POKE 54,11:POKE 55,3:POKE 56,0:POKE 57,3:CALL 1002 71 150 FOR I=1 TO 4:INPUT A$:NEXT:C=1 B8 160 INPUT A$:IF A$="" THEN 170 C2 165 IF LEFT$(A$,1)="*" THEN A$=RIGHT$(A$,LEN(A$)-1) 38 167 TB$(C)=MID$(A$,7,18):C=C+1:GOTO 160 D7 170 POKE 54,240:POKE 55,253:POKE 56,27:POKE 57,253:CALL 1002 3C 180 FOR I=1 TO C-1:PRINT TB$(I):NEXT 71 190 DATA 141,0,64,238,1,3,208,3 EA 200 DATA 238,2,3,96 CF 340 IF C>88 THEN GOSUB 1260 12 350 REM *** ALPHABETIZE LISTING *** F9 360 GOSUB 1320:HOME:PRINT "SORTING DATA : PLEASE STANDBY" 4A 370 Z$=CHR$(255):E=1 7D 380 FOR A=1 TO C-1:C$=Z$:FOR B=1 TO C-1:IF C$<TB$(B) THEN 400 04 390 C$=TB$(B):D=B 52 400 NEXT:AB$(E)=C$:E=E+1:TB$(D)=Z$:NEXT 07 410 REM **** JACKET NAME = NS$ **** 6D 420 NS$="***** REFERENCE *****" 62 430 REM ***** PRINT ALPHA LIST ***** CB 440 GOSUB 1320:HOME:PRINT "PRINTING JACKET : PLEASE STANDBY" A2 450 DD=0:CD=INT(C/2):PRINT CHR$(4);"PR#1":PRINT CHR$(9);"80N" EA 460 FOR CR=1 TO 2 8B 470 PRINT CHR$(10):REM LINEFEED 0C 480 NEXT 97 510 TL$="-" 7A 520 PRINT TAB(4);:FOR TL=1 TO 71:PRINT TL$;:NEXT:PRINT " CUT" 2D 530 GOSUB 1100:GOSUB 1110 CB 540 GOSUB 1100 D6 550 POKE 36,INT(40-LEN(NS$)/2):PRINT NS$; D3 560 GOSUB 1110 A9 570 FOR LE=1 TO 2 37 580 GOSUB 1100:GOSUB 1110 0F 590 NEXT C4 600 GOSUB 1100 D1 610 POKE 36,36:PRINT DT$;:GOSUB 1110:GOSUB 1120 F3 620 IF C>32 THEN 790 A6 630 REM *** PRINT : < 32 PROGRAMS *** 19 640 FOR DD=1 TO CD:GOSUB 1100 96 650 POKE 36,20:PRINT AB$(DD); B8 660 POKE 36,45:PRINT AB$(CD+DD); D6 670 GOSUB 1110 0E 680 NEXT B5 690 GOSUB 1100:GOSUB 1110:DD=DD+1 A8 700 IF DD>17 THEN 720 1E 710 GOTO 690 E5 720 GOSUB 1170 20 730 FOR SL=1 TO 29 95 740 GOSUB 1150:GOSUB 1160 09 750 NEXT F5 760 GOSUB 1190 D9 770 GOSUB 1210 B2 780 REM *** PRINT : > 32 PROGRAMS *** 41 790 FOR DD=1 TO 16:GOSUB 1100 8E 800 POKE 36,20:PRINT AB$(DD); 92 810 POKE 36,45:PRINT AB$(DD+16); CE 820 GOSUB 1110 06 830 NEXT 32 840 GOSUB 1100:GOSUB 1110 EC 850 GOSUB 1170 9A 860 GOSUB 1150:GOSUB 1160 77 870 CX=(C-33)/2:CZ=CX+32 F1 880 FOR DD=33 TO CZ:GOSUB 1150 A0 890 POKE 36,20:PRINT AB$(DD); 16 900 POKE 36,40:PRINT AB$(DD+CX); E1 910 GOSUB 1160 05 920 NEXT 11 930 GOSUB 1150:GOSUB 1160:DD=DD+1 2C 940 IF DD>60 THEN 960 A3 950 GOTO 930 63 960 GOSUB 1190:GOSUB 1210 1F 970 REM *** CLOSING REMARKS *** 34 980 PRINT CHR$(4);"PR#0" 30 990 GOSUB 1320:HOME:PRINT "ALPHABETIZED DISK COVER COMPLETE" 13 1000 PRINT:PRINT "DO YOU WANT ANOTHER DISK COVER (Y/N)";:INPUT AG$ 77 1010 FOR DD=0 TO 144:AB$(DD)="":NEXT:RESTORE 08 1020 IF AG$<> "Y" THEN 1050 11 1030 GOTO 40 5A 1040 REM ** TERMINATE PROGRAM ** 2A 1050 HOME:PRINT "PROGRAM TERMINATED" 5F 1060 GOSUB 1320 AB 1070 FOR WT=1 TO 1000:NEXT FF 1080 HOME:END 1A 1090 REM *** DISK JACKET OUTLINE *** FE 1100 PRINT " ! ! *";:RETURN F9 1110 POKE 36,64:PRINT "* ! !":RETURN 42 1120 PRINT " ! ! *"; FC 1130 POKE 36,29:PRINT "--------------------"; 06 1140 POKE 36,64:PRINT "* ! !":RETURN 55 1150 PRINT " !";: RETURN DC 1160 POKE 36,66:PRINT "!": RETURN DF 1170 CL$="-" 6E 1180 PRINT TAB(4);:FOR CL=1 TO 71:PRINT CL$;:NEXT:PRINT " FOLD": RETURN 78 1190 LL$="-" D3 1200 PRINT TAB(12);:FOR LL=1 TO 55:PRINT LL$;:NEXT:PRINT " CUT": RETURN F9 1210 PRINT:FOR CR=1 TO 3 B0 1220 PRINT CHR$(10): REM LINEFEED 9C 1230 NEXT:GOTO 980 F2 1240 REM *** MENU TOO LONG TO LIST *** 7C 1250 REM *** CAN ONLY LIST 88 PGMS *** 1F 1260 GOSUB 1320:HOME:PRINT "TOO MANY PROGRAMS TO LIST ON JACKET" F6 1270 PRINT:PRINT "PRINT THOSE THAT FIT (Y/N)";: INPUT AW$ 2C 1280 IF AW$<>"Y" THEN 1050 8B 1290 C=88: RETURN 47 1300 RE 48 1310 REM ***** SOUND ROUTINE ***** AB 1320 FOR I=1 TO 10:A=PEEK(-16336):NEXT:RETURN
Program 4: ProDOS Modifications for Program 3
Refer to the article for instructions on adding these replacement lines.
B3 80 D$=CHR$(4):PRINT D$;"PREFIX,D";D1:PRINT D$;"PREFIX" C2 90 INPUT P$ C3 100 PRINT D$;"OPEN ";P$;",TDIR" 30 110 PRINT D$;"READ ";P$ 63 120 FOR I=1 TO 3:INPUT A$:NEXT:C=1 DC 130 INPUT A$:IF LEN(A$)>0 THEN TB$(C)=MID$(A$,2,15):PRINT TB$(C):C=C+1:GOTO 130 79 140 PRINT D$;"CLOSE ";P$
Program 5: IBM PC/PCjr Jacket Lister
Version by Tim Midkiff, Editorial Programmer
For instructions on entering this listing, please refer to "COMPUTE!'s Guide to Typing In Programs" in this issue of COMPUTE!.
DF 10 KEY OFF:WIDTH 80:DEF SEG=0:POKE 1047,PEEK(1047) OR 64 OB 20 DIM TB$(144):DIM AB$(144) EJ 30 CLS:PRINT:PRINT "What is today's date (Mo/Dy/Yr)";:INPUT DT$ GF 40 CLS:PRINT:PRINT "Which disk drive do you want to list (A/B)";:INPUT DI$: IF DI$<>"A" AND DI$<>"B" THEN 40 LG 50 REM *** READ DISK MENU *** KL 60 BEEP:CLS:PRINT "READING DATA : PLEASE STANDBY" CP 70 FSPEC$=DI$+":*.*" EG 80 HEAD=1050:TAIL=1052:BUFFER=1054:C=0 LK 90 ON ERROR GOTO 110 OC 100 FILES FSPEC$:ON ERROR GOTO 0:GOTO 120 IM 110 BEEP:CLS:PRINT "CANNOT READ DIRECTORY":ON ERROR GOTO 0:END GK 120 DIM TT$(24):LOCATE 3,1:ROWS=0 OH 130 POKE HEAD,30:POKE TAIL,34:POKE BUFFER,0:POKE BUFFER+1,79: POKE BUFFER+2,13:POKE BUFFER+3,28 HC 140 LINE INPUT TT$(ROWS):IF TT$(ROWS)<>"" THEN ROWS=ROWS+1:GOTO 130 EH 150 ROWS=ROWS-1:FOR I=0 TO ROWS:FOR J=0 TO 3 GB 160 T$=MID$(TT$(I),J*18+1,12) KC 170 IF T$<>"" THEN TB$(C)=T$:C=C+1 PK 180 NEXT J:NEXT I:ERASE TT$ CD 190 IF C>88 THEN GOSUB 1260 CL 200 REM *** ALPHABETIZE LISTING *** EB 210 BEEP:CLS:PRINT "SORTING DATA : PLEASE STANDBY" FF 220 Z$=CHR$(255):E=1 QK 230 FOR A=0 TO C-1:C$=Z$:FOR B=0 TO C-1:IF C$<TB$(B) THEN 250 BF 240 C$=TB$(B):D=B FE 250 NEXT:AB$(E)=C$:E=E+1:TB$(D)=Z$:NEXT IE 410 REM *** JACKET NAME = NS$ *** CM 420 NS$="***** REFERENCE *****" PD 430 REM *** PRINT ALPHA LIST *** GO 440 BEEP:CLS:PRINT "PRINTING JACKET : PLEASE STANDBY" EF 450 DD=0:CD=INT(C/2) NL 460 FOR CR=1 TO 2 CA 470 LPRINT CHR$(10):REM LINEFEED CE 480 NEXT CR GB 510 TL$="-" OC 520 LPRINT TAB(3);:FOR TL=1 TO 71:LPRINT TL$;:NEXT TL:LPRINT " CUT" MF 530 GOSUB 1100:GOSUB 1110 OA 540 GOSUB 1100 IA 550 LPRINT TAB(INT(39-LEN(NS$)/2));NS$; PB 560 GOSUB 1110 KN 570 FOR LE=1 TO 2 NP 580 GOSUB 1100:GOSUB 1110 PC 590 NEXT LE OJ 600 GOSUB 1100 EA 610 LPRINT TAB(36);CM$;DT$;:GOSUB 1110:GOSUB 1120 KN 620 IF C>32 THEN 790 BM 630 REM *** PRINT : < 32 PROGRAMS *** HO 640 FOR DD=1 TO CD:GOSUB 1100 FB 650 LPRINT TAB(20);AB$(DD); NG 660 LPRINT TAB(45);AB$(CD+DD); PE 670 GOSUB 1110 JG 680 NEXT DD CA 690 GOSUB 1100:GOSUB 1110:DD=DD+1 FC 700 IF DD>17 THEN 720 KJ 710 GOTO 690 EJ 720 GOSUB 1170 CO 730 FOR SL=1 TO 29 IC 740 GOSUB 1150:GOSUB 1160 IP 750 NEXT SL GL 760 GOSUB 1190 AB 770 GOSUB 1210 EB 780 REM *** PRINT : > 32 PROGRAMS *** FL 790 FOR DD=1 TO 16:GOSUB 1100 FJ 800 LPRINT TAB(20);AB$(DD); GN 810 LPRINT TAB(45);AB$(DD+16); PM 820 GOSUB 1110 JO 830 NEXT DD NK 840 GOSUB 1100:GOSUB 1110 EA 850 GOSUB 1170 IH 860 GOSUB 1150:GOSUB 1160 KA 870 CX=(C-33)/2:CZ=CX+32 GA 880 FOR DD=33 TO CZ:GOSUB 1150 GL 890 LPRINT TAB(20);AB$(DD); QK 900 LPRINT TAB(45);AB$(DD+CX); DM 910 GOSUB 1160 JN 920 NEXT DD NA 930 GOSUB 1150:GOSUB 1160:DD=DD+1 LF 940 IF DD>60 THEN 960 IP 950 GOTO 930 GL 960 GOSUB 1190:GOSUB 1210 EA 970 REM *** CLOSING REMARKS *** OM 980 BEEP:CLS:PRINT "ALPHABETIZED DISK COVER COMPLETE" PI 990 PRINT:PRINT "Do you want another disk cover (Y/N)";:INPUT AG$ IN 1000 FOR DD=0 TO 144:AB$(DD)="":NEXT DD LN 1010 IF AG$<>"Y" THEN 1040 MJ 1020 CLS:GOTO 40 QK 1030 REM ** TERMINATE PROGRAM ** HF 1040 BEEP:CLS:PRINT "PROGRAM TERMINATED" NE 1050 FOR WT=1 TO 1000:NEXT WT BH 1060 CLS:END OA 1090 REM *** DISK JACKET OUTLINE *** IP 1100 LPRINT " | | *";:RETURN DC 1110 LPRINT TAB(64);"* | |":RETURN BD 1120 LPRINT " | | *"; QN 1130 LPRINT TAB(29);"--------------------"; EL 1140 LPRINT TAB(64);"* | |":RETURN CC 1150 LPRINT " |";:RETURN KJ 1160 LPRINT TAB(66);"|":RETURN GO 1170 CL$="-" PJ 1180 LPRINT TAB(3);:FOR CL=1 TO 71:LPRINT CL$;:NEXT CL:LPRINT " FOLD":RETURN KK 1190 LL$="-" OF 1200 LPRINT TAB(11);:FOR LL=1 TO 55:LPRINT LL$;:NEXT LL:LPRINT " CUT":RETURN DN 1210 LPRINT:FOR CR=1 TO 3 CP 1220 LPRINT CHR$(10):REM LINEFEED LB 1230 NEXT CR:GOTO 980 DF 1240 REM ** MENU TOO LONG TO LIST ** IE 1250 REM ** CAN ONLY LIST 88 PGMS ** DK 1260 BEEP:CLS:PRINT "TOO MANY PROGRAMS TO LIST ON JACKET" CC 1270 PRINT:PRINT "Print those that fit (Y/N)";:INPUT AW$ GG 1280 IF AW$<>"Y" THEN 1040 DD 1290 C=88:RETURN