home *** CD-ROM | disk | FTP | other *** search
-
- /* */
- /* Computer Innovations C86 interface to the */
- /* Btrieve Record Manager, version 4 */
- /* Note: if compiling for the LARGE memory model, remove the */
- /* comments surrounding the following definition. */
- /*
- #define _C86_BIG 1
- */
- #define BTRERR 20 /* record manager not started */
- #define BTRINT 0x7B /* Btrieve interrupt vector */
- #define BTRVECTOR BTRINT*4 /* offset for interrupt */
- #define BTROFFSET 0x33 /* Btrieve offset within segment */
- #define VARIABLE_ID 0x6176 /* id for variable length */
- /* records - 'va' */
-
- /* ProcId is used for communicating with the Multi Tasking Version of */
- /* Btrieve. It contains the process id returned from BMulti and should */
- /* not be changed once it has been set. */
- /* */
- int ProcId = 0; /* initialize to no process id */
- static char MULTI = 0; /* flag set to true if MultiUser */
- static char VSet = 0; /* flag set to true if checked version */
-
- struct regval { int ax,bx,cx,dx,si,di,ds,es; };
- struct segregs { int cs, ss, ds2, es2; };
-
- btrv (op, pos, databuf, datalen, keybuf, keynum)
- int op; /* operation */
- char *pos; /* position block */
- char *databuf; /* data buffer */
- int *datalen; /* data buffer length */
- char *keybuf; /* key buffer */
- int keynum; /* key number */
- {
- struct regval regs; /* registers */
- int stat; /* Btrieve return status */
- struct {
- int dataoff; /* data buffer offset */
- int dataseg; /* data buffer segment */
- int datalen; /* data buffer length */
- int posoff; /* position block offset */
- int posseg; /* position block segment */
- int fcboff; /* fcb offset */
- int fcbseg; /* fcb segment */
- int opcode; /* operation code */
- int keyoff; /* key buffer offset */
- int keyseg; /* key buffer segment */
- char keylen; /* key length */
- char keynum; /* key number */
- int statoff; /* key buffer offset */
- int statseg; /* key buffer segment */
- int language; /* language id */
- } btrparms; /* Btrieve parameter block */
-
- #ifndef _C86_BIG
- #define ptoreg(ptr,seg,off) ((off)=(ptr),(seg)=(rv.ds2))
- struct segregs rv; /* segment registers */
-
- segread (&rv); /* get contents of segment regs */
- #else
- #define ptoreg(ptr,seg,off) ((off)=(unsigned long)(ptr),(seg)=((unsigned long)ptr)>>16)
- #endif
-
- /* verify that Btrieve is loaded */
-
- regs.ax = 0x3500 + BTRINT; /* set DOS function */
- sysint (0x21, ®s, ®s); /* get interrupt vector */
- if (regs.bx != BTROFFSET) /* check for Btrieve not loaded */
- return (BTRERR); /* return bad status */
-
- if (!VSet)
- {
- VSet = 1;
- regs.ax = 0x3000;
- sysint (0x21, ®s, ®s);
- if ((regs.ax & 0x00FF) >= 3)
- {
- regs.ax = 0xAB00;
- sysint (0x2F, ®s, ®s);
- MULTI = ((regs.ax & 0x00FF) == 'M');
- }
- }
-
- /* set up the Btrieve parameter block */
-
- ptoreg (databuf, regs.ds, regs.dx);
- btrparms.dataoff = regs.dx;
- btrparms.dataseg = regs.ds;
- btrparms.datalen = *datalen;
- ptoreg (&pos[38], regs.ds, regs.dx);
- btrparms.posoff = regs.dx;
- btrparms.posseg = regs.ds;
- ptoreg (pos, regs.ds, regs.dx);
- btrparms.fcboff = regs.dx;
- btrparms.fcbseg = regs.ds;
- btrparms.opcode = op;
- ptoreg (keybuf, regs.ds, regs.dx);
- btrparms.keyoff = regs.dx;
- btrparms.keyseg = regs.ds;
- btrparms.keylen = 255;
- btrparms.keynum = keynum;
- ptoreg (&stat, regs.ds, regs.dx);
- btrparms.statoff = regs.dx;
- btrparms.statseg = regs.ds;
- btrparms.language = VARIABLE_ID;
-
- /* invoke the Btrieve record manager */
-
- ptoreg (&btrparms, regs.ds, regs.dx);
-
- if (!MULTI)
- sysint(0x7B, ®s,®s);
- else
- {
- while (1)
- {
- regs.ax = 1; /* assume no process id */
- if ((regs.bx = ProcId) != 0)/* already have a process id? */
- regs.ax = 2; /* yes, let BMulti know */
- regs.ax += 0xAB00;
- sysint (0x2F, ®s, ®s); /* call Btrieve */
- if ((regs.ax & 0x00FF) == 0) break;
- regs.ax = 0x0200;
- sysint (0x7F, ®s, ®s);
- }
- if (ProcId == 0) ProcId = regs.bx;
- }
-
- /* return status code and length of data returned */
-
- *datalen = btrparms.datalen;
- return (stat);
- }