RTL8029AS now works properly (patch from TheCollector1995 with some modifications by me);

SVGA emulation now has partial support for 12x24 text mode used by 48k HECON.SYS;
LEA AX,DX now once again issues #UD on 286+ like it should;
FF /7 is now correctly an alias of FF /6 on 8080x;
Hard disk configuration dialog now uses Segoe UI 9pt font instead of MS Sans Serif 8pt;
Removed excess logging from serial mouse and x86seg.c;
Applied mainline PCem PIT MSW1 fix commit;
IMG-based floppy emulation now takes GAP4 and post-sector delays into account;
Comemnted out emulation of non-Overdrive Pentium II's.
This commit is contained in:
OBattler
2016-08-13 03:32:38 +02:00
parent bad439278d
commit 91075fb627
17 changed files with 1357 additions and 848 deletions

View File

@@ -1018,6 +1018,7 @@ OpFn OP_TABLE(pentiumpro_0f)[1024] =
/*f0*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL,
};
#if 0
OpFn OP_TABLE(pentium2_0f)[1024] =
{
/*16-bit data, 16-bit addr*/
@@ -1108,6 +1109,7 @@ OpFn OP_TABLE(pentium2_0f)[1024] =
/*e0*/ ILLEGAL, opPSRAW_a32, opPSRAD_a32, ILLEGAL, ILLEGAL, opPMULHW_a32, ILLEGAL, ILLEGAL, opPSUBSB_a32, opPSUBSW_a32, NULL, opPOR_a32, opPADDSB_a32, opPADDSW_a32, NULL, opPXOR_a32,
/*f0*/ ILLEGAL, opPSLLW_a32, opPSLLD_a32, opPSLLQ_a32, ILLEGAL, opPMADDWD_a32, ILLEGAL, ILLEGAL, opPSUBB_a32, opPSUBW_a32, opPSUBD_a32, ILLEGAL, opPADDB_a32, opPADDW_a32, opPADDD_a32, ILLEGAL,
};
#endif
OpFn OP_TABLE(pentium2d_0f)[1024] =
{

View File

@@ -3404,6 +3404,7 @@ void execx86(int cycs)
FETCHCLEAR();
break;
case 0x30: /*PUSH w*/
case 0x38: /*PUSH w alias, reported by reenigne*/
tempw=geteaw();
// if (output) printf("PUSH %04X %i %02X %04X %04X %02X %02X\n",tempw,rm,rmdat,easeg,eaaddr,ram[0x22340+0x5638],ram[0x22340+0x5639]);
if (ssegs) ss=oldss;

View File

@@ -524,6 +524,7 @@ CPU cpus_PentiumPro[] =
{"", -1, 0, 0, 0}
};
#if 0
CPU cpus_Pentium2[] =
{
/*Intel Pentium II Klamath*/
@@ -548,6 +549,7 @@ CPU cpus_Pentium2D[] =
{"Pentium II D 500", CPU_PENTIUM2D, 33, 500000000, 5, 50000000, 0x654, 0x654, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC},
{"", -1, 0, 0, 0}
};
#endif
void cpu_set_edx()
{
@@ -1357,7 +1359,8 @@ void cpu_set()
codegen_timing_set(&codegen_timing_686);
break;
case CPU_PENTIUM2:
#if 0
case CPU_PENTIUM2:
x86_setopcodes(ops_386, ops_pentium2_0f, dynarec_ops_386, dynarec_ops_pentium2_0f);
x86_dynarec_opcodes_da_a16 = dynarec_ops_fpu_686_da_a16;
x86_dynarec_opcodes_da_a32 = dynarec_ops_fpu_686_da_a32;
@@ -1388,6 +1391,7 @@ void cpu_set()
cpu_CR4_mask = CR4_TSD | CR4_DE | CR4_MCE | CR4_PCE;
codegen_timing_set(&codegen_timing_686);
break;
#endif
case CPU_PENTIUM2D:
x86_setopcodes(ops_386, ops_pentium2d_0f, dynarec_ops_386, dynarec_ops_pentium2d_0f);
@@ -1778,7 +1782,7 @@ void cpu_CPUID()
EAX = 0;
break;
case CPU_PENTIUM2:
/* case CPU_PENTIUM2:
if (!EAX)
{
EAX = 0x00000002;
@@ -1802,7 +1806,7 @@ void cpu_CPUID()
}
else
EAX = 0;
break;
break; */
case CPU_PENTIUM2D:
if (!EAX)
@@ -1926,7 +1930,7 @@ void cpu_RDMSR()
break;
case CPU_PENTIUMPRO:
case CPU_PENTIUM2:
// case CPU_PENTIUM2:
case CPU_PENTIUM2D:
EAX = EDX = 0;
// pclog("RDMSR, ECX=%08X\n", ECX);
@@ -2119,7 +2123,7 @@ void cpu_WRMSR()
break;
case CPU_PENTIUMPRO:
case CPU_PENTIUM2:
// case CPU_PENTIUM2:
case CPU_PENTIUM2D:
// pclog("WRMSR, ECX=%08X\n", ECX);
switch (ECX)

View File

@@ -40,8 +40,10 @@ extern int cpu, cpu_manufacturer;
/*686 class CPUs*/
#define CPU_PENTIUMPRO 25
/*
#define CPU_PENTIUM2 26
#define CPU_PENTIUM2D 27
#define CPU_PENTIUM2D 27 */
#define CPU_PENTIUM2D 26
#define MANU_INTEL 0
#define MANU_AMD 1

View File

@@ -501,7 +501,7 @@ void disc_sector_poll()
disc_sector_n[drive] != s->n ||
(fdc_get_bitcell_period() != get_bitcell_period(drive)) ||
!fdd_can_read_medium(drive ^ fdd_swap) ||
disc_intersector_delay[drive] || disc_track_delay[drive])
disc_intersector_delay[drive] || disc_postdata_delay[drive] || disc_track_delay[drive] || disc_gap4_delay[drive])
{
advance_byte();
break;
@@ -529,7 +529,7 @@ void disc_sector_poll()
break;
}
if (cur_byte[drive] || !index_count[drive] || fdc_get_bitcell_period() != get_bitcell_period(drive) ||
disc_intersector_delay[drive] || disc_track_delay[drive])
disc_intersector_delay[drive] || disc_postdata_delay[drive] || disc_track_delay[drive] || disc_gap4_delay[drive])
{
advance_byte();
break;
@@ -561,7 +561,7 @@ void disc_sector_poll()
break;
}
if (cur_byte[drive] || (fdc_get_bitcell_period() != get_bitcell_period(drive)) ||
disc_intersector_delay[drive] || disc_track_delay[drive])
disc_intersector_delay[drive] || disc_postdata_delay[drive] || disc_track_delay[drive] || disc_gap4_delay[drive])
{
advance_byte();
break;
@@ -601,7 +601,7 @@ void disc_sector_poll()
disc_sector_sector[drive] != s->r ||
disc_sector_n[drive] != s->n ||
(fdc_get_bitcell_period() != get_bitcell_period(drive)) ||
disc_intersector_delay[drive] || disc_track_delay[drive])
disc_intersector_delay[drive] || disc_postdata_delay[drive] || disc_track_delay[drive] || disc_gap4_delay[drive])
{
advance_byte();
break;
@@ -636,7 +636,7 @@ void disc_sector_poll()
break;
}
if (cur_byte[drive] || (fdc_get_bitcell_period() != get_bitcell_period(drive)) ||
disc_intersector_delay[drive] || disc_track_delay[drive])
disc_intersector_delay[drive] || disc_postdata_delay[drive] || disc_track_delay[drive] || disc_gap4_delay[drive])
{
advance_byte();
break;
@@ -653,7 +653,7 @@ void disc_sector_poll()
fdc_writeprotect();
}
if (!index_count[drive] || (fdc_get_bitcell_period() != get_bitcell_period(drive)) ||
disc_intersector_delay[drive] || disc_track_delay[drive])
disc_intersector_delay[drive] || disc_postdata_delay[drive] || disc_track_delay[drive] || disc_gap4_delay[drive])
{
advance_byte();
break;

View File

@@ -616,7 +616,7 @@ uint8_t keyboard_at_read(uint16_t port, void *priv)
case 0x64:
temp = (keyboard_at.status & 0xFB) | (mode & CCB_SYSTEM);
if (mode & CCB_IGNORELOCK) temp |= STAT_LOCK;
/* if (mode & CCB_IGNORELOCK) */ temp |= STAT_LOCK;
keyboard_at.status &= ~(STAT_RTIMEOUT/* | STAT_TTIMEOUT*/);
break;
}

View File

