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
В следующем примере приводится программа, выполняющая тоже действие ,но написанная на языке Си с подключением Ассемблерного модуля:
Файл Dcopy.cpp:
#include <bios.h>
#include <conio.h>
#include <ctype.h>
#include <dos.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#define LOBYTE(w) ((unsigned char)(w))
#define HIBYTE(w) ((unsigned char)(((unsigned int)(w) >> 8) & 0xFF))
typedef unsigned char byte;
typedef unsigned int word;
typedef unsigned long dword;
extern "C"
{
word XMM_InitDriver(void);
word XMM_AllocMem(word, word *);
word XMM_FreeMem(word);
word XMM_EnableA20(void);
word XMM_DisableA20(void);
word XMM_GetMaxFree(void);
word XMM_GetTotalFree(void);
word XMM_MoveToCMA(void *, word, dword, dword);
word XMM_MoveToXMA(void *, word, dword, dword);
}
extern byte err_code;
struct diskinfo_t dinfo;
byte BPB[512];
word heads, tracks, sectors, capacity, tr_size,
ret, maxblk, handle;
bool CMA_allocated = false, XMA_allocated = false, A20_enabled = false;
void ErrMsg(const char *);
void fail(const char *);
void FreeMemory();
byte GetDriveType(int);
void GetHelp();
int c_break()
{
FreeMemory();
puts("Операция не завершена!");
return 0;
}
void main(int argc, char *argv[])
{
int err, xpos, ypos;
char disk;
dword count;
if (argc < 2)
{ GetHelp(); exit(1); }
disk = toupper(argv[1][0]);
if (disk != 'A' && disk != 'B')
{ GetHelp(); exit(1); }
ctrlbrk(c_break);
ret = XMM_InitDriver();
if (!ret)
fail("Драйвер XMS не найден.");
maxblk = XMM_GetMaxFree();
dinfo.drive = disk - 'A';
// определяем параметры дискеты
do
{
printf("Вставьте первую дискету в дисковод %c: "
"и нажмите любую клавишу...\n", disk);
bioskey(0);
err = absread(dinfo.drive, 1, 0, (void *)BPB);
if (err)
if (LOBYTE(errno) == 2)
puts("Устройство не готово.");
else
fail("Неизвестная ошибка");
} while (err);
heads = BPB[0x1a] + (BPB[0x1b] << 8); // число головок
sectors = BPB[0x18] + (BPB[0x19] << 8); // число секторов на дорожке
capacity = BPB[0x13] + (BPB[0x14] << 8); // общее число секторов
tracks = capacity / sectors / heads; // число дорожек на стороне
if (BPB[0x0b] + (BPB[0x0c] << 8) != 512)
fail("Дискета имеет нестандартный размер сектора");
capacity /= 2; tr_size = sectors * 512;
printf("Дискета в дисководе %c: ", disk);
if (GetDriveType(dinfo.drive) < 3)
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.