home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS - Coast to Coast / simteldosarchivecoasttocoast.iso / keyboard / set_clik.asm < prev    next >
Assembly Source File  |  1994-03-04  |  4KB  |  137 lines

  1.  
  2.     page    60,132
  3. ;
  4. ; SET_CLIK : A program to set the key click count on the COMPAQ
  5. ;
  6. ;    Tom Brengle (BRENGLE@LLL%LLL.MFE)
  7. ;
  8. ;    Lawrence Livermore National Laboratory
  9. ;    P. O. Box 5511, L-630
  10. ;    Livermore, California  94550
  11. ;
  12. ; This program sets a parameter in the ROM BIOS data area of the COMPAQ
  13. ; which is used to determine the duration of the tone generated when a
  14. ; key is struck.  The parameter is stored at 40:6A.  A default value
  15. ; of 1 is set by the bootstrap code in the COMPAQ.  A value of zero
  16. ; turns off the tone completely.  A value of 70H generates a fairly loud
  17. ; tone, and larger values don't appreciably change it.  SET_CLIK looks
  18. ; for a decimal number on the command line to store at 40:6A.  If it
  19. ; doesn't find one, it stores the value set for the parameter DEFAULT.
  20. ;
  21. ; To build SET_CLIK :
  22. ;
  23. ;    1.  Select a value for DEFAULT and assemble SET_CLIK.
  24. ;
  25. ;        MASM SET_CLIK;
  26. ;
  27. ;    2.  Link SET_CLIK;
  28. ;
  29. ;        LINK SET_CLIK;
  30. ;
  31. ;    3.  Convert SET_CLIK.EXE to SET_CLIK.COM;
  32. ;
  33. ;        EXE2BIN SET_CLIK.EXE SET_CLIK.COM
  34. ;
  35. ;
  36. DEFAULT       equ     1h        ; Default value for the key click parameter.
  37.                     ;   Zero turns off tone altogether.
  38.                     ;   70H generates about the loudest
  39.                     ;     tone possible.
  40.  
  41. ROM_BIOS_Data    segment at 40h        ; Locate the ROM BIOS data segment.
  42.     org    6Ah
  43. Click_Count    db
  44. ROM_BIOS_Data    ends
  45.  
  46. code_seg    segment
  47.     assume    cs:code_seg
  48.     org    80h
  49. Command_Line    label    byte        ; Locate the command line buffer.
  50.     org    100h
  51.  
  52. Set_Clik    proc    near
  53.     assume    ds:ROM_BIOS_Data    ; Set up ROM BIOS data segment.
  54.     mov    bx,ROM_BIOS_Data
  55.     mov    ds,bx
  56.  
  57.     call    Get_Number        ; See if there is an argument from
  58.                     ;  the command line.
  59.     jc    Use_Default        ; No, then use the default.
  60.     mov    Click_Count,al        ; Yes, then use the input value,
  61.     jmp    Exit            ;  and exit.
  62.  
  63. Use_Default:
  64.     mov    al,DEFAULT        ; Store DEFAULT into Click_Count,
  65.     mov    Click_Count,al        ;  and exit.
  66.  
  67. Exit:    mov    ah,0            ; Exit to DOS.
  68.     int    21h
  69.  
  70. Set_Clik    endp
  71.  
  72. ; Subroutine to get a decimal number from the command line :
  73. Get_Number    proc    near
  74.     push    ds            ; Save some registers.
  75.     push    bx
  76.     push    cx
  77.     push    si
  78.     push    di
  79.     assume    ds:code_seg        ; Set up the data segment to be the
  80.     mov    ax,cs            ;  code segment.
  81.     mov    ds,ax
  82.  
  83.     mov    si,offset Command_Line+1    ; Set up an index to the
  84.                         ;  command line buffer.
  85.     mov    cx,0            ; Check the command line buffer
  86.     mov    cl,Command_Line     ;  character count to see if an
  87.     cmp    cx,0            ;  input value has been supplied.
  88.     je    No_Arg_Return        ; If not, go store default value.
  89.  
  90.     mov    bx,cx            ; Set up to scan over leading spaces.
  91.     mov    al,20h
  92.     mov    byte ptr [bx+si],al
  93.     mov    di,si
  94.     repe    scasb            ; Do the scan.
  95.     cmp    cx,0            ; If the count is now zero, there
  96.                     ;  was nothing but spaces.
  97.     jl    No_Arg_Return        ; In that case, go store default value.
  98.  
  99.     mov    ax,0            ; Clear a register to accumulate the
  100.                     ;  input value, digit by digit.
  101.     mov    bh,10            ; Set up multiply factor for decimal
  102.                     ;  left-shift operation.
  103.     dec    di            ; Back up pointer to first digit.
  104.  
  105. Loop_on_Digits:
  106.     mov    bl,byte ptr [di]    ; Get the next digit.
  107.     sub    bl,30h            ; Convert it from ASCII.
  108.     cmp    bl,0h            ; Check to see if it is in range.
  109.     jl    End_of_Digits        ; If not, we are done.
  110.     cmp    bl,9h
  111.     jg    End_of_Digits
  112.     mul    bh            ; Do a decimal left-shift on
  113.                     ;  accumulated value.
  114.     add    al,bl            ; Add in new digit.
  115.     inc    di            ; Increment command line
  116.                     ;  buffer pointer.
  117.     jmp    Loop_on_Digits        ; Go back for next digit.
  118.  
  119. End_of_Digits:                ; Here if we found an input value.
  120.     clc                ; Clear error flag.
  121.     jmp    G_N_Return
  122.  
  123. No_Arg_Return:                ; Here if we didn't find one.
  124.     stc                ; Set error flag.
  125.  
  126. G_N_Return:
  127.     pop    di            ; Restore the registers.
  128.     pop    si
  129.     pop    cx
  130.     pop    bx
  131.     pop    ds
  132.     ret                ; And return.
  133. Get_Number    endp
  134. code_seg    ends
  135.  
  136.     end    Set_Clik
  137.