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.
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 jumpedyou 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 jumpedYou can correct the error by typing f, which overstrikes (replaces) the d.
The quick brown fox jumpedThe 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.
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
Take ut a word
Take a word
Insert and delete can also act on words, sentences, lines, or entire paragraphs in a similar way.
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.
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.
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.
- <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.
- 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.
- 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.
- All TAB controls work normally, just a little slower. <CTRL-K> will clear all tab settings.
- <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.
- The break key is disabled. Use <CTRL-Q> to exit the program.
- The ESC key enters the "mini-DOS." (See below.)
- The console keys are "live"; see a description of their functions later.
- The Atari logo key is disabled for normal typing. Within prompts, it acts as an "abort" key.
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.
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.
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.
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.
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.
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 n — n 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. |
To print your document, press 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.
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.
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.
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 |
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) |
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)
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)
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