⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 djgpp.c

📁 epson公司的一个关于s1d13706的低层驱动程序
💻 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 + -