Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Резидентный драйвер электронного диска 
:(
    Опции темы
Maks
Дата 26.2.2005, 18:15 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


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
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0743 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.