home *** CD-ROM | disk | FTP | other *** search
/ Computer Club Elmshorn Atari PD / CCE_PD.iso / pc / 0600 / CCE_0638.ZIP / CCE_0638 / INCLUDE / INCL93.ZOO / linea.h < prev    next >
C/C++ Source or Header  |  1993-07-10  |  40KB  |  1,039 lines

  1. /*
  2.  * Common include file for C interface  to low level Line A calls
  3.  *
  4.  *    ++jrb    bammi@cadence.com
  5.  */
  6. #ifndef _LINEA_H
  7. #define _LINEA_H
  8.  
  9. #ifndef _COMPILER_H
  10. #include <compiler.h>
  11. #endif
  12.  
  13. #ifdef __cplusplus
  14. extern "C" {
  15. #endif
  16.  
  17. /*****************************************************************************\
  18. *                                                                      *
  19. *                                 Defines                                     *
  20. *                                          *
  21. \*****************************************************************************/
  22.  
  23. /*
  24.  *  Object colors (default pallette)
  25.  *
  26.  */
  27. #define WHITE    0
  28. #define BLACK    1
  29. #define RED      2
  30. #define GREEN    3
  31. #define BLUE     4
  32. #define CYAN     5
  33. #define YELLOW   6
  34. #define MAGENTA  7
  35. #define LWHITE   8
  36. #define LBLACK   9
  37. #define LRED     10
  38. #define LGREEN   11
  39. #define LBLUE    12
  40. #define LCYAN    13
  41. #define LYELLOW  14
  42. #define LMAGENTA 15
  43.  
  44.  
  45. /* 
  46.  * Vdi writing modes
  47.  *
  48.  */
  49. #define MD_REPLACE 1
  50. #define MD_TRANS   2
  51. #define MD_XOR     3
  52. #define MD_ERASE   4
  53.  
  54.  
  55. /*
  56.  * Raster Op Codes
  57.  *
  58.  */
  59. #define ALL_WHITE  0
  60. #define S_AND_D    1
  61. #define    S_AND_NOTD 2
  62. #define S_ONLY     3
  63. #define NOTS_AND_D 4
  64. #define    D_ONLY     5
  65. #define S_XOR_D    6
  66. #define S_OR_D     7
  67. #define    NOT_SORD   8
  68. #define    NOT_SXORD  9
  69. #define D_INVERT  10
  70. #define    NOT_D     10
  71. #define    S_OR_NOTD 11
  72. #define NOT_S      12
  73. #define NOTS_OR_D 13
  74. #define    NOT_SANDD 14
  75. #define ALL_BLACK 15
  76.  
  77. /*
  78.  * Sprite formats
  79.  *
  80.  */
  81. #define SP_VDI        0
  82. #define SP_XOR        1
  83.  
  84. /*
  85.  * Line A Opcodes
  86.  *
  87.  */
  88. #define    INIT        0
  89. #define PUTPIXEL    1
  90. #define GETPIXEL    2
  91. #define LINE        3
  92. #define HLINE        4
  93. #define RECTANGLE    5
  94. #define FPOLYGON    6
  95. #define BITBLT        7
  96. #define TEXTBLT        8
  97. #define SHOWMOUSE    9
  98. #define HIDEMOUSE    10
  99. #define TRANMOUSE    11
  100. #define USPRITE        12
  101. #define DSPRITE        13
  102. #define CPYRASTER    14
  103. #define FSEEDFILL    15    /* ROM TOS only    */
  104.  
  105.  
  106. /*****************************************************************************\
  107. *                                                                      *
  108. *                                 Types                                       *
  109. *                                          *
  110. \*****************************************************************************/
  111.  
  112.     /*
  113.      * Global Variables at negative offsets from the Line A parameter
  114.      * block address returned by init. (I have no way of telling if this
  115.      * list is complete).
  116.      *
  117.      */
  118. /* Name   Offset  Type    Description                         */
  119. /* --------------------------------------------------------------------------*/
  120. /* V_BYTES_LIN -2  W    bytes/line for font                     */
  121. /* V_Y_MAX    -4   W    Max Y pixel value of the screen                 */
  122. /* V_STATUS   -6   W    Text Status byte                     */
  123. /*               Bit    Field        Zero        One         */
  124. /*              0    cursor flash    disabled    enabled         */
  125. /*              1    flash state     off        on         */
  126. /*              2    cursor visible  no        yes          */
  127. /*              3     end of line     no-wrap        wrap         */
  128. /*              4     inverse video   on              off          */
  129. /*                        5     cursor saved    false           true         */
  130. /* V_OFF_AD  -10   L    Font offset table address                 */
  131. /* V_X_MAX   -12   W    Max X pixel value                     */
  132. /* V_FNT_WR  -14   W    Width of Font Form in bytes (see type FONT below)    */
  133. /* V_FNT_ST  -16   W    First font ASCII code (first_ade)             */
  134. /* V_FNT_ND  -18   W    Last  font ASCII code (last_ade )                    */
  135. /* V_FNT_AD  -22   L    Font Form address                     */
  136. /*            Mono Spaced, 8 pixels wide and byte aligned, any ht. */
  137. /* V_CUR_TIM -23   B    Cursor countdown timer                     */
  138. /* V_CUR_CNT -24   B    Cursor flash interval( in frames)             */
  139. /* V_CUR_CY  -26   W    Y cursor position                     */
  140. /* V_CUR_CX  -28   W    X cursor position                     */
  141. /* V_CUR_OFF -30   W    Offset from screen base to first cell (bytes)         */
  142. /* V_CUR_AD  -34   L    Current cursor address                     */
  143. /* V_COL_FG  -36   W    Foreground color index                     */
  144. /* V_COL_BG  -38   W    Background color index                     */
  145. /* V_CEL_WR  -40   W    Offset to next vertical cell (bytes)             */
  146. /* V_CEL_MY  -42   W    Max cells high - 1                     */
  147. /* V_CEL_MX  -44   W    Max cells across - 1                     */
  148. /* V_CEL_HT  -46   W    Cell height in pixels (font form's height)         */
  149. /* --------------------------------------------------------------------------*/
  150.  
  151. /*
  152.  * Atari finally named these variables
  153.  * so here they are
  154.  *
  155.  */
  156. #define V_CEL_HT    (*((short  *)((char  *)__aline + -46L)))
  157. #define V_CEL_MX    (*((short  *)((char  *)__aline + -44L)))
  158. #define V_CEL_MY    (*((short  *)((char  *)__aline + -42L)))
  159. #define V_CEL_WR    (*((short  *)((char  *)__aline + -40L)))
  160. #define V_COL_BG    (*((short  *)((char  *)__aline + -38L)))
  161. #define V_COL_FG    (*((short  *)((char  *)__aline + -36L)))
  162. #define V_CUR_AD    (*((char  **)((char  *)__aline + -34L)))
  163. #define V_CUR_OFF   (*((short  *)((char  *)__aline + -30L)))
  164. #define V_CUR_CX    (*((short  *)((char  *)__aline + -28L)))
  165. #define V_CUR_CY    (*((short  *)((char  *)__aline + -26L)))
  166. #define V_CUR_CNT   (*((char   *)((char  *)__aline + -24L)))
  167. #define V_CUR_TIM   (*(          ((char  *)__aline + -23L)))
  168. #define V_FNT_AD    (*((char  **)((char  *)__aline + -22L)))
  169. #define V_FNT_ND    (*((short  *)((char  *)__aline + -18L)))
  170. #define V_FNT_ST    (*((short  *)((char  *)__aline + -16L)))
  171. #define V_FNT_WR    (*((short  *)((char  *)__aline + -14L)))
  172. #define V_X_MAX     (*((short  *)((char  *)__aline + -12L)))
  173. #define V_OFF_AD    (*((char  **)((char  *)__aline + -10L)))
  174. #define V_STATUS    (*((short  *)((char  *)__aline + -6L)))
  175. #define V_Y_MAX     (*((short  *)((char  *)__aline + -4L)))
  176. #define V_BYTES_LIN (*((short  *)((char  *)__aline + -2L)))
  177.  
  178.      /* more obscure variables again found at negative offset */
  179.  
  180. /* pointer to current font                         */
  181. #define    CUR_FONT    (*((__FONT **)((char *)__aline + -906L)))
  182.  
  183. /* Mouse X hot spot                               */
  184. #define M_POS_HX     (*((short *)((char *)__aline + -856L)))
  185.  
  186. /* Mouse Y hot spot                               */
  187. #define M_POS_HY     (*((short *)((char *)__aline + -854L)))
  188.  
  189. /* writing mode for mouse                        */
  190. #define M_PLANES     (*((short *)((char *)__aline + -852L)))
  191.  
  192. /* mouse bkgd color                                */
  193. #define M_CDB_BG     (*((short *)((char *)__aline + -850L)))
  194.  
  195. /* mouse fgd color                                 */
  196. #define M_CDB_FG     (*((short *)((char *)__aline + -848L)))
  197.  
  198. /* mous form, 32 words alternating words: bkgd-0, fgd-0 ... bkgd-15 fgd-16 */
  199. #define MASK_FORM     ((short *)((char *)__aline + -846L))
  200.                  
  201. /* 45 words of vq_extnd                         */
  202. #define INQ_TAB     ((short *)((char *)__aline + -782L))
  203.  
  204. /* 45 words of v_opnwk                          */
  205. #define DEV_TAB     ((short *)((char *)__aline + -692L))
  206.  
  207. /* current mous X                                */
  208. #define GCURX       (*((short *)((char *)__aline + -602L)))
  209.  
  210. /* current mous Y                                */
  211. #define GCURY       (*((short *)((char *)__aline + -600L)))
  212.  
  213. /* current mous hide cnt                        */
  214. #define M_HID_CT     (*((short *)((char *)__aline + -598L)))
  215.  
  216. /* mous button stat, bit0 = left, 1 = right,  0=up, 1=down          */
  217. #define MOUSE_BT     (*((short *)((char *)__aline + -596L)))
  218.                  
  219. /* 3*16 words of vq_color                         */
  220. #define REQ_COL     ((short *)((char *)__aline + -594L))
  221.  
  222. /* 15 words containing text, line and marker sizes in dev coords
  223.      0 min char width
  224.      1 min char height
  225.      2 max char width
  226.      3 max char height
  227.      4 min line width
  228.      5 reserved
  229.      6 max line width
  230.      7 reserved
  231.      8 min marker width
  232.      9 min marker height
  233.     10 max marker width
  234.     11 max marker height
  235.     12-14  RESERVED                                   */
  236. #define SIZ_TAB     ((short *)((char *)__aline + -498L))
  237.  
  238. /* Pointer to current virtual workstation attributes             */
  239. #define CUR_WORK     (*((short **)((char *)__aline + -464L)))
  240.  
  241. /* -> default font hdr                             */
  242. #define DEF_FONT     (*((__FONT **)((char *)__aline + -460L)) )
  243.  
  244.  
  245. /* FONT_RING is an array of four longword pointers to linked lists of
  246. font headers.  The first entry is the head pointer to the font list,
  247. the second and third are continuation fields, and the fourth is a null
  248. terminator.                                 */
  249. #define FONT_RING     ((short *)((char *)__aline + -456L))
  250.  
  251. /*  Number of fonts in the FONT_RING lists                  */
  252. #define FONT_COUNT     (*((short *)((char *)__aline + -440L)))
  253.  
  254. /* Mouse status
  255.      Bit 0 = left mouse button status  (0=up, 1=down)
  256.      Bit 1 = right mouse button status  (0=up, 1=down)
  257.      Bit 2 = reserved
  258.      Bit 3 = reserved
  259.      Bit 4 = reserved
  260.      Bit 5 = mouse movement flag  (0=no movement, 1=movement)
  261.      Bit 6 = right mouse button change flag  (0=nochange, 1=change)
  262.      Bit 7 = left mouse button change flag  (0=nochange, 1=change)      */
  263. #define CUR_MS_STAT     (*((char *)__aline + -348L))
  264.  
  265. /* Hide depth of alpha cursor                         */
  266. #define V_HID_CNT     (*((short *)((char *)__aline + -346L)))
  267.  
  268. /* Mouse cursor X position                         */
  269. #define CUR_X          (*((short *)((char *)__aline + -344L)))
  270.  
  271. /* Mouse cursor Y position                         */
  272. #define CUR_Y       (*((short *)((char *)__aline + -342L)))
  273.  
  274. /* Nonzero = draw mouse form on VBLANK.                 */
  275. #define CUR_FLAG     (*((char *)__aline + -340L))
  276.                             
  277. /* Non-zero if mouse interrupt processing is enabled             */
  278. #define MOUSE_FLAG     (*((char *)__aline + -339L))                    
  279.  
  280. /* Saved alpha cursor X coord                         */
  281. #define V_SAV_X        (*((short *)((char *)__aline + -334L)))
  282.  
  283. /* Saved alpha cursor Y coord                         */
  284. #define V_SAV_Y         (*((short *)((char *)__aline + -332L)))
  285.  
  286. /* height of saved form                         */
  287. #define SAVE_LEN          (*((short *)((char *)__aline + -330L)))
  288.  
  289. /* Screen address of first word saved from screen            */
  290. #define SAVE_ADDR        (*((char **)((char *)__aline + -328L)))
  291.    
  292. /* Save Status
  293.     bit 0 =>  1 = info in buffer is valid.
  294.               0 = info in buffer is not valid.
  295.     bit 1 =>  If 1, double-word wide area was saved.
  296.               If zero, word wide area was saved.
  297.     bits 2-15 RESERVED                             */
  298. #define SAVE_STAT      (*((short *)((char *)__aline + -324L)))
  299.  
  300. /* Save up to 4 planes, 16 longwords per plane.             */
  301. #define SAVE_AREA      ((long *)((char *)__aline + -322L))
  302.           
  303. /* USER_TIM is a pointer to a user installed routine executed on each
  304.    system timer tick.  When done, this routine should jump to the
  305.    address held in NEXT_TIM.  For more information, see the VDI manual
  306.    under Exchange Timer Interrupt Vector.                 */
  307. #define USER_TIM       (*((void(**)())((char *)__aline + -66L)))
  308. #define NEXT_TIM       (*((void(**)())((char *)__aline + -62L)))
  309.           
  310. /* User button vector */          
  311. #define USER_BUT       (*((void(**)())((char *)__aline + -58L)))
  312.  
  313. /* User cursor vector */
  314. #define USER_CUR       (*((void(**)())((char *)__aline + -54L)))
  315.  
  316. /* User motion vector */
  317. #define USER_MOT       (*((void(**)())((char *)__aline + -50L)))
  318.  
  319.  
  320.     /* A pointer to the type LINEA is returned by the Line A init call
  321.      * ($A000), in registers A0 and D0.
  322.          * This pointer is saved in the global variable '__aline'.
  323.      *
  324.      */
  325. typedef struct {
  326.  
  327. /* Type    Name       Offset   Function            Comments             */
  328. /* ------------------------------------------------------------------------- */
  329.    short  _VPLANES;   /*  0  # of Planes     Also see CurrRez            */
  330.    short  _VWRAP;     /*  2  Bytes / scan line    "    "    "                */
  331.               /*     VWRAP can be changed to implement special effect*/
  332.               /*     Doubling VWRAP will skip every other scan line  */
  333.               /*                                 */
  334.               /*                                                     */
  335.    short  *_CONTRL;   /*  4  Ptr to CONTRL Array  Contrl gets set to this    */
  336.    short  *_INTIN;    /*  8  Ptr to INTIN  Array  Intin  gets set to this    */
  337.    short  *_PTSIN;    /* 12  Ptr to PTSIN  Array  Ptsin  gets set to this    */
  338.    short  *_INTOUT;   /* 16  Ptr to INTOUT Array  Intout gets set to this    */
  339.    short  *_PTSOUT;   /* 20  Ptr to PTSOUT Array  Ptsout gets set to this    */
  340.               /*     CONTRL is the control array             */
  341.               /*     INTIN is the array of input parameters         */
  342.               /*     PTSIN is the array of input coordinates         */
  343.               /*      Even entrys are X coordinate             */
  344.               /*       Odd  entrys are corresponding Y coodinates */
  345.               /*     INTOUT is the array of output parameters        */
  346.               /*     PTSOUT is the array of output coordinates       */
  347.               /*    organized like PTSIN.                 */
  348.               /*                                 */
  349.    short  _COLBIT0;   /* 24  Plane 0 Color Value  All Three Rez's         */
  350.    short  _COLBIT1;   /* 26  Plane 1 Color Value  Med and Low Rez only         */
  351.    short  _COLBIT2;   /* 28  Plane 2 Color Value  Low Rez only              */
  352.    short  _COLBIT3;   /* 30  Plane 3 Color Value  Low Rez Only              */
  353.               /*     Foreground color COLBIT0 + 2*COLBIT1 + 4*COLBIT2*/
  354.               /*                  + 8*COLBIT3             */
  355.               /*                                 */
  356.               /*                                                     */
  357.    short  _LSTLIN;    /* 32  Draw last pixel of a line? 0=yes  non0=no         */
  358.               /*     This prevents two connecting lines from XORing  */
  359.               /*     a common endpoint out of existence             */
  360.               /*                                 */
  361.    short  _LNMASK;    /* 34  Linemask used when drawing lines, same as Vdi's */
  362.               /*     line style (rotated to aligned with rightmost   */
  363.               /*     endpoint when drawing lines)                    */
  364.               /*                                 */
  365.    short  _WMODE;     /* 36  Writing mode                                    */
  366.               /*     0=Replace Mode-Replace all bits in Dest with src*/
  367.               /*     1=Trans. Mode-Only additional bits in src set(OR*/
  368.               /*     2=Xor Mode- Src XOR Dest                 */
  369.               /*     3=Inverse Trans.- (NOT src) Or Dest             */
  370.               /*     Values upto 16 are permitted                    */
  371.               /*                                 */
  372.    short  _X1;        /* 38  X1 coordinate used in various calls             */
  373.               /*                                 */
  374.    short  _Y1;        /* 40  Y1 coordinate used in various calls             */
  375.               /*                                 */
  376.    short  _X2;        /* 42  X2 coordinate used in various calls             */
  377.               /*                                 */
  378.    short  _Y2;        /* 44  Y2 coordinate used in various calls             */
  379.               /*                                 */
  380.               /*                                                     */
  381.    short  *_PATPTR;   /* 46  Pointer to current fill pattern                 */
  382.                       /*     Must be integral power of 2 (words) in length   */
  383.    short  _PATMSK;    /* 50  I don't know why they call it a mask. It is in  */
  384.               /*     reality the length in words of the current patt.*/
  385.    short  _MFILL;     /* 52  Multi Plane fill flag 1 == Current fill Pattern */
  386.               /*     is for Muti Plane.                              */
  387.               /*                                                     */
  388.               /*                                                     */
  389.    short  _CLIP;      /* 54  Clipping Flag 1 == TRUE                         */
  390.    short  _XMINCL;    /* 56  Min X of clipping window                 */
  391.    short  _YMINCL;    /* 58  Min Y of clipping window                        */
  392.    short  _XMAXCL;    /* 60  Max X of clipping window                 */
  393.    short  _YMAXCL;    /* 62  Max Y of clipping window                        */
  394.               /*                                                     */
  395.               /*                                                     */
  396.    short  _XDDA;      /* 64  Accumulator for Scaling, Must be set to 0x08000 */
  397.                       /*     before each call to Text Blt. Done for you in   */
  398.               /*     in aline_text()                                 */
  399.    short  _DDAINC;    /* 66  Scaling factor - Fractional amount to scale char*/
  400.               /*     When scaling up = 256 *(Size-Textsize)/Textsize */
  401.               /*     When scaling down = 256*(Size)/Textsize         */
  402.               /*     scaling down does not work                      */
  403.    short  _SCALDIR;   /* 68  Scaling direction 0 == down                     */
  404.    short  _MONO;      /* 70  Mono flag 0== current font is a propotional font*/
  405.               /*     Its Ok for Thickening to increase the width of  */
  406.               /*     the current character.                          */
  407.               /*     1 == current font is mono spaced, so thickening */
  408.               /*     may not increase the width of the current char  */
  409.               /*                                                     */
  410.    short  _SOURCEX;   /* 72  X coordinate of character in the font form      */
  411.               /*     SOURCEX is calculated from info in the font     */
  412.               /*     header for the current font (see __FONT type)   */
  413.               /*     SOURCEX = off_table[char-first_ade]         */
  414.               /*     SOURCEX is calculated for you in aline_text()   */
  415.               /*     The pointer to a table of font header for the   */
  416.               /*     internal fonts is returned in A2 on init (A000) */
  417.    short  _SOURCEY;   /* 74  Y coodinate of character in the font form       */
  418.               /*     Typically set to 0 (top line of font form)         */
  419.    short  _DESTX;     /* 76  X coordinate of character on screen             */
  420.    short  _DESTY;     /* 78  Y coordinate of character on screen             */
  421.    short  _DELX;      /* 80  Width of Character                     */
  422.               /*     Difference between two SOURCEX's                 */
  423.    short  _DELY;      /* 82  Height of Character                             */
  424.               /*     form_height field of FONT_HEAD of current font  */
  425.    short  *_FBASE;    /* 84  Pointer to start of font form                   */
  426.    short  _FWIDTH;    /* 88  Width of the current font's form                */
  427.               /*                                                     */
  428.    short  _STYLE;     /* 90  Vector of style flags                 */
  429.               /*     Bit 0 = Thicken Flag                 */
  430.               /*     Bit 1 = Lighten Flag                 */
  431.               /*     Bit 2 = Skewing Flag                 */
  432.               /*     Bit 3 = Underline Flag (ignored)             */
  433.               /*     Bit 4 = Outline Flag                 */
  434.               /*                                                     */
  435.    short  _LITEMASK;  /* 92  Mask used for lightening text               */
  436.               /*     The Mask is picked up from the font header      */
  437.    short  _SKEWMASK;  /* 94  Mask used for skewing text                 */
  438.               /*     The Mask is picked up from the font header      */
  439.    short  _WEIGHT;    /* 96  The number of bits by which to thicken text     */
  440.               /*     The number is picked up from the font header    */
  441.    short  _ROFF;      /* 98  Offset above baseline when skewing              */
  442.                       /*     Again picked up from the font header            */
  443.               /*                             */
  444.    short  _LOFF;      /* 100 Offset below character baseline when skewing    */
  445.                       /*     Again picked up from the font header            */
  446.               /*                                                     */
  447.    short  _SCALE;     /* 102 Scaling Flag 1 == true                          */
  448.               /*                                                     */
  449.    short  _CHUP;      /* 104 Character rotation vector.                      */
  450.                  /*     0 = normal (0 degrees)                 */
  451.               /*     1800 = 180 degrees                     */
  452.                     /*     2700 = 270 degrees                              */
  453.               /*                                                     */
  454.    short  _TEXTFG;    /* 106 Text foreground color                 */
  455.               /*                                                     */
  456.    char  *_SCRTCHP;   /* 108 Address of buffer required for creating special */
  457.               /*     text effects. The size of this buffer should be */
  458.               /*     1K according the Internals. The Atari document  */
  459.               /*     of course does not talk about such things :-)   */
  460.                       /*                                                     */
  461.    short  _SCRPT2;    /* 112 The offset of the scaling buffer buffer in above*/
  462.                       /*     buffer. Internals suggests an offset of 0x0040  */
  463.                       /*     As usual the Atari document does'nt say a thing */
  464.                       /*                                                     */
  465.    short  _TEXTBG;    /* 114 Text background color (Ram Vdi only)            */
  466.                       /*     used for the BitBlt writing modes (4-19) only   */
  467.                       /*                                                     */
  468.    short  _COPYTRAN;  /* 116 Copy raster form type flag (Ram vdi only)       */
  469.                       /*     0 => Opaque type                                */
  470.                       /*          n-plane source  ->  n-plane dest           */
  471.                       /*              BitBlt writing modes (4-19)            */
  472.                       /*    ~0 => Transparent type                           */
  473.                       /*          1-plane source  ->  n-plane dest           */
  474.                       /*              Vdi writing modes (1-3)                */
  475.                       /*                                                     */
  476.  short(*_SEEDABORT) __PROTO((void));
  477.               /* 118 Pointer to function returning int, which is     */
  478.                       /*     called by the fill logic to allow the fill to   */
  479.                       /*     be aborted. If the routine returns FALSE (0)    */
  480.                       /*     the fill is not aborted. If it returns TRUE (~0)*/
  481.                       /*     the fill is aborted                             */
  482. /* ------------------------------------------------------------------------- */
  483.  
  484. } __LINEA;            /*       P H E W !!!!!                                 */
  485.  
  486. /* macros for MWC compatibility */
  487. #define    VPLANES        (__aline->_VPLANES)
  488. #define    VWRAP        (__aline->_VWRAP)
  489. #define    CONTRL        (__aline->_CONTRL)
  490. #define    INTIN        (__aline->_INTIN)
  491. #define    PTSIN        (__aline->_PTSIN)
  492. #define    INTOUT        (__aline->_INTOUT)
  493. #define    PTSOUT        (__aline->_PTSOUT)
  494. #define    COLBIT0        (__aline->_COLBIT0)
  495. #define    COLBIT1        (__aline->_COLBIT1)
  496. #define    COLBIT2        (__aline->_COLBIT2)
  497. #define    COLBIT3        (__aline->_COLBIT3)
  498. #define    LSTLIN        (__aline->_LSTLIN)
  499. #define    LNMASK        (__aline->_LNMASK)
  500. #define    WMODE        (__aline->_WMODE)
  501. #define    X1        (__aline->_X1)
  502. #define    Y1        (__aline->_Y1)
  503. #define    X2        (__aline->_X2)
  504. #define    Y2        (__aline->_Y2)
  505. #define    PATPTR        (__aline->_PATPTR)
  506. #define    PATMSK        (__aline->_PATMSK)
  507. #define    MFILL        (__aline->_MFILL)
  508. #define    CLIP        (__aline->_CLIP)
  509. #define    XMINCL        (__aline->_XMINCL)
  510. #define    YMINCL        (__aline->_YMINCL)
  511. #define    XMAXCL        (__aline->_XMAXCL)
  512. #define    YMAXCL        (__aline->_YMAXCL)
  513. #define    XDDA        (__aline->_XDDA)
  514. #define    DDAINC        (__aline->_DDAINC)
  515. #define    SCALDIR        (__aline->_SCALDIR)
  516. #define    MONO        (__aline->_MONO)
  517. #define    SOURCEX        (__aline->_SOURCEX)
  518. #define    SOURCEY        (__aline->_SOURCEY)
  519. #define    DESTX        (__aline->_DESTX)
  520. #define    DESTY        (__aline->_DESTY)
  521. #define    DELX        (__aline->_DELX)
  522. #define    DELY        (__aline->_DELY)
  523. #define    FBASE        (__aline->_FBASE)
  524. #define    FWIDTH        (__aline->_FWIDTH)
  525. #define    STYLE        (__aline->_STYLE)
  526. #define    LITEMASK    (__aline->_LITEMASK)
  527. #define    SKEWMASK    (__aline->_SKEWMASK)
  528. #define    WEIGHT        (__aline->_WEIGHT)
  529. #define    ROFF        (__aline->_ROFF)
  530. #define    LOFF        (__aline->_LOFF)
  531. #define    SCALE        (__aline->_SCALE)
  532. #define    CHUP        (__aline->_CHUP)
  533. #define    TEXTFG        (__aline->_TEXTFG)
  534. #define    SCRTCHP        (__aline->_SCRTCHP)
  535. #define    SCRPT2        (__aline->_SCRPT2)
  536. #define    TEXTBG        (__aline->_TEXTBG)
  537. #define    COPYTRAN    (__aline->_COPYTRAN)
  538. #define    SEEDABORT    (__aline->_SEEDABORT)
  539.  
  540.     /* A pointer to array of type __FONT is returned by the Line A 
  541.      * init call ($A000), in register A1.
  542.          * This pointer is saved in the global array variable 'fonts[]'.
  543.      *
  544.      */
  545.  
  546. typedef struct _font {
  547.  
  548. /* Type    Name       Offset   Function            Comments             */
  549. /* ------------------------------------------------------------------------- */
  550.    short  font_id;    /*  0 Font face identifier  1 == system font           */
  551.                       /*                                                     */
  552.    short  size;       /*  2 Font size in points                              */
  553.                       /*                                                     */
  554.    char   name[32];   /*  4 Face name                                        */
  555.                       /*                                                     */
  556.    short  first_ade;  /* 36 Lowest ADE value in the face (lowest ASCII value */
  557.                       /*    of displayable character).                       */
  558.                       /*                                                     */
  559.    short  last_ade;   /* 38 Highest ADE value in the face (highest ASCII valu*/
  560.                       /*    of displayable character).                       */
  561.                       /*                                                     */
  562.    short  top;        /* 40 Distance of top line relative to baseline        */
  563.                       /*                                                     */
  564.    short  ascent;     /* 42 Distance of ascent line relative to baseline     */
  565.                       /*                                                     */
  566.    short  half;       /* 44 Distance of half line relative to baseline       */
  567.                       /*                                                     */
  568.    short  descent;    /* 46 Distance of decent line relative to baseline     */
  569.                       /*                                                     */
  570.    short  bottom;     /* 48 Distance of bottom line relative to baseline     */
  571.                       /*    All distances are measured in absolute values    */
  572.                       /*    rather than as offsets. They are always +ve      */
  573.                       /*                                                     */
  574. short max_char_width; /* 50 Width of the widest character in font            */
  575.                       /*                                                     */
  576. short max_cell_width; /* 52 Width of the widest cell character cell in face  */
  577.                       /*                                                     */
  578.   short left_offset;  /* 54 Left Offset see Vdi appendix G                   */
  579.                       /*                                                     */
  580.   short right_offset; /* 56 Right offset   "      "     "                    */
  581.                       /*                                                     */
  582.    short  thicken;    /* 58 Number of pixels by which to thicken characters  */
  583.                       /*                                                     */
  584.    short  ul_size;    /* 60 Width in  pixels of the underline                */
  585.                       /*                                                     */
  586.    short  lighten;    /* 62 The mask used to lighten characters              */
  587.                       /*                                                     */
  588.    short  skew;       /* 64 The mask used to determine when to perform       */
  589.                       /*    additional rotation on the character to perform  */
  590.                       /*    skewing                                          */
  591.                       /*                                                     */
  592.    short  flags;      /* 66 Flags                                            */
  593.                       /*      bit 0 set if default system font               */
  594.                       /*      bit 1 set if horiz offset table should be used */
  595.                       /*      bit 2 byte-swap flag (thanks to Intel idiots)  */
  596.                       /*      bit 3 set if mono spaced font                  */
  597.                       /*                                                     */
  598.    char   *h_table;   /* 68 Pointer to horizontal offset table               */
  599.                       /*                                                     */
  600.    short  *off_table; /* 72 Pointer to character offset table                */
  601.                       /*                                                     */
  602.    char   *dat_table; /* 76 Pointer to font data                             */
  603.                       /*                                                     */
  604.    short  form_width; /* 80 Form width (#of bytes /scanline in font data)    */
  605.                       /*                                                     */
  606.    short  form_height;/* 82 Form height (#of scanlines in font data)         */
  607.                       /*                                                     */
  608.  struct _font *next_font;  /* 84 Pointer to next font in face                */
  609.                       /*                                                     */
  610. /* ------------------------------------------------------------------------- */
  611. } __FONT;
  612.  
  613.     /* function pointer array
  614.          * pointer to array is returned in A2 after a init (A000) call
  615.      * array contains pointers to the 16 lineA routines, allowing
  616.      * you to call the routines directly without incurring the
  617.      * overhead of processing a lineA exception. You must be in
  618.      * supervisor mode to call any of the routines directly
  619.      */
  620. typedef short(*FPTR) __PROTO((void));
  621. typedef FPTR *FUNCPTR; /* array of pointers to functions returning short */
  622.     
  623.     /*
  624.      * OP_TAB type required for Bit Blt parameter block.
  625.      * each entry defines the logic operation to apply for
  626.      * the 4 Fore/Back ground bit combinations
  627.      */
  628. typedef struct {
  629.  
  630. /* Type    Name       Offset   Function            Comments             */
  631. /* ------------------------------------------------------------------------- */
  632.    char   fg0bg0;     /* 0    Logic op to employ when both FG and BG are 0 */
  633.    char   fg0bg1;     /* 1    Logic op to employ when FG = 0 and BG = 1    */
  634.    char   fg1bg0;     /* 2    Logic op to employ when FG = 1 and BG = 0    */
  635.    char   fg1bg1;     /* 3    Logic op to employ when both FG and BG are 1 */
  636. /* ------------------------------------------------------------------------- */
  637. } OP_TAB;
  638.  
  639.  
  640. /*
  641.  * Source and destination description blocks
  642.  */
  643. typedef struct  {
  644.     short    bl_xmin;        /* Minimum x            */
  645.     short    bl_ymin;        /* Minimum y             */
  646.     char    *bl_form;        /* short aligned memory form     */
  647.     short    bl_nxwd;        /* Offset to next word in line  */
  648.     short     bl_nxln;        /* Offset to next line in plane */
  649.     short     bl_nxpl;        /* Offset to next plane     */
  650. }SDDB;
  651.  
  652.     /* Offsets to next word in plane */
  653. #define HI_NXWD        2        /* Hi Rez            */
  654. #define MED_NXWD    4
  655. #define LOW_NXWD    8        /* lo Rez            */
  656.  
  657.     /* Scan line widths of the screen */
  658. #define HI_NXLN        80        /* Hi Rez            */
  659. #define MED_NXLN    160
  660. #define LOW_NXLN    160        /* lo Rez            */
  661.  
  662.     /*
  663.      * Offsets between planes - always the same due to
  664.      * the way the STs video memory is laid out
  665.          */
  666. #define NXPL        2
  667.  
  668.     /* 
  669.      * Bit Blt Parameter Block Type (for function $A007)
  670.      *
  671.      */
  672.  
  673. typedef struct {
  674.  
  675. /* Type    Name           Offset   Function            Comments         */
  676. /* ------------------------------------------------------------------------- */
  677.    short   bb_b_wd;     /*     width of block in pixels              */
  678.    short   bb_b_ht;     /*     height of block in pixels             */
  679.    short   bb_plane_ct; /*     number of planes to blit              */
  680.    short   bb_fg_col;   /*     foreground color                  */
  681.    short   bb_bg_col;   /*     back    ground color                  */
  682.    OP_TAB  bb_op_tab;   /*     logic for fg x bg combination              */
  683.    SDDB       bb_s;        /*     source info block                 */
  684.    SDDB       bb_d;        /*     destination info block              */
  685.    short   *bb_p_addr;  /*     pattern buffer address              */
  686.    short   bb_p_nxln;   /*     offset to next line in pattern          */
  687.    short   bb_p_nxpl;   /*     offset to next plane in pattern          */
  688.    short   bb_p_mask;   /*     pattern index mask                  */
  689.    char       bb_fill[24];    /*     work space                     */
  690. /* ------------------------------------------------------------------------- */
  691. } BBPB;
  692.  
  693.  
  694. #ifndef __MFDB__
  695. #define __MFDB__
  696. /*
  697.  * Memory Form Definition Block
  698.  *
  699.  */
  700. typedef struct
  701. {
  702.     char        *fd_addr;    /* Address of upper left corner of first*/
  703.                                      /* plane of raster area. If NULL then   */
  704.                                      /* MFDB is for a physical device        */
  705.     short        fd_w;         /* Form Width in Pixels                 */
  706.     short        fd_h;        /* Form Height in Pixels                */
  707.     short        fd_wdwidth;  /* Form Width in shorts(fd_w/sizeof(int)*/
  708.     short        fd_stand;    /* Form format 0= device spec 1=standard*/
  709.     short        fd_nplanes;  /* Number of memory planes              */
  710.     short        fd_r1;       /* Reserved                             */
  711.     short        fd_r2;       /* Reserved                             */
  712.     short        fd_r3;       /* Reserved                             */
  713. } MFDB;
  714. #endif /* __MFDB__ */
  715.  
  716. /*
  717.  * Sprite definition block
  718.  *
  719.  */
  720. typedef struct
  721. {
  722.     short    sp_xhot;        /* Offset to X hot spot        */
  723.     short    sp_yhot;        /* Offset to Y hot spot        */
  724.     short    sp_format;        /* Format SP_VDI or SP_XOR     */
  725.     short    sp_bg;            /* Background color        */
  726.     short    sp_fg;            /* Foregroud color        */
  727.     short    sp_data[32];        /* Sprite data -         */
  728.                     /* Alternating words of back/fore */
  729.                     /* ground data              */
  730.                     /* Note that:              */
  731.                     /*   sprite save block is         */
  732.                     /*  10+VPLANES*64 bytes long      */
  733. } SFORM;
  734.  
  735.  
  736.  
  737. /*****************************************************************************\
  738. *                                                                      *
  739. *                             Global Variables                      *
  740. *                                                                      *
  741. \*****************************************************************************/
  742.  
  743.     /*
  744.      * Global Variables are defined in alglobal.c, extern every where else
  745.      *
  746.      */
  747.  
  748.     /* global vars */
  749. /* Pointer to line a parameter block returned by init     */
  750. extern __LINEA *__aline;
  751.  
  752. /* Array of pointers to the three system font  headers 
  753.    returned by init (in register A1)                   */
  754. extern __FONT  **__fonts;
  755.  
  756. /* Array of pointers to the 16 line a functions returned
  757.    by init (in register A2) only valid in ROM'ed TOS     */
  758. extern short  (**__funcs) __PROTO((void));
  759.  
  760.     /* Functions */
  761.  
  762. #ifdef __LATTICE__
  763.  
  764. void linea0(void);
  765. void linea1(void);
  766. int linea2(void);
  767. void linea3(void);
  768. void linea4(void);
  769. void linea5(void);
  770. void linea6(void);
  771. void linea7(BBPB *);
  772. void linea8(void);
  773. void linea9(void);
  774. void lineaa(void);
  775. void lineab(void);
  776. void lineac(void *);
  777. void linead(int,int,SFORM *,void *);
  778. void lineae(void);
  779. void lineaf(void);
  780.  
  781. #pragma inline linea1()    {register d2,a2; "a001";}
  782. #pragma inline d0=linea2()    {register d2,a2; "a002";}
  783. #pragma inline linea3()    {register d2,a2; "a003";}
  784. #pragma inline linea4()    {register d2,a2; "a004";}
  785. #pragma inline linea5()    {register d2,a2; "a005";}
  786. #pragma inline linea6()    {register d2,a2; "a006";}
  787. #pragma inline linea7(a6)    {register d2,a2; "a007";}
  788. #pragma inline linea8()    {register d2,a2; "a008";}
  789. #pragma inline linea9()    {register d2,a2; "a009";}
  790. #pragma inline lineaa()    {register d2,a2; "a00a";}
  791. #pragma inline lineab()    {register d2,a2; "a00b";}
  792. #pragma inline lineac(a2)    {register d2,a6; "a00c";}
  793. #pragma inline linead(d0,d1,a0,a2)    {register d2,a6; "a00d";}
  794. #pragma inline lineae()    {register d2,a2; "a00e";}
  795. #pragma inline lineaf()    {register d2,a2; "a00f";}
  796.  
  797. #else
  798.  
  799. #ifdef __GNUC_INLINE__
  800.  
  801. #define linea0()                             \
  802. ({                                    \
  803.                                         \
  804.     __asm__ volatile                        \
  805.     ("\
  806.         .word   0xA000; \
  807.         movl    a0,%0;    \
  808.         movl    a1,%1;    \
  809.         movl    a2,%2"                        \
  810.     : "=g"(__aline), "=g"(__fonts), "=g"(__funcs)     /* outputs */    \
  811.     :                           /* inputs  */    \
  812.     : "d0", "d1", "d2", "a0", "a1", "a2"       /* clobbered regs */    \
  813.     );                                \
  814. })
  815.  
  816. #define linea1()                             \
  817. ({                                    \
  818.                                         \
  819.     __asm__ volatile                        \
  820.     ("\
  821.         .word   0xA001" \
  822.     :                           /* outputs */    \
  823.     :                           /* inputs  */    \
  824.     : "d0", "d1", "d2", "a0", "a1", "a2"       /* clobbered regs */    \
  825.     );                                \
  826. })
  827.  
  828. #define linea2()                             \
  829. ({                                    \
  830.     short retvalue;                            \
  831.     __asm__ volatile                        \
  832.     ("\
  833.         .word   0xA002;  \
  834.          movew    d0,%0"   \
  835.     : "=g"(retvalue)                  /* outputs */    \
  836.     :                           /* inputs  */    \
  837.     : "d0", "d1", "d2", "a0", "a1", "a2"       /* clobbered regs */    \
  838.     );                                \
  839.     (int)retvalue;                            \
  840. })
  841.  
  842. #define linea3()                             \
  843. ({                                    \
  844.                                         \
  845.     __asm__ volatile                        \
  846.     ("\
  847.         .word   0xA003" \
  848.     :                           /* outputs */    \
  849.     :                           /* inputs  */    \
  850.     : "d0", "d1", "d2", "a0", "a1", "a2"       /* clobbered regs */    \
  851.     );                                \
  852. })
  853.  
  854. #define linea4()                             \
  855. ({                                    \
  856.                                         \
  857.     __asm__ volatile                        \
  858.     ("\
  859.         .word   0xA004" \
  860.     :                           /* outputs */    \
  861.     :                           /* inputs  */    \
  862.     : "d0", "d1", "d2", "a0", "a1", "a2"       /* clobbered regs */    \
  863.     );                                \
  864. })
  865.  
  866. #define linea5()                             \
  867. ({                                    \
  868.                                         \
  869.     __asm__ volatile                        \
  870.     ("\
  871.         .word   0xA005" \
  872.     :                           /* outputs */    \
  873.     :                           /* inputs  */    \
  874.     : "d0", "d1", "d2", "a0", "a1", "a2"       /* clobbered regs */    \
  875.     );                                \
  876. })
  877.  
  878. #define linea6()                             \
  879. ({                                    \
  880.                                         \
  881.     __asm__ volatile                        \
  882.     ("\
  883.         .word   0xA006" \
  884.     :                           /* outputs */    \
  885.     :                           /* inputs  */    \
  886.     : "d0", "d1", "d2", "a0", "a1", "a2"       /* clobbered regs */    \
  887.     );                                \
  888. })
  889.  
  890. #define linea7(P)                             \
  891. ({                                    \
  892.                                         \
  893.     __asm__ volatile                        \
  894.     ("\
  895.         movml    d2/a2/a6, sp@-; \
  896.          movl    %0,a6;  \
  897.         .word   0xA007; \
  898.         movml    sp@+, d2/a2/a6" \
  899.     :                           /* outputs */    \
  900.     : "r"(P)                      /* inputs  */    \
  901.     : "d0", "d1", "a0", "a1"          /* clobbered regs */    \
  902.     );                                \
  903. })
  904.  
  905. #define linea8()                             \
  906. ({                                    \
  907.                                         \
  908.     __asm__ volatile                        \
  909.     ("\
  910.         .word   0xA008" \
  911.     :                           /* outputs */    \
  912.     :                           /* inputs  */    \
  913.     : "d0", "d1", "d2", "a0", "a1", "a2"       /* clobbered regs */    \
  914.     );                                \
  915. })
  916.  
  917. #define linea9()                             \
  918. ({                                    \
  919.                                         \
  920.     __asm__ volatile                        \
  921.     ("\
  922.         .word   0xA009" \
  923.     :                           /* outputs */    \
  924.     :                           /* inputs  */    \
  925.     : "d0", "d1", "d2", "a0", "a1", "a2"       /* clobbered regs */    \
  926.     );                                \
  927. })
  928.  
  929. #define lineaa()                             \
  930. ({                                    \
  931.                                         \
  932.     __asm__ volatile                        \
  933.     ("\
  934.         .word   0xA00A" \
  935.     :                           /* outputs */    \
  936.     :                           /* inputs  */    \
  937.     : "d0", "d1", "d2", "a0", "a1", "a2"       /* clobbered regs */    \
  938.     );                                \
  939. })
  940.  
  941. #define lineab()                             \
  942. ({                                    \
  943.                                         \
  944.     __asm__ volatile                        \
  945.     ("\
  946.         .word   0xA00B" \
  947.     :                           /* outputs */    \
  948.     :                           /* inputs  */    \
  949.     : "d0", "d1", "d2", "a0", "a1", "a2"       /* clobbered regs */    \
  950.     );                                \
  951. })
  952.  
  953. #define lineac(P)                             \
  954. ({                                    \
  955.                                         \
  956.     __asm__ volatile                        \
  957.     ("\
  958.          movl    %0,a2;    \
  959.         movl    a6,sp@-;\
  960.         .word   0xA00C; \
  961.         movl    sp@+,a6"\
  962.     :                           /* outputs */    \
  963.     : "g"(P)                      /* inputs  */    \
  964.     : "d0", "d1", "d2", "a0", "a1", "a2"       /* clobbered regs */    \
  965.     );                                \
  966. })
  967.  
  968. #define linead(x, y, sd, ss)    __linead((short)x, (short)y, (void *)sd, (void *)ss)
  969. #define __linead(x, y,  sd, ss)                        \
  970. ({                                    \
  971.                                         \
  972.     __asm__ volatile                        \
  973.     ("\
  974.          movw    %0,d0;  \
  975.          movw    %1,d1;  \
  976.          movl    %2,a0;  \
  977.          movl    %3,a2;  \
  978.         movl    a6,sp@-;\
  979.         .word   0xA00D; \
  980.         movl    sp@+,a6"\
  981.     :                           /* outputs */    \
  982.     : "g"(x), "g"(y), "g"(sd), "g"(ss)          /* inputs  */    \
  983.     : "d0", "d1", "d2", "a0", "a1", "a2"       /* clobbered regs */    \
  984.     );                                \
  985. })
  986.  
  987. #define lineae()                             \
  988. ({                                    \
  989.                                         \
  990.     __asm__ volatile                        \
  991.     ("\
  992.         .word   0xA00E" \
  993.     :                           /* outputs */    \
  994.     :                           /* inputs  */    \
  995.     : "d0", "d1", "d2", "a0", "a1", "a2"       /* clobbered regs */    \
  996.     );                                \
  997. })
  998.  
  999. #define lineaf()                             \
  1000. ({                                    \
  1001.                                         \
  1002.     __asm__ volatile                        \
  1003.     ("\
  1004.         .word   0xA00F" \
  1005.     :                           /* outputs */    \
  1006.     :                           /* inputs  */    \
  1007.     : "d0", "d1", "d2", "a0", "a1", "a2"       /* clobbered regs */    \
  1008.     );                                \
  1009. })
  1010.  
  1011. #else    /* __NO_INLINE__ */
  1012.  
  1013. __EXTERN void linea0 __PROTO((void));
  1014. __EXTERN void linea1 __PROTO((void));
  1015. __EXTERN int linea2 __PROTO((void));
  1016. __EXTERN void linea3 __PROTO((void));
  1017. __EXTERN void linea4 __PROTO((void));
  1018. __EXTERN void linea5 __PROTO((void));
  1019. __EXTERN void linea6 __PROTO((void));
  1020. __EXTERN void linea7 __PROTO((BBPB *P));
  1021. __EXTERN void linea8 __PROTO((void));
  1022. __EXTERN void linea9 __PROTO((void));
  1023. __EXTERN void lineaa __PROTO((void));
  1024. __EXTERN void lineab __PROTO((void));
  1025. __EXTERN void lineac __PROTO((void *P));
  1026. __EXTERN void linead __PROTO((int x, int y, SFORM *sd, void *ss));
  1027. __EXTERN void lineae __PROTO((void));
  1028. __EXTERN void lineaf __PROTO((void));
  1029.  
  1030. #endif /* __GNUC_INLINE__ */
  1031.  
  1032. #endif /* __LATTICE__ */
  1033.  
  1034. #ifdef __cplusplus
  1035. }
  1036. #endif
  1037.  
  1038. #endif /* _LINEA_H */
  1039.