{
 > I'm glad this was brought up.  I recently made a simple program (in
 > assembly, hope I'm not being off-topic here) that would continually
 > change the status of each LED on the keyboard.  I noticed that the
 > LED's would not actually change unless the program ended or I
 > continually pressed keys down, and I eventually had to call a check
 > for keypress interupt to get it to work properly.  Why exactly was
 > this necessary?

I'm sorry, but right now I don't have time to see that. Here goes a
program that does that kind of stuff: }

program keyboard;
uses crt;
const bit:array[0..7] of byte=(1,2,4,8,16,32,64,128);
var tec: byte absolute $40:$17;
    tec1:byte absolute $40:$18;
    tec2:byte absolute $40:$96;
begin
     clrscr;
     textcolor(15);
     write('                                  TECLAS ACTIVAS');
     gotoxy(1,3);
     write('                   ScrollLock  NumLock  CapsLock  Insert       ');
     gotoxy(1,7);
     write('                                  TECLAS PREMIDAS');
     gotoxy(1,9);
     write('RightAlt  LeftAlt  RightCtrl  LeftCtrl  RightShift  LeftShift  Ins Caps  Num');
     gotoxy(1,12);
     write('Scroll  SysReq');
     repeat
           if (tec and bit[0])<>0 then textcolor(15) else textcolor(0);
           gotoxy(45,10);
           write('û');
           if (tec and bit[1])<>0 then textcolor(15) else textcolor(0);
           gotoxy(57,10);
           write('û');
           if (tec and bit[4])<>0 then textcolor(15) else textcolor(0);
           gotoxy(25,4);
           write('û');
           if (tec and bit[5])<>0 then textcolor(15) else textcolor(0);
           gotoxy(35,4);
           write('û');
           if (tec and bit[6])<>0 then textcolor(15) else textcolor(0);
           gotoxy(45,4);
           write('û');
           if (tec and bit[7])<>0 then textcolor(15) else textcolor(0);
           gotoxy(54,4);
           write('û');
           if (tec1 and bit[5])<>0 then textcolor(15) else textcolor(0);
           gotoxy(76,10);
           write('û');
           if (tec1 and bit[6])<>0 then textcolor(15) else textcolor(0);
           gotoxy(70,10);
           write('û');
           if (tec1 and bit[7])<>0 then textcolor(15) else textcolor(0);
           gotoxy(65,10);
           write('û');
           if (tec1 and bit[4])<>0 then textcolor(15) else textcolor(0);
           gotoxy(3,13);
           write('û');
           if (tec1 and bit[2])<>0 then textcolor(15) else textcolor(0);
           gotoxy(11,13);
           write('û');
           if (tec2 and bit[3])<>0 then textcolor(15) else textcolor(0);
           gotoxy(4,10);
           write('û');
           if (tec2 and bit[2])<>0 then textcolor(15) else textcolor(0);
           gotoxy(24,10);
           write('û');
           if (tec1 and bit[1])<>0 then textcolor(15) else textcolor(0);
           gotoxy(14,10);
           write('û');
           if (tec1 and bit[0])<>0 then textcolor(15) else textcolor(0);
           gotoxy(35,10);
           write('û');
     until keypressed and (upcase(readkey)='X');
end.

It's for Turbo Pascal.

You can also get info on this in Ralph's Brown Interrupt List,
available on some BBS.

