📄 dosmem.h
字号:
/**********************************
* Dos(Real Mode) Memory Class
**********************************/
class DOS_MEM {
protected:
DWORD address;
DWORD length;
int selector;
public:
DOS_MEM(DWORD length_in_bytes) {
AllocateMem(length_in_bytes);
}
~DOS_MEM(void) {
if (length != 0)
__dpmi_free_dos_memory(selector);
}
void AllocateMem(DWORD length_in_bytes) {
int vbe_info;
length = (length_in_bytes + 15) & 0xFFFF0; // Round to nearest 16 bytes
if ((vbe_info = __dpmi_allocate_dos_memory(length/16, &selector)) == -1) {
printf( "ERROR allocating DOS memory\n" );
exit(10);
}
address = ((vbe_info << 4) & 0xffff0) + ((vbe_info >> 16) & 0xffff);
}
int GetOffset(void) {
return address & 0xF;
}
int GetSegment(void) {
return (address >> 4);
}
DWORD GetAddress(void) {
return address;
}
DWORD GetLength(void) { // Return The Length of memory
return length;
}
DWORD GetDWORD(DWORD offset) {
return _farpeekl(selector, offset);
}
WORD GetWORD(DWORD offset) {
return _farpeekw(selector, offset);
}
BYTE GetBYTE(DWORD offset) {
return _farpeekb(selector, offset);
}
void SetDWORD(DWORD value, DWORD offset) {
_farpokel(selector, offset, value);
}
void SetWORD(WORD value, DWORD offset) {
_farpokew(selector, offset, value);
}
void SetBYTE(BYTE value, DWORD offset) {
_farpokeb(selector, offset, value);
}
/******************************************************************
* Copy data into DOS memory at offset for length from addr
* addr - address of memory to copy from.
* offset - Where to begin within virtual memory (in bytes).
* length - Number of bytes to Copy (in bytes).
******************************************************************/
void CopyFrom(DWORD addr, DWORD length_in_bytes, DWORD offset) {
int i;
if (offset < 0) offset = 0;
if (length_in_bytes < 0 ||
length_in_bytes > length ||
offset + length_in_bytes > length)
length_in_bytes = length - offset;
if (length_in_bytes > 0)
movedata(_my_ds(), (unsigned)addr, selector, (unsigned)offset, length_in_bytes);
}
/**********************************************************************
* Copy data from DOS memory at offset for length into addr
* addr - address of memory to copy into.
* offset - Where to begin within virtual memory (in bytes).
* length - Number of bytes to Copy (in bytes).
*********************************************************************/
void CopyTo(DWORD addr, DWORD length_in_bytes, DWORD offset) {
int i;
if (offset < 0) offset = 0;
if (length_in_bytes < 0 ||
length_in_bytes > length ||
offset + length_in_bytes > length)
length_in_bytes = length - offset;
if (length_in_bytes > 0)
movedata(selector, (unsigned)offset, _my_ds(), (unsigned)addr, length_in_bytes);
}
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -