antoine-source/picnicparanoia/scdocs.apple/SCMASM2P.A2
Antoine Vignau 4d4fb6a665 Let's free the code!!
Some old (WIP) disassemblies and my own source code now available online.
2024-07-23 23:38:22 +02:00

1 line
43 KiB
Plaintext

S-C Macro Assembler
Version 2.0
ProDOS (TM) Upgrade
S-C Software Corporation
2331 Gus Thomasson,Suite 125
P.O. Box 280300
Dallas, Texas 75228
(214) 324-2050
ProDOS is a trademark of Apple Computer, Inc.
---------------------------------------------------------------------
Table of Contents
Introduction . . . . . . . . . . . . . . . . . . . . . . 1
Comparison with DOS Version . . . . . . . . . . . . . . . 2
TEXT Command
S-C PrODOS Command Interpreter . . . . . . . . . . . . . . 3
Commands
Modification to CAT and CATALOG
Working with Type SYS Files
I/O Hooks
GETBUFR and FREBUFR
File Buffers
Memory Map of Installed System . . . . . . . . . . . . . . 6
New Features in S-C Macro Assembler . . . . . . . . . . . 7
Control-p Command
FP Command
LOMEM Command
HIMEM Command
Super HIMEN
.INB Directive
.AC Directive
Full Screen Editor . . . . . . . . . . . . . . . . . . . . 14
Moving Source Files from DOS to ProDOS . . . . . . . . . . 15
80-Column I/O Drivers . . . . . . . . . . . . . . . . . . . 16
NOTICE
This manual and the software product it describes are copyrighted by
S-C Software Corporation. Neither the manual nor the diskette, nor
any part thereof, may be copied by any means without prior written
consent (except for the personal use of the registered owner).
Copyright (c) 1985
S-C Software Corporation
2331 Gus Thomasson Road, Suite 125
P.O. Box 280300
Dallas, TX 75228
(214) 324-2050
---------------------------------------------------------------------
S-C Macro Assembler Version 2.0
(PrODOS Based)
Here is your copy of the latest upgrade to the S-C Macro Assembler.
The most important new feature is that this version is based on
Apple's new disk operating system, ProDOS. Several other
improvements have been made, with the result being an assembler that
is even easier to use, and yet faster and more powerful.
The disk contains the most recent version of PrODOS, as released by
and licensed from Apple Computer. This includes the PrODOS MLI
version 1-1-1, BASIC.SYSTEM version 1-1. FILER, and CONVERT. We
modified FILER slightly, for simpler operation from the S-C Assembler
environment.
When you boot the disk, SCASM.SYSTEM will be loaded and installed.
SCASM.SYSTEM includes a command interpreter (similar to
BASIC.SYSTEM), the S-C Macro Assembler, and a selection of various
80-column I/O drivers. If you are booting in an Apple lie or i/c,
that 80-column driver will be automatically installed. If not, a
menu will appear offering you a choice of 40-column, Videx Videoterm,
Videx Ultraterm, or STB-80 drivers.
The source code for each of the drivers is included on the disk, so
that you may modify them as you wish or create your own for other
80-column cards. Note that the Videx Videoterm driver is compatible
with Applied Engineering's Viewmaster card as well.
Other files on the disk include a program for easily LOADing an S-C
source file from a DOS 3-3 disk into the ProDOS environment, and
various example programs.
As is true of all S-C products, the disk is not copy protected in any
way. Make a backup copy now, and store the original in a safe place.
The FILER program can make such a copy, or you may use the DOS-based
COPYA program, or any other copier you have. You may also use FILER
to move copies of any individual files from this disk to any other
disks you have, including hard disks or RAM disks.
We expect you to make as many copies as you wish for your own and to
encourage your friends to buy their own copies.
- 1 -
---------------------------------------------------------------------
Comparison with DOS-based Version 2.0
We have tried to make the transition from DOS to ProDOS as easy as
possible. making as few changes in the way you operate the S-C Macro
Assembler as we could.
As a result, if you are already familiar with the DOS-based version
and with the operation of ProDOS, you cam probably begin using our
ProDOS version without reading any further. However, we recommend
you do read what follows, to pick up the new features.
The ProDOS version has a lot less RAM available for source files, due
to the massive size of ProDOS itself. However, we have added a new
directive (.INB) which allows you to assemble even larger source
files than was possible with the DOS version.
We added HIMEM and LOMEM commands, to allow you to change the limits
on the source and symbol table areas for special requirements. We
also added a new directive for producing compressed ASCII strings, a
feature which cam reduce the memory requirements of programs having a
lot of text messages.
Of course most of the differences between the new PrODOS version and
previous DOS versions are differences between the two operating
systems. If you have used both operating systems with Applesoft, you
are already aware of these.
SCASM.SYSTEM includes a command interpreter similar in operation to
BASIC.SYSTEN. The following commands are supported: -, BLOAD, BRUN,
BSAVE, BYE, CAT, CATALOG, CLOSE, CREATE, DELETE, EXEC, IN#, LOAD,
LOCK, PR#, PREFIX, RENAME, SAVE, UNLOCK, and VERIFY. In addition, a
NOPREFIX command has been added (because I could not remember that
"PREFIX/" would set a null prefix).
The command interpreter in SCASM.SYSTEM is specially tailored to
provide a working environment for the S-C Macro Assembler; as such,
it cannot support Applesoft programs. To work with Applesoft
programs, you have to load BASIC.SYSTEM. The new "FP" command
performs the equivalent of "-BASIC.SYSTEM"; therefore. if your
current prefix points to a directory containing BASIC.SYSTEM, you can
go to Applesoft by merely typing "FP".
TEXT Command:
We did have to change the syntax of one option of the TEXT command.
In the DOS version "TEXT/ filename" writes the source program to
disk as a text file, prefixing each line with the current tab
character. To ProDOS "TEXT/ pathname" looks like a volume specifier,
and most likely returns a PATH NOT FOUND error. Therefore, the
ProDOS version uses "TEXT% pathname" for this option.
- 2 -
---------------------------------------------------------------------
The S-C ProDOS Command Interpreter
Our command interpreter is similar to BASIC.SYSTEM, and indeed was
derived from it. We started by deleting all sections of code which
were only in BASIC.SYSTEM to support Applesoft, and then completely
re-wrote the rest. The result is still general enough that you may
find it able to support your own projects.
SCASM.SYSTEM does not support Applesoft. Assuming the appropriate
prefix is set, you can switch back to Applesoft by typing
-BASIC.SYSTEM or FP.
Commands:
The commands supported by our command interpreter are a subset of the
BASIC.SYSTEM commands: -, BLOAD, BRUN, BSAVE, BYE, CAT, CATALOG,
CLOSE, CREATE, DELETE, EXEC, IN#, LOAD, LOCK, PR#, PREFIX, RENAME,
SAVE, UNLOCK, and VERIFY. We also added the NOPREFIX command. All
of these commands can be typed at the command level.
Unlike BASIC.SYSTEM, our command interpreter has no ability to ge
commands directly from keyboard input. The S-C Macro Assembler
passes commands it does not recognize on to the command interpreter
by calling it through the global page hooks. The "command passing"
procedure is the same as that described in the BASIC.SYSTEM Reference
Manual.
The OPEN and WRITE commands are also included, but they are only for
the internal use of the S-C Macro Assembler in support of the TEXT
command and .TF directive. Our OPEN command (and hence TEXT command
and .TF directive) does not support the L or T parameters. Our WRITE
command (and hence TEXT command) does not support the B, F, or R
parameters.
The following BASIC.SYSTEM commands are not included in our command
interpreter: READ, POSITION, CHAIN, FRE, NOMON, STORE, APPEND,
RESTORE, FLUSH, and RUN.
The LOAD and SAVE commands are designed to work with S-C source code
files. BASIC.SYSTEM works with Applesoft files, type BAS ($FC). S-C
source code files are type $FA, which BASIC.SYSTEM calls type INT.
In our command interpreter, they are called type "S-C". Our CAT and
CATALOG commands will show type S-C for these files, whereas
BASIC.SYSTEM will catalog them as type INT. Our version of FILER has
been modified to call them type S-C. The CONVERT program and the
Apple //c System Utilities disk will convert S-C source code files
from DOS 3.3 type I files to ProDOS type INT (S-C) files.
You may use the "S-C" file type code in commands with the T
parameter. For example, "CATALOG,TS-C" will list only files that are
type S-C.
Sometimes it is useful to be able to set a null prefix. I could not
remember to type "PREFIX/" for that purpose, so I added the NOPREFIX
command.
- 3 -
---------------------------------------------------------------------
Modification to CAT and CATALOG:
During a CAT or CATALOG, typing <CR> or <ESC> will abort the listing
of files. The "BLOCKS" line will still be listed. You can also
pause and restart the catalog listing by pressing any other key.
Once paused, you can list one more line at a time by pressing two
keys simultaneously.
I rearranged the second and third columns of information in the CAT
and CATALOG listings: the TYPE column is now listed ahead of the
filename. This allows you to move the cursor up to a filename, type
a command such as LOAD or DELETE or RENAME, and scan over the name
with the right arrow key. If the command is "LOAD", you can type
<ESC>, the letters "I" and/or "M" to move the cursor to the line with
the filename, and then "L" to automatically generate the LOAD
command. (Just as in the DOS version.)
Working with Type SYS Files:
BASIC.SYSTEM had some arbitrary restrictons built in to its handling
of SYS files. In our command interpreter you may BLOAD and BSAVE
type "SYS" files as long as you specify the type ("TSYS") and
include the loading address. Of course you must also include the
length or end address with BSAVE. The file may be BLOADed anywhere
it fits, not just at $2000. You may also BSAVE it from anywhere, but
when you use the command to execute it the file will be positioned at
$2000.
Another restriction we removed had to do with using the BSAVE
command. BASIC.SYSTEM did not allow BSAVEing to a file that did not
already exist if the T parameter was specified. Without the T
parameter, BSAVE will gladly create a new file; with T, it gives an
error message. Our command interpreter does allow you to create a
new file with a BSAVE, even if T is specified.
One reason for removing the restrictions of BASIC.SYSTEM was
difficulties we had with the FILER program. You cannot successfully
enter the standard Apple FILER from S-C Macro by typing "-FILER",
because standard FILER is a SYS file and too large to fit between
$2~00 and $73FF. Our special version of FILER is on the release
disk, which you CAN run with "-FILER". This is a type "BIN" file, and
loads at $1000 before repositioning itself. This modified version
also calls type $FA files "S-C" like SCASM.SYSTEM does.
I/O Hooks:
Our command interpreter implements the PR# and IN# commands in the
sane way as BASIC.SYSTEM. The same I/O hook locations are supported
in the $BE00 Global Page.
On the other hand, SCASM.SYSTEM does not switch the I/O hooks back
and forth all the time. In fact, unlike DOS or
- 4 -
---------------------------------------------------------------------
BASIC.SYSTEM, the command interpreter is never connected to the input
or output hooks. S-C Macro feeds commands which it does not
recognize to the command interpreter via the page 2 buffer.
GETBUFR and FREBUFR:
Under BASIC.SYSTEM, if you want to reserve some memory for private
purposes, you call the GETBUFR subroutine. When you want to release
it you call FREBUFR. The space allocated is located below
BASIC.SYSTEM, and above the disk buffers. The entry points to
GETBUFR and FREBUFR are in the $BE00 global page.
Our command interpreter does not have any GETBUFR or FREBUFR
subroutines. Instead, we added a HIMEM command to the S-C Macro
Assembler. By lowering HIMEM you cam make space for your own
routines.
File Buffers:
BASIC.SYSTEM has one fixed-location file buffer, and dynamically
allocates additional file buffers, grabbing 1024 byte chunks for each
open file. A large amount of overhead is associated with this
process, due to the requirement of shuffling the string storage space
up and down each time a file is opened or closed.
Our command interpreter has three fixed-location file buffers. This
is the amount needed to support the maximum possible file activity,
allowing simultaneous EXEC, include, and target files.
BASIC.SYSTEM allows more than one file to be OPEN at a time (via the
OPEN command), but there was no need for this in the S-C Macro
Assembler. Therefore only one file at a time may be OPENed.
- 5 -
---------------------------------------------------------------------
Memory Map of Installed System
ProDOS MLI has not been changed in any way. This is installed by the
SYS file named PRODOS when you boot a ProDOS disk. It occupies the
entire $D000-$FFFF area, including both banks of $D000-DFFF. In
addition, there is a global page at $BF00-BFFF used for communication
with command interpreters. Our command interpreter is installed from
$AA00 through $BEFF. The global page at $BE00-BEFF is almost the
same as that of BASIC.SYSTEM.
The assembler is installed from $8000 through $A9FF. The last two
pages ($A800-A9FF) are reserved for the screen I/O driver.
There are three permanently assigned file buffers at $7400, $7800,
and $7C00. The $7400 buffer is used only for the EXEC command. The
$7800 buffer is used only for TEXT and .TF files. (This is the buffer
used by the OPEN command.) The $7C00 command is used for all other
operations ( LOAD, SAVE, CATALOG, etc.).
If you have more than 64K RAM, the additional memory may be used as a
RAM disk. S-C Macro does not interfere with or use any of the
additional memory.
HIMEM normally is set to $7400, and LOMEM at $1000. Source code
files are loaded just below HIMEM. During assembly of a program (the
ASM command), the symbol table begins at LOMEM and grows toward the
source program.
The HIMEM command allows you to move HIMEM to any page boundary at
least one page higher than LOMEM, and up to $7400. The LOMEM command
allows you to move LOMEM to any page boundary as low as $0800, and as
high as one page below HIMEM.
In the DOS 3.3 version the HIMEM and LOMEM pointers were kept in page
zero locations $4C-4D and $CA-CB respectively. In the ProDOS version
HIMEM is in $73-74, and LOMEM is in $67-68. Most other page zero
usage is the same in the two versions. Locations $00-1F are not used
by either version, but are reserved for your own use.
- 6 -
---------------------------------------------------------------------
New Features in the S-C Macro Assembler
Three new commands and two new directives have been added to the
ProDOS version of the S-C Macro Assembler Version 2.0, which are not
include in the DOS version. We have also included a new "keyboard
macro" for the PREFIX command to make life with PrODOS a little
easier.
Control-P Command:
If you type a control-P character at the beginning of a line, the
word "PREFIX" will be spelled out for you. This is a "keyboard
macro", and is analogous our use of control-C to generate the word
"CATALOG" and control-E to generate the word "EDIT". After the
control-P you may type the RETURN key to see what the current prefix
is; type a "/" and RETURN to set a mull prefix; or type any valid
pathname to set a new prefix.
FP Command:
The FP command issues a "-BASIC.SYSTEM" command to the ProDOS command
interpreter. It is simply shorthand for that command. If the current
prefix points to a directory that includes the BASIC.SYSTEM file,
then the FP command will switch you over to Applesoft. If not, it
will merely give the "PATH NOT FOUND" error message.
LOMEM Command:
The assembler builds its symbol table starting the current LOMEM
address and building up toward the beginning of the source code.
LOMEM is initially set to $1000. You may change the LOMEM value by
typing LOMEM followed by an address. The address must be on a page
boundary, no less than $0800, and no larger than one page below the
current HIMEM value.
LOMEM $0800
LOMEM 16384
LOMEM $1234 (invalid, not on page boundary)
LOMEM $0700 (invalid, too low)
LOMEM $8000 (invalid, too high)
There are actually two symbol tables: the main one which grows upward
from LOMEM, and one for macro private labels which grows downward
from LOMEM. If you set LOMEM at $0800 there will be no room for any
macro private labels. (Macro private labels are the ones which begin
with a colon.)
Why would you ever want to move LOMEM? Perhaps you have a source
program which is just a little too large to fit between $1000 and
$7400. Lowering LOMEM may make enough room. Or perhaps you are
assembling directly to RAM and the object code needs extra room.
Raising LOMEM might make enough extra room for the object program.
Or perhaps you just want to experiment.
- 7 -
---------------------------------------------------------------------
LOMEM changes the byte at $803C, which is the starting page for the
symbol table, and then re-initializes the assembler. This means that
amy source program in RAM at the time will be deleted. Be sure you
change LOMEM before you LOAD your source program1 or SAVE your source
program before you change LOMEM.
If you are curious as to what the current value of LOMEM is, you can
use the MEN command. It will display the current start and end of
the symbol table, and the current start and end of ~ your source
program.
HIMEM Command:
Your source program resides in RAM below HIMEM. HIMEM is set during
initialization by picking up the page number from $BEFB, inside the
command interpreter~B global page.
HIMEM changes the byte at $BEFB, which is the page for the HIMEM
value, and then re-initializes the assembler. This means that any
source program in RAM at the time will be deleted. Be sure you
change HIMEM before you LOAD your source program, or SAVE your source
program before you change HIMEM.
The value you specify with the HIMEM command must be on a page
boundary, no higher than $7400, and no lower than one page above the
current LOMEM.
HIMEM $7000
HIMEM $7400
HIMEM $8000 (invalid, too high)
HIMEM $7324 (invalid, not on a page boundary)
One reason for lowering HIMEM would be to make room for a protected
region of memory to place an object program. Perhaps you want to add
some additional features to the assembler, and they could be loaded
into that area.
If you are curious as to what the current value of HIMEM is, you can
use the MEM command. It will display the current start and end of
the symbol table, and the current start and end of your source
program.
Super HIMEM:
It is actually possible to raise HIMEM even higher that $7400, but
not with the HIMEM command. You might want to do so to work on a
super large file, just long enough to split it into two shorter files.
The buffer which occupies the space from $7400 through $77FF is only
used by the EXEC command; if you are not planning to use the EXEC
command for a while, you could safely raise HIMEM to $7800. The
buffer from $7800 through $7BFF is only used by TEXT and .TF; if you
are not going to use these, you could lift HIMEM as high as $7C00.
(The DOS.LOAD program also uses these two buffer areas, so it would
conflict with such a high HIMEM.)
- 8 -
---------------------------------------------------------------------
The procedure for raising HIMEM above $7400 is simple. All you have
to do is change the value at $BEFB using a monitor command, and then
type NEW
:$BEFB:78
:NEW
C'est possible, mais c'est dangereux.
.INB Directive:
The .INB directive is similar to the .IN directive. Both are used to
include additional source files during assembly. Following the .IN or
.INB, separated by at least one space, should be a pathname.
1010 .IN SRC/PART.l
1020 .INB SRC/PART.2
1030 .INB PART.3,S6,D2
The source program which contains the .IN or .INB directives is called
the "root" program. During assembly the root program is temporarily
"hidden", and source is read into memory from the included file.
The difference between .IN and.INB is this: .IN loads the entire
included file into RAM, and .INB only reads in one disk block (512
bytes) at a time.
If you are assembling large programs, you may need to break the
source code into two or more separate files. A small root program,
containing little else but .IN or .INB directives, links the source
files together during assembly. For example, the three lines
1010-1030 above would assemble the three files PART.l, PART.2, and
PART.3 as one large program
During assembly, all .IN, .INB, and .TF limes are listed during both
passes. They are listed even if the .LIST OFF option has been
selected. This allows you to monitor the progress of the assembly.
The .INB directive is a little slower than the .IN directive, because
the processing between disk accesses slows down the reading of the
source files. The speed penalty is not large, perhaps about l0%.
What you gain with .INB is the ability to assemble files as large as
you can edit, files that use all the space between LOMEM and HIMEM.
With .IN there would not be room in memory during assembly for these
large files, but with .INB blocking the file it will all fit.
If you abort an assembly by typing the RETURN key, and if the
assembly was currently inside an included file, .IN and .INB again
operate differently. .IN will leave you inside the included file, and
the prompt symbol will become "I:". You can modify the currently
included file, save it, and type RESTORE to get back to the root
program. Or simply type ASM to restart the assembly (ASM does a
RESTORE operation before beginning an
- 9 -
---------------------------------------------------------------------
assembly). If you abort inside a file included with the .INB
directive the RESTORE operation is automatically performed: you wind
up immediately back in the root program.
You may like to experiment with the blocking factor that .INB uses.
Normally the file is read in one block at a time, but you can adjust
it up to nine blocks at a time. Simply type a digit after the .INB
to indicate how many blocks to read a time:
1040 .INB3 PART.3 reads 3 blocks at a time
1050 .INB2 PART.7 reads 2 blocks at a time
If you are running an assembly from floppy disks, using too large a
blocking number can lead to slower assemblies. If the disk has time
to stop between reading sections of a file, it will waste more time
trying to get it spinning again. Our experiments show .INB4 to be
about optimum.
.AC Directive:
The .AC directive allows you to assemble a large amount of text in a
compressed format. "AC" stands for "Ascii Compressed". It is a
powerful tool, but not one for the weak at heart. It takes a lot of
planning and programming to make effective use of the .AC directive,
but it can be worth the trouble when you have many messages and a
strong need to reduce memory usage.
The .AS and .AT directives also assemble ASCII strings, using one byte
for each character in the string. The .AC directive can use as little
as four bits per character, and usually averages about five bits per
character
The technique uses a set of three encoding tables, each containing 15
characters. The first table contains the 15 characters which occur
the most frequently in the body of text to be encoded. Each
character found in the table will be encoded as a single nybble (four
bits), with a value from 1 through $F. If a character to be encoded
is not found in the first table, a nybble NON will be assembled.
The second table contains the next most frequent set of 15
characters. If a character is found in the table, it will be encoded
by a zero nybble (from the first table) plus another nybble in the
range from 1 through $F. If there are no more than 30 different
characters used in all of your messages, this may be all the tables
you need. If there are more than 30 characters, you will need a
third table. Characters not found in either the first or second
table will assemble two "zero nybbles", one for the first table and
the second for the second table.
The third table contains 15 more characters, less frequently found in
your messages than those found in the first and second tables. If a
character is found in the third table, it will be assembled as two
zero nybbles plus another nybble in the range from 1 to $F.
- 10 -
---------------------------------------------------------------------
If a character to be encoded is not in any of the three tables, it
will take five nybbles to assemble. There will be three zero
nybbles, followed by the actual 8-bit Ascii code of the character.
In actual practice, it usually turns out that three tables are
sufficient. The error messages in the S-C Macro Assembler are
encoded with three tables, and there are unused character positions
in the third table. The same goes for the error messages in our
ProDOS command interpreter.
The error messages in BASIC.SYSTEM are encoded in a similar fashion,
and a very good description of the technique used can be found in
Sandy Mossberg's article "ProDOS Cryptography", Nibble Magazine,
March, 1985, pages 72-81. Our technique compresses the same messages
found in BASIC.SYSTEM even more tightly than Apple's technique;
furthermore, our messages can be selectively printed with a smaller
decoding routine. Our technique also gives slightly more
flexiblility, and lends itself to many creative uses.
As an example of the technique, suppose the three tables are as
follows:
Table 1 2 3 4 5 6 7 8 9 A B C D E F
----- -----------------------------
1 A C D E F I L N O P R S T ~
2 B G H K M U V W X Y / ( ) : .
3 J Q Z - 5 6 7 8 9 0 1 2 3 4 &
With these tables, the message "SYNTAX ERROR%" would be encoded as:
S Y N T A X E R R O R %
C 0A 08 D 1 09 E 4 B B 9 B F
or C0 A0 8D 10 9E 4B B9 BF
We compressed the original 13 byte message into only 8 bytes. The
character "%" is used this particular case to mean "end of message".
You are free to choose any character for that purpose.
The tables above happen to be very similar to the actual tables used
in compressing the error messages in our command interpreter. The
total number of characters in those messages is 388, and they
compress to 451 nybbles, or 226 bytes. The average number of bits
per character is thus 4.66.
It obviously takes a longer program to find and print a message that
has been compressed than it does to print one that is stored in plain
ASCII. However, if you have a lot of text, it does pay off. The
program used by our command interpreter takes only 130 bytes,
including all bells and whistles: 130+226 = 356, so the total is
still less than the original messages alone! And the un-compressed
messages would still require a subroutine on top of the 388 bytes.
If we had more messages, the savings could be even more dramatic.
- 11 -
---------------------------------------------------------------------
Using the AC directive requires some preliminary work. You first
need to reduce all your messages to printing characters. If there are
any control characters in your messages, substitute a printing
character not otherwise used in your text. For example, we
substituted the "%" character for end-of-message above.
Next we manually counted the frequency of each and every character
used. In the command interpreter's messages we found 69 E's, 27 O's,
on down to one X and one W. Manually counting is no fun, so we
included a program onthe S-C Macro Assembler disk called
AC.FREQUENCY. This program will analyze a set of messages and print
out the frequency results. It will even print out the table set-up
directives for you to insert into your program.
The AC.FREQUENCY program analyzes whatever messages you assemble
between the two labels MESSAGES and END.MESSAGES. The copy on our
disk contains the messages from our command interpreter. After
looking it over, delete our messages and put in your own. Assemble
the program, and run it with "MGO 2048". All the text of your
messages will be printed first, then the frequency table (in hex dump
format), then the three set-up lines for the .AC directive, and
finally the frequency table in descending order.
There are five different forms of the .AC directive. One is used to
initialize the nybble generator. three to set up the three encoding
tables, and one declares what text will be compressed.
.AC 0 Initializes the nybble generator
.AC 1dstringd Sets up the first table
.AC 2dstringd Sets up the second table
.AC 3dstringd Sets up the third table
.AC dstringd A string to be compressed.
For example, to set up the three tables given above, and encode a few
messages, you would use the following:
.AC 0
.AC 1"ACDEFILNOPRST %" 15 chars each
.AC 2"BGHKMUVWXY/():."
.AC 3"JQZ-5678901234&"
.AC "SYNTAX ERROR%"
.AC "WRITE PROTECTED%"
.AC "END OF DATA%"
.AC "/" flush buffer
After the last message, it is possible for the last nybble to be
waiting in the nybble generator's buffer. To flush out that last
nybble. if it is there, write one final AC line with a d single
character string. If there was a buffered nybble, it will pop out.
If not, nothing will be generated at all.
For the messages in our command interpreter, the second most frequent
character was the space. In some messages there were strings of
spaces up to nine spaces long. It turned out we
- 12 -
---------------------------------------------------------------------
were able to save additional memory by encoding long strings of
blanks with three-nybble codes, by using entries in the third table.
Then we use single characters to indicate the multiple blank strings.
For example, the "BLOCKS FREE" message at the end of a catalog is
generated by the following line:
AC "BLOCKS FREE:0BLOCKS USED:8TOTAL BLOCKS:6%"
The character "0" is decoded by our message printer as ten blanks,
"6" as six blanks, and "8" as eight blanks.
By creative planning and some experimentation you can come up with
all sorts of memory saving tricks using the AC directive and
appropriate decoding message printers.
The "decoding message printer" subroutine for compressed messages can
take on various forms, depending on the clever tricks you have built
into your coding scheme. My printers usually break down into three
parts: a message finder, a decoder-printer, and a nybble-picker.
The message finder takes advantage of the fact that each message ends
with a unique end-of-message character. Given a message number to
locate, it simply scans through the compressed message text counting
end-of-message characters until it finds the end of the message
before the one we want. To make this work I put a null message at the
beginning (no text, just an e-o-m).
The scanning is done by repeatedly calling the nybble-picker. Here is
a sample nybble-picker I call it with the carry status clear to get
the left nybble, or carry set to get the right nybble. The
X-register holds the index of the current byte. The code below also
assumes all of the messages together occupy no more than 256 bytes.
Other nybble-pickers could allow for larger blocks of compressed text.
GET.NEXT.NYBBLE
LDA MESSAGES,X
BCS .1 2ND NYBBLE
LSR 1ST NYBBLE
LSR
LSR
LSR
TAY
SEC
RTS
.1 INX
AND #$0F
TAY
CLC
RTS
Note that the nybble-picker automatically toggles the left-right
status1 and increments the index. It also returns the nybble in both
the A-register and the Y-register The Y-register is the important
one, because it will be used to index into one of the three decoding
tables.
- 13 -
---------------------------------------------------------------------
The decoding tables are quite similar to the encoding tables used by
the .AC directive. The characters will most often be the same in
both. However, they will be assembled along with your message
decoder-printer. Here are the decoding tables used by our command
interpreter:
TABLE1 .HS 00
.AS -"ACDEFILNOPRST "
.HS 8D
TABLE2 .HS 00
.AS -"BGHKMUVWXY/() :."
TABLE3 .HS 00
.AS -"JQZ-"
.HS 05.06.07.08.09.0A.0B.0C.0E.0F.10
There are some coding tricks involved in the setup of the decoding
tables above. I used negative ASCII codes for all the actual letters
and punctuation symbols in the tables; a zero code for a flag to move
to the next table; and positive, non-zero codes for blank counts.
The rest of the source code of the message printer for our command
interpreter is included on the S-C Macro Assembler disk. We also
included the code for the message printer used in the assembler
itself, which has some significant differences. These are both in
the file MSG.PRINTERS, for your A inspection and study.
Full Screen Editor
We have modified and simplified the Laumer Research Full Screen
Editor to operate with the ProDOS Version of the S-C Macro Assembler.
The ProDOS Full Screen Editor files are now included on the back of
the Editor disk.
Since ProDOS uses the entire upper 16K of RAM, the Full Screen Editor
can no longer use the alternate bank at $D000. This new version runs
below the assembler's disk buffers, from $6500-73FF. The new .INB
assembler directive overcomes the loss of this much source code
storage.
Owners of the Full Screen Editor can return their original diskettes
to S-C Software for revision. For a $5 fee we will add the ProDOS
version to the back of the disk, update the DOS version to include
the latest revisions, and send you a supplement to the documentation.
- 14 -
---------------------------------------------------------------------
Moving Source Files from DOS to ProDOS
S-C Macro Assembler stores source files as though they are Integer
BASIC programs. Of course they really have nothing to do with
Integer BASIC, but it's convenient in working with DOS and PrODOS to
pretend that they do.
Under DOS, source files are stored as type I files; under ProDOS, as
type INT. Our command interpreter and modified FILER rename the INT
type "S-C".
CONVERT, a standard Apple PrODOS utility, can be used to move files
from DOS to ProDOS or vice versa. The Apple //c System Utilities
program can do the same job. They both can successfully move S-C
source files in either direction.
However, there are some severe bugs in CONVERT which continually bite
me. For one, CONVERT does not know how to handle a DOS disk which
has "funny" file names, such as are commonly used to divide catalogs
into labelled sections.
I wanted a faster and surer way to move source files from DOS to
ProDOS, so I wrote a program called DOS.LOAD. This file is on the
S-C Macro Assembler disk. The source code for the program is also on
the disk, as S.DOS.LOAD.
When you -DOS.LOAD or BRUN DOS.LOAD the program asks for a slot and
drive number. Put the DOS disk containing the source files you want
to access into any drive, and type the slot number (1-7) and the
drive number (1 or 2). The DOS.LOAD program will then display a menu
of the type I files on the disk, and wait for you to select one of
the files. If there are more than 20 files, you can page through
them by tapping the space bar. You can also abort the operation by
typing the ESCAPE or RETURN keys.
If you select a file by typing the menu letter, that file will be
loaded into the assembler's edit area. You just loaded a source file
from a DOS disk, and yet you are still in the ProDOS assembler! Now
you can SAVE it directly onto a PrODOS disk, or whatever you want.
DOS.LOAD loads inside the EXEC file buffer, which means that of
course you should not try to BRUN it from inside an EXEC file. It
also means that if you do not use the EXEC command in the meantime,
that DOS.LOAD stays in memory ready to use again and again. You can
keep loading DOS-based source files by re-entering DOS.LOAD with the
$7400G command.
A full description of the internals of the DOS.LOAD program has been
published in the July 1985 issue of the "Apple Assembly Line".
There is no reason why this program could not be extended to allow
transfer of other file types, and we encourage you to try your hand
at this challenging project.
- 15 -
---------------------------------------------------------------------
80-Column I/O Drivers
SCASM.SYSTEM includes a 40-column driver which should be compatible
with any Apple II system, and four different 80-column drivers. The
source code for all five drivers is included on the disk.
When you boot the disk, or when you type "-SCASM.SYSTEM", the
installation program first checks the fourth byte of the SCASM.SYSTEM
file (at $2003). If that byte is non-zero, it selects one of the four
80-column drivers. On the release disk that byte is zero, but you
may modify it for your own use.
When the driver selection byte is zero, the installer checks to see
if the Apple is a //e or //c ($FBB3 contains $06). If so, the
40/80-column driver for those two machines is automatically
installed. If not, a four-choice menu allows you to manually select
the 40-column, Videx Videoterm, Videx Ultraterm, or STB-80 driver.
If you are using an Apple //e or //c and wish to override the
automatic loading of the 40/80 driver, you can do so by changing the
driver selection byte. Or, if you wish to bypass the four-line menu
and directly install the one of the other drivers, you again do so by
changing the driver selection byte. the hexadecimal values of the
driver selection byte to force installation of particular drivers are
these:
$01 -- Standard 40-column Driver
$02 -- Videx Videoterm
$03 -- Videx Ultraterm
$04 -- STB-80
Remember that a value of $00 will force the 40/80 driver in a //e or
//c, or the menu in other computers. Values other than 00-04 will
result in disaster.
Here is the procedure for changing the driver selection byte:
:BLOAD SCASM.SYSTEM,TSYS,A$2000
:$2003:0x (x 0 to 4)
:BSAVE SCASM.SYSTEM,TSYS,A$2000,L$4600
SCASM.SYSTEM is a type SYS file, designed to be booted or executed
with the "-" command. It may also be BLOADed and BSAVEd as shown
above, when you are operating within the environment of the S-C Macro
Assembler.
The layout within SCASM.SYSTEM is like this:
$2000-21FF Installation code
$2200-4AFF Assembler with 40-col driver
$4B00-5FFF Command Interpreter
$6000-60FF 40/80 driver for //e & //c
$6100-61FF STB-80 driver
$6200-63FF Videx Videoterm Driver
$6400-65FF Videx Ultraterm Driver
- 16 -
---------------------------------------------------------------------
The driver source files include the appropriate .OR (origin), .TF
(target file), and .PH (phase) directives to produce a BLOADable
object file which will correctly position itself in the SCASM.SYSTEM
image. Thus if you make some changes to one of the drivers you can
assemble it, BLOAD SCASM.SYSTEM as above. BLOAD the driver object
file, and then PSAVE SCASM.SYSTEM as above.
If you have a different kind of 80-column card, you can probably
modify one of the existing drivers to work with your card. Usually
the Videx Videoterm driver is the most suitable for this kind of
modification, as most other board makers have claimed to be
compatible with the Videoterm. (Note that we have tested this driver
with the Applied Engineering Viewmaster and found it to be fully
compatible already.)
The space allocated for drivers is 512 bytes long, which should be
adequate for any type of 80-column card. The STB80 and 40/80 drivers
fit within one page, so only one page is allocated within the
SCASM.SYSTEM image for them. The two Videx drivers are longer, so
two pages each are allocated for them. Slip your own modifed driver
into the space that fits best.
If you have further questions about 80-column drivers not answered
above or in the source code of the various drivers1 please call us at
(214) 324-2050.
Notes on Individual Drivers
1 40/80 //e & //c Driver.
This driver boots up in 40-column mode. You can enter 80-column mode
by typing the PR#3 command. Pressing ctrl-RESET takes you back to
40-column mode.
With the original //e firmware1 some of the escape key functions are
usurped. Therefore I was unable to implement esc-L and esc-S on
these machines. The same function can be performed on these machines
by holding down the open-apple key and typing L or S.
To activate a printer. type PR#1 (or PR# with whatever slot your
printer card is in). When you are through printing, you can
disconnect the printer in various ways. Ctrl-RESET always does it,
and also places you in 40-column mode. If you were in 40-column
mode, type PR#0 to disconnect the printer and return to 40-column
mode. If you were in 80-column mode, type PR#3 to disconnect the
printer and return to 80-column mode.
Depending on the particular printer interface card you have, the
screen output may or may not be suppressed when your printer is
activated. If you see no screen output, don't worry about it; just
keep typing, and all your output will be printed. The screen output
will return when you disconnect the printer.
- 17 -
---------------------------------------------------------------------
2. STB-80 Driver;
The STB-80 was one of the best 80-column cards on the market, but
it's unfortunately no longer in production. STB Systems now
concentrates all their efforts on the IBM marketplace. They sold
many thousands, and I have one, so we have a driver for it.
The STB-80 driver comes up in 80-column mode, and there is no way to
change to 40-columns while in the assembler environment.
To activate a printer, use the PR#slot command. To disconnect the
printer, use ctrl-RESET.
3. Videx Videoterm Driver:
Our Videoterm driver is intended to be independent of the firmware
level. Several functions are implemented by direct access to the
hardware on the Videoterm card.
The Videoterm driver comes up in 80-column mode, and there is no way
within the assembler environment to change to 40-column display.
To activate a printer, use the PR#slot command. To disconnect the
printer, use ctrl-RESET.
4. Videx Ultraterm Driver:
Our Ultraterm driver is intended to be independent of the firmware
level. Several functions are implemented by direct access to the
hardware on the Ultraterm card.
The Ultraterm card has many diplay modes, which is probably why you
bought it. Our driver leaves it in whatever mode it was in before
you started up the assembler. You can switch modes by using our
"-command followed by the appropriate control codes. For example, to
set 80x48 mode type a quotation mark, ctrl-O. ctrl-V, and the digit
6. When you press RETURN the ctrl-V6 command will be sent to the
Ultraterm, changing the display to 80x48. Of course, you may also
add code to the driver initialization to set your favorite mode at
startup time.
If you do change the number of lines on the screen display to a value
other than 24, you will also want to make a small patch in the
assembler. The EDIT command always VTABS to the bottom of the screen
to display the line being edited. Unfortunately, it always believes
the bottom is line 23. If you have a 32- or 48-line display, you
will want to change the value at $803A to $1F (31) or $2F (47); for
normal 24-line displays, the value is $17. To make a permanent
change, patch the location $223A in the SCASM.SYSTEM image.
To activate a printer, use the PR#slot command. To disconnect the
printer, use ctrl-RESET.
- 18 -
---------------------------------------------------------------------