home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 1 / crawlyvol1.bin / program / books / blit / blitter.man
Text File  |  1988-05-20  |  47KB  |  1,253 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  
  14.  
  15.  
  16.  
  17.  
  18.  
  19.  
  20.  
  21.  
  22.                                        ****
  23.                                        ****
  24.                                        ****
  25.                                       ******
  26.                                      ** ** **
  27.                                     **  **  **
  28.                                   **    **    **
  29.  
  30.                            User Manual for the Atari ST
  31.  
  32.                       Bit-Block Transfer Processor (BLiTTER)
  33.  
  34.  
  35.  
  36.  
  37.  
  38.  
  39.  
  40.                                The Atari Corporation
  41.  
  42.                                Sunnyvale, California
  43.  
  44.                                    15 June 1987
  45.  
  46.  
  47.  
  48.  
  49.  
  50.  
  51.  
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58.  
  59.  
  60.  
  61.  
  62.  
  63.  
  64.  
  65.  
  66.  
  67.  
  68.  
  69.                                  TABLE OF CONTENTS
  70.  
  71.  
  72.           Introduction ......................................    1
  73.  
  74.                Bit-Block Transfers ..........................    2
  75.                Bit-Block Transfer ...........................    3
  76.  
  77.           Functional Description ............................    3
  78.  
  79.           Programming Model .................................    5
  80.                Register Map .................................    5
  81.                Bit-Block Addresses ..........................    5
  82.                     Source X Increment ......................    6
  83.                     Source Y Increment ......................    6
  84.                     Destination Address .....................    6
  85.                     Destination X Increment .................    6
  86.                     Destination Y Increment .................    6
  87.                     X Count .................................    7
  88.                     Y Count .................................    7
  89.                Bit-Block Alignments .........................    7
  90.                     Endmask 1, 2, 3 .........................    7
  91.                     Skew ....................................    7
  92.                     FXSR ....................................    7
  93.                     NSFR ....................................    8
  94.                Logic Operations .............................    8
  95.                     Logic Operations ........................    8
  96.                Halftone Operations ..........................    8
  97.                     Halftone RAM ............................    8
  98.                     Line Number .............................    8
  99.                     Smudge ..................................    9
  100.                     Halftone Operations .....................    9
  101.                Bus Accesses .................................    9
  102.                     Hog .....................................    9
  103.                     Busy ....................................    9
  104.  
  105.           Appendix A -- Programming Example .................    10
  106.        
  107.           Appendix B -- References ..........................    17
  108.  
  109.  
  110.  
  111.  
  112.  
  113.  
  114.  
  115.  
  116.  
  117.  
  118.  
  119.  
  120.  
  121.  
  122.  
  123.  
  124.  
  125.  
  126.  
  127.  
  128.  
  129.  
  130.  
  131.  
  132.  
  133.  
  134.      THE SCOPE  OF THIS  DOCUMENT is limited to a functional description of the
  135.      Atari ST BLiTTER.   This document  is not  a data  sheet for  system inte-
  136.      gration, rather  it is  a user  manual for  system programming.   For more
  137.      information, please refer to the texts listed at the end of this document.
  138.  
  139.  
  140.      *** INTRODUCTION
  141.  
  142.      The Atari ST Bit-Block Transfer Processor  (BLiTTER) is  a hardware imple-
  143.      mentation of  the bit-block  transfer (BitBlt)  algorithm.   BitBlt can be
  144.      simply described as a procedure that moves bit-aligned data from  a source
  145.      location to  a destination  location through a given logic operation.  The
  146.      BitBlt primitive can be used to perform such operations as:
  147.  
  148.           o  Area seed filling
  149.           o  Rotation by recursive subdivision
  150.           o  Slice and smear magnification
  151.           o  Brush line drawing using Bresenham DDA
  152.           o  Text transformations (eg. bold, italic, outline)
  153.           o  Text scrolling
  154.           o  Window updating
  155.           o  Pattern filling
  156.  
  157.      And general memory-to-memory block copying [1].
  158.  
  159.      The heart of BitBlt was first  formally defined  by Newman  and Sproull in
  160.      their  description  of  the  function  RasterOp [2].  As defined, RasterOp
  161.      performed its block transfers on a bit-by-bit basis  and was  limited to a
  162.      small  subset  of  possible  source  and destination Boolean combinations.
  163.      Enhancements to  RasterOp such  as processing  bits in  parallel or intro-
  164.      ducing  a  halftone  pattern  into  the  transfer  were  literally left as
  165.      exercises for the reader.
  166.  
  167.      In an effort to improve the functionality and performance of  the original
  168.      algorithm,  the   prescribed  enhancements   were  incorporated  into  the
  169.      definition of RasterOp and implemented in  hardware  as the  RasterOp Chip
  170.      [3].    However  the  RasterOp  Chip  lacked the two-dimensionality of the
  171.      original function and suffered from a performance bottleneck caused by the
  172.      loading and  reloading of  source, destination,  and halftone data (ie. it
  173.      could not DMA).
  174.  
  175.      While efforts were being made to improve the performance of  RasterOp, the
  176.      formal definition  of RasterOp was further refined and became the basis of
  177.      the BitBlt copyLoop primitive in  the  Smalltalk-80  graphics  kernel [4].
  178.      Because of  its comprehensive  interface definition,  the BitBlt primitive
  179.      was inefficient and required special-case optimizations  that violated its
  180.      general-purpose  nature.    Clearly  a  hardware solution was necessary to
  181.      increase the performance of  the BitBlt  copyLoop without  sacrificing its
  182.      functionality.
  183.  
  184.      The Atari ST BLiTTER is a hardware solution to the performance problems of
  185.      BitBlt.  The BLiTTER is a  DMA  device  that  implements  the  full BitBlt
  186.      copyLoop definition  with the addition  of a few minor extensions.  Single
  187.      word or multi-word increments and decrements are provided for transfers to
  188.      destinations in Atari ST video display memory.  A center mask, which would
  189.      otherwise be  a constant  all ones,  is   also provided  for an additional
  190.  
  191.  
  192.  
  193.  
  194.  
  195.  
  196.                             Atari BLiTTER doc - page 1
  197.  
  198.  
  199.  
  200.      level of texture.  The remainder of this document is directly based on the
  201.      original functional description of the Atari ST BLiTTER.  
  202.  
  203.  
  204.      *** BIT-BLOCK TRANSFERS
  205.  
  206.      As previously stated, a bit-block transfer can be described as a procedure
  207.      that  moves  bit-aligned  data  from  a  source  location to a destination
  208.      location through  a  given  logic  operation.    There  are  sixteen logic
  209.      combination rules  associated with  the merging  of source and destination
  210.      data.  Note that  this  set  contains  all  possible  combinations between
  211.      source and  destination.   The following  table contains  the valid BitBlt
  212.      combination rules:
  213.  
  214.           LOGIC OPERATIONS  
  215.           (~s&~d)|(~s&d)|(s&~d)|(s&d)  
  216.                      _______________________________________
  217.                     |    |                                  |
  218.           MSB LSB   | OP | COMBINATION RULE                 |
  219.                     |    |                                  |
  220.           0 0 0 0   | 0  | all zeros                        |
  221.           0 0 0 1   | 1  | source AND destination           |
  222.           0 0 1 0   | 2  | source AND NOT destination       |
  223.           0 0 1 1   | 3  | source                           |
  224.           0 1 0 0   | 4  | NOT source AND destination       |
  225.           0 1 0 1   | 5  | destination                      |
  226.           0 1 1 0   | 6  | source XOR destination           |
  227.           0 1 1 1   | 7  | source OR destination            |
  228.           1 0 0 0   | 8  | NOT source AND NOT destination   |
  229.           1 0 0 1   | 9  | NOT source XOR destination       |
  230.           1 0 1 0   | A  | NOT destination                  |
  231.           1 0 1 1   | B  | source OR NOT destination        |
  232.           1 1 0 0   | C  | NOT source                       |
  233.           1 1 0 1   | D  | NOT source OR destination        |
  234.           1 1 1 0   | E  | NOT source OR NOT destination    |
  235.           1 1 1 1   | F  | all ones                         |
  236.                     |____|__________________________________|
  237.  
  238.  
  239.      Adjustments to block extents and  several  other  transfer  parameters are
  240.      determined prior  to the  invocation of  the actual block transfer.  These
  241.      adjustments and parameters include clipping, skew, end masks, and overlap.
  242.  
  243.      Clipping.  The  source  and  destination  block  extents  are  adjusted to
  244.      conform  with  a  specified  clipping  rectangle.    Since both source and
  245.      destination blocks are of equal dimension, the destination block extent is
  246.      clipped to  the extent of the source block (or vice versa).  Note that the
  247.      block transfer need not be performed if the resultant extent is zero.
  248.  
  249.      Skew.  The source-to-destination horizontal bit skew is calculated.
  250.  
  251.      End Masks.  The left and  right partial  word masks  are determined.   The
  252.      masks are merged if the destination is one word in width.
  253.  
  254.      Overlap.  The block locations are checked for possible overlap in order to
  255.      avoid the destruction of source data before it is transferred.
  256.  
  257.  
  258.  
  259.  
  260.  
  261.  
  262.                             Atari BLiTTER doc - page 2
  263.  
  264.  
  265.  
  266.      In  non-overlapping  transfers  the  source  block  scanning  direction is
  267.      inconsequential and  can by default be from upper left to lower right.  In
  268.      overlapping transfers the source scanning  direction  is  also  from upper
  269.      left to  lower right if the source-to-destination transfer direction is up
  270.      and/or to the left  (ie.  source  address  is  greater  than  or  equal to
  271.      destination address).   However,  if the overlapping source-to-destination
  272.      transfer direction is down and/or to the right (ie. source address is less
  273.      than  destination  address),  then  the  source data is scanned from lower
  274.      right to upper left.
  275.  
  276.      After  the  transfer  parameters  are  determined  the  bit-block transfer
  277.      operation can  be invoked,  transferring source to destination through the
  278.      logic operation (HALFTONE and HOP will be described in the next section):
  279.  
  280.  
  281.      *** BIT-BLOCK TRANSFER
  282.                 _________  _____________           ________________
  283.                |         ||             |         |                |
  284.                |  SOURCE ||  SOURCE     |         |  DESTINATION   |
  285.                |_________||_____________|         |________________|
  286.                     |________________|<< SKEW |                  |
  287.                                   |                              |
  288.            ______________      ___|____       ________________   |
  289.           |              |    |        |     |                |  |
  290.           |   HALFTONE   |----|  HOP   |-----|    LOGIC OP    |--|
  291.           |______________|    |________|     |________________|  |
  292.                                                        |         |
  293.                                                    ____|____     |
  294.                                                   |         |    |
  295.                                                   | ENDMASK |____|
  296.                                                   |_________|
  297.                                                        |
  298.                                               _________|_________
  299.                                              |                   |
  300.                                              |  NEW DESTINATION  |
  301.                                              |___________________|
  302.  
  303.  
  304.      *** FUNCTIONAL DESCRIPTION
  305.  
  306.      Please refer to the  bit-block transfer  diagram in  the previous section.
  307.      To understand  how the  components of a block transfer work, let's look at
  308.      the simplest possible transfer.  Take  the case  where we  wish to  fill a
  309.      block of  memory with either all zeros or all ones (OP = 0 or OP = F).  In
  310.      this case only the LOGIC OP block, which generates the ones or  zeros, and
  311.      the ENDMASK  block are  in the  data path.   If  the end mask contains all
  312.      ones, the BLiTTER will simply write one word after the other to  the dest-
  313.      ination address without ever reading the destination.
  314.  
  315.      As  the  writes  take  place  the  destination  address  will  be adjusted
  316.      according to the values in  the  DESTINATION  X  INCREMENT,  DESTINATION Y
  317.      INCREMENT, X  COUNT, and  Y COUNT  registers.   These registers define the
  318.      size and shape of the  block  to  be  transferred.    The  X  and  Y COUNT
  319.      registers define  the size  of the  block.  The X COUNT register specifies
  320.      the number  of  word-size  writes  required  to  update  one  line  of the
  321.      destination.   The Y COUNT register specifies the number of these lines in
  322.      the  block.  The  DESTINATION  X  INCREMENT  register  is  a  signed  (2's
  323.  
  324.  
  325.  
  326.  
  327.  
  328.                             Atari BLiTTER doc - page 3
  329.  
  330.  
  331.  
  332.      complement) 16-bit  quantity which  is added to the destination address to
  333.      calculate the address of the next destination word  of the  line.   On the
  334.      last write  of the  line the DESTINATION Y INCREMENT is added to calculate
  335.      the address of the first word of the next line.
  336.  
  337.      The end mask determines  which bits  of the  destination word  will be up-
  338.      dated.   Bits of  the destination which correspond to ones in the end mask
  339.      will be updated.  Bits of the destination which correspond to zeros in the
  340.      end mask  will remain unchanged.  Note that if any bits of the destination
  341.      are to be left unchanged, a  read-modify-write is  required.   In order to
  342.      improve  performance  a  read  will  only  be performed if it is required.
  343.      There are three ENDMASK registers numbered 1 through 3.  ENDMASK 1 is used
  344.      only for the first write of the line.  ENDMASK 3 is used only for the last
  345.      write of the line.  ENDMASK 2 is used for all other writes.
  346.  
  347.      Now let's consider a more complicated  case,  suppose  we  want  to  XOR a
  348.      destination block  with a  16 x  16 halftone  pattern.   First we load the
  349.      HALFTONE RAM with the halftone pattern.   Select  halftone only  using the
  350.      HOP register and select source XOR destination using the OP register.  The
  351.      LINE NUMBER register is used to specify which of the 16 words  of HALFTONE
  352.      RAM is  used for  the current  line.  This register will be incremented or
  353.      decremented at the end  of each  line according  to the  sign of  the DES-
  354.      TINATION Y  INCREMENT register.  Set the DESTINATION X and Y INCREMENT and
  355.      X and Y COUNT registers to the appropriate values and  start the transfer.
  356.      This same  procedure can be followed to do the combination using any logic
  357.      operation by simply changing the value in the OP register.   Similarly the
  358.      combination can  be performed using a source block instead of the HALFTONE
  359.      RAM or using the logical AND  of a  source block  and the  HALFTONE RAM by
  360.      changing the  value of  the HOP register.  A source block is the same size
  361.      as the  destination block  but may  have different  increments and address
  362.      defined by the SOURCE X and Y INCREMENT and SOURCE ADDRESS registers.
  363.  
  364.      Finally, let's look at the case when the source and destination blocks are
  365.      not bit-aligned.  In this case we may  need to  read the  first two source
  366.      words into  the 32-bit source buffer and use the 16 bits that line up with
  367.      the appropriate bits of  the destination,  as specified  by the  SKEW reg-
  368.      ister.  When the next source word is read, the lower 16 bits of the source
  369.      buffer is transferred to the upper 16 bits  and the  lower is  replaced by
  370.      the new  data.   This process  is reversed  when the  source is being read
  371.      from the right to the left (SOURCE X INCREMENT negative).  Since there are
  372.      cases when  it may  be necessary for an extra source read  to be performed
  373.      at the beginning of each line to "prime" the source buffer and  cases when
  374.      it may  not be  necessary due  to the  choice of  end mask, a bit has been
  375.      provided which forces the extra read.   The  FXSR (aka.  pre-fetch) bit in
  376.      the SKEW register indicates, when set, that an extra source read should be
  377.      performed at the beginning of each  line  to  "prime"  the  source buffer.
  378.      Similarly the  NFSR (aka  post-flush) bit, when set, will prevent the last
  379.      source read of the  line.   This read  may not  be necessary  with certain
  380.      combinations of end masks and skews.  If the read is suppressed, the lower
  381.      to upper half buffer transfer still occurs.   Also in  this case,  a read-
  382.      modify-write cycle  is performed  on the destination for the last write of
  383.      each line regardless of the value of the corresponding ENDMASK register.
  384.  
  385.  
  386.  
  387.  
  388.  
  389.  
  390.  
  391.  
  392.  
  393.  
  394.                             Atari BLiTTER doc - page 4
  395.  
  396.  
  397.  
  398.      *** PROGRAMMING MODEL
  399.  
  400.      The BLiTTER contains a set of registers that  specify bit-block addresses,
  401.      bit-block  alignments,  logic  and  halftone operations, and bus accesses.
  402.      The  register  set-up  time  remains  practically  constant  and  is large
  403.      relative to  small block transfers, whereas large bit-blocks are dominated
  404.      by the execution time of the transfer itself.
  405.  
  406.  
  407.       ** REGISTER MAP
  408.  
  409.      The following is a map of  the BLiTTER  programmable registers  (note that
  410.      all unused bits read back as zeros):
  411.  
  412.  
  413.           FF 8A00   |oooooooo||oooooooo|     HALFTONE RAM
  414.           FF 8A02   |oooooooo||oooooooo|
  415.           FF 8A04   |oooooooo||oooooooo|
  416.                     :        ::        :
  417.           FF 8A1E   |oooooooo||oooooooo|
  418.           FF 8A20   |oooooooo||ooooooo-|     SOURCE X INCREMENT
  419.           FF 8A22   |oooooooo||ooooooo-|     SOURCE Y INCREMENT
  420.           FF 8A24   |--------||oooooooo|     SOURCE ADDRESS
  421.           FF 8A26   |oooooooo||ooooooo-|
  422.           FF 8A28   |oooooooo||oooooooo|     ENDMASK 1
  423.           FF 8A2A   |oooooooo||oooooooo|     ENDMASK 2
  424.           FF 8A2C   |oooooooo||oooooooo|     ENDMASK 3
  425.           FF 8A2E   |oooooooo||ooooooo-|     DESTINATION X INCREMENT
  426.           FF 8A30   |oooooooo||ooooooo-|     DESTINATION Y INCREMENT
  427.           FF 8A32   |--------||oooooooo|     DESTINATION ADDRESS
  428.           FF 8A34   |oooooooo||ooooooo-|
  429.           FF 8A36   |oooooooo||oooooooo|     X COUNT
  430.           FF 8A38   |oooooooo||oooooooo|     Y COUNT
  431.  
  432.           FF 8A3A   |------oo|               HOP
  433.           FF 8A3B   |----oooo|               OP
  434.  
  435.           FF 8A3C   |ooo-oooo|
  436.                     ||| |__|_____________ LINE NUMBER
  437.                     |||__________________ SMUDGE
  438.                      ||__________________ HOG
  439.                      |___________________ BUSY
  440.  
  441.           FF 8A3D   |oo--oooo|
  442.                     ||  |__|_____________ SKEW
  443.                     ||___________________ NFSR
  444.                      |____________________ FXSR
  445.  
  446.  
  447.  
  448.  
  449.  
  450.  
  451.  
  452.  
  453.  
  454.  
  455.  
  456.  
  457.  
  458.  
  459.  
  460.                             Atari BLiTTER doc - page 5
  461.  
  462.  
  463.  
  464.       ** BIT-BLOCK ADDRESSES
  465.  
  466.      This  subsection  describes  registers  that  specify  bit-block  origins,
  467.      address increments, and extents.
  468.  
  469.      SOURCE ADDRESS  
  470.  
  471.      This 23-bit register contains the  current  address  of  the  source field
  472.      (only word  addresses may  be specified).  It may be accessed using either
  473.      word or longword instructions.  The value read back is  always the address
  474.      of the  next word to be used in a source operation.  It will be updated by
  475.      the amounts specified in the SOURCE X INCREMENT and the SOURCE Y INCREMENT
  476.      registers as the transfer progresses.
  477.  
  478.      SOURCE X INCREMENT
  479.  
  480.      This is  a signed  15-bit register,  the least significant bit is ignored,
  481.      specifying the offset in bytes to the address of the  next source  word in
  482.      the  current  line.    This  value  will be sign-extended and added to the
  483.      SOURCE ADDRESS register at the end of a source word fetch, whenever  the X
  484.      COUNT register  does not  contain a value of one.  If the X COUNT register
  485.      is  loaded  with  a  value  of  one  this  register  is  not  used.   Byte
  486.      instructions can not be used to read or write this register.
  487.  
  488.      SOURCE Y INCREMENT
  489.  
  490.      This is  a signed  15-bit register,  the least significant bit is ignored,
  491.      specifying the offset in bytes to the address of the first source  word in
  492.      the next  line.   This value will be sign-extended and added to the SOURCE
  493.      ADDRESS register at the end of  the last  source word  fetch of  each line
  494.      (when the  X COUNT  register contains  a value  of one).   If  the X COUNT
  495.      register is loaded with a value of one this register  is used exclusively.
  496.      Byte instructions can not be used to read or write this register. 
  497.  
  498.      DESTINATION ADDRESS
  499.  
  500.      This 23-bit register contains the current address of the destination field
  501.      (only word addresses may be specified).  It  may be  accessed using either
  502.      word or long-word instructions.  The value read back is always the address
  503.      of the next word  to be  modified in  the destination  field.   It will be
  504.      updated by  the amounts  specified in  the DESTINATION X INCREMENT and the
  505.      DESTINATION Y INCREMENT registers as the transfer progresses.  
  506.  
  507.      DESTINATION X INCREMENT  
  508.  
  509.      This is a signed 15-bit register,  the least  significant bit  is ignored,
  510.      specifying the offset in bytes to the address of the next destination word
  511.      in the current line.  This value will  be sign-extended  and added  to the
  512.      DESTINATION  ADDRESS  register  at  the  end  of a destination word write,
  513.      whenever the X COUNT register does not contain a value of one.   If  the X
  514.      COUNT register  is loaded  with a  value of one this register is not used.
  515.      Byte instructions can not be used to read or write this register.
  516.  
  517.      DESTINATION Y INCREMENT
  518.  
  519.      This is a signed 15-bit register,  the least  significant bit  is ignored,
  520.      specifying the  offset in  bytes to  the address  of the first destination
  521.  
  522.  
  523.  
  524.  
  525.  
  526.                             Atari BLiTTER doc - page 6
  527.  
  528.  
  529.  
  530.      word in the next line.  This value will be sign-extended and  added to the
  531.      DESTINATION ADDRESS register at the end of the last destination word write
  532.      of each line (when the X COUNT register contains a value of one).   If the
  533.      X  COUNT  register  is  loaded  with  a value of one this register is used
  534.      exclusively.  Byte instructions cannot be used on this register.
  535.  
  536.      X COUNT
  537.  
  538.      This 16-bit register  specifies  the  number  of  words  contained  in one
  539.      destination line.   The  minimum number  is one  and the  maximum is 65536
  540.      designated by zero.  Byte instructions can not  be used  to read  or write
  541.      this register.   Reading  this register  returns the number of destination
  542.      words yet to be  written in  the current  line, NOT  necessarily the value
  543.      initially  written  to  the  register.    Each  time a destination word is
  544.      written the value will be decremented until it reaches zero, at which time
  545.      it will be returned to its initial value.
  546.  
  547.      Y COUNT
  548.  
  549.      This  16-bit  register  specifies  the  number of lines in the destination
  550.      field.  The minimum number is one and the maximum  is 65536  designated by
  551.      zero.   Byte instructions  can not be used to read or write this register.
  552.      Reading this register returns the number  of destination  lines yet  to be
  553.      written,  NOT  necessarily  the  value  initially written to the register.
  554.      Each time a destination line is  completed the  value will  be decremented
  555.      until it reaches zero, at which time the tranfer is complete.
  556.  
  557.  
  558.       ** BIT-BLOCK ALIGNMENTS
  559.  
  560.      This subsection  describes registers  that   specify  bit-block end masks,
  561.      source-to-destination skew, and source data fetching.
  562.  
  563.      ENDMASK 1, 2, 3  
  564.  
  565.      These 16-bit registers are used to mask destination  writes.   Bits of the
  566.      destination word  which correspond to ones in the current ENDMASK register
  567.      will be modified.  Bits of the destination word which  correspond to zeros
  568.      in  the  current  ENDMASK    register  will remain unchanged.  The current
  569.      ENDMASK register is determined by position in the line.  ENDMASK 1 is used
  570.      only for  the first  write of a line.  ENDMASK 3 is used only for the last
  571.      write of a line.  ENDMASK 2 is used in all other cases.  In the  case of a
  572.      one word  line ENDMASK  1 is  used.   Byte instructions can not be used to
  573.      read or write these registers.
  574.  
  575.      SKEW
  576.  
  577.      The least significant four bits  of  the  byte-wide  register  at  FF 8A3D
  578.      specify the  source skew.   This is the amount the data in the source data
  579.      latch is shifted right before being  combined with  the halftone  mask and
  580.      destination data.
  581.  
  582.      FXSR
  583.  
  584.      FXSR stands  for Force  eXtra Source Read.  When this bit is set one extra
  585.      source read is performed at the  start  of  each  line  to  initialize the
  586.      remainder portion source data latch.
  587.  
  588.  
  589.  
  590.  
  591.  
  592.                             Atari BLiTTER doc - page 7
  593.  
  594.  
  595.  
  596.  
  597.      NFSR
  598.  
  599.      NFSR stands  for No  Final Source  Read.   When this  bit is  set the last
  600.      source read of each line is not performed.  Note  that use  of this and/or
  601.      the FXSR  bit the  requires an  adjustment to  the SOURCE  Y INCREMENT and
  602.      SOURCE ADDRESS registers.
  603.  
  604.  
  605.       ** LOGIC OPERATIONS
  606.  
  607.      This subsection describes registers that specify the logic combinations of
  608.      source and destination bit-block data.
  609.  
  610.      The  least  significant  four  bits  of  the byte-wide register at FF 8A3B
  611.      specify the source/destination combination rule according to the following
  612.      table:
  613.            _______________________________________
  614.           |    |                                  |
  615.           | OP | COMBINATION RULE                 |
  616.           |    |                                  |
  617.           | 0  | all zeros                        |
  618.           | 1  | source AND destination           |
  619.           | 2  | source AND NOT destination       |
  620.           | 3  | source                           |
  621.           | 4  | NOT source AND destination
  622.                                    tination       |
  623.           | 5  | destination                      |
  624.           | 6  | source XOR destination           |
  625.           | 7  | source OR destination            |
  626.           | 8  | NOT source AND NOT destination
  627.                                              on   |
  628.           | 9  | NOT source XOR destination       |
  629.           | A  | NOT destination                  |
  630.           | B  | source OR NOT destination        |
  631.           | C  | NOT source                       |
  632.           | D  | NOT source OR destination        |
  633.           | E  | NOT source OR NOT destination    |
  634.           | F  | all ones                         |
  635.           |____|__________________________________|
  636.  
  637.       ** HALFTONE OPERATIONS
  638.  
  639.      This  subsection  describes  registers  that  specify the halftone pattern
  640.      memory, halftone word index, and combinations of source and halftone data.
  641.  
  642.      HALFTONE RAM
  643.  
  644.      This RAM holds a 16x16 halftone pattern mask.  Each word is  valid for one
  645.      line of the destination field and is repeated every 16 lines.  The current
  646.      word is pointed to by the  value  in  the  LINE  NUMBER  register.   These
  647.      registers  may   be  read,   but  can  not  be  accessed  using  byte-wide
  648.      instructions.
  649.  
  650.      LINE NUMBER
  651.  
  652.      The least significant four bits  of  the  byte-wide  register  at  FF 8A3C
  653.      specify the  current halftone  mask.   The current value times two plus FF
  654.  
  655.  
  656.  
  657.  
  658.  
  659.                             Atari BLiTTER doc - page 8
  660.  
  661.  
  662.      8A00 gives the address of  the  current  halftone  mask.    This  value is
  663.      incremented or  decremented at  the end of each line and will wrap through
  664.      zero.   The sign  of the  DESTINATION Y  INCREMENT determines  if the line
  665.      number is  incremented or decremented (increment if positive, decrement if
  666.      negative).
  667.  
  668.      SMUDGE
  669.  
  670.      The SMUDGE bit, when set, causes  the least  significant four  bits of the
  671.      skewed  source  data  to  be  used  as the address of the current halftone
  672.      pattern.  Note that the halftone operation is  still valid  when SMUDGE is
  673.      set.
  674.  
  675.      HALFTONE OPERATIONS
  676.  
  677.      The  least  significant  two  bits  of  the  byte-wide register at FF 8A3A
  678.      specify the  source/halftone combination  rule according  to the following
  679.      table:
  680.            _____________________________
  681.           |    |                        |
  682.           | HOP| COMBINATION RULE       |
  683.           |    |                        |
  684.           | 0  | all ones               |
  685.           | 1  | halftone               |
  686.           | 2  | source                 |
  687.           | 3  | source AND halftone    |
  688.           |____|________________________|
  689.  
  690.  
  691.       ** BUS ACCESSES
  692.  
  693.      This subsection  describes registers  that specify  bus access control and
  694.      BLiTTER start/status.
  695.  
  696.      HOG
  697.  
  698.      The HOG bit, when cleared, causes the processor  and the  blitter to share
  699.      the bus equally.  In this mode each will get 64 bus cycles while the other
  700.      is halted.  When set, the bit will cause the processor to  be halted until
  701.      the transfer  is complete.  In either case the BLiTTER will yield to other
  702.      DMA devices.  Bus arbitration may  allow the  processor to  execute one or
  703.      more  instructions  even  in  hog  mode.  Therefore, don't assume that the
  704.      instruction following the one  which sets  the BUSY  bit will  be executed
  705.      only  after  the  transfer  is  complete.    The BUSY bit may be polled to
  706.      achieve this kind of synchronization.
  707.  
  708.      BUSY
  709.  
  710.      The BUSY bit is set after all the other registers have been initialized to
  711.      begin the  transfer operation.   It  will remain set until the transfer is
  712.      complete.  The interrupt line  is  a  duplicate  of  this  bit.    See the
  713.      Programming Example for more details on how to use the BUSY bit.
  714.  
  715.  
  716.  
  717.  
  718.  
  719.  
  720.  
  721.  
  722.  
  723.  
  724.                             Atari BLiTTER doc - page 9
  725.  
  726.  
  727.  
  728.                          Appendix A -- Programming Example
  729.  
  730.      In order to maintain software compatibility with new or upgraded Atari STs
  731.      equipped with the BLiTTER, software developers need only follow guidelines
  732.      set forth  by the  VDI and "LINE A" documents.  Revised TOS ROMs will work
  733.      in concert with the  BLiTTER, enhancing  the performance  of many  VDI and
  734.      "LINE A"  operations.  This occurs in a manner transparent to an executing
  735.      program.  Thus no special actions need be taken to utilize the performance
  736.      advantages of the BLiTTER.
  737.  
  738.      As a  rule of  thumb, never  make a  VDI or  "LINE A"  call from within an
  739.      interrupt context since unpredictable and potentially catastrophic results
  740.      will  occur   should  one  BLiTTER  operation  interrupt  another  BLiTTER
  741.      operation.
  742.  
  743.      The following program has  not been  optimized and  is presented  here for
  744.      exemplary purposes only.
  745.  
  746.           * (c) 1987 Atari Corporation
  747.           *    All Rights Reserved.
  748.  
  749.           * BLiTTER BASE ADDRESS
  750.  
  751.                BLiTTER   equ  $FF8A00
  752.  
  753.           * BLiTTER REGISTER OFFSETS
  754.  
  755.           Halftone  equ  0
  756.           Src_Xinc  equ  32
  757.           Src_Yinc  equ  34
  758.           Src_Addr  equ  36
  759.           Endmask1  equ  40
  760.           Endmask2  equ  42
  761.           Endmask3  equ  44
  762.           Dst_Xinc  equ  46
  763.           Dst_Yinc  equ  48
  764.           Dst_Addr  equ  50
  765.           X_Count   equ  54
  766.           Y_Count   equ  56
  767.           HOP       equ  58
  768.           OP        equ  59
  769.           Line_Num  equ  60
  770.           Skew      equ  61
  771.  
  772.           * BLiTTER REGISTER FLAGS
  773.  
  774.           fHOP_Source    equ  1
  775.           fHOP_Halftone  equ  0
  776.  
  777.           fSkewFXSR      equ  7
  778.           fSkewNFSR      equ  6
  779.  
  780.           fLineBusy      equ  7
  781.           fLineHog       equ  6
  782.           fLineSmudge    equ  5
  783.  
  784.  
  785.  
  786.  
  787.  
  788.  
  789.  
  790.                      Atari Blitter doc - Appendix A  page A.10
  791.  
  792.  
  793.  
  794.           * BLiTTER REGISTER MASKS
  795.  
  796.           mHOP_Source    equ  $02
  797.           mHOP_Halftone  equ  $01
  798.  
  799.           mSkewFXSR      equ  $80
  800.           mSkewNFSR      equ  $40
  801.  
  802.           mLineBusy      equ  $80
  803.           mLineHog       equ  $40
  804.           mLineSmudge    equ  $20
  805.  
  806.           *         E n D m A s K   d A t A
  807.           *
  808.           * These tables are referenced by PC relative instructions.  Thus,
  809.           * the labels on these tables must remain within 128 bytes of the
  810.           * referencing instructions forever.  Amen.
  811.           *
  812.           * 0: Destination  1: Source   <<< Invert right end mask data >>>
  813.  
  814.           lf_endmask:
  815.                dc.w $FFFF
  816.  
  817.           rt_endmask:
  818.                dc.w $7FFF
  819.                dc.w $3FFF
  820.                dc.w $1FFF
  821.                dc.w $0FFF
  822.                dc.w $07FF
  823.                dc.w $03FF
  824.                dc.w $01FF
  825.                dc.w $00FF
  826.                dc.w $007F
  827.                dc.w $003F
  828.                dc.w $001F
  829.                dc.w $000F
  830.                dc.w $0007
  831.                dc.w $0003
  832.                dc.w $0001
  833.                dc.w $0000
  834.  
  835.           * TiTLE:  BLiT_iT
  836.           *
  837.           * PuRPoSE:
  838.           *    Transfer a rectangular block of pixels located at an
  839.           *    arbitrary X,Y position in the source memory form to
  840.           *    another arbitrary X,Y position in the destination memory
  841.           *    form using replace mode (boolean operator 3).
  842.           *    The source and destination rectangles should not overlap.
  843.           *
  844.           * iN:
  845.           *    a4   pointer to 34 byte input parameter block
  846.           *
  847.           * Note: This routine must be executed in supervisor mode as
  848.           *    access is made to hardware registers in the protected region
  849.           *    of the memory map.
  850.           *
  851.  
  852.  
  853.  
  854.  
  855.  
  856.                      Atari Blitter doc - Appendix A  page A.11
  857.  
  858.  
  859.  
  860.           *
  861.           *    I n p u t   p a r a m e t e r   b l o c k   o f f s e t s
  862.  
  863.           SRC_FORM  equ  0    ; Base address of source memory form .l
  864.           SRC_NXWD  equ  4    ; Offset between words in source plane .w
  865.           SRC_NXLN  equ  6    ; Source form width .w
  866.           SRC_NXPL  equ  8    ; Offset between source planes .w
  867.           SRC_XMIN  equ  10   ; Source blt rectangle minimum X .w
  868.           SRC_YMIN  equ  12   ; Source blt rectangle minimum Y .w
  869.  
  870.           DST_FORM  equ  14   ; Base address of destination memory form .l 
  871.           DST_NXWD  equ  18   ; Offset between words in destination plane.w
  872.           DST_NXLN  equ  20   ; Destination form width .w
  873.           DST_NXPL  equ  22   ; Offset between destination planes .w
  874.           DST_XMIN  equ  24   ; Destination blt rectangle minimum X .w
  875.           DST_YMIN  equ  26   ; Destination blt rectangle minimum Y .w
  876.  
  877.           WIDTH     equ  28   ; Width of blt rectangle .w
  878.           HEIGHT    equ  30   ; Height of blt rectangle .w
  879.           PLANES    equ  32   ; Number of planes to blt .w
  880.  
  881.           BLiT_iT:
  882.  
  883.                lea  BLiTTER,a5          ; a5-> BLiTTER register block  
  884.  
  885.           *
  886.           * Calculate Xmax coordinates from Xmin coordinates and width
  887.           *
  888.                move.w    WIDTH(a4),d6  
  889.                subq.w    #1,d6               ; d6<- width-1  
  890.  
  891.                move.w    SRC_XMIN(a4),d0     ; d0<- src Xmin  
  892.                move.w    d0,d1
  893.                add.w     d6,d1               ; d1<- src Xmax=src Xmin+width-1
  894.  
  895.                move.w    DST_XMIN(a4),d2     ; d2<- dst Xmin  
  896.                move.w    d2,d3
  897.                add.w     d6,d3               ; d3<- dst Xmax=dstXmin+width-1
  898.  
  899.           *
  900.           * Endmasks are derived from source Xmin mod 16 and source Xmax
  901.           *    mod 16
  902.           *  
  903.                moveq.l   #$0F,d6   ; d6<- mod 16 mask
  904.  
  905.                move.w    d2,d4          ; d4<- DST_XMIN
  906.                and.w     d6,d4          ; d4<- DST_XMIN mod 16
  907.                add.w     d4,d4          ; d4<- offset into left end mask tbl
  908.  
  909.                move.w    lf_endmask(pc,d4.w),d4        ; d4<- left endmask
  910.  
  911.                move.w    d3,d5          ; d5<- DST_XMAX
  912.                and.w     d6,d5          ; d5<- DST_XMAX mod 16
  913.                add.w     d5,d5          ; d5<- offset into right end mask tbl
  914.  
  915.                move.w    rt_endmask(pc,d5.w),d5   ; d5<-inverted right end mask
  916.                not.w     d5                       ; d5<- right end mask
  917.  
  918.  
  919.  
  920.  
  921.  
  922.                      Atari Blitter doc - Appendix A  page A.12
  923.  
  924.  
  925.  
  926.  
  927.           *  
  928.           * Skew value is (destination Xmin mod 16 - source Xmin mod 16)
  929.           * && 0x000F.  Three discriminators are used to determine the
  930.           * states of FXSR and NFSR flags:
  931.           *
  932.           *    bit 0     0: Source Xmin mod 16 =< Destination Xmin mod 16
  933.           *              1: Source Xmin mod 16 >  Destination Xmin mod 16
  934.           *
  935.           *    bit 1     0: SrcXmax/16-SrcXmin/16 <> DstXmax/16-DstXmin/16
  936.           *                   Source span              Destination span
  937.           *              1: SrcXmax/16-SrcXmin/16 == DstXmax/16-DstXmin/16
  938.           *
  939.           *    bit 2     0: multiple word Destination span
  940.           *         1: single word Destination span
  941.           *
  942.           *    These flags form an offset into a skew flag table yielding
  943.           *    correct FXSR and NFSR flag states for the given source and
  944.           *    destination alignments
  945.           *
  946.  
  947.                move.w    d2,d7     ; d7<- Dst Xmin
  948.                and.w     d6,d7     ; d7<- Dst Xmin mod16
  949.                and.w     d0,d6     ; d6<- Src Xmin mod16
  950.                sub.w     d6,d7     ; d7<- Dst Xmin mod16-Src Xmin mod16
  951.           *                        ; if Sx&F > Dx&F then cy:1 else cy:0
  952.                clr.w     d6        ; d6<- initial skew flag table index
  953.                addx.w    d6,d6     ; d6[bit0]<- intraword alignment flag
  954.  
  955.                lsr.w     #4,d0     ; d0<- word offset to src Xmin
  956.                lsr.w     #4,d1     ; d1<- word offset to src Xmax
  957.                sub.w     d0,d1     ; d1<- Src span - 1
  958.  
  959.                lsr.w     #4,d2     ; d2<- word offset to dst Xmin
  960.                lsr.w     #4,d3     ; d3<- word offset to dst Xmax
  961.                sub.w     d2,d3     ; d3<- Dst span - 1
  962.                bne       set_endmasks   ; 2nd discriminator is one word dst  
  963.  
  964.           * When destination spans a single word, both end masks are merged
  965.           * into Endmask1.  The other end masks will be ignored by the BLiTTER
  966.  
  967.                and.w     d5,d4          ; d4<- single word end mask
  968.                addq.w    #4,d6          ; d6[bit2]:1 => single word dst
  969.  
  970.           set_endmasks:
  971.  
  972.                move.w    d4,Endmask1(a5)     ; left end mask
  973.                move.w    #$FFFF,Endmask2(a5) ; center end mask
  974.                move.w    d5,Endmask3(a5)     ; right end mask
  975.  
  976.                cmp.w     d1,d3          ; the last discriminator is the
  977.                bne       set_count      ; equality of src and dst spans
  978.  
  979.                addq.w    #2,d6          ; d6[bit1]:1 => equal spans
  980.  
  981.  
  982.  
  983.  
  984.  
  985.  
  986.  
  987.  
  988.                      Atari Blitter doc - Appendix A  page A.13
  989.  
  990.  
  991.  
  992.           set_count:
  993.                move.w    d3,d4
  994.                addq.w    #1,d4          ; d4<- number of words in dst line
  995.                move.w    d4,X_Count(a5) ; set value in BLiTTER
  996.  
  997.           * Calculate Source starting address:
  998.           *
  999.           *   Source Form address              +
  1000.           *  (Source Ymin * Source Form Width) +
  1001.           * ((Source Xmin/16) * Source Xinc)  
  1002.  
  1003.                move.l    SRC_FORM(a4),a0     ; a0-> start of Src form
  1004.                move.w    SRC_YMIN(a4),d4     ; d4<- offset in lines to Src Ymin
  1005.                move.w    SRC_NXLN(a4),d5     ; d5<- length of Src form line
  1006.                mulu      d5,d4               ; d4<- byte offset to (0, Ymin)
  1007.                add.l     d4,a0               ; a0-> (0, Ymin)
  1008.  
  1009.                move.w    SRC_NXWD(a4),d4;    d4<- offset between consecutive
  1010.                move.w    d4,Src_Xinc(a5)     ;      words in Src plane
  1011.  
  1012.                mulu      d4,d0          ; d0<- offset to word containing Xmin
  1013.                add.l     d0,a0          ; a0-> 1st src word (Xmin, Ymin)
  1014.  
  1015.           * Src_Yinc is the offset in bytes from the last word of one Source
  1016.           * line to the first word of the next Source line
  1017.  
  1018.                mulu      d4,d1               ; d1<- width of src line in bytes
  1019.                sub.w     d1,d5               ; d5<- value added to ptr at end
  1020.                move.w    d5,Src_Yinc(a5)     ; of line to reach start of next
  1021.  
  1022.           * Calculate Destination starting address
  1023.  
  1024.                move.l    DST_FORM(a4),a1     ; a1-> start of dst form
  1025.                move.w    DST_YMIN(a4),d4     ; d4<- offset in lines to dst Ymin
  1026.                move.w    DST_NXLN(a4),d5     ; d5<- width of dst form
  1027.  
  1028.                mulu      d5,d4     ; d4<- byte offset to (0, Ymin)
  1029.                add.l     d4,a1     ; a1-> dst (0, Ymin)
  1030.  
  1031.                move.w    DST_NXWD(a4),d4     ; d4<- offset between consecutive
  1032.                move.w    d4,Dst_Xinc(a5)     ;  words in dst plane
  1033.  
  1034.                mulu      d4,d2               ; d2<- DST_NXWD * (DST_XMIN/16)
  1035.                add.l     d2,a1               ; a1-> 1st dst word (Xmin, Ymin)
  1036.  
  1037.           * Calculate Destination Yinc
  1038.  
  1039.                mulu      d4,d3               ; d3<- width of dst line - DST_NXWD
  1040.                sub.w     d3,d5               ; d5<- value added to dst ptr at
  1041.                move.w    d5,Dst_Yinc(a5)     ;  end of line to reach next line
  1042.  
  1043.           * The low nibble of the difference in Source and Destination alignment
  1044.           * is the skew value.  Use the skew flag index to reference FXSR and
  1045.           * NFSR states in skew flag table.
  1046.  
  1047.                and.b     #$0F,d7                  ; d7<- isolated skew count
  1048.                or.b      skew_flags(pc,d6.w),d7 ; d7<- necessary flags and skew
  1049.  
  1050.  
  1051.  
  1052.  
  1053.  
  1054.                      Atari Blitter doc - Appendix A  page A.14
  1055.  
  1056.  
  1057.  
  1058.                move.b    d7,Skew(a5)              ; load Skew register  
  1059.  
  1060.                move.b    #mHOP_Source,HOP(a5)     ; set HOP to source only
  1061.                move.b    #3,OP(a5)           ; set OP to "replace" mode
  1062.  
  1063.                lea       Line_Num(a5),a2     ; fast refer to Line_Num register
  1064.                move.b    #fLineBusy,d2       ; fast refer to LineBusy flag
  1065.                move.w    PLANES(a4),d7       ; d7 <- plane counter
  1066.                bra  begin
  1067.  
  1068.           *    T h e   s e t t i n g   o f   s k e w   f l a g s
  1069.           *
  1070.           *
  1071.           * QUALIFIERS   ACTIONS           BITBLT DIRECTION: LEFT -> RIGHT
  1072.           *
  1073.           * equal Sx&F>
  1074.           * spans Dx&F FXSR NFSR
  1075.           *
  1076.           * 0     0     0    1 |..ssssssssssssss|ssssssssssssss..|  
  1077.           *                                                                     
  1078.           |......dddddddddd|dddddddddddddddd|dd..............|  
  1079.           *  
  1080.           *    0                     1                      1                  0
  1081.           |......ssssssssss|ssssssssssssssss|ss..............|  
  1082.           *                    |..dddddddddddddd|dddddddddddddd..|  
  1083.           *  
  1084.           * 1     0     0    0 |..ssssssssssssss|ssssssssssssss..|  
  1085.           *                    |...ddddddddddddd|ddddddddddddddd.|  
  1086.           *  
  1087.           * 1     1     1    1 |...sssssssssssss|sssssssssssssss.|  
  1088.           *                    |..dddddddddddddd|dddddddddddddd..|  
  1089.  
  1090.  
  1091.           skew_flags:
  1092.  
  1093.                dc.b mSkewNFSR           ; Source span < Destination span
  1094.                dc.b mSkewFXSR           ; Source span > Destination span
  1095.                dc.b 0                   ; Spans equal Shift Source right
  1096.                dc.b mSkewNFSR+mSkewFXSR ; Spans equal Shift Source left
  1097.  
  1098.           * When Destination span is but a single word ...
  1099.  
  1100.                dc.b 0         ; Implies a Source span of no words
  1101.                dc.b mSkewFXSR ; Source span of two words
  1102.                dc.b 0         ; Skew flags aren't set if Source and
  1103.                dc.b 0         ; Destination spans are both one word
  1104.  
  1105.           next_plane:
  1106.                move.l    a0,Src_Addr(a5)     ; load Source pointer to this plane
  1107.  
  1108.                move.l    a1,Dst_Addr(a5)     ; load Dest ptr to this plane  
  1109.                move.w    HEIGHT(a4),Y_Count(a5)   ; load the line count  
  1110.  
  1111.                move.b    #mLineBusy,(a2)     ; <<< start the BLiTTER >>>  
  1112.  
  1113.                add.w     SRC_NXPL(a4),a0     ; a0-> start of next src plane  
  1114.                add.w     DST_NXPL(a4),a1     ; a1-> start of next dst plane  
  1115.  
  1116.  
  1117.  
  1118.  
  1119.  
  1120.                      Atari Blitter doc - Appendix A  page A.15
  1121.  
  1122.  
  1123.  
  1124.  
  1125.           * The BLiTTER is usually operated with the HOG flag cleared.
  1126.           * In this mode the BLiTTER and the ST's cpu share the bus equally,
  1127.           * each taking 64 bus cycles while the other is halted.  This mode
  1128.           * allows interrupts to be fielded by the cpu while an extensive
  1129.           * BitBlt is being processed by the BLiTTER.  There is a drawback in
  1130.           * that BitBlts in this shared mode may take twice as long as BitBlts
  1131.           * executed in hog mode.  Ninety percent of hog mode performance is
  1132.           * achieved while retaining robust interrupt handling via a method
  1133.           * of prematurely restarting the BLiTTER.  When control is returned
  1134.           * to the cpu by the BLiTTER, the cpu immediately resets the BUSY
  1135.           * flag, restarting the BLiTTER after just 7 bus cycles rather than
  1136.           * after the usual 64 cycles.  Interrupts pending will be serviced
  1137.           * before the restart code regains control.  If the BUSY flag is
  1138.           * reset when the Y_Count is zero, the flag will remain clear
  1139.           * indicating BLiTTER completion and the BLiTTER won't be restarted.
  1140.           *
  1141.           * (Interrupt service routines may explicitly halt the BLiTTER
  1142.           * during execution time critical sections by clearing the BUSY flag.
  1143.           * The original BUSY flag state must be restored however, before
  1144.           * termination of the interrupt service routine.)
  1145.  
  1146.           restart:
  1147.                bset.b    d2,(a2)        ; Restart BLiTTER and test the BUSY
  1148.                nop                      ; flag state.  The "nop" is executed
  1149.                bne  restart             ; prior to the BLiTTER restarting.
  1150.           *                             ; Quit if the BUSY flag was clear.  
  1151.  
  1152.           begin:
  1153.                dbra d7,next_plane
  1154.                rts
  1155.  
  1156.  
  1157.  
  1158.  
  1159.  
  1160.  
  1161.  
  1162.  
  1163.  
  1164.  
  1165.  
  1166.  
  1167.  
  1168.  
  1169.  
  1170.  
  1171.  
  1172.  
  1173.  
  1174.  
  1175.  
  1176.  
  1177.  
  1178.  
  1179.  
  1180.  
  1181.  
  1182.  
  1183.  
  1184.  
  1185.  
  1186.                      Atari Blitter doc - Appendix A  page A.16
  1187.  
  1188.  
  1189.  
  1190.                               Appendix B -- References
  1191.  
  1192.  
  1193.                [1]  Rob Pike, Leo  Guibas,  and  Dan  Ingalls, 'SIGGRAPH'84
  1194.                     Course Notes:  Bitmap Graphics', AT&T Bell Laboratories
  1195.                     1984.
  1196.  
  1197.  
  1198.                [2]  William  Newman  and  Robert  Sproull,  'Principles  of
  1199.                     Interactive   Computer   Graphics',  McGraw-Hill  1979,
  1200.                     Chapter 18.
  1201.  
  1202.  
  1203.                [3]  John Atwood, '16160 RasterOp Chip Data  Sheet', Silicon
  1204.                     Compilers   1984.      See   also   'VL16160   RasterOp
  1205.                     Graphics/Boolean Operation ALU', VLSI Technology 1986.
  1206.  
  1207.  
  1208.                [4]  Adele Goldberg and David  Robson,  'Smalltalk-80:   The
  1209.                     Language  and its Implementation', Addison-Wesley 1983,
  1210.                     Chapter 18.
  1211.  
  1212.  
  1213.  
  1214.  
  1215.  
  1216.  
  1217.  
  1218.  
  1219.  
  1220.  
  1221.  
  1222.  
  1223.  
  1224.  
  1225.  
  1226.  
  1227.  
  1228.  
  1229.  
  1230.  
  1231.  
  1232.  
  1233.  
  1234.  
  1235.  
  1236.  
  1237.  
  1238.  
  1239.  
  1240.  
  1241.  
  1242.  
  1243.  
  1244.  
  1245.  
  1246.  
  1247.  
  1248.  
  1249.  
  1250.  
  1251.  
  1252.                         Atari Blitter doc - Appendix B  B.17
  1253.