www.delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/2000/04/09/22:44:39

From: bk039 AT freenet DOT carleton DOT ca (Raymond Martineau)
Newsgroups: comp.os.msdos.djgpp
Subject: Re: Keyboard Lockups
Date: Mon, 10 Apr 2000 02:02:43 GMT
Organization: National Capital Freenet, Ottawa, Ontario, Canada
Lines: 151
Sender: bk039 AT freenet DOT carleton DOT ca (Raymond Martineau)
Message-ID: <38f1240c.818034@news.ncf.carleton.ca>
References: <38ed529d DOT 3367074 AT news DOT ncf DOT carleton DOT ca> <38ED9D75 DOT 13827ACF AT is DOT elta DOT co DOT il>
NNTP-Posting-Host: p6t4.web.dialup.ncf.carleton.ca
X-Trace: freenet9.carleton.ca 955332934 18419 134.117.137.229 (10 Apr 2000 02:15:34 GMT)
X-Complaints-To: complaints AT ncf DOT ca
NNTP-Posting-Date: 10 Apr 2000 02:15:34 GMT
X-Newsreader: Forte Free Agent 1.11/32.235
X-Given-From: bk039 AT freenet DOT carleton DOT ca (Raymond Martineau)
To: djgpp AT delorie DOT com
DJ-Gateway: from newsgroup comp.os.msdos.djgpp
Reply-To: djgpp AT delorie DOT com

On Fri, 07 Apr 2000 10:33:57 +0200, Eli Zaretskii <eliz AT is DOT elta DOT co DOT il>
wrote:

>Raymond Martineau wrote:
>> 
>>
>> Under MS-DOS 7.0 (Windows 95 in Dos mode), I encounter keyboard
>> lockups when I quit a program compiled by a recent version of DJGPP.
>> When I either press or release a key during a split second window of
>> the program terminating, the keyboard completely locks up, and does
>> not respond.
>
>I have never seen such problems, and neither did anyone else complained about
>this, ever.
>
>If this phenomenon happens only in certain program(s) (as opposed to _all_
>DJGPP programs, including those you download from SimTel), I'd first suspect
>some subtle bug in the program.

From my testing with the bug, the smallest program size it could be
reproduced in is a medium sized program.  One program in particular,
called QCCX (available at http://elohim.ai.mit.edu/qccx/) does not
have any visible code that hooks interrupts, and contains the problems
existing when compiled with GCC. 

This bug also seems to be introduced in a later version of DJGPP.  If
you compile Quake version 1.09, the problem may exist, but the
official binaries for version 1.08 (or any earlier version) do not
contain this problem.  

>So please describe what does the affected program(s) do when they exit.  For
>that matter, please describe the procedure to reproduce the problem (pressing
>a key during a split second sounds pretty tricky, especially on fast
>machines).

Except for the keyboard lock-up, the program will exit normally as if
the problem is not occurring.  The computer itself does not freeze,
since I managed to load the program again while the keyboard was
frozen, and have the parent program (attached to this posting, QBASIC
source) fix the keyboard.

If you use Ctrl-C or Ctrl-Break to stop the program, you will receive
the standard response if the keyboard locks up (which is just a simple
register dump, which is independant of the problem.)

>
>Also, please elaborate what do you mean by ``Windows 95 in DOS mode''.  Do
>you boot into plain DOS mode, without loading the GUI part of Windows, or do
>you switch to DOS Mode *from inside* Windows.  Or maybe you run the program
>from the Windows DOS box?

Windows 95 in Dos mode is booting into Plain dos mode before the GUI
is loaded.  Loading the GUI and opening a Dos window is not the same
as the environment, since it contains a protection system that
prevents the lock-up from occurring.

Anyway, I have a small Qbasic program that makes it easier to
reproduce this problem.  I have only reproduced this on two out of
three computers I tested (The two were pentium class machines, the
third was a 486.) This program is designed to be used with two
specific programs: QCCX and Proqcc (available at
http://elohim.ai.mit.edu/qccx/ and
ftp://ftp.cdrom.com/pub/quake/utils/quakec/proqc160.zip respectivly.
Both are <110K downloads.)


' keyfix.bas by Raymond Martineau
'
' This program is designed to demonstrate and fix a keyboard lockup
' problem found in DJGPP.  For this lockup to occurr, you must be in
' Full-Dos.  You will not reproduce the problem if you are running 
' Windows 95, since Windows 95 is capable of avoiding such problems by
' keeping control of the Keyboard Interrupt. 
'
' This program requires Qbasic.  If you do not have Qbasic, comments
' have been placed in this program to help interpret the activity.
'
' A good chance of reproducing the problem is to either type rapidly 
' when the program is quitting, or by quickly hitting and releasing
' Ctrl-C. You may need to vary the speed slightly to get the desired
 ' result.

DEFINT A-Z
DIM a AS SINGLE
PRINT "Running program"

' The first loop will make ten passes at running the program.  These
' ten passes make it fairly easy to reproduce the error, but 
' reproducing the problem early will cause you to wait some time.

' The program in this loop is Qccx, a quake-c compiler, is available
' at http://elohim.ai.mit.edu/qccx/
'
' You may also use Proqcc, where the keyboard lockup is slightly 
' easier to reprocuce by pressing Ctrl-C.  Proqcc is located at
' ftp://ftp.cdrom.com/pub/quake/utils/quakec/proqc160.zip
'
' You will need source code for these compilers.  You can have them
' compile the Threewave CTF which is available at
'
ftp://ftp.cdrom.com/pub/quake/planetquake/threewave/ctf/server/3wave41.zip

FOR x = 1 TO 10
        SHELL "qccx.exe"
NEXT

' This section will check if the keyboard is working.
PRINT "Press a key"
a = TIMER
WHILE (TIMER - a < 10 AND fl = 0)
        b$ = INKEY$: IF b$ <> "" THEN PRINT b$: fl = 1
WEND
IF fl = 0 THEN
 PRINT "Fixing keyboard"
 ' Since the keyboard is not working, it needs to be fixed.
 ' This section of the code tells the keyboard that the key has
 ' just been read.  The keyboard will no longer worry about the
 ' the current event, and proceed to the next one.

 al = INP(&H60)
 al = INP(&H61)
 al = al OR &H80
 OUT &H61, al
 al = al AND &H7F
 OUT &H61, al
 OUT &H20, &H20
 'The DJGPP equivalany for the above procedure is the following:
 ' int a;
 ' a=inportb(0x60);
 ' a=inportb(0x61) | 0x80;
 ' outportb(0x61,a);
 ' outportb(0x6a,a & 0x7f);
 ' outportb(0x20, 0x20);
 PRINT "Press a key"
 a! = TIMER
 ' Make another attempt.  If it fails, it is probably due to a
 ' non-standard keyboard, or for some other reason.
 WHILE (TIMER - a < 10 AND fl = 0)
         b$ = INKEY$: IF b$ <> "" THEN PRINT b$: fl = 1
 WEND
 IF fl = 0 THEN PRINT "Keyboard is jammed. Sorry."
END IF


 



--
Raymond Martineau - dynamo_tamarin AT yahoo DOT com
Frik-TF 0.09 Beta 2: http://www.ncf.ca/~bk039/index.htm

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019