📄 djgpp.c
字号:
/*
**===========================================================================
** DJGPP.C - define memory access routines for djgpp.
**---------------------------------------------------------------------------
** Copyright (c) 2000, 2001 Epson Research and Development, Inc.
** All Rights Reserved.
**===========================================================================
*/
#include <dpmi.h>
#include <sys/farptr.h>
#include "nonsefns.h"
unsigned short _selector;
#define INVALID_SELECTOR ((unsigned short)~0)
void _asmWriteDwords( DWORD destadr, DWORD value, DWORD length )
{
_farsetsel (_selector);
while (length--)
{
_farnspokel (destadr, value);
destadr += sizeof (long);
}
}
void _asmWriteWords( DWORD destadr, unsigned value, DWORD length )
{
_farsetsel (_selector);
while (length--)
{
_farnspokew (destadr, value);
destadr += sizeof (short);
}
}
void _asmWriteBytes( DWORD destadr, unsigned value, DWORD length )
{
_farsetsel (_selector);
while (length--)
_farnspokeb (destadr++, value);
}
/* do any initialization needed, return non-zero if error occurred */
unsigned _INITXLIB (void)
{
/* get a memory selector to address display and register locations */
_selector = __dpmi_allocate_ldt_descriptors (1);
return _selector == INVALID_SELECTOR;
}
/* do any cleanup needed before exiting to DOS */
void _DEINITXLIB (void)
{
if (_selector != INVALID_SELECTOR)
{
__dpmi_free_ldt_descriptor (_selector);
_selector = INVALID_SELECTOR;
}
}
/* map physical memory address and size to a linear address
* return non-zero if an error occurred
* for DJGPP, we also assign the base address and size of our selector
*/
unsigned long _MAPIOMEM(unsigned long physaddress, unsigned long size, unsigned long *linearaddress)
{
__dpmi_meminfo meminfo;
/* map physical address to DPMI linear address */
meminfo.address = physaddress;
meminfo.size = size - 1;
if (__dpmi_physical_address_mapping (&meminfo)) return ERR_FAILED;
/* assign base address and size of selector, as long as selector is valid */
if (_selector == INVALID_SELECTOR) return ERR_FAILED;
if (__dpmi_set_segment_base_address (_selector, meminfo.address)
|| __dpmi_set_segment_limit (_selector, meminfo.size))
return ERR_FAILED;
/* successful - set linear address */
*linearaddress = 0;
return ERR_OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -