summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author cracyc <cracyc@users.noreply.github.com>2018-02-02 23:01:40 -0600
committer cracyc <cracyc@users.noreply.github.com>2018-02-02 23:01:40 -0600
commit649c169c2ffb5daa68925114fce0d6d1159d61c0 (patch)
treec35f421eef6b39829a37b7679b2d0bc752dd4c39 /src
parent857a8dc63cd2ef68c23dc71a4353ae60a3d20b71 (diff)
i386/i286: fix default cs flags (nw)
d88_dsk: support bad crc (nw) recreate columns copy protection (nw)
Diffstat (limited to 'src')
-rw-r--r--src/devices/cpu/i386/i386.cpp47
-rw-r--r--src/devices/cpu/i86/i286.cpp6
-rw-r--r--src/lib/formats/d88_dsk.cpp2
3 files changed, 30 insertions, 25 deletions
diff --git a/src/devices/cpu/i386/i386.cpp b/src/devices/cpu/i386/i386.cpp
index 4c5d018f57d..66760a6d890 100644
--- a/src/devices/cpu/i386/i386.cpp
+++ b/src/devices/cpu/i386/i386.cpp
@@ -269,8 +269,13 @@ void i386_device::i386_load_segment_descriptor(int segment )
m_sreg[segment].d = 0;
m_sreg[segment].valid = true;
- if( segment == CS && !m_performed_intersegment_jump )
- m_sreg[segment].base |= 0xfff00000;
+ if( segment == CS )
+ {
+ if( !m_performed_intersegment_jump )
+ m_sreg[segment].base |= 0xfff00000;
+ if(m_cpu_version < 0x5000)
+ m_sreg[segment].flags = 0x93;
+ }
}
}
@@ -3739,12 +3744,12 @@ void i386_device::device_reset()
m_sreg[CS].selector = 0xf000;
m_sreg[CS].base = 0xffff0000;
m_sreg[CS].limit = 0xffff;
- m_sreg[CS].flags = 0x9b;
+ m_sreg[CS].flags = 0x93;
m_sreg[CS].valid = true;
m_sreg[DS].base = m_sreg[ES].base = m_sreg[FS].base = m_sreg[GS].base = m_sreg[SS].base = 0x00000000;
m_sreg[DS].limit = m_sreg[ES].limit = m_sreg[FS].limit = m_sreg[GS].limit = m_sreg[SS].limit = 0xffff;
- m_sreg[DS].flags = m_sreg[ES].flags = m_sreg[FS].flags = m_sreg[GS].flags = m_sreg[SS].flags = 0x0092;
+ m_sreg[DS].flags = m_sreg[ES].flags = m_sreg[FS].flags = m_sreg[GS].flags = m_sreg[SS].flags = 0x0093;
m_sreg[DS].valid = m_sreg[ES].valid = m_sreg[FS].valid = m_sreg[GS].valid = m_sreg[SS].valid =true;
m_idtr.base = 0;
@@ -3854,7 +3859,7 @@ void i386_device::pentium_smi()
m_sreg[CS].selector = 0x3000; // pentium only, ppro sel = smbase >> 4
m_sreg[CS].base = m_smbase;
m_sreg[CS].limit = 0xffffffff;
- m_sreg[CS].flags = 0x809b;
+ m_sreg[CS].flags = 0x8093;
m_sreg[CS].valid = true;
m_cr[4] = 0;
m_dr[7] = 0x400;
@@ -4035,11 +4040,11 @@ void i486_device::device_reset()
m_sreg[CS].selector = 0xf000;
m_sreg[CS].base = 0xffff0000;
m_sreg[CS].limit = 0xffff;
- m_sreg[CS].flags = 0x009b;
+ m_sreg[CS].flags = 0x0093;
m_sreg[DS].base = m_sreg[ES].base = m_sreg[FS].base = m_sreg[GS].base = m_sreg[SS].base = 0x00000000;
m_sreg[DS].limit = m_sreg[ES].limit = m_sreg[FS].limit = m_sreg[GS].limit = m_sreg[SS].limit = 0xffff;
- m_sreg[DS].flags = m_sreg[ES].flags = m_sreg[FS].flags = m_sreg[GS].flags = m_sreg[SS].flags = 0x0092;
+ m_sreg[DS].flags = m_sreg[ES].flags = m_sreg[FS].flags = m_sreg[GS].flags = m_sreg[SS].flags = 0x0093;
m_idtr.base = 0;
m_idtr.limit = 0x3ff;
@@ -4101,11 +4106,11 @@ void pentium_device::device_reset()
m_sreg[CS].selector = 0xf000;
m_sreg[CS].base = 0xffff0000;
m_sreg[CS].limit = 0xffff;
- m_sreg[CS].flags = 0x009b;
+ m_sreg[CS].flags = 0x0093;
m_sreg[DS].base = m_sreg[ES].base = m_sreg[FS].base = m_sreg[GS].base = m_sreg[SS].base = 0x00000000;
m_sreg[DS].limit = m_sreg[ES].limit = m_sreg[FS].limit = m_sreg[GS].limit = m_sreg[SS].limit = 0xffff;
- m_sreg[DS].flags = m_sreg[ES].flags = m_sreg[FS].flags = m_sreg[GS].flags = m_sreg[SS].flags = 0x0092;
+ m_sreg[DS].flags = m_sreg[ES].flags = m_sreg[FS].flags = m_sreg[GS].flags = m_sreg[SS].flags = 0x0093;
m_idtr.base = 0;
m_idtr.limit = 0x3ff;
@@ -4173,11 +4178,11 @@ void mediagx_device::device_reset()
m_sreg[CS].selector = 0xf000;
m_sreg[CS].base = 0xffff0000;
m_sreg[CS].limit = 0xffff;
- m_sreg[CS].flags = 0x009b;
+ m_sreg[CS].flags = 0x0093;
m_sreg[DS].base = m_sreg[ES].base = m_sreg[FS].base = m_sreg[GS].base = m_sreg[SS].base = 0x00000000;
m_sreg[DS].limit = m_sreg[ES].limit = m_sreg[FS].limit = m_sreg[GS].limit = m_sreg[SS].limit = 0xffff;
- m_sreg[DS].flags = m_sreg[ES].flags = m_sreg[FS].flags = m_sreg[GS].flags = m_sreg[SS].flags = 0x0092;
+ m_sreg[DS].flags = m_sreg[ES].flags = m_sreg[FS].flags = m_sreg[GS].flags = m_sreg[SS].flags = 0x0093;
m_idtr.base = 0;
m_idtr.limit = 0x3ff;
@@ -4236,11 +4241,11 @@ void pentium_pro_device::device_reset()
m_sreg[CS].selector = 0xf000;
m_sreg[CS].base = 0xffff0000;
m_sreg[CS].limit = 0xffff;
- m_sreg[CS].flags = 0x009b;
+ m_sreg[CS].flags = 0x0093;
m_sreg[DS].base = m_sreg[ES].base = m_sreg[FS].base = m_sreg[GS].base = m_sreg[SS].base = 0x00000000;
m_sreg[DS].limit = m_sreg[ES].limit = m_sreg[FS].limit = m_sreg[GS].limit = m_sreg[SS].limit = 0xffff;
- m_sreg[DS].flags = m_sreg[ES].flags = m_sreg[FS].flags = m_sreg[GS].flags = m_sreg[SS].flags = 0x0092;
+ m_sreg[DS].flags = m_sreg[ES].flags = m_sreg[FS].flags = m_sreg[GS].flags = m_sreg[SS].flags = 0x0093;
m_idtr.base = 0;
m_idtr.limit = 0x3ff;
@@ -4309,11 +4314,11 @@ void pentium_mmx_device::device_reset()
m_sreg[CS].selector = 0xf000;
m_sreg[CS].base = 0xffff0000;
m_sreg[CS].limit = 0xffff;
- m_sreg[CS].flags = 0x009b;
+ m_sreg[CS].flags = 0x0093;
m_sreg[DS].base = m_sreg[ES].base = m_sreg[FS].base = m_sreg[GS].base = m_sreg[SS].base = 0x00000000;
m_sreg[DS].limit = m_sreg[ES].limit = m_sreg[FS].limit = m_sreg[GS].limit = m_sreg[SS].limit = 0xffff;
- m_sreg[DS].flags = m_sreg[ES].flags = m_sreg[FS].flags = m_sreg[GS].flags = m_sreg[SS].flags = 0x0092;
+ m_sreg[DS].flags = m_sreg[ES].flags = m_sreg[FS].flags = m_sreg[GS].flags = m_sreg[SS].flags = 0x0093;
m_idtr.base = 0;
m_idtr.limit = 0x3ff;
@@ -4380,11 +4385,11 @@ void pentium2_device::device_reset()
m_sreg[CS].selector = 0xf000;
m_sreg[CS].base = 0xffff0000;
m_sreg[CS].limit = 0xffff;
- m_sreg[CS].flags = 0x009b;
+ m_sreg[CS].flags = 0x0093;
m_sreg[DS].base = m_sreg[ES].base = m_sreg[FS].base = m_sreg[GS].base = m_sreg[SS].base = 0x00000000;
m_sreg[DS].limit = m_sreg[ES].limit = m_sreg[FS].limit = m_sreg[GS].limit = m_sreg[SS].limit = 0xffff;
- m_sreg[DS].flags = m_sreg[ES].flags = m_sreg[FS].flags = m_sreg[GS].flags = m_sreg[SS].flags = 0x0092;
+ m_sreg[DS].flags = m_sreg[ES].flags = m_sreg[FS].flags = m_sreg[GS].flags = m_sreg[SS].flags = 0x0093;
m_idtr.base = 0;
m_idtr.limit = 0x3ff;
@@ -4445,11 +4450,11 @@ void pentium3_device::device_reset()
m_sreg[CS].selector = 0xf000;
m_sreg[CS].base = 0xffff0000;
m_sreg[CS].limit = 0xffff;
- m_sreg[CS].flags = 0x009b;
+ m_sreg[CS].flags = 0x0093;
m_sreg[DS].base = m_sreg[ES].base = m_sreg[FS].base = m_sreg[GS].base = m_sreg[SS].base = 0x00000000;
m_sreg[DS].limit = m_sreg[ES].limit = m_sreg[FS].limit = m_sreg[GS].limit = m_sreg[SS].limit = 0xffff;
- m_sreg[DS].flags = m_sreg[ES].flags = m_sreg[FS].flags = m_sreg[GS].flags = m_sreg[SS].flags = 0x0092;
+ m_sreg[DS].flags = m_sreg[ES].flags = m_sreg[FS].flags = m_sreg[GS].flags = m_sreg[SS].flags = 0x0093;
m_idtr.base = 0;
m_idtr.limit = 0x3ff;
@@ -4512,11 +4517,11 @@ void pentium4_device::device_reset()
m_sreg[CS].selector = 0xf000;
m_sreg[CS].base = 0xffff0000;
m_sreg[CS].limit = 0xffff;
- m_sreg[CS].flags = 0x009b;
+ m_sreg[CS].flags = 0x0093;
m_sreg[DS].base = m_sreg[ES].base = m_sreg[FS].base = m_sreg[GS].base = m_sreg[SS].base = 0x00000000;
m_sreg[DS].limit = m_sreg[ES].limit = m_sreg[FS].limit = m_sreg[GS].limit = m_sreg[SS].limit = 0xffff;
- m_sreg[DS].flags = m_sreg[ES].flags = m_sreg[FS].flags = m_sreg[GS].flags = m_sreg[SS].flags = 0x0092;
+ m_sreg[DS].flags = m_sreg[ES].flags = m_sreg[FS].flags = m_sreg[GS].flags = m_sreg[SS].flags = 0x0093;
m_idtr.base = 0;
m_idtr.limit = 0x3ff;
diff --git a/src/devices/cpu/i86/i286.cpp b/src/devices/cpu/i86/i286.cpp
index e3eeca0d53b..3fced358577 100644
--- a/src/devices/cpu/i86/i286.cpp
+++ b/src/devices/cpu/i86/i286.cpp
@@ -204,7 +204,7 @@ void i80286_cpu_device::device_reset()
m_sregs[DS] = m_sregs[SS] = m_sregs[ES] = 0;
m_base[DS] = m_base[SS] = m_base[ES] = 0;
m_rights[DS] = m_rights[SS] = m_rights[ES] = 0x93;
- m_rights[CS] = 0x9b;
+ m_rights[CS] = 0x93;
m_valid[CS] = m_valid[SS] = m_valid[DS] = m_valid[ES] = true;
m_idtr.base = 0;
m_idtr.limit = 0x3ff;
@@ -866,7 +866,7 @@ void i80286_cpu_device::code_descriptor(uint16_t selector, uint16_t offset, int
m_ip = offset;
m_sregs[CS]=selector;
m_base[CS]=selector<<4;
- m_rights[CS]=0x9b;
+ m_rights[CS]=0x93;
m_limit[CS]=0xffff;
}
}
@@ -2021,7 +2021,7 @@ uint16_t i80286_cpu_device::far_return(int iret, int bytes)
m_regs.w[SP] += (iret ? 6 : 4) + bytes;
m_sregs[CS] = sel;
m_base[CS] = sel << 4;
- m_rights[CS] = 0x9b;
+ m_rights[CS] = 0x93;
m_limit[CS] = 0xffff;
m_ip = off;
}
diff --git a/src/lib/formats/d88_dsk.cpp b/src/lib/formats/d88_dsk.cpp
index 1f999882aed..c2bf9772e7d 100644
--- a/src/lib/formats/d88_dsk.cpp
+++ b/src/lib/formats/d88_dsk.cpp
@@ -517,7 +517,7 @@ bool d88_format::load(io_generic *io, uint32_t form_factor, floppy_image *image)
sects[i].size = hs[3];
sects[i].actual_size = size;
sects[i].deleted = hs[7] != 0;
- sects[i].bad_crc = false;
+ sects[i].bad_crc = hs[8] == 0xb0; // according to hxc
if(size) {
sects[i].data = sect_data + sdatapos;