home *** CD-ROM | disk | FTP | other *** search
/ POINT Software Programming / PPROG1.ISO / asm / x / x.asm < prev    next >
Assembly Source File  |  1993-01-30  |  5KB  |  139 lines

  1.          TITLE     'X - Keyboard Xtender'
  2.          PAGE 60,132
  3.  
  4. ;        X is a device driver that expands the keyboard buffer
  5. ;        to 256 keystrokes (512 bytes)
  6.  
  7. ;        X is Snareware.  Once you try it you'll be hooked!
  8.  
  9. ;        Written by Jeffrey Broome (CIS 76366,1211)
  10. ;        created: 1-17-93
  11.  
  12.  
  13. X        SEGMENT   PARA
  14.  
  15.          ASSUME    CS:X, DS:NOTHING    ; assume nothing, know everything!
  16.  
  17. BUF_SIZE EQU  512                      ; size of buffer in bytes
  18.  
  19.          ORG  0000H
  20.  
  21.          DD   -1                       ; next device pointer
  22.          DW   8000H                    ; device attributes
  23.          DW   offset STRATEGY          ; address of strategy routine
  24.          DW   offset INTERRUPT         ; address of interrupt routine
  25.          DB   'KEYB-X  '               ; device name
  26.  
  27. REQ_PTR  DD   ?                        ; request buffer pointer
  28.          
  29. BUFFER   DB   BUF_SIZE dup (?)         ; new keyboard buffer
  30.  
  31. STRATEGY PROC FAR
  32.          MOV  CS:WORD PTR [REQ_PTR],BX      ; save pointer to request buffer
  33.          MOV  CS:WORD PTR [REQ_PTR+2],ES
  34.          RET
  35. STRATEGY ENDP
  36.  
  37. INTERRUPT PROC FAR
  38.          PUSH DS
  39.          PUSH BX
  40.          PUSH AX
  41.          LDS  BX,CS:[REQ_PTR]          ; get pointer to request buffer
  42.          MOV  AH,[BX+2]                ; get command from buffer
  43.          OR   AH,AH                    ; is command = 0?
  44.          JNZ  EXIT
  45.  
  46.          CALL INIT                     ; call initialize routine
  47.  
  48. EXIT:    MOV  AX,100h                  ; set done bit in status
  49.          MOV  [BX+3],AX                ; indicate status
  50.          POP  AX                       ; restore stack and return
  51.          POP  BX
  52.          POP  DS
  53.          RET
  54. INTERRUPT ENDP
  55.  
  56. INIT     PROC NEAR
  57.          PUSH CX                       ; save CX
  58.          PUSH DX                       ; save DX
  59.  
  60.          MOV  AX,OFFSET BUFFER         ; get address of new keyboard buffer
  61.          MOV  CX,CS                    ; get current code segment
  62.          CMP  CX,1000h                 ; is segment too big?
  63.          JNC  TOOBIG                   ; jump if code segment to high
  64.          SHL  CX,1                     ; convert segment to real address
  65.          SHL  CX,1
  66.          SHL  CX,1
  67.          SHL  CX,1
  68.          ADD  CX,AX                    ; add in offset
  69.          SUB  CX,400h                  ; subtract BIOS memory segment (40h)
  70.          MOV  AX,40h
  71.          MOV  DS,AX                    ; point to BIOS memory segment
  72.          MOV  BX,1Ah
  73.          MOV  [BX],CX                  ; store keyboard head pointer
  74.          MOV  [BX+2],CX                ; store tail pointer
  75.          MOV  BX,80h
  76.          MOV  [BX],CX                  ; store keyboard buffer start
  77.          ADD  CX,BUF_SIZE              ; add size of keyboard buffer
  78.          MOV  [BX+2],CX                ; store keyboard buffer end
  79.  
  80.          MOV  AX,OFFSET INIT
  81.          MOV  CX,CS                    ; get current code segment
  82.          SHL  CX,1                     ; convert segment to real address
  83.          SHL  CX,1
  84.          SHL  CX,1
  85.          SHL  CX,1
  86.          ADD  CX,AX                    ; add in offset
  87.          ADD  CX,0Fh                   ; round to next segment
  88.          SHR  CX,1                     ; convert back to segment
  89.          SHR  CX,1         
  90.          SHR  CX,1         
  91.          SHR  CX,1         
  92.  
  93.          MOV  AH,9                     ; print a message function of int 21h
  94.          LEA  DX,X_MSG                 ; get address of message
  95.          PUSH CS
  96.          POP  DS                       ; DS = CS
  97.          INT  21h                      ; call DOS
  98.  
  99.          LDS  BX,CS:[REQ_PTR]          ; get pointer to request buffer
  100.          MOV  AL,1
  101.          MOV  [BX+0Dh],AL              ; number of units (must be non-zero)
  102.  
  103.          XOR  AX,AX                    ; AX = 0
  104.          MOV  [BX+0Eh],AX              ; offset of next free byte (0)
  105.          MOV  [BX+10h],CX              ; segment of next free byte
  106.  
  107.          JMP  SHORT DONE               ; go return to caller
  108.  
  109.  
  110. TOOBIG:  MOV  AH,9                     ; print a message function of int 21h
  111.          MOV  DX,OFFSET X_ERR          ; get address of error message
  112.          PUSH CS
  113.          POP  DS                       ; DS = CS
  114.          INT  21h                      ; call DOS
  115.  
  116.          LDS  BX,CS:[REQ_PTR]          ; get pointer to request buffer
  117.          MOV  AL,0
  118.          MOV  [BX+0Dh],AL              ; number of units=0 means do not load
  119.  
  120.          XOR  AX,AX                    ; AX = 0
  121.          MOV  [BX+0Eh],AX              ; offset of next free byte (0)
  122.  
  123.          MOV  CX,CS                    ; segment of free byte = CS
  124.                                        ; this will not load driver
  125.          MOV  [BX+10h],CX              ; segment of next free byte
  126.  
  127. DONE:    POP  DX                       ; restore DX
  128.          POP  CX                       ; restore CX
  129.          RET
  130. INIT     ENDP 
  131.  
  132. X_MSG    DB   'Keyboard Xtender Loaded',13,10,'$'
  133. X_ERR    DB   'Keyboard Xtender cannot be loaded!',13,10,'$'
  134.  
  135.  
  136. X        ENDS
  137.          END
  138.  
  139.