/*_ dos.h Sat Aug 19 1989 Modified by: Walter Bright */ /* Copyright (C) 1985-1991 by Walter Bright */ /* All rights reserved */ /* Written by Walter Bright */ #ifndef __DOS_H #define __DOS_H 1 #if __cplusplus extern "C" { #endif #if !(M_XENIX || M_UNIX) #pragma ZTC align 1 /* no alignment for DOS structs */ #endif typedef unsigned size_t; /* DOS and IBM PC specific declarations */ #if DOS386 /* Valid for both Pharlap and x386. */ extern unsigned short _x386_zero_base_selector; /* The following is actually only for X386, not Pharlap. */ /*************** Absolute address is given. Selector is returned in dx, offset in eax. A selector is normally allocated so the offset will normally be zero. If all selectors are being used, the offset is returned in eax with _x386_zero_base_selector in dx. This should provide working long pointers to most applications even if we have insufficient selectors. Return of zero in eax indicates allocation of a selector unless the requested base was zero in which case it is ambiguous. Nonzero indicates all selectors have been allocated and _x386_zero_base_selector is in dx, requested absolute address is in eax. In all cases the descriptor has a 4 gbyte limit. ****************/ extern void _far *(*_x386_mk_protected_ptr)(unsigned long abs_address); /*************** Pass a far pointer. Offset portion of pointer is ignored, selector is examined to see if it matches pointers previously allocated. If the selector is indeed a user definable selector then it is deactivated and a 0 is returned. Any attempt to use the selector after it has been freed will result in a general protection fault. If the pointer does not contain a selector created through a call to mk_protected_ptr then it returns a -1 with no action taken. This also happens if mk_protected_ptr returns nonzero in eax and an attempt is made to free the associated selector. ****************/ extern int (*_x386_free_protected_ptr)(void _far *); /*************** Function is called with a far pointer. It determines the absolute address of that pointer and returns the address in eax. ****************/ extern unsigned long(*_x386_get_abs_address)(void _far *ptr); #endif /* Register structure required for functions int86() and intdos() */ #if M_I386 || M_I486 struct DWORDREGS { unsigned eax,ebx,ecx,edx,esi,edi,cflag,flags; }; struct WORDREGS { unsigned short ax,eaxmsw,bx,ebxmsw,cx,ecxmsw,dx,edxmsw, si,esimsw,di,edimsw; unsigned cflag,flags; }; struct BYTEREGS { unsigned char al,ah,ax2,ax3,bl,bh,bx2,bx3, cl,ch,cx2,cx3,dl,dh,dx2,dx3; }; union REGS { struct DWORDREGS e; struct WORDREGS x; struct BYTEREGS h; }; struct SREGS { unsigned short es,cs,ss,ds,fs,gs; }; #else struct WORDREGS { unsigned ax,bx,cx,dx,si,di,cflag,flags; }; struct BYTEREGS {unsigned char al,ah,bl,bh,cl,ch,dl,dh; }; union REGS { struct WORDREGS x; struct BYTEREGS h; }; struct SREGS { unsigned es,cs,ss,ds; }; #endif int _cdecl int86(int,union REGS *,union REGS *); int _cdecl int86x(int,union REGS *,union REGS *,struct SREGS *); int _cdecl intdos(union REGS *,union REGS *); int _cdecl intdosx(union REGS *,union REGS *,struct SREGS *); void _cdecl segread(struct SREGS *); #if DOS386 int _cdecl int86_real(int,union REGS *,union REGS *); int _cdecl int86x_real(int,union REGS *,union REGS *,struct SREGS *); #endif #if (M_UNIX || M_XENIX) /*************** The _vt_ functions help support the use of virtural terminals. See SCREEN(HW) for the basics of the ioctl()'s which are hidden by this set of functions. Use _vt_add() to add functions to be called at time when requests are made to switch screens. Your function will be passed either VT_RELDISP or VT_ACTIVATE to identify which action is being taken. If you do not wish to release the screen return VT_FALSE for relsig (VT_TRUE if you are ready to release it). The return value for acqsig is ignored. You may add as many functions to be notified as you wish -- the only memory constraints are governed by malloc(). Remove functions with _vt_remove. If you wish to switch to another screen use _vt_activate(). Screen numbers are normally 1 -> 12. To find your screen number use _vt_get_num(). ****************/ /*************** ioctls supported by the VT ****************/ #define VTIOC ('v' << 8) #define VT_OPENQRY (VTIOC | 1) #define VT_SETMODE (VTIOC | 2) #define VT_GETMODE (VTIOC | 3) #define VT_RELDISP (VTIOC | 4) #define VT_ACTIVATE (VTIOC | 5) /*************** Modes of VT_RELDISP ****************/ #define VT_FALSE 0 /* user will not release display */ #define VT_TRUE 1 /* user releases display */ #define VT_ACKACQ 2 /* user acknowleges the acquire signal */ /*************** Modes of struct vt_mode.mode ****************/ #define VT_AUTO 0 /* this vt switching is automatic */ #define VT_PROCESS 1 /* this vt switching controlled by a process */ struct vt_mode {char mode, waitv; short relsig, acqsig, frsig;}; typedef int (*_vt_sig_func_t)(int); /*************** Return the mode the VT handler is in. ****************/ void _vt_get_mode(struct vt_mode *p); /*************** Set the new mode to use with this VT. Return -1 if failure. ****************/ int _vt_set_mode(struct vt_mode *p); /*************** Get this processes VT screen number. Return -1 if failure or screen number if successful. ****************/ int _vt_get_num(void); /*************** Set this VT to be the active one. Return -1 if failure. ****************/ int _vt_activate(int vt_num); /*************** Adds a another function to the list to be notified in the event of a release/acquire request. Returns -1 if failed. ****************/ int _vt_add(_vt_sig_func_t func); /*************** Remove this function from the list of functions to be notified in the event of a release/acquire request. Returns -1 if failure to remove it. ****************/ int _vt_remove(_vt_sig_func_t func); #include struct FIND /* struct used by findfirst() and findnext() */ { struct stat stat; unsigned short attribute;/* attribute found (FA_XXXX) */ unsigned short time,date;/* file's time and date */ unsigned long size; /* file's size */ char name[16]; /* filename followed by 0 byte */ }; /* Directory entry attributes */ /* Use S_XXXX bit masks in sys/stat.h. */ #define FA_NORMAL 0x00 #define FA_DIREC S_IFDIR #else struct FIND /* struct used by findfirst() and findnext() */ { char reserved[21]; /* reserved by DOS */ char attribute; /* attribute found (FA_XXXX) */ unsigned short time,date; /* file's time and date */ unsigned long size; /* file's size */ char name[13]; /* filename followed by 0 byte */ }; struct find_t /* used by _dos_findfirst() and _dos_findnext() */ { char reserved[21]; /* reserved by DOS */ char attrib; /* attribute found (FA_XXXX) */ unsigned short wr_time,wr_date; /* file's last write */ unsigned long size; /* file's size */ char name[13]; /* filename followed by 0 byte */ }; /* Directory entry attributes */ #define FA_NORMAL 0x00 #define FA_RDONLY 0x01 #define FA_HIDDEN 0x02 #define FA_SYSTEM 0x04 #define FA_LABEL 0x08 #define FA_DIREC 0x10 #define FA_ARCH 0x20 #define _A_NORMAL 0x00 #define _A_RDONLY 0x01 #define _A_HIDDEN 0x02 #define _A_SYSTEM 0x04 #define _A_VOLID 0x08 #define _A_SUBDIR 0x10 #define _A_ARCH 0x20 #endif struct FIND * _cdecl findfirst(const char *,int),* _cdecl findnext(void); #if MSDOS || _WINDOWS int _cdecl _dos_findfirst(char *, unsigned, struct find_t *); int _cdecl _dos_findnext(struct find_t *); #endif extern unsigned short _cdecl _psp; extern unsigned char _cdecl _osmajor; extern unsigned char _cdecl _osminor; extern unsigned char _cdecl _osmode; extern volatile int _cdecl _doserrno; /* MS-DOS error codes. Refer to the */ /* ERROR RETURN TABLE in your MS-DOS */ /* manual. */ /*************************** * Define macros to get at the segment and offset of a far pointer. */ #define FP_OFF(fp) ((unsigned)(fp)) #if M_I386 || M_I486 extern unsigned _cdecl FP_SEG(void _far *); #else #define FP_SEG(fp) ((unsigned)((unsigned long)(fp) >> 16)) #endif /* Generate a far pointer from a segment and an offset */ #if M_I386 || M_I486 extern void _far * _cdecl MK_FP(unsigned short,unsigned); #define MK_FP(seg,offset) MK_FP((seg),(unsigned)(offset)) #else #define MK_FP(seg,offset) \ ((void _far *)(((unsigned long)(seg)<<16) | (unsigned)(offset))) #endif void _far * _cdecl _farptr_norm(void _far *); void _far * _cdecl _farptr_fromlong(long); long _cdecl _farptr_tolong(void _far *); long _cdecl _farptr_diff(void _far *,void _far *); /*********************************** * Far storage allocation functions */ void _far * _cdecl farmalloc(unsigned long size); void _far * _cdecl farcalloc(unsigned long numelems,unsigned long elemsize); void _far * _cdecl farrealloc(void _far *oldptr,unsigned long newsize); int _cdecl farfree(void _far *ptr); unsigned long _cdecl farcoreleft(void); /******************************* * File modes for open(). */ #define O_RDONLY 0 #define O_WRONLY 1 #define O_RDWR 2 #define O_APPEND 8 #define O_NOINHERIT 0x80 #define O_CREAT 0x100 #define O_TRUNC 0x200 #define O_EXCL 0x400 /* structure for dos_exterr */ struct DOSERROR { int exterror; /* extended error code */ char eclass; /* error class */ char action; /* recommended action */ char locus; /* error locus */ }; /* structure for dos_setdate/dos_getdate */ struct dos_date_t { char day; char month; short year; char dayofweek; }; /* structure for dos_settime/dos_gettime */ struct dos_time_t { char hour; char minute; char second; char hsecond; }; /* DOS specific functions: */ int _cdecl dos_creat(char *,int); void _cdecl dos_set_verify(int); void _cdecl dos_set_ctrl_break(int); int _cdecl dos_get_verify(void); int _cdecl dos_get_ctrl_break(void); long _cdecl dos_getdiskfreespace(int); int _cdecl dos_abs_disk_read(int,int,int,char *); int _cdecl dos_abs_disk_write(int,int,int,char *); void _cdecl dos_setdrive(unsigned, unsigned *); void _cdecl dos_getdrive(unsigned *); int _cdecl dos_setftime(int, unsigned, unsigned); int _cdecl dos_getftime(int, unsigned *, unsigned *); int _cdecl dos_setfileattr(char *, unsigned); int _cdecl dos_getfileattr(char *, unsigned *); int _cdecl dos_exterror(struct DOSERROR *); int _cdecl dosexterror(struct DOSERROR *); int _cdecl dos_setdate(struct dos_date_t *); int _cdecl dos_getdate(struct dos_date_t *); int _cdecl dos_settime(struct dos_time_t *); int _cdecl dos_gettime(struct dos_time_t *); /* For inline code generation for inp(), inpw(), outp() and outpw() functions */ unsigned char _cdecl _inline_inp(unsigned); int _cdecl _inline_inpw(unsigned); unsigned char _cdecl _inline_outp(unsigned,char); int _cdecl _inline_outpw(unsigned,unsigned); #define inp _inline_inp #define inpw _inline_inpw #define outp _inline_outp #define outpw _inline_outpw #if M_I386 || M_I486 long _cdecl inpl(unsigned); long _cdecl outpl(unsigned,unsigned long); #endif #if _WINDOWS #define _chkstack() #else size_t _cdecl _chkstack(void); #endif void _cdecl peek(unsigned,unsigned,void *,size_t); void _cdecl poke(unsigned,unsigned,const void *,size_t); int _cdecl bdos(char,...); int _cdecl bdosx(char,void *,char); /* From parall.asm */ unsigned _cdecl dos_alloc(unsigned); unsigned _cdecl dos_calloc(unsigned); int _cdecl dos_free(unsigned); void _cdecl _copy(unsigned,unsigned,unsigned); unsigned long _cdecl dos_avail(void); unsigned _cdecl dos_setblock(unsigned,unsigned); /* From response.c */ int _pascal response_expand(int *,char ***); int _cdecl cputype(void); /* Use this macro if you wish to cause wildcard expansion */ #if MSDOS || _WINDOWS || __OS2__ #define WILDCARDS extern int _cdecl __wildcard; int *__wild = &__wildcard; #else #define WILDCARDS #endif /* Executable type */ #define EXE_DOS 1 /* MSDOS */ #define EXE_DOS16RM 2 /* Rational 286 DOS Extender */ #define EXE_ZPM 4 /* ZPM 286 DOS Extender */ #define EXE_PHAR386 8 /* Pharlap 386 DOS Extender */ #define EXE_DOSX 0x10 /* DOSX 386 DOS Extender */ #define EXE_WINDOWS 0x20 /* Windows 3 */ #define EXE_OS2 0x40 /* OS/2 1.x */ #define EXE_SCOUNIX 0x80 /* SCO Unix */ extern unsigned short _cdecl _exe_type; /* EXE_XXXX */ #if !(M_UNIX || M_XENIX) #pragma ZTC align #endif #if __cplusplus } #endif #endif /* __DOS_H */