Classic Computer Magazine Archive A.N.A.L.O.G. ISSUE 59 / APRIL 1988 / PAGE 40

Presentation Graphics

Get your point across-visually.

by Jeffrey A. Summers, M.D.

    Need to convey information visually to a lot of people? Is your local user's group having a table at a local computer show? Do you then need something to show off the Atari machines, while also giving information about the group? Are you giving a talk that needs to be spiced up a bit with a slideshow, including graphs and pictures?
    If you're in any of these situations, Presentation Graphics can help. The program PRESENT is written for Atari 8-bits, compatible with models of at least 48K memory.
    To use the program, type it in using "BASIC Editor II" (issue 47) to check your work. Listing 2 will create a file named D:LINES.LST, that contains program Lines 12000 to 12100. Run the program in Listing 2, then use ENTER to add the lines to the main program, Listing 1.
    Also, though the version here works with all models of Atari 8-bits, if you have an XL or XE, you may delete Lines 5411, 10160 and 10170, and change Line 5410 to GRAPHICS 31 for slightly faster and cleaner picture loading. Save two copies, then run the program. After the title screen appears, the program offers the main menu.

How to use it.
    A little digression is in order here, for optimal use of Presentation Graphics. The computer selects the size of type on the screen and the number of colors available by the "graphics mode" chosen. These modes are numbered 0-15, though only 0-8 are available on certain machines (CTIA-equipped 400s and 800s).
    The normal type you see on the screen when the computer is turned on is mode 0. Mode 1 is twice as wide, and mode 2 is both twice as wide and twice as high. The letters in modes 1 and 2 may be any of four different colors.
    Modes 0 through 2 are the most useful for this program. Modes 3 through 8 are all "map modes." In other words, they do not display text. Instead, they display colored dots of varying sizes. Any BASIC reference will give you the complete list of dot sizes and numbers of colors available.
    The other bit of information (pun intended) is about the manner in which the color of the text is chosen in modes 1 and 2. If the text is uppercase, it is one color; lowercase is a second; "inverse uppercase" a third; and "inverse lowercase," a fourth. The letters themselves will always be uppercase (capitals); only the color changes by changing the letter to lowercase or using the inverse (Atari logo) key.
    Specifically, there are five "color registers" in the computer, numbered 0 through 4. Register 0 controls the color of the uppercase characters; register 1 controls lowercase; 2 and 3, the upper- and lowercase inverse, respectively. Color register 4 controls the color of the background. The color registers are set by the operating system at power-up, and with any GRAPHICS command, to be orange, green, blue, red and black. But, given that there are up to 256 different colors available to choose from for each color register, a lot of variation is possible.
    The colors fall into sixteen different classes, or hues, each with sixteen different lightnesses, or luminances, numbered 0 through 15. Some modes on some models may ignore oddnumbered luminances, displaying the next lowest even luminance. To find the value for the color register that corresponds to the color you wish, take the number of the hue, multiply by 16 and add the luminance. The hue values may be found in Table 1, below. For example, the value for a dark red would be 4 (for red) * 16+2 (a low luminance value), or 66.

Hue number                                          Color
 0 ...........................................Black/White
 1 ......................................... ........Rust
 2 ............................................Red/Orange
 3 ...........................................Dark Orange
 4 ................................ ................. Red
 5 .........................................Dark Lavender
 6 .......................................... Cobalt Blue
 7 ..................................... Ultramarine Blue
 8 .......................................... Medium Blue
 9 ............................................ Dark Blue
 10 ............................................Blue/Gray
 11 ......................................... Olive Green
 12 ........................................ Medium Green
 13 ............................ ............ .Dark Green
 14 ........................................ Orange/Green
 15 ...............................................Orange
Table 1. - Hue values.

    If that all left you in the dust with your head reeling, don't despair. Experimenting with the program is a great way to learn about these things, so let's get started.
    Run the program and, when the main menu is displayed, press 3 to "Create Screen." You needn't press the RETURN key.
    The program displays "Mode lines defined so far," followed by a blank line (you haven't defined any yet), and then a prompt for you to enter the mode number you desire. This number is one of the graphic mode numbers defined earlier. For demonstration purposes, type a 2 for a double-high, double-wide line, followed by a RETURN.
    The program now asks for the text to be displayed on that line. Again, for demonstration purposes, hit a RETURN. A 2 is now displayed under the "Mode lines defined so far:' The next line we enter will also be a 2. If you're not changing modes, you can simply press RETURN when asked for the next mode number. Do so, then type ANALOG for the text.
    Now, try mode 1 and put PrEsEnTaTiOn for the text. Another 1 and GrApHiCs will be all we'll be entering. Hit RETURN for the mode and RETURN for the text over and over, until the program returns you to the main menu. (The program asks for lines until you've defined enough mode lines to fill the screen.)
    Let's look at what we've created. Choose option 6, "Display Screen." Pressing any key while the screen you've created is displayed returns you to the main menu. You should see an off-center, two-color message. Let's spice it up a bit.
    Touch any key. When the main menu is displayed, choose option 4, "Edit Screen:" The mode lines and text for those lines is displayed. If the line contains more characters than can fit on the line, an ellipsis mark ( ... ) appears at the end, implying that there's more text to that line. You're asked whether you wish to change any text, the color of the text, or if you're done (exit). Press a T for Text, and you're asked which line you wish to change.
    Let's change the first line on which we have text, Line 2. Type the 2, followed by a RETURN. The old text is displayed, and you're asked for the new text. Type the same message, only eight characters further to the right, for better centering. Center the other lines, as well, and add a few inverse upper and inverse lower characters, to display those letters in the other colors. Press E when you're done to return to the main menu, then display the results with option 6. Like it? If not, edit again until you do.
    If your screen contains more than sixteen mode lines, it is broken up into "pages." Each page is up to sixteen lines long, and you may move from page to page using the N (Next) and P (Prior) commands.
    Now try a few different colors, by choosing C from the edit menu. By pressing C in edit mode, you're opting to change colors. The current values for each of the color registers is displayed, then you're asked which of the registers you wish to change. For now, choose register 4. Remember that this is the register that controls the background color.
    The current value is 0, for black. Try substituting the value for dark red, 66. The program then asks if you want to change another register value. For now, answer no to return to the edit menu. Press E to exit from edit, then 6 at the main menu to display the screen-and voilA! We now have a red background for our display.
    To save your screen, choose option 2 from the main menu. You're asked for the filename under which you want the screen saved. Type the name of the file completely, using the usual format of DEVICE: FILENAME.EXT. I find it convenient to name the files after the proposed application, and use the extension to hold the number corresponding to the order in which I'm planning to display the screens. For example, our local users' group is called ACORN, and the first in a series of screens I created for a local computer show was D:ACORN.1; the second, D:ACORN.2; and so on.
    If the save is successful, you're returned to the main menu. If not, a message is displayed and, again, you're returned to the menu. Later, you can reload the screen by using main menu option 1, "Load Screen," for editing and display. If you can't remember the name of the file you saved the screen under, you can always get a directory of the disk in drive 1 by using option 7. The program won't let you load an incompatible file, so don't worry about mistakes.