@@ -156,8 +156,10 @@ MODEL models[] =
{"Award 430VX PCI", ROM_430VX, { "Intel", cpus_Pentium, "IDT", cpus_WinChip, "Cyrix", cpus_6x86, "AMD", cpus_K56, "", NULL}, 0, 1, 1, 256, 1, at_i430vx_init},
{"ASUS P/I-P55TVP4", ROM_P55TVP4, { "Intel", cpus_Pentium, "IDT", cpus_WinChip, "Cyrix", cpus_6x86, "AMD", cpus_K56, "", NULL}, 0, 1, 1, 512, 1, at_p55tvp4_init},
{"Epox P55-VA", ROM_P55VA, { "Intel", cpus_Pentium, "IDT", cpus_WinChip, "Cyrix", cpus_6x86, "AMD", cpus_K56, "", NULL}, 0, 1, 1, 256, 1, at_p55va_init},
{"Award 440FX PCI", ROM_440FX, { "Intel", cpus_PentiumPro,"Klamath", cpus_Pentium2, "Deschutes", cpus_Pentium2D}, 0, 1, 1, 1024, 1, at_i440fx_init},
{"Award KN97 (440FX PCI)",ROM_KN97, { "Intel", cpus_PentiumPro,"Klamath", cpus_Pentium2, "Deschutes", cpus_Pentium2D}, 0, 1, 1, 1024, 1, at_kn97_init},
{"Award 440FX PCI", ROM_440FX, { "Intel", cpus_PentiumPro, "", NULL, "", NULL}, 0, 1, 1, 1024, 1, at_i440fx_init},
{"Award KN97 (440FX PCI)",ROM_KN97, { "Intel", cpus_PentiumPro, "", NULL, "", NULL}, 0, 1, 1, 1024, 1, at_kn97_init},
// {"Award 440FX PCI", ROM_440FX, { "Intel", cpus_PentiumPro,"Klamath", cpus_Pentium2, "Deschutes", cpus_Pentium2D}, 0, 1, 1, 1024, 1, at_i440fx_init},
// {"Award KN97 (440FX PCI)",ROM_KN97, { "Intel", cpus_PentiumPro,"Klamath", cpus_Pentium2, "Deschutes", cpus_Pentium2D}, 0, 1, 1, 1024, 1, at_kn97_init},
{"", -1, {"", 0, "", 0, "", 0}, 0,0,0, 0}
};

View File

