home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1997 December / Internet_Info_CD-ROM_Walnut_Creek_December_1997.iso / faqs / alt / answers / msdos-programmer-faq / part2 < prev    next >
Internet Message Format  |  1997-10-01  |  31KB

  1. Path: senator-bedfellow.mit.edu!faqserv
  2. From: jeffrey@carlyle.com (Jeffrey Carlyle)
  3. Newsgroups: comp.os.msdos.programmer,alt.msdos.programmer,comp.answers,alt.answers,news.answers
  4. Subject: comp.os.msdos.programmer FAQ part 2/5
  5. Supersedes: <msdos-programmer-faq/part2_873193441@rtfm.mit.edu>
  6. Followup-To: comp.os.msdos.programmer
  7. Date: 30 Sep 1997 09:49:54 GMT
  8. Organization: The COMP-FAQ Project
  9. Lines: 883
  10. Sender: jeffrey@carlyle.com (Jeffrey Carlyle)
  11. Approved: news-answers-request@MIT.Edu
  12. Expires: 3 Nov 1997 09:49:05 GMT
  13. Message-ID: <msdos-programmer-faq/part2_875612945@rtfm.mit.edu>
  14. References: <msdos-programmer-faq/part1_875612945@rtfm.mit.edu>
  15. Reply-To: jeffrey@carlyle.com (Jeffrey Carlyle)
  16. NNTP-Posting-Host: penguin-lust.mit.edu
  17. Summary: Frequently asked questions by DOS programmers with tested answers.
  18. X-Last-Updated: 1997/08/04
  19. Originator: faqserv@penguin-lust.MIT.EDU
  20. Xref: senator-bedfellow.mit.edu comp.os.msdos.programmer:92881 alt.msdos.programmer:39078 comp.answers:28269 alt.answers:29276 news.answers:113414
  21.  
  22. Archive-name: msdos-programmer-faq/part2
  23. Comp-os-msdos-programmer-archive-name: dos-faq-pt2.txt
  24. Posting-frequency: 28 days
  25. Last-modified: 04 Aug 97
  26.  
  27. ------------------------------
  28.  
  29. Subject: comp.os.msdos.programmer FAQ part 2/5
  30.  
  31.  
  32.  For more information about this FAQ list please see Part 1.
  33.  
  34.  
  35.  FAQ        updates       can       be       found        at
  36.  <http://www.premiernet.net/~carlyle>.
  37.  
  38.  
  39.  This  is  part 2 of the frequently asked question list  for
  40.  the newsgroup comp.os.msdos.programmer.
  41.  
  42. Part 2:
  43.   Section 3.  Compile and Link
  44.   Section 4.  Keyboard
  45.  
  46. ------------------------------
  47.  
  48. Subject: comp.os.msdos.programmer FAQ
  49.  
  50.  
  51.  Comp.os.msdos.programmer FAQ Version 1997.08
  52.  
  53.  
  54.  Copyright  1997  by Jeffrey Carlyle. All  rights  reserved.
  55.  This  article is not in the public domain, but  it  may  be
  56.  redistributed  so long as this notice, the acknowledgments,
  57.  and  the  information on obtaining the latest copy of  this
  58.  list are retained and no fee is charged. The code fragments
  59.  may be used freely; credit to the FAQ would be polite. This
  60.  FAQ  is not to be included in any static archive (e.g.  CD-
  61.  ROM  or  book);  however,  a pointer  to  the  FAQ  may  be
  62.  included.
  63.  
  64. =============================
  65. TABLE OF CONTENTS
  66. =============================
  67. Part 1:
  68.   Section 1.  General FAQ and Newsgroup Information
  69.   Section 2.  General Reference
  70. Part 2:
  71.   Section 3.  Compile and Link
  72.   Section 4.  Keyboard
  73. Part 3:
  74.   Section 5.  Disks and files
  75.   Section 6.  Serial ports (COM ports)
  76. Part 4:
  77.   Section 7.  Other hardware questions and problems
  78.   Section 8.  Other software questions and problems
  79. Part 5:
  80.   Section 9.  Downloading
  81.   Section 10. Vendors and products
  82.  
  83. ------------------------------
  84.  
  85. Subject: Section 3.  Compile and link
  86.  
  87. <Q: 3.01> - What the heck is "DGROUP > 64K"?
  88. <Q: 3.02>  -  How  do I fix "automatic data segment  exceeds
  89.      64K" or "stack plus data exceed 64K"?
  90. <Q: 3.03>  -  Will Borland C code and Microsoft C code  link
  91.      together?
  92. <Q: 3.04>  -  Why  did  my program bomb  at  run  time  with
  93.      "floating point formats not linked" or "floating  point
  94.      not loaded"?
  95. <Q: 3.05>  - How can I change the stack size in Borland's  C
  96.      compilers?
  97. <Q: 3.06> - What's the format of an .OBJ file?
  98. <Q: 3.07> - What's the format of an .EXE header?
  99. <Q: 3.08>  -  What's  the difference between .COM  and  .EXE
  100.      formats?
  101. <Q: 3.09> - How do I create a .COM file?
  102. <Q: 3.10> - Where is EXE2BIN located?
  103. <Q: 3.11>  -  What  does  this message  mean:  "A20  already
  104.      enabled so test is meaning less?"
  105.  
  106. ------------------------------
  107.  
  108. Subject: <Q: 3.01> - What the heck is "DGROUP > 64K"?
  109. Date: Sun, 03 Aug 97 19:48:24 CST
  110.  
  111.  
  112.  This question explains the problem; the next question gives
  113.  some remedies.
  114.  
  115.  
  116.  DGROUP  is  a  link-time group of data  segments,  and  the
  117.  compiler  typically generates code that expects  DS  to  be
  118.  pointing  to DGROUP. (Exception:  Borland's huge model  has
  119.  no DGROUP.)
  120.  
  121.  
  122.  Here's what goes into DGROUP:
  123.  
  124.   
  125.   -     Tiny  models (all pointers near): DGROUP  holds  the
  126.      entire program.
  127.      
  128.   
  129.   -     Small and medium models (data pointers near): DGROUP
  130.      holds all  globals and static variables including string
  131.      literal data, plus the stack and the heap.
  132.      
  133.   
  134.   -     Large,  compact, and huge models in Microsoft  (data
  135.      pointers far): DGROUP holds only initialized globals and
  136.      static variables including string literal data, plus the
  137.      stack and the near heap.
  138.      
  139.   
  140.   -     Large  and compact models in Borland (data  pointers
  141.      far): DGROUP holds initialized and uninitialized globals and
  142.      static variables including string literal data, but not the
  143.      stack or heap.
  144.      
  145.   
  146.   -    Huge model in Borland (data pointers far): there is no
  147.      DGROUP, so the 64K limit doesn't apply.
  148.      
  149.  
  150.  In  all  of  the above, which is to say all six  models  in
  151.  Microsoft  C  and  all  but huge in Borland  C,  DGROUP  is
  152.  limited  to  64K including string literal data  (which  are
  153.  treated  as  static data).  This limitation is due  to  the
  154.  Intel CPU's segmented architecture.
  155.  
  156.  
  157.  For  more information, see topics like "memory models"  and
  158.  "memory  management" in the index of your compiler  manual.
  159.  Also for an extended general discussion of memory usage  in
  160.  Borland C programs, of which much applies to any C compiler
  161.  in DOS see TI738.asc, downloadable as part of:
  162.  
  163.  <ftp://ftp.simtel.net/pub/simtelnet/msdos/turbo-
  164.  c/bchelp10.zip>
  165.  <ftp://garbo.uwasa.fi/pc/turbopas/bchelp10.zip>
  166.  
  167. ------------------------------
  168.  
  169. Subject: <Q: 3.02> - How do I fix "automatic data segment
  170.      exceeds 64K" or "stack plus data exceed 64K"?
  171.  
  172.  
  173.  These  messages  are a variation of "DGROUP  >  64K".   For
  174.  causes, please see the preceding question.
  175.  
  176.  
  177.  If you get this error in tiny model, your program is simply
  178.  too  big and you must use a different memory model.  If you
  179.  get  this  link  error  in models small,  compact,  medium,
  180.  large,  or Microsoft's huge, there are some things you  can
  181.  do.  (This error can't occur in Borland's huge model.)
  182.  
  183.  
  184.  If  you  have one or two big global arrays, simply  declare
  185.  them  far.  The  compiler  takes  this  to  mean  that  any
  186.  references to them will use 32-bit pointers, so they'll  be
  187.  in separate segments and no longer part of DGROUP.
  188.  
  189.  
  190.  Or  you can use the /Gt[number] option with Microsoft or  -
  191.  Ff[=size]   with  Borland  C++  2.0  and  up.   This   will
  192.  automatically put variables above a certain size into their
  193.  own segments outside of DGROUP.
  194.  
  195.  
  196.  Yet  another  option  is to change  global  arrays  to  far
  197.  pointers.  Then at the beginning of your program,  allocate
  198.  them   from   the   far  heap  (_fmalloc()  in   Microsoft,
  199.  farmalloc() in Borland).
  200.  
  201.  
  202.  Finally,  you  can  change  to  huge  model  (with  Borland
  203.  compilers,  not Microsoft).  Borland's H model  still  uses
  204.  far  pointers by default, but "sets aside the [64K]  limit"
  205.  and  has  no  DGROUP  group,  according  to  the  BC++  2.0
  206.  Programmer's Guide.  Microsoft's H model does use huge data
  207.  pointers  by default but retains DGROUP and its 64K  limit,
  208.  so  switching to the huge model doesn't buy you anything if
  209.  you have DGROUP problems.
  210.  
  211.  
  212. ------------------------------
  213.  
  214. Subject: <Q: 3.03> - Will Borland C code and Microsoft C
  215.      code link together?
  216.  
  217.  
  218.  Typically  someone who owns compiler A  and  is  trying  to
  219.  write  code  to  link with a third-party library  that  was
  220.  compiled under compiler B asks this question.
  221.  
  222.  
  223.  The  answer to the question is, Not in general.   Here  are
  224.  some of the reasons:
  225.  
  226.   
  227.   -     "Helper" functions (undocumented functions for stack
  228.      checking, floating-point arithmetic, and operations  on
  229.      longs) differ between the two compilers.
  230.      
  231.   
  232.   -    Extended dictionaries are not compatible between the 2
  233.      formats. However, the basic structure of both MS and Borland
  234.      OBJ formats is based on the OMF format so specifying that
  235.      the linker ignore the extended dictionary records (/NOE for
  236.      LINK, -e for TLINK) will disable this little hassle.
  237.      
  238.   
  239.   -    The compilers may embed instructions in the object code
  240.      that  tell  the linker to look for their  own  run-time
  241.      libraries.  You can use the linker option that says  to
  242.      ignore such instructions: /n in TLINK, /NOD in the Microsoft
  243.      linker (the one that comes with the C compiler, not the one
  244.      that  used to come with DOS).  But getting around  this
  245.      problem will very likely just reveal other problems, like
  246.      different helper functions, that have no easy solution.
  247.      
  248.  
  249.  Those problems will generate link-time errors.  Others  may
  250.  not show up until run time:
  251.  
  252.   
  253.   -    Borland's compact, large, and huge models don't assume
  254.      DS=SS, but Microsoft's do.  The -Fs option on the Borland
  255.      compiler, or one of the /A options on Microsoft, should take
  256.      care of this problem-once you know that's what's going on.
  257.      
  258.   
  259.   -     Check conventions for ordering and packing structure
  260.      members, and for alignment of various types on byte, word,
  261.      paragraph, or other boundaries.  Again, you can generally
  262.      adjust your code to match if you know what conventions were
  263.      used in compiling the "foreign" libraries.
  264.      
  265. -    Check the obvious and make sure that your code was
  266. compiled under the same memory model as the code you're
  267. trying to link with. (That's necessary, but no guarantee.
  268. Microsoft and Borland don't use exactly the same conventions
  269. for segments and groups, particularly in the larger memory
  270. models.)
  271.  
  272.  That  said, there are some circumstances where you can link
  273.  hybrids.  Your best chance of success comes if you  compile
  274.  in large model with the compiler switch that says to reload
  275.  DS  on  entry  to each function, avoid longs  and  floating
  276.  point,  use only 16-bit pointers, suppress stack  checking,
  277.  and specify all libraries used in the link.
  278.  
  279.  
  280. ------------------------------
  281.  
  282. Subject: <Q: 3.04> - Why did my program bomb at run time
  283.      with "floating point formats not linked" or "floating
  284.      point not loaded"?
  285.  
  286.  
  287.  These messages look similar but have very different causes.
  288.  
  289.  
  290.  "Floating  point  not  loaded" is  Microsoft  C's  run-time
  291.  message  when  the code requires a numeric coprocessor  but
  292.  your  computer doesn't have one installed.  If the  program
  293.  is  yours,  relink  it using the xLIBCE or  xLIBCA  library
  294.  (where x is the memory model).
  295.  
  296.  
  297.  "Floating  point formats not linked" is a Borland  run-time
  298.  error  (Borland  C  or  C++, Turbo C  or  C++).   Borland's
  299.  compilers  try  to be smart and not link in  the  floating-
  300.  point (f-p) library unless you need it.  Alas, they all get
  301.  the  decision  wrong.  One common case is where  you  don't
  302.  call  any  f-p  functions, but you have  %f  or  other  f-p
  303.  formats in scanf() or printf() calls.  The cure is to  call
  304.  an f-p function, or at least force one to be present in the
  305.  link.
  306.  
  307.  
  308.  To do that, define this function somewhere in a source file
  309.  but don't call it:
  310.  
  311.   static void forcefloat(float *p)
  312.   {
  313.     float f = *p;
  314.     forcefloat(&f);
  315.   }
  316.  
  317.  It  doesn't have to be in the module with the main program,
  318.  as  long as it's in a module that will be included  in  the
  319.  link.
  320.  
  321.  
  322.  If  you  have Borland C++ 3.0, the README file documents  a
  323.  slightly less ugly work-around.  Insert these statements in
  324.  your program:
  325.  
  326.   extern unsigned _floatconvert;
  327.   #pragma extref _floatconvert
  328.  
  329. ------------------------------
  330.  
  331. Subject: <Q: 3.05> - How can I change the stack size in
  332.      Borland's C compilers?
  333.  
  334.  
  335.  In  Turbo  C, Turbo C++, and Borland C++, you may not  find
  336.  "stack  size" in the index but the global variable  _stklen
  337.  should  be  there. The manual will instruct you  to  put  a
  338.  statement like
  339.  
  340.   extern unsigned _stklen = 54321U;
  341.  
  342.  in your code, outside of any function.  You must assign the
  343.  value  right  in  the extern statement; it  won't  work  to
  344.  assign  a  value at run time.  The linker may  give  you  a
  345.  duplicate symbol warning, which you can ignore.
  346.  
  347.  
  348.  If you are using the Borland PowerPack for DOS _stklen does
  349.  not  change  the stack size. To change the stack  size  you
  350.  must  use STACKSIZE in your .DEF file. HEAPSIZE can be used
  351.  to change the size of your program's heap.
  352.  
  353.  
  354. ------------------------------
  355.  
  356. Subject: <Q: 3.06> - What's the format of an .OBJ file?
  357. Date: Wed, 11 Jan 95 15:34:00 CDT
  358.  
  359.  
  360.  Information  about the base .OBJ format  can  be  found  in
  361.  Intel's  document  number  #121748-001,  {8086  Relocatable
  362.  Object Module Formats} (not verified).
  363.  
  364.  
  365.  Both  Microsoft and Borland have extended the .OBJ  format,
  366.  as   has   IBM  for  OS/2;  and  according  to  the  MS-DOS
  367.  encyclopedia, Microsoft doesn't actually use all the listed
  368.  formats.
  369.  
  370.   
  371.   -    Microsoft-specific .OBJ formats:
  372.      
  373.      
  374.      -     The .OBJ format document in a text file format is
  375.        downloadable                                       as
  376.        <ftp://ftp.microsoft.com/softlib/mslfiles/ss0288.exe>
  377.        
  378.      
  379.      -     A  45-page  article can be found in  the  {MS-DOS
  380.        Encyclopedia}, ISBN 1-55615-049-0, now out of print.
  381.        
  382.      
  383.      -    "Microsoft Object Module Format (OMF)" Specification,
  384.        22 Nov 1991, was published by the Microsoft Languages Group
  385.        (not verified).
  386.        
  387.   
  388.   -      Borland-specific  .OBJ  formats  Open  Architecture
  389.      Handbook.  The Borland Developer's Technical Guide, 1991, no
  390.      ISBN.  Chapter 2, "Object file contents", (pages 27-50)
  391.      covers  the comment records sent to the object file  by
  392.      Borland C++ version 3.0 and other Borland compilers.  The
  393.      comment records mostly contain information for the Borland
  394.      debugger (not verified).
  395.      
  396.   
  397.   -     A  "tutorial on the .OBJ format" comes with the  VAL
  398.      experimental       linker,       downloadable        as
  399.      <ftp://garbo.uwasa.fi/pc/assembler/linker.zoo>.
  400.      
  401.  
  402. ------------------------------
  403.  
  404. Subject: <Q: 3.07> - What's the format of an .EXE header?
  405.  
  406.  
  407.  See PC Magazine 30 June 1992 (XI: 12) pages 349-350 for the
  408.  old  and  new  formats.  For a more detailed  layout,  look
  409.  under  INT  21  AH=4B  in Ralf Brown's interrupt  list  <Q:
  410.  2.03>.   That list includes extensions for Borland's  TLINK
  411.  and Borland debugger info.
  412.  
  413.  
  414.  Among the books that detail formats of executable files are
  415.  {DOS  Programmer's Reference: 2d Edition} by Terry  Dettman
  416.  and  Jim  Kyle,  ISBN 0-88022-458-4; and {Microsoft  MS-DOS
  417.  Programmer's Reference}, ISBN 1-55615-329-5.
  418.  
  419.  
  420. ------------------------------
  421.  
  422. Subject: <Q: 3.08> - What's the difference between .COM and
  423.      .EXE formats?
  424.  
  425.  
  426.  To oversimplify: a .COM file is a direct image of core, and
  427.  a .EXE file will undergo some further relocation when it is
  428.  run  (and so it begins with a relocation header).   A  .COM
  429.  file  is  limited to 64K for all segments combined,  but  a
  430.  .EXE  file  can have as many segments as your  linker  will
  431.  handle and be as large as RAM can take.
  432.  
  433.  
  434.  The actual file extension doesn't matter.  DOS knows that a
  435.  file  being loaded is in .EXE format if its first two bytes
  436.  are MZ or ZM; otherwise it is assumed to be in .COM format.
  437.  For instance, DR-DOS 6.0's COMMAND.COM is in .EXE format.
  438.  
  439.  
  440. ------------------------------
  441.  
  442. Subject: <Q: 3.09> - How do I create a .COM file?
  443. Date: Fri, 13 Jan 95 15:34:00 CDT
  444.  
  445.  
  446.  There  are  two steps to creating a .COM file. First,  your
  447.  program must not have a stack. In C, you must compile  your
  448.  program with the TINY memory model. Second, use EXE2BIN  or
  449.  a  similar program to convert an EXE file to a COM file. To
  450.  find  EXE2BIN  see  subject: <Q: 3.10>  "Where  is  EXE2BIN
  451.  located?"
  452.  
  453.  
  454. ------------------------------
  455.  
  456. Subject: <Q: 3.10> - Where is EXE2BIN located?
  457. Date: Fri, 07 Jul 95 15:34:00 CDT
  458.  
  459.  
  460.  EXE2BIN was formerly shipped with MS-DOS. If you are  still
  461.  using  DOS 5.0 or earlier you can find EXE2BIN in your  DOS
  462.  directory.  Users  of  DOS  6.x  need  to  get  the  MS-DOS
  463.  Supplemental Disks. These disks are available  via  FTP  at
  464.  ftp.microsoft.com.
  465.  
  466.  
  467.  <ftp://ftp.microsoft.com/peropsys/msdos/public/supplmnt>
  468.  
  469.  
  470. ------------------------------
  471.  
  472. Subject: <Q: 3.11> - What does this message mean: "A20
  473.      already enabled so test is meaning less?"
  474.  
  475.  
  476.  The  DPMIINST  program  included  with  older  versions  of
  477.  Borland C++ and Turbo C++ compilers generates this message.
  478.  Before running DPMIINST you must clean boot your computer.
  479.  
  480.  
  481. ------------------------------
  482.  
  483. Subject: Section 4.  Keyboard
  484.  
  485. <Q: 4.01> - How can I read a character without echoing it to
  486.      the  screen, and without waiting for the user to  press
  487.      the Enter key?
  488. <Q: 4.02>  - How can I find out whether a character has been
  489.      typed, without waiting for one?
  490. <Q: 4.03> - How can I disable Ctrl-C/Ctrl-Break and/or Ctrl-
  491.      Alt-Del?
  492. <Q: 4.04> - How can I disable the print screen function?
  493. <Q: 4.05>  -  How  can  my  program turn NumLock  (CapsLock,
  494.      ScrollLock) on or off?
  495. <Q: 4.06> - How can I speed up the keyboard's auto-repeat?
  496. <Q: 4.07> - What is the SysRq key for?
  497. <Q: 4.08> - How can my program tell what kind of keyboard is
  498.      on the system?
  499. <Q: 4.09>  - How can I tell if input, output, or stderr  has
  500.      been redirected?
  501. <Q: 4.10>  -  How  can I increase the size of  the  keyboard
  502.      buffer?
  503. <Q: 4.11>  -  How  can I stuff characters into the  keyboard
  504.      buffer?
  505.  
  506. ------------------------------
  507.  
  508. Subject: <Q: 4.01> - How can I read a character without
  509.      echoing it to the screen, and without waiting for the
  510.      user to press the Enter key?
  511.  
  512.  
  513.  The  C  compilers from Microsoft and Borland offer  getch()
  514.  (or  getche()  to  echo the character);  Turbo  Pascal  has
  515.  ReadKey.
  516.  
  517.  
  518.  In  other programming languages, execute INT 21 AH=8; AL is
  519.  returned  with the character from standard input  (possibly
  520.  redirected).   If  you don't want to allow redirection,  or
  521.  you  want to capture Ctrl-C and other special keys, use INT
  522.  16  AH=10;  this will return the scan code in AH and  ASCII
  523.  code  (if  possible)  in  AL, but  AL=E0  with  AH  nonzero
  524.  indicates that one of the gray "extended" keys was pressed.
  525.  (If  your  BIOS doesn't support the extended keyboard,  use
  526.  INT 16 AH=0 not 10.)
  527.  
  528.  
  529. ------------------------------
  530.  
  531. Subject: <Q: 4.02> - How can I find out whether a character
  532.      has been typed, without waiting for one?
  533.  
  534.  
  535.  In  Turbo  Pascal, use KeyPressed.  Both  Microsoft  C  and
  536.  Turbo C offer the kbhit() function.  All of these tell  you
  537.  whether  a  key  has  been pressed.  If  no  key  has  been
  538.  pressed, they return that information to your program.   If
  539.  a  keystroke  is waiting, they tell your program  that  but
  540.  leave the key in the input buffer.
  541.  
  542.  
  543.  You  can  use the BIOS call, INT 16 AH=01 or 11,  to  check
  544.  whether  an actual keystroke is waiting; or the  DOS  call,
  545.  INT  21 AH=0B, to check for a keystroke from stdin (subject
  546.  to  redirection).   See  Ralf Brown's  interrupt  list  <Q:
  547.  2.03>.
  548.  
  549.  
  550. ------------------------------
  551.  
  552. Subject: <Q: 4.03> - How can I disable Ctrl-C/Ctrl-Break
  553.      and/or Ctrl-Alt-Del?
  554.  
  555.  
  556.  Several utilities are downloadable from /pub/msdos/keyboard
  557.  at  SimTel.   In that directory, cadel.zip contains  a  TSR
  558.  (with   source   code)  to  disable  those   keys.    Also,
  559.  keykill.arc  contains two utilities: keykill.com  lets  you
  560.  disable  up  to  three keys of your choice, and  deboot.com
  561.  changes  the  boot key to leftShift-Alt-Del. C  programmers
  562.  who simply want to make sure that the user can't Ctrl-Break
  563.  out  of  their  program can use the ANSI-standard  signal()
  564.  function;  the  Borland compilers also offer ctrlbrk()  for
  565.  handling Ctrl-Break.  However, if your program uses  normal
  566.  DOS  input  such as getch(), ^C will appear on  the  screen
  567.  when  the user presses Ctrl-C or Ctrl-Break.  You can avoid
  568.  the  ^C  echo for Ctrl-C by using _bios_keybrd() in MSC  or
  569.  bioskey() in BC++; however, Ctrl-Break will still terminate
  570.  the program.
  571.  
  572.  
  573.  An  alternative approach involves programming  input  at  a
  574.  lower  level.  You  can  use  INT  21  AH=7,  which  allows
  575.  redirection  but  doesn't  echo  the  ^C  (or   any   other
  576.  character, for that matter); or use INT 16 AH=0 or  10;  or
  577.  hook  INT  9  to discard Ctrl-C and Ctrl-Break  before  the
  578.  regular BIOS keyboard handler sees them; etc., etc.
  579.  
  580.  
  581.  You   should  be  aware  that  Ctrl-C  and  Ctrl-Break  are
  582.  processed  quite differently internally.  Ctrl-Break,  like
  583.  all  keystrokes, is processed by the BIOS code at INT 9  as
  584.  soon as the user presses the keys, even if earlier keys are
  585.  still in the keyboard buffer: by default the handler at INT
  586.  1B is called.  Ctrl-C is not special to the BIOS, nor is it
  587.  special  to  DOS  functions 6 and 7; it is special  to  DOS
  588.  functions 1 and 8 when at the head of the keyboard  buffer.
  589.  You  will  need  to make sure BREAK is OFF to  prevent  DOS
  590.  polling   the   keyboard  for  Ctrl-C  during  non-keyboard
  591.  operations.
  592.  
  593.  
  594.  Some  good general references are {Advanced MS-DOS} by  Ray
  595.  Duncan,   ISBN  1-55615-157-8;  {8088  Assembler   Language
  596.  Programming: The IBM PC}, ISBN 0-672-22024-5, by  Willen  &
  597.  Krantz; and {COMPUTE!'s Mapping the IBM PC}, ISBN 0-942386-
  598.  92-2.
  599.  
  600.  
  601. ------------------------------
  602.  
  603. Subject: <Q: 4.04> - How can I disable the print screen
  604.      function?
  605.  
  606.  
  607.  There  are  really  two print screen  functions:  1)  print
  608.  current screen snapshot, triggered by PrintScreen or Shift-
  609.  PrtSc  or  Shift-gray*, and 2) turn  on  continuous  screen
  610.  echo, started and stopped by Ctrl-P or Ctrl-PrtSc.
  611.  
  612.  
  613.  1) Screen snapshot to printer:
  614.  
  615.  
  616.  The  BIOS uses INT 5 for this.  Fortunately, you don't need
  617.  to mess with that interrupt handler.  The standard handler,
  618.  in  BIOS versions dated December 1982 or later, uses a byte
  619.  at  0040:0100  (= 0000:0500) to determine whether  a  print
  620.  screen  is  currently  in progress.   If  it  is,  pressing
  621.  PrintScreen  again  is ignored.  So to disable  the  screen
  622.  snapshot,  all  you have to do is write a 1 to  that  byte.
  623.  When the user presses PrintScreen, the BIOS will think that
  624.  a  print screen is already in progress and will ignore  the
  625.  user's  keypress.  You can re-enable PrintScreen by zeroing
  626.  the same byte.
  627.  
  628.  
  629.  Here's some simple code:
  630.  
  631.   void  prtsc_allow(int allow) /* 0=disable,  nonzero=enable
  632.   */
  633.   {
  634.        unsigned   char   far*   flag   =   (unsigned    char
  635.   far*)0x00400100UL;
  636.     *flag = (unsigned char)!allow;
  637.   }
  638.  
  639.  2) Continuous echo of screen to printer:
  640.  
  641.  
  642.  If   ANSI.SYS  is  loaded,  you  can  easily  disable   the
  643.  continuous  echo  of  screen to printer  (Ctrl-P  or  Ctrl-
  644.  PrtSc).  Just redefine the keys by "printing" strings  like
  645.  these  to the screen (BASIC print, C printf(), Pascal Write
  646.  statements,  or  ECHO command in batch files),  where  <27>
  647.  stands for the Escape character, ASCII 27:
  648.  
  649.   <27>[0;114;"Ctrl-PrtSc disabled"p
  650.   <27>[16;"^P"p
  651.  
  652.  If  you  haven't installed ANSI.SYS, I can't offer an  easy
  653.  way to disable the echo-screen-to-printer function.
  654.  
  655.  
  656.  Actually,  you might not need to disable Ctrl-P  and  Ctrl-
  657.  PrtSc.   If  your  only  concern is  not  locking  up  your
  658.  machine,  when  you  see the "Abort, Retry,  Ignore,  Fail"
  659.  prompt  just press Ctrl-P again and then press  I.   As  an
  660.  alternative,  install one of the many print  spoolers  that
  661.  intercept printer-status queries and always return "Printer
  662.  ready".
  663.  
  664.  
  665. ------------------------------
  666.  
  667. Subject: <Q: 4.05> - How can my program turn NumLock
  668.      (CapsLock, ScrollLock) on or off?
  669.  
  670.  
  671.  First,  if you just don't want NumLock turned on  when  you
  672.  reboot,  check  your system's setups.  (Use  Ctrl-Alt-Enter
  673.  any time, or press a special key like Del at boot time,  or
  674.  run  the  setup  program supplied with your system.)   Many
  675.  systems now have an option in setup to turn NumLock off  at
  676.  boot time.
  677.  
  678.  
  679.  You  need  to twiddle bit 5, 6, or 4 of location 0040:0017.
  680.  The   code  example  below  demonstrates  changing  NumLock
  681.  status:  lck() turns on a lock state, and unlck() turns  it
  682.  off.
  683.  
  684.  
  685.  (The  status  lights on some keyboards may not reflect  the
  686.  change.   If  yours  is one, call INT 16 AH=2,  "get  shift
  687.  status", and that may update them.  It will certainly do no
  688.  harm.)
  689.  
  690.   #define NUM_LOCK  (1 << 5)
  691.   #define CAPS_LOCK (1 << 6)
  692.   #define SCRL_LOCK (1 << 4)
  693.   void lck(int shiftype)
  694.   {
  695.     char far* kbdstatus = (char far*)0x00400017UL;
  696.     *kbdstatus |= (char)shiftype;
  697.   }
  698.   void unlck(int shiftype)
  699.   {
  700.     char far* kbdstatus = (char far*)0x00400017UL;
  701.     *kbdstatus &= ~(char)shiftype;
  702.   }
  703.  
  704. ------------------------------
  705.  
  706. Subject: <Q: 4.06> - How can I speed up the keyboard's auto-
  707.      repeat?
  708. Date: Sun, 03 Aug 97 19:53:45 CST
  709.  
  710.  
  711.  The  keyboard speed has two components: delay (before a key
  712.  that  you  hold  down starts repeating) and typematic  rate
  713.  (the  speed  once  the  key starts repeating).   Most  BIOS
  714.  versions  since  1986  let software change  the  delay  and
  715.  typematic rate by calling INT 16 AH=3, "set typematic  rate
  716.  and  delay"; see Ralf Brown's interrupt list (Q  1.17).  If
  717.  you have DOS 4.0 or later, you can use the MODE CON command
  718.  that you'll find in your DOS manual.
  719.  
  720.  
  721.  On  83-key  keyboards (mostly XTs), the delay and typematic
  722.  rate can't easily be changed.  According to PC Magazine  15
  723.  Jan  1991 (x: 1) page 409, to adjust the typematic rate you
  724.  need  "a  memory-resident program which simply  '[watches]'
  725.  the  keyboard to see if you're holding down  a  key  .  and
  726.  after a certain time [starts] stuffing extra copies of  the
  727.  held-down key into the buffer."  No source code is given in
  728.  that  issue;  but  the QUICKEYS utility  that  PC  Magazine
  729.  published   in  1986  does  this  sort  of  watching   (not
  730.  verified); source and object code are downloadable in
  731.  
  732.  
  733.  <ftp://ftp.simtel.net/pub/simtelnet/msdos/pcmag/vol5n05.zip
  734.  >
  735.  
  736.  
  737. ------------------------------
  738.  
  739. Subject: <Q: 4.07> - What is the SysRq key for?
  740.  
  741.  
  742.  There  is  no standard use for the key.  The BIOS  keyboard
  743.  routines  in INT 16 simply ignore it; therefore so  do  the
  744.  DOS  input  routines  in INT 21 as  well  as  the  keyboard
  745.  routines in libraries supplied with high-level languages.
  746.  
  747.  
  748.  When  you  press  or  release a key, the keyboard  triggers
  749.  hardware line IRQ1, and the CPU calls INT 9.  INT  9  reads
  750.  the  scan code from the keyboard and the shift states  from
  751.  the BIOS data area.
  752.  
  753.  
  754.  What  happens  next  depends  on  whether  your  PC's  BIOS
  755.  supports  an enhanced keyboard (101 or 102 keys).   If  so,
  756.  INT  9  calls INT 15 AH=4F to translate the scan code.   If
  757.  the translated scan code is 54 hex (for the SysRq key) then
  758.  INT 9 calls INT 15 AH=85 and doesn't put the keystroke into
  759.  the  keyboard buffer.  The default handler of that function
  760.  does  nothing and simply returns.  (If your PC has an older
  761.  BIOS  that doesn't support the extended keyboards,  INT  15
  762.  AH=4F  is not called.  Early ATs have 84-key keyboards,  so
  763.  their BIOS calls INT 15 AH=85 but not 4F.)
  764.  
  765.  
  766.  Thus  your  program  is  free to  use  SysRq  for  its  own
  767.  purposes,  but at the cost of some programming.  You  could
  768.  hook  INT 9, but it's probably easier to hook INT 15 AH=85,
  769.  which is called when SysRq is pressed or released.
  770.  
  771.  
  772. ------------------------------
  773.  
  774. Subject: <Q: 4.08> - How can my program tell what kind of
  775.      keyboard is on the system?
  776.  
  777.  
  778.  Ralf  Brown's Interrupt List <Q: 2.03> includes MEMORY.LST,
  779.  a detailed breakdown by Robin Walker of the contents of the
  780.  BIOS  system block that starts at 0040:0000.  Bit 4 of byte
  781.  0040:0096 is "1=enhanced keyboard installed".  Here is a  C
  782.  code example to test the keyboard type:
  783.  
  784.   char far *kbd_stat_byte3 = (char far *)0x00400096UL;
  785.   if (0x10 & *kbd_stat_byte3)
  786.   {
  787.     /* 101- or 102- keyboard is installed */
  788.   }
  789.   else
  790.   {
  791.     /* Not installed */
  792.   }
  793.  
  794.  PC  Magazine 15 Jan 1991 (x: 1) suggests on page  412  that
  795.  "for  some  clones [the above test] is not foolproof".   If
  796.  you  use this method in your program you should provide the
  797.  user  some way to override this test, or at least some  way
  798.  to  tell  your  program to assume a non-enhanced  keyboard.
  799.  The  article  suggests a different approach to  determining
  800.  the type of keyboard.
  801.  
  802.  
  803. ------------------------------
  804.  
  805. Subject: <Q: 4.09> - How can I tell if input, output, or
  806.      stderr has been redirected?
  807. Date: Sun, 03 Aug 97 20:00:44 CST
  808.  
  809.  
  810.  Normally, input and output are associated with the  console
  811.  (i.e., with the keyboard and the screen, respectively).  If
  812.  either is not, you know that it has been redirected.   Some
  813.  source code to check this is available at the usual archive
  814.  sites.
  815.  
  816.  
  817.  If   you   program  in  Turbo  Pascal,  you'll  want   this
  818.  downloadable collection of Turbo Pascal units:
  819.  
  820.  <ftp://garbo.uwasa.fi/pc/ts/tspaVV**.zip>
  821.  <ftp://ftp.simtel.net/pub/simtelnet/msdos/turbopas/tspaVV**
  822.  .zip>
  823.  
  824.  (Where  the VV is the current version and * is 70, 60,  55,
  825.  50,  or  40  for Turbo Pascal 7.0, 6.0, 5.5,  5.0,  or  4.0
  826.  respectively.)  Source code is not included.  Also see  the
  827.  downloadable  Frequently  Asked  Questions  files  by  Timo
  828.  Salmi:
  829.  
  830.  <ftp://garbo.uwasa.fi/pc/link/tsfaqp.zip>
  831.  <ftp://ftp.simtel.net/pub/simtelnet/msdos/info/tsfaqp37.zip
  832.  >
  833.  
  834.  If  you  program  in C, use isatty() if your implementation
  835.  has  it.  Otherwise, try the following file, which includes
  836.  source code:
  837.  
  838.  <ftp://ftp.simtel.net/pub/simtelnet/msdos/sysutil/is_con10.
  839.  zip>
  840.  
  841.  Good  references for the principles are PC Magazine 16  Apr
  842.  1991  (x: 7) page 374; Ray Duncan's {Advanced MS-DOS}, ISBN
  843.  1-55615-157-8, or Ralf Brown's interrupt list  (<Q:  2.03>)
  844.  for  INT 21 AX=4400; and Terry Dettman and Jim Kyle's  {DOS
  845.  Programmer's  Reference: 2d edition},  ISBN  0-88022-458-4,
  846.  pages 602-603.
  847.  
  848.  
  849. ------------------------------
  850.  
  851. Subject: <Q: 4.10> - How can I increase the size of the
  852.      keyboard buffer?
  853. Date: Fri, 07 Jul 95 15:34:00 CDT
  854.  
  855.  
  856.  Microsoft has its own keyboard extender available on the MS-
  857.  DOS supplemental disks for MS-DOS 6.22.
  858.  
  859.  
  860.  <ftp://ftp.microsoft.com/peropsys/msdos/public/supplmnt/sup
  861.  622.exe>
  862.  
  863.  
  864.  I tested only one of the many available device drivers that
  865.  do  this, namely BUF160, which extends the keyboard  buffer
  866.  to  160  characters. It performed flawlessly for two  years
  867.  with MS-DOS 5 and Windows 3.1. It's downloadable as
  868.  
  869.  <ftp://ftp.simtel.net/pub/simtelnet/msdos/keyboard/buf160_6
  870.  .zip>
  871.  <ftp://garbo.uwasa.fi/pc/keyboard/buf160_6.zip>
  872.  
  873. ------------------------------
  874.  
  875. Subject: <Q: 4.11> - How can I stuff characters into the
  876.      keyboard buffer?
  877.  
  878.  
  879.  If your computer has an enhanced keyboard (see <Q: 4.08>  -
  880.  "How  can my program tell what kind of keyboard is  on  the
  881.  system?"), put the scan code in CH and the ASCII  character
  882.  in  CL, then execute INT 16 AH=5. The return in AL is 0 for
  883.  success or 1 for buffer full.
  884.  
  885.  
  886. ------------------------------
  887.  
  888. Subject: End
  889.  
  890.  (FAQ       updates       can       be       found        at
  891.  <http://www.premiernet.net/~carlyle>.)
  892.  (End  of comp.os.msdos.programmer FAQ Version 1997.08  Part
  893.  2/5)
  894.  (This text is copyright 1997 by Jeffrey Carlyle. All rights
  895.  reserved.)
  896.  
  897.  
  898.  
  899. // Jeffrey Carlyle, Bowling Green, Kentucy USA
  900. // 
  901. // comp.os.msdos.programmer FAQ maintainer
  902. // <http://www.premiernet.net/~carlyle> 
  903.  
  904.  
  905.