Choosing your options.
    That leaves presentation sequence options as the last topic to be covered. These options are very similar to the others. Option 5, or "Create a Presentation Sequence," allows you to enter a series of filenames containing screens to be displayed.
    You can choose to have as many as twenty or as few as one file displayed. The files may be files created with this program, files created with MicroIllustrator or compatible programs, or B/Graph image files. This allows the conveyance of text information, graphic pictures, and businessstyle graphs and pie charts in a sequence.
    You are offered the options of "Cued" or "Automatic" advancement, much like those on a slide projector.
    If you choose Cued, touching any key will load the next screen in the sequence. If you choose Automatic, you're asked for the delay before the program is to load the next slide. The number entered will be approximately the number of seconds before the next slide is shown, and decimals are allowed.
    You're then asked if you wish the sequence repeated endlessly. If this is a presentation at a local computer show, you probably will want it to repeat over and over, so type Y for Yes. If you're presenting a series of screens as a "slideshow" for a business meeting, you probably don't want the sequence repeated, so type N for No. The first screen is then loaded, and the sequence is underway.
    Option 8, or "Run a Prewritten Sequence," allows you to prepare a sequence ahead of time. Using most word processors, text editors or DOS, you may create a file containing a simple list of files to load. On choosing this option, you're asked for the name of the file containing the list. After this, the prompts regarding Cued or Automatic, time between loads, and whether to repeat endlessly are seen. The program then proceeds through your list.
    Remember that the list may contain only up to twenty filenames. If your presentation requires more than that, you'll need to set up more than one sequence. You'll probably be running low on disk space by the time you hit twenty filenames, in any case, so this isn't much of a restriction.

In general...
    Now for some tips on using Presentation Graphics. First, when using the sequence options 5 and 8 from the main menu, any illegal file will be simply passed over without an error message. This is to keep things moving smoothly, should it happen to be a presentation to the boss, and you messed up typing the name of a file.
    This also means that it's a good idea, for critical sequences, to create them "off line." In other words, write the list of files with a word processor or the like, and run the sequence through once to make sure everything goes smoothly.
    Next, if you plan to use the program for an endless sequence-all day long-a lot of wear and tear can be put on your disk drive. I'd suggest using a 130XE or other RAMdisk-capable machine, and putting the screens on the RAMdisk. The load speed for the pictures will be slightly faster, and there won't be any drive wear.
    Third, don't be afraid to use one of the "map mode" graphic mode lines in your screens. A mode 3 line, where the "text" is a series of semicolons, makes a nice multicolor border. A mode 8 line with no text makes a thin line straight across the screen in the color of register 2. I usually use these in pairs.
    And, finally, experiment to get the most out of Presentation Graphics.

    Jeffrey A. Summers, a practicing Internist, received his B.S. in math prior to getting his M.D., and took a strong interest in computers in college. A four-year Atari owner, his interests lie in languages, application programming and medical usage. He teaches beginning BASIC at his local Atari users' group, ACORN, in Rochester, New York.

The two-letter checksum code preceding the line numbers here is not a part of the BASIC program. For further information, see the "BASIC Editor II," in issue 47.

   Listing 1.
BASIC listing.

GH 10 REM PRESENT
TH 20 REM PRESENTATION GRAPHICS PROGRAM
BV 30 REM BY JEFFREY A SUMMERS
BB 40 REM
BC 50 REM
GU 99 GOTO 10000
KH 110 SCR$(LEN(SCREEN$))=" "
CZ 120 D=U5R(ADR(CNV$),ADR(SCREEN$),ADR(S
   CR$),LEN(SCREEN$))
UT 170 DLI(C1)=112:DLI(C2)=112:DLI(C3)=11
   2:DLI(4)=64+ANTIC(DLIST(C1)):DLI(C6)=I
   NT(ADR(SCR$)/256)
MI 180 DLI(C5)=ADR(SCR$)-256*DLI(C6)
OL 190 FOR CNT=C2 TO DLEN:DLI(C5+CNT)=ANT
   IC(DLIST(CNT)):NEXT CNT
WX 200 DLI(CNT+C5)=65:DLI(CNT+C6)=0:DLI(C
   NT+7)=C6
AH 220 POKE 559,0:FOR PADR=C1 TO CNT+7:PO
   KE 1535+PADR,DLI(PADR):NEXT PADR
VJ 230 POKE 560,0:POKE 561,C6:POKE 559,34
PB 250 FOR CNT=C1 TO C5:POKE 707+CNT,COLR
   (CNT):NEXT CNT
ZK 260 RETURN
NL 500 ? LINES(C1,NCHARS(MODE));:FOR Q=C1
   TO NCHARS(MODE):? "←";:NEXT Q
OK 505 IF NCHARS(MODE)>38 THEN PRINT "↑";
TX 510 MARKER=C1
DZ 520 GET #C1,X:IF X=126 THEN MARKER=MAR
   KER-C1:IF MARKER=0 THEN MARKER=C1
EH 530 IF X=126 THEN GOTO 550
WE 535 IF X=155 THEN 560
GI 540 TEXT$(MARKER)=CHR$(X)
CB 545 MARKER=MARKER+C1:IF MARKER>NCHARS(
   MODE)+C1 THEN MARKER=MARKER-C1:PRINT "
   ";
FT 550 PUT #16,X:GOTO 520
QA 560 TEXT$(MARKER,80)=SP$
MN 570 START=C1:IF NL=C1 THEN 600
EY 580 FOR Q=C1 TO NL-C1:START=START+NCHA
   RS(DLIST(Q)):NEXT Q
YE 600 ENN=START+NCHARS(DLIST(NL))-C1
SR 610 SCREEN$(START,ENN)=TEXT$
ZG 620 RETURN
ZY 700 POKE 694,0:POKE 702,64:RETURN
AJ 710 CLOSE #CI:OPEN #C1,C4,0,"K:":RETUR
   N
TP 720 POKE 16,112:POKE 53774,112:RETURN
OS 730 PRINT CAR$(125);:POKE ADL+C3,PEEK
   ADL+C3)-C5:POKE ADL+C6,C2:POKE ADL+26,
   C2:POKE ADL+27,C2:RETURN
GZ 1000 GOSUB 730:GRAPHICS 0:SETCOLOR C2,
   C1,C2:GOSUB 720
DD 1005 ADL=PEEK(560)+256*PEEK(561):POKE
   ADL+C3,PEEKCADL+C3)+C5
TJ 1006 POKE ADL+C6,7
JH 1010 PRINT "       load          F
   ILE"
BZ 1011 POSITION C1,11:PRINT "Enter filen
   ame to load: ";
VN 1020 INPUT #16, FILENAME$
RQ 1022 TRAP 1025:IF FILENAME$(C2,C2)=":"
    OR FILENAME$(C3,C3)=":" THEN 1025
HC 1023 FN$=FILENAME$:FILENAME$="D:":FILE
   NAME$(C3)=FN$
WT 1025 CLOSE #C1
WC 1030 TRAP 1120:OPEN #C1,C4,0,FILENAME$
PA 1035 TRAP 1500:INPUT #C1,FILENAME$:IF
   FILENAME$<>"\SUMMERS\PRESENT\" THEN 15
   00
BC 1040 FOR I=C1 TO C5:INPUT #C1,C:COLR(I
   =C:NEXT I
HN 1050 INPUT #C1,DLEN:FOR I=C1 TO DLEN:I
   NPUT #Cl,C:DLIST(I)=C: NEXT I
QU 1060 SCREEN$(2048)=" "
TW 1070 HI=INT(ADR(SCREEN$)/256):LO=ADR(S
   CREEN$)-HI*256:POKE 850,7:POKE 852,LO:
   POKE 853,HI
UM 1071 POKE 856,0:POKE 857,8:D=USR(ADR(S
   HIN$),16):SCL=PEEK(856)+256*PEEK(857):
   SCREEN$(SCL)=""
QT 1080 SCRFLG=C1:GOSUB 710
QN 1090 PRINT "     
   FILE";:POSITION 5,11:PRINT "Display sc
   reen (Y/N):    "; :GET #C1,X
PA 1100 IF X<>89 THEN GOTO 11000
WJ 1101 PRINT CHR$(125);:POSITION 5,11:PR
   INT "Press any key for menu"
GU 1105 FOR I=C1 TO 208:NEXT I:GOSUB 110:
   GET #C1,X
OX 1110 GOTO 11000
AF 1120 PRINT "Error in file input/output
   .":PRINT "Please enter the filename us
   ing the"
MK 1138 PRINT "format <dev>:<filename>.<e
   xt>"
ZD 1135 GOSUB 710
FG 1140 PRINT "Also, check to be sure dev
   ice is":PRINT "turned on and able send
   or receive"
YS 1141 PRINT "the data."
HN 1145 PRINT :CLOSE #C5:GOTO 1520
XT 1500 CLOSE #C1:PRINT "File is not comp
   atable with":PRINT "this program. Ple
   ase only load files"
ST 1510 PRINT "that were created with thi
   s program.":PRINT "B/Graph and Microil
   lustrator files"
VO 1515 PRINT "cannot be edited and must
   be loaded":PRINT "with the sequencing
   commands."
XI 1520 PRINT "Press any key for menu"
GM 1530 GOSUB 710:GET #C1,X:GOTO 11000
XQ 2000 IF SCRFLG=O THEN PRINT :PRINT "No
    screen in memory":FOR I=C1 TO 500:NEX
   T I:GOTO 11000
JA 2003 GOSUB 730:GRAPHICS 0:SETCOLOR C2,
   C2,C2:GOSUB 720
ZE 2005 ADL=PEEK(560)+256*PEEK(561):POKE
   ADL+C3,PEEK(ADL+C3)+C5:POKE ADL+C6,7
VS 2006 PRINT "                     F
   ILE"
DN 2010 POSITION C1,11:PRINT "Enter filen
   ame for save: ";:INPUT #16 FILENAME$
GZ 2022 TRAP 1120:IF FILENAME$(C2,C2)=":"
    OR FILENAME$(C3,C3)=":" THEN 2030
HD 2023 FN$=FILENAME$:FILENAME$="D:":FILE
   NAME$(C3)=FN$
MH 2030 TRAP 1120:OPEN #C5,8,0,FILENAME$
Xg 2035 PRINT #C5;"\SUMMERS\PRESENT\"
BD 2040 FOR I=C1 TO CS:PRINT #C5;COLR(I):
   NEXT I
