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?
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/
>