|
|
1.1 root 1: /*
2: * UAE - The U*nix Amiga Emulator
3: *
4: * Picasso96 Support Module Header
5: *
6: * Copyright 1997 Brian King <[email protected], [email protected]>
7: */
8:
9: #if defined PICASSO96_SUPPORTED
10:
11: #define PICASSO96
12:
13: #define JAM1 0
14: #define JAM2 1
15: #define COMP 2
16: #define INVERS 4
17:
18: struct ScreenResolution
19: {
20: uae_u32 width; /* in pixels */
21: uae_u32 height; /* in pixels */
22: };
23:
24: #define MAX_PICASSO_MODES 64
25:
26: struct PicassoResolution
27: {
28: struct Resolutions *next;
29: struct ScreenResolution res;
30: int depth;
31: int refresh;
32: char name[25];
33: };
34: extern struct PicassoResolution DisplayModes[MAX_PICASSO_MODES];
35:
36:
37: /* Types for RGBFormat used */
38: typedef enum {
39: RGBFB_NONE, /* no valid RGB format (should not happen) */
40: RGBFB_CLUT, /* palette mode, set colors when opening screen using
41: tags or use SetRGB32/LoadRGB32(...) */
42: RGBFB_R8G8B8, /* TrueColor RGB (8 bit each) */
43: RGBFB_B8G8R8, /* TrueColor BGR (8 bit each) */
44: RGBFB_R5G6B5PC, /* HiColor16 (5 bit R, 6 bit G, 5 bit B),
45: format: gggbbbbbrrrrrggg */
46: RGBFB_R5G5B5PC, /* HiColor15 (5 bit each), format: gggbbbbb0rrrrrgg */
47: RGBFB_A8R8G8B8, /* 4 Byte TrueColor ARGB (A unused alpha channel) */
48: RGBFB_A8B8G8R8, /* 4 Byte TrueColor ABGR (A unused alpha channel) */
49: RGBFB_R8G8B8A8, /* 4 Byte TrueColor RGBA (A unused alpha channel) */
50: RGBFB_B8G8R8A8, /* 4 Byte TrueColor BGRA (A unused alpha channel) */
51: RGBFB_R5G6B5, /* HiColor16 (5 bit R, 6 bit G, 5 bit B),
52: format: rrrrrggggggbbbbb */
53: RGBFB_R5G5B5, /* HiColor15 (5 bit each), format: 0rrrrrgggggbbbbb */
54: RGBFB_B5G6R5PC, /* HiColor16 (5 bit R, 6 bit G, 5 bit B),
55: format: gggrrrrrbbbbbggg */
56: RGBFB_B5G5R5PC, /* HiColor15 (5 bit each), format: gggrrrrr0bbbbbbgg */
57:
58: /* By now, the following formats are for use with a hardware window only
59: (bitmap operations may be implemented incompletely) */
60:
61: RGBFB_Y4U2V2, /* 2 Byte TrueColor YUV (CCIR recommendation CCIR601).
62: Each two-pixel unit is stored as one longword
63: containing luminance (Y) for each of the two pixels,
64: and chrominance (U,V) for alternate pixels.
65: The missing chrominance values are generated by
66: interpolation. (Y1-U0-Y0-V0) */
67: RGBFB_Y4U1V1, /* 1 Byte TrueColor ACCUPAK. Four adjacent pixels form
68: a packet of 5 bits Y (luminance) each pixel and 6 bits
69: U and V (chrominance) shared by the four pixels */
70:
71: RGBFB_MaxFormats
72: } RGBFTYPE;
73:
74: #define RGBFF_NONE (1<<RGBFB_NONE)
75: #define RGBFF_CLUT (1<<RGBFB_CLUT)
76: #define RGBFF_R8G8B8 (1<<RGBFB_R8G8B8)
77: #define RGBFF_B8G8R8 (1<<RGBFB_B8G8R8)
78: #define RGBFF_R5G6B5PC (1<<RGBFB_R5G6B5PC)
79: #define RGBFF_R5G5B5PC (1<<RGBFB_R5G5B5PC)
80: #define RGBFF_A8R8G8B8 (1<<RGBFB_A8R8G8B8)
81: #define RGBFF_A8B8G8R8 (1<<RGBFB_A8B8G8R8)
82: #define RGBFF_R8G8B8A8 (1<<RGBFB_R8G8B8A8)
83: #define RGBFF_B8G8R8A8 (1<<RGBFB_B8G8R8A8)
84: #define RGBFF_R5G6B5 (1<<RGBFB_R5G6B5)
85: #define RGBFF_R5G5B5 (1<<RGBFB_R5G5B5)
86: #define RGBFF_B5G6R5PC (1<<RGBFB_B5G6R5PC)
87: #define RGBFF_B5G5R5PC (1<<RGBFB_B5G5R5PC)
88: #define RGBFF_Y4U2V2 (1<<RGBFB_Y4U2V2)
89: #define RGBFF_Y4U1V1 (1<<RGBFB_Y4U1V1)
90:
1.1.1.2 ! root 91: #define RGBMASK_8BIT RGBFF_CLUT
! 92: #define RGBMASK_16BIT (RGBFF_R5G6B5PC | RGBFF_B5G6R5PC | RGBFF_R5G6B5)
! 93: #define RGBMASK_15BIT (RGBFF_R5G5B5PC | RGBFF_B5G5R5PC | RGBFF_R5G5B5)
! 94: #define RGBMASK_24BIT (RGBFF_R8G8B8 | RGBFF_B8G8R8)
! 95: #define RGBMASK_32BIT (RGBFF_A8R8G8B8 | RGBFF_A8B8G8R8 | RGBFF_R8G8B8A8 | RGBFF_B8G8R8A8)
! 96:
1.1 root 97: /************************************************************************/
98:
99: #define RGBFF_PLANAR RGBFF_NONE
100: #define RGBFF_CHUNKY RGBFF_CLUT
101:
102: #define RGBFB_PLANAR RGBFB_NONE
103: #define RGBFB_CHUNKY RGBFB_CLUT
104:
105: /************************************************************************/
106:
1.1.1.2 ! root 107: enum {
1.1 root 108: PLANAR,
109: CHUNKY,
110: HICOLOR,
111: TRUECOLOR,
112: TRUEALPHA,
113: MAXMODES
114: };
115:
116: /************************************************************************/
117: struct MyCLUTEntry {
118: uae_u8 Red;
119: uae_u8 Green;
120: uae_u8 Blue;
121: uae_u8 Pad;
122: };
123:
124: struct ColorIndexMapping {
125: uae_u32 ColorMask;
126: uae_u32 Colors[256];
127: };
128:
129: struct CLUTEntry {
130: uae_u8 Red;
131: uae_u8 Green;
132: uae_u8 Blue;
133: };
134:
135: #define PSSO_BitMap_BytesPerRow 0
136: #define PSSO_BitMap_Rows 2
137: #define PSSO_BitMap_Flags 4
138: #define PSSO_BitMap_Depth 5
139: #define PSSO_BitMap_pad 6
140: #define PSSO_BitMap_Planes 8
141: #define PSSO_BitMap_sizeof 40
142:
143: struct BitMap
144: {
145: uae_u16 BytesPerRow;
146: uae_u16 Rows;
147: uae_u8 Flags;
148: uae_u8 Depth;
149: uae_u16 pad;
150: uae_u8 *Planes[8];
151: };
152:
153: /************************************************************************/
154:
155: #define SETTINGSNAMEMAXCHARS 30
1.1.1.2 ! root 156: #define BOARDNAMEMAXCHARS 30
1.1 root 157:
1.1.1.2 ! root 158: struct Settings {
1.1 root 159: uae_u32 BoardType;
160: /* a value discribing assignment to nth board local to boardtype
161: * to be used for reassignment when boards are added or removed. */
162: uae_u16 LocalOrdering;
163: uae_s16 LastSelected;
164: char NameField[SETTINGSNAMEMAXCHARS];
165: /* neu! */
166: char *BoardName;
167: };
168:
169: #define MAXRESOLUTIONNAMELENGTH 22
170:
171: /********************************
172: * only used within rtg.library *
173: ********************************/
174:
175: #define PSSO_LibResolution_P96ID 14
176: #define PSSO_LibResolution_Name 20
177: #define PSSO_LibResolution_DisplayID 42 /* Name + MAXRESOLUTIONNAMELENGTH */
178: #define PSSO_LibResolution_Width 46
179: #define PSSO_LibResolution_Height 48
180: #define PSSO_LibResolution_Flags 50
181: #define PSSO_LibResolution_Modes 52
182: #define PSSO_LibResolution_BoardInfo (52 + MAXMODES*4)
183: #define PSSO_LibResolution_sizeof (60 + MAXMODES*4)
184:
1.1.1.2 ! root 185: struct LibResolution {
1.1 root 186: char P96ID[6];
187: char Name[MAXRESOLUTIONNAMELENGTH];
188: uae_u32 DisplayID;
189: uae_u16 Width;
190: uae_u16 Height;
191: uae_u16 Flags;
192: uaecptr Modes[MAXMODES];
193: uaecptr BoardInfo;
194: };
195:
196: #define P96B_FAMILY 0 /* obsolete (Resolution is an entire family) */
197: #define P96B_PUBLIC 1 /* Resolution should be added to the public */
198: #define P96B_MONITOOL 2
199:
200: #define P96F_FAMILY (1<<P96B_FAMILY) /* obsolete */
201: #define P96F_PUBLIC (1<<P96B_PUBLIC)
202: #define P96F_MONITOOL (1<<P96B_MONITOOL)
203:
204: #define PSSO_ModeInfo_OpenCount 14
205: #define PSSO_ModeInfo_Active 16
206: #define PSSO_ModeInfo_Width 18
207: #define PSSO_ModeInfo_Height 20
208: #define PSSO_ModeInfo_Depth 22
209: #define PSSO_ModeInfo_Flags 23
210: #define PSSO_ModeInfo_HorTotal 24
211: #define PSSO_ModeInfo_HorBlankSize 26
212: #define PSSO_ModeInfo_HorSyncStart 28
213: #define PSSO_ModeInfo_HorSyncSize 30
214: #define PSSO_ModeInfo_HorSyncSkew 32
215: #define PSSO_ModeInfo_HorEnableSkew 33
216: #define PSSO_ModeInfo_VerTotal 34
217: #define PSSO_ModeInfo_VerBlankSize 36
218: #define PSSO_ModeInfo_VerSyncStart 38
219: #define PSSO_ModeInfo_VerSyncSize 40
220: #define PSSO_ModeInfo_first_union 42
221: #define PSSO_ModeInfo_second_union 43
222: #define PSSO_ModeInfo_PixelClock 44
223: #define PSSO_ModeInfo_sizeof 48
224:
225: #define PSSO_RenderInfo_Memory 0
226: #define PSSO_RenderInfo_BytesPerRow 4
227: #define PSSO_RenderInfo_pad 6
228: #define PSSO_RenderInfo_RGBFormat 8
229: #define PSSO_RenderInfo_sizeof /* ??? */
230:
231: struct RenderInfo {
232: uae_u8 *Memory;
233: uae_s16 BytesPerRow;
234: uae_s16 pad;
235: RGBFTYPE RGBFormat;
236: };
237:
238: #define PSSO_Pattern_Memory 0
239: #define PSSO_Pattern_XOffset 4
240: #define PSSO_Pattern_YOffset 6
241: #define PSSO_Pattern_FgPen 8
242: #define PSSO_Pattern_BgPen 12
243: #define PSSO_Pattern_Size 16
244: #define PSSO_Pattern_DrawMode 17
245: #define PSSO_Pattern_sizeof 18
246: struct Pattern {
247: char *Memory;
248: uae_u16 XOffset, YOffset;
249: uae_u32 FgPen, BgPen;
250: uae_u8 Size; /* Width: 16, Height: (1<<pat_Size) */
251: uae_u8 DrawMode;
252: };
253:
254: #define PSSO_Template_Memory 0
255: #define PSSO_Template_BytesPerRow 4
256: #define PSSO_Template_XOffset 6
257: #define PSSO_Template_DrawMode 7
258: #define PSSO_Template_FgPen 8
259: #define PSSO_Template_BgPen 12
260: #define PSSO_Template_sizeof 16
261:
262: struct Template {
1.1.1.2 ! root 263: char *Memory;
! 264: uae_s16 BytesPerRow;
! 265: uae_u8 XOffset;
! 266: uae_u8 DrawMode;
! 267: uae_u32 FgPen;
! 268: uae_u32 BgPen;
1.1 root 269: };
270:
271: #define PSSO_BoardInfo_MemoryBase 4
272: #define PSSO_BoardInfo_MemorySize 12
273: #define PSSO_BoardInfo_BoardName 16
274: #define PSSO_BoardInfo_VBIName 20
275: #define PSSO_BoardInfo_CardBase 52
276: #define PSSO_BoardInfo_ChipBase 56
277: #define PSSO_BoardInfo_ExecBase 60
278: #define PSSO_BoardInfo_UtilBase 64
279: #define PSSO_BoardInfo_HardInterrupt 68
280: #define PSSO_BoardInfo_SoftInterrupt 90
281: #define PSSO_BoardInfo_BoardLock 112
282: #define PSSO_BoardInfo_ResolutionsList 158
283: #define PSSO_BoardInfo_BoardType 170
284: #define PSSO_BoardInfo_PaletteChipType 174
285: #define PSSO_BoardInfo_GraphicsControllerType 178
286: #define PSSO_BoardInfo_MoniSwitch 182
287: #define PSSO_BoardInfo_BitsPerCannon 184
288: #define PSSO_BoardInfo_Flags 186
289: #define PSSO_BoardInfo_SoftSpriteFlags 190
290: #define PSSO_BoardInfo_ChipFlags 192
291: #define PSSO_BoardInfo_CardFlags 194
292: #define PSSO_BoardInfo_BoardNum 198
293: #define PSSO_BoardInfo_RGBFormats 200
294: #define PSSO_BoardInfo_MaxHorValue 202
295: #define PSSO_BoardInfo_MaxVerValue (202 + 2*MAXMODES)
296: #define PSSO_BoardInfo_MaxHorResolution (202 + 4*MAXMODES)
297: #define PSSO_BoardInfo_MaxVerResolution (202 + 6*MAXMODES)
298: #define PSSO_BoardInfo_MaxMemorySize (202 + 8*MAXMODES)
299: #define PSSO_BoardInfo_MaxChunkSize (202 + 8*MAXMODES + 4)
300: #define PSSO_BoardInfo_PixelClockArray (202 + 8*MAXMODES + 8)
301: #define PSSO_BoardInfo_PixelClockCount (202 + 8*MAXMODES + 12)
302: #define PSSO_BoardInfo_AllocCardMem (202 + 12*MAXMODES + 12)
303: #define PSSO_BoardInfo_SpecialFeatures (202 + 12*MAXMODES + 12 + 68*4)
304: #define PSSO_BoardInfo_ModeInfo (202 + 12*MAXMODES + 12 + 68*4 + 12)
305: #define PSSO_BoardInfo_CLUT (202 + 12*MAXMODES + 12 + 68*4 + 32)
306:
1.1.1.2 ! root 307: struct BoardInfo {
1.1 root 308: uae_u8 *RegisterBase, *MemoryBase, *MemoryIOBase;
309: uae_u32 MemorySize;
310: char *BoardName, VBIName[32];
311:
312: uae_u16 MoniSwitch;
313: uae_u16 BitsPerCannon;
314: uae_u32 Flags;
315: uae_u16 SoftSpriteFlags;
316: uae_u16 ChipFlags; /* private, chip specific, not touched by RTG */
317: uae_u32 CardFlags; /* private, card specific, not touched by RTG */
318:
319: uae_u16 BoardNum;
320: uae_s16 RGBFormats;
321:
322: uae_u16 MaxHorValue[MAXMODES];
323: uae_u16 MaxVerValue[MAXMODES];
324: uae_u16 MaxHorResolution[MAXMODES];
325: uae_u16 MaxVerResolution[MAXMODES];
326: uae_u32 MaxMemorySize, MaxChunkSize;
327: };
328:
329: /* BoardInfo flags */
330: /* 0-15: hardware flags */
331: /* 16-31: user flags */
332: #define BIB_HARDWARESPRITE 0 /* board has hardware sprite */
333: #define BIB_NOMEMORYMODEMIX 1 /* board does not support modifying planar bitmaps while displaying chunky and vice versa */
334: #define BIB_NEEDSALIGNMENT 2 /* bitmaps have to be aligned (not yet supported!) */
335: #define BIB_DBLSCANDBLSPRITEY 8 /* hardware sprite y position is doubled on doublescan display modes */
336: #define BIB_ILACEHALFSPRITEY 9 /* hardware sprite y position is halved on interlace display modes */
337: #define BIB_ILACEDBLROWOFFSET 10 /* doubled row offset in interlaced display modes needs additional horizontal bit */
338:
339: #define BIB_FLICKERFIXER 12 /* board can flicker fix Amiga RGB signal */
340: #define BIB_VIDEOCAPTURE 13 /* board can capture video data to a memory area */
341: #define BIB_VIDEOWINDOW 14 /* board can display a second mem area as a pip */
342: #define BIB_BLITTER 15 /* board has blitter */
343:
344: #define BIB_HIRESSPRITE 16 /* mouse sprite has double resolution */
345: #define BIB_BIGSPRITE 17 /* user wants big mouse sprite */
346: #define BIB_BORDEROVERRIDE 18 /* user wants to override system overscan border prefs */
347: #define BIB_BORDERBLANK 19 /* user wants border blanking */
348: #define BIB_INDISPLAYCHAIN 20 /* board switches Amiga signal */
349: #define BIB_QUIET 21 /* not yet implemented */
350: #define BIB_NOMASKBLITS 22 /* perform blits without taking care of mask */
351: #define BIB_NOC2PBLITS 23 /* use CPU for planar to chunky conversions */
352: #define BIB_NOBLITTER 24 /* disable all blitter functions */
353:
354: #define BIB_IGNOREMASK BIB_NOMASKBLITS
355:
356: #define BIF_HARDWARESPRITE (1<<BIB_HARDWARESPRITE)
357: #define BIF_NOMEMORYMODEMIX (1<<BIB_NOMEMORYMODEMIX)
358: #define BIF_NEEDSALIGNMENT (1<<BIB_NEEDSALIGNMENT)
359: #define BIF_DBLSCANDBLSPRITEY (1<<BIB_DBLSCANDBLSPRITEY)
360: #define BIF_ILACEHALFSPRITEY (1<<BIB_ILACEHALFSPRITEY)
361: #define BIF_ILACEDBLROWOFFSET (1<<BIB_ILACEDBLROWOFFSET)
362: #define BIF_FLICKERFIXER (1<<BIB_FLICKERFIXER)
363: #define BIF_VIDEOCAPTURE (1<<BIB_VIDEOCAPTURE)
364: #define BIF_VIDEOWINDOW (1<<BIB_VIDEOWINDOW)
365: #define BIF_BLITTER (1<<BIB_BLITTER)
366: #define BIF_HIRESSPRITE (1<<BIB_HIRESSPRITE)
367: #define BIF_BIGSPRITE (1<<BIB_BIGSPRITE)
368: #define BIF_BORDEROVERRIDE (1<<BIB_BORDEROVERRIDE)
369: #define BIF_BORDERBLANK (1<<BIB_BORDERBLANK)
370: #define BIF_INDISPLAYCHAIN (1<<BIB_INDISPLAYCHAIN)
371: #define BIF_QUIET (1<<BIB_QUIET)
372: #define BIF_NOMASKBLITS (1<<BIB_NOMASKBLITS)
373: #define BIF_NOC2PBLITS (1<<BIB_NOC2PBLITS)
374: #define BIF_NOBLITTER (1<<BIB_NOBLITTER)
375:
376: #define BIF_IGNOREMASK BIF_NOMASKBLITS
377:
378: /************************************************************************/
379: struct picasso96_state_struct
380: {
381: uae_u32 RGBFormat; /* true-colour, CLUT, hi-colour, etc. */
382: struct MyCLUTEntry CLUT[256]; /* Duh! */
383: uaecptr Address; /* Active screen address (Amiga-side) */
384: uaecptr Extent; /* End address of screen (Amiga-side) */
385: uae_u16 Width; /* Active display width (From SetGC) */
386: uae_u16 VirtualWidth;/* Total screen width (From SetPanning) */
387: uae_u16 BytesPerRow; /* Total screen width in bytes (From SetGC) */
388: uae_u16 Height; /* Active display height (From SetGC) */
389: uae_u16 VirtualHeight; /* Total screen height */
390: uae_u8 GC_Depth; /* From SetGC() */
391: uae_u8 GC_Flags; /* From SetGC() */
392: long XOffset; /* From SetPanning() */
393: long YOffset; /* From SetPanning() */
394: uae_u8 SwitchState; /* From SetSwitch() - 0 is Amiga, 1 is Picasso */
395: uae_u8 BytesPerPixel;
396: uae_u8 CardFound;
397: };
398:
399: extern void InitPicasso96 (void);
400:
401: extern uae_u32 picasso_SetDisplay (void);
402: extern uae_u32 picasso_WaitVerticalSync (void);
403: extern uae_u32 picasso_CalculateBytesPerRow (void);
404: extern uae_u32 picasso_FillRect (void);
405: extern uae_u32 picasso_BlitRect (void);
406: extern uae_u32 picasso_InvertRect (void);
407: extern uae_u32 picasso_SetPanning (void);
408: extern uae_u32 picasso_SetGC (void);
409: extern uae_u32 picasso_SetDAC (void);
410: extern uae_u32 picasso_SetColorArray (void);
411: extern uae_u32 picasso_SetSwitch (void);
412: extern uae_u32 picasso_SetSwitch (void);
413: extern uae_u32 picasso_FindCard (void);
414: extern uae_u32 picasso_InitCard (void);
415: extern uae_u32 picasso_BlitPlanar2Chunky (void);
416: extern uae_u32 picasso_BlitPlanar2Direct (void);
417: extern uae_u32 picasso_BlitTemplate (void);
418: extern uae_u32 picasso_BlitPattern (void);
419: extern uae_u32 picasso_BlitRectNoMaskComplete (void);
420:
421: extern uae_u32 gfxmem_mask;
422: extern uae_u8 *gfxmemory;
423:
424: extern int uaegfx_card_found;
425:
426: extern struct picasso96_state_struct picasso96_state;
427:
428: #ifdef _WIN32
429: extern unsigned int timer_id;
430: #endif
431:
1.1.1.2 ! root 432: extern int DX_FillRect (uaecptr mem, uae_u16 X, uae_u16 Y, uae_u16 Width, uae_u16 Height, uae_u32 Pen, uae_u8 Bpp);
! 433: extern void DX_BlitRect (struct RenderInfo *ri, uae_u16 srcx, uae_u16 srcy, uae_u16 dstx, uae_u16 dsty, uae_u16 w, uae_u16 h);
! 434: extern void DX_BlitRectFromBuffer (struct RenderInfo *ri, uae_u8* buffer, uae_u16 dstx, uae_u16 dsty, uae_u16 w, uae_u16 h);
! 435: extern void DX_InvertRect (struct RenderInfo *ri, uae_u16 X, uae_u16 Y, uae_u16 Width, uae_u16 Height);
! 436: extern void DX_SetPalette (int start, int count);
1.1 root 437: extern int DX_FillResolutions (uae_u16 *);
438: extern int DX_BitsPerCannon (void);
439: extern void DX_Invalidate (int first, int last);
440: extern void picasso_enablescreen (int on);
1.1.1.2 ! root 441: extern void picasso_refresh (void);
1.1 root 442:
443: extern uae_u8 *gfxmemory;
444:
1.1.1.2 ! root 445: /* This structure describes the UAE-side framebuffer for the Picasso
! 446: * screen. */
1.1 root 447: struct picasso_vidbuf_description {
448: int width, height, depth;
449: int rowbytes, pixbytes;
450: int extra_mem; /* nonzero if there's a second buffer that must be updated */
1.1.1.2 ! root 451: uae_u32 rgbformat;
! 452: uae_u32 selected_rgbformat;
! 453: uae_u32 clut[256];
1.1 root 454: };
455:
456: extern struct picasso_vidbuf_description picasso_vidinfo;
457:
1.1.1.2 ! root 458: extern void gfx_set_picasso_modeinfo (int w, int h, int d, int rgbfmt);
1.1 root 459: extern void gfx_set_picasso_baseaddr (uaecptr);
460: extern void gfx_set_picasso_state (int on);
1.1.1.2 ! root 461: extern uae_u8 *gfx_lock_picasso (void);
! 462: extern void gfx_unlock_picasso (void);
! 463:
1.1 root 464:
465: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.