Розробка та дослідження драйверу консолі
Призначення драйверів та порядок роботи з драйверами в MS-DOS. Розробка драйверів консолі. Структура драйвера та призначення компонентів. Розробка структури алгоритму, програми налагодження драйвера. Опис змінних програми та роботи модулів програми.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | украинский |
Дата добавления | 22.06.2012 |
Размер файла | 1,0 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
removable:
jmp _unknown ;Остановить бит ОШИБКА и выйти
;Команда 16 : Вывод до занятости
output_busy:
jmp _unknown ;Установить бит ОШИБКА и выйти
;*************************************************************
;************ ВЫХОД ПО ОШИБКЕ И ОБЫЧНЫЙ ВЫХОД *******
;*************************************************************
_unknown:
or es:[bx].rh_status,8003h ;Остановить бит и код ошибки
jmp done ;Установить бит СДЕЛАНО и выйти
;*************************************************************
;********************* ОБЫЧНЫЙ ВЫХОД ******************
;*************************************************************
busy:
or es:[bx].rh_status,0200h ;Установить бит ЗАНЯТ
done:
or es:[bx].rh_status,0100h ;Установить бит СДЕЛАНО
call CT_OUT
pop di si cx dx bp es ds bx ax ;восстановить все регистры
ret ;Возврат в DOS
;***********************************************************
;********************** КОНЕЦ ПРОГРАММЫ ****************
;*************************************************************
;процедура - вызывается командой инициализации и действует
;только один раз. Сюда указывает "адрес конца". После инициализации
;память, занимаемая этой процедурой возвращается DOS.
initial proc near ;Вывод сообщения на консоль
mov ax, cs
mov ds, ax
lea dx, line ;Адрес выводимого сообщения
mov ah, 09h ;Вывод на экран
int 21h ;Вызов вывода строки
ret ;Возврат
initial endp
line db " Driver Console ",13,10
db " design by student group KS-07n",13,10
db " Voloshin Dmitriy Nikolaevich",'$'
console endp ;Конец процедуры CONSOLE
cseg ends ;Конец сегмента cseg
end begin ;Комец программы
Додаток Б
Лістінг програми відлагодження драйвера
#include<conio.h>
#include<stdio.h>
#include <dos.h>
#include <stdlib.h>
#include <bios.h>
extern "C" far void dev_strategy(void); // процедуры обращения к драйверу
extern "C" far void dev_interrupt(void);
struct Fix_rh { // фиксированная часть заголовка запроса
unsigned char Len,
Unit,
Cmd;
unsigned short Stat;
unsigned long Res1,
Res2;
};
struct { // команда инициализации 0
struct Fix_rh Fixed;
unsigned char NUnits;
unsigned short Brk_Ofs,
Brk_Seg,
Bpb_Tbo,
Bpb_Tbs;
unsigned char Dn_itr,
Msg_Flg;
} Init;
struct { // команда ввода 4
struct Fix_rh Fixed;
unsigned char Media;
unsigned short Buf_Ofs,
Buf_Seg,
Count,
Sector,
Vol_id_O,
Vol_id_S,
Sect32_O,
Sect32_S;
} Input;
struct { // nerazrushaiushiy vvod 5
struct Fix_rh Fixed;
unsigned char Return;
} Input_nd;
// выводимое драйвером сообщение
const char* Menu[]={" DRIVER TEST \n",
" \n",
" -------------------------------------- \n",
" | | \n",
" | 1. Initialization | \n",
" | 2. Input | \n",
" | 3. Input_nd | \n",
" | 4. Exit | \n",
" | | \n",
" -------------------------------------- \n",
" \n",};
// выводимое меню
unsigned short Outc = 40;
void init_drv(void); //
void input_drv(void); // обращение к драйверу с соответствующими запросами
char menu(void);
void wait();
void input_nd_drv(void);
void init_out();
void input_out();
void input_nd_out();
void show_buf();
char reg;
//main///
void main()
{
textbackground(8);
clrscr();
while(1)
{
clrscr();
gotoxy(1,1);
switch(reg=menu())
{
case '1':{init_drv();break;};
case '2':{input_drv();break;};
case '3':{input_nd_drv();break;};
case '4':exit(0);
};
};
};
char menu()
{
int i=0;
char ret;
textcolor(2);
_setcursortype(_NOCURSOR);
for(i=0;i < 11; i++)
printf("%s",Menu[i]);
gotoxy(1,24);
printf("Enter a regume: ");
ret=getch();
while((ret!='1')&&(ret!='2')&&(ret!='3')&&(ret!='4')) ret=getch();
clrscr();
return ret;
};
void init_drv(void)
{
Init.Fixed.Len=24;
Init.Fixed.Cmd=0;
Init.Fixed.Stat=0;
Init.Brk_Ofs=0;
Init.Brk_Seg=0;
init_out();
clrscr();
asm{
mov ax, ds
mov es, ax
mov bx, offset Init
}
dev_strategy();
dev_interrupt();
wait();
init_out();
}
void init_out()
{
clrscr();
printf("---------------------------------------------------------------\n");
printf("| Fixed part of header |\n");
printf("---------------------------------------------------------------\n");
printf("Len :%02X\n",Init.Fixed.Len);
printf("Unit :%02X\n",Init.Fixed.Unit);
printf("Cmd :%02X\n",Init.Fixed.Cmd);
printf("Status :%02X\n",Init.Fixed.Stat);
printf("---------------------------------------------------------------\n");
printf("| Variable part of header |\n");
printf("---------------------------------------------------------------\n");
printf("Brk_ofs :%02X\n",Init.Brk_Ofs);
printf("Brk_seg :%02X\n",Init.Brk_Seg);
wait();
};
void wait()
{
gotoxy(1,24);
printf("Press Enter to continue...");
while(getch()!=13);
};
void input_drv(void)
{
char * buf;
char *num;
asm{
push ax
push bx
push es
}
Input.Fixed.Len=30;
Input.Fixed.Cmd=4;
Input.Fixed.Stat=0;
num = (char*)malloc(255);
buf = (char *)malloc(255);
int Count = 0;
while(!Count)
{
clrscr();
gotoxy(5,10);
printf("Enter an input counter :");
gets( num );
Count = (int) atol (num);
if (Count<0) Count=0;
};
Input.Buf_Ofs = ( unsigned )buf;
Input.Buf_Seg = _DS;
Input.Count = Count;
clrscr();
gotoxy(1,1);
input_out();
clrscr();
printf("Enter %d simbols \n",Count);
asm{
mov ax, ds
mov es, ax
mov bx, offset Input
}
dev_strategy();
dev_interrupt();
buf[Count] = 0;
gotoxy(1,5);
printf("You have already entered : %s\n",buf);
printf("Code: ",buf);
for(int j = 0; j < Count; j++)
printf("%x ",buf[j]);
wait();
printf("\n");
input_out();
gotoxy(1,4);
asm{
pop es bx ax
}
}
void input_out()
{
clrscr();
printf("---------------------------------------------------------------\n");
printf("| Fixed part of header |\n");
printf("---------------------------------------------------------------\n");
printf("Len :%02X\n",Input.Fixed.Len);
printf("Unit :%02X\n",Input.Fixed.Unit);
printf("Cmd :%02X\n",Input.Fixed.Cmd);
printf("Status :%02X\n",Input.Fixed.Stat);
printf("---------------------------------------------------------------\n");
printf("| Variable part of header |\n");
printf("---------------------------------------------------------------\n");
printf("Bufer_offset :%02X\n",Input.Buf_Ofs);
printf("Bufer_segment :%02X\n",Input.Buf_Seg);
printf("Counter :%02X\n",Input.Count);
wait();
};
void input_nd_out()
{
clrscr();
printf("---------------------------------------------------------------\n");
printf("| Fixed part of header |\n");
printf("---------------------------------------------------------------\n");
printf("Len :%02X\n",Input_nd.Fixed.Len);
printf("Unit :%02X\n",Input_nd.Fixed.Unit);
printf("Cmd :%02X\n",Input_nd.Fixed.Cmd);
printf("Status :%02X\n",Input_nd.Fixed.Stat);
printf("---------------------------------------------------------------\n");
printf("| Variable part of header |\n");
printf("---------------------------------------------------------------\n");
printf("Return :%c\n",Input_nd.Return);
wait();};
void input_nd_drv()
{
Input_nd.Fixed.Len=14;
Input_nd.Fixed.Cmd=5;
Input_nd.Fixed.Stat=0;
Input_nd.Return='0';
input_nd_out();
clrscr();
printf("Press any key to check this command\n");
show_buf();
asm push ds
asm pop es
asm mov bx,offset Input_nd
dev_strategy();
dev_interrupt();
input_nd_out();
}
void show_buf()
{
int i;
int temp;
int golova;
int hvost;
int point;
printf("Buffer claviatyru");
asm{
push ax cx dx
mov ah,01h
xor cx,cx
xor dx,dx
int 1Ah
xor ax,ax
push es si di
}
c:
asm{
mov si,40h
push si
pop es
mov di,1Eh
}
gotoxy(1,3);
for(i=0;i<16;i++)
{
asm mov si, word ptr es:[di]
asm mov temp,si
printf("%04X",temp);
temp=temp&0x00FF;
printf(" - %c\n",temp);
asm mov point,di
asm push di
asm mov di,1Ah
asm mov si,word ptr es:[di]
asm mov golova,si
asm mov di,1Ch
asm mov si,word ptr es:[di]
asm pop di
asm mov hvost,si
asm add di,2
}
printf("adres golovi: %d\nadres hvosta: %d",golova,hvost);
asm{
int 1Ah
cmp dx,127
jl c
pop di
pop si
pop es
pop dx
pop cx
pop ax
}
}
Додаток В
Лістінг програми дослідження драйвера
.286
sseg segment stack 'stack'
dw 512 dup(?)
sseg ends
dseg segment 'data'
;********** Структуры запросов к драйверу ******************
rh struc ;Фиксированная структура заголовка
rh_len db ? ;Длина пакета
rh_unit db ? ;Номер устройства (блоковые)
rh_cmd db ? ;Команда драйвера устройства
rh_status dw ? ;возвращается драйвером
rh_res1 dd ? ;Зарезервировано
rh_res2 dd ? ;Зарезервировано
rh ends
_rh0 struc ;Заголовок запроса для команды 0
rh0_rh db size rh dup (?) ;фиксированная часть
rh0_nunits db ? ;Число устройств в группе (блоковые)
rh0_brk_ofs dw ? ;Смещение для конца
rh0_brk_seg dw ? ;Сегмент для конца
rh0_bpb_tbo dw ? ;Смещение указателя массива ВРВ
rh0_bpb_tbs dw ? ;Сегмент указателя массива ВРВ
rh0_dn_itr db ? ;Первый доступный накопитель (DOS 3+)
_rh0 ends
rh0 _rh0 ?
_rh4 struc ;3аголовок запроса для команды 4
rh4_rh db size rh dup (?) ;фиксированная часть
rh4_medla db ? ;Дескриптор носителя из DPB
rh4_buf_ofs dw ? ;Смещение DTA
rh4_buf_seg dw ? ;Сегмент DTA
rh4_count dw ? ;Счетчик передачи (секторов для
;блоковых, байтов для символьных)
rh4_start dw ? ;Начальный сектор (блоковые)
_rh4 ends
rh4 _rh4 ?
_rh5 struc ;Заголовок запроса для команды 5
rh5_rh db size rh dup (?) ;Фиксированная часть
rh5_return db ? ;Возвращаемый символ
_rh5 ends
rh5 _rh5 ?
_rh8 struc ;3аголовок запроса для команды 8
rh8_rh db size rh dup (?) ;Фиксированная часть
rh8_media db ? ;Дескриптор носителя из DPB
rh8_buf_ofs dw ? ;Смещение DTA
rh8_buf_seg dw ? ;Сегмент DTA
rh8_count dw ? ;Счетчик передачи (секторов для
;блоковых, байтов для символьных)
rh8_start dw ? ;Начальный сектор (блоковые)
_rh8 ends
rh8 _rh8 ?
;*********** Сообщения вдводимые на экран ********************
no_reliz db 'Funkcia esho ne realizovana!'
len_no_reliz = $ - no_reliz
center db 'Operacia vipolnena! Nagmite enter dlia prodolgenia.'
len_center=$-center
mes_08h db 'Narmite klavishu dlia testa funkcii 08h.'
len_mes_08h = $ - mes_08h
mes_08h_ db 'Vu nagali klavishu: '
len_mes_08h_ = $ - mes_08h_
mes_08h_ext db 'Vu nagali funkcionalnyu klavishu, vid ee rashirennogo coda:'
len_mes_08h_ext = $ - mes_08h_ext
mes_0Bh db 'Nagmite liubyu klavishu dla testa funkcii 0Bh.'
len_mes_0Bh=$-mes_0Bh
mes_0Bh_NOT db 'Klavisha ne bula naghata.'
len_mes_0Bh_NOT = $ - mes_0Bh_NOT
mes_0Bh_YES db 'Klavisha bula naghata.'
len_mes_0Bh_YES = $- mes_0Bh_YES
mes_3Fh db 'Vvedite simvola dlia testa 3Fh.'
len_mes_3Fh = $ - mes_3Fh
mes_3Fh_ db 'Vu vveli:'
len_mes_3Fh_ = $ - mes_3Fh_
mes_3Fh_E db 'Buli vvedenu ne a simvolov.'
len_mes_3Fh_E = $ - mes_3Fh_E
Ctrl_Break db 'Naghat Ctrl+Break'
len_Ctrl_Break = $ - Ctrl_Break
mtop db ' *** TEST2 ***'
len_mtop=$-mtop
m1 db ' 0. Otkrut draiver consoli.'
len_m1=$-m1
m2 db ' 1. Zakrut vhodnoi potok ( klaviatura ).'
len_m2=$-m2
m3 db ' 2. Zakrut vihodnoi potok ( ekran ).'
len_m3=$-m3
m4 db ' 3. Ustanovit ASCII reghim raboti draivera.'
len_m4=$-m4
m5 db ' 4. Ustanovit Binary reghim raboti draivera.'
len_m5=$-m5
m6 db ' 5. Test funkcii ah = 08h int 21h.'
len_m6=$-m6
m7 db ' 6. Test funkcii ah = 0Bh int 21h.'
len_m7=$-m7
m8 db ' 7. Test funkcii ah = 3Fh int 21h.'
len_m8=$-m8
m9 db ' 8. Ustanovka standartnoro prerivania DOS: int 21h.'
len_m9=$-m9
m10 db ' 9. Zamena standartnogo preruvania DOS na smodelirovanniy obrabotchik.'
len_m10=$-m10
mbottom db ' Sdelaite svoi vubor.'
len_mbottom=$-mbottom
;****************** таблицы адресов *************************
ar_m dw mtop,m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,mbottom
ar_len dw len_mtop,len_m1,len_m2,len_m3,len_m4,len_m5,len_m6,len_m7
dw len_m8,len_m9,len_m10,len_mbottom
ar_proc dw open_dev, close_dev0, close_dev1, set_ASCII, set_binary
dw test_08h, test_0Bh, test_3fh,RestoreVector21h,SetNewVector21h
time = 3 ;Задержка для теста функции 0Bh
con db 'CON ',0 ;Имя файла для открытия драйвера
fclosescr dw 0
fclosekeyb dw 0
;***************** буферок для тестируемых функций ***********
buf db 128 dup(?)
;==== Указатели на 21 вектор, пр. стратегии и прерывания драйвера ==
vec21h label dword ; INT 21H ADRESS
vec21h_off dw ?
vec21h_seg dw ?
callstrat label dword ; CON STRATEGY ADRESS
strat_off dw ?
strat_seg dw ?
callInterr label dword ; CON INTERRUPT ADRESS
inter_off dw ?
inter_seg dw ?
;============ адрес векторной таблици связи =================
vect_off dw ?
vect_seg dw ?
;======================================================
dseg ends
;################# CODE ##################
cseg segment 'code'
ASSUME ss:sseg, ds:dseg, cs:cseg
public _MAIN
_MAIN proc far
;--------------------
push ds
xor ax, ax
push ax
mov ax, dseg
mov ds, ax
;--------------------
call FindCon
call Save21h
menu:
call clrscr
xor bx, bx ;номер пункта
mov cx, 12 ;кол-во пунктов меню
xor dx, dx ;dh курсор строка; dl курсор колонка
menu_c:
;call gotoxy
mov si,ar_m[bx] ;Загрузка адресса выводимого пункта меню
mov di,ar_len[bx] ;Его длина
call print
add bx,2
inc dh
loop menu_c
rep_in:
mov ah,00h
int 16h ;взять символ
cmp al,27
je exit
sub al,30h
jl rep_in
cmp al,9
jg rep_in
cbw
mov di,ax
shl di,1
call ar_proc[di]
call wait_enter
jmp menu
exit:
call RestoreVector21h
ret
_MAIN endp
;******** OPEN / CLOSE CON **********
open_dev proc
push ax dx
mov ah, 3Dh ;можно также восспользоваться функцией
lea dx, con ;3C
int 21h
mov fclosescr, 0
mov fclosekeyb, 0
pop dx ax
ret
open_dev endp
;---------------------------------------------------
close_dev0 proc ;Закрыть файл нулевого дескриптора (keyboard)
push ax bx
mov ah, 3Eh
xor bx, bx
int 21h
mov fclosekeyb, 1
pop bx ax
ret
close_dev0 endp
;---------------------------------------------------
close_dev1 proc ;Закрыть файл первого дескриптора (screen)
push ax bx
mov ah, 3Eh
mov bx, 1
int 21h
mov fclosescr, 1
pop bx ax
ret
close_dev1 endp
;******* ASCII / binary mode choice ***************
set_binary proc
push ax bx dx
mov ax, 4400h
xor bx, bx
int 21h
or dx, 20h
mov ax, 4401h
xor dh, dh
int 21h
pop dx bx ax
ret
set_binary endp
;---------------------------------------------------
set_ASCII proc
push ax bx dx
mov ax, 4400h
xor bx, bx
int 21h
and dl, 0DFh
mov ax, 4401h
xor dh, dh
int 21h
pop dx bx ax
ret
set_ASCII endp
;******************* Тесты функций ***********************
test_08h proc
push ax bx cx dx di si
mov dh, 14
lea si, mes_08h
mov di, len_mes_08h
call print
mov ah, 08h
int 21h
cmp al, 0
je ext
mov dh,18
lea si,mes_08h_
mov di,len_mes_08h_
call print
jmp end_08h
ext:
mov ah, 08h
int 21h
mov dh, 18
lea si, mes_08h_ext
mov di, len_mes_08h_ext
call print
end_08h:
mov dl,20
call gotoxy
mov cx, 1
xor bx, bx
mov ah, 0Ah
int 10h
pop si di dx cx bx ax
ret
test_08h endp
;---------------------------------------------------
test_0Bh proc
push ax dx si di
mov dh, 15
lea si, mes_0Bh
mov di, len_mes_0Bh
call print
call pause
mov ah, 0Bh
int 21h
cmp al, 0
jne YES
mov dh, 16
lea si, mes_0Bh_NOT
mov di, len_mes_0Bh_NOT
call print
jmp m_end
YES:
mov dh, 16
lea si, mes_0Bh_YES
mov di, len_mes_0Bh_YES
call print
m_end:
pop di si dx ax
ret
test_0Bh endp
;---------------------------------------------------------------------------
test_3Fh proc
push ax bx dx cx si di
mov cx, 5 ;Число запрашиваемых символов у функции
mov bx, cx
add bx, 30h
mov dh, 14
mov dl, 40
call gotoxy
lea si, mes_3Fh
mov byte ptr [si+8], bl
mov di, len_mes_3Fh
call print
mov ah, 3Fh
xor bx, bx
lea dx, buf
int 21h
jnc not_eror
jmp end_3fh ;Выход если ошибка при вып. функции
not_eror:
cmp ax, cx
je write_3Fh
mov dh, 16
lea si, mes_3Fh_E
mov bx, ax
add cx, 30h
add bx, 30h
mov byte ptr [si+20], bl
mov byte ptr [si+16], cl
lea si, mes_3Fh_E
mov di, len_mes_3Fh_E
call print
write_3Fh:
mov dh, 18
lea si, mes_3Fh_
mov di, len_mes_3Fh_
call print
lea si, buf
mov di, ax
mov dh, 19
call print
end_3Fh:
pop di si cx dx bx ax
ret
test_3Fh endp
;---------------------------------------------------------------------------
;*************** Небольшие внутренние функции ****************
;---------------------------------------------------------------------------
clrscr proc
push ax bx cx dx di es
mov ax,0B800h
mov es,ax
mov cx,2000
mov al,32
mov ah,7
xor di,di
rep stosw
mov ah,02h
mov bh,0
xor dx,dx
int 10h
pop es di dx cx bx ax
ret
clrscr endp
;---------------------------------------------------------------------------
direct_output proc
;---------in DX must be symbol and DI - position
push es ax
mov ax,0b800h
mov es,ax
xor ax,ax
mov es:[di],dx
pop ax es
ret
endp direct_output
;---------------------------------------------------------------------------
pause proc
push ax cx dx
mov ah, 01h ;обнулили счетчик тиков
xor cx, cx
xor dx, dx
int 1Ah
xor ax, ax
c_p:
int 1Ah
cmp dx, 18*time
jl c_p
pop dx cx ax
ret
pause endp
;---------------------------------------------------
print proc ;si - адрес, di - длинна выводимой строки
push ax bx dx cx si di
mov cx,di
mov di,0
mov al,dh
cbw
mov bl,160
mul bl
mov dh,07h
;add al,dl
mov di,ax
nexts:
mov dl,ds:[si]
inc si
add di,2
call direct_output
loop nexts
pop di si cx dx bx ax
ret
print endp
;---------------------------------------------------
wait_enter proc
push ax dx si di
mov dh, 24
xor dl, dl
call gotoxy
lea si, center
mov di, len_center
call print
wait_c:
xor ah, ah
int 16h
cmp al, 0Dh
jne wait_c
pop di si dx ax
ret
wait_enter endp
;---------------------------------------------------
gotoxy proc near ;dh,dl - строка колонка
push ax bx
mov ah, 02h
xor bx, bx
int 10h
pop bx ax
ret
gotoxy endp
;---------------------------------------------------
;############################################################
;===================================================
INTERRUPT_21H proc far
cmp ah,08h ;определяем функцию для вызова
jne nf1
call MY_08h
iret
nf1:
cmp ah,0Bh
jne nf2
call MY_0Bh
iret
nf2:
cmp ah,3Fh
jne nf3
call MY_3Fh
iret
nf3:
jmp dword ptr vec21h ;вызывам старый обработчик прерывания
INTERRUPT_21H endp
;========== Промоделированные функции ===================
MY_08h proc
push bx si es
cmp fclosekeyb, 1
mov al, 6 ;возвращает дос при обращении к закр. кл.
je Ret08h ;Выходим если клавиатура закрыта
mov ax, seg rh4
mov bx, offset rh4
mov es, ax
mov es:[bx].rh_cmd, 4
mov es:[bx].rh_status, 0
mov es:[bx].rh4_buf_seg, ax ;адрес буфера обмена
lea si, buf
mov es:[bx].rh4_buf_ofs, si
mov es:[bx].rh4_count, 1
call dword ptr callstrat
call dword ptr callInterr
mov al, [si]
Ret08h:
pop es si bx
ret
MY_08h endp
;-------------------------------------
MY_0Bh proc
push bx cx dx si di es
xor al, al
cmp fclosekeyb, 1
je Ret0Bh
mov ax, seg rh5
mov bx, offset rh5
mov es, ax
mov es:[bx].rh_cmd, 5
mov es:[bx].rh_status, 0
mov es:[bx].rh5_return, 0
call dword ptr callstrat
call dword ptr callInterr
mov al, 0FFh
mov cx, es:[bx].rh_status
mov ah, es:[bx].rh5_return
cmp ah, 3
jne status
mov dh, 20
mov dl, 10
call gotoxy
lea si, Ctrl_Break
mov dh, 20
mov dl, 10
mov di, len_Ctrl_Break
call print
status:
test cx, 0200h
jz Ret0Bh
mov al, 0000h
Ret0Bh:
pop es di si dx cx bx
ret
MY_0Bh endp
;-------------------------------------
MY_3Fh proc near
cmp bx, 0 ;bx - дескриптор
je _next
inc sp ;Удалим из стека адрес возврата из MY_3Fh
inc sp
jmp dword ptr vec21h
_next:
cmp fclosekeyb, 1
jne read3Fok
mov bx, sp
mov ax, ss:[bx+2+2+2] ;+2 +2+2- fl cs ip ip
or ax, 1 ;maska dla cf
mov ss:[bx+2+2+2], ax
ret
read3Fok:
push bx cx dx bp di si es
mov si, dx
mov ax, 4400h
xor bx, bx
int 21h
and dx, 20h
cmp dx, 20h ;проверка на бинарный режим
mov dx, si
mov ax, seg rh4
mov bx, offset rh4
mov es, ax
mov es:[bx].rh_cmd, 4
jne ASCII_3Fh
mov es:[bx].rh_status, 0
mov es:[bx].rh4_buf_seg, ds
mov es:[bx].rh4_buf_ofs, dx
mov es:[bx].rh4_count, cx
call dword ptr callstrat
call dword ptr callInterr
mov ax, cx
jmp exit_3Fh
ASCII_3Fh:
mov si, es
mov bp, vect_off
sub bp, 4
mov es, vect_seg
mov di, es:[bp]
cmp di, 0
jne BufToBuf
call write_buf
;***** Перезапись данных из системного буфера в програмный *****
BufToBuf:
mov bx,dx ;смещение адреса получателя
mov bp,es:[bp];смещение адреса источника
push cx
BufToBuf_:
mov al,es:[bp]
mov ds:[bx],al
cmp al,0Ah
je Symbol_0Ah
inc bp
inc bx
loop BufToBuf_
pop ax
mov bx,vect_off
mov es:[bx-4],bp
jmp exit_3Fh
Symbol_0Ah:
pop ax
sub ax,cx
inc ax
mov bx,vect_off
mov word ptr es:[bx-4],0
exit_3Fh:
pop es si di bp dx cx bx
ret
MY_3Fh endp
;----------------------------------------------------------------
write_buf proc
;*************** Заполнение системного буфера ******************
push cx dx bp
mov di, es
xor bp, bp ;в bp колличество символов в буфере
mov es, si
mov si, 027Eh ;адресс начала сис. буфера
mov es:[bx].rh4_buf_seg, di
mov es:[bx].rh4_buf_ofs, si
mov es:[bx].rh4_count, 1
next_symbol:
mov es:[bx].rh_status, 0
call dword ptr callstrat
call dword ptr callInterr
cmp ah, 0FFh
jne no_ext_
xor ah, ah
jmp next_symbol
no_ext_:
push bx es
mov ah,3 ;\
int 10h ;| Текущее положение курсора в dx
mov es,di
mov al,es:[si]
pop es
cmp al,0
jne no_ext
pop bx
mov ah,0FFh
jmp next_symbol
no_ext:
cmp bp,127
je stop_
cmp al,8
je back_
cmp al,0Dh
je end_write_buf
jmp run_
stop_:
cmp al,8
je back_
cmp al,0Dh
je end_write_buf
pop bx
jmp next_symbol
run_:
mov cx,1 ;Вывод на экран только что прочитанного символа
xor bx,bx
mov ah,0Ah
int 10h
;|передвигаю курсор вправо
inc dl ;|
mov ah,2 ;/
int 10h
inc bp
inc si
pop bx
mov es:[bx].rh4_buf_ofs,si
jmp next_symbol
back_:
cmp bp,0
jne back
pop bx
jmp next_symbol
back:
dec bp
;|передвигаю курсор вправо
dec dl ;|
mov ah, 2 ;/
int 10h
mov cx, 1 ;Вывод на экран пробела
mov al, ' '
xor bx, bx
mov ah, 0Ah
int 10h
dec si
pop bx
mov es:[bx].rh4_buf_ofs, si
jmp next_symbol
end_write_buf:
mov es, di
mov byte ptr es:[si+1], 0Ah
mov bx, vect_off
mov es:[bx-4],027Eh
pop bx
pop bp dx cx
ret
write_buf endp
;#############################################################
FindCon proc
push ax bx cx es
mov ah, 52h ;Получаем адрес списка списков,
int 21h
mov vect_seg, es ;Запомним адресс векторной таблици
mov vect_off, bx ;связи
add bx, 0Ch ;по этому смещению лежит адресс CON драйвера
;установленного или резидентного
mov ax, es:[bx+2] ;смещение CON
mov cx, es:[bx] ;сегмент CON
mov es, ax
mov bx, cx
mov strat_seg, ax
mov inter_seg, ax
mov ax, es:[bx+6]
mov strat_off, ax
mov ax, es:[bx+8]
mov inter_off, ax
pop es cx bx ax
ret
FindCon endp
;************ GET / SET / RESTORE VECTOR 21h ****************
Save21h proc ;сохранили старый обработчик 21h прерывания
push ax bx dx es
xor ax,ax
mov es,ax
mov bx,21h
shl bx,2
cli
mov ax,es:[bx+2]
mov dx,es:[bx]
sti
mov vec21h_seg,ax
mov vec21h_off,dx
pop es dx bx ax
ret
Save21h endp
;-----------------------------------------------------------------
SetNewVector21h proc ;установить новый обработчик 21h прерывания
push ax bx dx es
xor ax,ax
mov es,ax
mov bx,21h
shl bx,1
shl bx,1
mov ax,seg INTERRUPT_21H ;сегмент нового обработчика
mov dx,offset INTERRUPT_21H ;смещение нового обработчика
cli
mov es:[bx+2],ax
mov es:[bx],dx
sti
pop es dx bx ax
ret
SetNewVector21h endp
;-----------------------------------------------------------------
RestoreVector21h proc
push ax bx dx es
xor ax, ax
mov es, ax
mov bx, 21h
shl bx, 1
shl bx, 1
mov ax, vec21h_seg ;сегмент старого обработчика
mov dx, vec21h_off ;смещение старого обработчика
cli
mov es:[bx+2],ax
mov es:[bx],dx
sti
pop es dx bx ax
ret
RestoreVector21h endp
cseg ends
end _MAIN
Додаток Г
Лістінг програми формування списку встановлених драйверів
program test3;
uses crt;
type
drvptr=^drvhead;
drvhead=record
next:drvptr;
attrib:word;
strategy:word;
interupt:word;
name:array[1..8] of char;
end;
const tab=' ';
constr:array[1..11] of char=('C','O','N',' ',' ',' ',' ',' ',' ',' ',' ');
var drvtab:array[1..50] of drvptr;
num:byte;
fdel:boolean;
count:byte;
kol:byte;
chs:char;
segm,ofs:word;
f:byte;
drsegm,drofs:word;
label nextf,nextf_,endf;
procedure wrhex(num:word);
var s:string[4];
i:byte;
hex:string[16];
begin
hex:='0123456789ABCDEF';
s[0]:=chr(4);
for i:=4 downto 1 do
begin
s[i]:=hex[(num and $0f)+1];
num:=num shr 4;
end;
write(s);
end;
procedure wrdrv(i:byte);
var
wdrv:array[1..50,1..2] of word absolute drvtab;
begin
with drvtab[i]^ do
begin
write(' |',i:3,' |');
Wrhex(wdrv[i,2]);
write(':');
wrhex(wdrv[i,1]);
write('| ');
wrhex(attrib);write(' |');
if boolean(attrib shr 15) then
write(name[1],name[2],name[3],name[4],name[5],name[6],name[7],name[8],'|')
else
write('Blckdrv',byte(name[1]),'|');
wrhex(wdrv[i+1,2]);
write(':');
wrhex(wdrv[i+1,1]);
write('| ');
wrhex(strategy);
write(' | ');
wrhex(interupt);
write(' |');
end
end;
procedure print_drv;
label jex,jexit;
var
ch:char;
i,en,beg:byte;
drv:drvptr;
f:boolean;
num:byte;
wdrv:array[1..50,1..2] of word absolute drvtab;
begin
clrscr;
asm
mov ah,52h
int 21h
add bx,22h
mov ax,es
mov word ptr drv+2,ax
mov word ptr drv,bx
end;
kol:=1;
f:=true;
while f do
begin
drvtab[kol]:=drv;
drv:=drv^.next;
asm
cmp word ptr drv,-1
jne jex
xor ax,ax
mov byte ptr f,al
jmp jexit
jex: inc kol
jexit:
end;
end;
writeln(' ------------------------------------------------------------');
writeln(' |Number| Adress | Attr | Name | Next | Strat |Intrpt|');
writeln(' ------------------------------------------------------------');
for i:=1 to kol do
begin
wrdrv(i);
writeln;
end;
writeln(' ------------------------------------------------------------');
end;
function del_drv:byte;
var num:byte;
j,cnt1,cnt2:byte;
found:boolean;
fname:boolean;
wdrv:array[1..50,1..2] of word absolute drvtab;
const
con:array[1..8] of char=('C','O','N',' ',' ',' ',' ',' ');
begin
print_drv;
fdel:=false;
found:=false;
count:=0;
fname:=true;
gotoxy(1,24);
write('Before Deleting...');
readkey;
num:=1;
while num<kol do
begin
fname:=true;
for j:=1 to 8 do
if (fname) and(drvtab[num]^.name[j]=con[j]) then
fname:=true
else
begin
fname:=False;
break;
end;
if fname then
begin
count:=count+1;
if count=1 then
cnt1:=num; {number first!!!}
if count=2 then
begin
cnt2:=num; {number 2 }
ofs:=wdrv[cnt2,1]; {Remember segment and offset}
segm:=wdrv[cnt2,2]; {---------------------------}
end;
end;
num:=num+1;
end;
asm
mov ax,5200h
int 21h
add bx,0ch
mov ax,ofs
mov word ptr es:[bx],ax
mov ax,segm
mov word ptr es:[bx+2],ax
mov bx,drofs
mov es,drsegm
mov ax,ofs{0016h}
mov word ptr es:[bx],ax
mov ax,segm{0070h}
mov word ptr es:[bx+2],ax
end;
begin
drvtab[cnt1-1]^.next:=drvtab[cnt1]^.next;
asm
mov ax,5200h
int 21h
add bx,0ch
mov ax,-1
mov word ptr es:[bx],ax
mov es:[bx+2],ax
mov bx,drofs
mov es,drsegm
mov es:[bx],ax
mov es:[bx+2],ax
end;
end;
print_drv;
gotoxy(1,24);
write('Driver succesfull deleted! Press any key to continue...');
readkey;
end;
function menu:char;
var ch:char;
begin
clrscr;
gotoxy(1,5);
writeln(tab,'----------Main Menu------------');
writeln;
writeln(tab,'1. Print list of drivers');
writeln(tab,'2. Delete CON driver from system ');
writeln(tab,'ESC => Exit');
gotoxy(1,24);
write('Enter a regime...');
repeat
ch:=readkey;
until (ch=chr(27)) or(ch='1') or (ch='2');
if ch=chr(27) then ch:='3';
menu:=ch;
end;
begin
f:=0;
asm
mov ax,5200h
int 21h
add bx,4
mov ax,es:[bx]
mov ofs,ax
mov ax,es:[bx+2]
mov segm,ax
mov bx,ofs
mov es,segm
add bx,6
mov cx,es:[bx-2]
nextf:
mov di,bx
add di,32
lea si,constr
push cx
mov cx,11
repe cmpsb
pop cx
jnz nextf_
mov f,1
mov ax,es
mov drsegm,ax
mov ax,bx
add ax,7
mov drofs,ax
xor ax,ax
int 16h
jmp endf
nextf_:
add bx,59
loop nextf
endf:
end;
count:=0;
writeln;
repeat
chs:=menu;
case chs of
'1':
begin
print_drv;
gotoxy(1,24);
write('Press any key to continue...');
readkey;
end;
'2':del_drv;
end;
until chs='3';
clrscr;
end.
Размещено на Allbest.ru
Подобные документы
Розробка програми для вирішення графічної задачі. При вирішенні задачі необхідно cтворювати програму у середовищі програмування Turbo Pascal. Розробка алгоритму функціонування програми і надання блок-схеми алгоритму. Демонстрація роботи програми.
курсовая работа [1,3 M], добавлен 23.06.2010Зростання ролі світлодіодного освітлення. Застосування надяскравих світлодіодів. Огляд драйверів живлення світлодіодних світильників. Опис роботи мікроконтролера на мікросхемі VIPer17 по схемі функціональній. Схема принципова драйвера білих світлодіодів.
дипломная работа [2,2 M], добавлен 22.04.2011Створення програми для роботи з веб-камерою з автоматичним визначенням встановленої камери на комп'ютері. Характеристика апаратної конфігурації програми. Опис мови і середовища програмування. Розробка алгоритму, інструкції для програміста та користувача.
курсовая работа [1,2 M], добавлен 26.07.2013Аналіз предметної області і постановка задачі на розробку програми для автоматизації роботи автопідприємства. Перелік та опис використаних компонентів та основних процедур програми. Опис структур та методів обробки даних. Інструкція для користувача.
курсовая работа [2,3 M], добавлен 15.02.2012Розробка та схема алгоритму проектованої гри. Особливості мови програмування та середовища "Microsoft Visual Studio C++ 2008 Express Edition". Лістинг програми та загальний опис її роботи, аналіз отриманих результатів та оцінка практичної ефективності.
курсовая работа [762,8 K], добавлен 03.05.2015Призначення менеджеру пристроїв. Обґрунтування вибору мови програмування. Розробка структурної схеми і опис діалогового інтерфейсу програми. Блок-схема програмного додатку, основні функції і алгоритм його роботи. Методики і інструкція його тестування.
курсовая работа [3,4 M], добавлен 17.11.2014Проектування програми керування мікропроцесорним пристроєм світлової індикації на мові С та Assembler. Розробка алгоритму роботи програми, структурної та електричної принципових схем. Здійснення комп’ютерного моделювання для перевірки розроблених програм.
курсовая работа [710,7 K], добавлен 04.12.2014Теоретичні відомості про язик С++. Розробка програми, що виконує основні арифметичні дії над простими та складними числами на язику С++. Опис алгоритму програми та її код. Інструкція по користуванню. Обгрунтовування вибору та складу технічних засобів.
курсовая работа [852,8 K], добавлен 30.11.2011Алгоритмічна мова програмування універсального призначення Turbo Pascal. Розробка і створення програми для гри "Шибениця". Алгоритм функціонування программи, блок-схема алгоритму. Використання додаткових модулів Graph та Crt у процессі створення програми.
курсовая работа [2,0 M], добавлен 23.06.2010Розробка ігрового додатку за технологією IDE Visual Studio та WPF. Опис вхідної та вихідної інформації. Назва та призначення модулів програми. Основні поля класу, необхідні для ігрової логіки. Блок-схема алгоритму гри. Інструкція з експлуатації системи.
курсовая работа [1,3 M], добавлен 02.06.2015