Как и обещал, выкладываю вторую версию утили для настройки скорости клавиатуры.
;ВЕРСИЯ 2.0A
;ТЕПЕРЬ НАСТРОЙКА КЛАВЫ ПРОИСХОДИТ ЧЕРЕЗ ПРЕРЫВАНИЕ BIOS
;НО ПОД WINDOWS ВСЁ РАВНО НЕ РАБОТАЕТ
[BITS 16]
[ORG 256]
START
;ВЫВОДИМ СТРОКУ С ИНФОРМАЦИЕЙ О ПРОГРАММЕ И ОБ АВТОРЕ
MOV DX,STR0
MOV AH,9
INT 21H
;ПРОВЕРЯЕМ, ДОСТАТОЧНО ЛИ ПАМЯТИ
;КОЛИЧЕСТВО ВЫДЕЛЕННОЙ ПАМЯТИ В ЭТОМ СЕГМЕНТЕ ХРАНИТСЯ ПО СМЕЩЕНИЮ 6
CMP WORD [6],F_END
JNC .M1
MOV DX,STR2
JMP SHORT .ERR2 ;ЕСЛИ НЕ ХВАТАЕТ - ВЫХОД
;РАЗБОР КОМАНДНОЙ СТРОКИ
.M1 MOV SI,80H
MOV DI,PTRS
MOV CL,2
CALL TEST_STR
JC .ERR
;ПРЕОБРАЗУЕМ ПЕРВЫЙ ПАРАМЕТР В ЧИСЛО
MOV SI,[PTRS]
CALL ARG
JC .ERR
MOV [ARG1],AL
;ПРЕОБРАЗУЕМ ВТОРОЙ ПАРАМЕТР
MOV SI,[PTRS+2]
CALL ARG
JC .ERR
MOV [ARG2],AL
;СОБСТВЕННО, НАСТРОЙКА КЛАВЫ
;ПОРЯДОК ПАРАМЕТРОВ СОХРАНЁН РАДИ
; СОВМЕСТИМОСТИ С ПРЕДЫДУЩЕЙ ВЕРСИЕЙ
;ПРИШЛОСЬ ПОЖЕРТВОВАТЬ ПАРОЙ БАЙТ КОДА РАДИ ЭТОГО
MOV BL,[ARG2]
CMP BL,32
JNC .ERR
MOV BH,[ARG1]
CMP BH,4
JNC .ERR
MOV AX,0305
INT 16H
;ВСЁ OK, ВЫХОДИМ С КОДОМ 0
MOV AX,4C00H
INT 21H
;ОШИБКА В ПАРАМЕТРАХ - ПЕЧАТЬ СТРОКИ С ИНФОЙ
.ERR MOV DX,STR1
.ERR2 MOV AH,9
INT 21H
;ВЫХОД С КОДОМ FF
MOV AX,4CFFH
INT 21H
STR0 DB 'KEYBOARD SPEED V2.0A '
DB 'COPYRIGHT (C) BY SERGAEV ANDREY AKA SAVC 24.05.2006',10,13,24h
STR1 DB 10,13,9,'Usage:',9,9,'speedkey.com p1 p2',10,10,13
DB 9,'p1 - delay time',9,9,'[0;3]',10,13
DB 9,'p2 - typematic rate',9,'[0;31]',10,10,13
DB 9,'Example:',9,'speedkey.com 0 0',10,10,10,13
DB 9,'Использование:',9,'speedkey.com p1 p2',10,10,13
DB 9,'p1 - задержка перед повтором',9,'[0;3]',10,13
DB 9,'p2 - скорость автоповтора',9,'[0;31]',10,10,13
DB 9,'Пример:',9,9,'speedkey.com 0 0',10,10,13
DB 24h
STR2 DB 10,13,'Not enough memory.',10,13,24h
;ASCII DEC -> BYTE
;
;IN:
; SI - АДРЕС НАЧАЛА ПАРАМЕТРА
;OUT:
; CF=1 ERROR
; CF=0 AL - ПЕРЕВЕДЁННОЕ ЧИСЛО
;
ARG
;ЗАГРУЗИЛИ БАЙТ
;ВЫЧЛИ ИЗ НЕГО 48
;ЕСЛИ ЭТО БЫЛ СИМВОЛ С КОДАМИ ОТ 48 "0" ДО 57 "9", ОН ПРЕОБРАЗУЕТСЯ
; В СВОЁ ЗНАЧЕНИЕ - ОТ 0 ДО 9
;ЕСЛИ ЭТО БЫЛ СИМВОЛ С КОДАМИ ОТ 0 ДО 47, БУДЕТ ПЕРЕПОЛНЕНИЕ, ЧИСЛО ПЕРЕЙДЁТ
; ЗА ГРАНИЦУ И БУДЕТ ОТСЕЧЕНО СЛЕД. КОМАНДОЙ
;СИМВОЛЫ С КОДАМИ ОТ 58 ДО 255 ОТСЕКАЕТ СЛЕДУЮЩАЯ КОМАНДА СРАВНЕНИЯ
;ЕСЛИ НЕ ПОПАЛИ В ДИАПАЗОН, ВЫХОД С ОШИБКОЙ
;РЕЗУЛЬТАТ ПОМЕСТИМ В BH, BL
MOV BH,0
LODSB
SUB AL,30H
CMP AL,10
JNC .ERR
MOV BL,AL
;ТО ЖЕ САМОЕ
;НО ЕСЛИ НЕ ПОПАЛИ В ДИАПАЗОН, ПРЕКРАЩАЕМ ПРЕОБРАЗОВАНИЕ - ОДИН ДЕС. РАЗРЯД
;ЕСЛИ ПОПАЛИ - ЧИСЛО КАК МИНИМУМ ДВУЗНАЧНОЕ - ПРОДОЛЖАЕМ
;В ЛЮБОМ СЛУЧАЕ РЕЗУЛЬТАТ В BH, BL
;BH - СТАРШИЙ РАЗРЯД
;BL - МЛАДШИЙ
LODSB
SUB AL,30H
CMP AL,10
JNC .M1
MOV BH,BL
MOV BL,AL
;ЕСЛИ ЕСТЬ ТРЕТЬЯ ЦИФРА - ОШИБКА
;ЕСЛИ НЕТ - ЗАКАНЧИВАЕМ ПРЕОБРАЗОВАНИЕ
LODSB
SUB AL,30H
CMP AL,10
JNC .M1
.ERR STC
RETN
;10*BH + BL -> AL
.M1 MOV AX,BX
AAD
.M2 CLC
RETN
;IN:
; CL - КОЛИЧЕСТВО ПАРАМЕТРОВ В СТРОКЕ
; DS:SI - НАЧАЛО СТРОКИ
; ES:DI - АДРЕС, ПО КОТОРОМУ ЗАПИСЫВАТЬ АДРЕСА НАЧАЛ ПАРАМЕТРОВ В СТРОКЕ
;
;OUT:
; CF=1 ERROR IN PARAMETERS
; CF=0 OK
TEST_STR
;ПЕРВЫЙ БАЙТ - ДЛИНА ОСТАВШЕЙСЯ ЧАСТИ СТРОКИ
MOV BX,SI
LODSB
XLATB
OR AL,AL
JZ .M5 ;СТРОКА ПУСТА - ОШИБКА
MOV AH,AL
;ПОИСК СИМВОЛА, ОТЛИЧНОГО ОТ ПРОБЕЛА
.M1 LODSB
CMP AL,20H
JNZ .M3
.M2 DEC AH
JNZ .M1
;ЕСЛИ СТРОКА ЗАКОНЧИЛАСЬ, А СИМВОЛ НЕ НАШЛИ - ОШИБКА
STC
RETN
;СОХРАНИТЬ АДРЕС СИМВОЛА
;ЕСЛИ ЧИСЛО ПАРАМЕТРОВ ИСЧЕРПАНО - ВЫХОД
.M3 MOV AX,SI
DEC AX
STOSW
DEC CL
CLC
JZ .M6
;ПОИСК ПРОБЕЛА
.M4 LODSB
CMP AL,20H
JZ .M2
DEC AH
JNZ .M4
;ЕСЛИ НЕ НАШЛИ, А СТРОКА ЗАКОНЧИЛАСЬ - ОШИБКА
.M5 STC
.M6 RETN
;ОБЛАСТЬ НЕИНИЦИАЛИЗИРОВАННЫХ ПЕРЕМЕННЫХ
PTRS
ARG1 EQU PTRS+4
ARG2 EQU ARG1+1
F_END EQU ARG2+1024+1 ;РЕЗЕРВИРУЕМ ПРОСТРАНСТВО ДЛЯ СТЕКА
;КТО-НИБУДЬ ЗНАЕТ, КАКОЕ ПРОСТРАНСТВО СЛЕДУЕТ ЗАДАВАТЬ?
;В МАНУЛАХ НИЧЕГО НЕТ ОБ ЭТОМ
;В DOS6.22 ХВАТАЕТ 512 БАЙТ
;ДУМАЮ, КИЛОБАЙТА БУДЕТ ДОСТАТОЧНО - С ЗАПАСОМ
Код для Intel 8086
Компилятор
NASMРаботает под DOS
Архив с исходником и прогой
здесьСправка по прерываниям
здесь