Кафедра МОП ЭВМ Драйвер управления расширенной памятью HIMEM,SYS, страница 16

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)