Chuck Lane, c@cithex.bitnet, writes with some questions about Action!,
the "premier" compiled language for the 8 bit Atari. Also John Sangster
had some questions, and no doubt some other new Action! users will be
interested in this.
Bruce Langdon who used to contribute a lot of Action! code and hints to this
newsgroup sent me a lot of material. I will post some of it here--
1) reply on negative steps in DO loops, from the now-defunct Action! BBS
written by the author of Action!, Clint Parker. WHILE constructs
will let you use negative steps, and Clint explains why DO doesn't allow
negative steps.
2) Action! bug sheet number 3; part 2 of this bug sheet tells how
to identify the version number of your cartridge.
---------------------------------------------------------------------------
#: 108 size: 304
Sb: re: #105 - Negative STEPs
Fm: 1 SYSOP
#108 23:14:27 15-May-84
Warren,
No, that isn't the problem. The problem has to do with the code
generated for the ending condition. It is different for positive and negative
step sizes. There is no way to generate it for both cases at compile time
without making the FOR loop code much larger and slower.
- Clint
replies:
114
-------------------------------------------------------------------------
ACTION! BUG SHEET #3 - part 1
This document supercedes the previous
two bug sheets published for ACTION!
November 6, 1984
-------------------------------------
GENERAL INFORMATION
Before getting to the bad stuff (the
bugs), here are some goodies about
ACTION! which we would like to pass
on to you:
ACTION! BULLETIN BOARD
In order to speed the distribution of
ACTION!-related information, Clinton
Parker (author extrordinaire of
ACTION!) has set up a bulletin board
system. His company, Action Computer
Services, is located in Rochester,
New York, and you may try calling his
bulletin board at
(716) 235-3394
and hit [RETURN] when asked for a
password.
Clinton welcomes comments,
suggestions, and praise. Complaints
and their perpetrators will be
ignored. That is, of course, our
joke. But please, if you must offer
criticism, keep the remarks construc-
tive. And remember that OSS is
responsible for distribution, etc.
Clinton is the author and is (we
feel) generous in making himself so
accessible.
TIPS ON TEMPS
The magazine article titled "Lights,
Camera, Action!" (by Dave Plotkin)
which appeared in the July issue of
ANTIC featured a set of routines to
facilitate writing ACTION!-based
interrupt handlers.
The article gave the listings for two
routines (more properly, two DEFINEs)
named "SaveTemps" and "GetTemps".
These routines are adequate only if
no math beyond addition and
subtraction is performed in the
interrupt service routine. The
following versions of these two
routines will work properly in the
more general case:
Make the following DEFINEs in your
program before you declare your
interrupt routine (comments may be
omitted-- they exist only for clari-
fication):
DEFINE SaveTemps=
"[
$A2 $07 ; LDX #7
$B5 $C0 ; LOOP LDA $C0,X
$48 ; PHA
$B5 $A0 ; LDA $A0,X
$48 ; PHA
$B5 $80 ; LDA $80,X
$48 ; PHA
$B5 $A8 ; LDA $A8,X
$48 ; PHA
$CA ; DEX
$10 $F1 ; BPL LOOP
$A5 $D3 ; LDA $D3
$48 ; PHA
]"
DEFINE GetTemps=
"[
$68 ; PLA
$85 $D3 ; STA $D3
$A2 $00 ; LDX #0
$68 ; LOOP PLA
$95 $A8 ; STA $A8,X
$68 ; PLA
$95 $80 ; STA $80,X
$68 ; PLA
$95 $A0 ; STA $A0,X
$68 ; PLA
$95 $C0 ; STA $C0,X
$E8 ; INX
$E0 $08 ; CPX #8
$D0 $EF ; BNE LOOP
]"
Use these routines inside your
interrupt routine as follows:
; Your interrupt routine.
PROC InterruptRoutine()
; Local declarations, if any.
BYTE a, b, c, etc.
; First line of code within
; procedure
SaveTemps
... ; Your interrupt
; code goes here.
GetTemps ; Last line of code
; within procedure.
[$6C OldVBI] ; A special way to
; end for VBIs- see
; below.
For example, the following program
will set up the routine ChangeColor
as a vertical blank interrupt routine
(hit the START key to exit the
program):
DEFINE SaveTemps=
"[ $A2 $07 $B5 $C0 $48
$B5 $A0 $48 $B5 $80
$48 $B5 $A8 $48 $CA
$10 $F1 $A5 $D3 $48 ]"
DEFINE GetTemps=
"[ $68 $85 $D3 $A2 $00 $68
$95 $A8 $68 $95 $80 $68
$95 $A0 $68 $95 $C0 $E8
$E0 $08 $D0 $EF ]"
CARD OldVBI ; Will hold previous
; contents of vertical
; blank interrupt
; vector.
; This procedure will change the
; background color to random values.
; The main routine will set up this
; code to operate during the
; deferred vertical blank interrupt.
PROC ChangeColor()
BYTE hue, lum
SaveTemps
hue = Rand( 16 )
lum = Rand( 16 )
SetColor(2,hue,lum)
GetTemps
[ $6C OldVBI ] ; Vertical blank
; interrupts must end
; like this ($6C is a
; 6502 indirect jump
; instruction).
PROC Test() ; Main routine
BYTE critic=$42, ; Critical I/O flag
console=$D01F ; Console key
; hardware location
CARD VBIvec=$224 ; Deferred vertical
; blank interrupt vector
; You must install a VBI
; routine like this:
critic = 1
OldVBI = VBIvec
VBIvec = ChangeColor
critic = 0
; ChangeColor is now running
; as the vertical blank interrupt
; routine-- since our mainline
; code has nothing more to do,
; we just go into a loop waiting
; for the START key to be
; pressed.
WHILE console&1
DO
OD
; Now turn off the VBI routine.
critic = 1
VBIvec = OldVBI
critic = 0
RETURN
This method of saving and restoring
ACTION zero page variables may also
be used to write BASIC machine
language subroutines in ACTION! Your
main ACTION routine should then have
SaveTemps as the first executable
line, and GetTemps as the last
executable line before the RETURN
statement.
actbug2 508119184 302 52 100600 10553 `
ACTION! BUG SHEET #3 - part 2
-------------------------------------
BUGS IN THE ACTION! CARTRIDGES
The following is a list of all bugs
we currently know exist in the
ACTION! cartridge. We list these
bugs separately from those in the
RunTime library and/or the PAD disk
or ToolKit, which occur in following
pages. Each bug is described in
detail and, when possible, bug fixes
are given. Many of these bugs deal
only with specific versions of
ACTION!. To find out which version
of ACTION! you own, type the
following from the ACTION! monitor:
?$B000 [RETURN]
Below is an actual copy of what
printed following that command for
one of our cartridges.
45055,$B000 = 0 $0730 48 1840
^
To find out the version number, look
at the character to the right of the
equals sign (here printed with a
caret under it). The "0" in this
case implies that the cartridge is
version 3.0. If yours has a "6", you
own version 3.6, etc. As of the date
of this bug sheet, the current
cartridge version is 3.6.
1. OFFSETS -- Using a TYPE
declaration will generate a
spurious error whenever the code
offset (contents of location $B5)
is non-zero.
Affects: All versions of the
cartridge to date. (Presumably
only noticed if using RunTime
disk, though.)
Fix: Make all TYPE declarations
before changing the code offset.
Example:
; Beginning of program --
; First, declare TYPEs
TYPE IOCB =
[
BYTE Id, Devnum,
Command, Status
]
; Then, if desired,
; change offset
SET $B5 = $1000
; example: offset=4096
2. OFFSETS -- Using a code offset
greater than $7FFF (i.e., a
negative offset, if you consider
it to be of type INT) causes the
compiler to generate improper
code.
Affects: All versions,
especially when used with the
RunTime disk.
Fix: No direct fix, but you may
use the relocator program
described later in this document
(which is also usable with
embly language).
3. ATARI DOS -- Exiting to Atari DOS
from ACTION! can cause a system
crash if DUP.SYS is not present
on the disk in drive 1.
Affects: All versions, but only
when used with Atari DOS.
Fix: Use DOS XL (or be careful
when exiting to DOS).
4. ARRAYS AND ELSEIF -- We have just
learned that there is a
relatively obscure bug in ACTION!
related to the use of ELSEIF. In
particular, statements similar to
the form
ELSEIF a(i) = 0 THEN ...
(where a is an ARRAY and i is a
CARD OR INT), or statements like
ELSEIF p^ = 0 THEN
(where p is a POINTER) produce
incorrect code.
Affects: All versions
Fix: There is no direct fix at
this time. The best way around
the problem seems to be to code
something like this:
t = a(i) ; t is an INTEGER
...
ELSEIF t=0 THEN ...
This works properly.
5. WRITING OBJECT FILES -- If a
monitor Write command fails
because of a disk error (e.g.,
disk full, 162, or device done,
144), the IOCB is not properly
closed. If the disk is changed
before another disk operation is
performed, the new disk can have
invalid data written to it.
Affects: All versions
Fix: If you get an error when
writing an ACTION! object file,
type the following command to the
monitor:
X Close( 1 ) [RETURN]
You can then erase the file which
...