home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Interactive Guide / c-cplusplus-interactive-guide.iso / c_ref / csource4 / 259_01 / conio.asm < prev    next >
Assembly Source File  |  1988-02-25  |  18KB  |  350 lines

  1. ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  2. ;*                                                                           *
  3. ;*  FILE:  CONIO.ASM                                                         *
  4. ;*                                                                           *
  5. ;*  This file contains library routines for putch(), getch(), getche(),      *
  6. ;*  ungetch(), and kbhit().  Although these routines are included in the     *
  7. ;*  C libraries that come with the Microsoft (R) C compiler, they are        *
  8. ;*  redirectable, which renders them useless.  (kbhit() is not redirectable, *
  9. ;*  but was added to increase functionality; specifically, to indicate what  *
  10. ;*  key was pressed, while still implementing Ctrl-C and Ctrl-S checking.    *
  11. ;*                                                                           *
  12. ;*  Since these five routines are used by cputs(), cgets(), cprintf(), and   *
  13. ;*  cscanf(), these higher-level functions are also useless, unless          *
  14. ;*  correctly working versions of putch(), getch(), getche(), ungetch(),     *
  15. ;*  and kbhit() are installed in the C libraries.                            *
  16. ;*                                                                           *
  17. ;*  (If you WANT your I/O to be redirectable, you can use putchar(),         *
  18. ;*   getchar(), ungetchar(), puts(), gets(), printf(), and scanf() ).        *
  19. ;*                                                                           *
  20. ;*  When assembling, use the -dRNEAR option if assembling for small or       *
  21. ;*  compact models, and the -dRFAR option if assembling for medium, large,   *
  22. ;*  or huge models.  If you are not using masm ver 4.0 or later, you will    *
  23. ;*  have to define either a RNEAR or RFAR label at the top of this program.  *
  24. ;*                                                                           *
  25. ;*  To assemble, use a command like this:                                    *
  26. ;*                                                                           *
  27. ;*     masm -mx -dRFAR conio;                                                *
  28. ;*                                                                           *
  29. ;*  To install these routines into the library, use a command like this:     *
  30. ;*                                                                           *
  31. ;*     lib llibc -putch -getch -getche -ungetch -kbhit +conio;               *
  32. ;*                                                                           *
  33. ;*                                                                           *
  34. ;*  Routines written by Jeff D. Pipkins at Quality Micro Systems, Inc.       *
  35. ;*  This file is hereby declared to be public domain.  Since it is public    *
  36. ;*  domain, QMS (R) is not liable for ANY damages caused by the use or       *
  37. ;*  abuse of this material.  Original release: 03/02/1987                    *
  38. ;*                                                                           *
  39. ;*  NOTE: These routines were written to work with the Microsoft (R)         *
  40. ;*        C compiler (ver 3.0 or later), but they can easily be adapted      *
  41. ;*        to work with other C compilers on any IBM (R) PC compatible.       *
  42. ;*                                                                           *
  43. ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  44. ;*                                                                           *
  45. ;*  Revision 04/16/1987 (JDP):                                               *
  46. ;*     Added code for ungetch() with a one-character buffer.                 *
  47. ;*     See ungetch() and getch() routines for details.                       *
  48. ;*                                                                           *
  49. ;*  Revision 06/09/1987 (JDP):                                               *
  50. ;*     Modified getch() to translate lf to cr (it already translated         *
  51. ;*     cr to lf) so that a discriminating routine can tell the difference    *
  52. ;*     if necessary.                                                         *
  53. ;*     Added kbhit() in response to a quest by The C User's Group for        *
  54. ;*     a standard routine.                                                   *
  55. ;*     Added more documentation in the external .DOC file so that            *
  56. ;*     C programmers who have no assembly-language experience can read       *
  57. ;*     the specs without looking at the assembly code.                       *
  58. ;*                                                                           *
  59. ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  60.  
  61. IF1
  62.  IFNDEF RNEAR
  63.   IFNDEF RFAR
  64.    %OUT FATAL ERROR: You MUST specify either -dRNEAR or -dRFAR on the command line!
  65.    %OUT              (Note: Remember to use the -MX option as well!)
  66.    .ERR
  67.    ERROR EQU TRUE
  68.   ENDIF
  69.  ENDIF
  70.  IFDEF RNEAR
  71.   IFDEF RFAR
  72.    %OUT FATAL ERROR: You CANNOT specify both -dRNEAR and -dRFAR on the command line!
  73.    %OUT              (Note: Remember to use the -MX option as well!)
  74.    .ERR
  75.    ERROR EQU TRUE
  76.   ENDIF
  77.  ENDIF
  78.  IFNDEF ERROR
  79.   IFDEF RNEAR
  80.    %OUT Generating object file for use with small or compact memory models...
  81.   ELSE
  82.    %OUT Generating object file for use with medium, large, or huge memory models...
  83.   ENDIF
  84.  ENDIF
  85. ENDIF
  86.  
  87. _TEXT        Segment      Byte Public 'CODE'
  88.              Assume       CS:_TEXT
  89.  
  90. Parm         Equ          [BP]
  91. ungot_char   DW           0         ; Storage for one keystroke of lookahead
  92. EOF          Equ          -1
  93.  
  94. ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  95. ;*                                                                           *
  96. ;*  void putch(c)                                                            *
  97. ;*     int c;                                                                *
  98. ;*                                                                           *
  99. ;*  Displays the character passed on the screen, regardless of redirection.  *
  100. ;*  NOTE: Any line feeds displayed ('\n') will be preceeded by a cr ('\r').  *
  101. ;*                                                                           *
  102. ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  103.  
  104.              Public       _putch
  105. IFDEF RFAR
  106. _putch       Proc         Far
  107. ELSE
  108. _putch       Proc         Near
  109. ENDIF
  110.  
  111. ;*  Parameters
  112.  
  113. IFDEF RFAR
  114. putch        Struc
  115.              DW           ?         ; Single-word save area for BP
  116.              DD           ?         ; Double-word return address
  117. char         DW           ?         ; Character to put on the console
  118. putch        EndS
  119. ELSE
  120. putch        Struc
  121.              DW           ?         ; Single-word save area for BP
  122.              DW           ?         ; Single-word return address
  123. char         DW           ?         ; Character to put on the console
  124. putch        EndS
  125. ENDIF
  126.  
  127. ;*  Output character to console using video BIOS
  128.  
  129.              Push         BP
  130.              Mov          BP, SP
  131.              Mov          CX, SI    ; Some BIOS clones destroy SI & DI
  132.              Mov          DX, DI    ;   so save them first.
  133.              Mov          AH, 0EH   ; TTY output function
  134.              Mov          BL, 7     ; Attribute
  135.              Mov          AL, Byte Ptr Parm[char]
  136.              Cmp          AL, 0AH   ; Line feed?
  137.              Je           CRLF      ; If so, translate to CRLF sequence
  138.              Int          10H       ; Video BIOS
  139.              Mov          SI, CX    ; Restore SI
  140.              Mov          DI, DX    ;   and DI
  141.              Pop          BP        ; BIOS destroys BP if scrolling occurs.
  142.              Ret
  143. CRLF:
  144.              Mov          AH, 0BH   ; Check keyboard status
  145.              Int          21H       ; Allow Ctrl-C or Ctrl-S
  146.              Mov          AX, 0E0DH
  147.              Int          10H
  148.              Mov          AX, 0E0AH
  149.              Int          10H
  150.              Mov          SI, CX
  151.              Mov          DI, DX
  152.              Pop          BP
  153.              Ret
  154.  
  155. _putch       En