GL 2050 PRINT #5;DLEN:FOR I=C1 TO DLEN:P
   RINT #C5;DLIST(I):NEXT I
VA 2060 PRINT #C5;SCREEN$:CLOSE #C5
PQ 2070 GOTO 11000
ET 3000 GOSUB 738:GRAPHICS 0:GOSUB 720
MF 3010 SETCOLOR C2,C3,C2:IF SCRFLG=0 THE
   N 3030
IX 3020 POSITION C5,11:PRINT "There is a
   screen in memory":POSITION C5,12
KL 3021 PRINT "Do you wish to save it fir
   st?";:GET #C1,X:IF X=89 THEN 2010
EA 3022 SCRFLG=0:PRINT CHR$(125);
TN 3030 CURLIN=0:NL=0:DLEN=C1
YY 3031 ADL=PEEK(560)+256*PEEK(561):POKE
   ADL+C3,PEEK(ADL+C3)+C5:POKE ADL+C6,7
SO 3035 PRINT "                 SC
   REEN"
QZ 3040 ? :? "Mode line thus far":?
TA 3045 GOSUB 700:TRAP 3100
HM 3050 ? "Enter graphics mode for line:
   ";:INPUT #16,MODE
GJ 3055 IF MODE<0 OR MODE>9 THEN 3100
JM 3060 DLIST(DLEN)=MODE:DLEN=DLEN+C1
QZ 3070 CURLIN=CURLIN+NLINES(MODE):NL=NL+
   C1
BO 3080 ? "Enter text for line":PRINT SP$
   ;"";
XV 3082 GOSUB 500
KQ 3090 IF CURLIN>=192 THEN SCRFLG=C1:DLE
   N=DLEN-C1:GOTO 11000
KQ 3100 POSITION C1,C3:IF NL<>0 THEN FOR
   I=C1 TO DLEN-C1:? DLIST(I);" ";:NEXT I
OD 3105 ?
SJ 3110 GOTO 3045
TD 4000 IF SCRFLG=0 THEN PRINT "";:POSIT
   ION C5,11:? "No Screen in Memory":FOR
   I=C1 TO 500:NEXT I:GOTO 11000
MM 4005 GOSUB 730:GRAPHICS 0:SETCOLOR C2,
   C4,C2:GOSUB 720
FA 4006 ADL=PEEK(560)+256*PEEK(561):POKE
   ADL+C3,PEEK(ADL+C3)+C4:POKE ADL+C6,C6
ZO 4007 DFLAG=0
RK 4010 PRINT "                   S
   CREEN"
WZ 4020 ? "Mode lines      Text"
RN 4025 PTR=C1:IF DFLAG=0 THEN SDISP=C1:E
   DISP=16:IF DLEN<16 THEN EDISP=DLEN
KO 4026 IF DFLAG=C1 THEN SDISP=17:EDISP=3
   2:IF DLEN<32 THEN EDISP=DLEN
GV 4027 IF DFLAG=C2 THEN SDISP=33:EDISP=4
   8:IF DLEN<48 THEN EDISP=DLEN
RG 4028 IF SDISP<>C1 THEN FOR I=C1 TO SDI
   SP-C1:PTR=PTR+NCHARS(DLIST(I)):NEXT I
PN 4030 FOR I=SDISP TO EDISP:? I;" ";DLIS
   T(I),
HD 4031 IF NCHARS(DLIST(I))<48 THEN PRINT
   SCREEN$(PTR,PTR+NCHARS(DLIST(I))-C1):
   GOTO 4035
ZK 4032 PRINT SCREEN$(PTR,PTR+23);"..."
WB 4035 PTR=PTR+NCHARS(DLIST(I)):NEXT I
SV 4040 ? "olor, ext, ext Page rior o
   r xit"
YI 4042 GOSUB 700
XS 4045 GET #C1,X
OL 4050 IF X=ASC("E") THEN GOTO 11000
PK 4860 IF X=ASC("T") THEN 4120
PP 4065 IF X=ASC("N") THEN 4150
TO 4866 IF X=ASC("P") THEN 4170
XY 4070 IF X<>ASC("C") THEN 4045
ND 4880 ? "                COLORS
   ":? :? :? "Current Colors":FOR I=C1 TO
   C5
ON 4081 ? "Register ";I-C1;" - ";COLR(I):
   NEXT I
TB 4090 ? :? "Register # to change: ";:TR
   AP 4090:INPUT #16,C:IF C<0 OR C >C4 THE
   N 4090
CN 4100 ? "New value: "; :INPUT #16,X:IF X
   <0 OR X>255 THEN 4100
PJ 4102 COLR(C+C1)=X:? :? "Change another
    register?(Y/N): ";:GOSUB 700:GET #C1,
   Y:IF Y<>78 AND Y<>89 THEN 4102
IP 4105 IF Y=89 THEN 4080
OQ 4110 GOTO 4010
UX 4120 TRAP 4010:? "Enter number of lin
   e to edit text:  ";:INPUT #16,NL
UW 4121 PRINT "Old text": PTR=C1:IF NL=C1
   THEN 4124
JE 4122 FOR I=C1 TO ML-C1:PTR=PTR+NCHARS(
   DLIST(I)):NEXT I
JN 4123 IF NCHARS(DLIST(NL))>38 THEN PRIM
   T SCREEN$(PTR,PTR+36):GOTO 4125
CY 4124 PRINT SCREENS(PTR,PTR+NCHARS(DLIS
   T(NL))-Cl)
QW 4125 MODE=DLIST(NL)
HL 4126 PRINT "New text"
XB 4130 GOSUB 500
OZ 4140 GOTO 4010
NQ 4150 IF DLEN<17 THEN 4010
PS 4151 IF DLEN<33 THEN DFLAG=C1:GOTO 401
   0
