/* * ______ ____ ______ _____ ______ * | ____| | _ \| ____| / / _ \| ____| * | |__ _ __ ___ ___| |_) | |__ / / |_| | |__ * | __| '__/ _ \/ _ \ _ <| __| / /| _ | __| * | | | | | __/ __/ |_) | |____ / / | | | | | * |_| |_| \___|\___|____/|______/_/ |_| |_|_| * * * VBE/AF structure definitions and constants. * * See freebe.txt for copyright information. */ #define FREEBE_VERSION "v1.2" #ifndef ALLEGRO_H #include #define NULL 0 #define TRUE 1 #define FALSE 0 #define MIN(x,y) (((x) < (y)) ? (x) : (y)) #define MAX(x,y) (((x) > (y)) ? (x) : (y)) #define MID(x,y,z) MAX((x), MIN((y), (z))) #define ABS(x) (((x) >= 0) ? (x) : (-(x))) #define BYTES_PER_PIXEL(bpp) (((int)(bpp) + 7) / 8) typedef long fixed; #endif /* mode attribute flags */ #define afHaveMultiBuffer 0x0001 /* multiple buffers */ #define afHaveVirtualScroll 0x0002 /* virtual scrolling */ #define afHaveBankedBuffer 0x0004 /* supports banked framebuffer */ #define afHaveLinearBuffer 0x0008 /* supports linear framebuffer */ #define afHaveAccel2D 0x0010 /* supports 2D acceleration */ #define afHaveDualBuffers 0x0020 /* uses dual buffers */ #define afHaveHWCursor 0x0040 /* supports a hardware cursor */ #define afHave8BitDAC 0x0080 /* 8 bit palette DAC */ #define afNonVGAMode 0x0100 /* not a VGA mode */ #define afHaveDoubleScan 0x0200 /* supports double scanning */ #define afHaveInterlaced 0x0400 /* supports interlacing */ #define afHaveTripleBuffer 0x0800 /* supports triple buffering */ #define afHaveStereo 0x1000 /* supports stereo LCD glasses */ #define afHaveROP2 0x2000 /* supports ROP2 mix codes */ #define afHaveHWStereoSync 0x4000 /* hardware stereo signalling */ #define afHaveEVCStereoSync 0x8000 /* HW stereo sync via EVC connector */ /* drawing modes */ typedef enum { AF_FORE_MIX = 0, /* background pixels use the foreground mix */ AF_REPLACE_MIX = 0, /* solid drawing mode */ AF_AND_MIX, /* bitwise AND mode */ AF_OR_MIX, /* bitwise OR mode */ AF_XOR_MIX, /* bitwise XOR mode */ AF_NOP_MIX, /* nothing is drawn */ /* below here need only be supported if you set the afHaveROP2 flag */ AF_R2_BLACK = 0x10, AF_R2_NOTMERGESRC, AF_R2_MASKNOTSRC, AF_R2_NOTCOPYSRC, AF_R2_MASKSRCNOT, AF_R2_NOT, AF_R2_XORSRC, AF_R2_NOTMASKSRC, AF_R2_MASKSRC, AF_R2_NOTXORSRC, AF_R2_NOP, AF_R2_MERGENOTSRC, AF_R2_COPYSRC, AF_R2_MERGESRCNOT, AF_R2_MERGESRC, AF_R2_WHITE, } AF_mixModes; /* fixed point coordinate pair */ typedef struct AF_FIX_POINT { fixed x; fixed y; } AF_FIX_POINT; /* trapezium information block */ typedef struct AF_TRAP { unsigned long y; unsigned long count; fixed x1; fixed x2; fixed slope1; fixed slope2; } AF_TRAP; /* hardware cursor description */ typedef struct AF_CURSOR { unsigned long xorMask[32]; unsigned long andMask[32]; unsigned long hotx; unsigned long hoty; } AF_CURSOR; /* color value */ typedef struct AF_PALETTE { unsigned char blue; unsigned char green; unsigned char red; unsigned char alpha; } AF_PALETTE; /* CRTC information block for refresh rate control */ typedef struct AF_CRTCInfo { unsigned short HorizontalTotal __attribute__ ((packed)); /* horizontal total (pixels) */ unsigned short HorizontalSyncStart __attribute__ ((packed)); /* horizontal sync start position */ unsigned short HorizontalSyncEnd __attribute__ ((packed)); /* horizontal sync end position */ unsigned short VerticalTotal __attribute__ ((packed)); /* vertical total (lines) */ unsigned short VerticalSyncStart __attribute__ ((packed)); /* vertical sync start position */ unsigned short VerticalSyncEnd __attribute__ ((packed)); /* vertical sync end position */ unsigned char Flags __attribute__ ((packed)); /* initialisation flags for mode */ unsigned int PixelClock __attribute__ ((packed)); /* pixel clock in units of Hz */ unsigned short RefreshRate __attribute__ ((packed)); /* expected refresh rate in .01Hz */ unsigned short NumBuffers __attribute__ ((packed)); /* number of display buffers */ } AF_CRTCInfo; /* definitions for CRTC information block flags */ #define afDoubleScan 0x0001 /* enable double scanned mode */ #define afInterlaced 0x0002 /* enable interlaced mode */ #define afHSyncNeg 0x0004 /* horizontal sync is negative */ #define afVSyncNeg 0x0008 /* vertical sync is negative */ typedef unsigned char AF_PATTERN; /* pattern array elements */ typedef unsigned AF_STIPPLE; /* 16 bit line stipple pattern */ typedef unsigned AF_COLOR; /* packed color values */ /* mode information structure */ typedef struct AF_MODE_INFO { unsigned short Attributes __attribute__ ((packed)); unsigned short XResolution __attribute__ ((packed)); unsigned short YResolution __attribute__ ((packed)); unsigned short BytesPerScanLine __attribute__ ((packed)); unsigned short BitsPerPixel __attribute__ ((packed)); unsigned short MaxBuffers __attribute__ ((packed)); unsigned char RedMaskSize __attribute__ ((packed)); unsigned char RedFieldPosition __attribute__ ((packed)); unsigned char GreenMaskSize __attribute__ ((packed)); unsigned char GreenFieldPosition __attribute__ ((packed)); unsigned char BlueMaskSize __attribute__ ((packed)); unsigned char BlueFieldPosition __attribute__ ((packed)); unsigned char RsvdMaskSize __attribute__ ((packed)); unsigned char RsvdFieldPosition __attribute__ ((packed)); unsigned short MaxBytesPerScanLine __attribute__ ((packed)); unsigned short MaxScanLineWidth __attribute__ ((packed)); /* VBE/AF 2.0 extensions */ unsigned short LinBytesPerScanLine __attribute__ ((packed)); unsigned char BnkMaxBuffers __attribute__ ((packed)); unsigned char LinMaxBuffers __attribute__ ((packed)); unsigned char LinRedMaskSize __attribute__ ((packed)); unsigned char LinRedFieldPosition __attribute__ ((packed)); unsigned char LinGreenMaskSize __attribute__ ((packed)); unsigned char LinGreenFieldPosition __attribute__ ((packed)); unsigned char LinBlueMaskSize __attribute__ ((packed)); unsigned char LinBlueFieldPosition __attribute__ ((packed)); unsigned char LinRsvdMaskSize __attribute__ ((packed)); unsigned char LinRsvdFieldPosition __attribute__ ((packed)); unsigned long MaxPixelClock __attribute__ ((packed)); unsigned long VideoCapabilities __attribute__ ((packed)); unsigned short VideoMinXScale __attribute__ ((packed)); unsigned short VideoMinYScale __attribute__ ((packed)); unsigned short VideoMaxXScale __attribute__ ((packed)); unsigned short VideoMaxYScale __attribute__ ((packed)); unsigned char reserved[76] __attribute__ ((packed)); } AF_MODE_INFO; #define DC struct AF_DRIVER *dc /* main VBE/AF driver structure */ typedef struct AF_DRIVER { /* header */ char Signature[12] __attribute__ ((packed)); unsigned long Version __attribute__ ((packed)); unsigned long DriverRev __attribute__ ((packed)); char OemVendorName[80] __attribute__ ((packed)); char OemCopyright[80] __attribute__ ((packed)); short *AvailableModes __attribute__ ((packed)); unsigned long TotalMemory __attribute__ ((packed)); unsigned long Attributes __attribute__ ((packed)); unsigned long BankSize __attribute__ ((packed)); unsigned long BankedBasePtr __attribute__ ((packed)); unsigned long LinearSize __attribute__ ((packed)); unsigned long LinearBasePtr __attribute__ ((packed)); unsigned long LinearGranularity __attribute__ ((packed)); unsigned short *IOPortsTable __attribute__ ((packed)); unsigned long IOMemoryBase[4] __attribute__ ((packed)); unsigned long IOMemoryLen[4] __attribute__ ((packed)); unsigned long LinearStridePad __attribute__ ((packed)); unsigned short PCIVendorID __attribute__ ((packed)); unsigned short PCIDeviceID __attribute__ ((packed)); unsigned short PCISubSysVendorID __attribute__ ((packed)); unsigned short PCISubSysID __attribute__ ((packed)); unsigned long Checksum __attribute__ ((packed)); unsigned long res2[6] __attribute__ ((packed)); /* near pointers mapped by the application */ void *IOMemMaps[4] __attribute__ ((packed)); void *BankedMem __attribute__ ((packed)); void *LinearMem __attribute__ ((packed)); unsigned long res3[5] __attribute__ ((packed)); /* driver state variables */ unsigned long BufferEndX __attribute__ ((packed)); unsigned long BufferEndY __attribute__ ((packed)); unsigned long OriginOffset __attribute__ ((packed)); unsigned long OffscreenOffset __attribute__ ((packed)); unsigned long OffscreenStartY __attribute__ ((packed)); unsigned long OffscreenEndY __attribute__ ((packed)); unsigned long res4[10] __attribute__ ((packed)); /* relocatable 32 bit bank switch routine, for Windows (ugh!) */ unsigned long SetBank32Len __attribute__ ((packed)); void *SetBank32 __attribute__ ((packed)); /* callback functions provided by the application */ void *Int86 __attribute__ ((packed)); void *CallRealMode __attribute__ ((packed)); /* main driver setup routine */ void *InitDriver __attribute__ ((packed)); /* VBE/AF 1.0 asm interface (obsolete and not supported by Allegro) */ void *af10Funcs[40] __attribute__ ((packed)); /* VBE/AF 2.0 extensions */ void *PlugAndPlayInit __attribute__ ((packed)); /* extension query function, specific to FreeBE/AF */ void *(*OemExt)(DC, unsigned long id); /* extension hook for implementing additional VESA interfaces */ void *SupplementalExt __attribute__ ((packed)); /* device driver functions */ long (*GetVideoModeInfo)(DC, short mode, AF_MODE_INFO *modeInfo); long (*SetVideoMode)(DC, short mode, long virtualX, long virtualY, long *bytesPerLine, int numBuffers, AF_CRTCInfo *crtc); void (*RestoreTextMode)(DC); long (*GetClosestPixelClock)(DC, short mode, unsigned long pixelClock); void (*SaveRestoreState)(DC, int subfunc, void *saveBuf); void (*SetDisplayStart)(DC, long x, long y, long waitVRT); void (*SetActiveBuffer)(DC, long index); void (*SetVisibleBuffer)(DC, long index, long waitVRT); int (*GetDisplayStartStatus)(DC); void (*EnableStereoMode)(DC, int enable); void (*SetPaletteData)(DC, AF_PALETTE *pal, long num, long index, long waitVRT); void (*SetGammaCorrectData)(DC, AF_PALETTE *pal, long num, long index); void (*SetBank)(DC, long bank); /* hardware cursor functions */ void (*SetCursor)(DC, AF_CURSOR *cursor); void (*SetCursorPos)(DC, long x, long y); void (*SetCursorColor)(DC, unsigned char red, unsigned char green, unsigned char blue); void (*ShowCursor)(DC, long visible); /* 2D rendering functions */ void (*WaitTillIdle)(DC); void (*EnableDirectAccess)(DC); void (*DisableDirectAccess)(DC); void (*SetMix)(DC, long foreMix, long backMix); void (*Set8x8MonoPattern)(DC, unsigned char *pattern); void (*Set8x8ColorPattern)(DC, int index, unsigned long *pattern); void (*Use8x8ColorPattern)(DC, int index); void (*SetLineStipple)(DC, unsigned short stipple); void (*SetLineStippleCount)(DC, unsigned long count); void (*SetClipRect)(DC, long minx, long miny, long maxx, long maxy); void (*DrawScan)(DC, long color, long y, long x1, long x2); void (*DrawPattScan)(DC, long foreColor, long backColor, long y, long x1, long x2); void (*DrawColorPattScan)(DC, long y, long x1, long x2); void (*DrawScanList)(DC, unsigned long color, long y, long length, short *scans); void (*DrawPattScanList)(DC, unsigned long foreColor, unsigned long backColor, long y, long length, short *scans); void (*DrawColorPattScanList)(DC, long y, long length, short *scans); void (*DrawRect)(DC, unsigned long color, long left, long top, long width, long height); void (*DrawPattRect)(DC, unsigned long foreColor, unsigned long backColor, long left, long top, long width, long height); void (*DrawColorPattRect)(DC, long left, long top, long width, long height); void (*DrawLine)(DC, unsigned long color, fixed x1, fixed y1, fixed x2, fixed y2); void (*DrawStippleLine)(DC, unsigned long foreColor, unsigned long backColor, fixed x1, fixed y1, fixed x2, fixed y2); void (*DrawTrap)(DC, unsigned long color, AF_TRAP *trap); void (*DrawTri)(DC, unsigned long color, AF_FIX_POINT *v1, AF_FIX_POINT *v2, AF_FIX_POINT *v3, fixed xOffset, fixed yOffset); void (*DrawQuad)(DC, unsigned long color, AF_FIX_POINT *v1, AF_FIX_POINT *v2, AF_FIX_POINT *v3, AF_FIX_POINT *v4, fixed xOffset, fixed yOffset); void (*PutMonoImage)(DC, long foreColor, long backColor, long dstX, long dstY, long byteWidth, long srcX, long srcY, long width, long height, unsigned char *image); void (*PutMonoImageLin)(DC, long foreColor, long backColor, long dstX, long dstY, long byteWidth, long srcX, long srcY, long width, long height, long imageOfs); void (*PutMonoImageBM)(DC, long foreColor, long backColor, long dstX, long dstY, long byteWidth, long srcX, long srcY, long width, long height, long imagePhysAddr); void (*BitBlt)(DC, long left, long top, long width, long height, long dstLeft, long dstTop, long op); void (*BitBltSys)(DC, void *srcAddr, long srcPitch, long srcLeft, long srcTop, long width, long height, long dstLeft, long dstTop, long op); void (*BitBltLin)(DC, long srcOfs, long srcPitch, long srcLeft, long srcTop, long width, long height, long dstLeft, long dstTop, long op); void (*BitBltBM)(DC, long srcPhysAddr, long srcPitch, long srcLeft, long srcTop, long width, long height, long dstLeft, long dstTop, long op); void (*SrcTransBlt)(DC, long left, long top, long width, long height, long dstLeft, long dstTop, long op, unsigned long transparent); void (*SrcTransBltSys)(DC, void *srcAddr, long srcPitch, long srcLeft, long srcTop, long width, long height, long dstLeft, long dstTop, long op, unsigned long transparent); void (*SrcTransBltLin)(DC, long srcOfs, long srcPitch, long srcLeft, long srcTop, long width, long height, long dstLeft, long dstTop, long op, unsigned long transparent); void (*SrcTransBltBM)(DC, long srcPhysAddr, long srcPitch, long srcLeft, long srcTop, long width, long height, long dstLeft, long dstTop, long op, unsigned long transparent); void (*DstTransBlt)(DC, long left, long top, long width, long height, long dstLeft, long dstTop, long op, unsigned long transparent); void (*DstTransBltSys)(DC, void *srcAddr, long srcPitch, long srcLeft, long srcTop, long width, long height, long dstLeft, long dstTop, long op, unsigned long transparent); void (*DstTransBltLin)(DC, long srcOfs, long srcPitch, long srcLeft, long srcTop, long width, long height, long dstLeft, long dstTop, long op, unsigned long transparent); void (*DstTransBltBM)(DC, long srcPhysAddr, long srcPitch, long srcLeft, long srcTop, long width, long height, long dstLeft, long dstTop, long op, unsigned long transparent); void (*StretchBlt)(DC, long srcLeft, long srcTop, long srcWidth, long srcHeight, long dstLeft, long dstTop, long dstWidth, long dstHeight, long flags, long op); void (*StretchBltSys)(DC, void *srcAddr, long srcPitch, long srcLeft, long srcTop, long srcWidth, long srcHeight, long dstLeft, long dstTop, long dstWidth, long dstHeight, long flags, long op); void (*StretchBltLin)(DC, long srcOfs, long srcPitch, long srcLeft, long srcTop, long srcWidth, long srcHeight, long dstLeft, long dstTop, long dstWidth, long dstHeight, long flags, long op); void (*StretchBltBM)(DC, long srcPhysAddr, long srcPitch, long srcLeft, long srcTop, long srcWidth, long srcHeight, long dstLeft, long dstTop, long dstWidth, long dstHeight, long flags, long op); void (*SrcTransStretchBlt)(DC, long srcLeft, long srcTop, long srcWidth, long srcHeight, long dstLeft, long dstTop, long dstWidth, long dstHeight, long flags, long op, unsigned long transparent); void (*SrcTransStretchBltSys)(DC, void *srcAddr, long srcPitch, long srcLeft, long srcTop, long srcWidth, long srcHeight, long dstLeft, long dstTop, long dstWidth, long dstHeight, long flags, long op, unsigned long transparent); void (*SrcTransStretchBltLin)(DC, long srcOfs, long srcPitch, long srcLeft, long srcTop, long srcWidth, long srcHeight, long dstLeft, long dstTop, long dstWidth, long dstHeight, long flags, long op, unsigned long transparent); void (*SrcTransStretchBltBM)(DC, long srcPhysAddr, long srcPitch, long srcLeft, long srcTop, long srcWidth, long srcHeight, long dstLeft, long dstTop, long dstWidth, long dstHeight, long flags, long op, unsigned long transparent); void (*DstTransStretchBlt)(DC, long srcLeft, long srcTop, long srcWidth, long srcHeight, long dstLeft, long dstTop, long dstWidth, long dstHeight, long flags, long op, unsigned long transparent); void (*DstTransStretchBltSys)(DC, void *srcAddr, long srcPitch, long srcLeft, long srcTop, long srcWidth, long srcHeight, long dstLeft, long dstTop, long dstWidth, long dstHeight, long flags, long op, unsigned long transparent); void (*DstTransStretchBltLin)(DC, long srcOfs, long srcPitch, long srcLeft, long srcTop, long srcWidth, long srcHeight, long dstLeft, long dstTop, long dstWidth, long dstHeight, long flags, long op, unsigned long transparent); void (*DstTransStretchBltBM)(DC, long srcPhysAddr, long srcPitch, long srcLeft, long srcTop, long srcWidth, long srcHeight, long dstLeft, long dstTop, long dstWidth, long dstHeight, long flags, long op, unsigned long transparent); /* hardware video functions */ void (*SetVideoInput)(DC, long width, long height, long format); void *(*SetVideoOutput)(DC, long left, long top, long width, long height); void (*StartVideoFrame)(DC); void (*EndVideoFrame)(DC); } AF_DRIVER; #undef DC /* register data for calling real mode interrupts (DPMI format) */ typedef union { struct { unsigned long edi; unsigned long esi; unsigned long ebp; unsigned long res; unsigned long ebx; unsigned long edx; unsigned long ecx; unsigned long eax; } d; struct { unsigned short di, di_hi; unsigned short si, si_hi; unsigned short bp, bp_hi; unsigned short res, res_hi; unsigned short bx, bx_hi; unsigned short dx, dx_hi; unsigned short cx, cx_hi; unsigned short ax, ax_hi; unsigned short flags; unsigned short es; unsigned short ds; unsigned short fs; unsigned short gs; unsigned short ip; unsigned short cs; unsigned short sp; unsigned short ss; } x; struct { unsigned char edi[4]; unsigned char esi[4]; unsigned char ebp[4]; unsigned char res[4]; unsigned char bl, bh, ebx_b2, ebx_b3; unsigned char dl, dh, edx_b2, edx_b3; unsigned char cl, ch, ecx_b2, ecx_b3; unsigned char al, ah, eax_b2, eax_b3; } h; } RM_REGS; /* our API extensions use 32 bit magic numbers */ #define FAF_ID(a,b,c,d) ((a<<24) | (b<<16) | (c<<8) | d) /* ID code and magic return value for initialising the extensions */ #define FAFEXT_INIT FAF_ID('I','N','I','T') #define FAFEXT_MAGIC FAF_ID('E','X', 0, 0) #define FAFEXT_MAGIC1 FAF_ID('E','X','0','1') /* extension providing a hardware-specific way to access video memory */ #define FAFEXT_HWPTR FAF_ID('H','P','T','R') #if (defined __i386__) && (!defined NO_HWPTR) /* use seg+offset far pointers on i386 */ typedef struct FAF_HWPTR { int sel; unsigned long offset; } FAF_HWPTR; #include #include #define hwptr_init(ptr, addr) \ if ((addr) && (!(ptr).sel)) { \ (ptr).sel = _my_ds(); \ (ptr).offset = (unsigned long)(addr); \ } #define hwptr_pokeb(ptr, off, val) _farpokeb((ptr).sel, (ptr).offset+(off), (val)) #define hwptr_pokew(ptr, off, val) _farpokew((ptr).sel, (ptr).offset+(off), (val)) #define hwptr_pokel(ptr, off, val) _farpokel((ptr).sel, (ptr).offset+(off), (val)) #define hwptr_peekb(ptr, off) _farpeekb((ptr).sel, (ptr).offset+(off)) #define hwptr_peekw(ptr, off) _farpeekw((ptr).sel, (ptr).offset+(off)) #define hwptr_peekl(ptr, off) _farpeekl((ptr).sel, (ptr).offset+(off)) #define hwptr_select(ptr) _farsetsel((ptr).sel) #define hwptr_unselect(ptr) (ptr).sel = _fargetsel() #define hwptr_nspokeb(ptr, off, val) _farnspokeb((ptr).offset+(off), (val)) #define hwptr_nspokew(ptr, off, val) _farnspokew((ptr).offset+(off), (val)) #define hwptr_nspokel(ptr, off, val) _farnspokel((ptr).offset+(off), (val)) #define hwptr_nspeekb(ptr, off) _farnspeekb((ptr).offset+(off)) #define hwptr_nspeekw(ptr, off) _farnspeekw((ptr).offset+(off)) #define hwptr_nspeekl(ptr, off) _farnspeekl((ptr).offset+(off)) #else /* use regular C pointers on other platforms or if hwptr is disabled */ typedef void *FAF_HWPTR; #define hwptr_init(ptr, addr) ptr = (FAF_HWPTR)(addr) #define hwptr_pokeb(ptr, off, val) *((volatile unsigned char *)((ptr)+(off))) = (val) #define hwptr_pokew(ptr, off, val) *((volatile unsigned short *)((ptr)+(off))) = (val) #define hwptr_pokel(ptr, off, val) *((volatile unsigned long *)((ptr)+(off))) = (val) #define hwptr_peekb(ptr, off) (*((volatile unsigned char *)((ptr)+(off)))) #define hwptr_peekw(ptr, off) (*((volatile unsigned short *)((ptr)+(off)))) #define hwptr_peekl(ptr, off) (*((volatile unsigned long *)((ptr)+(off)))) #define hwptr_select(ptr) #define hwptr_unselect(ptr) (ptr) = NULL #define hwptr_nspokeb(ptr, off, val) *((volatile unsigned char *)((ptr)+(off))) = (val) #define hwptr_nspokew(ptr, off, val) *((volatile unsigned short *)((ptr)+(off))) = (val) #define hwptr_nspokel(ptr, off, val) *((volatile unsigned long *)((ptr)+(off))) = (val) #define hwptr_nspeekb(ptr, off) (*((volatile unsigned char *)((ptr)+(off)))) #define hwptr_nspeekw(ptr, off) (*((volatile unsigned short *)((ptr)+(off)))) #define hwptr_nspeekl(ptr, off) (*((volatile unsigned long *)((ptr)+(off)))) #endif /* hwptr structure definitions */ /* interface structure containing hardware pointer data */ typedef struct FAF_HWPTR_DATA { FAF_HWPTR IOMemMaps[4]; FAF_HWPTR BankedMem; FAF_HWPTR LinearMem; } FAF_HWPTR_DATA; /* extension providing a way for the config program to set driver variables */ #define FAFEXT_CONFIG FAF_ID('C','O','N','F') /* config variable, so the install program can communicate with the driver */ typedef struct FAF_CONFIG_DATA { unsigned long id; unsigned long value; } FAF_CONFIG_DATA; /* config variable ID used to enable/disable specific hardware functions */ #define FAF_CFG_FEATURES FAF_ID('F','E','A','T') /* bitfield values for the FAF_CFG_FEATURES variable */ #define fafLinear 0x00000001 #define fafBanked 0x00000002 #define fafHWCursor 0x00000004 #define fafDrawScan 0x00000008 #define fafDrawPattScan 0x00000010 #define fafDrawColorPattScan 0x00000020 #define fafDrawScanList 0x00000040 #define fafDrawPattScanList 0x00000080 #define fafDrawColorPattScanList 0x00000100 #define fafDrawRect 0x00000200 #define fafDrawPattRect 0x00000400 #define fafDrawColorPattRect 0x00000800 #define fafDrawLine 0x00001000 #define fafDrawStippleLine 0x00002000 #define fafDrawTrap 0x00004000 #define fafDrawTri 0x00008000 #define fafDrawQuad 0x00010000 #define fafPutMonoImage 0x00020000 #define fafPutMonoImageLin 0x00040000 #define fafPutMonoImageBM 0x00080000 #define fafBitBlt 0x00100000 #define fafBitBltSys 0x00200000 #define fafBitBltLin 0x00400000 #define fafBitBltBM 0x00800000 #define fafSrcTransBlt 0x01000000 #define fafSrcTransBltSys 0x02000000 #define fafSrcTransBltLin 0x04000000 #define fafSrcTransBltBM 0x08000000 /* helper function for enabling/disabling driver routines */ void fixup_feature_list(AF_DRIVER *af, unsigned long flags); /* extension providing libc exports (needed for Nucleus compatibility) */ #define FAFEXT_LIBC FAF_ID('L','I','B','C') typedef struct FAF_LIBC_DATA { long size; void (*abort)(); void *(*calloc)(unsigned long num_elements, unsigned long size); void (*exit)(int status); void (*free)(void *ptr); char *(*getenv)(const char *name); void *(*malloc)(unsigned long size); void *(*realloc)(void *ptr, unsigned long size); int (*system)(const char *s); int (*putenv)(const char *val); int (*open)(const char *file, int mode, int permissions); int (*access)(const char *filename, int flags); int (*close)(int fd); int (*lseek)(int fd, int offset, int whence); int (*read)(int fd, void *buffer, unsigned long count); int (*unlink)(const char *file); int (*write)(int fd, const void *buffer, unsigned long count); int (*isatty)(int fd); int (*remove)(const char *file); int (*rename)(const char *oldname, const char *newname); unsigned int (*time)(unsigned int *t); void (*setfileattr)(const char *filename, unsigned attrib); unsigned long (*getcurrentdate)(); } FAF_LIBC_DATA; /* extension providing pmode exports (needed for Nucleus compatibility) */ #define FAFEXT_PMODE FAF_ID('P','M','O','D') /* It has to be said, having this many exported functions is truly insane. * How on earth can SciTech need this much crap just to write a simple * video driver? Unfortunately we have to include it all in order to * support their Nucleus drivers... */ typedef union { struct { unsigned long eax, ebx, ecx, edx, esi, edi, cflag; } e; struct { unsigned short ax, ax_hi; unsigned short bx, bx_hi; unsigned short cx, cx_hi; unsigned short dx, dx_hi; unsigned short si, si_hi; unsigned short di, di_hi; unsigned short cflag, cflag_hi; } x; struct { unsigned char al, ah; unsigned short ax_hi; unsigned char bl, bh; unsigned short bx_hi; unsigned char cl, ch; unsigned short cx_hi; unsigned char dl, dh; unsigned short dx_hi; } h; } SILLY_SCITECH_REGS; typedef struct { unsigned short es, cs, ss, ds, fs, gs; } SILLY_SCITECH_SREGS; typedef struct FAF_PMODE_DATA { long size; int (*getModeType)(); void *(*getBIOSPointer)(); void *(*getA0000Pointer)(); void *(*mapPhysicalAddr)(unsigned long base, unsigned long limit); void *(*mallocShared)(long size); int (*mapShared)(void *ptr); void (*freeShared)(void *ptr); void *(*mapToProcess)(void *linear, unsigned long limit); void (*loadDS)(); void (*saveDS)(); void *(*mapRealPointer)(unsigned int r_seg, unsigned int r_off); void *(*allocRealSeg)(unsigned int size, unsigned int *r_seg, unsigned int *r_off); void (*freeRealSeg)(void *mem); void *(*allocLockedMem)(unsigned int size, unsigned long *physAddr); void (*freeLockedMem)(void *p); void (*callRealMode)(unsigned int seg, unsigned int off, SILLY_SCITECH_REGS *regs, SILLY_SCITECH_SREGS *sregs); int (*int86)(int intno, SILLY_SCITECH_REGS *in, SILLY_SCITECH_REGS *out); int (*int86x)(int intno, SILLY_SCITECH_REGS *in, SILLY_SCITECH_REGS *out, SILLY_SCITECH_SREGS *sregs); void (*DPMI_int86)(int intno, RM_REGS *regs); void (*segread)(SILLY_SCITECH_SREGS *sregs); int (*int386)(int intno, SILLY_SCITECH_REGS *in, SILLY_SCITECH_REGS *out); int (*int386x)(int intno, SILLY_SCITECH_REGS *in, SILLY_SCITECH_REGS *out, SILLY_SCITECH_SREGS *sregs); void (*availableMemory)(unsigned long *physical, unsigned long *total); void *(*getVESABuf)(unsigned int *len, unsigned int *rseg, unsigned int *roff); long (*getOSType)(); void (*fatalError)(const char *msg); void (*setBankA)(int bank); void (*setBankAB)(int bank); const char *(*getCurrentPath)(); const char *(*getVBEAFPath)(); const char *(*getNucleusPath)(); const char *(*getNucleusConfigPath)(); const char *(*getUniqueID)(); const char *(*getMachineName)(); int (*VF_available)(); void *(*VF_init)(unsigned long baseAddr, int bankSize, int codeLen, void *bankFunc); void (*VF_exit)(); int (*kbhit)(); int (*getch)(); int (*openConsole)(); int (*getConsoleStateSize)(); void (*saveConsoleState)(void *stateBuf, int console_id); void (*restoreConsoleState)(const void *stateBuf, int console_id); void (*closeConsole)(int console_id); void (*setOSCursorLocation)(int x, int y); void (*setOSScreenWidth)(int width, int height); int (*enableWriteCombine)(unsigned long base, unsigned long length); void (*backslash)(char *filename); } FAF_PMODE_DATA; /* assorted helper functions */ void trace_putc(char c); void trace_printf(char *msg, ...); void rm_int(int num, RM_REGS *regs); int allocate_dos_memory(int size, int *sel); void free_dos_memory(int sel); int allocate_selector(int addr, int size); void free_selector(int sel); int get_vesa_info(int *vram_size, unsigned long *linear_addr, void (*callback)(int vesa_num, int linear, int w, int h, int bpp, int bytes_per_scanline, int redsize, int redpos, int greensize, int greenpos, int bluesize, int bluepos, int rsvdsize, int rsvdpos)); /* read_vga_register: * Reads the contents of a VGA hardware register. */ extern inline int read_vga_register(int port, int index) { if (port==0x3C0) inportb(0x3DA); outportb(port, index); return inportb(port+1); } /* write_vga_register: * Writes a byte to a VGA hardware register. */ extern inline void write_vga_register(int port, int index, int v) { if (port==0x3C0) { inportb(0x3DA); outportb(port, index); outportb(port, v); } else { outportb(port, index); outportb(port+1, v); } } /* alter_vga_register: * Alters specific bits of a VGA hardware register. */ extern inline void alter_vga_register(int port, int index, int mask, int v) { int temp; temp = read_vga_register(port, index); temp &= (~mask); temp |= (v & mask); write_vga_register(port, index, temp); } /* test_vga_register: * Tests whether specific bits of a VGA hardware register can be changed. */ extern inline int test_vga_register(int port, int index, int mask) { int old, nw1, nw2; old = read_vga_register(port, index); write_vga_register(port, index, old & (~mask)); nw1 = read_vga_register(port, index) & mask; write_vga_register(port, index, old | mask); nw2 = read_vga_register(port, index) & mask; write_vga_register(port, index, old); return ((nw1==0) && (nw2==mask)); } /* test_register: * Tests whether specific bits of a hardware register can be changed. */ extern inline int test_register(int port, int mask) { int old, nw1, nw2; old = inportb(port); outportb(port, old & (~mask)); nw1 = inportb(port) & mask; outportb(port, old | mask); nw2 = inportb(port) & mask; outportb(port, old); return ((nw1==0) && (nw2==mask)); } /* PCI routines added by SET */ #define PCIConfigurationAddress 0xCF8 #define PCIConfigurationData 0xCFC #define PCIEnable 0x80000000 extern int FindPCIDevice(int deviceID, int vendorID, int deviceIndex, int *handle); extern inline unsigned PCIReadLong(int handle, int index) { outportl(PCIConfigurationAddress, PCIEnable | handle | index); return inportl(PCIConfigurationData); }