Listing 1 Bare-bones FOSSIL program

// Bare bones FOSSIL terminal program.
// Compiled with Microsoft VC++ 1.0, but should
// port to other compilers.

#include <stdio.h>
#include <dos.h>
#include <conio.h>

typedef unsigned char BYTE;
typedef unsigned int WORD;

// Extended key code for
// Alt-X
#define ALT_X (0x2d)
#define SER_DAT_READY (0x100)

int def_port=0;

// Generalized FOSSIL function
//          AH   AL   DX
WORD fossil(BYTE,BYTE,WORD);

// Specific FOSSIL functions actually implemented
// as macros
#define fos_setparms(p,x) fossil(0,x,p)
#define fos_putc(p,c)     fossil(1,c,p)
#define fos_getc(p)       fossil(2,0,p)
#define fos_status(p)     fossil(3,0,p)
#define fos_init(p)       fossil(4,0,p)
#define fos_uninit(p)     fossil(5,0,p)
#define fos_setDTR(p,f)   fossil(6,f,p)

main(int argc,char **argv)
{
   int c;
   
   if(fos_init(def_port)!=0x1954) {
      fprintf(stderr,
         "\nFOSSIL driver not present!\n");
      exit(1);
   }
   
   // Set Parms 9600,N,8,1
   fos_setparms(def_port,0xe3);
   
   // Main Terminal Loop
   while(1) {
      if(kbhit()) {
         c=getch();
         if(!c) {
            if(getch()==ALT_X)
               break;
         }
         else
            fos_putc(def_port,(BYTE)c);
      }
      
      // See if a character is waiting to be read
      // If so, display it.
      if((fos_status(def_port)&SER_DAT_READY)!=0) {
         fputc(fos_getc(def_port),stdout);
      }
   }
   // Lower DTR
   fos_setDTR(def_port,0);
   // Uninitialize Driver
   fos_uninit(def_port);
   exit(0);
}

// Use older interrupt interface rather than
// inline assembly.
WORD fossil (BYTE ahreg, BYTE alreg, WORD dxreg)
{
   
   union REGS r;
   r.h.ah=ahreg;
   r.h.al=alreg;
   r.x.dx=dxreg;
   int86(0x14,&r,&r);
   return(r.x.ax);
}

// End of File