MP 4152 IF DFLAG=C1 THEN DFLAG=C2
OC 4153 IF DFLAG=0 THEN DFLAG=C1
PS 4154 GOTO 4010
PF 4160 GOTO 4010
KF 4170 DFLAG=DFLAG-C1:IF DFLAG<0 THEN DF
   LAG=0
QC 4175 GOTO 4010
NH 5000 GOSUB 730:GRAPHICS 0:SETCOLOR C2,
   C5,C2:GOSUB 720
AN 5001 SCRFLG=0:ADL=PEEK(560)+256*PEEK(5
   61):POKE ADL+C3,PEEK(ADL+C3)+C5:POKE A
   DL+C6,7
MP 5005 FN=0:FILE$(C1)=" ":FILES(400)=" "
   :FILES(C2)=FILE$
CR 5010 PRINT "               SE
   QUENCE"
RG 5011 POSITION C2,11:? "Enter filename:
   ";:INPUT #16,FN$
TU 5020 FILE$(FN*20+C1)=FN$
ZE 5030 ? " Any more files? (Y/N): ";
XA 5031 GET #C1,X
KG 5040 IF X=ASC("Y") THEN PRINT CHR$(X):
   FN=FN+C1:GOTO 5010
BB 5045 IF X<>ASC("N") THEN 5031
OL 5046 PRINT CHR$(X)
JE 5050 ? " Automatic or Cued? (A/C): ";
XW 5055 GET #C1,X
VV 5060 IF X=ASC("C") THEN PRINT CHR$(X):
   GOTO 5080
ZK 5065 IF X<)ASC("A") THEN 5055
OR 5066 PRINT CHR$(X)
UN 5070 TRAP 5070:? " Delay before starti
   ng load of":? " following screen: ";:I
   NPUT #16,J:J=J*111
RH 5080 ? " Repeat sequence endlessly? ";
YD 5081 GET #C1,Y
TR 5085 IF (Y<>89) AND (Y<>78) THEN 5081
PO 5086 PRINT CHR$(Y)
FC 5090 FOR F=C1 TO FN+C1
XS 5095 CLOSE #C1
RO 5096 TRAP 5330
DK 5100 FILENAME$=FILE$((F-C1)*28+C1):IF
   FILENAME$(C2,C2)=":" OR FILENAME$(C3,C
   3)=":" THEN 5104
GU 5101 FN$=FILENAME$:FILENAME$="D:":FILE
   NAME$(C3)=FN$
XQ 5104 OPEN #C1,C4,0,FILENAME$
QC 5105 INPUT #C1,FILENAME$:IF FILENAMES<
   >"\SUMMERS\PRESENT\" THEN 5400
AZ 5110 FOR I=C1 TO C5:INPUT #C1,C:COLR(I
   )=C:NEXT I
SP 5120 INPUT #C1,DLEN
NR 5125 FOR I=C1 TO DLEN:INPUT #C1,C:DLIS
   T(I)=C:NEXT I
QR 5130 SCREEN$(2048)=" "
LV 5140 HI=INT(ADR(SCREEN$)/256):LO=ADR(S
   CREEN$)-256*HI
ZP 5141 POKE 850,7:POKE 852,LO:POKE 853,H
   I:POKE 856,0:POKE 857,8:D=USR(ADR(SHIN
   $),16)
XE 5142 SCL=PEEK(856)+256*PEEK(857):SCREE
   N$(SCL)=""
YT 5150 GOSUB 710
XQ 5160 SCR1$(LEN(SCREEN$))=" "
UP 5170 D=USR(ADR(CNV$),ADR(SCREEN$),ADR(
   SCR1$),LEN(SCREEN$))
YD 5205 POKE 559,0:POKE 77,0:POKE 54272,0
RQ 5210 SCR$=SCR1$
YO 5300 GOSUB 170
HP 5310 IF X<>ASC("C") THEN FOR K=C1 TO J
   :NEXT K:GOTO 5330
PZ 5320 GET #C1,K
QS 5330 GOSUB 710:NEXT F
EZ 5340 IF Y=ASC("Y") THEN GOTO 5090
PR 5350 GOTO 11000
WQ 5400 GRAPHICS 24:POKE 710,0:FOR I=LEN(
   FILENAME$)+C1 TO 26:GET #C1,K:FILENAME
   $(I)=CHR$(K):NEXT I
DU 5401 IF FILENAME$(C1,C1)<>CHR$(255) OR
    FILENAME$(C2,C2)<>CHR$(128) THEN 5500
MR 5410 POKE 559,0:DLA=RAMTOP*256-257:FOR
   I=C1 TO 202:POKE DLA+I,ASC(DLA$(I)):N
   EXT I
OJ 5411 POKE 560,0:POKE 561,RAMTOP-C1:POK
   E 88,0:POKE 89,RAMTOP-31:POKE 559,34
JE 5420 FOR I=14 TO 18:POKE 694+I,ASC(FIL
   ENAME$(I,I)):NEXT I
YY 5430 DIR=ASC(FILENAME$(8,8))
OS 5435 IF DIR<>C1 THEN D=USR(ADR(HORZ$))
WP 5440 IF DIR=C1 THEN D=USR(ADR(VERT$))
ZX 5450 GOSUB 710:GOTO 5310
KY 5500 CLOSE #C1:FILENAME$=FILE$((F-C1)*
   20+C1):IF FILENAME$(C2,C2)=":" OR FILE
   NAME$(C3,C3)=":" THEN 5504
IE 5501 FN$=FILENAME$:FILENAME$="D:":FILE
   NAME$(3)=FN$
FD 5504 POKE 559,0:OPEN #C1,C4,0,FILENAME
   $
BM 5505 SETCOLOR C2,0,0:DL=PEEK(566)+256*
   PEEK(561):FOR I=203 TO 201 STEP -1:POK
   E DL+I,PEEK(DL+I-C2)
