Skip to navigation

BBC Micro Elite

The key logger

Supporting concurrent in-flight key presses using a key logger
--------------------------------------------------------------
References: KYTB, KL, DKS1, DK4, DOKEY
  There's a lot to do when piloting a space ship. Pitching and rolling while
  slamming on the brakes to avoid missing the docking slot; firing lasers while
  activating the E.C.M. and slamming your foot on the accelerator; targeting a
  missile while switching between space views, trying to track down your foe...
  it's all in a day's work for your average Cobra Mk III pilot.
  
  Unfortunately, most 8-bit micros weren't built to handle multiple concurrent
  key presses. The Machine Operating System (MOS) in the BBC Micro can handle up
  to two concurrent key presses, on top of the modifier keys; this known as a
  "two-key rollover", and it's generally fine for typing, as you rarely intend
  to press more than two letter keys at the same time. However, for a game where
  you legitimately might want to pitch up, roll right, fire lasers, slow down
  and launch a missile all at the same time (by pressing "X", ">", "A", "?" and
  "M" concurrently), a simple two-key rollover just won't do.
  
  Elite therefore implements its own logging system that listens for key presses
  for all the important flight controls, and stores their details in a keyboard
  logger for the main loop to process in its own time. There are 15 of these
  flight controls, which are split up into the seven primary controls (speed,
  pitch, roll and lasers) and eight secondary controls (energy bomb, escape pod,
  missile controls, E.C.M., in-system jump and the docking computer). The key
  logger effectively implements an 8-key rollover for each of the primary
  controls, plus one secondary control, which is more than enough to make the
  game responsive to our every whim.
  
  How the key logger works
  ------------------------
  The heart of the key logger system is the table at location KL. This contains
  one byte for each of the 15 flight controls listed in the keyboard lookup
  table at KYTB, starting from KL+1 for "?" (slow down) and going through to
  KL+15 for "C" (which turns on the docking computer). Each key logger location
  has its own label, so KY1 = KL+1, KY2 = KL+2 up to KY15 = KL+15, where KY1
  corresponds to the internal key number in KYTB+1, KY2 to the key number in
  KYTB+2, and so on.
  
  The various keyboard scanning routines can set the relevant byte in the KL
  table to &FF to denote that a particular key is being pressed. The logger is
  cleared to zero (to denote that no keys are being pressed) by the U% routine.
  
  The main routines that populate the key logger are:
  
    * DKS4, which scans the keyboard for a specific key
  
    * DKS1, which calls DKS4 and updates the key logger with the result
  
    * DOKEY, which calls DKS1 for each of the primary flight controls
  
    * DK4, which scans for the secondary flight controls
  
  If a key is being pressed that is not in the keyboard table at KYTB, then it
  can be stored in the first location in the key logger, KL, as this isn't
  mapped to a KYTB key. This is done in routine DK4, for example, so we almost
  never miss a key press.
  
  In addition, the joystick fire button is checked, and if it is pressed, the
  key logger entry for laser fire ("A") is set, so there is only one location
  to check when processing laser fire.