THE LONG-AWAITED Line-A DOCUMENT
In order to provide "quick-and-dirty" access to the assembler-
level graphics routines, ATARI engineers have set up the 68000's
Line-A exception as an interface to several useful routines. The
Line-A interface is faster than going through GEM's VDI and has
some extra features. Also, Line-A calls require less application
code than their VDI counterparts. Of course, Line-A doesn't
replace the VDI completely, but if an application only needs a
few primitive graphics functions (and wants maximum performance),
then Line-A is sufficient (and optimal).
The Line-A interface is provided for the hacker-at-heart and
no claims are made about its ease of use. The interface may seem
unusually inconsistent, but it was not designed; it simply fell
out as a freebie from the low-level VDI primitives interface.
That is, these routines are the heart of the VDI.
The Line-A interface consists of 15 opcodes. The calls to
Line-A are assembled as 1-word instructions, the highest 4 bits
of which are 1010 ($A, hence Line-A) and the lower 12 bits of
which are used as the opcode field. Following is a description
of the 15 opcodes:
0 = Initialization.
1 = Put pixel.
2 = Get pixel.
3 = Line.
4 = Horizontal line.
5 = Filled rectangle.
6 = Line-by-line filled polygon.
7 = BitBlt.
8 = TextBlt.
9 = Show mouse.
10 = Hide mouse.
11 = Transform mouse.
12 = Undraw sprite.
13 = Draw sprite.
14 = Copy raster form.
15 = Seedfill. (exists only in versions of TOS after the 1st release)
The Line-A routines have some features that the VDI doesn't
support. BitBlt supports half-tone patterns on the source and
TextBlt supports all 16 BitBlt logic operations, not just the 4
GEM VDI writing modes. In addition to these straight-forward
extensions Line-A also allows the adventurous programmer to
experiment with special effects. The BitBlt is especially
generous in this area.
(0) Initialization
... ...
dc.w $A000 ; Init the Line-A.
... ...
input: none.
output: d0 = ptr to the base address of Line-A interface variables.
a0 = ptr to the base address of Line-A interface variables.
a1 = ptr to array of ptrs to the 3 system font headers.
a2 = ptr to array of ptrs to the 15 Line-A routines.
note: The value returned in a0 is the sine qua non of the Line-A
interface. Inputs to all the other Line-A operations are
made relative to this value, i.e., the Line-A interface
variables are contained in a structure pointed to by a0.
The offsets of these variables in the structure are given
below.
bugs: In the first TOS release, a2 is not returned as described
above. Instead, it is preserved across the Line-A call.
See Example Program #2 at the end of this document for the
technique that makes a2 point to the proper place.
(1) Put pixel
... ...
dc.w $A001 ; Plot a pixel at x,y.
... ...
input: INTIN[0] = pixel value.
PTSIN[0] = x coordinate.
PTSIN[1] = y coordinate.
output: none.
note: For a discussion of the CONTRL, INTIN, PTSIN, INTOUT, & PTSOUT
arrays, see the GEM VDI manual.
(2) Get pixel
... ...
dc.w $A002 ; Get the pixel at x,y.
... ...
input: PTSIN[0] = x coordinate.
PTSIN[1] = y coordinate.
output: d0 = pixel value.
(3) Line
... ...
dc.w $A003 ; Draw a line between (x1,y1) and (x2,y2).
... ...
input: X1 = x1 coordinate.
Y1 = y1 coordinate.
X2 = x2 coordinate.
Y2 = y2 coordinate.
COLBIT0 = bit value for plane 0.
COLBIT1 = bit value for plane 1.
COLBIT2 = bit value for plane 2.
COLBIT3 = bit value for plane 3.
LNMASK = line style mask.
WMODE = writing mode.
LSTLIN = always set this to -1, if using xor mode.
else ignore it.
output: LNMASK is rotated to align with right-most endpoint.
quirks: 1) If the line is horizontal, LNMASK is a word-aligned
pattern, not a line style. That is, a bit other than
bit 15 of LNMASK may be used at the left-most endpoint.
2) As the foregoing references imply, the line is always
drawn from left to right, not from (X1,Y1) to (X2,Y2).
Thus, LNMASK is always applied from left to right.
note: Because of the quirks, an application cannot depend upon the
phase of the LNMASK being properly updated between calls
to line-drawing primitives. If the phase is critical, the
application must compute and init LNMASK before each line
is drawn.
LNMASK is applied to the line-drawing DDA algorithm along
the direction of greater delta. If delta Y is greater than
delta X, then LNMASK is applied in the Y direction.
These line-drawing quirks and notes apply to the GEM VDI, too.
(4) Horizontal line
... ...
dc.w $A004 ; Draw a line from (x1,y1) to (x2,y1).
... ...
input: X1 = x1 coordinate.
Y1 = y1 coordinate.
X2 = x2 coordinate.
COLBIT0 = bit value for plane 0.
COLBIT1 = bit value for plane 1.
COLBIT2 = bit value for plane 2.
COLBIT3 = bit value for plane 3.
WMODE = writing mode.
PATPTR = ptr to the fill pattern.
PATMSK = pattern index.
MFILL = multi-plane pattern flag.
output: none.
(5) Filled rectangle
... ...
dc.w $A005 ; Draw a filled rectangle with upper left corner at
; (x1,y1) and lower right corner at (x2,y2).
... ...
input: X1 = x1 coordinate.
Y1 = y1 coordinate.
X2 = x2 coordinate.
Y2 = y2 coordinate.
COLBIT0 = bit value for plane 0.
COLBIT1 = bit value for plane 1.
COLBIT2 = bit value for plane 2.
COLBIT3 = bit value for plane 3.
WMODE = writing mode.
PATPTR = ptr to the fill pattern.
PATMSK = fill pattern index.
MFILL = multi-plane fill pattern flag.
CLIP = clipping flag.
XMINCL = x minimum for clipping.
XMAXCL = x maximum for clipping.
YMINCL = y minimum for clipping.
YMAXCL = y maximum for clipping.
output: none.
(6) Line-by-line filled polygon.
... ...
dc.w $A006 ; Draw 1 scan-line of a filled polygon.
... ...
input: PTSIN[] = array of polygon vertices.
((x1,y1),(x2,y2)...,(xn,yn),(x1,y1))
CONTRL[1] = n = number of vertices.
Y1 = y coordinate of scan-line to fill.
COLBIT0 = bit value for plane 0.
COLBIT1 = bit value for plane 1.
COLBIT2 = bit value for plane 2.
COLBIT3 = bit value for plane 3.
WMODE = writing mode.
PATPTR = ptr to the fill pattern.
PATMSK = fill pattern mask.
MFILL = multi-plane fill pattern flag.
CLIP = clipping flag.
XMINCL = x minimum for clipping.
XMAXCL = x maximum for clipping.
YMINCL = y minimum for clipping.
YMAXCL = y maximum for clipping.
output: X1 and X2 are clobbered.
note: The 1st endpoint must be repeated at the end of the list of
n endpoints.
(7) BitBlt
... ...
dc.w $A007 ; Perform a BIT BLock Transfer.
... ...
input: a6 = ptr to a structure of input parameters.
output: none.
BIT BLT PARAMETER BLOCK OFFSETS
B_WD equ +00 ; width of block in pixels
B_HT equ +02 ; height of block in pixels
PLANE_CT equ +04 ; number of consecutive planes to blt {D}
FG_COL equ +06 ; foreground color (logic op index:hi bit) {D}
BG_COL equ +08 ; background color (logic op index:lo bit) {D}
OP_TAB equ +10 ; logic ops for all fore and background combos
S_XMIN equ +14 ; minimum X: source
S_YMIN equ +16 ; minimum Y: source
S_FORM equ +18 ; source form base address
S_NXWD equ +22 ; offset to next word in line (in bytes)
S_NXLN equ +24 ; offset to next line in plane (in bytes)
S_NXPL equ +26 ; offset to next plane from start of current plane
D_XMIN equ +28 ; minimum X: destination
D_YMIN equ +30 ; minimum Y: destination
D_FORM equ +32 ; destination form base address
D_NXWD equ +36 ; offset to next word in line (in bytes)
D_NXLN equ +38 ; offset to next line in plane (in bytes)
D_NXPL equ +40 ; offset to next plane from start of current plane
P_ADDR equ +42 ; address of pattern buffer (0:no pattern) {D}
P_NXLN equ +46 ; offset to next line in pattern (in bytes)
P_NXPL equ +48 ; offset to next plane in pattern (in bytes)
P_MASK equ +50 ; pattern index mask
P_BLOCK_LEN equ 76 ; the parameter block must be 76 bytes long
*** notes ***
parameters marked with {D} may be altered during the course
of the BIT BLT execution
contents of OP_TAB
+00 byte logic operation employed when foreground and background color
bits for current plane are both clear (0)
+01 byte logic operation employed when current plane's foreground color
bit is clear (0) and background color bit is set (1)
+02 byte logic operation employed when current plane's foreground color
bit is set (1) and background color bit is clear (0)
+03 byte logic operation employed when foreground and background color
bits for current plane are both set (1)
0. PREFACE
Before one floggles one's tormented mind with this tangled nest of
arcane knowledge, one ought to be intimately familiar with chapter 6
of the GEM VDI manual. the author assumes that one's knowledge of Raster
matters is quite wide and that the rudiments of BIT BLTting are below
discussion. If the author is mistaken then he's sorry (and you're
about to become lost in the sea of woe, oh ho!).
I. PARAMETER BLOCK
the BIT BLT is accessed via a 76 byte parameter block. Register A6 points
to the head of this block upon LINE A entry. Only the first 52 bytes of
the block need be attended to by the abuser. The remaining space is
maintained internally by the BLT. Note that in the following explanations,
parameters will be refered to by their symbolic offsets into the parameter
block.
II. MEMORY FORMS
memory forms are something like a cabbage patch. (a cabbage patch is a
place for mentally retarded programmers). let's face it, forms are nothing
like a cabbage patch. if you think they are, go back and read chapter 6
in the GEM VDI manual. if you know anything at all about memory forms,
you know they are almost entirely but not totally unlike a garbage can.
one difference is that memory forms are of two sexes, source and destination.
each sex is defined by the same four parameters: form block address,
form block width, offset to next contiguous word, and offset to next plane.
S_FORM and D_FORM point to the first words of the source memory form
and destination memory forms, respectively. these addresses must fall on
word boundries or severe hardships will fall (as will address exceptions)
like plagues upon the ancient egyptians.
S_NXWD and D_NXWD are offsets to the next word in a plane of the memory
form. for example, in the monochrome mode the value is 2 while a value
of 4 is used in medium resolution and 8 is applicable to low resolution.
S_NXLN and D_NXLN are form widths for source and destination. ( i can't
remember which one belongs to the source form and which one belongs to the
destination form). These widths must be even byte values, as you know, for
they represent the offset from one row of the form to the next and forms
must be word aligned and an integral number of words wide. (hint: the
hi rez screen value is 90 while lo and medium rez values are 160)
S_NXPL and D_NXPL are offsets from the start of one plane to the start of
the next plane. because of the ST screen's interleaved plane structure,
this value is always two (2). alternative universes allow for a series
of contiguous planes where NXPL values are the number of bytes in each plane.
thus , it is possible to BLT from the contiguous universe into the
interleaved ST universe and vice versa.
the actual bit alligned blocks of memory are defined within the form
by an upper left anchor point, a pixel width, and a pixel height:
(S_XMIN, S_YMIN, B_WD, and B_HT). the location in the destination form
is defined by an anchor point (D_XMIN, D_YMIN). no harm will come if
these two areas overlap. Note that no clipping is performed andthere is no
checking to determine whether the bit blocks fall within the confines of
the encompasing memory forms. finally, the number of planes to
be transfered (the number of itterations of the BLT algorithm) is
contained in the PLANE_CT word.
III. RASTER OPERATIONS
OP_TAB is a table of four RASTER OP codes. Each of the byte wide entries
in OP_TAB contain a code for one of the sixteen logical operations between
consenting source and destination blocks. For each plane, the logical
operation is chosen by indexing into the OP_TAB with a value derived from
FG_COL and BG_COL words. For a given plane "n", bit "n" of FG_COL is the hi
bit of the two bit index value and bit "n" of BG_COL is the lo bit of
the index value.
for those with a furniture fetish, here is a table:
FG(n) BG(n) OP_TAB entry
----- ----- ------------
0 0 first entry
0 1 second entry
1 0 third entry
1 1 fourth entry
IV. PATTERNS
Patterns are word wide, word aligned images that are logically anded
with the source prior to the logical combination of source with destination.
Patterns are packed in an imaginary grid anchored at the upper left corner
(0,0) of the destination memory form.
Patterns are 16 bits wide and repeated every 16 pixels horizontally.
patterns are an integral power of 2 in height and repeat vertically
at that frequency.
The source is shifted into alignment with the destination rectangle prior
to the combination of source with pattern.
Thus, the relationship between source and pattern is dependent upon the
X,Y positioning of the destination rectangle.
P_ADDR points to the first word of the pattern. If this pointer is 0, a
pattern is not combined with the source rectangle.
P_NXLN is the offset (in bytes) between consecutive words in the pattern.
For reasons too inane to go into here, this number should be an integral
power of 2 (such as 2,4, or 8)
P_NXPL is the offset (in bytes) from the beginning of a plane to the
beginning of the next plane. In the case of a single plane pattern used
in a multi plane environment, this value would be zero. thus, the same
pattern is repeated through all planes.
P_MASK works with P_NXLN to specify the length of the pattern.
The length (in words) of the pattern must be an integral power of 2.
if P_NXLN = 2 ** n
then P_MASK = (length in words -1) << n
... i don't know why. go ask your father.
V. BAG 'O TRICKS
Q. I want to BLT from a single plane source to multi plane destination.
A. That's not in the form of a question. And besides, i can't think
with that water pick spurtin in my ear. Hey, that's my cat your puttin in
the Cuisinart. Wha the fuh you think your doin bustin into my word processor
like this. Hey bud, stay away from that delete key. Hey moe foe, i'm
serious. How'd you like an unexpected interrupt ?
Q. This key is loaded and it's pointed at your bonus check.
A. ok,ok... i'll talk.
S_NXPL =0 => the same source plane is BLTted to all destination planes
Q. yea, i know that but what logic ops do i use ?
A. to map 1's to foreground color and 0's to background color
set OP_TAB to:
offset logic op
+00 00 all zeros
+01 04 D' <- [not S] and D
+02 07 D' <- S or D
+03 15 all ones
load foreground color into FG_COL and background color into BG_COL
Q. you wanna buy some lake bottom property?
A. to map 1's to foreground color and make 0's transparent
set OP_TAB to:
offset logic op
+00 04 D' <- [not S] and D
+01 04 D' <- [not S] and D
+02 07 D' <- S or D
+03 07 D' <- S or D
load foreground color into FG_COL
it doesn't matter what you put into BG_COL
don't forget to set S_NXPL to 0
enough smalltalk, let's get down to the core of the issue.
Here are some of my Aunt Marge's flavorful BIT BLT recipes:
1. BLT a pattern without Source to the Destination.
For this number, we'll need a word of ones. Label it "ones:"
next, point S_FORM at "ones". Set S_NXLN, S_NXPL, S_NXWD,
S_XMIN, and S_YMIN to 0. Set up the pattern as you usually would
and before you know it, you'll have a wonderful steaming pattern
filled rectangle.
2. this is a nice way to make a sprite like device.
o you will need to bake a monoplane mask. everywhere there is a
1 in the mask, the background will be removed. wherever a 0 falls,
the background is left intact.
set OP_TAB to:
offset logic op
+00 04 D' <- [not S] and D
+01 04 D' <- [not S] and D
+02 07 D' <- S or D
+03 07 D' <- S or D
load foreground color into FG_COL
it doesn't matter what you put into BG_COL
o next, take a monoplane form (or multiplane form) and "or" it (OP 07)
into the area that you just scooped out with the mask
feeds a family of four.
(8) TextBlt
... ...
dc.w $A008 ; Perform a TEXT BLock Transfer of 1 character.
... ...
input:
WMODE = writing mode.(0-3 => VDI modes
4-19 => BitBlt modes)
TEXTFG = text foreground color.
TEXTBG = text background color. (used for modes 4-19)
FBASE = ptr to start of font data. (font form)
FWIDTH = width of font form.
SOURCEX = x coord of character in font form.
SOURCEY = y coord of character in font form.
DESTX = x coord of character on screen.
DESTY = y coord of character on screen.
DELX = width of character.
DELY = height of character.
STYLE = vector of TextBlt special effects flags.
LITEMASK = the mask to use in lightening text.
SKEWMASK = the mask to use in skewing text.
WEIGHT = the width by which to thicken text.
ROFF = offset above character baseline when skewing.
LOFF = offset below character baseline when skewing.
SCALE = scaling flag. (0 => no scaling.)
XDDA = accumulator for x dda.
DDAINC = fractional amount to scale up or down.
SCALDIR = scale direction flag. (0 => down)
CHUP = character rotation vector.
MONO = monospaced font flag.
SCRTCHP = ptr to start of text special effects buffer.
SCRPT2 = offset of scaling buffer in above buffer.
output: none.
(9) Show mouse
... ...
dc.w $A009 ; Show the mouse.
... ...
input: see GEM VDI manual.
output: none.
(10) Hide mouse
... ...
dc.w $A00A ; Hide the mouse.
... ...
input: see GEM VDI manual.
output: none.
(11) Transform mouse
... ...
dc.w $A00B ; Transform the mouse's form.
... ...
input: see GEM VDI manual.
output: none.
(12) Undraw sprite
... ...
dc.w $A00C ; Undraw the previously drawn sprite.
... ...
input: a2 = ptr to sprite save block.
note: The sprite save block is used to save the screen
underneath the sprite. Its size is 10 bytes + 64 bytes
per plane, i.e. (10 + VPLANES * 64) bytes.
output: clobbers a6. ("C" programmers beware.)
(13) Draw sprite
... ...
dc.w $A00D ; Draw a sprite.
... ...
input: d0 = x hot-spot.
d1 = y hot_spot.
a0 = ptr to sprite definition block.
a2 = ptr to sprite save block.
SPRITE DEFINTION BLOCK LAYOUT
ds.w 1 x offset of hot-spot.
ds.w 1 y offset of hot-spot.
ds.w 1 format flag. (1 => VDI Format,
-1 => XOR Format)
VDI Format
fg bit bg bit action
0 0 transparent to screen
0 1 background color plotted
1 0 foreground color plotted
1 1 foreground color plotted
XOR Format
fg bit bg bit action
0 0 transparent to screen
0 1 background color plotted
1 0 xor screen
1 1 foreground color plotted
ds.w 1 background color (color table index)
ds.w 1 foreground color (color table index)
ds.w 32 interleaved background/foreground image.
(word 0 = background line 0.
word 1 = foreground line 0.
word 2 = background line 1.
word 3 = foreground line 1.
etc.)
output: clobbers a6. ("C" programmers beware.)
bugs: This function is not usable as a Line-A call in the 1st
release of TOS. See Example Program #2 below for the
technique one must adopt to use this function.
(14) Copy raster form
... ...
dc.w $A00E ; Copy a raster form from source to destination.
... ...
input: See the VDI discussion of Copy Raster, Opaque & Transparent,
EXCEPT, CONTRL(0), CONTRL(1), CONTRL(3), and CONTRL(6) are
ignored.
COPYTRAN = Opaque/Transparent mode flag. (0 => Opaque)
output: none.
note: See the BitBlt discussion above.
USING THE Line-A INTERFACE
The inputs to the Line-A routines are contained in a structure pointed
to by the value returned in a0 after an initialization call ($A000) has
been made. This initialization only needs to be done once and any returned
values can be saved and used as needed.
The Line-A interface can be used in cooperation with the VDI and AES,
however, one cannot expect the variables below to be unchanged after the
VDI or AES has been used. Therefore, if an application wants to mix calls
to Line-A and VDI/AES, it must reload any variables that it uses as input
to the Line-A routines.
The caller should assume that registers d0-d2 and a0-a2 are clobbered
upon return. The rest are preserved.
The LINE"A" input variables structure:
offset name type description
0 VPLANES word number of video planes.
2 VWRAP word number of bytes/video line.
note: These variables can be changed to implement special effects,
e.g.,doubling VWRAP will cause the routines to skip 1 scan-
line between every scanline that is output to the screen.
Of course, any modifications made to these variables must be
undone when normal operation of the Line-A (or VDI) is
desired.
4 CONTRL long ptr to the CONTRL array.
8 INTIN long ptr to the INTIN array.
12 PTSIN long ptr to the PTSIN array.
16 INTOUT long ptr to the INTOUT array.
20 PTSOUT long ptr to the PTSOUT array.
note: See the GEM VDI manual for a discussion of the above arrays.
24 COLBIT0 word current color bit-plane 0 value.
26 COLBIT1 word current color bit-plane 1 value.
28 COLBIT2 word current color bit-plane 2 value.
30 COLBIT3 word current color bit-plane 3 value.
note: current foreground writing color = 1*COLBIT0 +
2*COLBIT1 +
4*COLBIT2 +
8*COLBIT3.
32 LSTLIN word set this to -1 and forget it.
34 LNMASK word equivalent to VDI's line style.
36 WMODE word writing mode. (0 => replace mode,
1 => transparent mode,
2 => xor mode,
3 => inverse trans mode.)
note: see VDI manual for discussion of writing modes.
38 X1 word x1 coordinate.
40 Y1 word y1 coordinate.
42 X2 word x2 coordinate.
44 Y2 word y2 coordinate.
46 PATPTR long ptr to the current fill pattern.
50 PATMSK word fill pattern "mask".
52 MFILL word multi-plane fill flag.
(0 => current fill pattern is single plane)
(1 => current fill pattern is multi-plane)
54 CLIP word clipping flag (0 => no clipping)
56 XMINCL word minimum x clipping value.
58 YMINCL word minimum y clipping value.
60 XMAXCL word maximum x clipping value.
62 YMAXCL word maximum y clipping value.
64 XDDA word accumulator for textblt x dda.
note: Should be inited to 8000H (.5) before each invocation
of TextBlt.
66 DDAINC word fractional amount to scale up or down.
note: If scaling up, set DDAINC to
256*(Intended size-Actual size)/Actual size.
If scaling down, set DDAINC to
256*Intended size/Actual size.
68 SCALDIR word scale direction flag. (0 => down)
70 MONO word 0 => current font is not monospaced OR
its OK for thickening to increase the
width of the current font.
1 => current font is monospaced AND thickening
may not increase the width of the font.
72 SOURCEX word x coord of character in font form.
74 SOURCEY word y coord of character in font form.
note: SOURCEX can be computed from the information held in the
font header. (see Appendix G of VDI manual for header def)
e.g. temp = character value;
temp -= fnt_ptr->first_ade;
SOURCEX = fnt_ptr->off_table(temp);
SOURCEY is typically set to 0. (top line of font form)
76 DESTX word x coord of character on screen.
78 DESTY word y coord of character on screen.
80 DELX word width of character.
82 DELY word height of character.
note: DELX & DELY can be computed from the font header.
e.g. temp = character value;
temp -= fnt_ptr->first_ade;
SOURCEX = fnt_ptr->off_table(temp);
DELX = fnt_ptr->offtable(temp+1)-SOURCEX;
DELY = fnt_ptr->form_height;
84 FBASE long ptr to start of font data. (font form)
88 FWIDTH word width of font form.
note: FBASE & FWIDTH can be computed from the font header.
e.g. FBASE = fnt_ptr->dat_table;
FWIDTH = fnt_ptr->form_width;
90 STYLE word vector of TextBlt special effects flags.
Bit 0 = Thicken flag.
Bit 1 = Lighten flag.
Bit 2 = Skewing flag.
Bit 3 = Underline flag. (ignored)
Bit 4 = Outline flag.
note: Set the bits to select the desired effects.
Underlining must be done by the application.
92 LITEMASK word the mask to use in lightening text.
94 SKEWMASK word the mask to use in skewing text.
96 WEIGHT word the width by which to thicken text.
98 ROFF word offset above character baseline when skewing.
100 LOFF word offset below character baseline when skewing.
note: The above 5 input variables can be computed from the font
header.
e.g. LITEMASK = fnt_ptr->lighten;
SKEWMASK = fnt_ptr->skew;
WEIGHT = fnt_ptr->thicken;
if (skewing) {
ROFF = fnt_ptr->right_offset;
LOFF = fnt_ptr->left_offset;
}
else {
ROFF = 0;
LOFF = 0;
}
102 SCALE word scaling flag. (0 => no scaling.)
104 CHUP word character rotation vector.
0 => normal horizontal orientation.
900 => rotated 90 degrees clockwise.
1800 => rotated 180 degrees clockwise.
2700 => rotated 270 degrees clockwise.
106 TEXTFG word text foreground color.
108 SCRTCHP long ptr to start of text special effects buffer.
112 SCRPT2 word offset of scaling buffer in above buffer.
note: These special effects buffer pointers must be initialized
before TextBlt effects can be used.
114 TEXTBG word text background color. (4/20/85) RAMVDI only.
116 COPYTRAN word copy raster form type flag. (4/26/85) RAMVDI.
0 => Opaque type
n-plane source -> n-plane dest
BitBlt writing modes
~0 => Transparent type
1-plane source -> n-plane dest
VDI writing modes
118 SEEDABORT long ptr to routine which is called within the
seedfill logic to allow the fill to be
aborted. Initialized to point to a
dummy routine which returns FALSE.
Returning TRUE aborts the seedfill.
note: This ptr doesn't exist in 1st release of TOS. See Example
Program #2 for the technique to use to identify the 1st TOS
release.
EXAMPLE Line-A EQUATES
*
*
*
VPLANES equ 0
VWRAP equ 2
CONTRL equ 4
INTIN equ 8
PTSIN equ 12
INTOUT equ 16
PTSOUT equ 20
COLBIT0 equ 24
COLBIT1 equ 26
COLBIT2 equ 28
COLBIT3 equ 30
LSTLIN equ 32
LNMASK equ 34
WMODE equ 36
X1 equ 38
Y1 equ 40
X2 equ 42
Y2 equ 44
PATPTR equ 46
PATMSK equ 50
MFILL equ 52
CLIP equ 54
XMINCL equ 56
YMINCL equ 58
XMAXCL equ 60
YMAXCL equ 62
XDDA equ 64
DDAINC equ 66
SCALDIR equ 68
MONO equ 70
SRCX equ 72
SRCY equ 74
DSTX equ 76
DSTY equ 78
DELX equ 80
DELY equ 82
FBASE equ 84
FWIDTH equ 88
STYLE equ 90
LITEMSK equ 92
SKEWMSK equ 94
WEIGHT equ 96
ROFF equ 98
LOFF equ 100
SCALE equ 102
CHUP equ 104
TEXTFG equ 106
SCRTCHP equ 108
SCRPT2 equ 112
TEXTBG equ 114
COPYTRAN equ 116
SEEDABORT equ 118
*
*
*
INIT equ $A000
PUTPIX equ INIT+1
GETPIX equ INIT+2
ABLINE equ INIT+3
HABLINE equ INIT+4
RECTFILL equ INIT+5
POLYFILL equ INIT+6
BITBLT equ INIT+7
TEXTBLT equ INIT+8
SHOWCUR equ INIT+9
HIDECUR equ INIT+10
CHGCUR equ INIT+11
DRSPRITE equ INIT+12
UNSPRITE equ INIT+13
COPYRSTR equ INIT+14
SEEDFILL equ INIT+15
EXAMPLE PROGRAM #1
text
start: dc.w INIT ; initialize.
move.w #-1,LSTLIN(a0) ; once and for all.
move.w #$5555,LNMASK(a0) ; dithered line.
move.w #0,WMODE(a0) ; replace mode.
move.w #1,COLBIT0(a0)
move.w #1,COLBIT1(a0)
move.w #1,COLBIT2(a0)
move.w #0,COLBIT3(a0) ; drawing color = 7.
move.w #0,X1(a0) ; X1 = 0.
move.w #0,Y1(a0) ; Y1 = 0.
move.w #99,X2(a0) ; X2 = 99.
move.w #99,Y2(a0) ; Y2 = 99.
dc.w ABLINE ; draw line.
.
.
.
move.w #0,-(sp)
trap #1 ; exit.
end
EXAMPLE PROGRAM #2
text
*
*
*
start: clr.l -(sp)
move.w #$20,-(sp)
trap #1 ; supervisor mode required to use
* ; Line-A routines via jsr.
addq #6,sp
move.l d0,stksave ; save old stack ptr.
*
* Find out which version of Line-A handler exists.
*
move.l #0,a2 ; convenient value for testing.
dc.w INIT ; Line-A initialization.
move.l a2,d2 ; old version?
bne a2ok ; no, a2 points to array of Line-A
* ; routine addresses.
lea -4*15(a1),a2 ; yes, a2 is untouched, so use a1 plus
* ; displacement (15 addresses).
*
* a2 now points to array of Line-A routine addresses.
*
a2ok: move.l 4*$D(a2),drawaddr ; fetch draw routine address.
*
* Bug-workaround/Initialization complete.
*
move.w #0,d0 ; init x.
move.w #0,d1 ; init y.
lea sprite,a0 ; point to sprite.
lea save,a2 ; point to save area.
loop: movem.w d0-d1,-(sp) ; save x,y.
movem.l a0/a2,-(sp) ; save ptrs.
move.l a6,-(sp) ; draw clobbers a6.
tst.w old_linea ; old or new Line-A handler?
beq new ; new, branch.
move.l drawaddr,a3 ; fetch draw routine address.
jsr (a3) ; draw the old way.
bra merge
*
new: dc.w DRSPRITE ; draw the new way.
*
merge: move.l (sp)+,a6
movem.l (sp)+,a0/a2 ; restore ptrs.
*
move.w #2000,d2
wait: dbra d2,wait ; wait a bit.
*
movem.l a0/a2,-(sp) ; save ptrs.
move.l a6,-(sp) ; undraw clobbers a6.
dc.w UNSPRITE
move.l (sp)+,a6
movem.l (sp)+,a0/a2 ; restore ptrs.
movem.w (sp)+,d0-d1 ; restore x,y.
addq.w #1,d0 ; inc x.
cmp.w #640,d0
ble loop
*
move.l stksave,-(sp)
move.w #$20,-(sp)
trap #1 ; user mode.
addq #6,sp
*
move.w #0,-(sp)
trap #1 ; exit.
data
*
*
*
sprite: dc.w 0,0 ; x,y offsets of hotspot.
dc.w 1,0,1 ; format, background, foreground.
bob: dc.w $FFFF ; background line 0.
dc.w $07F0 ; foreground line 0.
dc.w $FFFF
dc.w $0ff8
dc.w $FFFF
dc.w $1fec
dc.w $FFFF
dc.w $1804
dc.w $FFFF
dc.w $1804
dc.w $FFFF
dc.w $1004
dc.w $FFFF
dc.w $1e3c
dc.w $FFFF
dc.w $1754
dc.w $FFFF
dc.w $1104
dc.w $FFFF
dc.w $0b28
dc.w $FFFF
dc.w $0dd8
dc.w $FFFF
dc.w $0628
dc.w $FFFF
dc.w $07d0
dc.w $FFFF
dc.w $2e10
dc.w $FFFF
dc.w $39e0
dc.w $FFFF
dc.w $3800
bss
*
*
*
stksave: ds.l 1
save: ds.b 10+64
old_linea: ds.w 1
drawaddr: ds.l 1
end