1
0
Fork 0

New IO Functions

Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@1380
This commit is contained in:
Sjoerd van der Berg 2003-10-27 13:19:19 +00:00
parent 45c1f1c663
commit 9f6a6bc5cf
6 changed files with 168 additions and 124 deletions

View file

@ -138,6 +138,19 @@
}
}
break;
CASE_0F_B(0x21) /* MOV Rd,DRx */
{
GetRM;
Bitu which=(rm >> 3) & 7;
LOG_MSG("MOV REG,DR%d",which);
if (rm >= 0xc0 ) {
GetEArd;
} else {
GetEAa;
LOG(LOG_CPU,LOG_ERROR)("MOV XXX,DR% with non-register",which);
}
}
break;
CASE_0F_B(0x22) /* MOV CRx,Rd */
{
GetRM;
@ -155,6 +168,7 @@
{
GetRM;
Bitu which=(rm >> 3) & 7;
LOG_MSG("MOV DR%d,REG",which);
if (rm >= 0xc0 ) {
GetEArd;
} else {

View file

@ -513,23 +513,11 @@
CASE_D(0xd3) /* GRP2 Ed,CL */
GRP2D(reg_cl);break;
CASE_D(0xe5) /* IN EAX,Ib */
{
Bit16u port=Fetchb();
reg_eax=IO_Read(port) |
(IO_Read(port+1) << 8 ) |
(IO_Read(port+2) << 16 ) |
(IO_Read(port+3) << 24 );
break;
}
reg_eax=IO_ReadD(Fetchb());
break;
CASE_D(0xe7) /* OUT Ib,EAX */
{
Bit16u port=Fetchb();
IO_Write(port+0,(Bit8u)(reg_eax >> 0));
IO_Write(port+1,(Bit8u)(reg_eax >> 8));
IO_Write(port+2,(Bit8u)(reg_eax >> 16));
IO_Write(port+3,(Bit8u)(reg_eax >> 24));
break;
}
IO_WriteD(Fetchb(),reg_eax);
break;
CASE_D(0xe8) /* CALL Jd */
{
Bit32s newip=Fetchds();
@ -553,16 +541,10 @@
break;
}
CASE_D(0xed) /* IN EAX,DX */
reg_eax=IO_Read(reg_dx) |
(IO_Read(reg_dx+1) << 8) |
(IO_Read(reg_dx+2) << 16) |
(IO_Read(reg_dx+3) << 24);
reg_eax=IO_ReadD(reg_dx);
break;
CASE_D(0xef) /* OUT DX,EAX */
IO_Write(reg_dx,(Bit8u)(reg_eax>>0));
IO_Write(reg_dx+1,(Bit8u)(reg_eax>>8));
IO_Write(reg_dx+2,(Bit8u)(reg_eax>>16));
IO_Write(reg_dx+3,(Bit8u)(reg_eax>>24));
IO_WriteD(reg_dx,reg_eax);
break;
CASE_D(0xf7) /* GRP3 Ed(,Id) */
{

View file

@ -901,31 +901,17 @@
break;
}
CASE_B(0xe4) /* IN AL,Ib */
{
Bit16u port=Fetchb();
reg_al=IO_Read(port);
break;
}
reg_al=IO_ReadB(Fetchb());
break;
CASE_W(0xe5) /* IN AX,Ib */
{
Bit16u port=Fetchb();
reg_al=IO_Read(port);
reg_ah=IO_Read(port+1);
break;
}
reg_ax=IO_ReadW(Fetchb());
break;
CASE_B(0xe6) /* OUT Ib,AL */
{
Bit16u port=Fetchb();
IO_Write(port,reg_al);
break;
}
IO_WriteB(Fetchb(),reg_al);
break;
CASE_W(0xe7) /* OUT Ib,AX */
{
Bit16u port=Fetchb();
IO_Write(port,reg_al);
IO_Write(port+1,reg_ah);
break;
}
IO_WriteW(Fetchb(),reg_ax);
break;
CASE_W(0xe8) /* CALL Jw */
{
Bit16s newip=Fetchws();
@ -956,9 +942,9 @@
reg_al=IO_Read(reg_dx);reg_ah=IO_Read(reg_dx+1);
break;
CASE_B(0xee) /* OUT DX,AL */
IO_Write(reg_dx,reg_al);break;
IO_WriteB(reg_dx,reg_al);break;
CASE_W(0xef) /* OUT DX,AX */
IO_Write(reg_dx,reg_al);IO_Write(reg_dx+1,reg_ah);break;
IO_WriteW(reg_dx,reg_ax);break;
CASE_B(0xf0) /* LOCK */
LOG(LOG_CPU,LOG_NORMAL)("CPU:LOCK");
break;

View file

@ -50,39 +50,34 @@ static void DoString(STRING_OP type) {
if (count) switch (type) {
case R_OUTSB:
for (;count>0;count--) {
IO_Write(reg_dx,LoadMb(si_base+si_index));
IO_WriteB(reg_dx,LoadMb(si_base+si_index));
si_index=(si_index+add_index) & add_mask;
}
break;
case R_OUTSW:
add_index<<=1;
for (;count>0;count--) {
IO_Write(reg_dx,LoadMb(si_base+si_index));
IO_Write(reg_dx+1,LoadMb(si_base+si_index+1));
IO_WriteW(reg_dx,LoadMw(si_base+si_index));
si_index=(si_index+add_index) & add_mask;
}
break;
case R_OUTSD:
add_index<<=2;
for (;count>0;count--) {
IO_Write(reg_dx,LoadMb(si_base+si_index));
IO_Write(reg_dx+1,LoadMb(si_base+si_index+1));
IO_Write(reg_dx+2,LoadMb(si_base+si_index+2));
IO_Write(reg_dx+3,LoadMb(si_base+si_index+3));
IO_WriteD(reg_dx,LoadMd(si_base+si_index));
si_index=(si_index+add_index) & add_mask;
}
break;
case R_INSB:
for (;count>0;count--) {
SaveMb(di_base+di_index,IO_Read(reg_dx));
SaveMb(di_base+di_index,IO_ReadB(reg_dx));
di_index=(di_index+add_index) & add_mask;
}
break;
case R_INSW:
add_index<<=1;
for (;count>0;count--) {
SaveMb(di_base+di_index,IO_Read(reg_dx));
SaveMb(di_base+di_index+1,IO_Read(reg_dx+1));
SaveMw(di_base+di_index,IO_ReadW(reg_dx));
di_index=(di_index+add_index) & add_mask;
}
break;