At 19:16 14/04/00 -0700, you wrote:
>
>I don't know assembly very well, and I certainly don't know much about
>protected mode stuff, but couldn't you just put a NOP in there instead of
>the prefix?
No, unfortunately not, because the the prefix is necessary for the
emulation. I need to now whether it's supposed to be a 16bit or 32bit
operation.
I can't put it after the instruction either because then it's not unique
whether it belongs to this one or the next one.
>On Fri, 14 Apr 2000, Josef Drexler wrote:
>
>>
>> Hi everybody,
>>
>> I hope this one proves somewhat interesting. First, let me give you a
>> short bit of background history to understand what I'm trying to do.
>>
>> I'm in the process of writing a wrapper for an old game (Ultima VII). This
>> game uses special protected mode instructions which are incompatible with
>> nearly everything else, including in particular any protected mode OS, so
>> I'm trying to replace these instruction and make it possible to run the
>> game under modern hardware. I intended to use Dosemu for testing and
>> debugging, so that I don't have to reboot every time I make a mistake.
>>
>> The way this wrapper will work is by replacing all access beyond real-mode
>> memory, i.e. all those instructions which have the operand-size prefix
>> (0x67) by a software interrupt instruction which will then emulate the
>> protected mode memory. For example, instead of
>> 66 67 8b 1e MOV EBX,[ESI]
>> I would have
>> 66 cd a0 xx INT A0
>>
>> This may look a bit weird, but it is necessary to do what I need to do.
>> The CPU will ignore all prefixes to an int call, and the interrupt handler
>> can then look at them and emulate the instruction accordingly. xx is a
>> special code for interrupt handler determining the exact instruction, and
>> is not executed when returning from the interrupt by manipulating the IP on
>> the stack.
>>
>> So far, so good. It seems to work pretty well in a Windows 95 DOS box as
>> well as in real DOS. However, these are a pain to develop under, and when
>> I try to run this in Dosemu, I get a segmentation violation for all
>> interrupts with a prefix. The unprefixed interrupts, for example in the
>> case where I replace
>> 67 8a 06 MOV AL,[ESI]
>> with
>> cd a0 xx INT A0
>> work fine, but any time there is a prefix, dosemu crashes with a segfault.
>>
>> Now, I understand that this is a pretty unique problem, so I'm very much
>> willing to fix it myself and hopefully supply a patch to the dosemu team,
>> but I've been looking through the source code and tried to understand why
>> or where the crash happens, but unfortunately I didn't get very far. I'm
>> not even sure where exactly I'd have to look.
>>
>> So, does anybody have any idea why this is happening, and what I can do to
>> fix it? Why does a prefixed int xx cause a segfault when a regular one
>> works fine?
>>
>> Oh, and if anybody wants to look at the source code of my wrapper, it's
>> available here: http://publish.uwo.ca/~jdrexler/ultima/u7patch/ . It's
>> written in Borland C++ 3.1. (I can't use DJGPP because it has to be real
>> mode.) You'd also need Ultima VII to test it, though.
>>
>> I would welcome and very much appreciate any help I could get on this.
>> Ultima VII is considered by many to be a classic, and it's a shame that you
>> have to jump through hoops to make it run on today's hardware. But
>> developing the wrapper under Win95 is tedious. I'd much prefer if I could
>> use dosemu under Linux, then I wouldn't have to reboot every few minutes...
>>
>> Thanks again for reading this and for all comments you can give.
>>
>>
>> --
>> Josef Drexler ([EMAIL PROTECTED])
>> http://publish.uwo.ca/~jdrexler/
>>
>
--
Josef Drexler ([EMAIL PROTECTED])
http://publish.uwo.ca/~jdrexler/