PAGE ,132
TITLE  TYPEAHEAD - Expands type ahead buffer to 128 characters
SUBTTL Clifford J. Vander Yacht
;
;             From PC WORLD Vol 6 No 4
;
;             Assemble with MASM
;             Link
;             Exe2Bin TYPEAHED.EXE TYPEAHED.SYS
;
;             Place in CONFIG.SYS
;             Reboot system
;
;
Chars         EQU       128
Bytes         EQU       Chars*2
;
IOPacket      STRUC
IO_CMDLEN     DB        ?
IO_UNIT       DB        ?
IO_CMD        DB        ?
IO_STATUS     DW        ?
              DB        8 DUP(?)
IO_MEDIA      DB        ?
IO_ADDRESS    DW        ?
              DW        ?
IO_COUNT      DW        ?
IO_START      DW        ?
IOPacket      ENDS
;
;
DATA          SEGMENT AT 40H
              ORG       001AH
BUFFER_HEAD   DW        ?
BUFFER_TAIL   DW        ?
              ORG       0080H
BUFFER_START  DW        ?
BUFFER_END    DW        ?
DATA          ENDS
;
;
CSEG          SEGMENT
              ASSUME    CS:CSEG, DS:NOTHING, ES:NOTHING
              ORG       0000H                    ;Device drivers origin
;
;
Prefix        DD        -1
              DW        8000H
              DW        Strat
              DW        Intr
              DB        'TYPEAHD'     ;hex 02 so you can't access
;                                      the device by accident
;
NewBuff       EQU       $                        ;Buffer start
EndBuff       EQU       $+Bytes                  ;Buffer end
;
;             END OF STAY RESIDENT PORTION
;
THMess        DB        'Too high in memory! No ',07H
Message       DB        'TYPEAHED installed',0DH,0AH,'$'
Packet        DD        0                        ;Request packet address
;
;             Initialization / Installation routines
;
Strat         PROC      FAR
              mov       WORD PTR Packet,BX       ;Save Packet info
              mov       WORD PTR Packet+2,ES
              RET
;
;
Intr:
              push      AX
              push      BX
              push      CX
              push      DX
              push      DS
;
              push      CS
              pop       AX             ;From this segment address,
              sub       AX,SEG DATA    ;  subtract the DATA address
              add       AX,(Endbuff-Prefix+0FFH)/16 ;and add buff size
              push      AX
              cmp       AX,1000H       ;Within 64K segment?
              JNB       TooHigh
              sub       AX,(Endbuff-Prefix+0FFH)/16 ;Get segment diff
              mov       CL,4           ;convert to byte difference
              SHL       AX,CL
              mov       BX,SEG DATA    ;Change info in DATA segment
              mov       DS,BX
              ASSUME    DS:DATA
              add       AX,OFFSET NewBuff+0FFH   ;offset of beginning
              and       AX,0FF00H      ;drop last byte(DOS2.XX fix??)
              mov       BUFFER_HEAD,AX ;put into buffer pointers
              mov       BUFFER_TAIL,AX
              mov       BUFFER_START,AX     ;and buffer addresses
              add       AX,Bytes
              mov       BUFFER_END,AX       ; for buffer end address
              mov       DX,OFFSET Message   ;OK
              JMP       SHORT Installed
TooHigh:
              mov       DX,OFFSET THMess    ;too high message
Installed:
              push      CS
              pop       DS
              ASSUME    DS:CSEG
              mov       AH,9
              INT       21H
              pop       AX             ;From highest segment
              and       AX,0FFF0H      ; rounded down
              push      CS
              pop       BX             ; and this segment address
              sub       BX,SEG DATA    ; less the DATA segment
              sub       AX,BX          ; find the paragraphs used
              mov       CL,4           ;Convert to bytes
              shl       AX,CL          ; to save for buffer
              lds       BX,DWORD PTR Packet
              mov       [BX+IO_ADDRESS],AX  ;Set memory request
              push      CS
              pop       AX
              mov       [BX+IO_ADDRESS+2],AX
              mov       [BX+IO_STATUS],0100H     ;Set done bits
;
              pop       DS
              pop       DX
              pop       CX
              pop       BX
              pop       AX
              RET
;
Strat         ENDP
;
;
CSEG          ENDS
              END
