/* Public Domain Curses */ /* $Id: pdcdos.h,v 1.30 2008/07/13 16:08:17 wmcbrine Exp $ */ #include <curspriv.h> #include <string.h> #if defined(_MSC_VER) || defined(_QC) # define MSC 1 #endif #if defined(__PACIFIC__) && !defined(__SMALL__) # define __SMALL__ #endif #if defined(__HIGHC__) || MSC # include <bios.h> #endif /*---------------------------------------------------------------------- * MEMORY MODEL SUPPORT: * * MODELS * TINY cs,ds,ss all in 1 segment (not enough memory!) * SMALL cs:1 segment, ds:1 segment * MEDIUM cs:many segments, ds:1 segment * COMPACT cs:1 segment, ds:many segments * LARGE cs:many segments, ds:many segments * HUGE cs:many segments, ds:segments > 64K */ #ifdef __TINY__ # define SMALL 1 #endif #ifdef __SMALL__ # define SMALL 1 #endif #ifdef __MEDIUM__ # define MEDIUM 1 #endif #ifdef __COMPACT__ # define COMPACT 1 #endif #ifdef __LARGE__ # define LARGE 1 #endif #ifdef __HUGE__ # define HUGE 1 #endif #include <dos.h> extern unsigned char *pdc_atrtab; extern int pdc_adapter; extern int pdc_scrnmode; extern int pdc_font; extern bool pdc_direct_video; extern bool pdc_bogus_adapter; extern unsigned pdc_video_seg; extern unsigned pdc_video_ofs; #ifdef __DJGPP__ /* Note: works only in plain DOS... */ # if DJGPP == 2 # define _FAR_POINTER(s,o) ((((int)(s)) << 4) + ((int)(o))) # else # define _FAR_POINTER(s,o) (0xe0000000 + (((int)(s)) << 4) + ((int)(o))) # endif # define _FP_SEGMENT(p) (unsigned short)((((long)p) >> 4) & 0xffff) #else # ifdef __TURBOC__ # define _FAR_POINTER(s,o) MK_FP(s,o) # else # if defined(__WATCOMC__) && defined(__FLAT__) # define _FAR_POINTER(s,o) ((((int)(s)) << 4) + ((int)(o))) # else # define _FAR_POINTER(s,o) (((long)s << 16) | (long)o) # endif # endif # define _FP_SEGMENT(p) (unsigned short)(((long)p) >> 4) #endif #define _FP_OFFSET(p) ((unsigned short)p & 0x000f) #ifdef __DJGPP__ # include <sys/movedata.h> unsigned char getdosmembyte(int offs); unsigned short getdosmemword(int offs); unsigned long getdosmemdword(int offs); void setdosmembyte(int offs, unsigned char b); void setdosmemword(int offs, unsigned short w); #else # if SMALL || MEDIUM || MSC # define PDC_FAR far # else # define PDC_FAR # endif # define getdosmembyte(offs) \ (*((unsigned char PDC_FAR *) _FAR_POINTER(0,offs))) # define getdosmemword(offs) \ (*((unsigned short PDC_FAR *) _FAR_POINTER(0,offs))) # define getdosmemdword(offs) \ (*((unsigned long PDC_FAR *) _FAR_POINTER(0,offs))) # define setdosmembyte(offs,x) \ (*((unsigned char PDC_FAR *) _FAR_POINTER(0,offs)) = (x)) # define setdosmemword(offs,x) \ (*((unsigned short PDC_FAR *) _FAR_POINTER(0,offs)) = (x)) #endif #if defined(__WATCOMC__) && defined(__386__) typedef union { struct { unsigned long edi, esi, ebp, res, ebx, edx, ecx, eax; } d; struct { unsigned short di, di_hi, si, si_hi, bp, bp_hi, res, res_hi, bx, bx_hi, dx, dx_hi, cx, cx_hi, ax, ax_hi, flags, es, ds, fs, gs, ip, cs, sp, ss; } w; struct { unsigned char edi[4], esi[4], ebp[4], res[4], bl, bh, ebx_b2, ebx_b3, dl, dh, edx_b2, edx_b3, cl, ch, ecx_b2, ecx_b3, al, ah, eax_b2, eax_b3; } h; } pdc_dpmi_regs; void PDC_dpmi_int(int, pdc_dpmi_regs *); #endif #ifdef __DJGPP__ # include <dpmi.h> # define PDCREGS __dpmi_regs # define PDCINT(vector, regs) __dpmi_int(vector, ®s) #else # ifdef __WATCOMC__ # ifdef __386__ # define PDCREGS pdc_dpmi_regs # define PDCINT(vector, regs) PDC_dpmi_int(vector, ®s) # else # define PDCREGS union REGPACK # define PDCINT(vector, regs) intr(vector, ®s) # endif # else # define PDCREGS union REGS # define PDCINT(vector, regs) int86(vector, ®s, ®s) # endif #endif /* Wide registers in REGS: w or x? */ #ifdef __WATCOMC__ # define W w #else # define W x #endif /* Monitor (terminal) type information */ enum { _NONE, _MDA, _CGA, _EGACOLOR = 0x04, _EGAMONO, _VGACOLOR = 0x07, _VGAMONO, _MCGACOLOR = 0x0a, _MCGAMONO, _MDS_GENIUS = 0x30 }; /* Text-mode font size information */ enum { _FONT8 = 8, _FONT14 = 14, _FONT15, /* GENIUS */ _FONT16 }; #ifdef __PACIFIC__ void movedata(unsigned, unsigned, unsigned, unsigned, unsigned); #endif