home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 5 / 05.iso / a / a011 / 2.ddi / FORXBTRV.ASM < prev    next >
Encoding:
Assembly Source File  |  1986-06-09  |  5.1 KB  |  232 lines

  1.     TITLE    Btrieve Record Manager, Copyright (c) 1982 SoftCraft, Inc.
  2.     SUBTTL    FORXFACE - Interface to FORTRAN, Btrieve Version 4
  3.     PAGE
  4. ;-----------------------------------------------------------------
  5. ;FOR_XFACE
  6. ;    This routine interfaces between FORTRAN programs and
  7. ;    Btrieve assembly routines.
  8. ;
  9. ;    Calling Procedure from FORTRAN
  10. ;      ISTAT = ITRV (FUNCTION, CUR_BLOCK, DATA_BUF, DATA_LEN,
  11. ;                 KEY_BUF, KEY_NUMBER)
  12. ;          where
  13. ;        ITRV - return status from request (INTEGER)
  14. ;        FUNCTION - function number for request (INTEGER)
  15. ;        CUR_BLOCK - address of user's currency block (128 bytes)
  16. ;        DATA_BUF - address of data buffer
  17. ;        DATA_LEN - length of data buffer (INTEGER)
  18. ;        KEY_BUF - address of key buffer (255 bytes)
  19. ;        KEY_NUMBER - key number to be processed (INTEGER)
  20. ;-----------------------------------------------------------------
  21. ;
  22.     PUBLIC    ITRV
  23. ;    Define parameter offsets on stack
  24. ;
  25. PARM_OFF  = 10
  26. FUNCTION   = PARM_OFF + 20
  27. CUR_BLOCK  = PARM_OFF + 16
  28. DATA_BUF   = PARM_OFF + 12
  29. DATA_LEN   = PARM_OFF + 8
  30. KEY_BUFFER = PARM_OFF + 4
  31. KEY_NUM    = PARM_OFF
  32. ;
  33. ;    Define offsets withing the currency block where FCB
  34. ;    and currency information are found
  35. ;
  36. FCB      = 0
  37. CUR      = 38
  38. ;
  39. FOR_ID        EQU    0AAAAH    ;FORTRAN id
  40. VAR_ID        EQU    06176H    ;Variable data buffer ID
  41. BTR_ERR     EQU    20    ;Return status when Btrieve not initialized
  42. BTR_INT     EQU    07BH
  43. BTR2_INT    EQU    02FH
  44. MULTI_FUNCTION    EQU    0ABH
  45. BTR_OFFSET    EQU    033H
  46. BTR_VECTOR    EQU BTR_INT * 4 ;Absolute vector offset for interrupt
  47. POS_LEN_ERR    EQU    23    ;Invalid position block length error code
  48. ;
  49. XFACE    SEGMENT  PUBLIC 'CODE'
  50.     ASSUME CS:XFACE,DS:XFACE
  51.  
  52.     PUBLIC    USER_BUF_ADDR
  53.     PUBLIC    USER_BUF_LEN
  54.     PUBLIC    USER_CUR_ADDR
  55.     PUBLIC    USER_FCB_ADDR
  56.     PUBLIC    USER_FUNCTION
  57.     PUBLIC    USER_KEY_ADDR
  58.     PUBLIC    USER_KEY_LENGTH
  59.     PUBLIC    USER_KEY_NUMBER
  60.     PUBLIC    USER_STAT_ADDR
  61.     PUBLIC    XFACE_ID
  62.  
  63.  
  64.         USER_BUF_ADDR        DD   ?
  65.         USER_BUF_LEN        DW   ?
  66.         USER_CUR_ADDR        DD   ?
  67.         USER_FCB_ADDR        DD   ?
  68.         USER_FUNCTION        DW   ?
  69.         USER_KEY_ADDR        DD   ?
  70.         USER_KEY_LENGTH     DB   ?
  71.         USER_KEY_NUMBER     DB   ?
  72.         USER_STAT_ADDR        DD   ?
  73.         XFACE_ID        DW   ?
  74.  
  75.  
  76. ;
  77. STAT    DW    0
  78. ;
  79. PROCID    DW    0            ;Process Id for use by BMulti
  80. MULTI    DW    0
  81. VSET    DW    0
  82. ;
  83. ITRV    PROC     FAR
  84. ;
  85. ;    save callers segment and establish current segments
  86. ;
  87.     PUSH    BP            ;save callers registers
  88.     PUSH    DS
  89.     PUSH    ES
  90.     MOV    BP,SP            ;set base parm list
  91.     PUSH    CS            ;set up data segment
  92.     POP    DS
  93. ;
  94. ;    ensure Btrieve has been initialized
  95. ;
  96.     PUSH    ES
  97.     PUSH    BX
  98.     MOV    AX,3500H + BTR_INT
  99.     INT    21H
  100.     CMP    BX,BTR_OFFSET        ;Has Btrieve been intitalized?
  101.     POP    BX
  102.     POP    ES
  103.     JE    FOR_10            ;  Yes
  104.     MOV    STAT,BTR_ERR        ;Set return status
  105.     JMP    FOR_20            ;Skip interrupt since invalid
  106. FOR_10:
  107.     CMP    VSET,0
  108.     JNE    FOR_11
  109.     INC    VSET
  110.     PUSH    AX
  111.     MOV    AX,3000H
  112.     INT    21H
  113.     CMP    AL,3
  114.     POP    AX
  115.     JB    FOR_11
  116.     MOV    AX,MULTI_FUNCTION * 256
  117.     INT    BTR2_INT
  118.     CMP    AL,'M'
  119.     JNE    FOR_11
  120.     INC    MULTI
  121. FOR_11:
  122. ;
  123. ;    get function parameter
  124. ;
  125.     LES    SI,[BP]+FUNCTION        ;get function code
  126.     MOV    SI,ES:[SI]
  127.     MOV    USER_FUNCTION,SI
  128. ;
  129. ;    get address of callers status word from parameter
  130. ;
  131.     LEA    CX,STAT             ;get address of status word
  132.     MOV    WORD PTR USER_STAT_ADDR,CX
  133.     MOV    WORD PTR USER_STAT_ADDR[2],DS
  134. ;
  135. ;    get users currency block which contains:
  136. ;        - diskette FCB
  137. ;        - currency information
  138. ;
  139.     LES    BX,[BP]+CUR_BLOCK    ;ES:BX => address of currency block
  140.     LEA    AX,[BX]+FCB        ;get diskette FCB addr
  141.     MOV    WORD PTR USER_FCB_ADDR,AX
  142.     LEA    AX,[BX]+CUR        ;get currency block addr
  143.     MOV    WORD PTR USER_CUR_ADDR,AX
  144.     MOV    WORD PTR USER_FCB_ADDR[2],ES
  145.     MOV    WORD PTR USER_CUR_ADDR[2],ES
  146. ;
  147. ;    get address of data buffer
  148. ;
  149.     LES    BX,[BP]+DATA_BUF    ;AX => data buffer
  150.     MOV    WORD PTR USER_BUF_ADDR,BX
  151.     MOV    WORD PTR USER_BUF_ADDR[2],ES
  152. ;
  153. ;    get callers data buffer length
  154. ;
  155.     PUSH    ES
  156.     LES    BX,[BP]+DATA_LEN
  157.     MOV    AX,ES:[BX]
  158.     MOV    USER_BUF_LEN,AX
  159.     POP    ES
  160. ;
  161. ;    get callers key buffer address
  162. ;
  163.     LES    BX,[BP]+KEY_BUFFER    ;get key buffer addr
  164.     MOV    WORD PTR USER_KEY_ADDR,BX
  165.     MOV    WORD PTR USER_KEY_ADDR[2],ES
  166. ;
  167. ;    get callers key buffer length
  168. ;
  169.                     ;get key length
  170.     MOV    USER_KEY_LENGTH,255
  171. ;
  172. ;    get key number parameter
  173. ;
  174.     LES    SI,dword ptr [BP]+KEY_NUM      ;get key number
  175.     MOV    BX,ES:[SI]
  176.     MOV    USER_KEY_NUMBER,BL
  177. ;
  178. ;    set language and go process request
  179. ;
  180.     MOV    XFACE_ID,VAR_ID     ;get FORTRAN id
  181.     LEA    DX,USER_BUF_ADDR    ;DX => user parms
  182. ;
  183. ;
  184. ;
  185.     CMP    MULTI,0
  186.     JE    NOT_MULTI
  187. MAKE_CALL:
  188. ;
  189. ;   Set up additional registers for BMulti
  190. ;
  191.     XOR    AX,AX
  192.     INC    AX            ;Initialize function setting for BMulti
  193.     MOV    BX,PROCID        ;Set Process id for BMulti
  194.     OR    BX,BX            ;Do we need to get a process id?
  195.     JE    CALL_MULTI        ;  Yes, let BMulti know
  196.     INC    AX            ;Tell BMulti you have a process id
  197. CALL_MULTI:
  198.     MOV    AH,MULTI_FUNCTION
  199.     INT    BTR2_INT
  200.     CMP    AL,0
  201.     JE    DONE_CALL
  202.     MOV    AX,200H
  203.     INT    7FH
  204.     JMP    SHORT MAKE_CALL
  205. DONE_CALL:
  206.     CMP    PROCID,0
  207.     JNE    FOR_12
  208.     MOV    PROCID,BX
  209.     JMP    FOR_12
  210. NOT_MULTI:
  211.     INT    BTR_INT         ;process request
  212. FOR_12:
  213.     PUSH    ES
  214.     LES    BX,[BP]+DATA_LEN
  215.     MOV    AX,USER_BUF_LEN
  216.     MOV    ES:[BX],AX
  217.     POP    ES
  218. FOR_20:
  219. ;
  220. ;    restore callers stack and segment before returning
  221. ;
  222.     MOV    AX,STAT         ;Set function return code
  223.     MOV    DX,0
  224.     POP    ES
  225.     POP    DS
  226.     POP    BP
  227.     RET    24            ;return to caller
  228. ;
  229. ITRV    ENDP
  230. XFACE    ENDS
  231.     END
  232.