Classic Computer Magazine Archive COMPUTE! ISSUE 76 / SEPTEMBER 1986 / PAGE 52

Jacket Lister

Gregory Jackmond

The 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