GU 5506 NEXT I:POKE DL+199,15:POKE DL+200
   ,15:GOSUB 720
TQ 5507 INPUT #C1,C:POKE 712,C:INPUT #C1,
   C:POKE 710,C:INPUT #C1,C:POKE 709,C
TS 5508 POKE 850,7:POKE 852,0:POKE 853,C6
   :POKE 856,202:POKE 857,0
BQ 5509 D=USR(ADR(SHIN$),16)
KT 5510 POKE 850,7:POKE 852,PEEK(88):POKE
    853,PEEK(89):POKE 856,0:POKE 857,31
YZ 5511 POKE 559,34
BD 5515 D=USR(ADR(SHIN$),16)
ZQ 5520 GOSUB 710:GOTO 5310
EQ 6000 GOSUB 730:GRAPHICS 0:SETCOLOR C2,
   10,C2:GOSUB 720
YS 6001 ADL=PEEK(560)+256*PEEK(561):POKE
   ADL+C3,PEEK(ADL+C3)+C5:POKE ADL+C6,7
XE 6002 PRINT "                SC
   REEN"
UN 6005 IF SCRFLG=0 THEN POSITION 8,11:PR
   INT "No screen in memory":FOR I=C1 TO
   200:NEXT I:GOTO 11000
AZ 6010 POSITION 7,11:PRINT "Press any ke
   y for menu"
IN 6020 FOR I=C1 TO 200:NEXT I:GOSUB 110:
   GET #C1,X:GOTO 11000
GF 7000 GOSUB 730:GRAPHICS 0:SETCOLOR C2,
   11,C2:GOSUB 720
YT 7001 ADL=PEEK(560)+256*PEEK(561):POKE
   ADL+C3,PEEK(ADL+C3)+C5:POKE ADL+C6,7
VB 7005 PRINT "                   DIR
   ECTORY"
YU 7010 CLOSE #C5:TRAP 7200:OPEN #C5,C6,0
    "D:*.*"
FA 7020 TRAP 7100:GET #C5,X:IF X=155 THEN
    PRINT " ";:GOTO 7020
SH 7025 PRINT CHR$(X);:GOTO 7020
ZL 7100 CLOSE #C5:PRINT :PRINT "Press any
   key for menu ";:GET #C1,X
PD 7110 GOTO 11000
CW 7200 PRINT "Cannot open drive one's di
   rectory":PRINT "Please check the drive
   to be sure it"
PS 7210 PRINT "is on and the disk inside
   is in the ":PRINT "format of the curre
   nt DOS"
QE 7220 GOTO 7100
KW 8000 GOSUB 730:GRAPHICS 0:SETCOLOR C2,
   14,C2:GOSUB 720
EK 8001 ADL=PEEK(560)+256*PEEK(561):POKE
   ADL+C3,PEEK(ADL+C3)+C4:POKE ADL+C6,C6
ZA 8010 PRINT "      SE
   QUENCE"
ZU 8011 POSITION C3,11:PRINT "Enter filen
   ame holding sequence"
MB 8012 POSITION 10,13:PRINT " ";:INPUT #
   16,FILENAME$
