Форум программистов, компьютерный форум, киберфорум
Программирование драйверов
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
0 / 0 / 1
Регистрация: 14.10.2013
Сообщений: 24

Драйвер на DOS

13.12.2013, 22:13. Показов 2372. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Покажите пожалуйста почему не работает код?
Компилирую в dos box через tasm, компилятор не ругается, после добавления драйвера в config.sys и перезагрузке DOS перестает загружаться
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
IDEAL
P386
MODEL MEDIUM
 
STACK 400
 
DATASEG
        OldKbdIntOffset DW ?
        OldKbdIntSegment DW ?
        CharInputFlag DB 0
        a1 DB 10,13,'You Pressed F7 $'
 
ENDS
 
CODESEG
 
PROC KeyboardDriver
        
        mov     AX, DGROUP
        mov     DS,AX
        call    KeyboardInterrupt
@@NextChar:
        cmp     [CharInputFlag],0
        je      @@NextChar
        mov     [CharInputFlag],0
        mov     AH,2h
        int     21h
        call    RestoreOldKeyboardInterrupt
        mov     AH,4Ch
        int     21h
ENDP KeyboardDriver
 
PROC KeyboardInterrupt NEAR
        pusha
        push    DS
        mov     AX,DGROUP
        mov     DS,AX
        in      AL,60h
        push    AX
        mov     AL,20h
        out     20h,AL
        pop     AX
        sti
        cmp     AL,41h
        lea dx,a1
        pop     DS
        popa
        iret
ENDP KeyboardInterrupt
 
PROC RestoreOldKeyboardInterrupt NEAR
        pusha
        push    ES
        mov     AX,0
        mov     ES,AX
        cli
        mov     AX,[OldKbdIntOffset]
        mov     [ES:9*4],AX
        mov     AX,[OldKbdIntSegment]
        mov     [ES:9*4+2],AX
        sti
        pop     ES
        popa
        ret
ENDP RestoreOldKeyboardInterrupt
 
 
ENDS
 
END
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.12.2013, 22:13
Ответы с готовыми решениями:

Драйвер перекодировки символов в тексте таблицы win-1251 в dos-866
Вот есть тз : Legasy драйвер для ОС win NT. входной и выходной текст передается х драйвера с помощью ioctl запроса от управляющей...

Драйвер для MS-DOS
Нужно написать драйвер под MS-DOS для работы с CD-ROM. Какие прерывания использовать? Правила написания драйверов для MS-DOS не нужны....

Драйвер для работы USB под DOS
Здраствуйте всем, не знаю точно в каком разделе нужно было создавать эту тему. Вопрос заключается в том как заставить работать USB...

4
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
13.12.2013, 22:17
а где ты регистрируешь свое прерывание?
Цитата Сообщение от DryFruit Посмотреть сообщение
call KeyboardInterrupt
так прерывания не вызывают
0
0 / 0 / 1
Регистрация: 14.10.2013
Сообщений: 24
13.12.2013, 22:32  [ТС]
нужно вместо KeyboardInterrupt вызвать SetKeyboardInterrupt а потом уже через неё KeyboardInterrupt?
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
PROC SetKeyboardInterrupt NEAR
        pusha
        push    ES
        mov     AX,0
        mov     ES,AX
        mov     AX,[ES:9*4]
        mov     [OldKbdIntOffset],AX
        mov     ax,[ES:9*4+2]
        mov     [OldKbdIntSegment],AX
        cli
        mov     AX,offset KeyboardInterrupt
        mov     [ES:9*4],AX
        mov     AX,CS
        mov     [ES:9*4+2],AX
        sti
        pop     ES
        popa
        ret
ENDP SetKeyboardInterrupt
Добавлено через 5 минут
подскажите так работать будет?А то я так одну виртуалку уже запорол, скомпилировал вставил в config.sys перезагрузил, а дос уже не загружался...
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
13.12.2013, 22:40
Цитата Сообщение от DryFruit Посмотреть сообщение
нужно вместо KeyboardInterrupt вызвать SetKeyboardInterrupt а потом уже через неё KeyboardInterrupt?
ты спрашиваешь или утверждаешь?
ну SetKeyboardInterrupt ты уже написал
теперь я на память не помню какое прерывание лежит в 9
аппаратное или программное ?
ДОС так давно был
но в любом случае ты должен вызвать не call а int 9

и не забудь в конце вызвать родное(старое прерывание) если не хочешь чтобы клава отключилась

