antoine-source/picnicparanoia/scdocs.apple/SCASM32.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
74 KiB
Plaintext
Raw Blame History

S-C ASSEMBLER II
Disk Version 3.2
for the
APPLE II Computer
Copyright 1979
S-C SOFTWA RE
P.O. Box 280300
Dallas, Texas 75228
(214) 324-2050
---------------------------------------------------------------------
TABLE OF CONTENTS
1.0 Introduction and Feature List . . . . . . . . . . . 1
2.0 Commands . . . . . . . . . . . . . . . . . . . . . 3
2.1 Assembler Commands . . . . . . . . . . . . . . . . 3
2.1.1 Editing Commands . . . . . . . . . . . . . . . . 4
2.1.1.1 NEW Command . . . . . . . . . . . . . . . . . 4
2.1.1.2 RENUMBER Command . . . . . . . . . . . . . . . 4
2.1.1.3 DELETE Command . . . . . . . . . . . . . . . . 4
2.1.1.4 LIST Command . . . . . . . . . . . . . . . . . 4
2.1.1.5 FIND Command . . . . . . . . . . . . . . . . . 5
2.1.1.6 Screen Editing . . . . . . . . . . . . . . . . 5
2.1.2 Listing Control Commands . . . . . . . . . . . . 6
2.1.2.1 FAST Command . . . . . . . . . . . . . . . . . 6
2.1.2.2 SLOW Command . . . . . . . . . . . . . . . . . 6
2.1.2.3 PRT Command . . . . . . . . . . . . . . . . . . 6
2.1.3 Object Commands . . . . . . . . . . . . . . . . . 7
2.1.3.1 ASM Command . . . . . . . . . . . . . . . . . . 7
2.1.3.2 MGO Command . . . . . . . . . . . . . . . . . . 7
2.1.4 Tape Commands . . . . . . . . . . . . . . . . . . 8
2.1.4.1 LOAD Command . . . . . . . . . . . . . . . . . 8
2.1.4.2 SAVE Command . . . . . . . . . . . . . . . . . 8
2.1.4.3 JOIN Command . . . . . . . . . . . . . . . . . 8
2.2 DOS Commands . . . . . . . . . . . . . . . . . . . . 8
2.2.1 Housekeeping Commands . . . . . . . . . . . . . . 9
2.2.2 Source Maintenance Commands . . . . . . . . . . . 9
2.2.3 Object Maintenance Commands . . . . . . . . . . . 9
2.2.4 I/O Selection Commands . . . . . . . . . . . . . 9
2.2.5 BASIC Commands . . . . . . . . . . . . . . . . . 9
2.3 Monitor Commands . . . . . . . . . . . . . . . . . 10
3.0 Source Program Format . . . . . . . . . . . . . . . 11
3.1 Label Field . . . . . . . . . . . . . . . . . . . . 11
3.2 Opcode Field . . . . . . . . . . . . . . . . . . . 12
3.3 Operand Field . . . . . . . . . . . . . . . . . . . 12
3.4 Comment Field . . . . . . . . . . . . . . . . . . 12
3.5 Comment Lines . . . . . . . . . . . . . . . . . . . 12
3.6 Sample Source Program . . . . . . . . . . . . . . . 13
4.0 Assembler Directives . . . . . . . . . . . . . . . 15
4.1 .OR -- Origin . . . . . . . . . . . . . . . . . . 15
4.2 .TA -- Target Address . . . . . . . . . . . . . . . 15
4.3 .EN -- End of Program . . . . . . . . . . . . . . . 17
4.4 .EQ -- Equate . . . . . . . . . . . . . . . . . . . 18
4.5 .DA -- Data . . . . . . . . . . . . . . . . . . . . 18
4.6 .HS -- Hex String . . . . . . . . . . . . . . . . . 19
4.7 .AS -- ASCII String . . . . . . . . . . . . . . . . 19
5.0 Operand Expressions . . . . . . . . . . . . . . . . 21
5.1 Decimal Numbers . . . . . . . . . . . . . . . . . . 21
5.2 Hexadecimal Numbers . . . . . . . . . . . . . . . . 21
5.3 Labels . . . . . . . . . . . . . . . . . . . . . . 21
5.4 Asterisk (*) . . . . . . . . . . . . . . . . . . . 22
---------------------------------------------------------------------
6.0 Addressing Modes . . . . . . . . . . . . . . . . . . 23
6.1 Implied Mode . . . . . . . . . . . . . . . <20> . . . 25
6.2 Relative Mode . . . . . . . . . . . . . . . . . . . 25
6.5 Other Modes . . . . . . . . . . . . . . . . . . . . 25
6.4 Chart of Other Modes . . . . . . . . . . . . . . . 26
7.0 SWEET-16 . . . . . . . . . . . . . . . . . . . . . 27
7.1 Sample SWEET-16 Program . . . . . . . . . . . . . . 28
Appendix . -- Operation and Memory Usage . . . . . . . A-1
A.1 Contents of the Disk . . . . . . . . . . . . . . A-1
A.2 Copying the Disk . . . . . . . . . . . . . . . . A-1
A.3 Memory Usage . . . . . . . . . . . . . . . . . . A-2
A 4 ROM Usage . . . . . . . . . . . . . . . . . . . . A-2
A.5 Description of Sample Source Programs . . . . . . A-4
A.6 Useful Information . . . . . . . . . . . . . . . A-4
A.7 Handy Patches . . . . . . . . . . . . . . . . . . A-5
Appendix B -- Error Messages . . . . . . . . . . . . . B-1
Appendix C -- Printer Software . . . . . . . . . . . . C-1
C.1 Listing of the PRT Subroutine . . . . . . . . . . C-2
Appendix D -- Bibliography . . . . . . . . . . . . . . D-1
D.1 Sources of Help for 6502 Programming . . . . . . . D-1
D.2 Sources of Help for SWEET-16 . . . . . . . . . . . D-2
Registration Form
---------------------------------------------------------------------
INTRODUCTION
S-C ASSEMBLER II is a convenient and powerful tool for software
develcpment on the Apple II Computer. The assembler uses standard
6502 mnemonics and syntax, and includes many useful features for
creating, editing, assembling, and testing your assembly language
programs. Now assembly language programming is almost as easy as
prograinming in BASIC.
Here is a summary of the most exciting features:
* Operates as a subsystem under standard Apple DOS 3.2
* BASIC-like text editing (line numbers, LIST and DELETE commands)
* Full Apple II screen editing
* Tab stops for opcode, operand, and comment fields
* A fast RENUMBER command
* LOAD and SAVE commands to maintain your programs on disk or tape.
* Labels of from 1 to 6 characters
* Arithmetic expressions in operand field (using decimal, hexadecimal
numbers and labels)
* Comments, for built-in documentation
* English-language error messages
* FIND command, to search through source programs
* Ability to assemble standard syntax SWEET-16 opcodes
* All DOS commands usable from within S-C ASSEMBLER II
* All Apple Monitor commands usable from within S-C ASSEMBLER II
* Speed and suspension control over listing and assembly
* Built-in software for controlling the Practical Automation DMTP-6uP
Printer (easily replaceable with software for any other printer)
* Ability to use Apple parallel or serial printer interface cards to
any printer (PR#s command)
* Continuing development and support by S-C SOFTWARE to provide more
useful features and extensions with future releases
- 1 -
---------------------------------------------------------------------
---------------------------------------------------------------------
COMMANDS
There are three types of commands in S-C ASSEMBLER II:
Assembler Commands, DOS Commands, and Monitor Commands. The Assembler
Commands are used to control the editor and assembler. All of the
Apple Monitor and DOS Commands are recognized, although they are not
all of use from within S-C ASSEMBLER II. Commands are typed
immediately after the prompt symbol, which is a colon (:).
ASSEMBLER COMMANDS
There are thirteen assembler commands in S-C ASSEMBLER II. All
assembler commands may be abbreviated to the first three letters if
you so desire.
ASM Assemble source program, put object program
into memory, and produce assembly listing.
DELETE line# Delete specified line.
DELETE line#,line# Delete line range.
FAST Select normal listing speed, turn off printer
software.
FIND string List all lines containing the specified string.
JOIN Join a program from tape to one already in memory.
LIST List entire source program.
LIST line# List specified line.
LIST line#,line# List line range.
LOAD Load source program from tape.
MGO expression Execute object program, starting at address
specified by value of expression.
NEW Delete entire source program, start all over.
PRT Turn on printer software.
RENUMBER Renumber all lines of source program starting
with 1000, in steps of 10.
SAVE Save source program on tape.
SLOW Select slow listing speed, turn off printer
software.
- 3 -
---------------------------------------------------------------------
The assembler commands can be conveniently grouped into editing
commands, listing control commands, object commands, and tape
commands.
Editing Commands
The editor in S-C ASSEMBLER II combines the powerful Apple screen
editing features with a BASIC-like line editor. Source programs are
entered and edited in almost exactly the same way you would enter and
edit an Integer BASIC program.
NEW Command: Deletes the current source program from memory, and
restarts S-C ASSEMBLER II just as though you re-entered it from the
monitor or DOS.
RENUMBER Command: Assigns new line numbers to every line in the
current source program. The first line will receive the number 1000,
and subsequent lines will be numbered with an increment of 10. (See
Appendix A for instructions for setting a different starting line
number or increment.)
DELETE Command: Deletes a line or a range of lines from your source
program, just as in BASIC. Another way to delete a single line is to
type its line number followed immediately by a carriage return.
(Warning: DELETE followed by a file name is a DOS command, and will
delete a file from your disk.)
LIST Command: Lists a single line, a range of lines, or your entire
program; it works just like the LIST command in BASIC. While a
program or a range of lines is listing, you can momentarily stop the
listing by hitting the space bar. Tapping the space bar again will
restart the listing. You can abort the listing by hitting the RETURN
Key. The SLOW and FAST commands allow you to control the listing
speed. If you list a single line, it is displayed on the screen in a
position which makes it easy to edit using the Apple II screen
editing tools.
- 4 -
---------------------------------------------------------------------
FIND Command: Search through your source program for a given text
string, and list all the lines which contain that string. You may
type FIN or FIND, followed by a space, followed by the text string
for which you are searching. Every character you type between the
space and the carriage return is part of the search key, so you can
prefix or append spaces to the key to perform label searches.
Screen Editing: The Apple II screen editing tools are quite powerful
and actually very easy to use. However, many owners do not use them
because of the very limited explanation in the original Apple
Documentation. Now it is described well in the A~nle II BASIC
Programming Nanual (pages 28-30 and 49-55), and the A~~lesoft II
BASIC Reference Manual (pages 54-55 and 110-114).
Briefly, the left arrow is a backspace, and deletes one character
from the input buffer each time it is used. The right arrow adds to
the input buffer the character from the screen that the cursor was
covering just before you type the arrow key. Four escape character
sequences allow you to move the cursor anywhere on the screen you
wish without affecting the input bufferi
escape A Right 1 (if at end of line, go to
beginning of next line)
escape B Left 1 (if at beginning of line, go
to end of previous line)
escape C Down 1 line
escape D Up 1 line
These escape character sequences can be a little clumsy, due to the
necessity of hitting the escape key and then a letter for each cursor
movement. S-C ASSEMBLER II allows you to substitute control-A for
escape-A, control-B for escape-B, and so on. The escape sequences
still work, but you can type faster using the control form. The
control form is especially nice when you need to repeat the same
motion a number of times.
You can edit a source line previously entered by listing it with the
LIST command, moving up to it by typing control-D, and then using the
arrows, control-A, and control-B to make
- 5 -
---------------------------------------------------------------------
the desired changes. The right arrow will copy characters into the
new version of the line. Control-A will skip over characters you
wish to omit, and control-B will back up the cursor so you can insert
new characters. To change characters on a one-for-one basis, simply
type over the top of the old ones. When you are through, hit the
RETURN key.
Another way to edit a line is to re-type the entire line. The new
version will replace the old one with the same line number.
S-C ASSEMBLER II implements one additional editing feature,
tabulation. The control-I key will cause enough blanks to be entered
to tab over to the next tab stop. Tab stops are preset at columns
12, 16, and 26. (See Appendix A for instructions on changing the tab
stops to different values.)
Listing Control Commands
FAST Command: Sets the listing speed to the normal~toofast-to-read
speed. It also turns off the printer software if it was on. When
you first enter S-C ASSEMBI<42>R II, it is already in the FAST mode. If
you abort a listing or assembly by hitting the RETURN key, the system
returns to the FAST mode.
SLOW Command: Sets the listing speed slow enough that you can read it
as it goes by on your screen. It also turns off the printer software
if it was on.
PRT Command: Turns on the printer software. All output will be sent
to the printer as well as to the TV screen. S-C ASSEMBLER II
includes a printer driver for the Practical Automation DMTP-6uP
printer, connected through the game i/o connector. You can easily
substitute your own printer software in its place (See Appendix C for
details). If you have the Apple parallel or serial printer interface
boards, you use the PR#slOt command to turn on y~ur printer instead
of the PRT command.
- 6 -
---------------------------------------------------------------------
Object Commands
ASM Command: Initiates assembly of your source program. S-C ASSEMBLER
II is a two-pass assembler. During the first pass it builds a symbol
table with the definition of every label used in your program.
During the second pass the assembler stores object code into memory
and produces an assembly listing. At the end of the second pass a
list of all the labels and their definitions is produced. The
symbols are listed in the same order in which they were defined.
If any errors are detected during either pass, an error message will
be printed. The message will briefly explain the nature of the
error, and indicate the line number of the bad line. All of these
messages abort the assembly process, so that you can fix them
immediately and re-start the assembly.
The assembly listing can be momentarily interrupted and restarted by
using the space bar, just as with the LIST command. You can also
abort the assembly during pass two by hitting the RETURN key.
MGO Command: Begins execution of your object program. An expression
(see OPERAND EXPRESSIONS later in this manual) must follow the MGO
command to define the place to begin execution. For example, '1MGO
BEGIN" will cause execution to begin at the point in your program
where the label BEGIN is defined. Your program can return to S-C
ASSEMBLER II either by using an '1RTS" instruction, or by a "JMP
~1OO5." You may also abort your program by hitting the RESET key1 and
then use iOO3G in the monitor to return to the assembler system.
Note: A source program MUST be assembled using the ASM command before
it can be executed with the MGO command:
The MGO command is named "MGO" rather than "RUN" due to a naming
conflict with Apple DOS.
- 7 -
---------------------------------------------------------------------
Tape Commands
Three commands are included in S-C ASSEMBLER II to allow you to
maintain source programs on cassette tape.
LOAD Command: Deletes the current source program, if any, and then
reads in a new one from cassette tape. It works exactly the same as
the LOAD command in BASIC.
SAVE Command: Writes the source program in memory on cassette tape.
It works exactly the same as the SAVE command in BASIC.
JOIN Command: Reads a program from cassette tape and positions it in
front Qf a program already in memory. The JOIN command allows you to
join two programs into one. JOIN does not renumber the lines, and
does not re-sort the lines of the combined program into line-number
order. After the JOIN is complete, you should first delete any excess
lines (such as the ".EN" from the newly-read portion), and then use
the RENUMBER command to assign new line numbers to all the lines.
The JOIN command is named "JOIN" rather than "APPEND" due to a naming
conflict with Apple DOS.
DOS COMMANDS
All the Apple DOS commands are valid, even though you are operating
from within S-C ASSEMBLER II. This feature allows you to maintain
your source and object programs on disk using the LOAD, SAVE, BLOAD,
and BSAVE commands. Source programs will be entered into the disk
catalog with a type code of "I", just as though they were Integer
BASIC programs.
Be sure to avoid typing the "RUN filename" command, because it will
be recognized by DOS as an attempt to load and execute an Integer
BASIC or Applesoft program. However, since the DOS links have been
set up for S-C ASSEMBLER II, the program will not execute. It will
just clobber any source program you may have had in memory!
- 8 -
---------------------------------------------------------------------
Housekeeping Commands: The Apple DOS housekeeping commands (INIT,
CATALOG, RENAME, DELETE, LOCK, UNLOCK, VERIFY, NON, NOMON, and
MAXFILES) can be used as you desire. They will function exactly the
same within S-C ASSEMBLER II as they do within BASIC.
Source Maintenance Commands: The LOAD and SAVE commands when used
with a file name will be interpreted by DOS. If no file name is
included, S-C ASSEMBLER II will interpret them as cassette tape
commands. As mentioned before, you should not use the RUN command
when you are inside S-C ASSEMBLER II, or you will just lose your
current source program. (Same thing goes for the CHAIN command.)
Object Maintenance Commands: The BSAVE, BLOAD, and BRUN commands may
be used to maintain object programs on the disk and to execute them.
Be careful when using BLOAD and BRUN that the program you are loading
does not load on top of anything you want to keep!
I/O Selection Commands: The PR#, IN#, and EXEC commands may be used
from within S-C ASSEMBLER II. PR# is used to turn on the standard
Apple parallel or serial printer interface cards. EXEC could be used
in many ways; one use might be to load a source program created by
some other editor as a text file (type code "T") on the disk. The
IN# command will virtually be ignored, because the line input routine
inside S-C ASSEMBLER II resets input to keyboard before every line is
read.
BASIC Commands: The INT and FP commands may be used to exit the S-C
ASSEMBLER II and enter Integer BASIC or Apple soft.
- 9 -
---------------------------------------------------------------------
MONITOR COMMANDS
All of the Apple II Monitor commands are available from within S-C
ASSEMBLER II. You use them by typing a dollar sign ($) after the
prompt symbol, followed by the monitor command you wish to use. This
is the same feature available in the Apple
II Mini-Assembler.
Apple II Monitor commands are explained on pages 68-71 of the red
Apple II Reference Manual. Withthem you may examine, change, move,
verify memory; read and write cassette tapes; dis-assemble machine
language programs; execute programs; call the mini-assembler and
assemble some 6502 code; perform hexadecimal arithmetic;~and monitor
program execution for debugging purposes. The fact that all these
commands may be used without leaving the S-C ASSEMBLER II system
greatly increases the facility with which you can develop and debug
assembly language programs.
:$4A.4D CA.CD
004A- 00 1D 00 96
00CA- 62 88 00 08
:$1000L
1000- 4C 1B 10 JMP $101B
1003- AD 81 C0 LDA $C081
1006- 20 0F 10 JSR $100F
1009- 4C 29 10 JMP $1029
100C- 20 AD E5 JSR $E5AD
100F- A9 1D LDA #$1D
1011- 85 4B STA $4B
1013- A9 00 LDA #$00
1015- 85 4A STA $4A
1017- AA TAX
1018- 81 4A STA ($4A,X)
101A- 60 RTS
101B- 20 D7 13 JSR $13D7
101E- 20 58 FC JSR $FC58
1021- 20 0C 10 JSR $100C
1024- A0 00 LDY #$00
1026- 20 F9 12 JSR $12F9
1029- A9 B2 LDA #$B2
102B- A0 1C LDY #$1C
102D- 20 D1 11 JSR $11D1
- 10 -
---------------------------------------------------------------------
SOURCE PROGRAM FORMAT
Source programs are entered a line at a time, with a four-digit line
number identifying each line. The line numbers may run from 0000
through 9999, and leading zeroes on numbers less than 1000 must be
typed. Source program lines are kept sorted in line-number order;
the numbers are used for editing purposes, just as in BASIC. A blank
must always follow the line number. After the blank, there are four
fields of information: the label, opcode, operand, and comment
fields. Adjacent fields must be separated by at least one blank.
Although the fields are not restricted to begin in any particular
columns, it is convenient to enter them in this way for neatness.
Therefore tab stops are built in to the S-C ASSEMBLER II at columns
12, 16, and 26. When you type the control-I character, blanks will
be printed until the next tab stop is reached. If you are already at
the column right before a tab stop, the next tab stop will be skipped
over and blanks will be printed up to the second tab stop. For
information about changing the tab stops to different columns, see
Appendix A.
Label Field: May be left blank, or may contain a label of from one to
six characters. The first character of a label must be a letter;
remaining characters may be either letters or numbers. Labels are
used to name places in your program to which you will branch, as well
as constants and variables.
The standard tab settings leave enough room for only four-character
labels; however, you can go ahead and use six characters as long as
there is at least one space between the label and the opcode. If you
like, you may type labels on a separate line, with the opcode and
following fields left blank. The label will be defined as the
current value of the location counter. There aresome examples of
this in the file on the S-C ASSEMBLER II disk named "SAMPLE.SOURCE".
- 11 -
---------------------------------------------------------------------
Opcode Field: Contains a three-letter machine language mnemonic
opcode, an assembler directive, or a SWEET-16 mnemonic opcode. If
you are using the tab stops, the opcode field normally starts in
column 12. However, opcodes may begin in any column after at least
one blank from a label or two blanks from a line number.
S-C ASSEMBLER II uses the standard 6502 instruction mnemonics, which
are listed in the Apple II Reference Manual on pages 100-105.
Assembler directives and SWEET-16 opcodes are discussed later in this
manual.
Operand Field: Usually contains an operand expression of some sort.
Some of the 6502 instructions have no written operand, such as NOP,
BRK, DEX, and others. In these cases the comment field may be
started right after the opcode. Four of the opcodes (ROL, ROR, ASL,
and ASR) may be used both with and without an operand. If no operand
is present, you must type at least two blanks before a comment with
these four opcodes.
Comment Field: Comments are separated from the operand field by at
least one blank. For your convenience, a tab stop for comments is
set at column 26. In the assembly listing, they will start at column
~1, which is the beginning of the next line on your TV screen.
Actually comments may begin earlier or later on the line, just so at
least one blank separates them from the operand expression.
Comment Lines: Full lines of comments may be entered by typing an
asterisk (*) in the first column of the label field. This type of
comment is useful in separating various routines from each other, and
labeling their contents. It is analogous to the REM statement in
BASIC.
Lines which are completely blank are also treated as comments.
- 12 -
---------------------------------------------------------------------
Samp1e Source Program
1000 *
1010 * MONITOR CALLS
1020 *
1030 DLAY .EQ $FCA8 DELAY SUBROUTINE
1040 COT1 .EQ $FDF0 CHARACTER OUTPUT
1050 SOFT .EQ $3D0 DOS SOFT RE-ENTRY
1060 IOHOOK .EQ $3EA DOS I/O HOOK ROUTINE
1070 *
1080 * I/O ADDRESSES
1090 *
1100 KEY .EQ $C000 KEYBOARD INPUT
1110 KEYS .EQ $C010 KEYBOARD STROBE
1120 *
1130 * SET UP SLOW-LIST
1140 *
1150 SLOW LDA #SLOLST PUT POINTER IN OUTPUT VECTOR
1160 STA $36
1170 LDA /SLOLST
1180 SLS1 STA $37
1190 JMP IOHOOK GET DOS TO HOOK IT IN
1200 *
1210 * SET UP FAST-LIST
1220 *
1230 FAST LDA #FSTLST
1240 STA $36
1250 LDA /FSTLST
1260 BNE SLS1
1270 *
1280 * SLOW-LIST ROUTINE
1290 *
1300 SLOLST
1310 CMP #$8D IS IT CR?
1320 BNE SLW4 NO, SO PRINT IT
1330 LDA #0 YES, SO SLOW DOWN
1340 JSR DLAY MONITOR DELAY ROUTINE
1350 SLW1 LDA KEY CHECK IF KEY TYPED
1360 BPL SLW3 NO, OUTPUT CR
1370 STA KEYS YES, CLEAR STROBE
1380 CMP #$8D IS IT CR?
1390 BEQ SLW5 YES, SO ABORT
1400 SLW2 LDA KEY NO, SO SUSPEND
1410 BPL SLW2 WAIT FOR KEY
1420 STA KEYS CLEAR STROBE
1430 CMP #$8D IS IT CR?
1440 BEQ SLW5 YES, SO ABORT
1450 SLW3 LDA #$8D OUTPUT CR
1460 SLW4 JMP COT1 MONITOR CHAR OUTPUT
1470 SLW5 JMP SOFT ...ABORT...
1480 *
1490 * FAST-LIST ROUTINE
1500 *
1510 FSTLST
1520 CMP #$8D IS IT CR?
1530 BNE SLW4 NO, SO KEEP LISTING
1540 BEQ SLW1 YES; SO CHECK FOR KEYS
1550 .EN
- 13 -
---------------------------------------------------------------------
---------------------------------------------------------------------
ASSEMBLER DIRECTIVES
Seven assembler directives are available in S-C ASSEMBLER II to
control the assembly process and to define data in your programs.
These are all indicated by a three-character mnemonic, in the form of
a period followed by two letters.
.OR ORigin
.TA Target Address
.EN ENd of program
.EQ EQuate
.DA DAta
.AS Ascii String
.HS Hex String
Origin: .OR expr
Sets the program origin and the target address to the value of the
expression. Program origin is the address at which the object
program will be executed. Target address is the memory address at
which the object program will be stored during the assembly. The .OR
directive sets both of these to the same value, which is the normal
way of operating. If you do not use the .OR directive, the assembler
will set both the program origin and the target address to $0800. If
the "expr" is not defined during pass one prior to its use in the .OR
directive, an error message is printed and assembly is aborted
(***UNDEF AT LINE ....).
Target Address: .TA expr
Sets the target address at which object code will be stored during
assembly. The target address is distinct from the program origin
(which is either set by the .OR directive, or is implicitly set to
$0800). The .OR directive sets both the origin and the target
address; the .TA directive sets only the target address. Object code
is produced ready to run at the program origin, but is stored
starting at the target address.
- 15 -
---------------------------------------------------------------------
When you wish to assemble a program which will execute at an address
normally occupied by the assembler ($1000 through $1CFF)*, the symbol
table ($1D00 *up), or the source program text (bottom of DOS down),
you need to use the .TA and .OR directives. Set the origin first,
using the .OR directive; then set the target address to a safe value
using the <20>TA directive. It is always safe to start the target area
at $0800, providing your object code does not extend beyond $0FFF.
:ASM
1000 * SAMPLE PROGRAM TO ILLUSTRATE
1010 * THE ".TA" DIRECTIVE
1020 .OR $1000
1030 .TA $0800
1000- AD 0C 10 1040 DEMO LDA AVALUE
1003- AE 0D 10 1050 LDX XVALUE
1006- AD 0E 10 1060 LDY YVALUE
1009- 4C 00 10 1070 JMP DEMO
1080 *
100C- 0C 1090 AVALUE .DA #12
100D- 22 1090 XVALUE .DA #34
100E- 38 1090 YVALUE .DA #56
SYMBOL TABLE
DEMO 1000 AVALUE 100C XVALUE 100D
YVALUE 100E
As you can see in the example, the assembly listing looks as though
the program were stored at $1000. However, the object code is
actually stored at $0800, which is the target address set in the .TA
directive. If we dis-assemble memory starting at $0800, we see:
:$800L
0800- AD 0C 10 LDA $100C
0803- AE 0D 10 LDX $100D
0806- AC 0E 10 LDY $100E
0809- 4C 00 10 JMP $1000
080C- 0C ???
080D- 22 ???
080E- 38 SEC
* ASMDISK ends at $1CFF, symbols start at $1D00. ASMDISK (AUTOSTART)
ends at $1DFF, symbols start at $1E00. ASMDISK (APPLE II PLUS) ends
at $1FFF, symbols start at $2000.
- 16 -
---------------------------------------------------------------------
After the assembly is complete, there are several ways to position
the code in memory where it really should be. You can save the
object code on cassette or disk from its current location, and
re-load it later at the correct location for execution. Be sure you
do not try to reload it while you are executing the assembler, or you
may clobber it!
Another method is to hit RESET and use the monitor memory move
command ( addrl addr2.addr3M ). This command will move the block of
memory from addr2 through addr3 to the area beginning at addri.
If you need a larger safe area than that given between $0800 and
$0FFF, you can patch the assembler at location $1010. This location
currently contains $1D, which is the page number of the start of the
assembler's symbol table. If you change this value to $30, for
example, the symbol table will start at $3000 instead of $1D00. This
will leave the area from $1D00 through $2FFF free for a target area.
To be effective, this change should be made before using the ASM
command. Be sure to leave enough room between the start of the
symbol table and the bottom of DOS for all of your source program as
well as the symbol table.
End of Program: .EN
Defines the end of the source program. You would normally make this
the last line, but you may place it earlier in order to assemble only
a portion of your source program. If no .EN is present anywhere in
your program, the assembler will assume you meant to put one after
the last line. (This is different from most assemblers, which for
some strange reason go completely crazy if the .EN directive is
missing!)
* These values are correct for ASMDISK. For ASMDISK (AUTOSTART) the
values are $1E and $1E00. For ASMDISK(APPLE II PLUS) the values are
$20 and $2000.
- 17 -
---------------------------------------------------------------------
Equate: label .EQ expr
Defines the label to have the value of the expressione If the
expression is not defined, an error message is printed (***UNDEF AT
LINE xxxx). If you neglect to use a label with an equate directive,
an error message is printed also (***NO LABEL AT LINE xxxx). In
either case, the assembly is aborted so that you can repair the
error. One common use for this directive is to define all the
page-zero variables your program uses.
1000 ACC .EQ $45
1010 IN .EQ $0200 INPUT BUFFER
1020 ACL .EQ $50
1030 ACH .EQ ACL+1
1040 PDL0 .EQ $C064 PADDLE 0
SYMBOL TABLE
ACC 0045 IN 0200 ACL 0050
ACH 0051 PDL0 C064
Data: label .DA expr (two bytes, LSB first)
label .DA #expr (one byte, LSB of expr)
label .DA /expr (one byte, MSB of expr)
Creates a constant or variable in your program. The value of the
expression, as one or two bytes, is stored at the current location.
If a label is present, it is defined as the address where the first
byte of data is stored. (If you use .DA to define a variable, it is
a good habit to use an expression like "*-*", which has a value of
zero. This weird expression will make your program more
self-explanatory when you look at it again next year.)
1000 IN .EQ $0200 INPUT BUFFER
0800- E8 03 1010 TEN3 .DA 1000
0802- 64 C0 1020 PDL0 .DA $C064 PADDLE 0 ADDRESS
0804- C1 1030 LTRA .DA #$C1 ASCII LETTER A
0805- 02 1040 BFPG .DA /IN BUFFER PAGE
SYMBOL TABLE
IN 0200 TEN3 0800 PDL0 0802
LTRA 0804 BFPG 0805
- 18 -
---------------------------------------------------------------------
Hex String: label .Hs hhh...h
Converts a string of hex digits (hhh...h) to binary, two digits per
byte, and stores them starting at the current location. If a label
is present, it is defined as the address where the first byte is
stored. If you do not have an even number of hexadecimal digits, the
assembler aborts with an error message (***BAD ADDRESS AT LINE xxxx).
NOTE: Unlike hexadecimal numbers used in operand expressions, you
must not use a dollar sign with the .HS directive.
A funny feature of this assembler is that the source line will print
together with the last line of bytes produced by the hex string
directive. Do not let this confuse you.
0800- F1 0900 .HS F1
0801- 23 AB 45 1000 STR .HS 23AB45
0804- 01 23 45
0807- 67 89 AB
080A- CD EF 1100 QT .HS 0123456789ABCDEF
SYMBOL TABLE
STR 0801 QT 0804
Ascii String: label .AS daaa...ad
Stores the binary form of the ASCII characters "aaa...a" in
sequential locations beginning at the current location. If a label
is present, it is defined as the address where the first character is
stored. The string "aaa...a" may contain any number of the printing
ASCII characters. You indicate the beginning and end of the string
by any delimiter !1d11 that you choose.
ASCII character codes are seven bit values. The .AS directive
normally sets the high-order, or 8th, bit to zero. Some people like
to use ascii codes with the high-order bit set to one, so S-C
ASSEMBLER II includes an option for this.
.AS daaa...d sets the high-order bits to 0
.AS -daaa...d sets the high-order bits to 1
This syntax restricts the choice of the delimiter slightlys it may be
any printing character other than space and minus.
- 19 -
---------------------------------------------------------------------
0800- 53 54 52
0803- 49 4E 47 1000 STR .AS "STRING" DELIMITER IS "
0806- 22 22 22 1010 QT .AS /"""/ DELIMITER IS /
0809- C8 D5 C8
080C- BF 1020 HUH .AS -QHUH?Q DELIMITER IS ?
SYMBOL TABLE
STR 0800 QT 0806 HUH 0809
- 20 -
---------------------------------------------------------------------
OPERAND EXPRESSIONS
Operand expressions are written using terms and operators. The valid
operators are + and -. Terms may be decimal numbers1 hexadecimal
numbers, labels, or an asterisk (*). The first term in an expression
may be preceded by a + or - sign.
Decimal Numbers: Any number in the range from 0 through 65535,
written in the normal way.
0800- A9 C8 1000 LDA #200
0802- A2 F6 1010 LDX #-10
0804- 6B 8B 1020 .DA 35691
1030 FLAG .EQ -1
Hexadecimal Numbers: Any number in the range from $0 through $FFFF.
Hexadecimal numbers are indicated by a preceding dollar sign, and may
have from one to four digits.
1050 .OR $880
0880- A9 2F 1060 LDA #$2F
0882- 85 CA 1070 STA $CA
0884- D0 1D 1080 BNE $8A3
0886- 20 2A E0 1090 JSR $E02A
1100 VALL .EQ $AB
1110 NUM .EQ $1278
1120 CONV .EQ $E59B
Beware of leaving out the dollar sign; the assembler may be quite
satisfied to think of your hexadecimal number as a decimal one if you
omit the $. In some cases even a number with letters in it, such as
23AB,may be acceptable; it may be interpreted as decimal 23 and a
comment "AB".
Labels: One to six characters; the first character must be a letter,
while the others may be either letters or digits. Labels must be
defined somewhere in the program if they are to be used in an
expression. In some cases they must be defined prior to use in
expressions to prevent an undefined or ambiguous location counter.
For example, if the expression in the operand field of an origin
(".OR") directive is not defined prior to use, the assembler will not
know how to define any subsequent labels.
- 21 -
---------------------------------------------------------------------
A problem can occur if you postpone the definition of page-zero
variables until after their use in operand expressions. If these
labels are used with instructions which could assume both absolute
and zero-page address modes, a discrepancy in the location count will
occur between pass one and pass two of the assembler. (This
discrepancy cannot be detected by the present design of the
assembler, so make it a habit to always define your page-zero
variables at the beginning of your program.)
1000 VALL .EQ $AB
1010 NUM .EQ $1905
1020 CONV .EQ $E59B
0800- B5 A8 1030 LP LDA VALL-3,X
0802- 9D 05 19 1040 STA NUM,X
0805- 20 9B E5 1050 JSR CONV
0808- D0 F6 1060 BNE LP
Asterisk (*): Stands for the current value of the location counter.
This is useful for storing the length of a string as a constant in a
program. I also use it in the expression "*-*" to indicate that a
location is a variable rather than a constant.
080A- 0B 1070 QT .DA #QTSZ # BYTES IN MSG
080B- 41 4E 59
080E- 20 4D 45
0811- 53 53 41
0814- 47 45 1080 .AS /ANY MESSAGE/
1090 QTSZ .EQ *-QT-1 # OF BYTES IN MSG
0816- 00 00 1100 VARW .DA *-* 2-BYTE VARIABLE
0818- 00 1110 VARB .DA #*-* 1-BYTE VARIABLE
1120 HERE .EQ *
It is considered very poor programming practice to include branch
instructions in your program with operand expressions of the form
"*-5" or "*+7". Avoid them like the plague! They breed bugs that
can be very difficult to find. Don't be afraid to use another label
or two, no matter how silly the names might sound.
- 22 -
---------------------------------------------------------------------
ADDRESSING MODES
The MOS Technology 6502 microprocessor used in the Apple II has many
great features; one of the greatest is its variety of addressing
modes. There are thirteen different modes in all, though no single
opcode can use every one of them. The charts in this chapter show
which modes can be used with each opcode. But first, here is a chart
showing an example of each mode and the way it is written in assembly
language. Except for one new kind, the syntax is the same as that
used by the Apple II mini-assembler.
Mode Example
Implied DEX \ At least two
Accumulator ROL / blanks before
comments begin.
Relative BNE expr
Immediate LDA #expr
LDA /expr
Zero Page LDA expr \
Absolute LDA expr | Assembler uses
| Zero Page form
ZeroPage,X LDA expr,X | if possible;
Absolute,X LDA expr,X | if not, it uses
Zero Page,Y LDA expr,Y | Absolute form.
Absolute,Y LDA expr,Y /
(Zero Page,X) LDA (expr,X)
(Zero Page),Y LDA (expr),Y
(Absolute) JMP (expr)
For a full explanation of the modes and how to use them, I refer you
to the MOS Technology Hardware and Programming Manuals, as well as
the other references mentioned in the bibliography in Appendix D.
S-C ASSEMBLER II has one syntactical addition over the Apple II
mini-assembler. The immediate mode may be indicated by either a
pound sign (#) or a slash (/). The "#" means that the least
significant byte of the 16-bit expression value should be used
(equivalent to "expr MOD 256" in BASIC).
- 23 -
---------------------------------------------------------------------
The "/" means that the most significant byte should be used
(equivalent to "expr/256" in BASIC).
One use for this feature is in setting up the address of a subroutine
or a buffer in a pointer. (A pointer is a pair of bytes containing
an address which "points" at a subroutine or into a buffer.) For
example:
1000 SLOW .EQ $1C89
0800- A9 89 1010 LDA #SLOW
0802- 85 36 1020 STA $36
0804- A9 1C 1030 LDA /SLOW
0806- 85 37 1040 STA $37
is used inside S-C ASSEMBLER II to turn on the Slow-List feature when
you type the SLOW command.
Trying to comprehend and remember thirteen different addressing modes
can be very difficult; therefore it is convenient to try to group
them into categories. I use the following breakdown: implied mode,
relative mode, and other modes. "Other" modes now includes eleven
modes, so I break it down further: accumulator, immediate, direct,
and indirect modes. Each of direct and indirect modes may be either
indexed or not indexed, and either zero page or Absolute. The
following outline will give you a better idea of what I am describing.
I. Implied
II. Accumulator
III. Direct
A. Not Indexed
1. Zero Page
2. Absolute
B. Indexed by X-register
1. Zero Page,X
2. Absolute,X
C. Indexed by Y-register
1. Zero Page,Y
2. Absolute,Y
IV. Indirect
A. Not Indexed -- (Absolute)
B. Indexed by X-register (Zero Page,X)
C. Indexed by Y-register (Zero Page),Y
- 24 -
---------------------------------------------------------------------
Implied Mode: In this mode, the address is implied by the nature of
the instruction; the operand field is left blank. All of the opcodes
in this class are only one byte long. They are:
BRK DEX PHA RTS TAY
CLC DEY PHP SEC TSX
CLD INX PLA SED TXA
CLI INY PLP SEI TXS
CLV NOP RTI TAX TYA
Relative Mode: This mode is used only by the conditional branch
instructions. The expression is converted to a signed offset from
the location following the branch instruction. The result must be in
the range from -128 through +127 to be legal. All of these
instructions occupy two bytes. They are:
BCC BEQ BNE BVC
BCS BMI BPL BVS
Other Modes: Usage of the other eleven modes is much more complex.
The table on the next page shows which modes are defined for each of
the remaining opcodes. These instructions occupy one byte in the
accumulator mode, two bytes in any of the zero page modes, and three
bytes in any of the absolute modes. They are:
ADC AND ASL BIT CMP
CPX CPY DEC EOR INC
LDA LDX LDY LSR ORA
ROL ROR SBC STA STY
STX JMP JSR
You might notice especially that only four opcodes are usable in the
accumulator mode (ASL, LSR, ROL, ROR); that only two opcodes use the
"ZP,Y" mode (LDX and STX); and that only one opcode uses the
indirect absolute non-indexed mode (JMP).
- 25 -
---------------------------------------------------------------------
ACCUM- IMMED- ---- D I R E C T ---- ---- I N D I R E C T ----
ULATOR IATE INDEXED INDEXED
blank #expr expr expr,X expr,Y (expr) (expr,X) (expr),Y
/expr ZP/ABS ZP/ABS ZP/ABS
ADC -- 69 65/6D 75/7D --/79 -- 61 71
AND -- 29 25/2D 35/3D --/39 -- 21 31
ASL 0A -- 06/0E 16/1E --/-- -- -- --
BIT -- -- 24/2C --/-- --/-- -- -- --
CMP -- C9 C5/CD D5/DD --/D9 -- C1 D1
CPX -- E0 E4/EC --/-- --/-- -- -- --
CPY -- C0 C4/CC --/-- --/-- -- -- --
DEC -- -- C6/CE D6/DE --/-- -- -- --
EOR -- 49 45/4D 55/5D --/59 -- 41 51
INC -- -- E6/EE F6/FE --/-- -- -- --
LDA -- A9 A5/AD B5/BD --/B9 -- A1 31
LDX -- A2 A6/AE --/-- B6/BE -- -- --
LDY -- AO A4/AC B4/BC --/-- -- -- --
LSR 4A -- 46/4E 56/5E --/-- -- -- --
ORA -- 09 05/0D 15/1D --/19 -- 01 11
ROL 2A -- 26/2E 36/3E --/-- -- -- --
ROR 6A -- 66/6E 76/7E --/-- -- -- --
SBC -- E9 E5/ED F5/FD --/F9 -- E1 F1
STA -- -- 85/8D 95/9D --/99 -- 81 91
STX -- -- 86/8E --/-- 96/-- -- -- --
STY -- -- 84/8C 94/-- --/-- -- -- --
JMP -- -- --/4C --/-- --/-- 6C -- --
JSR -- -- --/20 --/-- --/-- -- -- --
- 26 -
---------------------------------------------------------------------
SWEET-16
SWEET-16 is the little 16-bit interpreter Steve Wozniak wrote, which
is hidden inside your Apple Integer BASIC ROM's. He described it
fully in BYTE Magazine, November, 1977, pages 150-159: "SWEET-16 --
The 6502 Dream Machine". The same article is available directly from
Apple, or in one of the many editions of the "WOZPAK".
Many people have begged me to include the ability to assemble code
for SWEET-16 in the S-C ASSEMBLER II, so I have now done so. (It is
included in versions 3.2 and later.) I have implemented the same
mnemonics and syntax which Steve Wozniak described in the article.
The beauty of SWEET-16 is in its ability to perform 16-bit arithmetic
and data moves using automatically updated address pointers. And to
add icing to the cake, most of the instructions are only one byte
long! You can write extremely compact code, if you are willing to
pay the price of slower execution. Portions of S-C ASSEMBLER II are
coded in SWEET-16; these include the RENUMBER command processor and
the opcode table search routine.
SWEET-16 is invoked by the instruction "J5R $F689", and the bytes
immediately after this instruction should contain opcodes for
SWEET-16 to process. If you are serious about wanting to learn to
use SWEET-16, locate the article and start studying.
1n lo hi SET n,addr 01 ea BR addr
2n LD n 02 ea BNC addr
3n ST n 03 ea BC addr
4n LD @n 04 ea BP addr
5n ST @n 05 ea BM addr
6n LDD @n 06 ea BZ addr
7n STD @n 07 ea BNZ addr
8n POP @n 08 ea BM1 addr
9n STP @n 09 ea BNM1 addr
An ADD n 0C ea BS addr
Bn SUB n
Cn POPD @n 00 RTN
Dn CPR n 0A BK
En INR n 0B RS
Fn DCR n
* This is the address of SWEET-16 in the Integer BASIC ROM. If you
are using ASMDISK (APPLE II PLUS), SWEET-16 begins at $1D89, inside
the assembler.
- 27 -
---------------------------------------------------------------------
1000 .OR $11DE
1010 .TA $0800
1180 HIMM .EQ $4C TOP OF SOURCE
1410 SW16 .EQ $F689 SWEET-16
4080 *
4090 * RENUMBER COMMAND
4100 *
11DE- 20 89 F6 4110 REN JSR SW16 CALL SWEET-17
11E1- 11 CA 00 4120 SET 1,PP POINT AT PP
11E4- 61 4130 LDD @1 GET PP
11E5- 31 4140 ST 1 (R1)=PP
11E6- 12 0A 00 4150 SET 2,10 INCREMENT = 10
11E9- 13 4C 00 4160 SET 3,HIMEM POINT AT HIMEM
11EC- 63 4170 LDD @3 GET HIMEM
11ED- 33 4180 ST 3 (R3)=HIMEM
11EE- 14 DE 03 4190 SET 4,990 START=990
11F1- 21 4200 REN1 LD 1 TEST IF THRU
11F2- D3 4210 CPR 3
11F3- 03 0E 4220 BC REN2 FINISHED
11F5- 41 4230 LD @1 GET # BYTES
11F6- 35 4240 ST 5 SAVE FOR LATER
11F7- 24 4250 LD 4 GET SEQ. NO.
11F8- A2 4260 ADD 2 ADD INCREMENT
11F9- 34 4270 ST 4 STORE NEXT SEQ. NO.
11FA- 71 4280 STD @1 PUT SEQ: NO. IN
11FB- F1 4290 DCR 1 BACK UP POINTER
11FC- F1 4300 DCR 1
11FD- F1 4310 DCR 1
11FE- 21 4320 LD 1 MOVE TO NEXT
11FF- A5 4330 ADD 5
1200- 31 4340 ST 1
1201- 01 EE 4350 BR REN1
1203- 00 4360 REN2 RTN
1204- 60 4370 RTS
SYMBOL TABLE
HIMM 004C SW16 F689 REN 11DE
REN1 11F1 REN2 1203
- 28 -
---------------------------------------------------------------------
APPENDIX A
Operation and Memory Usa~e
Version 3.2 of S-C ASSEMBLER II is a disk-based version, and is
supplied on an Apple DOS 3.2.1 Master Disk.
Contents of the Disk: The disk contains standard Apple DOS 3.2.1, and
seven files. When you boot the disk, if your Apple has Integer BASIC
ROMs, the following catalog will print:
S-C ASSEMBLER II -- DISK VERSION 3.2
COPYRIGHT JUNE #), 1979
DISK VOLUME 001
I 002 HELLO
B 015 ASMDISK
I 008 SAMPLE.SOURCE
I 011 APPLE-TALKER
I 003 USEFUL INFORMATION (BASIC)
B 016 ASMDISK (AUTOSTART)
B 018 ASMDISK (APPLE II PLUS)
(If your Apple does not have Integer BASIC in ROM, or in RAM with the
Pascal Language System, you will get the message "LANGUAGE NOT
AVAILABLE" instead of a catalog when you boot the disk. Don't worry
about this; just type the CATALOG command and you will get one. You
can change the HELLO program to an Applesoft version later.)
The three files with names containing "ASMDISK" are three versions of
the S-C ASSEMBLER II, for the three different configurations of Apple
II computers. If you have an Apple II with the standard monitor ROM
and with Integer BASIC, you can use the shortest version: ASMDISK.
If you have Integer BASIC either in ROM or in the Pascal System RAM
board, with the Autostart Monitor ROM, use the next version: ASMDISK
(AUTOSTART). If you do not have Integer BASIC at all, usethe version
called ASMDISK (APPLE II PLUS). SAMPLE.SOURCE and APPLE-TALKER are
not Integer BASIC programs. They are sample assembly language
programs, and are described on page A-4 in this appendix.
When you have decided which version of the assembler you are going
to use, simply BRUN the file. (ASMDISK (APPLE II PLUS) must be
BRUNned from Applesoft; the other two versions must be BRUNned from
Integer BASIC.)
>BRUN ASMDISK or >BRUN ASMDISK (AUTOSTART)
>BRUN ASMDISK (APPLE II PLUS)
A - 1
---------------------------------------------------------------------
Memory Usage: The S-C ASSEMBLER II program is 3328* bytes long, and
resides from $1000 through $1CFF* in memory. To operate, you need at
least a 24K Apple; remember that Apple DOS uses over 10K for itself.
Your source program is stored with the highest numbered line at the
high end of memory (right under DOS). The lines are kept in
numerical order, the same way as Apple BASIC does it. Locations $CA
and $CB contain the address of the beginning of the source program.
During assembly, a symbol table is built. It begins at $1D00 and
grows toward the source program. (If they meet you get *** MEM FULL
ERR.)
The assembler stores your object code wherever you direct it with the
".OR" or ".TA" directives. If you do not use either of these, the
object code will be stored starting at $0800. You should be careful
not to direct the object code on top of the assembler, your source
program, or the symbol table!
Many locations in page zero are used during editing and assembly.
The only ones which must be protected while you execute your object
program are $4A through $4D and $CA through $CD. The high end of
page one is used as a stack (6502 hardware feature). The low end of
page two is used as an input buffer (Apple Monitor input routine).
* The values are correct for ASMDISK. For ASMDISK (AUTOSTART) the
values are 3584, $1DFF, and $1E00. The values for ASMDISK (APPLE II
PLUS) are 4096, $1FFF, and $2000.
A - 2
---------------------------------------------------------------------
ROM USAGE
Address Purpose
E02A * Get next byte through $E2,E3
E372 * Delete range of lines
E38A * Locate and delete source line
E3C4 * Print quote from page $EB00
E523 * Print line number
E56D,E576 * Locate source line
EED3 * Print error message
F115 * Print "ERR"
F11E,F12C * Set up for LOAD command (cassette)
F137 * Decrement limit
F140 * SAVE command (cassette)
F689 * SWEET-16 Interpreter
FB63 * 16-bit multiply
FC30 Handle screen-editing characters
FCA8 Delay
FC58 Clear screen
FD0C Character input
FD1B Keyboard input
FD67 Read input line
FD9E Print minus sign.
FDDA Print (A-register) in hexadecimal
FDED,FDF0 Character output
FE00 Display memory in hexadecimal
FEFD Cassette tape read
FF3A Ring bell
FFA7 Get hexadecimal number
FFBE Jump into monitor command processor
FFC7 Clear mode byte
FFCC Table of monitor commands
* These routines are not referenced by the Apple II Plus version of
S-C ASSEMBLER II. Also, the routine at FB63 is not referenced from
the Autostart ROM version.
A - 3
---------------------------------------------------------------------
Sample Source Programs: Two sample source programs have been included
on the S-C ASSEMBLER II disk. These are intended to illustrate a few
of the neat features of S-C ASSEMBLER II. However, they have
functional value as well.
APPLE-TALKER consists of three programs. The first, "RCRD", simply
echoes through the Apple speaker whatever it hears at the cassette
input port. If you play a tape that you have previously recorded you
voice on, and adjust the volume control until it sounds best, you can
hear the Apple's rendition of your voice. (It is interesting to try
this with other sounds as well, like music.) The second program,
"READ", is similar; however, it not only listens to the cassette
input port, but also stores the bits in a big buffer. The third
program, "TALK", plays back all the bits from the big buffer. You
can use the basic techniques out of these programs to build some
really fancy frills for your game and demo routines.
SAMPLE.SOURCE contains a subroutine similar to my "SLOWLIST" program,
which was published in MICRO (July, 1978). The difference is that
this version works with DOS 3.2. It is very similar to the speed and
suspension control I have included in S-C ASSEMBLER II.
Useful Information: The last file on the S-C ASSEMBLER II disk is
called "USEFUL INFORMATION (BASIC)". This is a BASIC program which
will BLOAD the assembler and look into certain locations to determine
the current values of the tab stops and the RENUMBER base and
increment. It will then print the data out in a nice little report.
If you make some changes to any of these parameters, this program
could keep you straight as to which version is which. Of course you
can also glean from the program just where these items of information
are kept inside the assembler.
A - 4
---------------------------------------------------------------------
Handy Patches: Many customers have requested patches for the tab
stops, and for the RENUMBER parameters. In the current release of
S-C ASSEMBLER II (Disk Version 3.2), the locations to change are as
follows:
11EF,11F0 (DE 03) base - increment (99010)
11E7,11E8 (0A 00) increment
13A1 (09) first tab stop \
13A5 (0D) second tab stop | column number
1394 (17) third tab stop / minus three
1390 (89) tab control character (Ic)
Some customers have complained about the disappearance of the
assembler's symbol table after RESET and soft re-entry. You can
re-establish all the assembled symbols except the first one by
patching a non-zero value at $1D00 after re-entry.
A - 5
---------------------------------------------------------------------
APPENDIX B
Error Messages
If you make a mistake, S-C ASSEMBLER II will probably catch you.
Here are the error messages you may see.
*** SYNTAX ERROR Misspelled command or bad line number.
*** MEM FULL ERR Either you do not have enough memory
for the source program, or for the
source plus the symbol table, or a
tape read error has occurred.
*** RANGE ERR AT LINE xxxx The relative offset for a branch
instruction was not between -128 and +127.
*** NO LABEL AT LINE xxxx There was no label with an equate (.EQ)
directive.
*** BAD OPCODE AT LINE xxxx The characters in the opcode field are
not a valid opcode or directive.
*** EXTRA DEF AT LINE xxxx The same label was defined more than
once.
*** UNDEF AT LINE xxxx A symbol in the operand field is not
defined.
*** BAD SYMBOL AT LINE xxxx A character in the label field is not
a legal character for a label.
*** BAD ADDRESS AT LINE xxxx This one is a catch-all for syntactical
errors in the operand expression, as well
as for use of a particular address mode
with an opcode that does not support that
mode.
The "xxxx" in the above error messages will be the line number of
the line with the error in it.
In all cases when an error is discovered during assembly, the error
message will be printed and then assembly will abort. You can then
list the indicated line, repair the problem, and try again.
B - 1
---------------------------------------------------------------------
APPENDIX C
Printer Software
The PRT command turns on the self-contained printer software by
inserting its starting address at locations $36 and $37, and then
calling the IOHOOK routine in DOS at $03EA. If you have the Apple
parallel or serial printer interface boards, you will not use the PRT
command. Instead, you should use the DOS command PR#n to activate
your printer.
The self-contained printer software inside S-C ASSEMBLER II is
written especially for the Practical Automation DMTP-6uP printer.
This printer costs less than $700 including power supply and
controller -- a real bargain. All it takes to interface their
controller to the Apple II is to run a twisted pair from their
controller to the game paddle connector inside the Apple II. The
software uses one of the TTL outputs at the game connector as a 300
baud serial interface.
Some features of the printer driver deserve explanation.
The printer normally begins printing 1/4 inch from the left edge of
the paper. PRT provides left margin control, and is set to actually
begin printing in column 11. PRT also keeps track of the number of
lines on the page, and pauses after 56 lines so that you can insert a
new sheet of paper. When the paper is ready, tap the space bar to
continue printing. PRT optimizes speed to minimize the additional
delay during a carriage return. At any time you wish to suspend or
abort printing, you use the space bar or RETURN key, just as in the
SLOW and FAST modes.
A complete listing of the PRT subroutine is included in this
Appendix. After studying it you should be able to create a similar
subroutine for any other printer you may have. Several customers have
written to me telling of their success with interfacing the Integral
Data, Heathkit, DIABLO, and Centronics printers. Others are using
Selectrics or Teletypes.
C - 1
---------------------------------------------------------------------
Listing of the PRT subroutine
1000 .OR $1C00
1010 .TA $0800
1020 *
1030 * PAGE ZERO VARIABLES
1040 *
1050 CH .EQ $24 CURSOR HORIZONTAL POSITION
1060 OLDC .EQ $F0 # CHARS PREV LINE
1070 NEWC .EQ $F1 # CHARS THIS LINE
1080 LNCT .EQ $F4 # LINES THIS PAGE
1090 PRTX .EQ $F5 SAVE X
1100 PRTY .EQ $F6 SAVE Y
1110 *
1120 * ROM-BASED ROUTINES
1130 *
1140 DLAY .EQ $FCA8 DELAY SUBROUTINE
1150 COT1 .EQ $FDF0 COUT AFTER USER EXIT
1160 *
1170 * SOFT RETURN TO ASSEMBLER
1180 *
1190 SOFT .EQ $1003
1200 *
1210 * PRINTER DRIVER
1220 *
1C00- 84 F6 1230 PRNT STY PRTY SAVE X AND Y
1C02- 86 F5 1240 STX PRTX
1C04- C9 8D 1250 CMP #$8D IS IT CR?
1C06- D0 39 1260 BNE PRT5 NO
1C08- A4 F0 1270 LDY OLDC YES, GET # CHARS PREV LINE
1280 * WAS LONGER THAN THIS LINE
1C0A- C8 1290 INY
1C0B- A9 50 1300 PRT1 LDA #80 WAIT A WHILE
1C0D- 20 A8 FC 1310 JSR DLAY MONITOR DELAY
1C10- 88 1320 DEY
1C11- D0 F8 1330 BNE PRT1
1C13- A9 8D 1340 LDA #$8D OUTPUT CR
1C15- 20 66 1C 1350 JSR POUT
1C18- A5 F1 1360 LDA NEWC
1C1A- 85 F0 1370 STA OLDC
1C1C- A9 00 1380 LDA #0
1C1E- 85 F1 1390 STA NEWC
1C20- A2 0A 1400 LDX #10 LEFT MARGIN
1C22- A9 A0 1410 PRT2 LDA #$A0 TAB OVER MARGIN
1C24- 20 68 1C 1420 JSR POT0
1C27- CA 1430 DEX
1C28- D0 F8 1440 BNE PRT2
1C2A- A4 F6 1450 PRT3 LDY PRTY RESTORE X AND Y
1C2C- A6 F5 1460 LDX PRTX
1C2E- E6 F4 1470 INC LNCT COUNT THE LINE
1C30- A5 F4 1480 LDA LNCT SEE IF END OF PAGE
1C32- C9 38 1490 CMP #56 # LINES PER PAGE
1C34- 90 5C 1500 BCC SLW1 NOT END, JOIN FAST LIST
1C36- A9 8D 1510 LDA #$8D YES, OUTPUT CR
1C38- 20 F0 FD 1520 JSR COT1 MONITOR OUTPUT
C - 2
---------------------------------------------------------------------
1C3B- A9 00 1530 LDA #0 CLEAR LINE COUNT
1C3D- 85 F4 1540 STA LNCT
1C3F- F0 5D 1550 BEQ SLW2 JOIN SUSPEND, WAIT FOR KEY
1560 *
1C41- A4 F0 1570 PRT5 LDY OLDC NOT END OF LINE YET
1C43- F0 02 1580 BEQ PRT6 PAST PREVIOUS LINE
1C45- C5 F0 1590 DEC OLDC
1C47- 48 1600 PRT6 PHA SAVE CHAR
1C48- A5 F1 1610 PRT9 LDA NEWC SEE IF LINE FULL
1C4A- C9 46 1620 CMP #70 80-CHAR LINE
1C4C- B0 10 1630 BCS PRT7 IGNORE IF EXCESS
1C4E- C5 24 1640 CMP CH SEE IF NEED TAB
1C50- B0 07 1650 BCS PRT8 NO
1C52- A9 A0 1660 LDA #$A0 SEND BLANKS
1C54- 20 66 1C 1670 JSR POUT TO CATCH UP TO TAB
1C57- F0 EF 1680 BEQ PRT9 ...ALWAYS
1C59- 68 1690 PRT8 PLA
1C5A- 48 1700 PHA
1C5B- 20 66 1C 1710 JSR POUT PRINT IT
1C5E- 68 1720 PRT7 PLA RESTORE CHAR
1C5F- A4 F6 1730 LDY PRTY RESTORE X AND Y
1C61- A6 F5 1740 LDX PRTX
1C63- 4C F0 FD 1750 JMP COT1 MONITOR OUTPUT
1760 *
1770 * PRINTER OUTPUT -- 300 BAUD
1780 *
1C66- E6 F1 1790 POUT INC NEWC COUNT THE CHAR
1C68- A0 0A 1800 POT0 LDY #10 # BITS TO SEND
1C6A- 18 1810 CLC SET UP FOR START BIT
1C6B- 48 1820 POT1 PHA SAVE CHAR
1C6C- B0 05 1830 BCS POT2 1-BIT, SEND MARK
1C6E- AD 59 C0 1840 LDA $C059 SPACE
1C71- 90 03 1850 BCC POT3
1C73- AD 58 C0 1860 POT2 LDA $C058 MARK
1C76- A9 4D 1870 POT3 LDA #77 TIMING LOOP FOR 300 BAUD
1C78- 48 1880 POT4 PHA
1C79- A9 20 1890 LDA #$20
1C7B- 4A 1900 POT5 LSR
1C7C- 90 FD 1910 BCC POT5
1C7E- 68 1920 PLA
1C7F- E9 01 1930 SBC #1
1C81- D0 F5 1940 BNE POT4
1C83- 68 1950 PLA GET CHAR (CARRY IS SET)
1C84- 6A 1960 ROR NEXT BIT INTO CARRY
1C85- 88 1970 DEY
1C86- D0 E3 1980 BNE POT1 SEND NEXT BIT
1C88- 60 1990 RTS
2000 *
2010 * SLOW-LIST ROUTINE
2020 *
1C89- C9 8D 2030 SLST CMP #$8D IS IT CR?
1C8B- D0 1F 2040 BNE SLW4 NO, SO PRINT IT
1C8D- A9 00 2050 LDA #0 YES, SO SLOW DOWN
1C8F- 20 A8 FC 2060 JSR DLAY MONITOR DELAY ROUTINE
1C92- AD 00 C0 2070 SLW1 LDA $C000 CHECK IF KEY TYPED
1C95- 10 13 2080 BPL SLW3 NO, OUTPUT CR
C - 3
---------------------------------------------------------------------
1C97- 8D 10 C0 2090 STA $C010 YES, CLEAR STROBE
1C9A- C9 8D 2100 CMP #$8D IS IT CR?
1C9C- F0 11 2110 BEQ SLW5 YES, SO ABORT
1C9E- AD 00 C0 2120 SLW2 LDA $C000 NO, SO SUSPEND
1CA1- 10 FB 2130 BPL SLW2 WAIT FOR KEY
1CA3- 8D 10 C0 2140 STA $C010 CLEAR STROBE
1CA6- C9 8D 2150 CMP #$8D IS IT CR?
1CA8- F0 05 2160 BEQ SLW5 YES, SO ABORT
1CAA- A9 8D 2170 SLW3 LDA #$8D OUTPUT CR
1CAC- 4C F0 FD 2180 SLW4 JMP COT1 MONITOR OUTPUT
1CAF- 4C 03 10 2190 SLW5 JMP SOFT ...ABORT...
2200 *
2210 * FAST-LIST ROUTINE
2220 *
1CB2- C9 8D 2230 FLST CMP #$8D IS IT CR?
1CB4- D0 F6 2240 BNE SLW4 NO, SO KEEP LISTING
1CB6- F0 DA 2250 BEQ SLW1 YES, SO CHECK FOR KEYS
2260 .EN
SYMBOL TABLE
CH 0024 OLDC 00F0 NEWC 00F1
LNCT 00F4 PRTX 00F5 PRTY 00F6
DLAY FCA8 COT1 FDF0 SOFT 1003
PRNT 1C00 PRT1 1C0B PRT2 1C22
PRT3 1C2A PRT5 1C41 PRT6 1C47
PRT9 1C48 PRT8 1C59 PRT7 1C5E
POUT 1C66 POT0 1C68 POT1 1C6B
POT2 1C73 POT3 1C76 POT4 1C78
POT5 1C7B SLST 1C89 SLW1 1C92
SLW2 1C9E SLW3 1CAA SLW4 1CAC
SLW5 1CAF FLST 1CB2
C - 4
---------------------------------------------------------------------
APPENDIX D
Sources of help with machine language programming are plentiful, but
most of them do not deal with the same microcomputer that is in the
Apple II. Here are some that I have found helpful.
1. MC56500 Microcomputer Family Programming Manual, MOS Technology,
Inc., 1976. This is "from the horse's mouth," so you should probably
get one from your computer store. The same book has been published
by Synertek and Rockwell, who are both second sources for the 6502
chip.
2. Programming the 6502, Rodnay Zaks, SYBEX, 1978.
3. 6502 Applications Book, Rodnay Zaks, SYBEX, 1979.
4. How to Program Microcomputers, William Barden, Jr., Howard W.
Sams & Co., 1977. This covers programming for the 8080, 6800, and
the 6502. It has many simple programs for all three types.
5. Programming a Microcomputer: 6502, Caxton C. Foster,
Addison-Wesley Publishing Company, 1978. Oriented toward the KIM-1,
but has very good explanations and examples of the machine language.
6. Apple-II Reference Manual, Apple Computer Company, 1978. You
already own this one! It has the complete listing of the Apple
ROM-based monitor, and several other ROM-based routines. This is a
gold mine!
7. MICRO -- The 6502 Journal. This is a monthly magazine dedicated
to the 6502 microprocessor. It is published by The COMPUTERIST, P.
0. Box 6502, Chelmsford, MA 01824. Subscriptions are currently $15.00
per year, or 12 issues.
8. Call-A.P.P.L.E., Apple Pugetsound Program Library Exchange.
Another magazine, dedicated strictly to the Apple II. Free to
members, and membership is $10; write to 8710 Salty Drive N.W.,
Olympia, WA 98502. Published nine times per year.
9. APPLE-GRAM, the newsletter of the Dallas, Texas, Apple Corps.
Subscription is $12/year from The Apple Corps, P. 0. Box 5537,
Richardson, TX 75080.
D - 1
---------------------------------------------------------------------
10. The Apple Assembly Line, a newsletter specifically for those who
are using assembly language with their Apple computer. Subscription
is $12/year from S-C SOFTWARE, P. 0. Box 5537, Richardson, TX 75080.
One of the best ways to learn assembly or machine language is to
examine carefully the work of others. I suggest you use the
dis-assembler which is in ROM in your Apple II to disassemble
everything in sight. Look at how Integer BASIC and Applesoft are
coded. Look inside S-C ASSEMBLER II and see how it works. You can
even try making some changes and add in the features you think I
should have included in the first place!
Sources of help with learning to use SWEET-16 are even more limited.
Here are the ones I have found:
1. "SWEET-16 -- The 6502 Dream Machine", BYTE, November, 1977, pages
150-159. This is the definitive article written by the creator of
SWEET-16, Steve Wozniak.
2. Apple II Reference Manual, pages 96-99. This is the assembly
listing of SWEET-16, as found in your Apple II.
3. Programmers Aid #1 Installation and Operating Manual.
This is the book that comes with the Programmers Aid #1 ROM. It
includes listings of programs coded in SWEET-16 language:
Renumber/Append, pages 76-79; and 6502 Relocation Subroutine, pages
80-81.
4. Occasional articles in Dr. Dobb's, MICRO, et cetera.
D - 2
---------------------------------------------------------------------
Ads
---------------------------------------------------------------------
Double Precision Floating Point for APPLESOFT
A Brand New Tool for Every Apple Owner!
* Apple II or Apple II Plus
* Applesoft ROM Card or Language System
* 21-digit precision with arithmetic, INPUT, and PRINT
* Subroutines for ABS, SQR, LOG, EXP, SIN, COS, and ATN
* Efficient and compact assembly language coding:
Only uses 2048 bytes of RAM
Speed comparable to normal Applesoft arithmetic
* Automatically loaded beneath your Applesoft program
* Nearly standard syntax, simple interface using "&"
feature of Applesoft language
* Disk includes nine sample programs
* Big 25-page Reference Manual
Just $50 at your local Apple Dealer!
Includes diskette with nine sample
programs and a 25-page reference
manual.
S-C SOFTWARE *
P.O. Box 5537 Apple and Applesoft are trademarks
Richardson,TX75080 of the Apple Computer Company.
(214) 324-2050
---------------------------------------------------------------------
S-C ASSEMBLER II Faster!
Version 4.0 Easier to use!
More Powerful!
New Editing Features
* Automatic line numbers, * Memory use display
with selectable increment.
* Escape IJKM cursor control
* Append programs from disk. with or without Autostart ROM.
* Renumber with selectable * Two user programmable system
base, increment, and start. commands.
* And MUCH MORE!
New Assembly Features
* FASTER! Up to 6000 lines * Up to 32-character labels.
per minute!
* Use ASCII literals in address
* Assembles from multiple expressions.
source files, using ".IN"
directive. * Local labels for more readable
modular programs.
* Stores object code directly
on binary file, using ".TF" * Alphabetized symbol table.
directive.
* User programmable directive.
* Listing control with PG * Improved error messages, with
(page eject), LIST OFF, automatic display of bad line
and LIST ON. to simplify correction.
* And MUCH MORE!
S-C ASSEMBLER II Version 4.0 is compatible with both the Apple II and
the Apple II Plus. At least 24K RAM is required, and at least one
disk drive.
S-C ASSEMBLER II Version 4.0 is
available now as an upgrade kit only.
The upgrade kit includes a documen- S-C SOFTWARE
tation packet and a new diskette, for
only $22.50. Proof of ownership of a P.O. Box 5537
previous disk version is required. Richardson, TX 75080
(Version 3.2 is still available for
only $35.00) (214) 324-2050
---------------------------------------------------------------------