3
Applications and Education
Scriptor: An Atari Word Processor
Charles Brannon
"Scriptor" is an easy-to-use, full-scrolling, character-oriented, multi-function word processor, requiring an Atari 400/800 with a minimum of 32K of memory (40K recommended), an Epson MX-80 or Atari 825 printer, and an Atari 810 disk drive. It is programmed in both BASIC and machine language. For instructions on typing in the program, see the secion under Typing It In.
Through the Ruby

Computers don't just calculate with numbers—they can also work with text. Five-inch disks can replace stacks of files. Computers can sort, search, select, and update any kind of information. They can focus information. In this sense, the computer is like the ruby crystal in a laser. Ordinary random light waves are transformed and concentrated through the ruby into a tight powerful beam. Computers can do the same for information.

Word Processing

Electronic text is more "liquid"," easier to work with, than words solidified on paper (hard copy). This is what makes word processing special: the extrordinary editing power it gives you. Distinctions between a rough draft and a final draft are meaningless; the work is typed, changed dynamically, and stored to disk. It can then later be recalled, revised, and printed out. Very little retyping is necessary. What a boon for anyone who writes.

Converts to word processing immediately notice an improvement in their writing. The entire manuscript becomes "alive," not committed to paper. Changing a word or a sentence, inserting a line or a paragraph are all accomplished with ease. For example, take just one key, the backspace key (called RUBOUT on some computers or terminals). When this key is struck, the last character typed is erased from the screen. Compare this to the frequently elaborate typewriter correction schemes.

Besides the disk file, which has already been mentioned and which will be explained in greater detail later, an important concept in word processing is the cursor. Named after the clear plastic side on a slide rule, the cursor shows you where the next character you type is going to appear. It usually looks like an underline, _, or a solid square. Users familiar with any computer have already encountered the cursor. The computer itself doesn't need a cursor; but since you can type anywhere on the screen, the cursor is vital so that you can know where you are.

The cursor can be moved up, down, left, and right with special keys, usually with arrows on them. To correct the following line:

The quick brown dox jumped 
you would either press backspace ten times, erasing the text as you go, or press cursor-left ten times. The cursor moves over the characters without erasing them. It is then resting on the d:
The quick brown dox jumped
You can correct the error by typing f, which overstrikes (replaces) the d.
The quick brown fox jumped
The cursor can then be moved to the end of the line (ten cursor-rights), and typing resumed.

This sounds harder than it really is. Cursor editing becomes second nature after only hours of use. The cursor UP/DOWN keys can reach lines of text above and below the current line. It is like rolling a typewriter's platen up or down, but with one important difference—the "paper" is one continuous, long sheet.

Getting Specific

Two very special functions are insert and delete. Insert lets you add text in the middle of a line, by pressing INSERT to insert spaces in the text, and then typing in the word. For example:

To be or to be,that is the question. 
The cursor is placed on the second to, and INSERT is pressed four times (three for n-o-t, and one for a space):
To be or     to be,that is the question.
The word not is then typed:
To be or not to be,that is the question.
Delete is used to erase text. As distinguished from mere backspacing or spacing over a word, delete closes up the space after the deleted word.

Take out a word 

Take out a word
1. (cursor is moved to "o")
Take ut a word
2. (DELETE typed; "o" disappears, "ut a word" moves left.)
Take a word
(DELETE is typed four times.)

Insert and delete can also act on words, sentences, lines, or entire paragraphs in a similar way.

Disk Files

A file is simply a permanent record of your text. When the computer's power is turned off, it forgets everything except what is "burned" (in ROM memory) into it permanently. Your text is obviously not "burned in," or you couldn't ever change it. If you have a blackout, or a fuse blows, say good-bye to your text.

Catastrophes aside, you certainly don't want to leave your computer on all the time, or keep the computer tied up with your text forever. Fortunately you can save your text on disk, ready for any later revisions. You can type it one time, save your text, and print it out when convenient.

Since a disk can store more than one document (unless it's very long), you and the computer must have some way to distinguish and separate one file from another. This is usually done via a directory, a list of filenames. You access a file by giving the computer the file's name.

"Scriptor," the word processor program at the end of this article, has many features usually found only in professional word processors, but it lacks a few features such as search and replace, justification, data base merge, etc. Also, it is written in BASIC, so it can be rather slow at times. It is, however, aided by several machine language subroutines for time-critical situations such as disk input/output and some editing features.

Typing It In

Program 1 is the Scriptor program itself. Type it carefully, since it contains many critical machine language DATA statements. Extra time spent in typing it in will reward you with a smoother, bug-free word processor. Remember to use the Listing Conventions. Use the Atari logo key to enter inverse video. To give you more memory for text, Scriptor deletes a substantial portion of itself after it initializes (sets up). Don't worry—the program is busy running while the screen flashes; it just takes awhile. The setup lines from 5000-6999 are automatically erased.

If you quit the program and try to run it again, the program will automatically try to re-RUN itself anew from disk. If you've changed disks, you'll need to reload it yourself. You should SAVE the program with the filename "D:SCRIPTOR" or change line 455 appropriately. Be sure to SAVE Scriptor after you've typed it in, before you run it, or you will find a sizeable chukn of your typing erased when you exit. You can free up more memory for text by deleting the "help" function. Take out all lines from 1570 to 1700 and remove line 775. If you'd rather keep this handy aid, leave those lines alone.

If you get the message "Error in DATA statements" when you run the program, you need to check your typing of the machine language DATA statements at the end of the program. Also make sure you haven't typed a letter O for a zero (the zero is thinner than the O).

If you have an Atari 825 printer, you will need to type in the lines in Program 2. This will replace the lines used for the MX-80 with lines applicable to the 825 80-column printer. If you have another pritner, refrain from using special characters such as underlining, and you will probably be able to get one of the sets of lines to work.

Getting Started

Scriptor is a full-scrolling, character-oriented word processor. The use of cursor control keys is similar to normal Atari editor functions, with these exceptions.

  1. <RETURN> is used only to force a carriage return, as at the end of a paragraph, or to print a blank line. The computer will format your line when you print it out, so just type continuously. Do not press <RETURN> at the end of each line. Pressing <RETURN> prints a black-arrow at the end of the line and erases all text to the end of that line.
  2. Insert and Delete character (CTRL-INSERT/CTRL-DELEETE) work on whole "paragraphs." A paragraph is a block of lines from the cursor to a "back-arrow." If there is no back-arrow, one is assumed at the end of text. Therefore, Insert and Delete can be quite slow if you don't have a back-arrow somewhere.
  3. Insert and Delete line work on the entire document. The screen will blank during this operation. This is normal and speeds up the process, as it can be slow on long documents.
  4. All TAB controls work normally, just a little slower. <CTRL-K> will clear all tab settings.
  5. <CLEAR> will not clear the screen. It is used to erase all or part of the text. Press <CLEAR><A> to erase all text. Press the Atari logo key to abort the erase function.
  6. The break key is disabled. Use <CTRL-Q> to exit the program.
  7. The ESC key enters the "mini-DOS." (See below.)
  8. The console keys are "live"; see a description of their functions later.
  9. The Atari logo key is disabled for normal typing. Within prompts, it acts as an "abort" key.

Getting Control

Since the Atari is not a dedicated word processor (that means it's not just a "word processing machine" like a Lanier, but is, rather, a general0purpose computer), it does not have special keys to activate word processing functions. Instead, the <CTRL-key> combination is used. For example, to quit the program, you would hold down <CTRL> and press <Q>. The CTRL key stands for "Control"—it is like a special shift key. The keys are linked mnemonically (easy to remember) to the commands they stand for, such as <P> for Print Text. To get a list of the commands and what they stand for at any time, just press <CTRL-?> (hold down CTRL and press the question mark) for a HELP menu. See Table 1 for a quick-reference chart of the commands.

Going Around the Block

An important feature in a word processor is block move and delete. Scriptor lets you define a series of up to 23 lines. You can then move these lines to another place in the text with Line Duplicate, or delete the defined lines with <CLEAR/D> (Erase: Defined lines). To define a block of lines, just place the cursor on the first line and press <CTRL-D>. A flashing arrow will appear to the left of the line. Press cursor-down, another symbol will appear underneath. Press cursor-down until all the desired lines have an arrow to their left. Then press <RETURN>. If you make a mistake, just try again, or press cursor-up while defining.

To copy these lines to another place, position the cursor at the place you want the lines to appear and press <CTRL-L>. If you haven't defined any lines, this command will be ignored. Note that you can press this key more than once to make many copies of the lines. You may want to delete the defined lines after you move them. Press <CLEAR>. You will see the prompt "ERASE:". Press <D>. The lines will be deleted just as if you used Delete line multiple lines.

A Mini-DOS

The ESC key activates a mini-DOS. It lets you look at the directory and scratch, rename, lock, or unlock files. When you press <ESC>, you will see:

Directory,Lock,Unlock,Rename,Scratch?

Press the appropriate key. For all except the directory, you will need to enter a filename. The cursor, a half box, will be at the top of the screen. The only editing key you can use here is backspace.

Remember that you can abort any time before pressing <RETURN> by pressing the logo key. While the directory is listed, you can press <ESC> again to keep the directory on the screen while you use one of the other functions. You can also press [SELECT] (see later) to save or recall a file while looking at the directory. If you get an error message at the top of the screen, check the disk and your entry and try again.

For the Record . . .

To save or recall a document, press [SELECT]. The screen will display:

Save or Recall

Press the appropriate key, enter the filename, and the document will either be stored or retrieved. If you Recall a document, it loads starting on the line the cursor is on. This lets you add text to a document. Press START twice to home the cursor at the start of the text. If you get an error message, check to see you have the right disk, consult the DOS Manual, and try again. Remember that your filename must start with a capital letter and be followed by up to seven capital letters or numbers. You can optionally put a three-character extension on the file if you separate it with a period, for example, EDITOR. DOC, DRAFT3.CGB, DUNGEON.MAP, etc. You should not enter the "D:" prefix.

Printer a la Mode

Different printers offer special print densities and formats such as boldface, underlining, super- and subscripts, double-width, condensed, proportional spacing, etc. To underline a word or phrase, enclose it in <CTRL-brackets>. In other words, <CTRL-,> is underlining on, and <CTRL-.> is underlining off. Underlining only works on the 825 printer. If you have GRAFTRAX installed in your MX-80, underlining produces italics.

The following is an advanced technique. You can define up to ten special characters and print them at any spot in your text. To define a character, set up a format line (see the discussion of format lines, below) with <CTRL-F> and enter your definitions such as 1 = 123:2 = 125:3 = 27, etc. You can then output the CHR$ code of the defined characters by embedding a caret ("^") in your text, followed by the number (for example, ^4). If you don't put a number after it, a caret will print; otherwise the character associated with the number (0-9) will be output. You can also output ASCII chaacters from within a format line with the "as" format command. For example, "as27:as18" will activate proportional spacing on the 825 printer. Use "as27:as69" for emphasized mode on the MX-80.

Formatting Text

Since you are typing in the raw text, with no margins or line breaks, how does the computer print a nice formatted page? The computer assumes a left margin of 5, a right margin of 75, single spacing, a page length of 66, and 50 lines to be printed per page. You can change these default values with a format line.

A format line is like an embedded command line. The line starts with a format character to prevent the line from being printed out. To get the format character, press <CTRL-F>. You should get a right-pointed wedge. Then type in your commands. All commands are two lowercase letters, usually followed by a number. You can put multiple commands on the same line if you separate them with colons. For example, the following line:

will set the left margin to ten, the right margin to 70, and line spacing to two. Here is an explanation of each formatting command. Also see Table 2 for quick reference.

Note that n represents a number, with no space between the command and the number. No real error-checking is performed on the number.
asn   Sends byte n to printer.
cm: Comment line. You can type one screen line of comments. They will not be printed to the printer. They are just for your convenience.
cnn Centering. If n = 1, then centering will be on, and all following lines will be centered until reset by cn0. If n = 0, then centering is turned off.
fp Forced paging. Normally, the printer will page, or go on to the next page, when the number of lines printed equals your lines per page (1p), which defaults to 50. Forced paging pages to the next page, regardless.
lmn n = left margin, which should be less than the right margin
lnn Prints n blank lines.
lpn Sets lines per page to nn should be less than the page length, to allow some blank space at the bottom of each page.
nf:filename Will chain to next specified file, permitting a document to be split up into many parts. The nf insures that they will all print as one big file. The formatting commands carry over to each file.
pln Sets the page length, which is almost always (and defaults to) 66.
rmn n = right margin, which should be less than the maximum width and greater than the left margin.
spn n = 1, single spacing; n = 2, double spacing; n = 3, triple spacing; etc.

Start the Presses

To print your document, press . You should see:

PRINT: (C/F)
To start printing just press <RETURN>. The printer head should be positioned at about the start of the page. The C/F indicates any selected< option. C stands for Continuous Print. You would use this option with pinfeed or roll paper. It will automatically page to the start of each sheet. If you do not select continuous print, the computer will beep at the end of each page and pause. You should put in another sheet of paper and press <RETURN> to continue printing.

Note that pressing a key any other time during printing will abort the printout. The F option stands for Fast Printout. It will blank the screen during the printing, increasing printing speed better than 30 percent. Some people, however, find a blank screen disconcerting. To select one of the options, press either C or F. The appropriate letter will light up and flash. To reset the option (cancel it), press the key again. Press <RETURN> when you are ready to print the text.

Customizing Scriptor

The program is fairly well-structured, with separate sections for all functions. The control keys are executed via a branching IF/THEN "bucket brigade." Just patch in your own command where desired. Some functions you may want to add are block transfer (performs both block insert and block delete), Search and Replace, Insert from Disk, and simple data merge. Machine language programmers may want to try their hand at speeding up certain aspects of the program, such as Insert Line, Delete Line, and even Print Text.

Here are some other useful subroutines. GOSUB 540 returns the number of lines the user has typed (not necessarily the maximum number of lines) in EOT. GOSUB 600 clears the top line of the screen and positions the cursor at the first character, ready for a message. GOSUB 460 performs error-checking and adjustments on the X-Y position of the cursor. GOSUB 2650 returns an adjusted (uppercase if AL = 1, no cursor controls, etc.) character in A. GOSUB 2730 is a pseudo-INPUT routine that returns IN$. Variable MX controls the maximum number of characters.

TRAP 2170 will vector errors to an I/O Error message. There are two reentry points for the editor proper: GOTO 650, which clears and "refreshes" the screen, and GOTO 680, which just adjusts the cursor and continues keyboard entry (faster).

Primary variables are: CL—the pointer to the top line (from 0-#lines) of the screen; X—the horizontal position of the cursor 2-39; Y—the vertical position of the cursor on the screen, 1-23; TX$—the string that contains all the text and is organized in 38 character substrings, one for each line; T$ and T—"temporary variables"; A—usually a keystroke typed; SCR—the address of the screen memory origin; NL—number of defined lines; FRL—the starting line in text of the defined lines; RL—the starting line in TX$ for reserved lines (the buffer). Several constants are Q0, Ql, Q23—which return 0, 1, or 23 (saves memory); L2=38; L=40; B$ is 38 null (CHR$(0)) characters.

Changes for the 1200XL

Scriptor as originally printed would not run on the model 1200XL. The modifications for the 1200XL are contained in Program 3. Simply substitute and/or add Program 3 to the main listing, Program 1.

There is another problem which might result from running Scriptor on a 1200XL. Scriptor, as mentioned before, deletes part of itself. The deletion of lines will sometimes cause Atari BASIC to lock up. Be sure to include line 7000, even though it is just a REM statement: line 7000 will help prevent the lock-up.

If Scriptor still locks up, you will have to experiment. Try adding a REM statement to the end of one of the lines at the end of the program (6000-6060). What you are trying to do is change the length of the lines being deleted.

Table 1. Editing Commands

Control Keys
A   Advance one screen forward
B Back up one screen
D Define lines
F Print format character
G Go to specified line
K Clear all tab settings
L Duplicate defined lines
P Print document
Q Quit program
SHIFT-INSERT   Insert a line
SHIFT-DELETE Delete a line
CTRL-INSERT Insert a space
CTRL-DELETE Delete a character
CLEAR Erase:
A = All     R = Remainder
D = Defined lines
CAPS/LOWR Upper-or lowercase
ESC Mini-DOS
Cursor keys Moves cursor with two-way scrolling
[OPTION] Nondestructive carriage return
[SELECT] Save or Recall text
[START] "Home" cursor
[CTRL-,] Underlining on
[CTRL-.] Underlining off
x Print special character

Table 2. Formatting Commands

Command Description Default
asn Send ASCII character n to printer
cm:xxxx Comment line
cnn Centering: 1=on, 0=off 0 Off
fp Forced Paging
lmn Set left margin to n 5
lnn Do n linefeeds
lpn Set lines per page to n 50
nf:file Link to Next File
pln Page length 66
rmn Set right margin to n 75
spn Set line spacing 1 (single)

Program 1. Scriptor
100 REM  SCRIPTOR WORD PROCESSOR
110 GOTO 5000
455 RUN "D:SCRIPTOR"
460 PF=Q0:IF X<2 THEN X=39:Y=Y-Q1
470 IF X>39 THEN X=2:Y=Y+Q1
480 IF Y<Q1 THEN Y=Q1:CL=CL-Q1:PF=Q1
490 IF Y>Q23 THEN Y=Q23:CL=CL+Q1:PF=Q1
500 IF CL<Q0 THEN CL=Q0
510 IF CL>(MXL-Q23) THEN CL=MXL-Q23
520 IF PF=Q0 THEN RETURN 
530 LOC=CL*L2+Q1:T=USR(SCRZAP,ADR(TX$(LOC))):RETURN 
540 REM ***  FIND END OF TEXT
550 P=ADR(TX$):T=P+RL*L2-Q1
560 A=USR(EDCOM,T,P,2):A=A-P
570 LC=A:EOT=INT(A/L2)
580 RETURN 
590 REM ***  ERASE TOP LINE
600 COLOR 32:PLOT Q1,Q0:DRAWTO L2,Q0:PLOT Q1,Q0:RETURN 
610 REM ***  START OF EDITOR
611 MXL=INT(FRE(Q0)/40)-25:RL=MXL+1
612 DIM TX$((MXL+Q23)*L2):? CHR$(125);
613 TX$=CHR$(Q0):TX$((MXL+Q23)*L2)=TX$:TX$(2)=TX$
620 SCR=PEEK(88)+256*PEEK(89):POKE 559,46:POKE 842,12
630 X=2:Y=Q1:CL=Q0:POKE 702,Q0
640 REM ***  ENTRY FOR EACH PAGE
650 POKE 54286,192
655 POSITION Q0,Q0:? "{7 SPACES}Scriptor Word Processor";:COLOR 32:DRAWTO L2,Q0:PLOT 32,Q0
660 LOC=CL*L2+Q1:T=USR(SCRZAP,ADR(TX$(LOC)))
670 IF TF THEN TF=Q0:GOTO 810
675 IF FIRST=Q0 THEN POSITION 31,Q0:? MXL;" Free";:TF=Q1:FIRST=Q1
680 POKE 53248,X*4+44
690 IF Y=OY THEN 740
710 ADJOY=OY*4+16:ADJY=Y*4+16
720 A=USR(CURSOR,PMB+ADJOY,Q0):A=USR(CURSOR,PMB+ADJY,15):OY=Y
740 K=PEEK(53279):IF K<7 THEN 2570
770 T=PEEK(764):IF T=255 OR T=39 OR T=154 THEN 740
775 IF T=166 THEN POKE 764,255:GOTO 1570
790 POKE 694,Q0:A=USR(GCHAR)
800 IF TF THEN 650
810 IF A<32 OR A>122 OR A=96 THEN 880
820 A=A-32*(A<96)
830 POKE SCR+X+L*Y,A
840 LOC=(CL+Y-Q1)*L2+X-Q1
850 TX$(LOC,LOC)=CHR$(A)
860 X=X+Q1-BF:GOSUB 460
870 BF=Q0:GOTO 680
880 IF A<>155 THEN 910
890 GOSUB 2640:POKE SCR+X+L*Y,94:TX$(LOC,LOC+L2-X+Q1)=B$:X=2:Y=Y+1
900 TX$(LOC,LOC)=CHR$(94):GOSUB 460:GOTO 650
910 IF A=6 THEN A=127:GOTO 830
920 IF A=28 THEN Y=Y-Q1:GOSUB 460:GOTO 680
930 IF A=29 THEN Y=Y+Q1:GOSUB 460:GOTO 680
940 IF A=30 THEN X=X-Q1:GOSUB 460:GOTO 680
950 IF A=96 THEN A=74:GOTO 830
960 IF A=31 THEN X=X+Q1:GOSUB 460:GOTO 680
970 IF A=Q0 THEN A=72:GOTO 830
980 IF A=126 THEN X=X-Q1:GOSUB 460:A=Q0:BF=Q1:GOTO 830
1040 IF A<>255 THEN 1070
1050 A=USR(EDCOM,ADR(TX$((CL+Y-Q1)*L2+X-Q1)),ADR(TX$(MXL*L2+37)),Q0)
1060 GOTO 650
1070 IF A<>254 THEN 1100
1080 A=USR(EDCOM,ADR(TX$((CL+Y-Q1)*L2+X-Q1)),ADR(TX$(MXL*L2+37)),Q1)
1090 GOTO 650
1100 IF A<>157 THEN 1160
1110 GOSUB 590:? "Insert Line";
1120 GOSUB 540:POKE 559,Q0
1130 FOR I=EOT+(EOT<MXL) TO CL+Y STEP -Q1:T$=TX$((I-Q1)*L2+Q1,I*L2):TX$(I*L2+Q1,I*L2+L2)=T$:NEXT I
1140 T=(CL+Y-Q1)*L2:TX$(T+Q1,T+L2)=B$
1150 X=2:POKE 559,46:GOTO 650
1160 IF A=159 THEN GOSUB 590:? "Tab set at ";X-Q1:TF=Q1:TB$(X-Q1,X-Q1)="*":GOTO 740
1170 IF A=158 THEN GOSUB 590:? "Tab cleared at ";X-Q1:TF=Q1:TB$(X-Q1,X-Q1)=CHR$(Q0):GOTO 740
1180 IF A<>127 THEN 1230
1190 IF TB$=B$ THEN GOSUB 590:? "No tabs set":TF=Q1:GOTO 740
1200 FOR I=X TO L2:IF TB$(I,I)=CHR$(Q0) THEN NEXT I:T=L2:X=2:Y=Y+Q1:GOSUB 460:GOTO 1200
1210 T=I:I=L2:NEXT I
1220 X=T+Q1:GOTO 680
1230 IF A<>156 THEN 1290
1240 GOSUB 590:? "Delete Line";
1250 GOSUB 540:POKE 559,Q0
1260 FOR I=CL+Y-Q1 TO EOT:T$=TX$((I+Q1)*L2+Q1,(I+2)*L2):TX$(I*L2+Q1,I*L2+L2)=T$:NEXT I
1270 T=EOT*L2:TX$(T+Q1,T+L2)=B$
1280 X=2:POKE 559,46:GOTO 650
1290 IF A=11 THEN GOSUB 590:TF=Q1:? "Clear all tabs":TB$=B$:GOTO 740
1320 IF A<>125 THEN 1450
1330 GOSUB 590:? "Erase: ";
1340 GOSUB 2650
1350 IF A=155 THEN 650
1355 IF A<>65 THEN 1370
1360 ? "ALL - ";:GOSUB 2540
1365 GOTO 613
1370 IF A<>82 THEN 1380
1372 ? "Remainder - ";:GOSUB 2540:GOSUB 2640
1375 TX$(LOC)=CHR$(Q0):TX$((MXL+Q23)*L2)=CHR$(Q0):TX$(LOC+Q1)=TX$(LOC):GOTO 650
1380 IF A<>68 OR NL=-Q1 THEN 650
1400 ? "Defined Lines - ";
1410 GOSUB 2540:POKE 559,Q0:GOSUB 540
1420 FOR I=FRL-Q1 TO EOT:T$=TX$((I+NL+Q1)*L2+Q1,(I+NL+2)*L2):TX$(I*L2+Q1,I*L2+L2)=T$:NEXT I
1430 FOR I=EOT-NL TO EOT:TX$(I*L2+Q1,I*L2+L2)=B$:NEXT I:NL=-Q1
1440 POKE 559,46:GOTO 650
1450 IF A<>4 THEN 1810
1460 GOSUB 590:? "Define Lines";
1470 FL=CL:FR=Y:FRL=FL+FR:NL=Q0
1480 POKE SCR+1+L*(FR+NL),223
1490 LOC=CL*L2+(FR+NL-Q1)*L2:T=RL*L2+NL*L2:T$=TX$(LOC+Q1,LOC+L2):TX$(T+Q1,T+L2)=T$
1500 GOSUB 2650
1510 IF A=29 AND FR+NL<22 THEN NL=NL+Q1:GOTO 1480
1520 IF A=28 AND FR+NL>FR THEN POKE SCR+1+L*(FR+NL),Q0:NL=NL-Q1
1530 IF A=155 THEN 1550
1540 GOTO 1500
1550 FOR I=Q0 TO NL:POKE SCR+1+L*(FR+I),Q0:NEXT I:GOTO 650
1570 POKE 53248,Q0:PRINT CHR$(125):POSITION 13,Q0:? " HELP Screen "
1580 ? "{DOWN}{TAB}{3 SPACES}Control Keys:"
1590 ? "A=Advance Page  B=Page Back"
1595 ? "D=Define Lines  F=Print format char."
1610 ? "K=Kill all tabs L=Line Duplicate"
1620 ? "P=Print text{4 SPACES}Q=Quit"
1630 ? "Atari Key=Cancel Command":? 
1635 ? "^x Print special character"
1640 ? "{DOWN}[CLEAR] Erase: ALL  Defined Lines":POKE 85,16:? "Remainder"
1650 ? "[OPTION] Non-destructive CR"
1660 ? "{DOWN}[SELECT] Filer:Recall or Save"
1670 ? "{DOWN}[START]  'Home' cursor.  Press twice  to go to start of text."
1680 ? "{DOWN}[ESC] Mini DOS"
1700 ? "{DOWN}Press RETURN.":A=USR(GCHAR):GOTO 650
1810 IF A<>12 THEN 1910
1820 GOSUB 590:? "Duplicate defined lines";
1830 IF NL<Q0 THEN 650
1840 FOR I=Q0 TO NL
1850 IF CL+Y+I-Q1>MXL THEN I=NL:GOTO 1900
1860 T=RL*L2+I*L2
1870 T2=CL*L2+(Y+I-Q1)*L2
1880 T$=TX$(T+Q1,T+L2)
1890 TX$(T2+Q1,T2+L2)=T$
1900 NEXT I:Y=Y+NL+Q1:GOSUB 460:GOTO 650
1910 IF A<>27 THEN 2400
1920 POSITION 2,Q0:? "Directory,Lock,Unlock,Rename,Scratch?"
1930 GOSUB 2650:J=A
1940 IF J<>76 AND J<>85 AND J<>83 AND J<>68 AND J<>82 THEN 1930
1950 IF J<>ASC("D") THEN 2020
1960 ? CHR$(125):POKE 53248,Q0
1970 TRAP 2170:OPEN #2,6,Q0,"D:*.*"
1980 INPUT #2,T$:? T$:IF LEN(T$)<17 THEN 2000
1990 GOTO 1980
2000 CLOSE #2:TRAP 40000:GOSUB 590:? "Press a key...";:OK=1:GOSUB 2650:IF A=27 THEN 1920
2010 GOTO 650
2020 GOSUB 590:J=A
2030 IF J=76 THEN ? " LOCK  ";:J=35
2040 IF J=83 THEN ? "SCRATCH";:J=33
2050 IF J=85 THEN ? " UNLOCK";:J=36
2060 IF J=ASC("R") THEN 2130
2070 ? "Enter Filename:";
2080 MX=12:AL=Q1:GOSUB 2720
2090 T$(3)=IN$:T$(1,2)="D:":POSITION 10,Q0:? DEL$(1,15);
2100 TRAP 2170:IF J=33 THEN POSITION 24,Q0:GOSUB 2540:COLOR 32:PLOT 24,Q0:DRAWTO 38,Q0
2110 TRAP 2170:XIO J,#2,Q0,Q0,T$:TRAP 40000
2120 TRAP 40000:GOTO 650
2130 GOSUB 590:? "RENAME>Current name? ";:MX=12:GOSUB 2720:T$(3)=IN$:T$(1,2)="D:"
2140 GOSUB 590:? "RENAME>New name? ";:MX=12:GOSUB 2720:T$(LEN(T$)+Q1)=",":T$(LEN(T$)+Q1)=IN$
2150 TRAP 2170:XIO 32,#2,Q0,Q0,T$:TRAP 40000
2160 GOTO 650
2170 TRAP 2170:POKE 559,46:CLOSE #2:CLOSE #3:GOSUB 590:? CHR$(253);"I/O Error #";PEEK(195);:TF=Q1:GOTO 740
2180 GOSUB 590:? "Save or Recall";
2190 ICCOM=834+48:ICBAL=ICCOM+2:ICBLL=ICBAL+4:ICSTAT=835+48:REM IOCB#3
2200 GOSUB 2650:IF A=155 THEN 1380
2210 IF A<>ASC("S") THEN 2290
2220 GOSUB 600:? "SAVE:{3 SPACES}File name? ";:MX=12:GOSUB 2720:T$(3)=IN$:T$(1,2)="D:":GOSUB 550
2230 POSITION 5,0:? DEL$(1,12);"ING";
2232 TRAP 2238:OPEN #3,4,Q0,T$:CLOSE #3:GOSUB 600:? "REPLACE:  ";IN$;" - ";:GOSUB 2540
2233 GOSUB 600:? "REPLACING ";IN$:GOTO 2240
2238 CLOSE #3:IF PEEK(195)<>170 THEN 2170
2240 TRAP 2170:OPEN #3,8,Q0,T$
2250 POKE ICCOM,11:P=ADR(TX$):POKE ICBAL+Q1,INT(P/256):POKE ICBAL,P-(INT(P/256)*256)
2260 LN=(CL+EOT+Q1)*L2:POKE ICBLL+Q1,INT(LN/256):POKE ICBLL,LN-(INT(LN/256)*256)
2270 A=USR(ADR(CIO$),48):ERR=PEEK(ICSTAT):POKE 195,ERR:IF ERR>1 THEN 2170
2280 CLOSE #3:TRAP 40000:POKE 53279,Q0:GOTO 650
2290 IF A<>ASC("R") THEN 650
2300 LK=Q0
2310 GOSUB 590:? "RECALL: Filename? ";:MX=12:GOSUB 2720:T$(3)=IN$:T$(1,2)="D:"
2315 LOC=(CL+Y-Q1)*L2+Q1:TX$(LOC)=CHR$(Q0):TX$((MXL+Q23)*L2)=CHR$(Q0):TX$(LOC+Q1)=TX$(LOC)
2320 TRAP 2170:POSITION 8,0:? DEL$(1,8);"ING";:OPEN #3,4,Q0,T$
2330 ICCOM=834+48:ICBAL=ICCOM+2:ICBLL=ICBAL+4
2340 POKE ICCOM,5:P=ADR(TX$((CL+Y-Q1)*L2+Q1)):POKE ICBAL+Q1,INT(P/256):POKE ICBAL,P-(INT(P/256)*256)
2350 LN=(MXL-(CL+Y-Q1))*L2:POKE ICBLL+Q1,INT(LN/256):POKE ICBLL,LN-(INT(LN/256)*256)
2360 A=USR(ADR(CIO$),48):ERR=PEEK(ICSTAT):POKE 195,ERR:IF ERR>1 AND ERR<>136 THEN 2170
2370 CLOSE #3:POKE 53279,Q0:TRAP 40000:IF LK=Q0 THEN 650
2380 CL=Q0:Y=Q1:X=2:T=USR(SCRZAP,ADR(TX$))
2390 GOTO 2950
2400 IF A<>17 THEN 2410
2403 GOSUB 600:? "QUIT";:GOSUB 2540
2405 POKE 53277,Q0:POKE 53248,Q0:POKE 53774,192:POKE 16,192:GRAPHICS Q0:POKE 702,64:END 
2410 IF A=16 THEN 2840
2420 IF A=Q1 THEN CL=CL+Q23:Y=Q1:GOSUB 460:GOTO 650
2430 IF A=2 THEN CL=CL-Q23:Y=Q1:GOSUB 460:GOTO 650
2500 GOTO 640
2540 ? "Are you sure?";:GOSUB 2650:IF 1-(A=121 OR A=89) THEN POP :GOTO 650
2550 RETURN 
2570 REM ***  Handle console keys
2580 POKE 764,130:A=USR(GCHAR):POKE 77,Q0
2590 IF K=5 THEN 2180
2600 IF K=3 THEN X=2:Y=Y+Q1:GOSUB 460:GOTO 680
2610 IF K=6 AND Y=Q1 AND X=2 THEN CL=Q0:X=2:GOTO 650
2620 IF K=6 THEN Y=Q1:X=2:GOTO 650
2630 GOTO 740
2640 LOC=(CL+Y-Q1)*L2+X-Q1:RETURN 
2650 T=Q0:REM GET A KEY
2660 IF PEEK(20)>20 THEN T=Q1-T:POKE 20,Q0:POKE 755,T*2
2665 IF OK THEN IF PEEK(53279)=5 THEN POKE 755,2:POKE 559,46:POP :POKE 764,130:A=USR(GCHAR):OK=0:GOTO 2180
2670 IF PEEK(764)=255 THEN 2660
2680 IF PEEK(764)=154 THEN 2660
2690 IF PEEK(764)=39 THEN POKE 764,255:SOUND Q0,5,12,4:POP :FOR T=1 TO 5:NEXT T:SOUND Q0,Q0,Q0,Q0:GOSUB 2710:GOTO 650
2700 TRAP 2700:A=USR(GCHAR):TRAP 40000:IF A>96 AND A<123 THEN A=A-32*AL
2710 POKE 755,2:POKE 559,46:RETURN 
2720 REM ***  PSEUDO-INPUT
2730 IN$=""
2740 ? CHR$(21);CHR$(30);:GOSUB 2650:? CHR$(32);CHR$(30);
2750 IF A=155 THEN 2820
2760 IF A=126 AND LEN(IN$)>1 THEN IN$=IN$(1,LEN(IN$)-Q1):? CHR$(A);:GOTO 2740
2770 IF A=126 AND LEN(IN$)=Q1 THEN ? CHR$(A);:GOTO 2730
2780 IF LEN(IN$)=MX THEN 2740
2790 IF (A<32 OR A>90) AND A<96 OR A>122 THEN 2740
2800 ? CHR$(A);:IN$(LEN(IN$)+Q1)=CHR$(A)
2810 GOTO 2740
2820 AL=Q1:IF IN$="" THEN POP :GOTO 650
2830 RETURN 
2840 REM ***  Printer Output
2850 GOSUB 590:? "PRINT: (C/F)"
2860 CON=Q0:F=Q0:FOR I=Q0 TO 9:PC(I)=48+I:NEXT I
2870 GOSUB 2650:IF A=155 THEN 2910
2880 IF A=67 THEN CON=1-CON:POSITION 10,Q0:? CHR$(67+128*CON);:GOTO 2870
2890 IF A=70 THEN F=1-F:POSITION 12,Q0:? CHR$(70+128*F):GOTO 2870
2900 GOTO 2870
2910 TRAP 2170:OPEN #2,8,Q0,"P:"
2920 GOSUB 590:? "Printing..."
2930 LM=5:RM=75:CN=Q0:NL=Q0
2940 SP=1:PL=66:LP=50:C=LM
2950 GOSUB 540:IF F=1 THEN POKE 559,Q0
2960 FOR P=Q1 TO LC
2970 IF PEEK(764)<255 THEN GOSUB 2650:POP :GOTO 3140
2980 Z=ASC(TX$(P))
2990 IF CN=Q1 AND Z<>127 THEN 3460
3000 IF Z<62 OR (Z>96 AND Z<123) THEN 3070
3010 IF Z=94 THEN GOSUB 3210:GOSUB 3150:GOTO 3120
3020 IF Z=72 THEN UL=Q1:PUT #2,27:PUT #2,52:GOTO 3120
3030 IF Z=74 THEN UL=Q0:PUT #2,27:PUT #2,53:GOTO 3120
3040 T=ASC(TX$(P+Q1)):IF Z=62 AND T>15 AND T<26 THEN PUT #2,PC(T-16):P=P+1:GOTO 3120
3060 IF Z=127 THEN 3230
3070 IF C=LM THEN FOR I=Q1 TO LM:PUT #2,32:NEXT I
3080 C=C+1
3090 PUT #2,Z+32*(Z<64)
3100 T=Q0:IF RM-C>=10 THEN 3110
3105 FOR I=1 TO LEN(BRK$):IF Z+32<>ASC(BRK$(I,I)) THEN NEXT I:GOTO 3110
3107 TT=ASC(TX$(P+Q1)):IF TT=Q0 OR TT=94 OR Z=Q0 OR Z=13 THEN I=LEN(BRK$):NEXT I:GOSUB 3150:T=Q1
3110 IF T=Q1 AND ASC(TX$(P+Q1))=Q0 THEN P=P+Q1:IF P<LC THEN 3110
3120 NEXT P
3130 GOSUB 3150
3140 PRINT #2:CLOSE #2:POKE 559,46:TRAP 40000:GOTO 650
3150 FOR I=Q1 TO SP:PRINT #2:NEXT I
3160 C=LM:NL=NL+SP:IF CN<Q0 THEN CN=Q1
3170 IF NL<LP THEN RETURN 
3180 IF CON=Q0 THEN FOR I=Q0 TO 255 STEP 17:SOUND Q0,255-I,10,15-INT(I/17):NEXT I:T=USR(GCHAR):GOTO 3200
3190 FOR I=Q1 TO PL-LP:PRINT #2:NEXT I
3200 NL=Q0:RETURN 
3210 REM ***  SKIP TRAILING BLANKS
3220 T=INT(P/L2):P=(T+Q1-(P/L2=T))*L2:RETURN 
3230 REM Handle special formatting
3240 P=P+Q1
3250 CM$=TX$(P,P+Q1):T$=""
3260 FOR I=P+2 TO LC
3270 IF TX$(I,I)>=CHR$(16) AND TX$(I,I)<CHR$(26) THEN T$(LEN(T$)+Q1)=CHR$(ASC(TX$(I,I))+32):NEXT I
3280 V=Q0:P=I:TRAP 3290:V=VAL(T$)
3290 TRAP 2170:IF CM$="cn" THEN CN=V
3300 IF CM$="ln" THEN FOR J=Q1 TO V:GOSUB 3150:NEXT J
3310 IF CM$="sp" THEN SP=V
3320 IF CM$="pl" THEN PL=V
3330 IF CM$="lp" THEN LP=V
3340 IF CM$="lm" AND V>0 THEN LM=V:C=V
3350 IF CM$="rm" AND V>0 THEN RM=V
3360 IF CM$="fp" THEN GOSUB 3180:POKE 559,46-46*F
3370 IF CM$="as" THEN PUT #2,V
3380 IF CM$="cm" THEN FOR I=P TO P+79:IF TX$(I,I)<>"^" THEN NEXT I:I=I-Q1
3390 IF CM$="cm" THEN P=I+Q1:GOTO 3450
3400 IF CM$<>"nf" THEN 3430
3410 T$="D:":FOR I=Q0 TO 11:Z=ASC(TX$(P+I,P+I)):IF Z<>94 AND P+K=LC THEN T$(3+I)=CHR$(Z+32*(Z<63)):NEXT I
3415 TX$(Q1)=CHR$(Q0):TX$((MXL+Q23)*L2)=CHR$(Q0):TX$(2)=TX$
3420 POKE 559,46:GOSUB 590:? "Printing ";T$:LK=Q1:CL=Q0:Y=Q1:GOTO 2320
3430 IF ASC(CM$)>15 AND ASC(CM$)<26 THEN PC(ASC(CM$)-16)=V
3440 IF TX$(P,P)<>"^" AND P<LC THEN 3240
3450 GOSUB 3220:P=P+Q1:GOTO 2970
3460 REM ***  CENTER STRING
3470 LN=Q0:FOR I=P TO P+79:IF TX$(I,I)<>"^" THEN LN=LN+Q1:NEXT I
3480 WIDTH=RM-LM:UL=Q0:IF TX$(P,P)=CHR$(72) THEN UL=Q1
3490 FOR I=Q1 TO (WIDTH-LN)/2+LM:PUT #2,32:NEXT I
3500 C=C+I:CN=-Q1:GOTO 2990
5000 REM  INITIALIZATION 
5010 GRAPHICS 17:SETCOLOR 4,1,10
5020 DL=PEEK(560)+256*PEEK(561)+4:POKE DL+5,7:POKE DL+10,7:POKE DL+14,7
5030 POSITION 6,4:? #6;"scriptor":POSITION 3,7:? #6;"WORD PROCESSOR"
5040 ? #6:? #6;" ";CHR$(136);CHR$(227);CHR$(137);" copyright ";CHR$(145);CHR$(153);CHR$(152);CHR$(147)
5045 ? #6:? #6;"{4 SPACES}compute{A} publ";CHR$(14);
5050 ? #6:? #6;"{3 SPACES}CHARLES BRANNON"
5070 Q0=0:Q1=1:Q23=23:RL=MXL+Q1:SCRZAP=1680:CURSOR=1739:EDCOM=1536:AL=1:L2=38:GCHAR=1303:SND=1331
5080 DIM T$(79),IN$(20),B$(L2),TB$(L2),CM$(2),BRK$(8),PC(9),DEL$(20),CIO$(7)
5090 B$=CHR$(Q0):B$(L2)=B$:B$(2)=B$:DEL$=CHR$(254):DEL$(20)=DEL$:DEL$(2)=DEL$
5100 TB$=B$:BRK$=" ,.!?;:-":CIO$="hhh":CIO$(4)=CHR$(170):CIO$(5)="LV":CIO$(7)=CHR$(228)
5110 OPEN #1,4,Q0,"K:"
5120 T=Q0:OY=Q0:CL=Q0:L=40:NL=-Q1
5130 PMB=PEEK(106)-8:POKE 559,46:POKE 53248,Q0
5140 POKE 54279,PMB:POKE 53277,3
5150 PMB=PMB*256+512:POKE 704,56
5160 FOR I=Q0 TO 255:POKE PMB+I,Q0:POKE 708+3*RND(Q0),PEEK(53770):NEXT I
5180 SETCOLOR 4,8,2
5250 FOR I=0 TO 70:READ A:POKE 1280+I,A:CHECKSUM=CHECKSUM+A:POKE 708+3*RND(Q0),PEEK(53770):NEXT I
5290 FOR I=0 TO 247:READ A:POKE 1536+I,A:CHECKSUM=CHECKSUM+A:POKE 708+3*RND(Q0),PEEK(53770):NEXT I
5300 IF CHECKSUM<>47765 THEN PRINT CHR$(253);"Error in DATA statements...":END 
5310 DATA 72,138,72,169,10,162,2,141,10,212,141,24,208,141,26,208,142,23,208,104,170,104,64
5320 DATA 104,173,252,2,201,255,240,249,133,124,162,255,142,252,2,32,51,5,32,254,246,133,212,169,0,133,213,96
5330 DATA 162,0,142,0,210,162,15,142,1,210,160,0,234,200,208,252,202,16,244,96
5340 DATA 216,104,104,133,213,104
5350 DATA 133,212,104,133,204,104
5360 DATA 133,203,104,104,208,47
5370 DATA 32,109,6,165,205,76
5380 DATA 43,6,160,0,177,205
5390 DATA 200,145,205,198,205,165
5400 DATA 205,201,255,208,2,198
5410 DATA 206,197,212,208,235,165
5420 DATA 206,197,213,208,229,160
5430 DATA 0,177,205,200,145,205
5440 DATA 136,152,145,205,96,201
5450 DATA 1,240,3,76,221,6
5460 DATA 32,109,6,76,91,6
5470 DATA 160,1,177,212,136,145
5480 DATA 212,230,212,208,2,230
5490 DATA 213,165,213,197,206,208
5500 DATA 237,165,212,197,205,208
5510 DATA 231,169,0,168,145,212
5520 DATA 96,165,212,133,205,165
5530 DATA 213,133,206,160,0,177
5540 DATA 205,201,94,240,18,230
5550 DATA 205,208,2,230,206,165
5560 DATA 206,197,204,208,238,165
5570 DATA 205,197,203,208,232,96
5580 DATA 165,88,133,203,165,89
5590 DATA 133,204,104,104,133,206
5600 DATA 104,133,205,162,24,76
5610 DATA 188,6,160,0,177,205
5620 DATA 200,200,145,203,136,192
5630 DATA 38,208,245,24,169,38
5640 DATA 101,205,133,205,144,2
5650 DATA 230,206,24,169,40,101
5660 DATA 203,133,203,144,2,230
5670 DATA 204,202,208,218,96,104
5680 DATA 104,133,204,104,133,203
5690 DATA 104,168,104,145,203,200
5700 DATA 192,4,208,249,96,160
5710 DATA 0,177,212,208,20,198
5720 DATA 212,165,212,201,255,208
5730 DATA 2,198,213,197,203,208
5740 DATA 238,165,213,197,204,208
5750 DATA 232,96
6000 GRAPHICS 0:POKE 559,Q0:POKE 16,64:POKE 53774,64
6010 FOR I=5000 TO 5900 STEP 100:? CHR$(125):POSITION 2,3:FOR J=I+90 TO I STEP -10:? J:NEXT J:? 110:? "CONT"
6020 POKE 712,PEEK(53770):POKE 842,13:POSITION 0,0:STOP 
6030 POKE 842,12:NEXT I
6040 SETCOLOR 2,12,Q0:SETCOLOR 4,8,10:SETCOLOR Q1,Q0,12:POKE 752,Q1
6050 POKE PEEK(560)+256*PEEK(561)+3,194:POKE 512,0:POKE 513,5
6060 ? CHR$(125):? :? :FOR I=6000 TO 6060 STEP 10:? I:NEXT I:? "GOTO610":POSITION 0,0:POKE 842,13:STOP 

Listing. Scriptor.
Download (Saved BASIC) / Download (Listed BASIC)

Program 2. Scriptor Modification for 825 Printer
Change these lines in Program 1 if you have an 825 printer.
3020 IF Z=72 THEN UL=Q1:PUT #2,15:GOTO 3120
3030 IF Z=74 THEN UL=Q0:PUT #2,14:GOTO 3120
3070 IF C=LM THEN PUT #2,14:FOR I=Q1 TO LM:PUT #2,32:NEXT I:PUT #2,15*UL

Listing. Scriptor Modification for 825 Printer.
Download (Saved BASIC/full program) / Download (Listed BASIC/modifications only)

Program 3. Scriptor for 1200XL
Change these lines in Program 1 if you have an Atari 1200XL.
750 IF PEEK(732) THEN POKE 732,0:GOTO 1570
5300 IF CHECKSUM<>47596 THEN PRINT CHR$(253);"Error in DATA statements...":END 
5320 DATA 104,173,252,2,201,255,240,249,133,124,162,255,142,252,2,32,51,5,32,89,242,133,212,169,0,133,213,96
6000 GRAPHICS 0:POKE 559,Q0:POKE 16,64:POKE 53774,64:POKE 731,255
7000 REM 

Listing. Scriptor.
Download (Saved BASIC/full program) / Download (Listed BASIC/modifications only)


Return to Table of Contents | Previous Section | Next Section