ПЕРЕЛІК ДИСЦИПЛІН:
  • Адміністративне право
  • Арбітражний процес
  • Архітектура
  • Астрологія
  • Астрономія
  • Банківська справа
  • Безпека життєдіяльності
  • Біографії
  • Біологія
  • Біологія і хімія
  • Ботаніка та сільське гос-во
  • Бухгалтерський облік і аудит
  • Валютні відносини
  • Ветеринарія
  • Військова кафедра
  • Географія
  • Геодезія
  • Геологія
  • Етика
  • Держава і право
  • Цивільне право і процес
  • Діловодство
  • Гроші та кредит
  • Природничі науки
  • Журналістика
  • Екологія
  • Видавнича справа та поліграфія
  • Інвестиції
  • Іноземна мова
  • Інформатика
  • Інформатика, програмування
  • Юрист по наследству
  • Історичні особистості
  • Історія
  • Історія техніки
  • Кибернетика
  • Комунікації і зв'язок
  • Комп'ютерні науки
  • Косметологія
  • Короткий зміст творів
  • Криміналістика
  • Кримінологія
  • Криптология
  • Кулінарія
  • Культура і мистецтво
  • Культурологія
  • Російська література
  • Література і російська мова
  • Логіка
  • Логістика
  • Маркетинг
  • Математика
  • Медицина, здоров'я
  • Медичні науки
  • Міжнародне публічне право
  • Міжнародне приватне право
  • Міжнародні відносини
  • Менеджмент
  • Металургія
  • Москвоведение
  • Мовознавство
  • Музика
  • Муніципальне право
  • Податки, оподаткування
  •  
    Бесплатные рефераты
     

     

     

     

     

     

         
     
    Драйвер віртуального диска
         

     

    Інформатика, програмування

    Створення завантажувального файлу драйвера пристрою

    У лістингу 1 представлений діалог з системою при створенні драйвера
    "DRIVER". Цей файл ассембліруется та лінки як звичайна програма, післячого перетворюється на двійковий. SYS файл. Зауважу, що відсутність стека длядрайвера є нормальним явищем, тому що драйвер при роботівикористовує власний стек MS-DOS.

    У прикладі, наведеному в лістингу 6-4, створюється також вихідний
    . LST файл асемблера і вихідний. MAP файл редактора зв'язків. Звичайно ж,
    . OBJ і. EXE файли можуть бути вилучені після створення. SYS файлу.

    Лістинг 1.

    Процес створення простого драйвера.

    C> masm driver, driver , driver;

    Microsoft Macro Assembler Version 4.00

    Copyright Microsoft Corp 1981, 1983, 1984, 1985.

    All rights reserved.

    45976 Bytes symbol space free

    0 Warning Errors

    0 severe Errors

    C> link driver, driver, driver;

    Microsoft 8086 Object linker

    Version 3.00 Copyright Microsoft Corp 1983, 1984, 1985

    Warning: no stack segment

    C> exe2bin driver driver.sys

    Драйвер віртуального диска

    У лістингу 2 наведено приклад драйвера RAM-диска - драйверавіртуального диска, що розміщується в ОЗУ. Незважаючи на свою простоту, драйверпрацездатний і може бути використаний на будь-який MS-DOS системі починаючи зверсії 2.0 і вище. Даний драйвер RAM-диска, використовує 360 Kбайт системноїпам'яті для емуляції стандартного п'ятидюймовий дисководу. Але привикористанні цього драйвера, система ПК повинна мати принаймні 512
    Kбайт пам'яті. Якщо є менше пам'яті чи потрібно просто мати віртуальнийдиск менших розмірів, то можна змінити прийняті за замовчуваннямпараметри, описані в секції драйвера "Опис RAM-диска".

    Після того, як програма була оброблена асемблером і редакторомзв'язків, треба перейменувати її в RDISK.SYS. І додати у файл CONFIG.SYSкомандний рядок:

    DEVICE = RDISK.SYS

    При першому ж перезавантаження драйвер буде встановлений як драйвернаступного по порядку дисководу. Нічого більше для установки драйвера RDISKне потрібно.

    Доступ до RAM-диску можливий за допомогою будь-яких функцій MS-DOS абопрограм, за винятком команд DISKCOPY і DISKCOMP. Обидві ці програми очікують певні типи дисків і не працюють з RAM-дисками.

    Лістинг 2.

    Оригінальний текст драйвера RAM-диска

    PAGE 60,132
    ; *** RDISK.ASM: MS-DOS ДРАЙВЕР RAM-ДИСКУ ***

    ;

    ; Цей файл містить вихідний текст простого MS-DOS драйвера RAM-диска

    ; емулює 360K флоппі-диск.

    ;

    ; У цьому прикладі демонструються основні принципи побудови драйвера

    ; пристроїв, включаючи один з методів, який можна використовувати для

    ; налагодження драйверів. Для встановлення цього драйвера включіть у файл

    ; CONFIG.SYS рядок "DEVICE = RDISK.SYS"

    ;

    ; ======== ДОПОМІЖНІ ФАЙЛИ ДЛЯ ДРАЙВЕРА =====

    ;

    INCLUDE driver.inc; Константи для MS-DOS драйвера

    IFDEF DEBUG

    INCLUDE biosio.inc; Визначення для налагодження

    ENDIF

    ;

    ; ============ КОНСТАНТА ==== ====================

    ;

    ; Обмеження, що накладаються версією MS-DOS на максимальний код команди

    ;

    CMD_PRE_30 EQU 00Ch; до MS-DOS версії 3.00

    CMD_PRE_32 EQU 00Fh; до MS-DOS версії 3.20

    CMD_32 EQU 018h; починаючи з версії 3.20

    ;

    IFDEF DEBUG

    CR EQU 0Ah; використовуються в оцінних

    LF EQU 0Dh; повідомленнях

    ENDIF

    ;

    PAGE

    ;

    ; ============ ШАБЛОНИ СТРУКТУР ==============

    ; request EQU es: [di]; покажчик на блок запиту

    ;

    ; Структура заголовка запиту

    ; reqhdr STRUC rlength db? ; Розмір блоку запиту unit db? ; Номер пристрою command db? ; Код команди status dw? ; Повертається статус db 8 DUP (?); Зарезервовано reghdr ENDS

    ;

    ; Структура блоку запиту для команди INIT

    ; inithdr STRUC db (type reqhdr) DUP (?) units db? ; Кількість пристроїв endadro dw? ; Зміщення і сегмент endadrs dw? ; Адреси завершення bpbtabo dw? ; Зміщення і сегмент bpbtabs dw? ; Таблиці BPB devnum db? ; Номер пристрою inithdr ENDS

    ;

    ; Структура блоку запиту для команди MEDIA CHECK

    ; mchkhdr STRUC db (type reqhdr) DUP (?) Mbd db? ; Описувач носія chande dw? ; Статус заміни volume dd? ; Вказівник на ім'я томи mchkhdr ENDS

    ;

    ; Структура блоку запиту для команди BUILD BPB

    ; bpbhdr STRUC db (type reqhdr) DUP (?) Db ? ; Описувач носія dd? ; Покажчик на FAT bpbptro dw? ; Зсув BPB bpbptrs dw? ; Сегмент BPB bpbhdr ENDS

    ;

    ; Структура блоку запиту для команд читання/запису

    ; iohdr STRUC db (type reqhdr) DUP (?) Db? ; Описувач носія bufprt dd? ; Адреса буфера count dw? ; К-ть байт/секторів start dw? ; # Початкового сектора nuvol dd? ; Адреса нов. імені томи iohdr ENDS

    ;

    ; Структура блоку параметрів BIOS (BPB)

    ; bpbstrc STRUC bps dw? ; Кількість байтів в секторі spau db? ; Кількість секторів в кластері nrs dw? ; Кількість зарезервують. секторів nft db? ; Кількість копій FAT nde dw? ; Кількість елементів директорія nls dw? ; Кількість логічних секторів md db? ; Байт описувача носія nfs dw? ; Розмір FAT у секторах bpbstrc ENDS

    ;

    PAGE

    ;

    ; =========== == ПОЧАТОК КОДА ДРАЙВЕРА ================

    ;

    _TEXT SEGMENT BYTE PUBLIC 'CODE'

    ASSUME CS: _TEXT, DS: _TEXT, ES: NOTHING

    ORG 0

    ORIGIN EQU $

    ;

    ; === ========== ЗАГОЛОВОК ДРАЙВЕРА ==============

    ; dw -1, -1; покажчик на слід. драйвер dw AT_IOCTL OR AT_OCRM OR AT_NET dw offset STRATEGRY; зсув СТРАТЕГІЯ dw offset ПЕРЕРИВАННЯ; зсув ПЕРЕРИВАННЯ db 1, 'CDEVICE'; кількість пристроїв/ім'я

    ;

    ; == ===== ТАБЛИЦЯ АДРЕСОЮ Оброблювач КОМАНД ======

    ;

    JUMPTAB LABEL WORD dw offset INIT; 0 - ініціалізація dw offset MEDIA_CHECK; 1 - перевірка носія dw offset BUILD_BPB; 2 - побудувати BPB dw offset IOCTL_INPUT; 3 - IOCTL введення dw offset READ; 4 - введення з пристрої dw offset READ_NOWAIT; 5 - неруйнуюч. введення dw offset INPUT_STATUS; 6 - введення статусу dw offset INPUT_FLUSH; 7 - скинути введення dw offset WRITE; 8 - виведення на пристрої під dw offset WRITE_VERIFY; 9 - виведення з перевіркою dw offset OUTPUT_STATUS; A - висновок статусу dw offset OUTPUT_FLUSH; B - скинути висновок dw offset IOCTL_OUTPUT; C - висновок IOCTL dw offset DEVICE_OPEN; D - відкрити пристрої під dw offset DEVICE_CLOSE; E - закрити пристрої під dw offset REMOVABLE; F - носій змінний? dw offset NO_COMMAND; 10 dw offset NO_COMMAND; 11 dw offset NO_COMMAND; 12 dw offset GENERIC_IOCTL; 13 - Generic IOCTL dw offset NO_COMMAND; 14 dw offset NO_COMMAND; 15 dw offset NO_COMMAND; 16 dw offset GET_LOGICAL; 17 - получіть/устано- dw offset SET_LOGICAL; 18 - вити лог.устр-во

    ;

    ; ============ ОБЛАСТЬ ДАНИХ ДРАЙВЕРА ========= =====

    ; reg_ptr dd? ; Адресу блоку запиту max_cmd db CMD_PRE_30; максимально допустимий код

    ;; команди save_ss dw? ; Значення SS на вході save_sp dw? ; Значення SP на вході

    ;

    PAGE

    ;

    ; ============ ПРОГРАМА СТРАТЕГІЯ =============

    ;

    STRATEGY PROC FAR mov cs: word ptr [reg_ptr], bx mov cs: word ptr [reg_ptr + 2], es ret strategy ENDP

    ;

    ; ============ ПРОГРАМА ПЕРЕРИВАННЯ ============= ==

    ;

    INTERRUPT PROC FAR push ax; зберегти всі робочі push cx; регістри push dx push bx push bp push si push di push ds push es

    ; push cs; визначимо локальний сегмент pop ds; даних

    ; mov word ptr save_ss, ss; збережемо вхідна mov word ptr save_sp, sp; значення SS і SP

    ; mov bx , cs; встановимо локальний mov ax, offset local_stack - 2; стек mov ss, bx mov sp, ax

    ; les di, [req_ptr]; отримати адресу блоку mov bl, request.command; запиту і команду

    ;

    ; встановимо заздалегідь код помилки на випадок якщо команда невірна

    ; mov ax, (ST_ERROR OR UNKNOWN_COMMAND) cmp bl, [max_cmd]; команда підтримується ? ja exit; немає - відкидаємо її

    ;

    ; Видаємо зазначену команду на виконання відповідного обробнику.

    ; Кожен оброблювач одержує управління з CS і DS встановленими на

    ; сегмент драйвера і ES: DI вказує на блок запиту. Свій статус

    ; обробники повертають в регістрі AX.

    ; xor bh, bh; BX - індекс в таблиці shl bx, 1; команд

    IFDEF DEBUG call print_command; видаємо ім'я оброблюваної

    ENDIF; команди call word ptr jumptab [bx]; викликаємо обробник

    ;

    ; перешлемо статус з регістра AX в слово стану блоку запиту

    ; exit: push cs; установка локального pop ds; сегмента даних

    ; les di, [req_ptr]; отримаємо адресу блоку запиту or ax, ST_DONE; встановимо біт DONE mov request . status, ax; збережемо статус

    ; mov ss, word ptr save_ss; відновимо значення mov sp, word ptr save_sp; регістрів SS: SP

    ; pop es; відновимо вміст pop ds ; регістрів pop di pop si pop bp pop bx pop dx pop cx pop ax ret interrupt ENDP

    ;

    PAGE

    ;

    ; ============ Оброблювач КОМАНД ==============

    ;

    NO_COMAND PROC NEAR; не підтримується команда ret; повернення з помилкою

    NO_COMMAND ENDP

    ;

    MEDIA_CHECK PROC NEAR; 1 - перевірка носія mov request.change, NotChanged xor ax, ax ret

    MEDIA_CHECK ENDP

    ;

    BUILD_BPB PROC NEAR; 2 - побудувати BPB mov request.bpbptro, offset bpb mov request.bpbptrs, cs xor ax, ax ret

    BUILD_BPB ENDP

    ;

    IOCTL_INPUT PROC NEAR; 3 - введення IOCTL xor ax, ax ret

    IOCTL_INPUT ENDP

    ;

    READ PROC NEAR; 4 - введення з пристрою call verify; перевірка і установка параметрів jc rd_err; вихід помилково les di, request.bufptr; зчитуємо в буфер rep movsw; передача xor ax, ax; немає помилок rd_err: ret

    READ ENDP

    ;

    READ_NOWAIT PROC NEAR; 5 - неруйнівний введення xor ax, ax; без очікування ret < p> READ_NOWAIT ENDP

    ;

    INPUT_STATUS PROC NEAR; 6 - введення статусу xor ax, ax ret

    INPUT_STATUS ENDP

    ;

    INPUT_FLUSH PROC NEAR; 7 - скинути вхідної черги xor ax, ax ret

    INPUT_FLUSH ENDP

    ;

    WRITE PROC NEAR; 8 -- висновок на пристрій call verify; перевірка і установка параметрів jc wr_err; вихід при помилку push ds; збережемо сегмент "сектора" lds si, request.bufptr; записуємо з буфера pop es; на диск xor di, di; з нульовим зсувом rep movsw; передача xor ax, ax; немає помилок wr_err: ret

    WRITE ENDP

    ;

    WRITE_VERIFY PROC NEAR; 9 - виведення з перевіркою call write ret

    WRITE_VERIFY ENDP

    ;

    OUTPUT_STATUS PROC NEAR; A - висновок статусу xor ax, ax ret

    OUTPUT_STATUS ENDP

    ;

    OUTPUT_FLUSH PROC NEAR; B - скинути вихідну чергу xor ax, ax ret

    OUTPUT_FLUSH ENDP

    ;

    IOCTL_OUTPUT PROC NEAR; C - висновок IOCTL xor ax, ax ret

    IOCTL_OUTPUT

    ;

    DEVICE_OPEN PROC NEAR; D - відкрити пристрій xor ax, ax ret < p> DEVICE_OPEN ENDP

    ;

    DEVICE_CLOSE PROC NEAR; E - закрити пристрій xor ax, ax ret

    DEVICE_CLOSE ENDP

    ;

    REMOVABLE PROC NEAR; F - носій змінний? mov ax, ST_BUSY, нема! ret

    REMOVABLE ENDP

    ;

    GENERIC_IOCTL PROC NEAR; 13 - груповий IOCTL запит xor ax, ax ret

    GENERIC_IOCTL ENDP

    ;

    GET_LOGICAL PROC NEAR; 17 - отримати ім'я логічного xor ax, ax; диска ret

    GET_LOGICAL ENDP

    ;

    SET_LOGICAL PROC NEAR; 18 - встановити ім'я логічного xor ax, ax; диска ret

    SET_LOGICAL ENDP

    ;

    PAGE

    ; ------------ Підпрограми обробки запитів -----------------------

    ; Ці підпрограми викликаються для обробки параметрів будь-якого запиту

    ; на ввід/вивід.

    ; На вході:

    ; ES: DI - містить адресу блоку запиту

    ; Дії:

    ; Перевірка параметра "номер сектора" на допустимість.

    ; Перетворення цього параметра в "сегмент: зсув".

    ; Вирівняти лічильник для запобігання "перекриття".

    ; На виході:

    ; DS: SI - містить адресу "сектору" в RAM-диску

    ; ES: DI - містить адресу блоку запиту

    ; CX - містить кількість переданих слів.

    ; verify PROC NEAR

    ; перевіримо що номери початкового і кінцевого секторів лежать в межах

    ; від 0 до N. mov cx, request.start; порівняємо номер початкового cmp cx, bpb.nls; сектора з кількістю jae out_of_range; логічних секторів add cx, request.count; знайдемо номер кінцевого dec cx; сектора і теж порівняємо cmp cx, bpb.nls; якщо номери секторів jb in_range; нормальні то продовжимо

    ; задані сектори не містяться на диску out_of_range: mov ax, ST_ERROR OR SECTOR_NOT_FOUND mov request.count, 0; нічого не було передано stc; повертаємося з помилкою ret

    ; обчислимо сегментний адреса початкового сектора in_range: mov ax, bpb.bps; кількість байт в секторі mov cl, 4; розділимо на 16 для отримання shr ax, cl; розміру в параграфах mul request.start; зсув параграфа відноси -

    ; тельно початку диска add ax, RPARA; зсув параграфа відноси-mov dx, cs; тельно CS add ax, dx; абсолютна зміщені. параграфа mov si, ax; збережемо сегмент у SI

    ; обчислимо і перевіримо лічильник переданих даних mov ax, bpb.bps; розмір сектора в байтах mul request.count; лічильник передачі в байтах cmp dx, 0; перевіримо на коректність jne out_of_range

    ; вирівняємо лічильник у AX для запобігання перекриття mov cx, word ptr request.bufptr cmp ax, 0; зміщення = 0 je set_size neg cx; залишок = 64K - зміщення cmp cx, ax; буфера jae set_size; якщо залишок меншелічильника, mov ax, cx; то передаємо тільки залишок

    ; встановимо кількість переданих секторів і лічильник передачі set_size: mov cx, ax; лічильник передачі в байтах shr cx, 1; перетворимо в лічильник слів div bpb.bps ; (DX був 0) кількість секторів mov request.count, ax; збережемо лічильник передачі

    ; завантажимо в DS: SI адресу блоку в пам'яті mov ds, si xor si, si < p>; встановимо напрям передачі і повернемося без помилок cld clc ret verify ENDP

    ;

    IFDEF DEBUG

    INCLUDE biosio.asm

    PAGE

    ;

    ; ************ КОД І ДАНІ для налагодження *************

    ;

    ; налагодження повідомлення

    ;

    NO_COMMAND_msg db 'NO COMMAND', CR, LF ,'$'

    INIT_msg db 'INITialization', CR, LF ,'$'

    MEDIA_CHECK_msg db 'MEDIA Check', CR, LF ,'$'

    BUILD_BPB_msg db 'Build BIOS Parameter Block' , CR, LF ,'$'

    IOCTL_INPUT_msg db 'IO Control Input', CR, LF ,'$'

    READ_msg db 'Input from Device', CR, LF, ' $ '

    READ_NOWAIT_msg db' Nondestructive Input no-wait ', CR, LF ,'$'

    INPUT_STATUS_msg db' Input Status ', CR, LF ,'$'

    INPUT_FLUSH_msg db 'Flush Input Queue', CR, LF ,'$'

    WRITE_msg db 'Output to Device', CR, LF ,'$'

    WRITE_VERIFY_msg db 'Output with Verify', CR, LF ,'$'

    OUTPUT_STATUS_msg db 'Output Status', CR, LF ,'$'

    OUTPUT_FLUSH_msg db 'Flush Output Queue', CR , LF ,'$'

    IOCTL_OUTPUT_msg db 'IO Control Output', CR, LF ,'$'

    DEVICE_OPEN_msg db 'Open a Device', CR, LF, '$'

    DEVICE_CLOSE_msg db 'Close a Device', CR, LF ,'$'

    REMOVABLE_msg db 'Is Media Removable', CR, LF ,'$'

    GENERIC_IOCTL_msg db 'Generic IOCTL Request', CR, LF ,'$'

    GET_LOGICAL_msg db 'Get Logical Device', CR, LF ,'$'

    SET_LOGICAL_msg db 'Set Logical Device ', CR, LF ,'$'

    ;

    PAGE

    ;

    ; ===== ТАБЛИЦЯ АДРЕСОЮ Відлагоджувальна ПОВІДОМЛЕНЬ =====

    ; message_table LABEL WORD dw offset INIT_msg; 01 - ініціалізація dw offset MEDIA_CHECK_msg; 02 - перевірка носія dw offset BUILD_BPB_msg; 03 - побудувати BPB dw offset IOCTL_INPUT_msg; 04 - введення IOCTL dw offset READ_msg; 05 - введення з пристрою dw offset READ_NOWAIT_msg; 06 - неруйнуюч. введення безочік. dw offset INPUT_STATUS_msg; 07 - введення статусу dw offset INPUT_FLUSH_msg; 08 - скид вхідній черзі dw offset WRITE_msg; 09 - виведення на пристрій dw offset WRITE_VERIFY_msg; 10 - виведення з перевіркою dw offset OUTPUT_STATUS_msg; 11 - висновок статусу dw offset OUTPUT_FLUSH_msg; 12 - скид вихідний черги dw offset IOCTL_OUTPUT_msg; 13 - висновок IOCTL dw offset DEVICE_OPEN_msg; 14 - відкрити пристрій dw offset DEVICE_CLOSE_msg; 15 - закрити пристрій dw offset REMOVABLE_msg; 16 - носій змінний? dw offset NO_COMMAND_msg; 17 - dw offset NO_COMMAND_msg; 18 - dw offset NO_COMMAND_msg; 19 - dw offset GENERIC_IOCTL_msg; 20 - груповий IOCTL запит dw offset NO_COMMAND_msg; 21 - dw offset NO_COMMAND_msg; 22 - dw offset NO_COMMAND_msg; 23 - dw offset GET_LOGICAL_msg; 24 - отримати ім'я диска dw offset SET_LOGICAL_msg; 25 - встановити ім'я диска

    ;

    PAGE

    ; PRINT_COMMAND

    ;

    ; Ця процедура викликає функцію BIOS для друку (_biosprt), передаючи

    ; їй адресу рядка, що містить ім'я тільки що викликаної команди. При

    ; виклику цієї процедури подвоєний код команди передається в регістрі
    BX.

    ; Усі використовувані регістри зберігаються.

    ; print_command PROC NEAR push ax; збережемо вміст рег. AX mov ax, BLUE_F OR BRIGHT OR BLACK_B; встановимо колір push ax mov ax, word ptr message_table [bx]; адреса рядка push ax call _biosprt; викликаємо процедуру BIOS add sp, 4; очищаємо стек від параметрів pop ax; відновлюємо AX і виходимо ret print_command ENDP

    ENDIF

    ;

    PAGE

    ;
    ; ** ВНУТРІШНІЙ СТЕК І КІНЕЦЬ ОПЕРАЦІЙНОЇ ЧАСТИНИ ДРАЙВЕРА **

    ; db 32 DUP ( 'stack'); внутрішній стек глибиною local_stack EQU $; 256 байт

    ; bpb_tab dw offset bpb ; покажчик на BPB

    ;

    LAST_USED EQU $; адреса завершення

    ;
    ; *** ХАРАКТЕРИСТИКИ RAM-ДИСКУ, приймається за замовчуванням ***

    ;

    ; Параметри для 5-1/4 "двосторонньої подвійної щільності диска з дев'ятьма < p>; секторами на доріжці.

    ;

    MTYPE EQU 0FDh; байт описувача носія

    TRACKS EQU 40; 40 доріжок

    SECTORS EQU 9; 9 секторів на доріжці

    DSIZE EQU 512; 512 байт в секторі

    SIDES EQU 2; 2 сторони на диску

    ; < p> FSECS EQU 2; кількість секторів в FAT

    DIREN EQU 112; кількість елементів директорія

    DSECS EQU 7; 7 секторів в директорії

    CLSIZ EQU 2; 2 сектора в кластері

    ;

    STOTAL EQU TRACKS * SECTORS * SIDES; всього секторів

    PTOTAL EQU (DSIZE/16) * STOTAL; всього параграфів

    ;

    ; ******** ПОЧАТОК ОБЛАСТІ ДАНИХ RAM-ДИСКУ **********

    ;

    ; RAM-диск д.б.н. вирівняний на кордон параграфа

    ;

    IF ($-ORIGIN) mod 16

    ORG ($-ORIGIN ) + 16 - (($-ORIGIN) mod 16)

    ENDIF

    RDISK LABEL BYTE; початок RAM-диска

    RPARA EQU ($-ORIGIN)/16; розмір коду в параграфах

    ;

    ; ------------ Блок параметрів BIOS ------------ ----------------------

    ; jmp short boot; короткий JMP (2 байти) nop; потрібно для boot_record db 'IBM 3.1' ; 8 байт ім'я і версія

    ; bpb bpbstrc dw SECTORS; кількість секторів на доріжці dw SIDES; кількість головок читання/запису dw 0; кількість прихованих секторів boot: db (DSIZE-30) DUP (?); залишок boot_sector

    ;

    ; ------------ Таблиці розміщення файлів (FAT) -------------- ---------

    ;; перший два елементи FAT

    FAT_1 db MTYPE, 0FFh, 0FFh; нульовий залишок FAT db (DSIZE-3) DUP (0) db ((FSECS-1) * DSIZE) DUP (0)

    FAT_2 db MTYPE, 0FFh, 0FFh; перші два елементи FAT db (DSIZE-3) DUP (0); нульовий залишок FAT db (( FSECS-1) * DSIZE) DUP (0)

    ;

    ; ------------ Сектора директорія --------- ---------------------------

    ;

    DIREC db 'RAM_DISK'; ім'я томи (11 байт) db 08h; VID db 10 DUP (?); зарезервовано dw 0600h; час 12:00:00 (полудень) dw 021h; дата 1 січня 1980 dw 0; початковий кластер 0 dd 0; розмір файлу 0 db ( DSIZE-32) DUP (0); нульовий залишок директорія db ((DSECS-1) * DSIZE) DUP (0)

    BUFFER LABEL BYTE; початок області даних

    ;

    ; ************ процедури ініціалізації **************

    ;

    INCLUDE stdmac.inc

    ;

    ; ============ Область даних ініціалізації =========== < p>;

    $ signon db 'RAM DISK Driver Version 1.00 Installed: Drive

    $ desig db' A '

    $ crlf db 0Dh, 0Ah,' $ '

    ;

    ; ============ Початок процедури ініціалізації ===========

    ;

    INIT PROC NEAR; 00 - ініціалізація

    ;

    ; встановимо адреса завершення, кількість пристроїв і покажчик на

    ; таблицю BPB

    ; mov request.endadro, 0; адреса кінця драйвера mov request.endadrs, cs add request.endadrs, (RPARA + PTOTAL); останній параграф mov request.units, 1 mov request.bpbtabo, offset bpb_tab mov request.bpbtabs, cs mov al, $ desig; скорегуємо ім'я диска add al, request.devnum mov $ desig, al

    ;

    ; висновок на екран ідентифікаційної рядка

    @ DisStr $ signon

    ;

    ; скорегуємо значення "max_cmd" виходячи з версії MS-DOS

    @ GetDOSVersion; отримаємо номер версії MS -DOS cmp al, 3; MS-DOS версії 3.00 і вище? jb init_done, нема - припиняємо ініціалізацію mov [max_cmd], CMD_PRE_32; команди для MS-DOS 3.00 cmp ah, 2; MS-DOS версії 3.20 і вище? jb init_done ; немає - припиняємо ініціалізацію mov [max_cmd], CMD_32; команди для MS-DOS 3.20

    ; init_done: xor ax, ax; немає проблем! ret

    INIT ENDP

    ;

    ; ************ КІНЕЦЬ ДРАЙВЕРА. КІНЕЦЬ файла ************

    ;

    _TEXT ENDS

    END

    Список використаної літератури


         
     
         
    Реферат Банк
     
    Рефераты
     
    Бесплатные рефераты
     

     

     

     

     

     

     

     
     
     
      Все права защищены. Reff.net.ua - українські реферати ! DMCA.com Protection Status