![]() |
|
|
![]()
|
|
| Maks |
|
|||
|
Unregistered |
В инете нарыл прогу
[QUOTE] ; ; Драйвер электронного диска, ; использует основную память компьютера ; .MODEL tiny .CODE ; Драйвер состоит из одного org 100h ; сегмента кода ; Эта строка может отсутствовать ; include sysp.inc ram PROC far ;======================================================= ;||||||||||||||||||||||||||||||||||||||||||||||||||||||| ;============================================ ; ; Это макроопределение печатает символы на экране ; @@out_ch MACRO c1,c2,c3,c4,c5,c6,c7,c8,c9,c10 mov ah,02h IRP chr,<c1,c2,c3,c4,c5,c6,c7,c8,c9,c10> IFB <chr> EXITM ENDIF mov dl,chr int 21h ENDM ENDM @@out_str MACRO mov ah,9 int 21h ENDM ;============================================= ;||||||||||||||||||||||||||||||||||||||||||||||||||||||| ; Заголовок драйвера dd 0ffffffffh ;адрес следующего драйвера dw 2000h ;байт атрибутов dw dev_strategy ;адрес процедуры стратегии dw dev_interrupt ;адрес процедуры прерывания db 1 db 7 dup(?) ;50 ; Блок BPB для электронного диска bpb equ $ dw 512 ; количество байтов в секторе db 1 ; количество секторов в кластере dw 1 ; количество зарезервированных секторов db 2 ; количество копий FAT dw 64 ; макс. количество файлов в корневом каталоге dw 360 ; общее количество секторов db 0fch ; описатель среды носителя данных dw 2 ; количество секторов на одну копию FAT bpb_ptr dw bpb ; указатель на блок BPB ; Область локальных переменных драйвера total dw ? ; количество секторов verify db 0 ; флаг проверки при записи start_sec dw 0 ; номер начального сектора vdisk_ptr dw 0 ; сегмент начала участка памяти, ; в котором расположен диск user_dta dw ? ; адрес области передачи данных dw ? ; Образец записи BOOT для инициализации ; первого сектора диска boot_rec equ $ db 3 dup(0) db 'MSDOS4.0' dw 512 db 1 dw 1 db 2 dw 64 dw 360 db 0fch dw 2 ;======================================================== ; Программа стратегии dev_strategy: mov cs:req_seg,es mov cs:req_off,bx ret ; Здесь запоминается адрес заголовка запроса req_seg dw ? req_off dw ? ;======================================================= ;Обработчик прерывания dev_interrupt: ;сохраняем регистры push es push ds push ax push bx push cx push dx push si push di push bp ; Устанавливаем ES:BX на заголовок запроса mov ax,cs:req_seg mov es,ax mov bx,cs:req_off ; Получаем код команды из заголовка запроса и умножаем ; его на два, чтобы использовать в качестве индекса ; таблицы адресов обработчиков команд mov al,es:[bx]+2 shl al,1 sub ah,ah ; Обнуляем AH lea di,functions ; DI указывает на смещение ; таблицы add di,ax ; Добавляем смещение в таблице jmp word ptr [di] ; Переходим на адрес из таблицы functions LABEL WORD ; Таблица функций dw initialize ;инициализация драйвера dw check_media ;проверка носителя dw make_bpb ;построение BPB dw ioctl_in ;IOCTR-чтение dw input_data ;Чтение dw nondestruct_in ;---------------------- dw input_status ;---------------------- dw clear_input ;---------------------- dw output_data ;Запись dw output_verify ;Запись с верификацией dw output_status ;--------------------- dw clear_output ;--------------------- dw ioctl_out ;IOCTR-запись ; Выход из драйвера, если функция не поддерживается ;ioctl_in: nondestruct_in: input_status: clear_input: output_status: clear_output: ;ioctl_out: or es:word ptr [bx]+3,8103h jmp quit ;======================================================= ;||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ; Обработчик команды вывода данных IOCTL ioctl_out: ; Записываем в регистр CL количество ; выводимых символов mov cl,es:[bx]+18 ; Загружаем в DS:SI адрес буфера данных mov ax,es:[bx]+16 mov ds,ax mov si,es:[bx]+14 ; Выводим на экран символы из буфера ioctl_out_loop: mov al,ds:byte ptr [si] @@out_ch al inc si loop ioctl_out_loop jmp quit ;=================================================== ; Обработчик команды ввода данных IOCTL ioctl_in: ; Записываем в регистр CL количество ; вводимых символов mov cl,es:[bx]+18 ; Загружаем в DS:SI адрес буфера данных mov ax,es:[bx]+16 mov ds,ax mov di,es:[bx]+14 ; Вводим символы с клавиатуры и записываем в буфер ioctl_inp_loop: mov ax,0 int 16h mov ds:byte ptr [di],al @@out_ch al inc di loop ioctl_inp_loop jmp quit ;=================================================== ;||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ; =========================================== ; ==========Построение блока BPB============= ; =========================================== make_bpb: push es push bx mov cs:WORD PTR start_sec,0 mov cs:WORD PTR total,1 call calc_adr push cs pop es lea di,bpb add si,11 mov cx,13 rep movsb pop bx pop es lea dx,bpb mov es:18[bx],dx mov es:20[bx],cs jmp quit ;====================================================== ;============================================= ;==========проверка носителя================== ;============================================= check_media: ; Проверка смены носителя данных. ; Носитель не менялся. mov es:BYTE PTR 14[bx],1 jmp quit ;====================================================== ;=============================================== ;=====Обработчик команды вывода данных========== ;============Запись с верификацией============== ;=============================================== output_verify: ; Для вывода с проверкой устанавливаем флаг проверки mov cs:BYTE PTR verify,1 ;====================================================== ;=============================================== ;==================Запись======================= ;=============================================== output_data: call in_save mov ax,es:WORD PTR 20[bx] mov cs:start_sec,ax mov ax,es:WORD PTR 18[bx] mov cs:total,ax call sector_write mov es,cs:req_seg mov bx,cs:req_off cmp cs:BYTE PTR verify,0 jz no_verify mov cs:BYTE PTR verify,0 jmp input_data Это сообщение отредактировал(а) Maks - 26.2.2005, 18:21 |
|||
|
||||
![]()
|
| Правила форума "Asm: Общие вопросы" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Asm: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |