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

📄 dyn_fpu_dh.h

📁 DOSBox emulates a full x86 pc with sound and dos. Its main use is to run old dosgames on platforms w
💻 H
📖 第 1 页 / 共 2 页
字号:
/* *  Copyright (C) 2002-2005  The DOSBox Team * *  This program is free software; you can redistribute it and/or modify *  it under the terms of the GNU General Public License as published by *  the Free Software Foundation; either version 2 of the License, or *  (at your option) any later version. * *  This program is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU General Public License for more details. * *  You should have received a copy of the GNU General Public License *  along with this program; if not, write to the Free Software *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *//* $Id: dyn_fpu_dh.h,v 1.2 2006/11/11 14:42:38 c2woody Exp $ */#include "dosbox.h"#if C_FPUstatic void FPU_FLD_16(PhysPt addr) {	dyn_dh_fpu.temp.m1 = (Bit32u)mem_readw_dyncorex86(addr);}static void FPU_FST_16(PhysPt addr) {	mem_writew_dyncorex86(addr,(Bit16u)dyn_dh_fpu.temp.m1);}static void FPU_FLD_32(PhysPt addr) {	dyn_dh_fpu.temp.m1 = mem_readd_dyncorex86(addr);}static void FPU_FST_32(PhysPt addr) {	mem_writed_dyncorex86(addr,dyn_dh_fpu.temp.m1);}static void FPU_FLD_64(PhysPt addr) {	dyn_dh_fpu.temp.m1 = mem_readd_dyncorex86(addr);	dyn_dh_fpu.temp.m2 = mem_readd_dyncorex86(addr+4);}static void FPU_FST_64(PhysPt addr) {	mem_writed_dyncorex86(addr,dyn_dh_fpu.temp.m1);	mem_writed_dyncorex86(addr+4,dyn_dh_fpu.temp.m2);}static void FPU_FLD_80(PhysPt addr) {	dyn_dh_fpu.temp.m1 = mem_readd_dyncorex86(addr);	dyn_dh_fpu.temp.m2 = mem_readd_dyncorex86(addr+4);	dyn_dh_fpu.temp.m3 = mem_readw_dyncorex86(addr+8);}static void FPU_FST_80(PhysPt addr) {	mem_writed_dyncorex86(addr,dyn_dh_fpu.temp.m1);	mem_writed_dyncorex86(addr+4,dyn_dh_fpu.temp.m2);	mem_writew_dyncorex86(addr+8,dyn_dh_fpu.temp.m3);}static void FPU_FLDCW_DH(PhysPt addr){	dyn_dh_fpu.cw = mem_readw(addr);	dyn_dh_fpu.temp.m1 = (Bit32u)(dyn_dh_fpu.cw|0x3f);}static void FPU_FNSTCW_DH(PhysPt addr){	mem_writew(addr,dyn_dh_fpu.cw);}static void FPU_FNINIT_DH(void){	dyn_dh_fpu.cw = 0x37f;}static void FPU_FSTENV_DH(PhysPt addr){	if(!cpu.code.big) {		mem_writew_dyncorex86(addr+0,(Bit16u)dyn_dh_fpu.cw);		mem_writew_dyncorex86(addr+2,(Bit16u)dyn_dh_fpu.temp.m2);		mem_writew_dyncorex86(addr+4,dyn_dh_fpu.temp.m3);	} else { 		mem_writed_dyncorex86(addr+0,dyn_dh_fpu.temp.m1);		mem_writew_dyncorex86(addr+0,(Bit16u)dyn_dh_fpu.cw);		mem_writed_dyncorex86(addr+4,dyn_dh_fpu.temp.m2);		mem_writed_dyncorex86(addr+8,dyn_dh_fpu.temp.m3);	}}static void FPU_FLDENV_DH(PhysPt addr){	if(!cpu.code.big) {		dyn_dh_fpu.cw = (Bit32u)mem_readw_dyncorex86(addr);		dyn_dh_fpu.temp.m1 = dyn_dh_fpu.cw|0x3f;		dyn_dh_fpu.temp.m2 = (Bit32u)mem_readw_dyncorex86(addr+2);		dyn_dh_fpu.temp.m3 = mem_readw_dyncorex86(addr+4);	} else { 		dyn_dh_fpu.cw = (Bit32u)mem_readw_dyncorex86(addr);		dyn_dh_fpu.temp.m1 = mem_readd_dyncorex86(addr)|0x3f;		dyn_dh_fpu.temp.m2 = mem_readd_dyncorex86(addr+4);		dyn_dh_fpu.temp.m3 = mem_readw_dyncorex86(addr+8);		dyn_dh_fpu.temp.d1 = mem_readw_dyncorex86(addr+10);	}}static void FPU_FSAVE_DH(PhysPt addr){	if (!cpu.code.big) {		mem_writew_dyncorex86(addr,(Bit16u)dyn_dh_fpu.cw);		addr+=2;		mem_writeb(addr++,dyn_dh_fpu.temp_state[0x04]);		mem_writeb(addr++,dyn_dh_fpu.temp_state[0x05]);		mem_writeb(addr++,dyn_dh_fpu.temp_state[0x08]);		mem_writeb(addr++,dyn_dh_fpu.temp_state[0x09]);		mem_writeb(addr++,dyn_dh_fpu.temp_state[0x0c]);		mem_writeb(addr++,dyn_dh_fpu.temp_state[0x0d]);		mem_writeb(addr++,dyn_dh_fpu.temp_state[0x10]);		mem_writeb(addr++,dyn_dh_fpu.temp_state[0x11]);		mem_writeb(addr++,dyn_dh_fpu.temp_state[0x14]);		mem_writeb(addr++,dyn_dh_fpu.temp_state[0x15]);		mem_writeb(addr++,dyn_dh_fpu.temp_state[0x18]);		mem_writeb(addr++,dyn_dh_fpu.temp_state[0x19]);		for(Bitu i=28;i<108;i++) mem_writeb(addr++,dyn_dh_fpu.temp_state[i]);	} else {		mem_writew_dyncorex86(addr,(Bit16u)dyn_dh_fpu.cw);		addr+=2;		for(Bitu i=2;i<108;i++) mem_writeb(addr++,dyn_dh_fpu.temp_state[i]);	}}static void FPU_FRSTOR_DH(PhysPt addr){	if (!cpu.code.big) {		dyn_dh_fpu.cw = (Bit32u)mem_readw_dyncorex86(addr);		dyn_dh_fpu.temp_state[0x00] = mem_readb(addr++)|0x3f;		dyn_dh_fpu.temp_state[0x01] = mem_readb(addr++);		dyn_dh_fpu.temp_state[0x04] = mem_readb(addr++);		dyn_dh_fpu.temp_state[0x05] = mem_readb(addr++);		dyn_dh_fpu.temp_state[0x08] = mem_readb(addr++);		dyn_dh_fpu.temp_state[0x09] = mem_readb(addr++);		dyn_dh_fpu.temp_state[0x0c] = mem_readb(addr++);		dyn_dh_fpu.temp_state[0x0d] = mem_readb(addr++);		dyn_dh_fpu.temp_state[0x10] = mem_readb(addr++);		dyn_dh_fpu.temp_state[0x11] = mem_readb(addr++);		dyn_dh_fpu.temp_state[0x14] = mem_readb(addr++);		dyn_dh_fpu.temp_state[0x15] = mem_readb(addr++);		dyn_dh_fpu.temp_state[0x18] = mem_readb(addr++);		dyn_dh_fpu.temp_state[0x19] = mem_readb(addr++);		for(Bitu i=28;i<108;i++) dyn_dh_fpu.temp_state[i] = mem_readb(addr++);	} else {		dyn_dh_fpu.cw = (Bit32u)mem_readw_dyncorex86(addr);		for(Bitu i=0;i<108;i++) dyn_dh_fpu.temp_state[i] = mem_readb(addr++);		dyn_dh_fpu.temp_state[0]|=0x3f;	}}static void dh_fpu_esc0(){	dyn_get_modrm(); 	if (decode.modrm.val >= 0xc0) {		cache_addb(0xd8);		cache_addb(decode.modrm.val);	} else { 		dyn_fill_ea();		gen_call_function((void*)&FPU_FLD_32,"%Ddr",DREG(EA)); 		cache_addb(0xd8);		cache_addb(0x05|(decode.modrm.reg<<3));		cache_addd((Bit32u)(&(dyn_dh_fpu.temp.m1)));	}}static void dh_fpu_esc1(){	dyn_get_modrm();  	if (decode.modrm.val >= 0xc0) {		cache_addb(0xd9);		cache_addb(decode.modrm.val);	} else {		Bitu group=(decode.modrm.val >> 3) & 7;		Bitu sub=(decode.modrm.val & 7);		dyn_fill_ea(); 		switch(group){		case 0x00: /* FLD float*/			gen_call_function((void*)&FPU_FLD_32,"%Ddr",DREG(EA));			cache_addb(0xd9);			cache_addb(0x05|(decode.modrm.reg<<3));			cache_addd((Bit32u)(&(dyn_dh_fpu.temp.m1)));			break;		case 0x01: /* UNKNOWN */			LOG(LOG_FPU,LOG_WARN)("ESC EA 1:Unhandled group %d subfunction %d",group,sub);			break;		case 0x02: /* FST float*/			cache_addb(0xd9);			cache_addb(0x05|(decode.modrm.reg<<3));			cache_addd((Bit32u)(&(dyn_dh_fpu.temp.m1)));			gen_call_function((void*)&FPU_FST_32,"%Ddr",DREG(EA));			break;		case 0x03: /* FSTP float*/			cache_addb(0xd9);			cache_addb(0x05|(decode.modrm.reg<<3));			cache_addd((Bit32u)(&(dyn_dh_fpu.temp.m1)));			gen_call_function((void*)&FPU_FST_32,"%Ddr",DREG(EA));			break;		case 0x04: /* FLDENV */			gen_call_function((void*)&FPU_FLDENV_DH,"%Ddr",DREG(EA));			cache_addb(0xd9);			cache_addb(0x05|(decode.modrm.reg<<3));			cache_addd((Bit32u)(&(dyn_dh_fpu.temp.m1)));			break;		case 0x05: /* FLDCW */			gen_call_function((void *)&FPU_FLDCW_DH,"%Ddr",DREG(EA));			cache_addb(0xd9);			cache_addb(0x05|(decode.modrm.reg<<3));			cache_addd((Bit32u)(&(dyn_dh_fpu.temp.m1)));			break;		case 0x06: /* FSTENV */			cache_addb(0xd9);			cache_addb(0x05|(decode.modrm.reg<<3));			cache_addd((Bit32u)(&(dyn_dh_fpu.temp.m1)));			gen_call_function((void*)&FPU_FSTENV_DH,"%Ddr",DREG(EA));			break;		case 0x07:  /* FNSTCW*/			gen_call_function((void*)&FPU_FNSTCW_DH,"%Ddr",DREG(EA));			break;		default:			LOG(LOG_FPU,LOG_WARN)("ESC EA 1:Unhandled group %d subfunction %d",group,sub);			break;		}	}}static void dh_fpu_esc2(){	dyn_get_modrm();  	if (decode.modrm.val >= 0xc0) { 		cache_addb(0xda);		cache_addb(decode.modrm.val);	} else {		dyn_fill_ea(); 		gen_call_function((void*)&FPU_FLD_32,"%Ddr",DREG(EA)); 		cache_addb(0xda);		cache_addb(0x05|(decode.modrm.reg<<3));		cache_addd((Bit32u)(&(dyn_dh_fpu.temp.m1)));	}}static void dh_fpu_esc3(){	dyn_get_modrm();  	if (decode.modrm.val >= 0xc0) { 		Bitu group=(decode.modrm.val >> 3) & 7;		Bitu sub=(decode.modrm.val & 7);		switch (group) {		case 0x04:			switch (sub) {			case 0x00:				//FNENI			case 0x01:				//FNDIS

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -