home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / modula2 / library / btrieve / mod2btrv.mod < prev    next >
Text File  |  1988-08-26  |  6KB  |  154 lines

  1. (*                                          *)
  2. (*  Module Name: Mod2Btrv.MOD                                  *)
  3. (*                                          *)
  4. (*  Description: This is the Btrieve interface for JPI TopSpeed Modula-2.     *)
  5. (*        This routine sets up the parameter block expected by          *)
  6. (*        Btrieve, and issues interrupt 7B. It was created from         *)
  7. (*        the TURXBTRV interface.                                        *)
  8. (*                                          *)
  9. (*  Synopsis:    STAT := BTRV (OP, POS.START, DATA.START, DATALEN,          *)
  10. (*                 KBUF.START, KEY);                  *)
  11. (*                  where                          *)
  12. (*            OP is an integer,                      *)
  13. (*            POS is a 128 byte array,                  *)
  14. (*            DATA is an untyped parameter for the data buffer,     *)
  15. (*            DATALEN is the integer length of the data buffer,     *)
  16. (*            KBUF is the untyped parameter for the key buffer,     *)
  17. (*            and KEY is an integer.                      *)
  18. (*                                          *)
  19. (*  Returns:    Btrieve status code (see Appendix B of the Btrieve Manual).   *)
  20. (*                                          *)
  21.  
  22. IMPLEMENTATION MODULE Mod2BTRV;
  23.  
  24.   FROM SYSTEM IMPORT Registers, Ofs, Seg;
  25.   FROM AsmLib IMPORT Intr;
  26.  
  27.   PROCEDURE BTRV(OP: INTEGER;
  28.                  VAR POS, DATA: ARRAY OF BYTE;
  29.                  VAR DATALEN: INTEGER;
  30.                  VAR KBUF: ARRAY OF BYTE;
  31.                  KEY: INTEGER): INTEGER;
  32.  
  33.  
  34.     CONST
  35.       PASCALID = 0AAAAH; (*Pascal language id*)
  36.  
  37.       VARID = 06176H; (*id for variable length records - 'va'*)
  38.  
  39.       BTRINT = 07BH;
  40.       BTR2INT = 02FH;
  41.       BTROFFSET = 00033H;
  42.       MULTIFUNCTION = 0ABH;
  43.       (*  ProcId is used for communicating with the Multi Tasking Version of          *)
  44.       (*  Btrieve. It contains the process id returned from BMulti and should          *)
  45.       (*  not be changed once it has been set.                               *)
  46.       (*                                          *)
  47.  
  48.     VAR
  49.       ProcId: INTEGER; (* initialize to no process id *)
  50.       MULTI: BOOLEAN; (* set to true if BMulti is loaded *)
  51.       VSet: BOOLEAN; (* set to true if we have checked for BMulti *)
  52.  
  53.  
  54.  
  55.     TYPE
  56.  
  57.       ADDR32 = RECORD (*32 bit address*)
  58.                  OFFSET: INTEGER;
  59.                  SEGMENT: INTEGER;
  60.                END;
  61.  
  62.       BTRPARMS = RECORD
  63.                    USERBUFADDR: ADDR32;         (*data buffer address*)
  64.                    USERBUFLEN: INTEGER;         (*data buffer length*)
  65.                    USERCURADDR: ADDR32;         (*currency block address*)
  66.                    USERFCBADDR: ADDR32;         (*file control block address*)
  67.                    USERFUNCTION: INTEGER;       (*Btrieve operation*)
  68.                    USERKEYADDR: ADDR32;         (*key buffer address*)
  69.                    USERKEYLENGTH: BYTE;         (*key buffer length*)
  70.                    USERKEYNUMBER: BYTE;         (*key number*)
  71.                    USERSTATADDR: ADDR32;        (*return status address*)
  72.                    XFACEID: INTEGER;            (*language interface id*)
  73.                  END;
  74.  
  75.       Result = Registers;
  76.  
  77.     VAR
  78.       STAT: INTEGER; (*Btrieve status code*)
  79.       XDATA: BTRPARMS; (*Btrieve parameter block*)
  80.       REGS: Result; (*register structure used on interrrupt call*)
  81.       DONE: BOOLEAN;
  82.       BTRVResult: INTEGER;
  83.  
  84.   BEGIN
  85.     VSet := FALSE;
  86.     MULTI := FALSE;
  87.     ProcId := 0;
  88.     REGS.AX := 03500H+BTRINT;
  89.     Intr(REGS,021H);
  90.     IF (REGS.BX <> BTROFFSET) THEN (*make sure Btrieve is installed*)
  91.        STAT := 20
  92.     ELSE
  93.       IF (NOT VSet) THEN (*if we haven't checked for Multi-User version*)
  94.          REGS.AX := 03000H;
  95.          Intr(REGS,021H);
  96.          IF (CARDINAL(BITSET(REGS.AX) * BITSET(000FFH)) >= 3) THEN
  97.             VSet := TRUE;
  98.             REGS.AX := MULTIFUNCTION*256;
  99.             Intr(REGS, BTR2INT);
  100.             MULTI := (CARDINAL(BITSET(REGS.AX) * BITSET(000FFH)) = 0004DH);
  101.          ELSE
  102.             MULTI := FALSE
  103.          END;
  104.       END; (*make normal btrieve call*)
  105.       WITH XDATA DO
  106.         USERBUFADDR.SEGMENT := Seg(DATA);
  107.         USERBUFADDR.OFFSET := Ofs(DATA); (*set data buffer address*)
  108.         USERBUFLEN := DATALEN;
  109.         USERFCBADDR.SEGMENT := Seg(POS);
  110.         USERFCBADDR.OFFSET := Ofs(POS); (*set FCB address*)
  111.         USERCURADDR.SEGMENT := USERFCBADDR.SEGMENT; (*set cur seg*)
  112.         USERCURADDR.OFFSET := USERFCBADDR.OFFSET+38; (*set cur ofs*)
  113.         USERFUNCTION := OP; (*set Btrieve operation code*)
  114.         USERKEYADDR.SEGMENT := Seg(KBUF);
  115.         USERKEYADDR.OFFSET := Ofs(KBUF); (*set key buffer address*)
  116.         USERKEYLENGTH := BYTE(255); (*assume its large enough*)
  117.         USERKEYNUMBER := BYTE(KEY); (*set key number*)
  118.         USERSTATADDR.SEGMENT := Seg(STAT);
  119.         USERSTATADDR.OFFSET := Ofs(STAT); (*set status address*)
  120.         XFACEID := VARID; (*set language id*)
  121.       END;
  122.       REGS.DX := Ofs(XDATA);
  123.       REGS.DS := Seg(XDATA);
  124.       IF ( NOT MULTI) THEN (*MultiUser version not installed*)
  125.          Intr(REGS, BTRINT)
  126.       ELSE
  127.          DONE := FALSE;
  128.          REPEAT
  129.               REGS.BX := ProcId;
  130.               REGS.AX := 1;
  131.               IF (REGS.BX <> 0) THEN
  132.                  REGS.AX := 2
  133.               END;
  134.               INC(REGS.AX, (MULTIFUNCTION*256));
  135.               Intr(REGS, BTRINT);
  136.               IF (CARDINAL(BITSET(REGS.AX) * BITSET(000FFH)) = 0) THEN
  137.                  DONE := TRUE
  138.               ELSE
  139.                  REGS.AX := 00200H;
  140.                  Intr(REGS, 07FH);
  141.                  DONE := FALSE;
  142.               END;
  143.         UNTIL (DONE);
  144.         IF (ProcId = 0) THEN
  145.            ProcId := REGS.BX
  146.         END;
  147.       END;
  148.       DATALEN := XDATA.USERBUFLEN;
  149.     END;
  150.     BTRVResult := STAT;
  151.     RETURN BTRVResult
  152.   END BTRV;
  153. END Mod2BTRV.
  154.