ПрограммаCallhma
Приведем текст программы, составленная на языке программирования Си, которая вызывает функции драйвера расширенной памяти. Эта программа будет работать только в моделях памяти Small и Compact. Для других моделей памяти требуется изменить строки интерфейсного модуля hma.asm, в которых передаваемые функциям параметры извлекаются из стека и тип процедур:
Аргументы | Small, Compact | Large, Huge |
Первый аргумент | [bp+4] | [bp+6] |
Второй аргумент | [bp+6] | [bp+8] |
Текст программы CALLHMAвы найдете в листинге 11.2, а текст интерфейсного модуля - в листинге 11.3.
Листинг 11.2. Файлcallhma\callhma.c
// =====================================================
// Работа с драйвером HIMEM.SYS
//
// (C) Фролов А.В, 1997
//
// E-mail: frolov@glas.apc.org
// WWW: http://www.glasnet.ru/~frolov
// или
// http://www.dials.ccas.ru/frolov
// =====================================================
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <dos.h>
#include <string.h>
struct XMM_Move
{
unsigned long Length;
unsigned short SourceHandle;
unsigned long SourceOffset;
unsigned short DestHandle;
unsigned long DestOffset;
};
extern long XMM_Installed(void);
extern long XMM_Version(void);
extern long XMM_RequestHMA(unsigned);
extern long XMM_ReleaseHMA(void);
extern long XMM_GlobalEnableA20(void);
extern long XMM_GlobalDisableA20(void);
extern long XMM_EnableA20(void);
extern long XMM_DisableA20(void);
extern long XMM_QueryA20(void);
extern long XMM_QueryLargestFree(void);
extern long XMM_QueryTotalFree(void);
extern long XMM_AllocateExtended(unsigned);
extern long XMM_FreeExtended(unsigned);
extern long XMM_MoveExtended(struct XMM_Move *);
extern long XMM_LockExtended(unsigned);
extern long XMM_UnLockExtended(unsigned);
extern long XMM_GetHandleLength(unsigned);
extern long XMM_GetHandleInfo(unsigned);
extern long XMM_ReallocateExtended(unsigned, unsigned);
extern long XMM_RequestUMB(unsigned);
extern long XMM_ReleaseUMB(unsigned);
void error(char *msg, long rc);
int main(void)
{
long ver, rc, handle;
static char testmsg[] = "Тестовое сообщение";
char buf[80];
char far *ptr;
int i;
struct XMM_Move move_d;
// Проверяем, установлен ли драйвер HIMEM.SYS,
// если установлен, выводим его версию
if (XMM_Installed())
{
printf("\nHIMEM.SYS installed");
ver = XMM_Version();
printf("\nver XMM: %4X,%4x",
(short)ver, (short)(ver >> 16));
}
else
{
printf("\nHIMEM.SYS not found");
exit(-1);
}
// Запрашиваем управление областью HMA
rc = XMM_RequestHMA(0xffff);
if(rc)
error("Request HMA error",rc);
else
{
// Открываем линию A20
rc = XMM_GlobalEnableA20();
if(rc)
error("Open A20 error",rc);
// Копируем тестовое сообщение сначала из
// стандартной памяти в область HMA,
// затем обратно в стандартную память
FP_SEG(ptr) = 0xffff;
FP_OFF(ptr) = 0x0010;
for(i=0; testmsg[i] != 0; i++)
ptr[i] = testmsg[i];
for(i=0; ptr[i] != 0; i++)
buf[i] = ptr[i];
buf[i] = 0;
// Выводим сообщение для проверки
printf("\n%s",buf);
// Закрываем линию A20 и отдаем системе область HMA
rc = XMM_GlobalDisableA20();
if(rc)
error("Close A20 eror",rc);
rc = XMM_ReleaseHMA();
if(rc)
error("Free HMA error",rc);
}
// Получаем блок EMB размером в 1 Кбайт
handle = XMM_AllocateExtended(1);
if(handle < 0)
error("Request XMB error",handle);
// Копируем тестовое сообщение сначала из
// стандартной памяти в блок EMB,
// затем обратно в стандартную память
move_d.Length = strlen(testmsg) + 1;
move_d.SourceHandle = 0;
(char far*)move_d.SourceOffset = (char far*)testmsg;
move_d.DestHandle = (short)handle;
move_d.DestOffset = 0L;
rc = XMM_MoveExtended(&move_d);
if(rc < 0)
error("Copy in EMB error",rc);
move_d.Length = strlen(testmsg) + 1;
move_d.DestHandle = 0;
(char far*)move_d.DestOffset = (char far*)buf;
move_d.SourceHandle = (short)handle;
move_d.SourceOffset = 0L;
rc = XMM_MoveExtended(&move_d);
if(rc < 0)
error("Copy from EMB error",rc);
// Выводим сообщение для проверки
printf("\n%s",buf);
// Освобождаем блок EMB
rc = XMM_FreeExtended((unsigned)handle);
if(rc)
error("Free XMB error",rc);
return 0;
}
// Функция для вывода сообщения об ошибке
// и кода ошибки
void error(char *msg, long rc)
{
rc = (unsigned char)(rc >> 24) ;
printf("\n%s, error: %02.2X\n",
msg, (unsigned char)rc);
exit(-1);
}
Листинг 11.3. Файлcallhma\hma.asm
; =====================================================
; Это интерфейсный модуль для вызова функций
; XMS из Си. Текст программы рассчитан на
; модель памяти Small
;
; (C) A. Frolov, 1997
;
; E-mail: frolov@glas.apc.org
; WWW: http://www.glasnet.ru/~frolov
; or
; http://www.dials.ccas.ru/frolov
; =====================================================
.model small
.DATA
; В этом месте будет храниться адрес
; управляющей функции XMM
XMM_Control dd ?
.CODE
; Макроопределения для выполнения соглашения об
; использовании регистров в процедурах Си
c_begin macro
push bp
mov bp,sp
push si
push di
endm
c_end macro
pop di
pop si
mov sp,bp
pop bp
ret
endm
; Все процедуры должны быть public
public _XMM_Installed
public _XMM_Version
public _XMM_RequestHMA
public _XMM_ReleaseHMA
public _XMM_GlobalEnableA20
public _XMM_GlobalDisableA20
public _XMM_EnableA20
public _XMM_DisableA20
public _XMM_QueryA20
public _XMM_QueryLargestFree
public _XMM_QueryTotalFree
public _XMM_AllocateExtended
public _XMM_FreeExtended
public _XMM_MoveExtended
public _XMM_LockExtended
public _XMM_UnLockExtended
public _XMM_GetHandleLength
public _XMM_GetHandleInfo
public _XMM_ReallocateExtended
public _XMM_RequestUMB
public _XMM_ReleaseUMB
;**
;.Name _XMM_Installed
;.Title Получение адреса управляющей функции
;
;.Descr Эта функция проверяет наличие драйвера
; HIMEM.SYS и в случае его присуствия
; запоминает адрес управляющей функции.
;
;.Proto unsigned XMM_Installed(void);
;
;.Params Не используются
;
;.Return 0 - драйвер HIMEM.SYS не установлен;
; 1 - драйвер HIMEM.SYS установлен.
;
;**
_XMM_Installed proc near
c_begin
mov ax, 4300h
int 2fh
cmp al, 80h
jne NotInstalled
mov ax, 4310h
int 2fh
mov word ptr [XMM_Control], bx
mov word ptr [XMM_Control+2], es
mov ax,1
jmp Installed
NotInstalled:
mov ax, 0
Installed:
c_end
_XMM_Installed endp
;**
;.Name _XMM_Version
;.Title Определение версии драйвера HIMEM.SYS
;
;.Descr Эта функция определяет версию драйвера
; HIMEM.SYS
;
;.Proto long XMM_Version(void);
;
;.Params Не используются
;
;.Return Номер версии в младших 16 битах,
; номер изменений - в старших 16 битах
; возвращаемого значения
;
;**
_XMM_Version proc near
push si
push di
xor ah, ah
call [XMM_Control]
mov dx, bx
pop di
pop si
ret
_XMM_Version endp
;**
;.Name _XMM_RequestHMA
;.Title Запросить область HMA
;
;.Descr Эта функция пытается зарезервировать для
; программы область HMA
;
;.Proto long XMM_RequestHMA(unsigned space);
;
;.Params space - размер требуемой области для
; TSR-программы или драйвера,
; 0xffff для прикладной программы;
;
;.Return < 0 - область HMA не назначена программе,
; код ошибки находится в старшем байте.
; 0L - область HMA назначена программе.
;
;**
_XMM_RequestHMA proc near
c_begin
mov ah, 1
mov dx, [bp+4]
call [XMM_Control]
xor dx, dx
dec ax
jz @success
mov dh, bl
@success:
c_end
_XMM_RequestHMA endp
;**
;.Name _XMM_ReleaseHMA
;.Title Освободить область HMA
;
;.Descr Эта функция пытается освободить
; область HMA
;
;.Proto long XMM_ReleaseHMA(void);
;
;.Params Не используются
;
;.Return < 0 - область HMA не освобождена,
; код ошибки находится в старшем байте.
; 0L - область HMA освобождена.
;
;**
_XMM_ReleaseHMA proc near
c_begin
mov ah, 2
call [XMM_Control]
xor dx, dx
dec ax
jz @success1
mov dh, bl
@success1:
c_end
_XMM_ReleaseHMA endp
;**
;.Name _XMM_GlobalEnableA20
;.Title Глобальное разрешение линии A20
;
;.Descr Эта функция разрешает программе, получившей
; доступ к области HMA использовать линию A20
;
;.Proto long XMM_GlobalEnableA20(void);
;
;.Params Не используются
;
;.Return < 0 - линия A20 не включена,
; код ошибки находится в старшем байте.
; 0L - линия A20 включена.
;
;**
_XMM_GlobalEnableA20 proc near
c_begin
mov ah, 3
call [XMM_Control]
xor dx, dx
dec ax
jz @success2
mov dh, bl
@success2:
c_end
_XMM_GlobalEnableA20 endp
;**
;.Name _XMM_GlobalDisableA20
;.Title Глобальное запрещение линии A20
;
;.Descr Эта функция запрещает программе, получившей
; доступ к области HMA использовать линию A20
;
;.Proto long XMM_GlobalDisableA20(void);
;
;.Params Не используются
;
;.Return < 0 - линия A20 не выключена,
; код ошибки находится в старшем байте.
; 0L - линия A20 выключена.
;
;**
_XMM_GlobalDisableA20 proc near
c_begin
mov ah, 4
call [XMM_Control]
xor dx, dx
dec ax
jz @success3
mov dh, bl
@success3:
c_end
_XMM_GlobalDisableA20 endp
;**
;.Name _XMM_EnableA20
;.Title Локальное разрешение линии A20
;
;.Descr Эта функция разрешает программе управлять
; областью расширенной памяти.
;
;.Proto long XMM_EnableA20(void);
;
;.Params Не используются
;
;.Return < 0 - линия A20 не включена,
; код ошибки находится в старшем байте.
; 0L - линия A20 включена.
;
;**
_XMM_EnableA20 proc near
c_begin
mov ah, 5
call [XMM_Control]
xor dx, dx
dec ax
jz @success4
mov dh, bl
@success4:
c_end
_XMM_EnableA20 endp
;**
;.Name _XMM_DisableA20
;.Title Локальное запрещение линии A20
;
;.Descr Эта функция запрещает программе управлять
; областью расширенной памяти.
;
;.Proto long XMM_DisableA20(void);
;
;.Params Не используются
;
;.Return < 0 - линия A20 не выключена,
; код ошибки находится в старшем байте.
; 0L - линия A20 выключена.
;
;**
_XMM_DisableA20 proc near
c_begin
mov ah, 6
call [XMM_Control]
xor dx, dx
dec ax
jz @success5
mov dh, bl
@success5:
c_end
_XMM_DisableA20 endp
;**
;.Name _XMM_QueryA20
;.Title Проверить состояние линии A20
;
;.Descr Эта функция проверяет доступность
; линии A20
;
;.Proto long XMM_QueryA20(void);
;
;.Params Не используются
;
;.Return < 0 - ошибка,
; код ошибки находится в старшем байте.
; 0L - линия A20 выключена,
; 1L - линия A20 включена.
;
;**
_XMM_QueryA20 proc near
c_begin
mov ah, 7
call [XMM_Control]
xor dx, dx
or ax, ax
jnz @success6
mov dh, bl
@success6:
c_end
_XMM_QueryA20 endp
;**
;.Name _XMM_QueryLargestFree
;.Title Определить максимальный размер блока
;
;.Descr Эта функция возвращает размер максимального
; непрерывного блока расширенной памяти,
; который доступен программе.
;
;.Proto long XMM_QueryLargestFree(void);
;
;.Params Не используются
;
;.Return < 0 - ошибка,
; код ошибки находится в старшем байте.
; >= 0 - размер блока.
;
;**
_XMM_QueryLargestFree proc near
c_begin
mov ah, 8
call [XMM_Control]
xor dx, dx
or ax, ax
jnz @success7
mov dh, bl
@success7:
c_end
_XMM_QueryLargestFree endp
;**
;.Name _XMM_QueryTotalFree
;.Title Определить размер расширенной памяти
;
;.Descr Эта функция возвращает размер
; всей имеющейся расширенной памяти.
;
;.Proto long XMM_QueryTotalFree(void);
;
;.Params Не используются
;
;.Return < 0 - ошибка,
; код ошибки находится в старшем байте.
; >= 0 - размер расширенной памяти.
;
;**
_XMM_QueryTotalFree proc near
c_begin
mov ah, 8
call [XMM_Control]
or ax, ax
mov ax, dx
mov dx, 0
jnz @success8
mov dh, bl
@success8:
c_end
_XMM_QueryTotalFree endp
;**
;.Name _XMM_AllocateExtended
;.Title Запросить блок расширенной памяти
;
;.Descr Эта функция выделяет программе блок
; расширенной памяти, в случае успеха
; возвращает индекс полученного блока.
;
;.Proto long XMM_AllocateExtended(unsigned space);
;
;.Params space - размер требуемого блока памяти
; в килобайтах;
;
;.Return < 0 - блок не распределен,
; код ошибки находится в старшем байте.
; > 0L - младший байт содержит индекс
; полученного блока памяти.
;
;**
_XMM_AllocateExtended proc near
c_begin
mov ah, 9
mov dx, [bp+4]
call [XMM_Control]
or ax, ax
mov ax, dx
mov dx, 0
jnz @success9
mov dh, bl
@success9:
c_end
_XMM_AllocateExtended endp
;**
;.Name _XMM_FreeExtended
;.Title Освободить блок расширенной памяти
;
;.Descr Эта функция освобождает блок
; расширенной памяти, полученный функцией
; XMM_AllocateExtended().
;
;.Proto long XMM_FreeExtended(unsigned handle);
;
;.Params handle - индекс освобождаемого блока памяти;
;
;.Return < 0 - блок не распределен,
; код ошибки находится в старшем байте.
; 0L - блок освобожден.
;
;**
_XMM_FreeExtended proc near
c_begin
mov ah, 0Ah
mov dx, [bp+4]
call [XMM_Control]
xor dx, dx
dec ax
jz @successA
mov dh, bl
@successA:
c_end
_XMM_FreeExtended endp
;**
;.Name _XMM_MoveExtended
;.Title Копировать блок расширенной памяти
;
;.Descr Эта функция копирует блок
; расширенной памяти, используя структуру
; struct XMM_Move:
;
; struct XMM_Move {
; unsigned long Length;
; unsigned short SourceHandle;
; unsigned long SourceOffset;
; unsigned short DestHandle;
; unsigned long DestOffset;
; };
;
;.Proto long XMM_MoveExtended(struct
; XMM_Move *move_descr);
;
;.Params struct XMM_Move *move_descr -
; указатель на структуру, описывающую
; что, откуда и куда надо копировать.
;
;.Return < 0 - ошибка при копировании,
; код ошибки находится в старшем байте.
; 0L - блок скопирован успешно.
;
;**
_XMM_MoveExtended proc near
c_begin
mov ah, 0Bh
mov si, [bp+4];
call [XMM_Control]
xor dx, dx
dec ax
jz @successB
mov dh, bl
@successB:
c_end
_XMM_MoveExtended endp
;**
;.Name _XMM_LockExtended
;.Title Заблокировать блок расширенной памяти
;
;.Descr Эта функция блокирует блок расширенной
; памяти и возвращает 31 разряд его
; физического адреса.
;
;.Proto long XMM_LockExtended(unsigned handle);
;
;.Params handle - индекс блокируемого блока памяти;
;
;.Return < 0 - блок не заблокирован,
; код ошибки находится в старшем байте.
; > 0L - блок заблокирован, функция
; возвращает физический адрес блока
; памяти.
;
;**
_XMM_LockExtended proc near
c_begin
mov ah, 0Ch
mov dx, [bp+4]
call [XMM_Control]
xchg ax, bx
dec bx
jz XMML_Success
mov dh, al
XMML_Success:
c_end
_XMM_LockExtended endp
;**
;.Name _XMM_UnLockExtended
;.Title Разблокировать блок расширенной памяти
;
;.Descr Эта функция разблокирует блок расширенной
; памяти.
;
;.Proto long XMM_UnLockExtended(unsigned handle);
;
;.Params handle - индекс блока памяти;
;
;.Return < 0 - блок не разблокирован,
; код ошибки находится в старшем байте.
; 0L - блок разблокирован.
;
;**
_XMM_UnLockExtended proc near
c_begin
mov ah, 0Dh
mov dx, [bp+4]
call [XMM_Control]
xor dx, dx
dec ax
jz @successC
mov dh, bl
@successC:
c_end
_XMM_UnLockExtended endp
;**
;.Name _XMM_GetHandleLength
;.Title Получить длину блока расширенной памяти
;
;.Descr Эта функция возвращает длину блока
; расширенной памяти по его индексу.
;
;.Proto long XMM_GetHandleLength(unsigned handle);
;
;.Params handle - индекс блока памяти;
;
;.Return < 0 - произошла ошибка,
; код ошибки находится в старшем байте.
; > 0L - длина блока в килобайтах.
;
;**
_XMM_GetHandleLength proc near
c_begin
mov ah, 0Eh
mov dx, [bp+4]
call [XMM_Control]
or ax, ax
mov ax, dx
mov dx, 0
jnz @successD
mov dh, bl
@successD:
c_end
_XMM_GetHandleLength endp
;**
;.Name _XMM_GetHandleInfo
;.Title Получить информацию о блоке расширенной памяти
;
;.Descr Эта функция возвращает общее
; количество индексов в системе и
; содержимое счетчика блокирования для
; заданного индекса.
;
;.Proto long XMM_GetHandleInfo(unsigned handle);
;
;.Params handle - индекс блока памяти;
;
;.Return < 0 - произошла ошибка,
; код ошибки находится в старшем байте.
; > 0L - младший байт - общее количество
; индексов в системе;
; старший байт - счетчик блокирования.
;
;**
_XMM_GetHandleInfo proc near
c_begin
mov ah, 0Eh
mov dx, [bp+4]
call [XMM_Control]
mov dx, bx
or ax, ax
mov ax, dx
mov dx, 0
jnz @successE
mov dh, bl
@successE:
c_end
_XMM_GetHandleInfo endp
;**
;.Name _XMM_ReallocateExtended
;.Title Изменить размер блока расширенной памяти
;
;.Descr Эта функция изменяет размер выделенного
; блока расширенной памяти.
;
;.Proto long XMM_ReallocateExtended(unsigned handle,
; unsigned new_size);
;
;.Params handle - индекс блока памяти;
; new_size - новый размер блока памяти
; в килобайтах;
;
;.Return < 0 - блок не распределен,
; код ошибки находится в старшем байте.
; > 0L - младший байт содержит индекс
; полученного блока памяти.
;
;**
_XMM_ReallocateExtended proc near
c_begin
mov ah, 0Fh
mov dx, [bp+4]
mov bx, [bp+6]
call [XMM_Control]
xor dx, dx
dec ax
jz @successF
mov dh, bl
@successF:
c_end
_XMM_ReallocateExtended endp
;**
;.Name _XMM_RequestUMB
;.Title Запросить область UMB
;
;.Descr Эта функция пытается зарезервировать для
; программы область UMB
;
;.Proto long XMM_RequestUMB(unsigned space);
;
;.Params space - размер требуемой области
; в параграфах;
;
;.Return < 0 - область UMB не назначена программе,
; код ошибки находится в старшем байте;
; максимальный размер доступного блока
; в младшем слове (16 разрядов);
; > 0L - область UMB назначена программе,
; младшее слово содержит сегмент блока
; UMB, старший - размер выделенного
; блока UMB.
;
;**
_XMM_RequestUMB proc near
c_begin
mov ah, 10h
mov dx, [bp+4]
call [XMM_Control]
xchg bx, ax
dec bx
jz RUMB_Success
xchg ax, dx
mov dh, dl
RUMB_Success:
c_end
_XMM_RequestUMB endp
;**
;.Name _XMM_ReleaseUMB
;.Title Освободить область UMB
;
;.Descr Эта функция пытается освободить
; область UMB
;
;.Proto long XMM_ReleaseUMB(unsigned segment);
;
;.Params segment - сегмент освобождаемого блока UMB*
;
;.Return < 0 - область UMB не освобождена,
; код ошибки находится в старшем байте.
; 0L - область UMB освобождена.
;
;**
_XMM_ReleaseUMB proc near
c_begin
mov ah, 11h
mov dx, [bp+4]
call [XMM_Control]
xor dx, dx
dec ax
jz @success10
mov dh, bl
@success10:
c_end
_XMM_ReleaseUMB endp
END
- Аннотация
- Введение
- Благодарности
- Авторский компакт-диск
- Как связаться с авторами
- 1 Определение конфигурации компьютера
- Определение конфигурации с помощьюBios
- Наличие нмд
- Наличие арифметического сопроцессора
- Начальный режим работы видеоадаптера
- Стандартная оперативная память
- Расширенная оперативная память
- ПрограммаHdwcfg
- Код модели компьютера и версияBios
- ПрограммаBiosinfo
- Конфигурация в памяти cmos
- 00H - 0Dh - область часов реального времени
- 0Eh - байт диагностики
- 0Fh - байт отключения
- 10H - тип накопителей нгмд
- 11H - зарезервировано дляIbm pc/at, тип нмд дляIbm ps/2
- 12H - тип первого и второго нмд
- 13H - зарезервировано
- 14H - конфигурация оборудования
- 15H-16h - объем стандартной оперативной памяти
- ПрограммаCmosshow
- Определение типа центрального процессора
- МоделиIntel 8086/8088
- Модель Intel 80286
- МодельIntel 80386
- МодельIntel 80486
- Команда cpuid
- ПрограммаCpuinfo
- 2 Клавиатура
- Как работает клавиатура
- Клавиатурная матрица
- Скан-код клавиши
- КодAscii нажатой клавиши
- Режим автоповтора
- Типы клавиатур
- Порты для работы с клавиатурой
- КомпьютерIbm pc/xt
- Современные компьютеры
- ПрограммаKbdled
- Аппаратное прерывание клавиатуры
- Стандартный обработчик прерывания int 09h
- Буфер клавиатуры
- Переключающие клавиши
- Средства bios для работы с клавиатурой
- Чтение символа с ожиданием
- ПрограммаKbdscan
- Проверка буфера на наличие в нем символов
- ПрограммаChkbuf
- Получение состояния переключающих клавиш
- Установка временных характеристик клавиатуры
- Запись символов в буфер клавиатуры
- Чтение символа с ожиданием для 101-клавишной клавиатуры
- Проверка буфера на наличие в нем символов для 101-клавишной клавиатуры
- Получение состояния переключающих клавиш для 101-клавишной клавиатуры
- Режимы работы клавиатуры
- Сравнение режимов
- Изменение режима
- Средства ms-dos для работы с клавиатурой
- Буферизованный ввод с эхо-выводом
- Буферизованный ввод без эхо-вывода
- Нефильтрованный ввод без эхо-вывода
- Вводс консоли и вывод на консоль
- Ввод строки символов
- Проверка состояния стандартного ввода
- Сброс буфера клавиатуры
- Клавиатурные функции стандартной библиотеки c
- Функции getch и getche
- ПрограммаKbdascii
- Функцияkbhit
- ПрограммаKbdhit
- Функция cgets
- Функция gets
- Функция scanf
- Как устроена мышь?
- Драйверы мыши в ms-dos
- Прерывание для обслуживания мыши
- Инициализация мыши
- Включить курсор мыши
- Выключить курсор мыши
- ПрограммаMscursor
- Определить положение курсора
- ПрограммаMsgcurs
- Установить курсор
- Определить положение курсора при нажатии клавиши
- Определить положение курсора при отпускании клавиши
- Задать диапазон движения курсора по горизонтали
- Задать диапазон движения курсора по вертикали
- Задать форму курсора в графическом режиме
- ПрограммаMsgform
- Задать форму курсора в текстовом режиме
- ПрограммаMstform
- Определить содержимое счетчиков перемещения
- Установить драйвер событий
- ПрограммаMsdriver
- Включить эмуляцию светового пера
- Выключить эмуляцию светового пера
- Задать скорость перемещения курсора мыши
- Установить область исключения для курсора
- Задать увеличенный графический курсор
- Определить порог удвоения скорости
- Заменить драйвер событий
- Определить размер буфера состояния драйвера
- Сохранить состояние драйвера
- Восстановить состояние драйвера
- Установить альтернативный драйвер событий
- Получить адрес альтернативного драйвера событий
- Установить чувствительность мыши
- Определить чувствительность мыши
- Установить частоту прерываний для Inport Mouse
- Установить номер страницы видеопамяти
- Определить номер страницы видеопамяти
- Отключить драйвер мыши
- Восстановить драйвер мыши
- Сбросить драйвер мыши
- Определить тип мыши
- МышьMicrosoft IntelliMouse
- Проверка наличия мыши Microsoft IntelliMouse
- Проверка в среде Microsoft Windows 95 и Microsoft Windows nt версии 3.51
- Проверка в среде Microsoft Windows nt версии 4.0
- Определение величины свертки
- Определение величины свертки в среде Microsoft Windows 95 и Microsoft Windows nt версии 3.51
- Определение величины свертки в среде Microsoft Windows nt версии 4.0
- Сообщение msh_mousewheel
- Сообщение wm_mousewheel
- Другие сообщения от мыши Microsoft IntelliMouse
- ПриложениеRtfpad
- 4 Часы реального времени
- Регистры часов реального времени
- Регистры счетчиков
- Регистр состоянияA
- Регистр состояния b
- Регистр состояния c
- Регистр состояния d
- Прерывание от часов реального времени
- Функции прерыванияInt 1Ah
- Сброс будильника
- ПрограммаRtcalarm
- 5 Системный таймер
- Обработка прерываний таймера
- Микросхемы таймера 8253 и 8254
- Режимы работы таймера
- Режим однократного выполнения функций
- Работа с перезапуском
- Формат управляющего регистра
- Формат команды чтения слова состояния канала
- Формат слова состояния канала
- Последовательность действий
- ПрограммаTimerst
- Средства bios для работы с таймером
- Чтение счетчика таймера
- Установка счетчика таймера
- Установка таймера с сигнализацией
- Формирование задержки
- Второй способ проигрывания музыки
- Проигрывание музыки в фоновом режиме
- ПрограммаTmsound
- ПрограммаIosound
- ПрограммаRandom
- 6 Асинхронный последовательный адаптер
- Основные понятия и термины
- Аппаратная реализация
- МикросхемаUart
- Разъемы адаптера
- Порты асинхронного адаптера
- Порт 3f8h
- Порт 3f9h
- Порт 3fAh
- Порт 3fBh
- Порт 3fCh
- Порт 3fDh
- Порт 3fEh
- Функции bios для работы с последовательным асинхронным адаптером
- Инииализация портов асинхронного адаптера
- Передача байта
- Прием байта
- Определение состояния асинхронного адаптера
- Программирование асинхронного адаптера
- Инициализация асинхронного адаптера
- Передача данных
- Прием данных
- ПрограммаComtest
- Использование прерываний
- 7 Параллельный адаптер
- Порты параллельного адаптера
- Порт 378h
- Порт 37Ah
- Порт 379h
- Разъем параллельного адаптера
- Вывод байта на принтер через параллельный адаптер
- Функции bios для работы с принтером
- Печать символа
- Инициализация принтера
- Определение состояния принтера
- ПрограммаPrintfl
- Функции ms-dos для работы с принтером
- ФункцияMs-dos для вывода на принтер
- Система буферизованной печати
- Проверка установки системы буферизованной печати
- Запуск процесса печати файла
- Отмена печати файла
- Отмена печати всех файлов
- Определение состояния и блокировка системы буферизованной печати
- Разблокирование системы буферизованной печати
- Коды ошибок
- Программирование принтера
- Подключение принтера к компьютеру
- Установка переключателей конфигурации
- Программирование режимов работы принтера
- Инициализация принтера
- Контроллер прямого доступа ibm pc/xt
- Регистры каналов dma
- Порты 00h - 07h
- Порт 08h
- Порт 09h
- Порт 0Ah
- Порт 0Bh
- Порт 0Ch
- Порт 0Dh
- Порт 0Eh
- Порт 0Fh
- Порты 81h-8Fh
- Инициализация канала dma
- Контроллер прямого доступа ibm at
- Регистры каналовDma
- Регистры страниц
- Порты 0c0h - 0dFh
- Порты 0d0h-0dFh
- 9 Устройство чтения cd-rom
- Драйвер устройства чтенияCd-rom
- РасширениеMscdex
- ФункцииMscdex
- Определение количества устройствCd-rom
- Получение списка устройств cd-rom
- Получение имени файла прав собственности
- Получение имени файла резюме
- Получение имени файла библиографической документации
- Чтение сектора оглавления компакт-диска
- Чтение сектора по абсолютному адресу
- Проверка устройства чтения cd-rom
- Определение версии mscdex
- Определение обозначения устройств чтения cd-rom
- Вызов драйвера cd-rom
- Работа через драйверCd-rom
- Заголовок запроса
- Команды драйвера cd-rom
- Инициализация
- ЧтениеIoctl Input
- Определение адреса заголовка драйвера cd-rom
- Определение положения головки
- Получение информации о звуковых каналах
- Чтение данных из устройства
- Определение состояния устройства
- Определение размера сектора
- Определение размера тома
- Проверка замены носителя данных
- Получение информации о компакт-диске
- Получение информации о дорожкекомпакт-диска
- Получение информации о канале q
- Получение информации о подканале
- Получение штрих-кода изготовителя компакт-диска
- Сброс входных буферов
- ЗаписьIoctl Output
- Извлечение компакт-диска
- Блокирование и разблокирование компакт-диска в устройстве
- Сброс устройства чтения cd-rom
- Управление звуковыми каналами
- Запись в устройство управляющей строки
- Чтение длинное с предварительной выборкой
- Проигрывание звуковой дорожки
- Остановка проигрывания звуковой дорожки
- Возобновление проигрывания звуковой дорожки
- ПрограммаCdinfo
- ПрограммаCdplay
- 10 Арифметический сопроцессор
- Вещественные числа
- Целые числа
- Регистры сопроцессора
- Численные регистры
- Регистр тегов
- Регистр управления
- Регистр состояния
- Регистры указателя команды и указателя операнда
- Система команд сопроцессора
- Команды пересылки данных
- Запись в стек
- Извлечение из стека
- Копирование данных
- Загрузка констант
- Арифметические команды
- Команды сравнений чисел
- Трансцендентные команды
- Управляющие команды
- Программирование сопроцессора
- ПрограммаNpu1
- Обработка особых случаев
- Неточный результат
- Переполнение
- Антипереполнение
- Деление на нуль
- Недействительная операция
- Денормализованный операнд
- Ошибка в процессореPentium
- 11 Расширенная память
- Основные понятия
- Установка драйвера himem.Sys
- Спецификация xms
- Проверка подключения драйвера
- Получение адреса управляющей программы
- Описание функций драйвера himem.Sys
- Получить версию xms
- Запросить область hma
- Освободить область hma
- Глобальное открывание линии a20
- Глобальное закрывание линии a20
- Освободить блок emb
- Копирование блоков emb
- Блокирование emb
- Разблокирование emb
- Получить информацию об идентификаторе блока emb
- Изменить размер emb
- Запросить область umb
- Освободить область umb
- Коды ошибок
- Ограничения при использовании области hma
- Примеры программ
- ПрограммаTesthma
- ПрограммаCallhma
- Предметный указатель
- Литература
- Оглавление
- 1 Определение конфигурации компьютера 7
- 2 Клавиатура 38
- 3 Мышь 64
- 4 Часы реального времени 102
- 5 Системный таймер 113
- 6 Асинхронный последовательный адаптер 132
- 7 Параллельный адаптер 149
- 8 Контроллер прямого доступа к памяти 162
- 9 Устройство чтения cd-rom 170
- 10 Арифметический сопроцессор 216
- 11 Расширенная память 243