/*  dos.h
 
    Defines structs, unions, macros, and functions for dealing
    with MSDOS and the Intel iAPX86 microprocessor family.
 
    Copyright (c) Borland International 1987,1988
    All Rights Reserved.
*/
#if __STDC__
#define _Cdecl
#else
#define _Cdecl    cdecl
#endif
 
#if     !defined(__DOS_DEF_)
#define __DOS_DEF_
 
/* Variables */
extern int    _Cdecl _8087;
extern int    _Cdecl _argc;
extern char         **_Cdecl _argv;
extern char         **_Cdecl  environ;
extern int    _Cdecl _doserrno;
extern unsigned   _Cdecl _heaplen;
extern unsigned char _Cdecl _osmajor;
extern unsigned char _Cdecl _osminor;
extern unsigned   _Cdecl _psp;
extern unsigned   _Cdecl _stklen;
extern unsigned   _Cdecl _version;
 
#define FA_RDONLY 0x01       /* Read only attribute */
#define FA_HIDDEN 0x02       /* Hidden file */
#define FA_SYSTEM 0x04       /* System file */
#define FA_LABEL  0x08       /* Volume label */
#define FA_DIREC  0x10       /* Directory */
#define FA_ARCH      0x20       /* Archive */
 
#define NFDS  20         /* Maximum number of fds */
 
struct fcb {
    char   fcb_drive;    /* 0 = default, 1 = A, 2 = B */
    char   fcb_name[8];      /* File name */
    char   fcb_ext[3];       /* File extension */
    short  fcb_curblk;       /* Current block number */
    short  fcb_recsize;      /* Logical record size in bytes */
    long   fcb_filsize;      /* File size in bytes */
    short  fcb_date;     /* Date file was last written */
    char   fcb_resv[10];     /* Reserved for DOS */
    char   fcb_currec;       /* Current record in block */
    long   fcb_random;       /* Random record number */
};
 
struct xfcb   {
    char       xfcb_flag; /* Contains 0xff to indicate xfcb */
    char       xfcb_resv[5]; /* Reserved for DOS */
    char       xfcb_attr; /* Search attribute */
    struct fcb xfcb_fcb;  /* The standard fcb */
};
 
struct country {
    int co_date;
    char   co_curr[5];
    char   co_thsep[2];
    char   co_desep[2];
    char   co_dtsep[2];
    char   co_tmsep[2];
    char   co_currstyle;
    char   co_digits;
    char   co_time;
    long   co_case;
    char   co_dasep[2];
    char   co_fill[10];
};
 
struct DOSERROR {
    int exterror;
    char   class;
    char   action;
    char   locus;
};
 
struct dfree  {
    unsigned df_avail;
    unsigned df_total;
    unsigned df_bsec;
    unsigned df_sclus;
};
 
struct fatinfo {
    char   fi_sclus;
    char   fi_fatid;
    int fi_nclus;
    int fi_bysec;
};
 
struct devhdr {
    long       dh_next;   /* Next device pointer */
    short      dh_attr;   /* Attributes */
    unsigned short    dh_strat;  /* Driver strategy routine */
    unsigned short    dh_inter;  /* Driver interrupt routine */
    char       dh_name[8];   /* Device name */
};
 
struct time   {
    unsigned char ti_min;       /* Minutes */
    unsigned char ti_hour;   /* Hours */
    unsigned char ti_hund;   /* Hundredths of seconds */
    unsigned char ti_sec;       /* Seconds */
};
 
struct date   {
    int    da_year;   /* Year - 1980 */
    char       da_day;       /* Day of the month */
    char       da_mon;       /* Month (1 = Jan) */
};
 
struct WORDREGS {
    unsigned int  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 int  es;
    unsigned int  cs;
    unsigned int  ss;
    unsigned int  ds;
};
 
struct REGPACK {
    unsigned   r_ax, r_bx, r_cx, r_dx;
    unsigned   r_bp, r_si, r_di, r_ds, r_es, r_flags;
};
 
#define FP_OFF(fp)   ((unsigned)(fp))
#define FP_SEG(fp)   ((unsigned)((unsigned long)(fp) >> 16))
 
 
typedef struct {
    char   drive;     /* do not change  */
    char   pattern [13]; /*  these fields, */
    char   reserved [7]; /*   Microsoft reserved */
    char   attrib;
    short  time;
    short  date;
    long   size;
    char   nameZ [13];   /* result of the search, asciiz */
}   dosSearchInfo;    /* used with DOS functions 4E, 4F  */
 
 
int  _Cdecl absread   (int drive, int nsects, int lsect, void *buffer);
int  _Cdecl abswrite(int drive, int nsects, int lsect, void *buffer);
int  _Cdecl allocmem(unsigned size, unsigned *segp);
int  _Cdecl bdos  (int dosfun, unsigned dosdx, unsigned dosal);
int  _Cdecl bdosptr   (int dosfun, void *argument, unsigned dosal);
struct country *_Cdecl country  (int xcode, struct country *cp);
void    _Cdecl ctrlbrk   (int _Cdecl (*handler)(void));
void    _Cdecl delay (unsigned milliseconds);
void    _Cdecl disable   (void);
int  _Cdecl dosexterr (struct DOSERROR *eblkp);
long    _Cdecl dostounix (struct date *d, struct time *t);
void          __emit__();
void    _Cdecl enable    (void);
int  _Cdecl freemem   (unsigned segx);
int  _Cdecl getcbrk   (void);
void    _Cdecl getdate   (struct date *datep);
void    _Cdecl getdfree(unsigned char drive, struct dfree *dtable);
void    _Cdecl getfat    (unsigned char drive, struct fatinfo *dtable);
void    _Cdecl getfatd   (struct fatinfo *dtable);
unsigned _Cdecl getpsp   (void);
int  _Cdecl getswitchar  (void);
void    _Cdecl gettime   (struct time *timep);
void   interrupt  (* _Cdecl getvect(int interruptno)) ();
int  _Cdecl getverify (void);
void    _Cdecl harderr   (int _Cdecl (*handler)());
void    _Cdecl hardresume   (int axret);
void    _Cdecl hardretn(int retn);
int  _Cdecl inport    (int portid);
unsigned char _Cdecl inportb(int portid);
int  _Cdecl int86 (int intno, union REGS *inregs, union REGS *outregs);
int  _Cdecl int86x    (int intno, union REGS *inregs, union REGS *outregs,
            struct SREGS *segregs);
int  _Cdecl intdos    (union REGS *inregs, union REGS *outregs);
int  _Cdecl intdosx   (union REGS *inregs, union REGS *outregs,
            struct SREGS *segregs);
void    _Cdecl intr  (int intno, struct REGPACK *preg);
void    _Cdecl keep  (unsigned char status, unsigned size);
void    _Cdecl nosound   (void);
void    _Cdecl outport   (int portid, int value);
void    _Cdecl outportb(int portid, unsigned char value);
char   *_Cdecl parsfnm   (const char *cmdline, struct fcb *fcb, int opt);
int  _Cdecl peek  (unsigned segment, unsigned offset);
char    _Cdecl peekb (unsigned segment, unsigned offset);
void    _Cdecl poke  (unsigned segment, unsigned offset, int value);
void    _Cdecl pokeb (unsigned segment, unsigned offset, char value);
int  _Cdecl randbrd   (struct fcb *fcb, int rcnt);
int  _Cdecl randbwr   (struct fcb *fcb, int rcnt);
void    _Cdecl segread   (struct SREGS *segp);
int  _Cdecl setblock(unsigned segx, unsigned newsize);
int  _Cdecl setcbrk   (int cbrkvalue);
void    _Cdecl setdate   (struct date *datep);
void    _Cdecl setswitchar  (char ch);
void    _Cdecl settime   (struct time *timep);
void    _Cdecl setvect   (int interruptno, void interrupt (*isr) ());
void    _Cdecl setverify (int value);
void    _Cdecl sleep (unsigned seconds);
void    _Cdecl sound (unsigned frequency);
void    _Cdecl unixtodos (long time, struct date *d, struct time *t);
int  _Cdecl    unlink (const char *path);
 
    /* These are in-line functions.  These prototypes just clean up
       some syntax checks and code generation.
     */
 
void   _Cdecl __cli__       (void);
void   _Cdecl __sti__       (void);
unsigned char _Cdecl __inportb__(int portid);
void   _Cdecl __outportb__  (int portid, unsigned char value);
void   _Cdecl __int__       (int interruptnum);
 
#define disable() __cli__()     /* Clear interrupt flag */
#define enable()  __sti__()      /* Set interrupt flag */
#define inportb(portid) __inportb__(portid)   /* Byte IN instruction */
#define outportb(portid, v) __outportb__(portid,v)/* Byte OUT instruction */
#define geninterrupt(i) __int__(i)     /* Interrupt instruction */
 
/* some other compilers use inp, outp for inportb, outportb */
#define inp(portid)  inportb(portid)
#define outp(portid,v)   outportb(portid,v)
 
#if !__STDC__
char far *cdecl getdta(void);
void     cdecl setdta(char far *dta);
 
#define MK_FP(seg,ofs)   ((void far *) \
              (((unsigned long)(seg) << 16) | (unsigned)(ofs)))
 
#define poke(a,b,c)  (*((int  far*)MK_FP((a),(b))) = (int)(c))
#define pokeb(a,b,c) (*((char far*)MK_FP((a),(b))) = (char)(c))
#define peek(a,b) (*((int  far*)MK_FP((a),(b))))
#define peekb(a,b)   (*((char far*)MK_FP((a),(b))))
#endif
 
#endif