Chapter
Twelve
Atari Hardware Control Statements
The Atari Hardware Control Statements allow easy
access to some of the computer's graphics and audio capabilities. The statements
in this group are COLOR, GRAPHICS, PLOT, POSITION, DRAWTO, SETCOLOR, LOCATE, and
SOUND. XGR ($BA50) The GRAPHICS statement determines the current graphics
mode. The XGR simulation routine executes the GRAPHICS statement. The XGR routine
first closes IOCB 6. It then calls an Execute Expression subroutine to evaluate the
graphics mode value and convert it to an integer. XGR sets up to open the screen
by putting the address of a string "S." into INBUFF. It creates an AUX1
and AUX2 byte from the graphics mode integer. XGR calls a BASIC I/O routine which
sets up IOCB 6 and calls CIO to open the screen for the specified graphics mode.
Like all BASIC routines that do I/O, XGR jumps to the IOTEST routine, which determines
what to do next based on the outcome of the I/O. XCOLOR ($BA29) The COLOR
statement is simulated by the XCOLOR routine. XCOLOR calls a subroutine of Execute
Expression to evaluate the color value and convert it to an integer. XCOLOR saves
this value (MOD 256) in BASIC memory location COLOR ($C8). This value is later retrieved
by XPLOT and XDRAWTO. XSETCOLOR ($89B7) The routine that simulates the SETCOLOR
statement, XSETCOLOR, calls a subroutine of Execute Expression to evaluate the color
register specified in the tokenized line. The Execute Expression routine produces
a one-byte integer. If the value is not less than 5 (the number of color registers),
XSETCOLOR exits via the Error Handling Routine at entry point ERVAL. Otherwise, it
calls Execute Expression to get two more integers from the tokenized line. 91
Chapter
Twelve
To calculate the color value, XSETCOLOR multiplies the tirst integer
(MOD 256) byl6 and adds the second (MOD 256). Since the operating system's five color
registers are in consecutive locations starting at $2C4 XSETCOLOR uses the register
value specified as an index to the proper register location and stores the color
value there. XPOS ($BA16) The POSITION statement, which specifies the X and
Y coordinates of the graphics cursor, is simulated by the XPOS routine. XPOS uses
a subroutine of Execute Expression to evaluate the X coordinate of the graphics window
cursor and convert it to an integer value. The two-byte result is stored in the operating
system's X screen coordinate location (SCRX at $55). This is the column number or
horizontal position of the cursor. XPOS then calls another Execute Expression subroutine
to evaluate the Y coordinate and convert it to a one-byte integer. The result is
stored in the Y screen coordinate location (SCRY at $54). This is the row number,
or vertical position. XLOCATE ($BC95) XLOCATE, which simulates the LOCATE
statement, first calls XPOS to set up the X and Y screen coordinates. Next it initializes
IOCB 6 and joins a subroutine of XGET to do the actual I/O required to get the screen
data into the variable specified. XPLOT ($5A76) XPLOT, which simulates the
PLOT statement, first calls XPOS to set the X and Y coordinates of the graphics cursor.
XPLOT gets the value that was saved in COLOR ($C8) and joins a PUT subroutine (PRCX
at $BAA1) to do the I/O to IOCB 6 (the screen). XDRAWTO ($BA31) The XDRAWTO
routine draws a line from the current X,Y screen coordinates to the X,Y coordinates
specified in the statement. The routine calls XPOS to set the new X,Y coordinates.
It places the value from BASIC's memory location COLOR into OS location SVCOLOR ($2FB).
XDRAWTO does some initialization of IOCB 6 specifying the draw command ($11). It
then calls a BASIC I/O routine which finishes the 92
Chapter
Twelve
initialization of IOCB 6 and calls CIO to draw the line. Finally,
XDRAWTO jumps to the IOTEST routine, which will determine what to do next based on
the outcome of the I/O. XSOUND ($K9DD) The Atari computer hardware uses a
set of memory locations to control sound capabilities. The SOUND statement gives
the user access to some of these capabilities. The XSOUND routine, which simulates
the SOUND statement, places fixed values in some of the sound locations and user
specified values in others. The XSOUND routine uses Execute Expression to get four
integer values from the tokenized statement line. If the first integer (voice) is
greater than or equal to 4, the Error Handling Routine is invoked at ERVAL. The OS
audio control bits are all turned off by storing a 0 into $D208. Any bits left on
from previous serial port usage are cleared by storing 3 in $D20F. The Atari has
four sound registers (one for each voice) starting at $D200. The first byte of each
two-byte register determines the pitch (frequency). In the second byte, the four
most significant bits are the distortion, and the four least significant bits are
the volume. The voice value mentioned earlier is multiplied by 2 and used as an index
into the sound registers. The second value from the tokenized line is stored as the
pitch in the first byte of one of the registers ($D200, $D202, $D204, or $D206),
depending on the voice index. The third value from the tokenized line is multiplied
by 16 and the fourth value is added to it to create the value to be stored as distortion/volume.
The voice, times 2, is again used as an index to store this value in the second byte
of a sound register ($D201, $D203, $D205, or $D207). The XSOUND routine then returns
to Execution Control. 93
<-Chapter
11Chapter 13->