II 8013 IF FILENAME$(C2,C27=":" OR FILENA
   ME$(C3,C3)=":" THEN 8020
HK 8014 FN$=FILENAME$:FILENAME$="D:":FILE
   NAME$(C3)=FN$
WE 8020 TRAP 1120:CLOSE #C1:OPEN #C1,C4,0
   ,FILENAMES
JE 8030 FN=0:TRAP 8050
CZ 8035 INPUT #C1,FILENAME$
PH 8040 FILE$(20*FN+C1)=FILENAME$:FN=FN+C
   1:GOTO 8035
AS 8050 GOSUB 710:GOTO 5050
TV 10000 CLR :DIM SCREEN$(2048),SCR$(2048
   ):A=ADR(SCR$):IF INT(A/4096)=INT((A+20
   483/4096) THEN 10002
HL 10001 CLR :DIM SCR$(2048),SCREEN$(2048
   )
IN 10002 DIM FILENAME$(40),COLR(5),NLINES
   (8),NCHARS(8),TEXT$(82)
RV 10003 DIM DLIST(100),SP$(80),DLI(130),
   ANTIC(8),LINE$(80),SCR1$(2048)
KH 10004 DIM FN$(20),FILE$(400),CNV$(101)
   ,VERT$(374),SHIN$(7),HORZ$(289),DLA$(2
   02)
SK 10005 C1=1:C2=C1+C1:C3=C2+C1:C4=C2+C2:
   C5=C2+C3:C6=C5+C1
MG 10010 GRAPHICS 18: PRINT #C6: PRINT #C6
XI 10020 PRINT #C6;"     "
DO 10025 PRINT #C6;"       "
KF 10030 PRINT #C6;"       "
MW 10031 PRINT #C6
VT 10032 PRINT #C6;"    from analog    "
VT 10033 PRINT #C6;"    "
VU 10039 FOR I=C1 TO 100:NEXT I
SK 10040 FOR I=C1 TO C5:READ C:COLR(I)=C:
   NEXT I
AQ 10041 DATA 40,202,148,70,0
TW 10050 FOR I=0 TO 8:READ C:NLINES(I)=C:
   NEXT I
VZ 10051 DATA 8,8,16,8,4,4,2,2,1
JS 10060 FOR I=0 TO 8:READ C:NCHARS(I)=C:
   NEXT I
JD 10061 DATA 40,20,20,10,10,20,20,40,40
BE 10070 OPEN #C1,C4,0,"K:"
BI 10090 SP$(C1)=" ":SP$(80)=" ":SP$(C2)=
   SP$(C1)
HJ 10091 LINE$(C1)="_":LINE$(80)="_":LINE
   $(C2)=LINE$(C1)
KL 10100 FOR I=0 TO 8:READ C:ANTIC(I)=C:N
   EXT I
QF 10110 DATA 2,6,7,8,9,10,11,13,15
LH 10130 GOSUB 12000
ZQ 10150 SHIN$=""
AN 10160 DLA$(C1,C5)="pppN":RAMTOP=PEEK(
   106):DLA$(C6)=CHR$(RAMTOP-31):FOR I=7
   TO 199:DLA$(I)=CHR$(14):NEXT I
UV 10170 DLA$(102,103)="N":DLA$(104,104)
   =CHR$(RAMTOP-16):DLA$(200,201)="A":DL
   A$(202,202)=CHR$(RAMTOP-C1)
ZM 11000 GRAPHICS 0:GOSUB 720
XE 11001 ADL=PEEK(560)+256*PEEK(561):POKE
    ADL+C3,PEEK(ADL+C3)+C5:POKE ADL+C6,C6
VD 11002 PRINT "           G
   RAPHICS"
NE 11003 POKE ADL+26,7:POKE ADL+27,C6:POK
   E ADL+28,7:POSITION C2,20
VN 11004 PRINT "           G
   RAPHICS"
FV 11009 POSITION C2,C1
BX 11010 PRINT "Presentation Graphics Pro
   gram":?
BH 11020 PRINT "Select option by number:"
MQ 11030 PRINT "0 - Exit"
FV 11040 PRINT "1 - Load screen"
PU 11050 PRINT "2 - Save Screen"
LQ 11060 PRINT "3 - Create screen"
OC 11070 PRINT "4 - Edit screen"
IK 11080 PRINT "5 - Create Presentation s
   equence"
UE 11081 PRINT "6 - Display current scree
   n"
DR 11082 PRINT "7 - Directory of drive 1"
DB 11083 PRINT "8 - Run a pre-written seq
   uence"
VS 11090 ? :PRINT "Select: ";:GET #C1,X
QE 11100 X=X-48:IF X<0 OR X>8 THEN GOSUB
   730:GOTO 11000
TB 11110 ON X GOTO 1080,2800,3000,4000,50
   00,6000,7000,8000
HV 11120 GOSUS 730:GRAPHICS 0:POKE 559,34
   :END
DE 13000 RETURN



   Listing 2.
BASIC listing.

ER 10 OPEN #1,8,0,"D:LINES.LST"
VX 20 LINE=12000:LINEINC=10:STRPOS=1:SAVP
   OS=1
IG 30 DIM 5TRNAME$(10),STORE$(80)
CX 40 STRNAME$="CNV$"
AV 50 PRINT #1;LINE;" ";STRNAME$;"(";STRP
   OS;",";
RP 55 SAVPOS=STRPOS
TK 60 READ A:IF A=999 THEN 99
AN 65 CKSUM=CKSUM+A*STRPOS
TZ 70 STORE$(LEN(STORE$)+1)=CHR$(A):STRPO
   S=STRPOS+1:IF (STRPOS-1)/80<>INT((STRP
   OS-1)/80) THEN 60
GX 75 PRINT #1;SAVPOS-1+LEN(STORE$);")=";
   CHR$(34);STORE$;:STORE$=""
OL 80 LINE=LINE+LINEINC:? #1:GOTO 50
HH 99 PRINT #l;SAVPOS-1+LEN(STORE$);")=";
   CHR$(34);STORE$;:STORE$=""
XM 100 IF STRNAME$="HORZ$" THEN 1000
VF 110 IF STRNAME$="VERT$" THEN STRNAME$=
   "HORZS"
SF 120 IF STRNAME$="CNV$" THEN STRNAME$="
   VERT$"
YM 125 STRPOS=1
EW 130 LIME=LINE+LINEINC:? #1
QY 140 GOTO 50
VA 1000 IF CKSUM<>14670727 THEN PRINT "ER
   ROR IN DATA!"
FX 1010 ? #1:CLOSE #1:END
FF 15000 DATA 104, 104, 133, 204, 104, 13
   3, 203, 104, 133, 206
SG 15010 DATA 104, 133, 205, 104, 133, 20
   8, 104, 133, 207, 160
HX 15020 DATA 0, 177, 203, 41, 128, 133,
   209, 177, 203, 41
UJ 15030 DATA 127, 201, 96, 16, 12, 201,
   32, 48, 6, 56
PU 15040 DATA 233, 32, 24, 144, 2, 9, 64,
    5, 209, 145
JD 15050 DATA 205, 165, 203, 24, 105, 1,
   133, 203, 165, 204
FT 15060 DATA 105, 0, 133, 204, 165, 205,
    24, 105, 1, 133
EE 15070 DATA 205, 165, 206, 105, 0, 133,
    206, 165, 207, 56
WN 15080 DATA 233, 1, 133, 207, 165, 208,
    233, 0, 133, 208
ZK 15090 DATA 201, 0, 208, 181, 165, 207,
    201, 0, 208, 175
LU 15100 DATA 96,999
WD 16000 DATA 104, 165, 88, 133, 216, 165
   , 89, 133, 217, 169
CS 16010 DATA 0, 133, 212, 133, 220, 133,
    221, 133, 222, 133
JA 16020 DATA 223, 169, 1, 133, 213, 165,
    216, 24, 101, 212
UJ 16030 DATA 133, 214, 165, 217, 105, 0,
    133, 215, 165, 214
QG 16040 DATA 24, 105, 0, 133, 218, 165,
   215, 105, 30, 133
PD 16056 DATA 219, 162, 16, 169, 7, 157,
   66, 3, 169, 1
MZ 16060 DATA 157, 72, 3, 169, 0, 157, 73
   , 3, 169, 220
TH 16070 DATA 157, 68, 3, 169, 0, 157, 69
   , 3, 32, 86
ZB 16080 DATA 228, 169, 0, 133, 222, 165,
    220, 16, 8, 41
XD 16090 DATA 127, 133, 220, 169, 1, 133,
    222, 165, 220, 208
DA 16100 DATA 47, 162, i6, 169, 7, 157, 6
   6, 3, 169, 2
MI 16110 DATA 157, 72, 3, 169, 0, 157, 73
   , 3, 169, 220
SQ 16120 DATA 157, 68, 3, 169, 0, 157, 69
   , 3, 32, 86
IQ 16130 DATA 228, 165, 220, 166, 221, 13
   4, 220, 133, 221, 24
QO 16140 DATA 144, 6, 24, 144, 162, 24, 1
   44, 193, 162, 16
JB 16150 DATA 169, 7, 157, 66, 3, 169, 1,
    157, 72, 3
WM 16160 DATA 169, 0, 157, 73, 3, 169, 22
   3, 157, 68, 3
PJ 16178 DATA 169, 0, 157, 69, 3, 32, 86,
    228, 160, 0
UZ 16180 DATA 165, 223, 145, 214, 165, 21
   4, 24, 105, 80, 133
VQ 16190 DATA 214, 165, 215, 105, 0, 133,
    215, 197, 219, 48
ZF 16200 DATA 83, 165, 214, 197, 218, 48,
    77, 165, 213, 201
OS 16210 DATA 1, 208, 42, 165, 216, 24, 1
   01, 212, 133, 214
PG 16220 DATA 165, 217, 105, 0, 133, 215,
    165, 214, 24, 105
CD 1623e DATA 40, 133, 214, 165, 215, 105
   , 0, 133, 215, 169
TX 16240 DATA 2, 133, 213, 24, 144, 38, 2
   4, 144, 149, 24
JX 16250 DATA 144, 149
EX 16260 DATA 24, 144, 179, 169, 1, 133,
   213, 165, 212, 24
EM 16270 DATA 105, 1, 133, 212, 201, 48,
   208, 1, 96, 165
CF 16280 DATA 216, 24, 101, 212, 133, 214
   , 165, 217, 105, 0
JE 16290 DATA 133, 215, 165, 222, 201, 1,
    208, 41, 240, 9
GN 16300 DATA 24, 144, 207, 24, 144, 207,
    24, 144, 207, 162
JK 16310 DATA 16, 169, 7, 157, 66, 3, 169
   , 1, 157, 72
LL 16320 DATA 3, 169, 0, 157, 73, 3, 169,
    223, 157, 68
SG 16330 DATA 3, 169, 0, 157, 69, 3, 32,
   86, 228, 165
CZ 16340 DATA 220, 56, 233, 1, 133, 220,
   165, 221, 233, 0
AD 16350 DATA 133, 221, 165, 220, 208, 20
   6, 165, 221, 208, 202
IE 16360 DATA 165, 222, 201, 1, 208, 13,
   165, 223, 133, 220
RQ 16370 DATA 169, 0, 133, 221, 133, 222,
    24, 144, 180, 24
LM 16380 DATA 144, 174, 999
WF 17000 DATA 104, 165, 88, 133, 216, 165
   , 89, 133, 217, 169
AJ 17010 DATA 0, 133, 220, 133, 221, 133,
    222, 133, 223, 169
RR 17020 DATA 1, 165, 216, 133, 214, 165,
    217, 133, 215, 165
NK 17030 DATA 214, 24, 105, 0, 133, 218,
   165, 215, 105, 30
QE 17040 DATA 133, 219, 162, 16, 169, 7,
   157, 66, 3, 169
SO 17050 DATA 1, 157, 72, 3, 169, 0, 157,
    73, 3, 169
SF 17060 DATA 220, 157, 68, 3, 169, 0, 15
   7, 69, 3, 32
JU 17070 DATA 86, 228, 169, 0, 133, 222,
   165, 220, 16, 8
SC 17080 DATA 41, 127, 133, 220, 169, 1,
   133, 222, 165, 220
AP 17090 DATA 208, 47, 162, 16, 169, 7, 1
   57, 66, 3, 169
SJ 17100 DATA 2, 157, 72, 3, 169, 0, 157,
    73, 3, 169
RO 17110 DATA 220, 157, 68, 3, 169, 0, 15
   7, 69, 3, 32
TQ 17120 DATA 86, 228, 165, 220, 166, 221
   , 134, 220, 133, 221
UL 17130 DATA 24, 144, 6, 24, 144, 162, 2
   4, 144, 193, 162
JS 17140 DATA 16, 169, 7, 157, 66, 3, 169
   , 1, 157, 72
LT 17150 DATA 3, 169, 0, 157, 73, 3, 169,
    223, 157, 68
IY 17160 DATA 3, 169, 0, 157, 69, 3, 32,
   86, 228, 160
OA 17170 DATA 0, 165, 223, 145, 214, 165,
    214, 24, 105, 1
MY 17180 DATA 133, 214, 165, 215, 105, 0,
    133, 215, 197, 219
EL 17190 DATA 48, 7, 165, 214, 197, 218,
   48, 1, 96, 165
QS 17200 DATA 222, 201, 1, 208, 41, 240,
   9, 24, 144, 179
DF 17210 DATA 24, 144, 179, 24, 144, 209,
    162, 16, 169, 7
CJ 17220 DATA 157, 66, 3, 169, 1, 157, 72
   , 3, 169, 0
PT 17230 DATA 157, 73, 3, 169, 223, 157,
   68, 3, 169, 0
HX 17240 DATA 157, 69, 3, 32, 86, 228, 16
   5, 220, 56, 233
LL 17250 DATA 1, 133
MK 17260 DATA 220, 165, 221, 233, 0, 133,
    221, 165, 220, 208
EK 17270 DATA 206, 165, 221, 208, 202, 16
   5, 222, 201, 1, 208
LF 17280 DATA 13, 165, 223, 133, 220, 169
   , 0, 133, 221, 133
OG 17290 DATA 222, 24, 144, 180, 24, 144,
    174
TL 17300 DATA 999