IPB

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в эту темуОткрыть новую тему
> Здравствуйте, умные люди! =) Помогите, пожалуйста! =), У меня есть программа копирования дискеты за один проход через расшире
ЛеРуСяКа
сообщение 9.12.2009, 11:02
Сообщение #1


Пользователь


Группа: Пользователи
Сообщений: 1
Регистрация: 9.12.2009
Пользователь №: 22 438



.286
.MODEL TINY
JUMPS
S SEGMENT STACK
db 128 dup(?)
S ENDS


DATA SEGMENT
buffer db 32770 dup(0)
number_drive db 0
sectors dw 0
numb_s dw 0 ; номер копируемого сектора
handle dw 0

LengthBlock dd 32768
SourceHandle dw 0
SourceOffset dd 0
DestHandle dw 0
DestOffset dd 0

HMMEntryPt dd 0

all db "Всего : 0000 секторов",13,'$'
mess db 10,13,"Вставьте дискету-приемник и нажмите любую клавишу",10,13,'$'
mess1 db "Ошибка при работе с линией A20 (82h) !",10,13,'$'
mess2 db "Вся расширенная память уже распределена!!!",10,13,'$'
mess3 db "Больше нет свободных блоков EMB.",10,13,'$'
mess4 db "Ошибка!!!: Нет диска в дисководе.",10,13,'$'
mess5 db "Ошибка!!!: Диск защищен от записи или нет диска в дисководе.",10,13,'$'
mess6 db "Копируем данные c дискеты-источника",10,13,'$'
mess6_1 db "Записываем данные на дискету-приемник",10,13,'$'
mess8 db "Драйвер himem.sys отсутствует",10,13,'$'
DATA ENDS

CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:S

start:
mov bx,DATA
mov ds,bx

; считывание корневого сектора дискеты
mov al,number_drive
mov cx,1
mov dx,0
mov bx,offset buffer
int 25h
pop ax
jnb ok1
mov bl,01h
jmp Error

ok1: mov ax,word ptr [bx][13h]
mov sectors,ax

; проверка наличия himem.sys
mov ax,4300h
int 2fh
mov bl,0eeh
cmp al,80h
jne Error

mov ax,4310h
int 2Fh
;получение адреса программы управления XMS
mov word ptr [HMMEntryPt][0],bx
mov word ptr [HMMEntryPt][2],es

mov ah,05h ; локальное открытие линии A20
call HMMEntryPt
or ax,ax
jz Error

mov ah,09h ; запрос блока памяти
mov dx,1500d
call HMMEntryPt
or ax,ax
jz Error
mov handle,dx

; первоначальное заполнение таблицы для копирования
mov bx,offset buffer
mov word ptr SourceOffset[0],bx
mov word ptr SourceOffset[2],ds
mov bx,handle
mov DestHandle,bx
mov word ptr DestOffset[0],0
mov word ptr DestOffset[2],0

mov ah,09h
mov dx,offset mess6
int 21h

mov cx,45 ; кол-во секторов на диске
mov si,offset LengthBlock
next_sector:

; считывание группы секторов
mov al,number_drive
mov dx,numb_s
push cx
mov cx,64d
mov bx,offset buffer
int 25h
pop cx
pop cx
add numb_s,64d

; копирование блока памяти в EMB
mov ah,0Bh ;ф-ия 0B - копирование блока
call HMMEntryPt ;вызов драйвера
or ax,ax ;проверка на ошибку
jz Error ;если ошибка то переход на метку Error

call OutDec ;вызов процедуры OutDec

add word ptr DestOffset[0],32768d ;увеличение текущего смещения в EMB
adc word ptr Destoffset[2],0 ;прибавляем 32кб в первое слово
;и 0 - во второе

loop next_sector ;продолжение цикла

mov ah,09h ;вывод на экран сообщения
mov dx,offset mess ;"Вставьте следующий диск ..."
int 21h

mov ah, 10h ; яюфюцфрЄ№ эрцрЄш
int 16h

; mov ah,08h ; ожидание нажатия клавиши
;int 21h

; первоначальное заполнение таблицы для копирования
mov numb_s,0
mov DestHandle,0
mov bx,offset buffer
mov word ptr DestOffset[0],bx
mov word ptr DestOffset[2],ds
mov bx,handle
mov SourceHandle,bx
mov word ptr SourceOffset[0],0
mov word ptr SourceOffset[2],0

mov cx,45 ; кол-во секторов на диске

mov ah, 10h ;
int 16h

mov ah,09h
mov dx,offset mess6_1
int 21h

mov si,offset LengthBlock
next_copy:
; копирование блока из EMB в память
mov ah,0Bh
call HMMEntryPt
or ax,ax
jz Error

add word ptr SourceOffset[0],32768d
adc word ptr SourceOffset[2],0

; запись группы секторов на диск
mov al,number_drive
mov dx,numb_s
push cx
mov cx,64
mov bx,offset buffer
int 26h
pop cx
jnb ok2

mov dx,offset mess5
mov ah,09h
int 21h
jmp err1

ok2: pop cx

add numb_s,64d
call OutDec

loop next_copy

err1:mov ah,0Ah ; освобождение блока памяти
mov dx,handle
call HMMEntryPt
or ax,ax
jz Error

mov ah,06h ; локальное закрывание линии A20
call HMMEntryPt

.EXIT
Error:
mov dx,offset mess8
cmp bl,0eeh
je print
mov dx,offset mess1 ; проблема с линией A20
cmp bl,82h
je print
mov dx,offset mess2 ; вся XMS распределена
cmp bl,0A0h
je print
mov dx,offset mess3 ; больше нет свободных блоков EMB
cmp bl,0A1h
je print
mov dx,offset mess4 ; нет диска в дисководе
cmp bl,01h
je print
print:
mov ah,09h
int 21h


.EXIT

; вывод результатов копирования(записи) в процентах
OutDec proc near
mov dx,0
mov bx,10
mov ax,numb_s
div bx
mov bx,offset all
add dl,30h
mov byte ptr [bx][11d],dl

mov dx,0
mov bx,10
div bx
mov bx,offset all
add dl,30h
mov byte ptr [bx][10d],dl

mov dx,0
mov bx,10
div bx
mov bx,offset all
add dl,30h
mov byte ptr [bx][9],dl

mov dx,0
mov bx,10
div bx
mov bx,offset all
add dl,30h
mov byte ptr [bx][8],dl

mov dx,offset all
mov ah,09h
int 21h
ret
OutDec endp

CODE ENDS

END start


Мне нужен комментарий к каждой строке программы... Помогите, плиз!
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия Сейчас: 20.5.2012, 23:06