home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1997 October / VPR9710A.ISO / BENCH / DJ1SRC_K / 105 / XMS.C < prev    next >
C/C++ Source or Header  |  1997-05-02  |  3KB  |  124 lines

  1. /*
  2.    ** xms.c -- C bindings for xms API - implemented
  3.    ** Author: Kent Williams william@umaxc.weeg.uiowa.edu
  4.  */
  5. /* 1997/05/01 modified by Kimio Itoh(kitoh@nn.iij4u.or.jp) 
  6.    for reduce binary size and for dead code elimination.
  7.  */
  8. #pragma inline
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include "xms.h"
  12.  
  13. static void far xms_spoof(void);
  14. static void (far * xms_entry) (void) = xms_spoof;
  15.  
  16. int xms_installed(void)
  17. {
  18.     asm mov ax, 0x4300;            /* get installation status */
  19.     asm int 0x2f;                /* call driver */
  20.     asm mov ah, 1;                /* return true if present */
  21.     asm cmp al, 0x80;            /* are you there? */
  22.     asm je __present;
  23.     asm xor ax, ax;                /* no, return false */
  24.   __present:
  25.     asm xchg ah, al;            /* if present, set ax to 1 */
  26.     asm cbw;
  27. }
  28.  
  29. static void xms_get_entry(void)
  30. {
  31.     asm mov ax, 0x4310;            /* get driver entry */
  32.     asm int 0x2f;                /* call multiplex */
  33.     asm mov word ptr xms_entry, bx;
  34.     asm mov word ptr(xms_entry + 2), es;
  35. }
  36.  
  37. static void far xms_spoof(void)
  38. {
  39.     asm push ax bx cx dx si di es ds;
  40.     if (!xms_installed()) {
  41.         fprintf(stderr, "No XMS driver installed\n");
  42.         exit(1);
  43.     } else
  44.         xms_get_entry();
  45.     asm pop ds es di si dx cx bx ax;
  46.     xms_entry();
  47. }
  48.  
  49. xms_extended_info *xms_query_extended_memory(void)
  50. {
  51.     unsigned max_free_block, total_extended_memory;
  52.     static xms_extended_info x;
  53.  
  54.     asm mov ah, 0x8;
  55.     asm call[xms_entry];
  56.     asm mov max_free_block, ax;
  57.     asm mov total_extended_memory, dx;
  58.     x.max_free_block = max_free_block;
  59.     x.total_extended_memory = total_extended_memory;
  60.     return &x;
  61. }
  62.  
  63. int xms_local_enable_a20(void)
  64. {
  65.     asm mov ah, 0x5;
  66.     asm call[xms_entry];
  67.     asm neg ax;
  68.     asm inc ax;
  69. }
  70.  
  71. int xms_local_disable_a20(void)
  72. {
  73.     asm mov ah, 0x6;
  74.     asm call[xms_entry];
  75.     asm neg ax;
  76.     asm inc ax;
  77. }
  78.  
  79. int xms_emb_allocate(emb_size_K_t siz)
  80. {
  81.     asm mov ah, 0x9;
  82.     asm mov dx, siz;
  83.     asm call[xms_entry];
  84.     asm or ax, ax;                /* allocation succeed? */
  85.     asm jz alloc_failed;        /* no, return 0            */
  86.     asm xchg ax, dx;            /* yes, return handle */
  87.     asm jmp done;
  88.   alloc_failed:
  89.     asm not ax;
  90.   done:
  91. }
  92.  
  93. int xms_emb_free(emb_handle_t handle)
  94. {
  95.     asm mov ah, 0x0a;
  96.     asm mov dx, handle;
  97.     asm call[xms_entry];
  98.     asm neg ax;
  99.     asm inc ax;
  100. }
  101.  
  102. emb_off_t xms_lock_emb(emb_handle_t handle)
  103. {
  104.     asm mov ah, 0x0c;
  105.     asm mov dx, handle;
  106.     asm call[xms_entry];
  107.     asm or ax, ax;
  108.     asm je lock_failed;
  109.     asm mov ax, bx;                /* return value in dx:ax */
  110.     asm jmp lock_done;
  111.   lock_failed:
  112.     asm mov dx, ax;
  113.   lock_done:
  114. }
  115.  
  116. int xms_unlock_emb(emb_handle_t handle)
  117. {
  118.     asm mov ah, 0x0d;
  119.     asm mov dx, handle;
  120.     asm call[xms_entry];
  121.     asm neg ax;
  122.     asm inc ax;
  123. }
  124.