|
|
1.1 root 1: /* This example illustrates the use of the following 286DOS functions:
2: * DOSSUBSET, DOSSUBALLOC, DOSSUBFREE
3: *
4: * This example allocates a segment <A>, and initialises it for
5: * suballocation. It suballocates a block <B> from <A>, and writes
6: * some value into a word in the block <B>. It then grows segment
7: * <A>, and notifies the suballocator of the new size. It checks
8: * that the value written into block <B> is still there, frees block
9: * <B>, frees segment <A>, and terminates.
10: *
11: * This example program is intended to illustrate the possible functions
12: * rather than do anything useful. It can run as a Family API program.
13: *
14: * Compile as: cl -AL -G0 -Lp suballoc.c
15: *
16: * Copyright (C) Microsoft Corp. 1986
17: */
18:
19: #include <doscalls.h> /* CP/DOS function declarations */
20: #include <dos.h> /* FP_OFF and FP_SEG macros */
21:
22: /* definitions used in DOSALLOCSEG call */
23: #define SIZEA 16000 /* bytes to allocate */
24: #define PRIVATE 0 /* segment will not be shared */
25:
26: /* definitions used in DOSSUBSET call */
27: #define INIT 1 /* initialise size of subset in a segment*/
28: #define INCRSIZE 0 /* increase size of subset in a segment */
29:
30: #define SUBSIZEA 10000 /* size to suballocate */
31: #define SIZER 40000 /* size to reallocate */
32: #define BLKSIZE 100 /* size of block within the subset */
33: #define SUBSIZEB 20000 /* size to suballocate after realloc */
34: #define VALUEA 5 /* value to write to first word in block */
35:
36: main ()
37: {
38: unsigned Selector, /* selector for segment allocated */
39: BlockOffset, /* offset to block in segment subset */
40: *addr; /*32 bit address to a word in segment*/
41:
42: DOSALLOCSEG (SIZEA, &Selector, PRIVATE); /* allocate a segment */
43:
44: /* subset the segment to size SUBSIZEA ( must be =< SIZEA ) */
45: DOSSUBSET (Selector, INIT, SUBSIZEA);
46:
47: DOSSUBALLOC(Selector, &BlockOffset, BLKSIZE); /* suballocate block B */
48:
49: /* write VALUEA in to first word in block B of the subset */
50: FP_SEG(addr) = Selector;
51: FP_OFF(addr) = BlockOffset;
52: *addr = VALUEA;
53:
54: DOSREALLOCSEG (SIZER, Selector); /* grow the segment to size SIZER */
55:
56: /* subset the segment to size SUBSIZEB where,
57: * (SUBSIZEB > SUBSIZEA) and (SUBSIZEB =< SIZER) */
58: DOSSUBSET(Selector, INCRSIZE, SUBSIZEB);
59:
60: /* first word in block B should still contain VALUEA */
61: if (*addr != VALUEA)
62: printf ("*** error: unexpected value in suballocated block ***\n");
63:
64: DOSSUBFREE (Selector, BlockOffset, BLKSIZE); /* free block B */
65:
66: DOSFREESEG (Selector); /* free the segment */
67: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.