@@ -31,7 +31,7 @@ void mouse_serial_poll(int x, int y, int b)
if (!(serial1.mctrl&0x10))
{
pclog("Serial data %02X %02X %02X\n", mousedat[0], mousedat[1], mousedat[2]);
// pclog("Serial data %02X %02X %02X\n", mousedat[0], mousedat[1], mousedat[2]);
serial_write_fifo(&serial1, mousedat[0]);
serial_write_fifo(&serial1, mousedat[1]);
serial_write_fifo(&serial1, mousedat[2]);

File diff suppressed because it is too large Load Diff

View File

@@ -123,13 +123,13 @@ BEGIN
COMBOBOX IDC_COMBODRB,162,156,57,120,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
END
HdConfDlg DIALOGEX 0, 0, 210, 310+4*16
HdConfDlg DIALOGEX 0, 0, 210, 286+4*16
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Configure Hard Discs"
FONT 8, "MS Sans Serif"
FONT 9, "Segoe UI"
BEGIN
DEFPUSHBUTTON "OK",IDOK,31+12,290+64,50,14
PUSHBUTTON "Cancel",IDCANCEL,101+12,290+64,50,14
DEFPUSHBUTTON "OK",IDOK,31+12,264+64,50,14
PUSHBUTTON "Cancel",IDCANCEL,101+12,264+64,50,14
LTEXT "C:",IDC_STATIC,7,6,27,10
RADIOBUTTON "Hard drive", IDC_CHDD, 7+64, 6, 53, 12 , WS_TABSTOP
@@ -198,8 +198,8 @@ HdConfDlg DIALOGEX 0, 0, 210, 310+4*16
LTEXT "G:",IDC_STATIC,7,222+64,27,10
RADIOBUTTON "CD-ROM", IDC_GCDROM, 7+128, 222+64, 53, 12 , WS_TABSTOP
LTEXT "H:",IDC_STATIC,7,262+64,27,10
RADIOBUTTON "CD-ROM", IDC_HCDROM, 7+128, 262+64, 53, 12 , WS_TABSTOP
LTEXT "H:",IDC_STATIC,7,238+64,27,10
RADIOBUTTON "CD-ROM", IDC_HCDROM, 7+128, 238+64, 53, 12 , WS_TABSTOP
END

View File

@@ -105,7 +105,7 @@ void pic_write(uint16_t addr, uint8_t val, void *priv)
{
if (val&16) /*ICW1*/
{
pic.mask=0xFF;
pic.mask=0;
pic.mask2=0;
pic.icw=1;
pic.icw1=val;
@@ -222,7 +222,7 @@ void pic2_write(uint16_t addr, uint8_t val, void *priv)
{
if (val&16) /*ICW1*/
{
pic2.mask=0xFF;
pic2.mask=0;
pic2.mask2=0;
pic2.icw=1;
pic2.icw1=val;

View File

@@ -43,6 +43,19 @@ void svga_set_override(svga_t *svga, int val)
svga->override = val;
}
typedef union pci_bar
{
uint16_t word;
uint8_t bytes[2];
} ichar;
ichar char12x24[65536][48];
uint8_t charedit_on = 0;
ichar charcode;
uint8_t charmode = 0;
uint8_t charptr = 0;
uint8_t charsettings = 0xEE;
void svga_out(uint16_t addr, uint8_t val, void *p)
{
svga_t *svga = (svga_t *)p;
@@ -51,6 +64,40 @@ void svga_out(uint16_t addr, uint8_t val, void *p)
// printf("OUT SVGA %03X %02X %04X:%04X\n",addr,val,CS,pc);
switch (addr)
{
case 0x32CB:
printf("Write 32CB: %04X\n", val);
charedit_on = (val & 0x10) ? 1 : 0;
charsettings = val;
return;
case 0x22CB:
printf("Write 22CB: %04X\n", val);
charmode = val;
charptr = 0;
return;
case 0x22CF:
printf("Write 22CF: %04X\n", val);
// if (!charedit_on) return;
switch(charmode)
{
case 1: case 2:
charcode.bytes[charmode - 1] = val;
return;
case 3: case 4: /* Character bitmaps */
char12x24[charcode.word][charptr].bytes[(charmode & 1) ^ 1] = val;
charptr++;
charptr %= 48;
return;
case 0xAA: default:
return;
}
return;
case 0x22CA: case 0x22CE: case 0x32CA:
printf("OUT SVGA %03X %02X %04X:%04X\n",addr,val,CS,cpu_state.pc);
return;
case 0x3C0:
if (!svga->attrff)
{
@@ -251,6 +298,41 @@ uint8_t svga_in(uint16_t addr, void *p)
// if (addr!=0x3da) pclog("Read port %04X\n",addr);
switch (addr)
{
case 0x22CA:
pclog("Read port %04X\n", addr);
return 0xAA;
case 0x22CB:
pclog("Read port %04X\n", addr);
// return charmode;
return 0xF0 | (charmode & 0x1F);
case 0x22CE:
pclog("Read port %04X\n", addr);
return 0xCC;
case 0x22CF: /* Read character bitmap */
pclog("Read port %04X\n", addr);
// if (!charedit_on) return 0xFF;
switch(charmode)
{
case 1: case 2:
return charcode.bytes[charmode - 1];
case 3: case 4: /* Character bitmaps */
/* Mode 3 is low bytes, mode 4 is high bytes */
temp = char12x24[charcode.word][charptr].bytes[(charmode & 1) ^ 1];
charptr++;
charptr %= 48;
return temp;
case 0xAA: default:
return 0xFF;
}
case 0x32CA:
pclog("Read port %04X\n", addr);
return 0xEE;
case 0x32CB:
pclog("Read port %04X\n", addr);
return 0xEE;
return charsettings;
// return 0xEE | (charedit_on ? 0x10 : 0);
case 0x3C0:
return svga->attraddr | svga->attr_palette_enable;
case 0x3C1:
@@ -384,13 +466,29 @@ void svga_recalctimings(svga_t *svga)
{
if (svga->seqregs[1] & 8) /*40 column*/
{
svga->render = svga_render_text_40;
svga->hdisp *= (svga->seqregs[1] & 1) ? 16 : 18;
if (svga->hdisp == 120)
{
svga->render = svga_render_text_40_12;
svga->hdisp *= 16;
}
else
{
svga->render = svga_render_text_40;
svga->hdisp *= (svga->seqregs[1] & 1) ? 16 : 18;
}
}
else
{
svga->render = svga_render_text_80;
svga->hdisp *= (svga->seqregs[1] & 1) ? 8 : 9;
if (svga->hdisp == 120)
{
svga->render = svga_render_text_80_12;
svga->hdisp *= 8;
}
else
{
svga->render = svga_render_text_80;
svga->hdisp *= (svga->seqregs[1] & 1) ? 8 : 9;
}
}
svga->hdisp_old = svga->hdisp;
}
@@ -804,6 +902,10 @@ int svga_init(svga_t *svga, void *p, int memsize,
svga->ramdac_type = RAMDAC_6BIT;
svga_pointer = svga;
io_sethandler(0x22ca, 0x0002, svga_in, NULL, NULL, svga_out, NULL, NULL, svga);
io_sethandler(0x22ce, 0x0002, svga_in, NULL, NULL, svga_out, NULL, NULL, svga);
io_sethandler(0x32ca, 0x0002, svga_in, NULL, NULL, svga_out, NULL, NULL, svga);
return 0;
}
@@ -1012,6 +1114,13 @@ void svga_write(uint32_t addr, uint8_t val, void *p)
svga->gdcreg[8] = wm;
break;
}
if (svga->render == svga_render_text_80_12)
{
FILE *f = fopen("hecon.dmp", "wb");
fwrite(svga->vram, 1, svga->vram_limit, f);
fclose(f);
}
}
uint8_t svga_read(uint32_t addr, void *p)
@@ -1627,6 +1736,9 @@ void svga_add_status_info(char *s, int max_len, void *p)
sprintf(temps, "SVGA resolution : %i x %i\n", svga->video_res_x, svga->video_res_y);
strncat(s, temps, max_len);
sprintf(temps, "SVGA horizontal display : %i\n", svga->hdisp);
strncat(s, temps, max_len);
sprintf(temps, "SVGA refresh rate : %i Hz (%s)\n\n", svga->frames, svga->interlace ? "i" : "p");
svga->frames = 0;
strncat(s, temps, max_len);

View File

@@ -101,6 +101,61 @@ void svga_render_text_40(svga_t *svga)
}
}
void svga_render_text_40_12(svga_t *svga)
{
int y_add = (enable_overscan) ? 16 : 0;
int x_add = (enable_overscan) ? 12 : 0;
if (svga->firstline_draw == 2000)
svga->firstline_draw = svga->displine;
svga->lastline_draw = svga->displine;
if (svga->fullchange)
{
uint32_t *p = &((uint32_t *)buffer32->line[svga->displine + y_add])[32 + x_add];
int x, xx;
int drawcursor;
uint8_t chr, attr;
uint16_t dat;
uint32_t charaddr;
int fg, bg;
int xinc = 24;
for (x = 0; x < svga->hdisp; x += xinc)
{
drawcursor = ((svga->ma == svga->ca) && svga->con && svga->cursoron);
chr = svga->vram[svga->ma << 1];
attr = svga->vram[(svga->ma << 1) + 1];
if (attr & 8) charaddr = svga->charsetb + (chr * 128);
else charaddr = svga->charseta + (chr * 128);
if (drawcursor)
{
bg = svga->pallook[svga->egapal[attr & 15]];
fg = svga->pallook[svga->egapal[attr >> 4]];
}
else
{
fg = svga->pallook[svga->egapal[attr & 15]];
bg = svga->pallook[svga->egapal[attr >> 4]];
if (attr & 0x80 && svga->attrregs[0x10] & 8)
{
bg = svga->pallook[svga->egapal[(attr >> 4) & 7]];
if (svga->blink & 16)
fg = bg;
}
}
dat = *(uint16_t *) &(svga->vram[charaddr + (svga->sc << 2) - 1]);
for (xx = 0; xx < 24; xx += 2)
p[xx] = p[xx + 1] = (dat & (0x800 >> (xx >> 1))) ? fg : bg;
svga->ma += 4;
p += xinc;
}
svga->ma = svga_mask_addr(svga->ma, svga);
}
}
void svga_render_text_80(svga_t *svga)
{
FILE *f;
@@ -168,6 +223,63 @@ void svga_render_text_80(svga_t *svga)
}
}
void svga_render_text_80_12(svga_t *svga)
{
FILE *f;
int y_add = (enable_overscan) ? 16 : 0;
int x_add = (enable_overscan) ? 12 : 0;
if (svga->firstline_draw == 2000)
svga->firstline_draw = svga->displine;
svga->lastline_draw = svga->displine;
if (svga->fullchange)
{
uint32_t *p = &((uint32_t *)buffer32->line[svga->displine + y_add])[32 + x_add];
int x, xx;
int drawcursor;
uint8_t chr, attr;
uint16_t dat;
uint32_t charaddr;
int fg, bg;
int xinc = 12;
for (x = 0; x < svga->hdisp; x += xinc)
{
drawcursor = ((svga->ma == (svga->ca + 8)) && svga->con && svga->cursoron);
chr = svga->vram[svga->ma << 1];
attr = svga->vram[(svga->ma << 1) + 1];
if (attr & 8) charaddr = svga->charsetb + (chr * 128);
else charaddr = svga->charseta + (chr * 128);
if (drawcursor)
{
bg = svga->pallook[svga->egapal[attr & 15]];
fg = svga->pallook[svga->egapal[attr >> 4]];
}
else
{
fg = svga->pallook[svga->egapal[attr & 15]];
bg = svga->pallook[svga->egapal[attr >> 4]];
if (attr & 0x80 && svga->attrregs[0x10] & 8)
{
bg = svga->pallook[svga->egapal[(attr >> 4) & 7]];
if (svga->blink & 16)
fg = bg;
}
}
dat = svga->vram[charaddr + (svga->sc << 2)] << 4;
dat |= ((svga->vram[charaddr + (svga->sc << 2) + 1]) >> 4);
for (xx = 0; xx < 12; xx++)
p[xx] = (dat & (0x800 >> xx)) ? fg : bg;
svga->ma += 4;
p += xinc;
}
svga->ma = svga_mask_addr(svga->ma, svga);
}
}
void svga_render_2bpp_lowres(svga_t *svga)
{
int changed_offset;

View File

@@ -11,7 +11,9 @@ extern uint8_t edatlookup[4][4];
void svga_render_blank(svga_t *svga);
void svga_render_text_40(svga_t *svga);
void svga_render_text_40_12(svga_t *svga);
void svga_render_text_80(svga_t *svga);
void svga_render_text_80_12(svga_t *svga);
void svga_render_2bpp_lowres(svga_t *svga);
void svga_render_2bpp_highres(svga_t *svga);

View File

@@ -41,7 +41,7 @@ extern OpFn dynarec_ops_k6_0f[1024];
extern OpFn dynarec_ops_c6x86mx_0f[1024];
extern OpFn dynarec_ops_pentiumpro_0f[1024];
extern OpFn dynarec_ops_pentium2_0f[1024];
// extern OpFn dynarec_ops_pentium2_0f[1024];
extern OpFn dynarec_ops_pentium2d_0f[1024];
extern OpFn dynarec_ops_fpu_d8_a16[32];
@@ -106,7 +106,7 @@ extern OpFn ops_k6_0f[1024];
extern OpFn ops_c6x86mx_0f[1024];
extern OpFn ops_pentiumpro_0f[1024];
extern OpFn ops_pentium2_0f[1024];
// extern OpFn ops_pentium2_0f[1024];
extern OpFn ops_pentium2d_0f[1024];
extern OpFn ops_fpu_d8_a16[32];

View File

@@ -329,16 +329,16 @@ static int opMOV_a32_EAX(uint32_t fetchdat)
static int opLEA_w_a16(uint32_t fetchdat)
{
fetch_ea_16(fetchdat);
// ILLEGAL_ON(mod == 3);
cpu_state.regs[reg].w = (mod == 3) ? (cpu_state.last_ea & 0xffff) : eaaddr;
ILLEGAL_ON(mod == 3);
cpu_state.regs[reg].w = eaaddr;
CLOCK_CYCLES(timing_rr);
return 0;
}
static int opLEA_w_a32(uint32_t fetchdat)
{
fetch_ea_32(fetchdat);
// ILLEGAL_ON(mod == 3);
cpu_state.regs[reg].w = (mod == 3) ? (cpu_state.last_ea & 0xffff) : eaaddr;
ILLEGAL_ON(mod == 3);
cpu_state.regs[reg].w = eaaddr;
CLOCK_CYCLES(timing_rr);
return 0;
}
@@ -346,16 +346,16 @@ static int opLEA_w_a32(uint32_t fetchdat)
static int opLEA_l_a16(uint32_t fetchdat)
{
fetch_ea_16(fetchdat);
// ILLEGAL_ON(mod == 3);
cpu_state.regs[reg].l = ((mod == 3) ? cpu_state.last_ea : eaaddr) & 0xffff;
ILLEGAL_ON(mod == 3);
cpu_state.regs[reg].l = eaaddr & 0xffff;
CLOCK_CYCLES(timing_rr);
return 0;
}
static int opLEA_l_a32(uint32_t fetchdat)
{
fetch_ea_32(fetchdat);
// ILLEGAL_ON(mod == 3);
cpu_state.regs[reg].l = (mod == 3) ? cpu_state.last_ea : eaaddr;
ILLEGAL_ON(mod == 3);
cpu_state.regs[reg].l = eaaddr;
CLOCK_CYCLES(timing_rr);
return 0;
}

View File

@@ -78,7 +78,7 @@ void x86_doabrt(int x86_abrt)
/* if (CS == 0x3433 && cpu_state.pc == 0x000006B0)
{
pclog("Quit it\n");
// pclog("Quit it\n");
dumpregs();
exit(-1);
}*/
@@ -260,7 +260,7 @@ void loadseg(uint16_t seg, x86seg *s)
{
if (s==&_ss)
{
pclog("SS selector = NULL!\n");
// pclog("SS selector = NULL!\n");
x86ss(NULL,0);
return;
// dumpregs();
@@ -281,7 +281,7 @@ void loadseg(uint16_t seg, x86seg *s)
{
if (addr>=ldt.limit)
{
pclog("Bigger than LDT limit %04X %04X %02X %02X %02X\n",seg,ldt.limit, opcode, opcode2, rmdat);
// pclog("Bigger than LDT limit %04X %04X %02X %02X %02X\n",seg,ldt.limit, opcode, opcode2, rmdat);
// dumppic();
// dumpregs();
// exit(-1);
@@ -294,7 +294,7 @@ void loadseg(uint16_t seg, x86seg *s)
{
if (addr>=gdt.limit)
{
pclog("Bigger than GDT limit %04X %04X 1\n",seg,gdt.limit);
// pclog("Bigger than GDT limit %04X %04X 1\n",seg,gdt.limit);
// dumpregs();
// exit(-1);
x86gpf("loadseg(): Bigger than GDT limit",seg&~3);
@@ -312,13 +312,13 @@ void loadseg(uint16_t seg, x86seg *s)
{
if (!(seg&~3))
{
pclog("Load SS null selector\n");
// pclog("Load SS null selector\n");
x86gpf(NULL,seg&~3);
return;
}
if ((seg&3)!=CPL || dpl!=CPL)
{
pclog("Invalid SS permiss\n");
// pclog("Invalid SS permiss\n");
x86gpf(NULL,seg&~3);
// x86abort("Invalid SS permiss for %04X!\n",seg&0xFFFC);
return;
@@ -328,14 +328,14 @@ void loadseg(uint16_t seg, x86seg *s)
case 0x12: case 0x13: case 0x16: case 0x17: /*r/w*/
break;
default:
pclog("Invalid SS type\n");
// pclog("Invalid SS type\n");
x86gpf(NULL,seg&~3);
// x86abort("Invalid SS segment type for %04X!\n",seg&0xFFFC);
return;
}
if (!(segdat[2]&0x8000))
{
pclog("Load SS not present!\n");
// pclog("Load SS not present!\n");
x86ss(NULL,seg&~3);
return;
}
@@ -354,7 +354,7 @@ void loadseg(uint16_t seg, x86seg *s)
// pclog("Load seg %04X %i %i %04X:%08X\n",seg,dpl,CS&3,CS,cpu_state.pc);
if ((seg&3)>dpl || (CPL)>dpl)
{
pclog("Data seg fail - %04X:%08X %04X %i %04X\n",CS,cpu_state.pc,seg,dpl,segdat[2]);
// pclog("Data seg fail - %04X:%08X %04X %i %04X\n",CS,cpu_state.pc,seg,dpl,segdat[2]);
x86gpf(NULL,seg&~3);
// x86abort("Data segment load - level too low!\n",seg&0xFFFC);
return;
@@ -363,7 +363,7 @@ void loadseg(uint16_t seg, x86seg *s)
case 0x1E: case 0x1F: /*Readable conforming code*/
break;
default:
pclog("Invalid segment type for %04X! %04X\n",seg&0xFFFC,segdat[2]);
// pclog("Invalid segment type for %04X! %04X\n",seg&0xFFFC,segdat[2]);
x86gpf(NULL,seg&~3);
return;
}
@@ -418,7 +418,7 @@ void loadcs(uint16_t seg)
// pclog("Load CS %04X\n",seg);
if (!(seg&~3))
{
pclog("Trying to load CS with NULL selector! lcs\n");
// pclog("Trying to load CS with NULL selector! lcs\n");
// dumpregs();
// exit(-1);
x86gpf(NULL,0);
@@ -430,7 +430,7 @@ void loadcs(uint16_t seg)
{
if (addr>=ldt.limit)
{
pclog("Bigger than LDT limit %04X %04X CS\n",seg,ldt.limit);
// pclog("Bigger than LDT limit %04X %04X CS\n",seg,ldt.limit);
x86gpf(NULL,seg&~3);
return;
}
@@ -440,7 +440,7 @@ void loadcs(uint16_t seg)
{
if (addr>=gdt.limit)
{
pclog("Bigger than GDT limit %04X %04X CS\n",seg,gdt.limit);
// pclog("Bigger than GDT limit %04X %04X CS\n",seg,gdt.limit);
x86gpf(NULL,seg&~3);
return;
}
@@ -451,7 +451,7 @@ void loadcs(uint16_t seg)
segdat[1]=readmemw(0,addr+2);
segdat[2]=readmemw(0,addr+4);
segdat[3]=readmemw(0,addr+6); cpl_override=0; if (abrt) return;
if (optype==JMP) pclog("Code seg - %04X - %04X %04X %04X %04X\n",seg,segdat[0],segdat[1],segdat[2],segdat[3]);
// if (optype==JMP) pclog("Code seg - %04X - %04X %04X %04X %04X\n",seg,segdat[0],segdat[1],segdat[2],segdat[3]);
// if (!(segdat[2]&0x8000)) x86abort("Code segment not present!\n");
// if (output) pclog("Segdat2 %04X\n",segdat[2]);
if (segdat[2]&0x1000) /*Normal code segment*/
@@ -461,7 +461,7 @@ void loadcs(uint16_t seg)
if ((seg&3)>CPL)
{
x86gpf(NULL,seg&~3);
pclog("loadcs RPL > CPL %04X %04X %i %02X\n",segdat[2],seg,CPL,opcode);
// pclog("loadcs RPL > CPL %04X %04X %i %02X\n",segdat[2],seg,CPL,opcode);
return;
}
if (CPL != DPL)
@@ -505,7 +505,7 @@ void loadcs(uint16_t seg)
switch (segdat[2]&0xF00)
{
default:
pclog("Bad CS %02X %02X %i special descriptor %03X %04X\n",opcode,rmdat,optype,segdat[2]&0xF00,seg);
// pclog("Bad CS %02X %02X %i special descriptor %03X %04X\n",opcode,rmdat,optype,segdat[2]&0xF00,seg);
x86gpf(NULL,seg&~3);
return;
}
@@ -539,7 +539,7 @@ void loadcsjmp(uint16_t seg, uint32_t oxpc)
{
if (!(seg&~3))
{
pclog("Trying to load CS with NULL selector! lcsjmp\n");
// pclog("Trying to load CS with NULL selector! lcsjmp\n");
x86gpf(NULL,0);
return;
// dumpregs();
@@ -550,7 +550,7 @@ void loadcsjmp(uint16_t seg, uint32_t oxpc)
{
if (addr>=ldt.limit)
{
pclog("Bigger than LDT limit %04X %04X CS\n",seg,ldt.limit);
// pclog("Bigger than LDT limit %04X %04X CS\n",seg,ldt.limit);
x86gpf(NULL,seg&~3);
return;
}
@@ -560,7 +560,7 @@ void loadcsjmp(uint16_t seg, uint32_t oxpc)
{
if (addr>=gdt.limit)
{
pclog("Bigger than GDT limit %04X %04X CS\n",seg,gdt.limit);
// pclog("Bigger than GDT limit %04X %04X CS\n",seg,gdt.limit);
x86gpf(NULL,seg&~3);
return;
}
@@ -620,7 +620,7 @@ void loadcsjmp(uint16_t seg, uint32_t oxpc)
// pclog("System CS\n");
if (!(segdat[2]&0x8000))
{
x86np("Load CS JMP system selector not present\n", seg & 0xfffc);
// x86np("Load CS JMP system selector not present\n", seg & 0xfffc);
return;
}
type=segdat[2]&0xF00;
@@ -662,7 +662,7 @@ void loadcsjmp(uint16_t seg, uint32_t oxpc)
if (!(seg2&~3))
{
pclog("Trying to load CS with NULL selector! lcsjmpcg\n");
// pclog("Trying to load CS with NULL selector! lcsjmpcg\n");
x86gpf(NULL,0);
return;
// dumpregs();
@@ -673,7 +673,7 @@ void loadcsjmp(uint16_t seg, uint32_t oxpc)
{
if (addr>=ldt.limit)
{
pclog("Bigger than LDT limit %04X %04X CSJ\n",seg2,gdt.limit);
// pclog("Bigger than LDT limit %04X %04X CSJ\n",seg2,gdt.limit);
x86gpf(NULL,seg2&~3);
return;
}
@@ -683,7 +683,7 @@ void loadcsjmp(uint16_t seg, uint32_t oxpc)
{
if (addr>=gdt.limit)
{
pclog("Bigger than GDT limit %04X %04X CSJ\n",seg2,gdt.limit);
// pclog("Bigger than GDT limit %04X %04X CSJ\n",seg2,gdt.limit);
x86gpf(NULL,seg2&~3);
return;
}
@@ -712,7 +712,7 @@ void loadcsjmp(uint16_t seg, uint32_t oxpc)
case 0x1800: case 0x1900: case 0x1A00: case 0x1B00: /*Non-conforming code*/
if (DPL > CPL)
{
pclog("Call gate DPL > CPL");
// pclog("Call gate DPL > CPL");
x86gpf(NULL,seg2&~3);
return;
}
@@ -731,7 +731,7 @@ void loadcsjmp(uint16_t seg, uint32_t oxpc)
break;
default:
pclog("JMP Call gate bad segment type\n");
// pclog("JMP Call gate bad segment type\n");
x86gpf(NULL,seg2&~3);
return;
}
@@ -752,7 +752,7 @@ void loadcsjmp(uint16_t seg, uint32_t oxpc)
return;
default:
pclog("Bad JMP CS %02X %02X %i special descriptor %03X %04X\n",opcode,rmdat,optype,segdat[2]&0xF00,seg);
// pclog("Bad JMP CS %02X %02X %i special descriptor %03X %04X\n",opcode,rmdat,optype,segdat[2]&0xF00,seg);
x86gpf(NULL,0);
return;
// dumpregs();
@@ -865,7 +865,7 @@ void loadcscall(uint16_t seg)
if (csout) pclog("Protected mode CS load! %04X\n",seg);
if (!(seg&~3))
{
pclog("Trying to load CS with NULL selector! lcscall\n");
// pclog("Trying to load CS with NULL selector! lcscall\n");
x86gpf(NULL,0);
return;
// dumpregs();
@@ -876,7 +876,7 @@ void loadcscall(uint16_t seg)
{
if (addr>=ldt.limit)
{
pclog("Bigger than LDT limit %04X %04X CSC\n",seg,gdt.limit);
// pclog("Bigger than LDT limit %04X %04X CSC\n",seg,gdt.limit);
x86gpf(NULL,seg&~3);
return;
}
@@ -886,7 +886,7 @@ void loadcscall(uint16_t seg)
{
if (addr>=gdt.limit)
{
pclog("Bigger than GDT limit %04X %04X CSC\n",seg,gdt.limit);
// pclog("Bigger than GDT limit %04X %04X CSC\n",seg,gdt.limit);
x86gpf(NULL,seg&~3);
return;
}
@@ -908,26 +908,26 @@ void loadcscall(uint16_t seg)
{
if ((seg&3)>CPL)
{
/* if (csout) */ pclog("Not conforming, RPL > CPL\n");
/* if (csout) */ // pclog("Not conforming, RPL > CPL\n");
x86gpf("loadcscall(): segment > CPL",seg&~3);
return;
}
if (CPL != DPL)
{
/* if (csout) */ pclog("Not conforming, CPL != DPL (%i %i)\n",CPL,DPL);
/* if (csout) */ // pclog("Not conforming, CPL != DPL (%i %i)\n",CPL,DPL);
x86gpf(NULL,seg&~3);
return;
}
}
if (CPL < DPL)
{
/* if (csout) */ pclog("CPL < DPL\n");
/* if (csout) */ // pclog("CPL < DPL\n");
x86gpf(NULL,seg&~3);
return;
}
if (!(segdat[2]&0x8000))
{
/* if (csout) */ pclog("Not present\n");
/* if (csout) */ // pclog("Not present\n");
x86np("Load CS call not present", seg & 0xfffc);
return;
}
@@ -998,7 +998,7 @@ void loadcscall(uint16_t seg)
if (!(seg2&~3))
{
pclog("Trying to load CS with NULL selector! lcscallcg\n");
// pclog("Trying to load CS with NULL selector! lcscallcg\n");
x86gpf(NULL,0);
return;
// dumpregs();
@@ -1009,7 +1009,7 @@ void loadcscall(uint16_t seg)
{
if (addr>=ldt.limit)
{
pclog("Bigger than LDT limit %04X %04X CSC\n",seg2,gdt.limit);
// pclog("Bigger than LDT limit %04X %04X CSC\n",seg2,gdt.limit);
x86gpf(NULL,seg2&~3);
return;
}
@@ -1019,7 +1019,7 @@ void loadcscall(uint16_t seg)
{
if (addr>=gdt.limit)
{
pclog("Bigger than GDT limit %04X %04X CSC\n",seg2,gdt.limit);
// pclog("Bigger than GDT limit %04X %04X CSC\n",seg2,gdt.limit);
x86gpf(NULL,seg2&~3);
return;
}
@@ -1073,7 +1073,7 @@ void loadcscall(uint16_t seg)
if (output) pclog("New stack %04X:%08X\n",newss,newsp);
if (!(newss&~3))
{
pclog("Call gate loading null SS\n");
// pclog("Call gate loading null SS\n");
x86ts(NULL,newss&~3);
return;
}
@@ -1107,7 +1107,7 @@ void loadcscall(uint16_t seg)
if (output) pclog("Read stack seg done!\n");
if (((newss & 3) != DPL) || (DPL2 != DPL))
{
pclog("Call gate loading SS with wrong permissions %04X %04X %i %i %04X %04X\n", newss, seg2, DPL, DPL2, segdat[2], segdat2[2]);
// pclog("Call gate loading SS with wrong permissions %04X %04X %i %i %04X %04X\n", newss, seg2, DPL, DPL2, segdat[2], segdat2[2]);
// dumpregs();
// exit(-1);
x86ts(NULL,newss&~3);
@@ -1115,13 +1115,13 @@ void loadcscall(uint16_t seg)
}
if ((segdat2[2]&0x1A00)!=0x1200)
{
pclog("Call gate loading SS wrong type\n");
// pclog("Call gate loading SS wrong type\n");
x86ts(NULL,newss&~3);
return;
}
if (!(segdat2[2]&0x8000))
{
pclog("Call gate loading SS not present\n");
// pclog("Call gate loading SS not present\n");
x86np("Call gate loading SS not present\n", newss & 0xfffc);
return;
}
@@ -1162,7 +1162,7 @@ void loadcscall(uint16_t seg)
PUSHL(oldsp2);
if (abrt)
{
pclog("ABRT PUSHL\n");
// pclog("ABRT PUSHL\n");
SS = oldss;
ESP = oldsp2;
return;
@@ -1176,7 +1176,7 @@ void loadcscall(uint16_t seg)
PUSHL(readmeml(oldssbase,oldsp+(count*4)));
if (abrt)
{
pclog("ABRT COPYL\n");
// pclog("ABRT COPYL\n");
SS = oldss;
ESP = oldsp2;
return;
@@ -1195,7 +1195,7 @@ void loadcscall(uint16_t seg)
PUSHW(oldsp2);
if (abrt)
{
pclog("ABRT PUSHW\n");
// pclog("ABRT PUSHW\n");
SS = oldss;
ESP = oldsp2;
return;
@@ -1213,7 +1213,7 @@ void loadcscall(uint16_t seg)
PUSHW(tempw);
if (abrt)
{
pclog("ABRT COPYW\n");
// pclog("ABRT COPYW\n");
SS = oldss;
ESP = oldsp2;
return;
@@ -1230,7 +1230,7 @@ void loadcscall(uint16_t seg)
}
else if (DPL > CPL)
{
pclog("Call gate DPL > CPL");
// pclog("Call gate DPL > CPL");
x86gpf(NULL,seg2&~3);
return;
}
@@ -1260,7 +1260,7 @@ void loadcscall(uint16_t seg)
break;
default:
pclog("Call gate bad segment type\n");
// pclog("Call gate bad segment type\n");
x86gpf(NULL,seg2&~3);
return;
}
@@ -1274,7 +1274,7 @@ void loadcscall(uint16_t seg)
default:
pclog("Bad CALL special descriptor %03X\n",segdat[2]&0xF00);
// pclog("Bad CALL special descriptor %03X\n",segdat[2]&0xF00);
x86gpf(NULL,seg&~3);
return;
// dumpregs();
@@ -1321,7 +1321,7 @@ void pmoderetf(int is32, uint16_t off)
if (output) pclog("Return to %04X:%08X\n",seg,newpc);
if ((seg&3)<CPL)
{
pclog("RETF RPL<CPL %04X %i %i %04X:%08X\n",seg,CPL,ins,CS,cpu_state.pc);
// pclog("RETF RPL<CPL %04X %i %i %04X:%08X\n",seg,CPL,ins,CS,cpu_state.pc);
// output=3;
// timetolive=100;
// dumpregs();
@@ -1332,7 +1332,7 @@ void pmoderetf(int is32, uint16_t off)
}
if (!(seg&~3))
{
pclog("Trying to load CS with NULL selector! retf\n");
// pclog("Trying to load CS with NULL selector! retf\n");
// dumpregs();
// exit(-1);
x86gpf(NULL,0);
@@ -1343,7 +1343,7 @@ void pmoderetf(int is32, uint16_t off)
{
if (addr>=ldt.limit)
{
pclog("Bigger than LDT limit %04X %04X RETF\n",seg,ldt.limit);
// pclog("Bigger than LDT limit %04X %04X RETF\n",seg,ldt.limit);
x86gpf(NULL,seg&~3);
return;
}
@@ -1353,7 +1353,7 @@ void pmoderetf(int is32, uint16_t off)
{
if (addr>=gdt.limit)
{
pclog("Bigger than GDT limit %04X %04X RETF\n",seg,gdt.limit);
// pclog("Bigger than GDT limit %04X %04X RETF\n",seg,gdt.limit);
x86gpf(NULL,seg&~3);
// dumpregs();
// exit(-1);
@@ -1381,7 +1381,7 @@ void pmoderetf(int is32, uint16_t off)
case 0x1800: case 0x1900: case 0x1A00: case 0x1B00: /*Non-conforming*/
if (CPL != DPL)
{
pclog("RETF non-conforming CPL != DPL\n");
// pclog("RETF non-conforming CPL != DPL\n");
ESP=oldsp;
x86gpf(NULL,seg&~3);
return;
@@ -1390,20 +1390,20 @@ void pmoderetf(int is32, uint16_t off)
case 0x1C00: case 0x1D00: case 0x1E00: case 0x1F00: /*Conforming*/
if (CPL < DPL)
{
pclog("RETF non-conforming CPL < DPL\n");
// pclog("RETF non-conforming CPL < DPL\n");
ESP=oldsp;
x86gpf(NULL,seg&~3);
return;
}
break;
default:
pclog("RETF CS not code segment\n");
// pclog("RETF CS not code segment\n");
x86gpf(NULL,seg&~3);
return;
}
if (!(segdat[2]&0x8000))
{
pclog("RETF CS not present %i %04X %04X %04X\n",ins, segdat[0], segdat[1], segdat[2]);
// pclog("RETF CS not present %i %04X %04X %04X\n",ins, segdat[0], segdat[1], segdat[2]);
ESP=oldsp;
x86np("RETF CS not present\n", seg & 0xfffc);
return;
@@ -1434,7 +1434,7 @@ void pmoderetf(int is32, uint16_t off)
case 0x1800: case 0x1900: case 0x1A00: case 0x1B00: /*Non-conforming*/
if ((seg&3) != DPL)
{
pclog("RETF non-conforming RPL != DPL\n");
// pclog("RETF non-conforming RPL != DPL\n");
ESP=oldsp;
x86gpf(NULL,seg&~3);
return;
@@ -1444,7 +1444,7 @@ void pmoderetf(int is32, uint16_t off)
case 0x1C00: case 0x1D00: case 0x1E00: case 0x1F00: /*Conforming*/
if ((seg&3) < DPL)
{
pclog("RETF non-conforming RPL < DPL\n");
// pclog("RETF non-conforming RPL < DPL\n");
ESP=oldsp;
x86gpf(NULL,seg&~3);
return;
@@ -1452,14 +1452,14 @@ void pmoderetf(int is32, uint16_t off)
if (output) pclog("RETF conforming, %i %i\n",seg&3, DPL);
break;
default:
pclog("RETF CS not code segment\n");
// pclog("RETF CS not code segment\n");
ESP=oldsp;
x86gpf(NULL,seg&~3);
return;
}
if (!(segdat[2]&0x8000))
{
pclog("RETF CS not present! %i %04X %04X %04X\n",ins, segdat[0], segdat[1], segdat[2]);
// pclog("RETF CS not present! %i %04X %04X %04X\n",ins, segdat[0], segdat[1], segdat[2]);
ESP=oldsp;
x86np("RETF CS not present\n", seg & 0xfffc);
@@ -1482,7 +1482,7 @@ void pmoderetf(int is32, uint16_t off)
if (output) pclog("Read new stack : %04X:%04X (%08X)\n", newss, newsp, ldt.base);
if (!(newss&~3))
{
pclog("RETF loading null SS\n");
// pclog("RETF loading null SS\n");
ESP=oldsp;
x86gpf(NULL,newss&~3);
return;
@@ -1492,7 +1492,7 @@ void pmoderetf(int is32, uint16_t off)
{
if (addr>=ldt.limit)
{
pclog("Bigger than LDT limit %04X %04X RETF SS\n",newss,gdt.limit);
// pclog("Bigger than LDT limit %04X %04X RETF SS\n",newss,gdt.limit);
ESP=oldsp;
x86gpf(NULL,newss&~3);
return;
@@ -1503,7 +1503,7 @@ void pmoderetf(int is32, uint16_t off)
{
if (addr>=gdt.limit)
{
pclog("Bigger than GDT limit %04X %04X RETF SS\n",newss,gdt.limit);
// pclog("Bigger than GDT limit %04X %04X RETF SS\n",newss,gdt.limit);
ESP=oldsp;
x86gpf(NULL,newss&~3);
return;
@@ -1519,7 +1519,7 @@ void pmoderetf(int is32, uint16_t off)
// if (((newss & 3) != DPL) || (DPL2 != DPL))
if ((newss & 3) != (seg & 3))
{
pclog("RETF loading SS with wrong permissions %i %i %04X %04X\n", newss & 3, seg & 3, newss, seg);
// pclog("RETF loading SS with wrong permissions %i %i %04X %04X\n", newss & 3, seg & 3, newss, seg);
ESP=oldsp;
// output = 3;
// dumpregs();
@@ -1529,7 +1529,7 @@ void pmoderetf(int is32, uint16_t off)
}
if ((segdat2[2]&0x1A00)!=0x1200)
{
pclog("RETF loading SS wrong type\n");
// pclog("RETF loading SS wrong type\n");
ESP=oldsp;
// dumpregs();
// exit(-1);
@@ -1538,14 +1538,14 @@ void pmoderetf(int is32, uint16_t off)
}
if (!(segdat2[2]&0x8000))
{
pclog("RETF loading SS not present\n");
// pclog("RETF loading SS not present\n");
ESP=oldsp;
x86np("RETF loading SS not present\n", newss & 0xfffc);
return;
}
if (DPL2 != (seg & 3))
{
pclog("RETF loading SS with wrong permissions2 %i %i %04X %04X\n", DPL2, seg & 3, newss, seg);
// pclog("RETF loading SS with wrong permissions2 %i %i %04X %04X\n", DPL2, seg & 3, newss, seg);
ESP=oldsp;
x86gpf(NULL,newss&~3);
return;
@@ -1609,7 +1609,7 @@ void pmodeint(int num, int soft)
if (eflags&VM_FLAG && IOPL!=3 && soft)
{
if (output) pclog("V86 banned int\n");
pclog("V86 banned int!\n");
// pclog("V86 banned int!\n");
x86gpf(NULL,0);
return;
// dumpregs();
@@ -1621,18 +1621,18 @@ void pmodeint(int num, int soft)
if (num==8)
{
/*Triple fault - reset!*/
pclog("Triple fault!\n");
// pclog("Triple fault!\n");
// output=1;
softresetx86();
}
else if (num==0xD)
{
pclog("Double fault!\n");
// pclog("Double fault!\n");
pmodeint(8,0);
}
else
{
pclog("INT out of range\n");
// pclog("INT out of range\n");
x86gpf(NULL,(num*8)+2+(soft)?0:1);
}
if (output) pclog("addr >= IDT.limit\n");
@@ -1643,7 +1643,7 @@ void pmodeint(int num, int soft)
segdat[0]=readmemw(0,addr);
segdat[1]=readmemw(2,addr);
segdat[2]=readmemw(4,addr);
segdat[3]=readmemw(6,addr); cpl_override=0; if (abrt) { pclog("Abrt reading from %08X\n",addr); return; }
segdat[3]=readmemw(6,addr); cpl_override=0; if (abrt) { /* pclog("Abrt reading from %08X\n",addr); */ return; }
oaddr = addr;
if (output) pclog("Addr %08X seg %04X %04X %04X %04X\n",addr,segdat[0],segdat[1],segdat[2],segdat[3]);
@@ -1668,7 +1668,7 @@ void pmodeint(int num, int soft)
// if (output) pclog("Int gate %04X %i oldpc %04X pc %04X\n",type,intgatesize,oldpc,cpu_state.pc);
if (!(segdat[2]&0x8000))
{
pclog("Int gate not present\n");
// pclog("Int gate not present\n");
x86np("Int gate not present\n", (num << 3) | 2);
return;
}
@@ -1681,7 +1681,7 @@ void pmodeint(int num, int soft)
{
if (addr>=ldt.limit)
{
pclog("Bigger than LDT limit %04X %04X INT\n",seg,gdt.limit);
// pclog("Bigger than LDT limit %04X %04X INT\n",seg,gdt.limit);
x86gpf(NULL,seg&~3);
return;
}
@@ -1691,7 +1691,7 @@ void pmodeint(int num, int soft)
{
if (addr>=gdt.limit)
{
pclog("Bigger than GDT limit %04X %04X INT %i\n",seg,gdt.limit,ins);
// pclog("Bigger than GDT limit %04X %04X INT %i\n",seg,gdt.limit,ins);
x86gpf(NULL,seg&~3);
return;
}
@@ -1699,7 +1699,7 @@ void pmodeint(int num, int soft)
}
/* if ((seg&3) < CPL)
{
pclog("INT to higher level\n");
// pclog("INT to higher level\n");
x86gpf(NULL,seg&~3);
return;
}*/
@@ -1712,7 +1712,7 @@ void pmodeint(int num, int soft)
if (DPL2 > CPL)
{
pclog("INT to higher level 2\n");
// pclog("INT to higher level 2\n");
x86gpf(NULL,seg&~3);
return;
}
@@ -1725,13 +1725,13 @@ void pmodeint(int num, int soft)
stack_changed=1;
if (!(segdat2[2]&0x8000))
{
pclog("Int gate CS not present\n");
// pclog("Int gate CS not present\n");
x86np("Int gate CS not present\n", segdat[1] & 0xfffc);
return;
}
if ((eflags&VM_FLAG) && DPL2)
{
pclog("V86 calling int gate, DPL != 0\n");
// pclog("V86 calling int gate, DPL != 0\n");
x86gpf(NULL,segdat[1]&0xFFFC);
return;
}
@@ -1754,7 +1754,7 @@ void pmodeint(int num, int soft)
cpl_override=0;
if (!(newss&~3))
{
pclog("Int gate loading null SS\n");
// pclog("Int gate loading null SS\n");
x86ss(NULL,newss&~3);
return;
}
@@ -1763,7 +1763,7 @@ void pmodeint(int num, int soft)
{
if (addr>=ldt.limit)
{
pclog("Bigger than LDT limit %04X %04X PMODEINT SS\n",newss,gdt.limit);
// pclog("Bigger than LDT limit %04X %04X PMODEINT SS\n",newss,gdt.limit);
x86ss(NULL,newss&~3);
return;
}
@@ -1773,7 +1773,7 @@ void pmodeint(int num, int soft)
{
if (addr>=gdt.limit)
{
pclog("Bigger than GDT limit %04X %04X CSC\n",newss,gdt.limit);
// pclog("Bigger than GDT limit %04X %04X CSC\n",newss,gdt.limit);
x86ss(NULL,newss&~3);
return;
}
@@ -1786,19 +1786,19 @@ void pmodeint(int num, int soft)
segdat3[3]=readmemw(0,addr+6); cpl_override=0; if (abrt) return;
if (((newss & 3) != DPL2) || (DPL3 != DPL2))
{
pclog("Int gate loading SS with wrong permissions\n");
// pclog("Int gate loading SS with wrong permissions\n");
x86ss(NULL,newss&~3);
return;
}
if ((segdat3[2]&0x1A00)!=0x1200)
{
pclog("Int gate loading SS wrong type\n");
// pclog("Int gate loading SS wrong type\n");
x86ss(NULL,newss&~3);
return;
}
if (!(segdat3[2]&0x8000))
{
pclog("Int gate loading SS not present\n");
// pclog("Int gate loading SS not present\n");
x86np("Int gate loading SS not present\n", newss & 0xfffc);
return;
}
@@ -1859,20 +1859,20 @@ void pmodeint(int num, int soft)
}
else if (DPL2!=CPL)
{
pclog("Non-conforming int gate DPL != CPL\n");
// pclog("Non-conforming int gate DPL != CPL\n");
x86gpf(NULL,seg&~3);
return;
}
case 0x1C00: case 0x1D00: case 0x1E00: case 0x1F00: /*Conforming*/
if (!(segdat2[2]&0x8000))
{
pclog("Int gate CS not present\n");
// pclog("Int gate CS not present\n");
x86np("Int gate CS not present\n", segdat[1] & 0xfffc);
return;
}
if ((eflags & VM_FLAG) && DPL2<CPL)
{
pclog("Int gate V86 mode DPL2<CPL\n");
// pclog("Int gate V86 mode DPL2<CPL\n");
x86gpf(NULL,seg&~3);
return;
}
@@ -1896,7 +1896,7 @@ void pmodeint(int num, int soft)
new_cpl = CS & 3;
break;
default:
pclog("Int gate CS not code segment - %04X %04X %04X %04X\n",segdat2[0],segdat2[1],segdat2[2],segdat2[3]);
// pclog("Int gate CS not code segment - %04X %04X %04X %04X\n",segdat2[0],segdat2[1],segdat2[2],segdat2[3]);
x86gpf(NULL,seg&~3);
return;
}
@@ -1935,7 +1935,7 @@ void pmodeint(int num, int soft)
{
if (addr>=ldt.limit)
{
pclog("Bigger than LDT limit %04X %04X INT\n",seg,gdt.limit);
// pclog("Bigger than LDT limit %04X %04X INT\n",seg,gdt.limit);
x86gpf(NULL,seg&~3);
return;
}
@@ -1945,7 +1945,7 @@ void pmodeint(int num, int soft)
{
if (addr>=gdt.limit)
{
pclog("Bigger than GDT limit %04X %04X INT %i\n",seg,gdt.limit,ins);
// pclog("Bigger than GDT limit %04X %04X INT %i\n",seg,gdt.limit,ins);
x86gpf(NULL,seg&~3);
return;
}
@@ -1959,7 +1959,7 @@ void pmodeint(int num, int soft)
cpl_override=0; if (abrt) return;
if (!(segdat2[2]&0x8000))
{
pclog("Int task gate not present\n");
// pclog("Int task gate not present\n");
x86np("Int task gate not present\n", segdat[1] & 0xfffc);
return;
}
@@ -1970,7 +1970,7 @@ void pmodeint(int num, int soft)
break;
default:
pclog("Bad int gate type %04X %04X %04X %04X %04X\n",segdat[2]&0x1F00,segdat[0],segdat[1],segdat[2],segdat[3]);
// pclog("Bad int gate type %04X %04X %04X %04X %04X\n",segdat[2]&0x1F00,segdat[0],segdat[1],segdat[2],segdat[3]);
x86gpf(NULL,seg&~3);
return;
}
@@ -1992,7 +1992,7 @@ void pmodeiret(int is32)
// if (output) pclog("V86 IRET\n");
if (IOPL!=3)
{
pclog("V86 IRET! IOPL!=3\n");
// pclog("V86 IRET! IOPL!=3\n");
x86gpf(NULL,0);
return;
}
@@ -2034,7 +2034,7 @@ void pmodeiret(int is32)
{
if (addr>=ldt.limit)
{
pclog("TS Bigger than LDT limit %04X %04X IRET\n",seg,gdt.limit);
// pclog("TS Bigger than LDT limit %04X %04X IRET\n",seg,gdt.limit);
x86gpf(NULL,seg&~3);
return;
}
@@ -2044,7 +2044,7 @@ void pmodeiret(int is32)
{
if (addr>=gdt.limit)
{
pclog("TS Bigger than GDT limit %04X %04X IRET\n",seg,gdt.limit);
// pclog("TS Bigger than GDT limit %04X %04X IRET\n",seg,gdt.limit);
x86gpf(NULL,seg&~3);
return;
}
@@ -2129,7 +2129,7 @@ void pmodeiret(int is32)
// pclog("Returned to %04X:%08X %04X %04X %i\n",seg,newpc,flags,tempflags, ins);
if (!(seg&~3))
{
pclog("IRET CS=0\n");
// pclog("IRET CS=0\n");
ESP = oldsp;
// dumpregs();
// exit(-1);
@@ -2143,7 +2143,7 @@ void pmodeiret(int is32)
{
if (addr>=ldt.limit)
{
pclog("Bigger than LDT limit %04X %04X IRET\n",seg,gdt.limit);
// pclog("Bigger than LDT limit %04X %04X IRET\n",seg,gdt.limit);
ESP = oldsp;
x86gpf(NULL,seg&~3);
return;
@@ -2154,7 +2154,7 @@ void pmodeiret(int is32)
{
if (addr>=gdt.limit)
{
pclog("Bigger than GDT limit %04X %04X IRET\n",seg,gdt.limit);
// pclog("Bigger than GDT limit %04X %04X IRET\n",seg,gdt.limit);
ESP = oldsp;
x86gpf(NULL,seg&~3);
return;
@@ -2163,7 +2163,7 @@ void pmodeiret(int is32)
}
if ((seg&3) < CPL)
{
pclog("IRET to lower level\n");
// pclog("IRET to lower level\n");
ESP = oldsp;
x86gpf(NULL,seg&~3);
return;
@@ -2180,7 +2180,7 @@ void pmodeiret(int is32)
case 0x1800: case 0x1900: case 0x1A00: case 0x1B00: /*Non-conforming code*/
if ((seg&3) != DPL)
{
pclog("IRET NC DPL %04X %04X %04X %04X %04X\n", seg, segdat[0], segdat[1], segdat[2], segdat[3]);
// pclog("IRET NC DPL %04X %04X %04X %04X %04X\n", seg, segdat[0], segdat[1], segdat[2], segdat[3]);
ESP = oldsp;
// dumpregs();
// exit(-1);
@@ -2191,14 +2191,14 @@ void pmodeiret(int is32)
case 0x1C00: case 0x1D00: case 0x1E00: case 0x1F00: /*Conforming code*/
if ((seg&3) < DPL)
{
pclog("IRET C DPL\n");
// pclog("IRET C DPL\n");
ESP = oldsp;
x86gpf(NULL,seg&~3);
return;
}
break;
default:
pclog("IRET CS != code seg\n");
// pclog("IRET CS != code seg\n");
ESP = oldsp;
x86gpf(NULL,seg&~3);
// dumpregs();
@@ -2207,7 +2207,7 @@ void pmodeiret(int is32)
}
if (!(segdat[2]&0x8000))
{
pclog("IRET CS not present %i %04X %04X %04X\n",ins, segdat[0], segdat[1], segdat[2]);
// pclog("IRET CS not present %i %04X %04X %04X\n",ins, segdat[0], segdat[1], segdat[2]);
ESP = oldsp;
x86np("IRET CS not present\n", seg & 0xfffc);
return;
@@ -2248,7 +2248,7 @@ void pmodeiret(int is32)
if (!(newss&~3))
{
pclog("IRET loading null SS\n");
// pclog("IRET loading null SS\n");
ESP = oldsp;
x86gpf(NULL,newss&~3);
return;
@@ -2258,7 +2258,7 @@ void pmodeiret(int is32)
{
if (addr>=ldt.limit)
{
pclog("Bigger than LDT limit %04X %04X PMODEIRET SS\n",newss,gdt.limit);
// pclog("Bigger than LDT limit %04X %04X PMODEIRET SS\n",newss,gdt.limit);
ESP = oldsp;
x86gpf(NULL,newss&~3);
return;
@@ -2269,7 +2269,7 @@ void pmodeiret(int is32)
{
if (addr>=gdt.limit)
{
pclog("Bigger than GDT limit %04X %04X PMODEIRET\n",newss,gdt.limit);
// pclog("Bigger than GDT limit %04X %04X PMODEIRET\n",newss,gdt.limit);
ESP = oldsp;
x86gpf(NULL,newss&~3);
return;
@@ -2285,7 +2285,7 @@ void pmodeiret(int is32)
// if (((newss & 3) != DPL) || (DPL2 != DPL))
if ((newss & 3) != (seg & 3))
{
pclog("IRET loading SS with wrong permissions %04X %04X\n", newss, seg);
// pclog("IRET loading SS with wrong permissions %04X %04X\n", newss, seg);
ESP = oldsp;
// dumpregs();
// exit(-1);
@@ -2294,21 +2294,21 @@ void pmodeiret(int is32)
}
if ((segdat2[2]&0x1A00)!=0x1200)
{
pclog("IRET loading SS wrong type\n");
// pclog("IRET loading SS wrong type\n");
ESP = oldsp;
x86gpf(NULL,newss&~3);
return;
}
if (DPL2 != (seg & 3))
{
pclog("IRET loading SS with wrong permissions2 %i %i %04X %04X\n", DPL2, seg & 3, newss, seg);
// pclog("IRET loading SS with wrong permissions2 %i %i %04X %04X\n", DPL2, seg & 3, newss, seg);
ESP = oldsp;
x86gpf(NULL,newss&~3);
return;
}
if (!(segdat2[2]&0x8000))
{
pclog("IRET loading SS not present\n");
// pclog("IRET loading SS not present\n");
ESP = oldsp;
x86np("IRET loading SS not present\n", newss & 0xfffc);
return;
@@ -2483,14 +2483,14 @@ void taskswitch286(uint16_t seg, uint16_t *segdat, int is32)
if (eflags&VM_FLAG)
{
pclog("Task switch V86!\n");
// pclog("Task switch V86!\n");
x86gpf(NULL,0);
return;
}
if (!(new_cs&~3))
{
pclog("TS loading null CS\n");
// pclog("TS loading null CS\n");
x86gpf(NULL,0);
return;
}
@@ -2499,7 +2499,7 @@ void taskswitch286(uint16_t seg, uint16_t *segdat, int is32)
{
if (addr>=ldt.limit)
{
pclog("Bigger than LDT limit %04X %04X %04X TS\n",new_cs,ldt.limit,addr);
// pclog("Bigger than LDT limit %04X %04X %04X TS\n",new_cs,ldt.limit,addr);
x86gpf(NULL,0);
return;
}
@@ -2509,7 +2509,7 @@ void taskswitch286(uint16_t seg, uint16_t *segdat, int is32)
{
if (addr>=gdt.limit)
{
pclog("Bigger than GDT limit %04X %04X TS\n",new_cs,gdt.limit);
// pclog("Bigger than GDT limit %04X %04X TS\n",new_cs,gdt.limit);
x86gpf(NULL,0);
return;
}
@@ -2521,7 +2521,7 @@ void taskswitch286(uint16_t seg, uint16_t *segdat, int is32)
segdat2[3]=readmemw(0,addr+6);
if (!(segdat2[2]&0x8000))
{
pclog("TS loading CS not present\n");
// pclog("TS loading CS not present\n");
x86np("TS loading CS not present\n", new_cs & 0xfffc);
return;
}
@@ -2530,7 +2530,7 @@ void taskswitch286(uint16_t seg, uint16_t *segdat, int is32)
case 0x1800: case 0x1900: case 0x1A00: case 0x1B00: /*Non-conforming*/
if ((new_cs&3) != DPL2)
{
pclog("TS load CS non-conforming RPL != DPL");
// pclog("TS load CS non-conforming RPL != DPL");
x86gpf(NULL,new_cs&~3);
return;
}
@@ -2538,13 +2538,13 @@ void taskswitch286(uint16_t seg, uint16_t *segdat, int is32)
case 0x1C00: case 0x1D00: case 0x1E00: case 0x1F00: /*Conforming*/
if ((new_cs&3) < DPL2)
{
pclog("TS load CS non-conforming RPL < DPL");
// pclog("TS load CS non-conforming RPL < DPL");
x86gpf(NULL,new_cs&~3);
return;
}
break;
default:
pclog("TS load CS not code segment\n");
// pclog("TS load CS not code segment\n");
x86gpf(NULL,new_cs&~3);
return;
}
@@ -2579,7 +2579,7 @@ void taskswitch286(uint16_t seg, uint16_t *segdat, int is32)
}
else
{
pclog("16-bit TSS\n");
// pclog("16-bit TSS\n");
resetx86();
//exit(-1);
}