|
|
| Line 1: |
Line 1: |
| − | <pre>
| + | #Redirect [[http://www.atari-forum.com/wiki/index.php/Line-A_Document]] |
| − | 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
| |
| − | | |
| − | </pre>
| |