[Back to INTERRUP SWAG index] [Back to Main SWAG index] [Original]

    {
     Well Percy (or is it Kerry?), I see that the regular crowd here have
     shown you how bit-level thingys work.  So, I'll give you a working
     example, including a Procedure to display the binary notation of any
     Integer, so you can play With the inFormation they've given you. The
     following Program reads & displays info from the equipment list Word
     (Note: I've made [lazy] use of global Variables, do not emulate)...
    }
    (*******************************************************************)
    Program BitsNBytes;                 { ...or Digital Road Kill       }
    Uses
      Dos;                              { import Intr() and Registers   }
    Var
      NumberFDD,                        { number of floppy drives       }
      InitVMode,                        { intial video mode             }
      COMcount,                         { number of serial ports        }
      LPTcount    : Byte;               { number of Printer ports       }
      Is8087,                           { math copro installed?         }
      IsMouse,                          { pointing device installed?    }
      IsDMA,                            { DMA support installed?        }
      IsGame,                           { game port installed?          }
      IsModem     : Boolean;            { internal modem installed?     }
      EqWord      : Word;               { the equipment list Word       }
      Reg         : Registers;          { to access CPU Registers       }
    {-------------------------------------------------------------------}
    Function BitSet(AnyWord : Word; BitNum : Byte) : Boolean;
     { return True if bit BitNum of AnyWord is 1, else False if it's 0  }
    begin
      BitSet := (BitNum in [0..15]) and ODD(AnyWord SHR BitNum);
    end {BitSet};
    {-------------------------------------------------------------------}
    Procedure WriteBitWord( AnyWord : Word );   { show Word as binary   }
    Var
      BinString : String[16];                   { represent binary bits }
      MaxBit,                                   { max number of bits    }
      BitNum    : Byte;                         { bits 0..15            }
    begin
      BinString := '0000000000000000';          { default to 0          }
      MaxBit := Length(BinString);              { total bit count (16)  }
      For BitNum := 0 to PRED(MaxBit) do        { process bits (0..15)  }
        if BitSet(AnyWord, BitNum) then
          INC(BinString[MaxBit - BitNum]);
      Write( BinString );                       { Write the binary Form }
    end {WriteBitWord};
    {-------------------------------------------------------------------}
    Procedure ProcessEquipList;     { parse equipment list Word EqWord  }
    Var
      BitNum  : Byte;               { to check each bit                 }
      EBitSet : Boolean;            { True if a BitNum is 1, else False }
    begin
      For BitNum := 0 to 15 do
      begin                                     { EqWord has 16 bits    }
        EBitSet := BitSet(EqWord,BitNum);       { is this bit set?      }
        Case BitNum of                          { each bit has meaning  }
          0       : if EBitSet then             { if EqWord.0 is set    }
                      NumberFDD := (EqWord SHR 6) and $3 + 1
                    else
                      NumberFDD := 0;
          1       : Is8087    := EBitSet; { if math co-pro found  }
          2       : IsMouse   := EBitSet; { if pointing device    }
          3       : ; {reserved, do nothing}
          4       : InitVMode := (EqWord SHR BitNum) and $3;
          5..7    : ; {ignore}
          8       : IsDMA     := EBitSet;
          9       : COMcount  := (EqWord SHR BitNum) and $7;
          10,11   : ; {ignore}
          12      : IsGame    := EBitSet;
          13      : IsModem   := EBitSet;
          14      : LPTcount  := (EqWord SHR BitNum) and $7;
          15      : ; {ignore}
        end; {Case BitNum}
      end; {For BitNum}
    end {ProcessEquipList};
    {-------------------------------------------------------------------}
    Function Maybe(Truth : Boolean) : String;
    begin
      if not Truth then
        Maybe := ' not '
      else
        Maybe := ' IS ';
    end {Maybe};
    {-------------------------------------------------------------------}
    begin
      Intr( $11, Reg );
      EqWord := Reg.AX;
      WriteLn;
      Write('Equipment list Word: ',EqWord,' decimal = ');
      WriteBitWord( EqWord );
      WriteLn(' binary');
      WriteLn;
      ProcessEquipList;
      WriteLn('Number of floppies installed: ', NumberFDD );
      WriteLn('Math-coprocessor',Maybe(Is8087),'installed' );
      WriteLn('PS/2 Mouse',Maybe(IsMouse),'installed' );
      Write('Initial video mode: ',InitVMode,' (' );
      Case InitVMode of
        0 : WriteLn('EGA, VGA, PGA)');
        1 : WriteLn('40x25 colour)');
        2 : WriteLn('80x25 colour)');
        3 : WriteLn('80x25 monochrome)');
      end;
      WriteLn('DMA support',Maybe(IsDMA),'installed' );
      WriteLn('Number of COMs installed: ',COMcount );
      WriteLn('Game port',Maybe(IsGame),'installed' );
      WriteLn('IBM Luggable modem',Maybe(IsModem),'installed');
      WriteLn('Number of Printer ports: ',LPTcount );
    end {BitsNBytes}.
    (*******************************************************************)

[Back to INTERRUP SWAG index] [Back to Main SWAG index] [Original]