Xref: news-dnh.mv.net comp.os.msdos.djgpp:1070 Newsgroups: comp.os.msdos.djgpp Path: news-dnh.mv.net!mv!news.sprintlink.net!cs.utexas.edu!swrinde!howland.reston.ans.net!news-e1a.megaweb.com!newstf01.news.aol.com!uunet!in2.uu.net!psinntp!psinntp!psinntp!psinntp!netrixgw.netrix.com!jasmine!ld From: ld AT jasmine DOT netrix DOT com (Long Doan) Subject: Re: [Q] Inline functions -- trying to do far call To: kenfoo AT techm DOT pl DOT my (Kenneth Foo) Sender: ld AT jasmine (Long Doan) Reply-To: ld AT netrix DOT com Organization: Netrix Corporation References: <806316619 DOT 115snx AT techm DOT pl DOT my> Date: Fri, 21 Jul 1995 21:11:03 GMT Lines: 84 Dj-Gateway: from newsgroup comp.os.msdos.djgpp There are a few things that you should do: 1. If the function that you jumps to is written for protected mode (i.e. It uses 32 bits push/ret, etc.), then it should be easiest to jump to that code. Ex: void FarCallJump (int sel, int off) /* This is *MUCH* easier than to * worry about the struct */ { asm ("movl $L_f_cal1l, %ecx \n\ movb $0xea, (%ecx) \n\ movl 8(%ebp), %edx \n\ movw %dx, 5(%ecx) \n\ movl 12(%ebp), %edx \n\ movl %edx, 1(%ecx) \n\ movl %ebp, %esp \n\ /* Trash our stack frame */ popl %ebp \n\ popl %eax \n\ /* Return address */ pushl %eflag \n\ /* Make it looks like */ pushl %eax \n\ /* an interrupt */ L_f_call1: \n\ /* Jump instruction */ nop \n\ nop \n\ nop \n\ nop \n\ nop \n\ nop \n\ nop \n\ "); } void FarCall (__dpmi_paddr *SelectorOffset32) { FarCallJump (SelectorOffset32->sel, SelectorOffset32->off); } 2. If the code is real-mode code, use the simulate_int functions. 3. Is it really necessary to call a function to simulate an interrupt? Maybe you can get away from it be using 'int' istructions. Hope that helps, Long. In article <806316619 DOT 115snx AT techm DOT pl DOT my>, kenfoo AT techm DOT pl DOT my (Kenneth Foo) writes: |> Concerning DJGPP 2... |> |> I need something like this.. |> |> __dpmi_paddr SelectorOffset32; |> |> DoINT(SelectorOffset32); |> //Simulate an interrupt by calling SelectorOffset32 (contains |> //a selector:offset32 pair). |> |> However, I can't seem to do it (through inline assembly). |> |> The assembly code is 'roughly' like this (not exact, because I really don't |> fully understand writing inline assembly code). |> |> inline void FarCall(__dpmi_paddr *SelectorOffset32) { |> asm(" |> pushf |> lcall (_SelectorOffset32) //I'm not sure how to put this. |> ) |> : |> : "m" SelectorOffset32 //Or this. :) |> :" |> } |> |> |> I'm really very unsure about that inline assembly code there. DJGPP 2 |> probably gave some big errors. (ugh!). |> |> Thanks for any help! |> |> |> PS: The reason for this is because I need to chain an original interrupt |> after hooking to it. I can't use _go32_chain_protected_mode_interrupt |> for some internal reasons. (I'm hooking to int 8h, and changing |> its speed). |> -- |> []----------------------------------------------------------[] |> | Kenneth Foo Here's the question of the year: | |> | kenfoo AT techm DOT pl DOT my Why do brains look like intestines? | |> []----------------------------------------------------------[] |>