📄 ems.h
字号:
#ifndef TOTEM_EMS
#define TOTEM_EMS
char EMS=0;
char test_ems()
{ int i;
union REGS inregs,outregs;
struct SREGS segs;
struct DeviceHeader {
struct DeviceHeader far *link;
unsigned attributes;
unsigned strategy_offset;
unsigned interrupt_offset;
char name_of_number_of_units[8];
} far *dev;
unsigned char major,minor,c[13];
inregs.x.ax=0x3001;
intdos(&inregs,&outregs);
major=outregs.h.al;
minor=outregs.h.ah;
if (major<2) return(0);
else
{
inregs.h.ah=0x52;
intdosx(&inregs,&outregs,&segs);
if (major==2)
dev=(struct DeviceHeader far *)MK_FP(segs.es+1,outregs.x.bx+7);
else
if ((major==3) && (minor==0))
dev=(struct DeviceHeader far *)MK_FP(segs.es+2,outregs.x.bx+8);
else
dev=(struct DeviceHeader far *)MK_FP(segs.es+2,outregs.x.bx+2);
c[8]=NULL;
while (FP_OFF(dev)!=0xffff)
{
if (dev->attributes & 0x8000)
{
for (i=0;i<8;i++)
c[i]=dev->name_of_number_of_units[i];
}
if (!strcmp(c,"EMMXXXX0"))
{
EMS=1;
return(1);
}
dev=dev->link;
}
}
return(0);
}
char get_EMS_status()
{
char tmp=0xff;
if (EMS)
{
asm {
mov ah,0x40
int 0x67
mov tmp,ah
}
}
return(tmp);
}
char get_page_frame_segment(unsigned *segment)
{
char tmp=0xff;
if (EMS)
{
asm {
mov ah,0x41
int 0x67
mov tmp,ah
}
*segment=_BX;
}
return(tmp);
}
char get_number_of_pages(unsigned *avail,unsigned *total)
{
char tmp=0xff;
if (EMS)
{
asm {
mov ah,0x42
int 0x67
mov tmp,ah
}
*avail=_BX;
*total=_DX;
}
return(tmp);
}
char allocate_memory(unsigned *handle,unsigned page_numbers)
{
char tmp=0xff;
if (EMS)
{
asm {
mov ah,0x43
mov bx,page_numbers
int 0x67
mov tmp,ah
}
*handle=_DX;
}
return(tmp);
}
char map_memory(char physical_page,unsigned logical_page,unsigned handle)
{
char tmp=0xff;
if (EMS)
{
asm {
mov ah,0x44
mov al,physical_page
mov bx,logical_page
mov dx,handle
int 0x67
mov tmp,ah
}
}
return(tmp);
}
char release_memory(unsigned handle)
{
char tmp=0xff;
if (EMS)
{
asm {
mov ah,0x45
mov dx,handle
int 0x67
mov tmp,ah
}
}
return(tmp);
}
char get_EMM_version(unsigned char *version)
{
char tmp=0xff;
if (EMS)
{
asm {
mov ah,0x46
int 0x67
mov tmp,ah
}
*version=_AL;
}
return(tmp);
}
char save_mapping_context(unsigned handle)
{
char tmp=0xff;
if (EMS)
{
asm {
mov ah,0x47
mov dx,handle
int 0x67
mov tmp,ah
}
}
return(tmp);
}
char restore_mapping_context(unsigned handle)
{
char tmp=0xff;
if (EMS)
{
asm {
mov ah,0x48
mov dx,handle
int 0x67
mov tmp,ah
}
}
return(tmp);
}
char get_number_of_EMM_handles(unsigned *handle_numbers)
{
char tmp=0xff;
if (EMS)
{
asm {
mov ah,0x4b
int 0x67
mov tmp,ah
}
*handle_numbers=_BX;
}
return(tmp);
}
char get_pages_owned_by_handle(unsigned handle,unsigned *page_numbers)
{
char tmp=0xff;
if (EMS)
{
asm {
mov ah,0x4c
mov dx,handle
int 0x67
mov tmp,ah
}
*page_numbers=_BX;
}
return(tmp);
}
char get_pages_for_all_handles(unsigned char *buffer,unsigned *handle_numbers)
{
char tmp=0xff;
if (EMS)
{
unsigned bseg=FP_SEG(buffer),boff=FP_OFF(buffer);
asm {
mov ah,0x4d
mov di,boff
mov es,bseg
int 0x67
mov tmp,ah
}
*handle_numbers=_BX;
}
return(tmp);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -