コード例 #1
0
ファイル: callbacks.c プロジェクト: andrewbird/dosemu2
static void mouse_callback(struct sigcontext *scp,
		    const struct RealModeCallStructure *rmreg,
		    int is_32, void *arg)
{
    void *sp = SEL_ADR_CLNT(_ss, _esp, is_32);
    struct pmaddr_s *mouseCallBack = arg;

    if (!ValidAndUsedSelector(mouseCallBack->selector)) {
	D_printf("MSDOS: ERROR: mouse callback to unused segment\n");
	return;
    }
    D_printf("MSDOS: starting mouse callback\n");

    if (is_32) {
	unsigned int *ssp = sp;
	*--ssp = _cs;
	*--ssp = _eip;
	_esp -= 8;
    } else {
	unsigned short *ssp = sp;
	*--ssp = _cs;
	*--ssp = _LWORD(eip);
	_LWORD(esp) -= 4;
    }

    rm_to_pm_regs(scp, rmreg, ~(1 << ebp_INDEX));
    _ds = ConvertSegmentToDescriptor(RMREG(ds));
    _cs = mouseCallBack->selector;
    _eip = mouseCallBack->offset;
}
コード例 #2
0
ファイル: callbacks.c プロジェクト: andrewbird/dosemu2
void msdos_api_winos2_call(struct sigcontext *scp, void *arg)
{
    u_short *ldt_alias_winos2 = arg;

    D_printf("MSDOS: WINOS2 extension API call: 0x%04x\n", _LWORD(eax));
    if (_LWORD(eax) == 0x0100) {
	u_short sel = *ldt_alias_winos2;
	if (sel) {
	    _eax = sel;
	    _eflags &= ~CF;
	} else {
	    _eflags |= CF;
	}
    } else {
	_eflags |= CF;
    }
}
コード例 #3
0
ファイル: callbacks.c プロジェクト: andrewbird/dosemu2
static void ps2_mouse_callback(struct sigcontext *scp,
			const struct RealModeCallStructure *rmreg,
			int is_32, void *arg)
{
    unsigned short *rm_ssp;
    void *sp = SEL_ADR_CLNT(_ss, _esp, is_32);
    struct pmaddr_s *PS2mouseCallBack = arg;

    if (!ValidAndUsedSelector(PS2mouseCallBack->selector)) {
	D_printf("MSDOS: ERROR: PS2 mouse callback to unused segment\n");
	return;
    }
    D_printf("MSDOS: starting PS2 mouse callback\n");

    rm_ssp = MK_FP32(RMREG(ss), RMREG(sp) + 4 + 8);
    if (is_32) {
	unsigned int *ssp = sp;
	*--ssp = *--rm_ssp;
	D_printf("data: 0x%x ", *ssp);
	*--ssp = *--rm_ssp;
	D_printf("0x%x ", *ssp);
	*--ssp = *--rm_ssp;
	D_printf("0x%x ", *ssp);
	*--ssp = *--rm_ssp;
	D_printf("0x%x\n", *ssp);
	*--ssp = _cs;
	*--ssp = _eip;
	_esp -= 24;
    } else {
	unsigned short *ssp = sp;
	*--ssp = *--rm_ssp;
	D_printf("data: 0x%x ", *ssp);
	*--ssp = *--rm_ssp;
	D_printf("0x%x ", *ssp);
	*--ssp = *--rm_ssp;
	D_printf("0x%x ", *ssp);
	*--ssp = *--rm_ssp;
	D_printf("0x%x\n", *ssp);
	*--ssp = _cs;
	*--ssp = _LWORD(eip);
	_LWORD(esp) -= 12;
    }

    _cs = PS2mouseCallBack->selector;
    _eip = PS2mouseCallBack->offset;
}
コード例 #4
0
ファイル: callbacks.c プロジェクト: andrewbird/dosemu2
static void rmcb_ret_from_ps2(struct sigcontext *scp,
		       struct RealModeCallStructure *rmreg, int is_32)
{
    if (is_32)
	_esp += 16;
    else
	_LWORD(esp) += 8;
    do_retf(rmreg, (1 << ss_INDEX) | (1 << esp_INDEX));
}
コード例 #5
0
ファイル: cpu-emu.c プロジェクト: stuaxo/dosemu2
char *e_print_scp_regs(struct sigcontext_struct *scp, int pmode)
{
	static char buf[300];
	char *p = buf;
	char *q = eregbuf;
	unsigned short *stk;
	int i;

	while (*q) *p++ = *q++; *p=0;
	exprintl(_rax,buf,(ERB_L1+ERB_LEFTM));
	exprintl(_rbx,buf,(ERB_L1+ERB_LEFTM)+13);
	exprintl(_rcx,buf,(ERB_L1+ERB_LEFTM)+26);
	exprintl(_rdx,buf,(ERB_L1+ERB_LEFTM)+39);
	exprintl(_rsi,buf,(ERB_L2+ERB_LEFTM));
	exprintl(_rdi,buf,(ERB_L2+ERB_LEFTM)+13);
	exprintl(_rbp,buf,(ERB_L2+ERB_LEFTM)+26);
	exprintl(_rsp,buf,(ERB_L2+ERB_LEFTM)+39);
	if (pmode & 1)
		exprintl(get_vFLAGS(TheCPU.eflags),buf,(ERB_L3+ERB_LEFTM));
	else
		exprintl(TheCPU.veflags,buf,(ERB_L3+ERB_LEFTM));
	exprintw(_cs,buf,(ERB_L3+ERB_LEFTM)+13);
	exprintw(_ds,buf,(ERB_L3+ERB_LEFTM)+26);
	exprintw(_es,buf,(ERB_L3+ERB_LEFTM)+39);
	exprintw(_fs,buf,(ERB_L4+ERB_LEFTM));
	exprintw(_gs,buf,(ERB_L4+ERB_LEFTM)+13);
	exprintw(_ss,buf,(ERB_L4+ERB_LEFTM)+26);
	exprintl(_eflags,buf,(ERB_L4+ERB_LEFTM)+39);
	if (pmode & 2) {
		buf[(ERB_L4+ERB_LEFTM)+47] = 0;
	}
	else {
	    if (pmode & 1) {
	        if (Segments[_ss>>3].is_32)
		    stk = (unsigned short *)(GetSegmentBaseAddress(_ss)+_esp);
	        else
		    stk = (unsigned short *)(GetSegmentBaseAddress(_ss)+_LWORD(esp));
	    }
	    else
コード例 #6
0
ファイル: callbacks.c プロジェクト: andrewbird/dosemu2
static void pm_to_rm_regs(const struct sigcontext *scp,
			  struct RealModeCallStructure *rmreg,
			  unsigned int mask)
{
  if (mask & (1 << eflags_INDEX))
    RMREG(flags) = _eflags;
  if (mask & (1 << eax_INDEX))
    X_RMREG(ax) = _LWORD(eax);
  if (mask & (1 << ebx_INDEX))
    X_RMREG(bx) = _LWORD(ebx);
  if (mask & (1 << ecx_INDEX))
    X_RMREG(cx) = _LWORD(ecx);
  if (mask & (1 << edx_INDEX))
    X_RMREG(dx) = _LWORD(edx);
  if (mask & (1 << esi_INDEX))
    X_RMREG(si) = _LWORD(esi);
  if (mask & (1 << edi_INDEX))
    X_RMREG(di) = _LWORD(edi);
  if (mask & (1 << ebp_INDEX))
    X_RMREG(bp) = _LWORD(ebp);
}
コード例 #7
0
ファイル: callbacks.c プロジェクト: andrewbird/dosemu2
void rm_to_pm_regs(struct sigcontext *scp,
			  const struct RealModeCallStructure *rmreg,
			  unsigned int mask)
{
    /* WARNING - realmode flags can contain the dreadful NT flag
     * if we don't use safety masks. */
    if (mask & (1 << eflags_INDEX))
	_eflags = 0x0202 | (0x0dd5 & RMREG(flags));
    if (mask & (1 << eax_INDEX))
	_LWORD(eax) = RMLWORD(ax);
    if (mask & (1 << ebx_INDEX))
	_LWORD(ebx) = RMLWORD(bx);
    if (mask & (1 << ecx_INDEX))
	_LWORD(ecx) = RMLWORD(cx);
    if (mask & (1 << edx_INDEX))
	_LWORD(edx) = RMLWORD(dx);
    if (mask & (1 << esi_INDEX))
	_LWORD(esi) = RMLWORD(si);
    if (mask & (1 << edi_INDEX))
	_LWORD(edi) = RMLWORD(di);
    if (mask & (1 << ebp_INDEX))
	_LWORD(ebp) = RMLWORD(bp);
}
コード例 #8
0
ファイル: cpu-emu.c プロジェクト: stuaxo/dosemu2
	exprintw(_fs,buf,(ERB_L4+ERB_LEFTM));
	exprintw(_gs,buf,(ERB_L4+ERB_LEFTM)+13);
	exprintw(_ss,buf,(ERB_L4+ERB_LEFTM)+26);
	exprintl(_eflags,buf,(ERB_L4+ERB_LEFTM)+39);
	if (pmode & 2) {
		buf[(ERB_L4+ERB_LEFTM)+47] = 0;
	}
	else {
	    if (pmode & 1) {
	        if (Segments[_ss>>3].is_32)
		    stk = (unsigned short *)(GetSegmentBaseAddress(_ss)+_esp);
	        else
		    stk = (unsigned short *)(GetSegmentBaseAddress(_ss)+_LWORD(esp));
	    }
	    else
		stk = MK_FP32(_ss,_LWORD(esp));
	    for (i=(ERB_L5+ERB_LEFTM); i<(ERB_L6-2); i+=5) {
		exprintw(*stk++,buf,i);
	    }
	}
	return buf;
}


char *e_emu_disasm(unsigned char *org, int is32, unsigned int refseg)
{
   static char buf[512];
   static char frmtbuf[256];
   int rc;
   int i;
   char *p, *p1;