home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / listings / v_02_09 / 2n09050a < prev    next >
Text File  |  1991-08-04  |  8KB  |  185 lines

  1.         PAGE    ,132
  2.         TITLE   TYPEAHED - Expands type ahead buffer to 127 chars.
  3. COMMENT $
  4.         Assemble, link and convert as follows:
  5.         MASM TYPEAHED;
  6.         LINK TYPEAHED;
  7.         EXE2BIN TYPEAHED TYPEAHED.SYS
  8.  
  9.         Install by adding the following line to CONFIG.SYS
  10.         DEVICE=TYPEAHED.SYS
  11.  
  12.         Program changes default buffer pointers to a new area
  13.         contained herein if this new area is within the 64K
  14.         limit of the segment at 0040. This new buffer is 128
  15.         characters (words) long and is always loaded even if
  16.         not used. The buffer is reset to empty. If the error
  17.         message is displayed, move the line nearer the beginning
  18.         of the CONFIG.SYS file. The command should always be
  19.         ahead of any RAMDisk loader.
  20.  
  21.         The address of the buffer is adjusted to bypass a bug
  22.         in the DOS 2.xx CON driver and ANSI.SYS.$
  23.  
  24. ;       ************************************************************
  25. ;       *                                                          *
  26. ;       *               Dummy Device Driver Header                 *
  27. ;       *                                                          *
  28. ;       ************************************************************
  29.  
  30. CSEG    SEGMENT
  31.         ORG     00000H                  ; For all device drivers
  32.  
  33. Header          DD      -1              ; One device
  34.                 DW      08000H          ; Character device
  35. StratA          DW      Strat           ; Strategy entrance
  36. IntrA           DW      Intr            ; Interrupt entrance
  37.                 DB      'Typeahed'      ; 8 character dummy name
  38.  
  39. ;       ************************************************************
  40. ;       *                                                          *
  41. ;       *                     Resident data                        *
  42. ;       *                                                          *
  43. ;       ************************************************************
  44.  
  45. Chars           EQU     128
  46. Bytes           EQU     Chars*2
  47. NewBuff         EQU     $               ; Buffer start
  48. EndBuff         EQU     $+Bytes         ; Buffer end
  49.  
  50. ;       ************************************************************
  51. ;       *                                                          *
  52. ;       *                     Resident code                        *
  53. ;       *                                                          *
  54. ;       ************************************************************
  55.  
  56.         ASSUME  CS:CSEG, DS:NOTHING, ES:NOTHING
  57. ;       Note: TYPEAHED has no resident code, just a buffer.
  58.  
  59. ;       ************************************************************
  60.  
  61. ;       *                                                          *
  62. ;       *                   Installation data                      *
  63. ;       *                                                          *
  64. ;       ************************************************************
  65.  
  66. ;       ROM BIOS DATA AREAS
  67. ;       -------------------
  68. DATA            SEGMENT AT 00040H
  69.                 ORG     0001AH
  70. BUFFER_HEAD     DW      KB_BUFFER       ; POINTER TO HEAD OF KEYBOARD BUFFER
  71. BUFFER_TAIL     DW      KB_BUFFER       ; POINTER TO TAIL OF KEYBOARD BUFFER
  72. KB_BUFFER       DW      16 DUP(?)       ; ROOM FOR 15 ENTRIES
  73. KB_BUFFER_END   LABEL   WORD
  74.                 ORG     00080H
  75. BUFFER_START    DW      KB_BUFFER       ; ADDRESS OF START OF KEYBOARD BUFFER
  76. BUFFER_END      DW      KB_BUFFER_END   ; ADDRESS OF END OF KEYBOARD BUFFER
  77. DATA            ENDS
  78.  
  79. ;       DEVICE DRIVER REQUEST PACKET
  80. ;       ----------------------------
  81. IOPacket        STRUC
  82. IO_CMDLEN       DB      ?
  83. IO_UNIT         DB      ?
  84. IO_CMD          DB      ?
  85. IO_STATUS       DW      ?
  86.                 DB      8 DUP(?)
  87. IO_MEDIA        DB      ?
  88. IO_ADDRESS      DW      ?
  89.                 DW      ?
  90. IO_COUNT        DW      ?
  91. IO_START        DW      ?
  92. IOPacket        ENDS
  93.  
  94. ;       INSTALLATION DATA
  95. ;       -----------------
  96. Init    PROC    FAR
  97.  
  98. Packet          DD      0               ; Request packet address
  99. THMess          DB      'Too high in memory! No ',07H
  100. Message         DB      'TYPEAHED installed',0DH,0AH,24H
  101.  
  102. ;       ************************************************************
  103. ;       *                                                          *
  104. ;       *                   Installation code                      *
  105. ;       *                                                          *
  106. ;       ************************************************************
  107.  
  108.         ASSUME  DS:NOTHING, ES:NOTHING
  109. Strat:
  110.         MOV     WORD PTR Packet,BX      ; Save Packet address
  111.         MOV     WORD PTR Packet+2,ES
  112.         PUSH    BX                      ; Save all registers used
  113.         PUSH    DS
  114.         PUSH    AX
  115.         PUSH    CX
  116.         PUSH    DX
  117.  
  118. ;       NORMAL TSR INSTALLATION
  119. ;       -----------------------
  120.  
  121.  
  122.         MOV     AX,CS                   ; From this segment address
  123.         SUB     AX,SEG DATA             ; subtract the DATA address
  124.         ADD     AX,(EndBuff-Header+0FFH)/16     
  125.                                         ; and add buffer size
  126.         PUSH    AX
  127.         CMP     AX,01000H               ; Test within one 64K segment
  128.         JNB     TooHigh                 ; No, do not change pointers
  129.         SUB     AX,(EndBuff-Header+0FFH)/16
  130.                                         ; Get segment difference
  131.         MOV     CL,4                    ; Convert to byte difference
  132.         SHL     AX,CL
  133.         MOV     BX,SEG DATA             ; Change info in DATA segment
  134.         MOV     DS,BX
  135.         ASSUME  DS:DATA
  136.         ADD     AX,OFFSET NewBuff+0FFH  ; Calculate offset of beginning
  137.         AND     AX,0FF00H               ; Drop last byte (DOS2.xx fix)
  138.         CLI                             ; Turn off keyboard
  139.         MOV     BUFFER_HEAD,AX          ; Put into buffer pointers
  140.         MOV     BUFFER_TAIL,AX
  141.         MOV     BUFFER_START,AX         ; and buffer addresses
  142.         ADD     AX,Bytes                ; Add in buffer byte size
  143.         MOV     BUFFER_END,AX           ; for buffer end address
  144.         STI                             ; Turn keyboard back on
  145.         MOV     DX,OFFSET Message       ; OK message
  146.         JMP     SHORT Installed
  147. TooHigh:
  148.         MOV     DX,OFFSET THMess        ; Too High message
  149. Installed:
  150.         PUSH    CS                      ; Make DS = CS for DOS
  151.         POP     DS
  152.         ASSUME  DS:CSEG
  153.         MOV     AH,9                    ; Output message
  154.         INT     021H
  155.         POP     AX                      ; From highest segment
  156.         AND     AX,0FFF0H               ; rounded down
  157.         MOV     BX,CS                   ; and this segment address
  158.         SUB     BX,SEG DATA             ; less the DATA address
  159.         SUB     AX,BX                   ; find the paragraphs used
  160.         MOV     CL,4                    ; Convert to bytes
  161.         SHL     AX,CL                   ; to save for buffer
  162.  
  163. ;       SPECIAL DDD TERMINATION
  164. ;       -----------------------
  165.  
  166.         ASSUME  DS:NOTHING
  167.         LDS     BX,DWORD PTR Packet     ; Restore Packet info
  168.         MOV     WORD PTR [BX+IO_ADDRESS],AX
  169.                                         ; Set memory request
  170.         MOV     WORD PTR [BX+IO_ADDRESS+2],CS
  171.         MOV     [BX+IO_STATUS],00100H   ; Set done bits
  172.         POP     DX                      ; Restore registers used
  173.         POP     CX
  174.         POP     AX
  175.         POP     DS
  176.         POP     BX
  177. Intr:
  178.         RET                             ; Exit device installaion
  179. Init    ENDP
  180.  
  181. CSEG    ENDS
  182.  
  183.         END
  184. ; End of File
  185.