diff options
author | 2018-02-02 23:01:40 -0600 | |
---|---|---|
committer | 2018-02-02 23:01:40 -0600 | |
commit | 649c169c2ffb5daa68925114fce0d6d1159d61c0 (patch) | |
tree | c35f421eef6b39829a37b7679b2d0bc752dd4c39 | |
parent | 857a8dc63cd2ef68c23dc71a4353ae60a3d20b71 (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.xml | 10 | ||||
-rw-r--r-- | src/devices/cpu/i386/i386.cpp | 47 | ||||
-rw-r--r-- | src/devices/cpu/i86/i286.cpp | 6 | ||||
-rw-r--r-- | src/lib/formats/d88_dsk.cpp | 2 |
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; |