"You will kill ten of our men, and we will kill one of yours,
and in the end it will be you who tire of it."
Ho Chi Minh
YOUR SECOND GFA BASIC 3.XX MANUAL
- or -
HOW I LEARNED TO STOP WORRYING AND LOVE GFA-BASIC
PART 3
CHAPTER TWO - THE EDITOR
by Han Kempen
2. THE EDITOR
Abbreviated Commands
The following abbreviations are worth remembering (abbreviated
command in bold underlined characters):
ALERT FILESELECT POLYMARK
ARECT FILL PRINT (or ?)
ARRAYFILL FUNCTION PROCEDURE
ATEXT GOSUB (or @) PSET
BMOVE GRAPHMODE QUIT
BOUNDARY HIDEM REPEAT
CASE HLINE RESTORE
CIRCLE IF RETURN
CLOSE INPUT RSET
COLOR LINE SELECT
DATA LINE INPUT SETCOLOR
DEFFILL LOCAL SETMOUSE
DEFLINE LOOP SGET
DEFMARK LPRINT SHOWM
DEFMOUSE LSET SWAP
DEFTEXT MID$(..)= TEXT
DELETE MOUSE UNTIL
DRAW NEXT VARPTR (or V:)
EDIT OPEN VOID (or ~)
ELLIPSE PAUSE VSETCOLOR
ELSE PBOX VSYNC
ENDFUNC PCIRCLE WAVE
ENDIF PELLIPSE WEND
ENDSELECT PLOT WHILE
ERASE POLYFILL
EXIT IF POLYLINE
Actually '@', 'V:' and '~' are not abbreviations, but short
alternative commands. Although this list is not complete it's
already too long for me. I just manage to remember the following
useful abbreviations:
A CA CI CL C D E ENDF EN ENDS FILE FU HI @ I INP
LI L LPR N O PA PL P PRO REP RES RET S SET SH T
U V: ~ W WE
If the abbreviated command is followed by anything else, you
have to insert a space, except with '@', '?', '~' and 'V:' :
@proc1 ?"hello" ~INP(2) V:adr%
C 1 G proc1 P "hello" VO INP(2)
COLOR 1 GOSUB proc1 PRINT "hello" VOID INP(2) VARPTR(adr%)
Print ABBREVNS.DOC if you need a complete reference of all
abbreviations (this file will be supplied with the last part of
the course).
Syntax
The parser checks for correct syntax after you press <Return>.
Many typo-bugs are prevented this way. The only disadvantage is
that the parser recognizes some variables as commands. It's
impossible to use the following names as the first word on a
line: data_byte|, dirty$, double&, letter$, printer$, name$,
quit!. The last one is nasty, because the parser changes the line
'quit!=FALSE' into 'QUIT!=FALSE' without warning for a syntax-
error. If you now run the program you will return to the desktop
when QUIT is encountered. Of course you have not lost your
valuable program, because you always Save before you Run. Do you
really? A variable like systemfont% will cause the same disaster.
If the parser refuses the name of a variable, you can use LET
(e.g. 'LET quit!=FALSE'). But you will have to change the name if
it is a label (e.g. the label 'data1:' could be changed into
'1data:' or 'd.ata1:').
I don't program every day. Well, I might as well admit it now,
sometimes I don't program for months. My problem is that I keep
forgetting the correct syntax, although I do know the command. I
hate it when I have to look it up in my GFA-manual. Perhaps you
find my syntax-list as useful as I do. The list seems to get
longer every year, but I keep forgetting why. Abbreviations of
commands are bold and underlined again. Variables without a
postfix are word-variables.
ALERT icon,txt$,default,but$,button ! icon=1 !, 2 ?, 3 Stop
x=BCLR(x,bit)
BLOAD file$,adr%
BMOVE source%,dest%,bytes%
BSAVE file$,adr%,bytes%
x=BSET(x,bit)
bit!=BTST(x,bit)
BYTE{adr%}=byte| ! POKE a byte
byte|=BYTE{adr%} ! PEEK a byte
DEFLINE [type],[width],[start],[end] ! type=1 normal,2 dashes,
3 points
DEFMOUSE shape ! shape=0 arrow,1 cursor,2 bee,3 finger,
5 thin cross
DEFTEXT [colour],[type],[angle],[size],[font]
! type= 2 fat,4 light,8 italics,16 underlined,
32 outlined
EVERY ticks GOSUB procedure ! 1 tick = 1/200 s;
200 ticks = 1 second
FIELD #chan,bytes.1 AS f1$, bytes.2 AS f2$
FILESELECT path$,default$,file$
FORM INPUT length,txt$
FORM INPUT length AS txt$
GRAPHMODE mode ! mode=1 replace, 2 transparent
{ADD(XBIOS(14,1),6)}=0 ! clear keyboard-buffer
(before INPUT)
INPUT txt$,i
~INP(2) ! wait for any keypress
position=INSTR(source$,search$[,start])
l$=LEFT$(source$[,length])
LINE INPUT txt$,i$
LONG{adr%}=integer% ! POKE an integer
integer%=LONG{adr%} ! PEEK an integer
MID$(source$,start)=replace$
part$=MID$(source$,start,length)
OPEN "I",#chan,file$
OPEN "O",#chan,file$
OPEN "R",#chan,file$,record.length
OUT 2,7 ! bell (more like 'ping')
PAUSE ticks ! 1 tick = 20 ms;
50 ticks = 1 second
PRINT AT(column,row);txt$
PRINT USING format$,...
PUT x,y,pic$[,mode] ! mode=3 replace, 7 transparent
n&=RAND(limit&) ! 0 ? n& < limit&
n%=RANDOM(limit%) ! 0 ? n% < limit%
RC_COPY source%,x1,y1,width,height TO dest%,x2,y2[,mode]
! as PUT-mode
RECALL #chan,array$(),elements,lines%
! first: OPEN "O" #chan,file$
RECALL #chan,array$(),-1,lines% ! load complete array
RECALL #chan,array$(),first TO last,lines%
r$=RIGHT$(source$[,length])
position=RINSTR(source$,search$[,start])
n#=RND()*limit# ! 0 ? n# < limit#
x#=ROUND(x#,[-]decimals)
STORE #chan,array$()[,elements]
! first: OPEN "O" #chan,file$
STORE #chan,array$(),first TO last
t$=STRING$(length,char$)
t$=STRING$(length,ascii.code)
TEXT x,y[,[-]length],txt$ ! length>0 letter-distance,
<0 word-distance
t%=TIMER ! time in 1/200 s;
200 ticks = 1 second
adr%=V:txt$ ! address of string
adr%=V:array&(0) ! address of word-array
WORD{adr%}=word& ! POKE a word
word&=WORD{adr%} ! PEEK a word
Folded Procedures
If you press <Control> <Help> on a Procedure-line, all
Procedures following and including the current one are
folded/unfolded. You can unfold all Procedures at once by putting
the cursor on the first Procedure-line and pressing <Control>
<Help>. The editor-commands 'Find' and 'Replace' will skip folded
Procedures if you have GFA-version 3.0. Never change the
Procedure-line of a folded Procedure, always unfold it first. If
you don't believe me, and try it anyway, you're stuck. Serves you
right. I hesitate to tell you that pressing <Undo> restores the
original folded line.
Tab
If you press <Tab>, the cursor jumps to the next tab-position
without altering the current line. If you use <Left Shift> <Tab>,
the line is filled with spaces from the current cursor-position
to the next tab-position. Pressing <Right Shift> <Tab> erases all
consecutive spaces to the left of the current cursor-postition.
If the current cursor-position happens to be a space, this space
and all spaces to the right are erased as well.
<Tab> - Tab in 'Overwrite-mode'
<Left Shift> <Tab> - Tab in 'Insert-mode'
<Right Shift> <Tab> - 'un-Tab'
Cut and Paste
If you press <Control> <P>, the current line from the cursor to
the end of the line is cut, and saved in an internal buffer.
<Control> <O> inserts the saved line at the current cursor-
position. You can use this method to "cut and paste" a part of a
line. Press <Control> <P>, then <Control> <O> to restore the
original line. Move the cursor to the desired position and press
<Control> <O> to place a copy of the cut part there.
Load
You can use Load only with *.GFA-files, not with ASCII-files
(such as the *.LST-files).
Programs in GFA-Basic from version 3.04 cannot be loaded by
earlier interpreters (up to 3.02). Of course you should have the
most current version (at least version 3.07), but the following
method should always work. Lengthen the program until you can
load it successfully:
OPEN "A",#1,file$
PRINT #1,STRING$(1000,0) ! expand program with 1000 bytes
CLOSE #1
Save
After 'Save' (*.GFA-file) or 'Save,A' (*.LST-file) with an
existing file, the old file is renamed with a BAK-extension. Nice
precaution, but you should delete those *.BAK-files every now and
then. Talking about precautions, you could save your most
precious programs as LST-files on a back-up disk. A corrupted
GFA-file sometimes cannot be loaded and is then probably lost
forever. A few strange bytes in a LST-file are seldom fatal. Just
Merge the LST-file and correct the errors.
If you kill and save files regularly, new files will be stored
in a fragmented way. Loading a fragmented file takes more time
than loading a file that occupies consecutive sectors on the
disk. You can correct this as follows. First make a backup-disk.
Yes, you should already have one. Copy all files to a RAM-disk by
clicking on the drive-icon and dragging it to the window of the
destination drive. You can't use disk-copy (dragging drive-icon
to drive-icon) because the destination-drive is a RAM-disk.
Format the source-disk and copy all files back (this must be a
file-copy, not a disk-copy). Now, all files are saved on
consecutive sectors. You could speed up things a little bit more
by copying the most-used files first. The drive-head now needs
less time to reach these files.
Don't try to 'Save,A' an existing file to a full disk. I have
tried it once and lost both the original file (should have become
a *.BAK-file) and of course the saved file. Also, the editor (or
TOS) had erased the program from memory... Thank you.
Llist
There has been some confusion about the following point-commands
for the printer:
.p- - point-commands are not printed
.p+ - point-commands are printed again
.llxx - line-width (line-length)
.plxx - page-length
.pa - form feed (page)
Sometimes the commands '.cp' and '.nu' are mentioned, but I
don't know how to use these.
You can use only one point-command in one line. I use the
following lines for my Star-printer (96 characters/line in Elite-
mode):
.p-
.n4
.lr3
.ll88
The actual listing is then printed with 80 characters/line,
preceded by the line-numbers (4 characters + space). If a program
is longer than 10000 lines, you should use '.n5', but in that
case you probably don't have time to read this. A nice touch is
the automatic execution of a form feed after printing the
listing.
If the listing contains special characters (ASCII-code < 32 or >
126), some of those characters might be interpreted as printer-
commands. My printer switches to condensed printing after
receiving the Atari-symbol. Installing the proper printer-driver
(e.g. PTEPSON.PRG) should prevent that. But I never install a
printer-driver because there are some serious disadvantages. Read
more about it in the paragraph 'HARDCOPY' in chapter 10. If your
printer can switch to IBM character set #2, most characters with
ASCII-code ? 128 will be printed correctly. You still won't be
able to print the Atari-symbol (ASCII-codes 14 and 15), but you
should be able to print special characters like é, ß or ±. The
special characters with codes 176 - 223 will not print correctly,
because IBM uses these for lines and patterns.
You could use a header-line to send a printer-command to your
printer. I type '.he ' and then, using the "<Alternate>-method"
(see the paragraph 'Special Characters'), I type the following
five numbers: 27, 116, 49, 27 and 54. After receiving the
command-string '<Esc> t1 <Esc> 6' my Star-printer switches to IBM
character set #2:
.he *t1*6 [* = Escape-character]
Of course you could use this method to send other commands to
your printer as well. You can send printer-commands also through
a comment-line. A header-line can be anywhere, but a comment-line
with printer-commands should be one of the first lines of your
program:
' Switch to IBM character set #2: *t1*6 [ = Escape-character]
You can stop the printing process by pressing the 'Break'-
combination <Control> <Left Shift> <Alternate>, unless Break has
been disabled with 'ON BREAK CONT'. Your printer will continue
printing though, until its input-buffer is empty, or until you
turn the printer off.
Insert-mode
If you return to the editor, you'll always be in Insert-mode,
even if you left the editor in Overwrite-mode. By the way, the
editor restores the original colour-palette, so you are not
bothered by palette-changes in a program. In the old days I was
sometimes caught by the dreaded phenomenon of black characters on
a black background, but now you can always read the listing on
your screen, unless a VT52-command has changed the colour of
characters and/or background to a nasty combination. Use
STANDARD.GFA to prevent this.
By the second way, there is only one thing I don't like about
the GFA-editor. It's not easy to merge a block with the program
you're working on. Save the program, clear memory with 'New',
'Merge' or 'Load' the file, mark the block, save the block,
'Load' the original program, find the correct line and 'Merge'
the saved block. A new command NMerge (New+Merge) would make the
life of a GFA-programmer a little easier. A better idea would be
the command BMerge (Block-Merge). Then I could choose this
command, clip a block from a LST-file or GFA-file, and the block
would be inserted in the listing automatically. Are you reading
this, Frank? If you are, how about a function for changing upper
case into lower case. In the GFA-EDITOR I SOMETIMES (oops) forget
I pressed CapsLock. And how about a function to clear a line from
the cursor to the next space-character. And...
Direct Mode
Enter the Direct Mode by pressing <Esc> or <Shift> <F9> in the
editor.
In Direct Mode you can restore the previously used line with
<Undo>. With <Up arrow> and <Down arrow> you can even recall up
to 8 of the last used lines. Press <Insert> to switch between
Insert-mode and Overwrite-mode. As usual <Esc> clears the line,
but if you press <Esc> on an empty line, you will return to the
editor immediately. You can also return to the editor with
<Control> <Shift> <Alternate>, even without first clearing the
command-line.
<Undo> - restore last line
<Up arrow>/<Down arrow> - cycle through last (8) lines
<Insert> - switch between Insert/
Overwrite-mode
<Esc> - clear line
<Control><Shift><Alternate> - back to editor
You can call Procedures in your program from the Direct Mode
(e.g. '@show'). If you (temporarily) merge some special
Procedures with the program you are developing, you could use the
Direct Mode as a Command Line Interpreter.
DEFLIST
The command 'DEFLIST n' only works in Direct Mode, not in a
program. You can also choose 'Deflist' from the drop-down menu,
after clicking on the Atari-symbol.
Special Characters
You can enter characters with ASCII-code 32-126 directly from
the keyboard. These characters are usually called ASCII-
characters. The codes 0-31 and 127 are used as control-codes, but
additionally special characters have been assigned to these
codes. The characters with code 128-255 are sometimes called
extended ASCII-characters and are partly identical to the IBM-
characters with the same codes. I loosely use the expression
'ASCII-code' for all codes 0-255.
You can enter characters with code 0-31 or 127-255 by pressing
<Alternate> and then entering the character code. Release the
<Alternate>-key and the character appears on your screen. E.g.,
you could enter the Escape-character by holding <Alternate> down
and pressing <2> and <7>. This is much faster than entering
CHR$(27), but Llisting a file with Escape-characters is probably
not a good idea. Less important, "1st Word Plus" could get
confused too. Llisting CHR$(27) doesn't bother your printer at
all. It's not possible to enter CHR$(10) or CHR$(13) with the
'Alternate-method'. You can enter the first by pressing <Control>
<A> and then <1> <0> <Return>. For code 13 you have to use
CHR$(13).
All characters can be printed on the screen with 'PRINT' or 'OUT
5,code', but not all characters can be printed on your printer
(see paragraph 'Llist'):
0- 31: control-codes, not possible on printer
32-128: true ASCII-characters, always possible on printer
127: control-code, not possible on printer
128-175: special characters, almost identical to IBM set #2
176-223: special characters, not possible on printer
224-255: special characters, mostly identical to IBM set #2
Never use code 4 (EOT, visible as left arrow) in a LST-file. If
you Merge a LST-file, the GFA-editor thinks the end of the file
is reached at that point (&H04) and refuses to load anything
following this code! If you are converting an ASCII-file to GFA-
Basic you should use another editor to (temporarily) change code
4 to something else. After this operation the GFA-editor will
'Merge' the ASCII-file properly. Now you could change the code
back to 4, and save the program as a GFA-file.
In case you still don't know what to do with the characters 28-
31:
LOCATE 1,1
OUT 5,28
OUT 5,29
LOCATE 1,2
OUT 5,30
OUT 5,31
Now that you know what to do with these four codes, I wonder if
this is supposed to be funny. I'm not laughing.
Procedures (CHAPTER.02)
Edit_debug ED_DEBUG
Debug a GFA-program after activating this Procedure:
TRON edit_debug
Run the program and press <Alternate> <Control> <Right Shift>
for the debug-menu.
Llist_ibm2 LLISTIBM
Switch printer (Star LC24-10) to IBM character set #2. It's not
necessary to put the header-line in a Procedure (it's even a
little weird, as you're never going to call this Procedure in a
program...), you could put it anywhere in your program.
Llist_settings LLISTSET
Llist-settings for Llisting to printer in Elite-mode (96
characters/line):
- point-commands are not printed
- line-numbers of 4 digits (+ space)
- left margin of 3 spaces
- line-width of 88 characters
It's not necessary to put the printer-commands in a Procedure,
you could put the point-commands anywhere in your program.
Disclaimer
The text of the articles is identical to the originals like they appeared
in old ST NEWS issues. Please take into consideration that the author(s)
was (were) a lot younger and less responsible back then. So bad jokes,
bad English, youthful arrogance, insults, bravura, over-crediting and
tastelessness should be taken with at least a grain of salt. Any contact
and/or payment information, as well as deadlines/release dates of any
kind should be regarded as outdated. Due to the fact that these pages are
not actually contained in an Atari executable here, references to scroll
texts, featured demo screens and hidden articles may also be irrelevant.