Добавлено через 3 минуты
Цитата Сообщение от DryFruit Посмотреть сообщение
уже через неё KeyboardInterrupt?
не через неё
твое прерывание повиснет в памяти и будет вызываться при событиях клавиатуры
Цитата Сообщение от DryFruit Посмотреть сообщение
скомпилировал вставил в config.sys перезагрузил, а дос уже не загружался...
уже не помню то ли shift то ли alt то ли F8 то ли F5 жмешь при загрузке и система грузится без config.sys и без autoxec.bat
0
0 / 0 / 1
Регистрация: 14.10.2013
Сообщений: 24
15.12.2013, 11:55  [ТС]
У меня вроде как работает, запускается прерывание свое ставит, и возвращает управление старому драйверу.Но я пытался сделать так чтобы пока я не нажал какую нибудь клавишу драйвер бы не выгружался(при этом вывод сообщения). А в данный момент получается так что он заносит свое прерывание, выводит символ на экран, и сразу возвращает старый.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
IDEAL
P386
MODEL MEDIUM
 
STACK 400
 
DATASEG
        OldKbdIntOffset DW ?
        OldKbdIntSegment DW ?
        CharInputFlag DB 0
    String DB 'Hello','$'
ENDS
 
CODESEG
 
PROC KeyboardDriver        
        mov     AX, DGROUP
        mov     DS,AX
        call    SetKeyboardInterrupt 
@@NextChar:
        cmp     [CharInputFlag],0 ;если флаг равен 0 то опять проверяем(флаг ниже)
        je      @@NextChar  ;как я понял у меня тут зацикленнось должна быть, пока флаг не станет 1(но она не работает) 
        mov     [CharInputFlag],0 
        mov     AH,2h
    mov     DX, OFFSET String  ;тут вывожу сообщение но с кодировкой что-то не то и выводит 1 символ
        int     21h ;вывод его на экран
        call    RestoreOldKeyboardInterrupt ;вызываю выгрузку и восстановление стандартного драйвера
        mov     AH,4Ch
        int     21h
ENDP KeyboardDriver
 
PROC SetKeyboardInterrupt NEAR
        pusha
        push    ES
        mov     AX,0
        mov     ES,AX
        mov     AX,[ES:9*4]
        mov     [OldKbdIntOffset],AX
        mov     ax,[ES:9*4+2]
        mov     [OldKbdIntSegment],AX
        cli
        mov     AX,offset KeyboardInterrupt
        mov     [ES:9*4],AX
        mov     AX,CS
        mov     [ES:9*4+2],AX
        sti
        pop     ES
        popa
        ret
ENDP SetKeyboardInterrupt
 
PROC KeyboardInterrupt far
        pusha
        push    DS
        mov     AX,DGROUP
        mov     DS,AX
        in      AL,60h
        push    AX
        mov     AL,20h
        out     20h,AL
        pop     AX
        sti
        cmp     AL,41h  ;ловил нажатие клавиши F8 
       mov     [CharInputFlag],1       ;ставил флаг для проверки 
        pop     DS
        popa
        iret
ENDP KeyboardInterrupt
 
PROC RestoreOldKeyboardInterrupt NEAR
        pusha
        push    ES
        mov     AX,0
        mov     ES,AX
        cli
        mov     AX,[OldKbdIntOffset]
        mov     [ES:9*4],AX
        mov     AX,[OldKbdIntSegment]
        mov     [ES:9*4+2],AX
        sti
        pop     ES
        popa
        ret
ENDP RestoreOldKeyboardInterrupt
ENDS
END
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.12.2013, 11:55
Помогаю со студенческими работами здесь

Как в DOS-BOX написать BAT-файл чтобы ЛЕГКО запустить DOS-программу ?
ВСЕМ ДОБРОГО ВРЕМЕНИ ! Надо на Windows_7 СРОЧНО запустить старую программу, написанную еще под DOS c базами данных DBASE ... Для этого...

Когда DOS был жив, можно ли было переделать windows98 и > драйвера звуковой карты под DOS?
Если я правильно понимаю там прямая запись в порты(если на самом низком уровне) это ведь можно повторить на любой ОС?

Написать программу, выводящую на экран номер версии DOS, а также системную дату и время на языке MS-DOS
написать программу,выводящую на экран номер версии DOS,а также системную дату и время на языке MS-DOS

WmWare и DOS, как скопировать в DOS файлы
есть MS_DOS в wmWare как скопировать туда асcемблерные файлы с основного компа?

Как создать корректную статическую (lib) библиотеку под MS-DOS (16 bit) из Windos (32-64 bit) или из MS-DOS?
Привет всем! Кто подскажет, как корректно создавать статические библиотеки для 16-битного режима адресации процессора? Другими словами,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru