summaryrefslogtreecommitdiffstatshomepage
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
parent857a8dc63cd2ef68c23dc71a4353ae60a3d20b71 (diff)
i386/i286: fix default cs flags (nw)
d88_dsk: support bad crc (nw) recreate columns copy protection (nw)
-rw-r--r--hash/fmtowns_flop.xml10
-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
4 files changed, 35 insertions, 30 deletions
diff --git a/hash/fmtowns_flop.xml b/hash/fmtowns_flop.xml
index 76dc17f6bcf..b77df7b72bc 100644
--- a/hash/fmtowns_flop.xml
+++ b/hash/fmtowns_flop.xml
@@ -517,7 +517,7 @@ Zurukamashi Ver 2.0 Nikkonren Kikaku
<publisher>日本ファルコム (Nihon Falcom)</publisher>
<info name="release" value="199112xx" />
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1261568">
+ <dataarea name="flop" size="1282688">
<rom name="brandish (disk 1).d88" size="1282688" crc="f97219d3" sha1="4b416caf3426b6673bada95c02f49ab8c7606689" offset="0" status="baddump" />
</dataarea>
</part>
@@ -533,15 +533,15 @@ Zurukamashi Ver 2.0 Nikkonren Kikaku
</part>
</software>
- <!-- Triggers copy protection -->
- <software name="columns" supported="no">
+ <!-- Recreated protection by hand -->
+ <software name="columns">
<description>Columns</description>
<year>1990</year>
<publisher>日本テレネット (Nihon Telenet)</publisher>
<info name="release" value="199012xx" />
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1261568">
- <rom name="columns.hdm" size="1261568" crc="4ad9c624" sha1="8fc4fc56767c94864e8aceb2ae77a23cf5781e74" offset="0" />
+ <dataarea name="flop" size="1282512">
+ <rom name="columns.d88" size="1282512" crc="ee75f23b" sha1="a6f5593b2ad2b763455784d403fa50ec4f8f64c5" offset="0" status="baddump" />
</dataarea>
</part>
</software>
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;