From: "Michael Stewart" Newsgroups: comp.os.msdos.djgpp Subject: Selector code Date: Wed, 16 Jun 1999 10:26:07 +0100 Organization: (Posted via) Netcom Internet Ltd. Lines: 45 Message-ID: <7k7qc5$pc2$1@taliesin.netcom.net.uk> NNTP-Posting-Host: hgty.capgemini.co.uk X-Trace: taliesin.netcom.net.uk 929524933 25986 194.42.240.2 (16 Jun 1999 09:22:13 GMT) X-Complaints-To: abuse AT corp DOT netcom DOT net DOT uk NNTP-Posting-Date: 16 Jun 1999 09:22:13 GMT X-Newsreader: Microsoft Outlook Express 4.72.3155.0 X-MimeOLE: Produced By Microsoft MimeOLE V4.72.3155.0 To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Reply-To: djgpp AT delorie DOT com I would like to get people opinions on this bit of code, whether it is useful/pointless, could be improved or any errors in it. I have only been able to test it with the video memory and it works, I'll be testing it a bit more thoroughly as soon as I get chance. It creates a selector, given the location and size. So if you wanted a descriptor which spanned the VGA memory (0xa0000, 64000 bytes) you would call it like so. if (make_ds (video_ds, 0xa0000, 64000)) return -1; /* Error making descriptor */ And to use it /* Plot a pixel (col 15) in the top left corner of the screen (in mode 0x13 etc) */ _farpokeb (video_ds, 0, 15); /* Plot a pixel (col 15) in the bottom right corner of the screen (in mode 0x13 etc) */ _farpokeb (video_ds, 63999, 15); int make_ds (int &ds, int base, int limit) { static char ds_data[8]; limit--; ds_data[0] = limit & 0xff; ds_data[1] = limit >> 8 & 0xff; ds_data[2] = base & 0xff; ds_data[3] = base >> 8 & 0xff; ds_data[4] = base >> 16 & 0xff; ds_data[5] = 0xf3; ds_data[6] = limit >> 16 & 0x0f + 0x40; ds_data[7] = 0x00; ds = __dpmi_allocate_ldt_descriptors (1); return __dpmi_set_descriptor (ds, ds_data); } Based on code in the FAQ and code posted here by Bonifati Even more credit must go to Eli Zaretskii for letting me know how much better this method is over using _dos_ds (in short: more memory protection)