Make awaitkey() poll once even if the timeout is 0. This also fixes a problem

where a keypress within the last polling interval would not be noticed.
Add a new function, conisshift(), which is used to detect whether a shift key
is pressed.  Use this via awaitkey() to allow interrupting the boot by holding
down shift (similar to LILO).

This allows setting the timeout to 0 and still being able to use the boot
program.
This commit is contained in:
mycroft 2005-01-27 18:20:45 +00:00
parent 9f230230dc
commit 7ecc7a3071
3 changed files with 48 additions and 16 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: conio.S,v 1.2 2003/02/01 14:48:18 dsl Exp $ */
/* $NetBSD: conio.S,v 1.3 2005/01/27 18:20:45 mycroft Exp $ */
/* PC console handling
originally from: FreeBSD:sys/i386/boot/netboot/start2.S
@ -71,7 +71,38 @@ ENTRY(congetc)
ret
/**************************************************************************
ISKEY - Check for keyboard interrupt
ISSHIFT - Check for keyboard interrupt; via shift key
**************************************************************************/
ENTRY(conisshift)
push %ebp
mov %esp,%ebp
push %ebx
push %esi
push %edi
call _C_LABEL(prot_to_real) # enter real mode
.code16
xor %bx,%bx
movb $0x2,%ah
int $0x16
testb $3,%al
setnz %bl
calll _C_LABEL(real_to_prot) # back to protected mode
.code32
xor %eax,%eax
movb %bl,%al
pop %edi
pop %esi
pop %ebx
pop %ebp
ret
/**************************************************************************
ISKEY - Check for keyboard input
**************************************************************************/
ENTRY(coniskey)
push %ebp
@ -86,10 +117,7 @@ ENTRY(coniskey)
xor %bx,%bx
movb $0x1,%ah
int $0x16
movb $0,%bl
jz 1f
incb %bl
1:
setnz %bl
calll _C_LABEL(real_to_prot) # back to protected mode
.code32

View File

@ -1,4 +1,4 @@
/* $NetBSD: libi386.h,v 1.17 2004/08/23 09:41:59 junyoung Exp $ */
/* $NetBSD: libi386.h,v 1.18 2005/01/27 18:20:45 mycroft Exp $ */
/*
* Copyright (c) 1996
@ -64,7 +64,7 @@ void initio(int);
#define CONSDEV_COM2KBD 7
#define CONSDEV_COM3KBD 8
#define CONSDEV_AUTO (-1)
int iskey(void);
int iskey(int);
char awaitkey(int, int);
/* this is in "user code"! */
@ -108,6 +108,7 @@ void cominit(int);
int computc(int, int);
int comstatus(int);
int congetc(void);
int conisshift(void);
int coniskey(void);
void conputc(int);

View File

@ -1,4 +1,4 @@
/* $NetBSD: pcio.c,v 1.18 2004/08/15 22:04:45 dsl Exp $ */
/* $NetBSD: pcio.c,v 1.19 2005/01/27 18:20:45 mycroft Exp $ */
/*
* Copyright (c) 1996, 1997
@ -40,6 +40,7 @@
extern void conputc __P((int));
extern int congetc __P((void));
extern int conisshift __P((void));
extern int coniskey __P((void));
extern struct x86_boot_params boot_params;
@ -282,14 +283,14 @@ getchar()
}
int
iskey()
iskey(int intr)
{
#ifdef SUPPORT_SERIAL
switch (iodev) {
default: /* to make gcc -Wall happy... */
case CONSDEV_PC:
#endif
return (coniskey());
return ((intr && conisshift()) || coniskey());
#ifdef SUPPORT_SERIAL
case CONSDEV_COM0:
case CONSDEV_COM1:
@ -313,7 +314,7 @@ awaitkey(timeout, tell)
i = timeout * POLL_FREQ;
while (i) {
for (;;) {
if (tell && (i % POLL_FREQ) == 0) {
char numbuf[20];
int len, j;
@ -325,16 +326,18 @@ awaitkey(timeout, tell)
numbuf[len + j] = '\0';
printf(numbuf);
}
if (iskey()) {
if (iskey(1)) {
/* flush input buffer */
while (iskey())
while (iskey(0))
c = getchar();
if (c == 0)
c = -1;
goto out;
}
delay(1000000 / POLL_FREQ);
i--;
if (i--)
delay(1000000 / POLL_FREQ);
else
break;
}
out: