]> 4ch.mooo.com Git - 16.git/blob - src/lib/ems1.c
compy4 sync
[16.git] / src / lib / ems1.c
1 #if !defined(__EMS_H)\r
2 #define __EMS_H\r
3 \r
4 #define EMSPAGESIZE (4096)\r
5 #define EMS_ERROR (-1)\r
6 struct {\r
7   unsigned long length;\r
8   unsigned char source_type;\r
9   unsigned int source_handle;\r
10   unsigned int source_ofs; \r
11   unsigned int source_seg;\r
12   unsigned char dest_type;\r
13   unsigned int dest_handle;\r
14   unsigned int dest_ofs; \r
15   unsigned int dest_seg;\r
16 } myEMSmove;\r
17 \r
18 \r
19 void conv2ems(int PAGE, int HANDLE, char *output) {\r
20       char *x = (char *) &myEMSmove;\r
21       myEMSmove.length = EMSPAGESIZE;\r
22       myEMSmove.source_type = 0;\r
23       myEMSmove.source_handle = 0;\r
24       myEMSmove.source_ofs = FP_OFF(output);\r
25       myEMSmove.source_seg = FP_SEG(output);\r
26       myEMSmove.dest_type = 1;\r
27       myEMSmove.dest_handle = HANDLE;\r
28       myEMSmove.dest_ofs = (PAGE & 3) << 12;\r
29       myEMSmove.dest_seg = PAGE >> 2;\r
30       __asm push ds\r
31       __asm mov       ax, 5700h;        \r
32       __asm lds       si, x\r
33       __asm int       67h \r
34       __asm pop ds\r
35 }\r
36 \r
37 void ems2conv(int PAGE, int HANDLE, char *output) {\r
38       char *x = (char *) &myEMSmove;\r
39       myEMSmove.length = EMSPAGESIZE;\r
40       myEMSmove.source_type = 1;\r
41       myEMSmove.source_handle = HANDLE;\r
42       myEMSmove.source_ofs = (PAGE & 3) << 12;\r
43       myEMSmove.source_seg = PAGE>>2;\r
44       myEMSmove.dest_type = 0;\r
45       myEMSmove.dest_handle = 0;\r
46       myEMSmove.dest_ofs = FP_OFF(output);\r
47       myEMSmove.dest_seg = FP_SEG(output);\r
48       __asm push ds\r
49       __asm mov       ax, 5700h\r
50       __asm lds       si, x\r
51       __asm int       67h \r
52       __asm pop ds\r
53 }\r
54 \r
55 \r
56 void freeEMS(int handle) {\r
57   __asm mov       dx, handle;\r
58   __asm mov       ah, 45h;    \r
59   __asm int       67h  \r
60 }\r
61 \r
62 int checkEMS() {\r
63   char *x = "EMMXXXX0";\r
64   __asm {\r
65     mov ax, 3567h\r
66     int 21h\r
67     mov di, 10\r
68     mov si, offset x\r
69     mov cx, 4\r
70     rep cmpsw\r
71     je good \r
72   }\r
73   return -1;\r
74   good:\r
75   __asm {\r
76     sub     ax, ax\r
77     mov     ah, 40h\r
78     int     67h\r
79   }\r
80   return _AX;\r
81 }\r
82 \r
83 int getavailEMS() {\r
84   __asm {\r
85     mov     ah, 42h\r
86     int     67h\r
87     cmp     ah, 00h\r
88     je      getavailEMS_Okay\r
89     mov     bx, -1\r
90   }\r
91   getavailEMS_Okay:\r
92   __asm shl bx, 2\r
93   return _BX;\r
94 }\r
95 \r
96 int allocEMS(int pages) {\r
97   __asm {\r
98     mov     bx, pages\r
99     shr     bx, 2\r
100     mov     ah, 43h\r
101     int     67h\r
102     cmp     ah, 0\r
103     je      allocEMS_Okay\r
104     mov     dx, -1\r
105   }\r
106   allocEMS_Okay:\r
107   return _DX;\r
108 }\r
109 \r
110 #endif\r