X-Authentication-Warning: delorie.com: mail set sender to djgpp-bounces using -f X-Recipient: djgpp AT delorie DOT com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :content-type; bh=LPCrfZJjPTIv1cWc+CxrayLx72V+Olomxne1X2tOSos=; b=QWYaqk1UO7fayhV4dtkD50n++egQ4L1+y8lE+MVkf93TnZO3ENYiIF87hwk1KZuZwH x6/beCZD7fVERSJfYq4RLN0DGAbC0i4mWguNRJG6Q1JA7zOcnT6vKE6+KEbF9pCyUVfX rqw386EXpkxZeBP8+W7mSgcU/qxHLC17DPSCc0GUcNEeliN4SF0n7EFoNJ+BNw7JYzOe jXhMuOJoR95axcKmSme1Mb1qoU/6rRS3JyNSy2WA/GEFRdKAxeV1v/Z+uOGEopH8Zg4C NPsSomMnufgwEdsEpL1dSc9tbgSpRYI8URMflyjLctQtmk793PYyJIXfes/PEeLIKQhA g/mQ== MIME-Version: 1.0 X-Received: by 10.52.0.177 with SMTP id 17mr43250773vdf.12.1405085992552; Fri, 11 Jul 2014 06:39:52 -0700 (PDT) In-Reply-To: <53bfdd29$0$3638$426a74cc@news.free.fr> References: <53bfa273$0$1981$426a74cc AT news DOT free DOT fr> <53bfdd29$0$3638$426a74cc AT news DOT free DOT fr> Date: Fri, 11 Jul 2014 06:39:52 -0700 Message-ID: Subject: Re: Using outportb() with djgpp From: Louis Santillan To: "djgpp AT delorie DOT com" Content-Type: multipart/alternative; boundary=047d7b86e4f277114204fdeb1345 Reply-To: djgpp AT delorie DOT com Errors-To: nobody AT delorie DOT com X-Mailing-List: djgpp AT delorie DOT com X-Unsubscribes-To: listserv AT delorie DOT com Precedence: bulk --047d7b86e4f277114204fdeb1345 Content-Type: text/plain; charset=UTF-8 There's lots of docs for catching ints [1][2][3][4]. It is more complex than real mode but so it goes. [1] http://www.delorie.com/djgpp/v2faq/faq18_9.html [2] http://www.ee.nmt.edu/~rison/ee352_spr00/supp/000128/timer_int.html [3] http://www.delorie.com/djgpp/doc/ug/interrupts/hwirqs.html [4] http://geezer.osdevbrasil.net/osd/intr/dos-32.c On Fri, Jul 11, 2014 at 5:48 AM, Mateusz Viste wrote: > I have to admit I had no occasion yet to play with interrupts in DOS > (other that from a user point of view). What you write sounds very > convincing. And I have read in some MPU401 documentation that it is likely > to emit INT 9 at some occasions. > > For a test, I tried to handle the INT 9 with a "do nothing" function in > Turbo C, and now when my program ends, I have no keyboard anymore (ie. I > can press keys, but no reaction happens at all). :) Haven't tried to catch > the interrupt in protected mode yet, as it looks somewhat complex > (according to the DJGPP docs) - way more convoluted than doing it in real > mode at least. > > In any case, thanks for the hint! I will try to play with interrupts this > weekend and see what happens. > > cheers, > Mateusz > > > > > > On 07/11/2014 01:50 PM, Johann Klammer wrote: > >> On 07/11/2014 10:38 AM, Mateusz Viste wrote: >> >>> Hi, >>> >>> Thank you all for your kind replies. >>> >>> The "weird interrupt happening during I/O" sounded sexy enough that I >>> had to test it out immediately - I replaced all my inportb() and >>> outportb() calls with a function that first call disable(), then do the >>> in/out operation, and then call enable() if interrupts were enabled >>> before. Unfortunately this doesn't changed my problem - my PC still >>> reboots wildly on random i/o operations on the 0x330 port. >>> >>> Some context: I am trying to play a few notes on my Sound Blaster 64 >>> (ISA) card using its embedded MPU401 synth controller. It works pretty >>> well when compiled in realmode with Turbo C 2.0.1, but then I am having >>> a bit of hard time with memory management (64K limit et all), so I >>> thought I'd recompile it under DJGPP. And then I experienced those wild >>> reboots I was writing before. Interestingly enough, the protected mode >>> version works fine on DOSBox. >>> >>> Of course I am aware that such 'bug report' is good for nothing - I was >>> just wondering whether there is some top secret information about doing >>> I/O calls from protected mode that I ignored, but I understand now that >>> there is nothing specific to do in protected mode (or at least nothing >>> much else than in real mode), so I will try to put together some >>> minimalistic test program to reproduce the problem on the smallest >>> possible example, and then I'll see where it leads me (might get back to >>> you then). >>> >>> Again, thanks for all your prompt replies! >>> >>> cheers, >>> Mateusz >>> >>> >>> If the interrupt flag gets set, it stays set until after the interrupts >> get re-enabled, at which point the interrupt will run and crash your >> system, unless there's a handler there and not just garbage, or a >> default, probably installed by the dos extender/C run-time, which >> probably restarts your system. So, just disable/enable will not solve >> your problem. >> With dos extenders the interrupt is typically forwarded to a PM handler >> (if installed), You should try that (install a handler) and write a byte >> to the text segment, to see if anything is happening.. >> There's probably a dos_setvect() or something... >> There is probably a control bit somewhere on your MPU port range to >> disable interrupt generation from that specific source. You can try >> that, too. >> >> > --047d7b86e4f277114204fdeb1345 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable


On Fri, Jul 11, 2014 at 5:= 48 AM, Mateusz Viste <mateusz DOT viste AT delorie DOT com> wro= te:
I have to admit I had no occasion yet to pla= y with interrupts in DOS (other that from a user point of view). What you w= rite sounds very convincing. And I have read in some MPU401 documentation t= hat it is likely to emit INT 9 at some occasions.

For a test, I tried to handle the INT 9 with a "do nothing" funct= ion in Turbo C, and now when my program ends, I have no keyboard anymore (i= e. I can press keys, but no reaction happens at all). :) Haven't tried = to catch the interrupt in protected mode yet, as it looks somewhat complex = (according to the DJGPP docs) - way more convoluted than doing it in real m= ode at least.

In any case, thanks for the hint! I will try to play with interrupts this w= eekend and see what happens.

cheers,
Mateusz





On 07/11/2014 01:50 PM, Johann Klammer wrote:
On 07/11/2014 10:38 AM, Mateusz Viste wrote:
Hi,

Thank you all for your kind replies.

The "weird interrupt happening during I/O" sounded sexy enough th= at I
had to test it out immediately - I replaced all my inportb() and
outportb() calls with a function that first call disable(), then do the
in/out operation, and then call enable() if interrupts were enabled
before. Unfortunately this doesn't changed my problem - my PC still
reboots wildly on random i/o operations on the 0x330 port.

Some context: I am trying to play a few notes on my Sound Blaster 64
(ISA) card using its embedded MPU401 synth controller. It works pretty
well when compiled in realmode with Turbo C 2.0.1, but then I am having
a bit of hard time with memory management (64K limit et all), so I
thought I'd recompile it under DJGPP. And then I experienced those wild=
reboots I was writing before. Interestingly enough, the protected mode
version works fine on DOSBox.

Of course I am aware that such 'bug report' is good for nothing - I= was
just wondering whether there is some top secret information about doing
I/O calls from protected mode that I ignored, but I understand now that
there is nothing specific to do in protected mode (or at least nothing
much else than in real mode), so I will try to put together some
minimalistic test program to reproduce the problem on the smallest
possible example, and then I'll see where it leads me (might get back t= o
you then).

Again, thanks for all your prompt replies!

cheers,
Mateusz


If the interrupt flag gets set, it stays set until after the interrupts
get re-enabled, at which point the interrupt will run and crash your
system, unless there's a handler there and not just garbage, or a
default, probably installed by the dos extender/C run-time, which
probably restarts your system. So, just disable/enable will not solve
your problem.
With dos extenders the interrupt is typically forwarded to a PM handler
(if installed), You should try that (install a handler) and write a byte to the text segment, to see if anything is happening..
There's probably a dos_setvect() or something...
There is probably a control bit somewhere on your MPU port range to
disable interrupt generation from that specific source. You can try
that, too.



--047d7b86e4f277114204fdeb1345--