Функции для работы с CD проигрывателем
_CheckCD PROC C FAR ;тестировать CD ROM
;возвращает в AL к-во устройств
;Если 0 - нет MSCDEX
; проверка наличия MSCDEX
push ds
push DATA
pop ds
mov ax, 1500H ;получить число устройств
xor bx,bx
int 2FH
;RETURN:
;BX - количество устройств
;CX - буква первого устройства
mov first_drive,cl
mov num_drives,bl
mov ax, 150BH ;получить число устройств
xor bx,bx
int 2FH
cmp bx,0ADADH
jne @@egog
jmp short @@exit
@@egog:
xor al,al
xor cl,cl
@@exit:
mov al,num_drives
mov cl,first_drive
pop ds
retf
ENDP _CheckCD
;---------------------------------------------------------------
_DoorOpen PROC C FAR ;открыть дверцу
ARG dev:byte, letter:byte
push ds
push DATA
pop ds
mov bx,offset tabl ; заполнение заголовка
mov help,0 ;открыть дверь
sendopen:
mov [bx].rh_Len,size Ioctl_Hdr
mov al,dev
mov [bx].rh_Subunit,al
mov [bx].rh_Code,cmIoctl_Output
mov [bx].ioctl_media,0
mov [bx].ioctl_xfer_off,offset help
push ds
pop [bx].ioctl_xfer_seg
mov [bx].ioctl_nbytes,1
mov [bx].ioctl_sector,0
mov word ptr [bx].ioctl_volid,0
mov word ptr [bx].ioctl_volid+2,0
push es
push ds
pop es
mov ax,1510h
mov bx,offset tabl
xor cx,cx
mov cl,letter
int 2fh
mov ax,[bx].rh_Status
pop es
pop ds
pop bp
retf
ENDP _DoorOpen
;---------------------------------------------------------------
_DoorClose PROC C FAR ;закрыть дверцу
ARG dev:byte, letter:byte
push ds
push DATA
pop ds
mov bx,offset tabl ; заполнение заголовка
mov help,5 ; закрыть дверь
jmp sendopen
ENDP _DoorClose
_Reset PROC C FAR ;сброс
ARG dev:byte, letter:byte
push ds
push DATA
pop ds
mov bx,offset tabl ; заполнение заголовка
mov help,2 ; резет
jmp sendopen
ENDP _Reset
;---------------------------------------------------------------
_DoorLock PROC C FAR ;блокировать дверцу
ARG dev:byte, letter:byte
push ds
push DATA
pop ds
mov bx,offset tabl ; заполнение заголовка
mov help,1 ; запереть дверь
mov help1,1
sendlock:
mov [bx].rh_Len,size Ioctl_Hdr
mov al,dev
mov [bx].rh_Subunit,al
mov [bx].rh_Code,cmIoctl_Output
mov [bx].ioctl_media,0
mov [bx].ioctl_xfer_off,offset help
push ds
pop [bx].ioctl_xfer_seg
mov [bx].ioctl_nbytes,2
mov [bx].ioctl_sector,0
mov word ptr [bx].ioctl_volid,0
mov word ptr [bx].ioctl_volid+2,0
push es
push ds
pop es
mov ax,1510h
mov bx,offset tabl
xor cx,cx
mov cl,letter
int 2fh
mov ax,[bx].rh_Status
pop es
pop ds
pop bp
retf
ENDP _DoorLock
_DoorUnlock PROC C FAR ;разблокировать дверцу
ARG dev:byte, letter:byte
push ds
push DATA
pop ds
mov bx,offset tabl ; заполнение заголовка
mov help,1 ; запереть дверь
mov help1,0
jmp sendlock
ENDP _DoorUnlock
;---------------------------------------------------------------
_GetLetters PROC C FAR ;получить список устройств
ARG buffoffs:word,buffseg:word
push ds es bx
push DATA
pop ds
mov es,buffseg
mov bx,buffoffs
mov ax,150dh
int 2fh
pop bx es ds bp
retf
ENDP _GetLetters
;---------------------------------------------------------------
_StartPlay PROC C FAR;начать проигрывание
ARG dev:byte, letter:byte, start: dword, numsec:dword
push ds
push DATA
pop ds
mov bx,offset tabl ; заполнение заголовка
mov [bx].rh_Len,size PlayReq_Hdr
mov [bx].rh_Code,cmPlay_Audio
mov ax,word ptr numsec
mov word ptr [bx].pl_Num,ax
mov ax,word ptr numsec+2
mov word ptr [bx].pl_Num+2,ax
mov ax,word ptr start
mov word ptr [bx].pl_Start,ax
mov ax,word ptr start+2
mov word ptr [bx].pl_Start+2,ax
sendplay:
mov al,dev
mov [bx].rh_Subunit,al
mov [bx].pl_Addrmd,00h
push es
push ds
pop es
mov ax,1510h
mov bx,offset tabl
xor cx,cx
mov cl,letter
int 2fh
mov ax,[bx].rh_Status
pop es
pop ds
pop bp
retf
ENDP _StartPlay
;---------------------------------------------------------------
_StopPlay PROC C FAR ;прервать проигрывание
ARG dev:byte, letter:byte
push ds
push DATA
pop ds
mov bx,offset tabl ; заполнение заголовка
mov [bx].rh_Len,size Request_Hdr
mov [bx].rh_Code,cmStop_Audio
jmp sendplay
ENDP _StopPlay
;---------------------------------------------------------------
_ResumePlay PROC C FAR ;продолжить проигрывание
ARG dev:byte, letter:byte
push ds
push DATA
pop ds
mov bx,offset tabl ; заполнение заголовка
mov [bx].rh_Len,size Request_Hdr
mov [bx].rh_Code,cmResume_Audio
jmp sendplay
ENDP _ResumePlay
_Seek PROC C FAR ;позиционирование
ARG dev:byte, letter:byte, sector:dword
push ds
push DATA
pop ds
mov bx,offset tabl ; заполнение заголовка
mov [bx].rh_Len,size SeekReq_Hdr
mov [bx].rh_Code,cmSeek
mov [bx].cq_addrmd,addr_hsg
mov ax,word ptr sector
mov word ptr [bx].cq_startadr,ax
mov ax,word ptr sector+2
mov word ptr [bx].cq_startadr+2,ax
xor ax,ax
mov word ptr [bx].cq_startadr,ax
mov word ptr [bx].cq_startadr+2,ax
mov word ptr [bx].cq_numsec,ax
jmp sendplay
ENDP _Seek
_DiskInfo PROC C FAR;информация о диске
ARG dev:byte, letter:byte, buffoffs:word, buffseg:word
getinfo:
push ds
push DATA
pop ds
mov bx,offset tabl ; заполнение заголовка
mov [bx].rh_Len,size Ioctl_Hdr
mov [bx].rh_Code,cmIoctl_Input
mov al,dev
mov [bx].rh_Subunit,al
mov [bx].ioctl_media,0
mov ax,buffoffs
mov [bx].ioctl_xfer_off,ax
mov ax,buffseg
mov [bx].ioctl_xfer_seg,ax
mov [bx].ioctl_nbytes,size DiskInfo_Rec
mov [bx].ioctl_sector,0
mov word ptr [bx].ioctl_volid,0
mov word ptr [bx].ioctl_volid+2,0
jmp sendplay
ENDP _DiskInfo
ПРИЛОЖЕНИЕ С
Листинг программы
;программа, реализующая открытие и закрытие дверцы CD ROM
jumps
locals
model compact
include fmt.inc
include codes.inc
public _CheckCD ;проверить наличие драйвера
public _DoorOpen ;открыть дверцу
public _DoorClose ;закрыть дверцу
DATA SEGMENT public
num_drives db ?
first_drive db ?
tabl ReadWriteL_Hdr ?
help db ?
help1 db ?
DATA ENDS
CODE SEGMENT
ASSUME ds:DATA, cs:CODE
_CheckCD PROC C FAR
;возвращает в AL к-во устройств
;Если 0 - нет MSCDEX
; проверка наличия MSCDEX
push ds
push DATA
pop ds
mov ax, 1500H ;получить число устройств
xor bx,bx
int 2FH
;RETURN:
;BX - количество устройств
;CX - буква первого устройства
mov first_drive,cl
mov num_drives,bl
mov ax, 150BH ;получить число устройств
xor bx,bx
int 2FH
cmp bx,0ADADH
jne @@egog
jmp short @@exit
@@egog:
xor al,al
xor cl,cl
@@exit:
mov al,num_drives
mov cl,first_drive
pop ds
retf
ENDP _CheckCD
;---------------------------------------------------------------
_DoorOpen PROC C FAR
ARG dev:byte, letter:byte
push ds
push DATA
pop ds
mov al,num_drives
mov cl,first_drive
mov dev, al
mov letter, cl
mov bx,offset tabl ; заполнение заголовка
mov help,0 ;открыть дверь
sendopen:
mov [bx].rh_Len,size Ioctl_Hdr
mov al,dev
mov [bx].rh_Subunit,al
mov [bx].rh_Code,cmIoctl_Output
mov [bx].ioctl_media,0
mov [bx].ioctl_xfer_off,offset help
push ds
pop [bx].ioctl_xfer_seg
mov [bx].ioctl_nbytes,1
mov [bx].ioctl_sector,0
mov word ptr [bx].ioctl_volid,0
mov word ptr [bx].ioctl_volid+2,0
push es
push ds
pop es
mov ax,1510h
mov bx,offset tabl
xor cx,cx
mov cl,letter
int 2fh
mov ax,[bx].rh_Status
pop es
pop ds
pop bp
retf
ENDP _DoorOpen
;---------------------------------------------------------------
_DoorClose PROC C FAR
ARG dev:byte, letter:byte
push ds
push DATA
pop ds
mov bx,offset tabl ; заполнение заголовка
mov help,5 ; закрыть дверь
jmp sendopen
ENDP _DoorClose
startup:
mov ax,DATA
mov ds,ax
call _CheckCD
call _DoorOpen
call _DoorClose
mov ax,4c00h
int 021h
CODE ENDS
end startup
ПРИЛОЖЕНИЕ Д
Листинг программы
Программа выполняет чтение и вывод на экран полной информации о SuperVGA адаптере, позволять в диалоговом режиме выбрать и установить видеорежим.
#include <iostream.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <dos.h>
typedef char * String;
//информация о стандарте VESA
struct VESAInfo
{ char Sign[4] ; // ’VESA’
int Version; //версия
char far* OEM; //тип комплектации видеоадаптера
long Capabilities; //для описания возможностей ЦАП
unsigned int far* ModeList; //информация о видеорежимах
int TotalMemory; // количество видеопамяти
char Reserved[236];
};
//структура содержащая информацию о режиме SuperVGA
struct VESAModeInfo{
int Mode;
char WinAAtributes;
char WinBAtributes;
int WinGranularity;
int WinSize;
unsigned WinASegment;
unsigned WinBSegment;
void far (*WinFuncPtr)();
int BitesPerScanLine;
int XResolution;
int YResolution;
char XCharSize;
char YCharSize;
char NumberOfPlanes;
char BitsPerPixel;
char NumberOfBanks;
char MemoryModel;
char BankSize;
char NumberOfPages;
char Reserved;
char RedMaskSize;
char RedFieldPosition;
char GreenMaskSize;
char GreenFieldPosition;
char BlueMaskSize;
char BlueFieldPosition;
char RsvdMaskSize;
char RsvdFieldPosition;
char DirectColorModeInfo;
char Reserved2[216];
};
typedef struct ModeListNode{
int Mode; // видеорежим
int XRes; // разрешение по горизонтали
int YRes; // разрешение по вертикали
char BPP; // глубина цвета
}ModeListNode;
int Num=0,Mode=0; VESAInfo VesaInfo; VESAModeInfo VesaModeI;
ModeListNode ModeList[20]; //список данных о режиме SuperVGA
// проверка - поддерживает ли BIOS, VESA стандарт
int GetVesaInfo(VESAInfo *VI)
{
struct REGPACK reg;
reg.r_ax=0x4f00;
reg.r_es=FP_SEG(VI);
reg.r_di=FP_OFF(VI);
intr(0x10,®);
if (reg.r_ax!=0x004f)
return 0;
return 1;
}
//Получить информацию о режиме SuperVGA.
void GetVesaModeInfo(VESAModeInfo* VI,int Mode)
{ struct REGPACK reg;
reg.r_ax=0x4f01;
reg.r_es=FP_SEG(VI);
reg.r_di=FP_OFF(VI);
reg.r_cx=Mode;
intr(0x10,®);
}
void GetVesaInf() //установка данных о видеорежимах
{ GetVesaInfo(&VesaInfo);
Num=0;
int i=0;
struct REGPACK reg;
while (VesaInfo.ModeList[i]!=0xFFFF)
{
GetVesaModeInfo(&VesaModeI,VesaInfo.ModeList[i]);
if (((VesaModeI.Mode)&1)==1)
if (((int)VesaModeI.BitsPerPixel==8)||((int)VesaModeI.BitsPerPixel==32)||((int)VesaModeI.BitsPerPixel==24))
{
ModeList[Num].Mode=VesaInfo.ModeList[i];
ModeList[Num].XRes=VesaModeI.XResolution;
ModeList[Num].YRes=VesaModeI.YResolution;
ModeList[Num++].BPP=(int)VesaModeI.BitsPerPixel; } i++; }
}
//Установить SuperVGA видеорежим.
void SetVideoMode(int Mode)
{ struct REGPACK reg;
reg.r_ax=0x4f02;
reg.r_bx=Mode;
reg.r_bx&=0x7FFF;
intr(0x10,®);
if (reg.r_ax!=0x004f)
return;
}
void SetTextVideo()
{
struct REGPACK reg;
reg.r_ax=2;
intr(0x10,®);
}
// создание меню
int CreateMenu(char ** Item,int Count)
{
char ch;
int Active=0,Prev=0;
window(1,1,80,25); //создание окна
textcolor(WHITE); //текс белым цветом
textbackground(BLACK); //фон черный
clrscr();
for (int i=0;i<Count;i++)
printf("%s\n",Item[i]);
window(1,1,40,1);
textcolor(BLACK);
textbackground(WHITE);
clrscr();
printf("%s\n",Item[0]);
while (ch!=13)
{
ch=getch();
if (ch==0)
{
ch=getch();
switch (int(ch))
{case 80: Prev=Active;(Active==Count-1)?Active=0:Active++;break;
case 72: Prev=Active;(Active==0)?Active=Count-1:Active--;break; }
window(1,Active+1,40,Active+1);
textcolor(BLACK);
textbackground(WHITE);
clrscr();
printf("%s\n",Item[Active]);
window(1,Prev+1,40,Prev+1);
textcolor(WHITE);
textbackground(BLACK);
clrscr();
printf("%s\n",Item[Prev]);
}
}
return Active;
}
//вывод информации о поддерживаемых режимах
void PrintVesaInfo()
{ window(1,1,80,25);
textcolor(WHITE);
textbackground(BLACK);
clrscr();
GetVesaInfo(&VesaInfo);
struct REGPACK reg;
div_t t=div(VesaInfo.Version,0x100);
cout<<VesaInfo.Sign<<" версия "<<t.quot<<"."<<t.rem<<"\n";
cout<<"Видеоадаптер "<<VesaInfo.OEM<<"\n";
cout<<"Имеется "<<VesaInfo.TotalMemory*64<<" Кб видеопамяти"<<endl;
if ((VesaInfo.Capabilities&1)==1) cout<<"DAC может изменять ширину "<<endl;
if ((VesaInfo.Capabilities&1)==0) cout<<"DAC имеет 6 бит на пиксел "<<endl;
cout<<"Сведения о видеорежимах:"<<endl;
getch();
cout<<"Mode Type Resolution BPP CharS WinA Atr WinB Atr BPLine WinS Planes Granul"<<endl;
int count=0;
int i=0;
while (VesaInfo.ModeList[i]!=0xFFFF)
{ GetVesaModeInfo(&VesaModeI,VesaInfo.ModeList[i]);
if (VesaModeI.Mode&1==1)
printf("%Xh %5s %4dx%4d %2d %2dx%2d %4Xh %c%c %4Xh %c%c %4d %2dK %6d %5dK\n",VesaInfo.ModeList[i],
((VesaModeI.Mode&1==1)?((((VesaModeI.Mode>>4)&1)==0)?"Text":"Graph"):"-----"),
VesaModeI.XResolution,VesaModeI.YResolution,(int)VesaModeI.BitsPerPixel,
(int)VesaModeI.XCharSize,(int)VesaModeI.YCharSize,(((VesaModeI.WinAAtributes&1)==1)?VesaModeI.WinASegment:0),
(((VesaModeI.WinAAtributes>>1&1)==1)&&((VesaModeI.WinAAtributes&1)==1)?'R':'-'),
(((VesaModeI.WinAAtributes>>2&1)==1)&&((VesaModeI.WinAAtributes&1)==1)?'W':'-'),
(((VesaModeI.WinBAtributes&1)==1)?VesaModeI.WinASegment:0),
(((VesaModeI.WinBAtributes>>1&1)==1)&&((VesaModeI.WinBAtributes&1)==1)?'R':'-'),
(((VesaModeI.WinBAtributes>>2&1)==1)&&((VesaModeI.WinBAtributes&1)==1)?'W':'-'),
VesaModeI.BitesPerScanLine,(int)VesaModeI.WinSize,(int)VesaModeI.NumberOfPlanes,
VesaModeI.WinGranularity);
i++;
if (count==22&&(VesaInfo.ModeList[i])!=0xFFFF)
{ getch();
clrscr();
cout<<"Mode Type Resolution BPP CharS WinA Atr WinB Atr BPLine WinS Planes Granul"<<endl;
count=-1;
}count++;
} getch();
}
//выбор режима
void ChooseMode()
{
GetVesaInf();
String *M;
M = new String[Num];
for (int i=0;i<Num;i++)
M[i]=new char[20];
char *S = " x ",*S1 = new char[20];
if (S1==NULL) return;
for (i=0;i<Num;i++)
{
itoa(ModeList[i].XRes,M[i],10);
strcat(M[i],S);
itoa(ModeList[i].YRes,S1,10);
strcat(M[i],S1);
char *St=(ModeList[i].BPP==8)?" 256 color":(ModeList[i].BPP==24)?" 24 True Color":" 32 True Color";
strcat(M[i],St);
}
delete []S1;
i=CreateMenu(M,Num);
Mode=i;
SetVideoMode(Mode);//установить выбранный видеорежим
for (i=0;i<Num;i++)
delete []M[i];
delete []M;
}
void MainMenu() //главное меню
{ char ch;
String *Menu;
Menu = new String[8];
for (int i=0;i<3;i++)
Menu[i]=new char[40];
Menu[0]="The information about modes";
Menu[1]="Change of the modes";
Menu[2]="Exit";
while ((i=CreateMenu(Menu,3))!=2)
{
switch(i)
{
case 0:PrintVesaInfo();break; //получение инф-ции о поддерживаемых режимах
case 1:ChooseMode();break; //выбор и установка режима
} }
for (i=0;i<3;i++)
delete []Menu[i]; delete []Menu;
}
void main()
{ window(1,1,80,25);
textcolor(WHITE);
textbackground(BLACK);
clrscr();
//проверка на совместимость
if (GetVesaInfo(&VesaInfo)==0)
{ cout<<"Ваш адаптер не совместим со стандартом VESA";
getch();
return;
}
MainMenu();
СОДЕРЖАНИЕ
Лабораторная работа № 1
Программирование простейших растровых изображений на языке PostScript.……………………………………………………….….…………...3
Лабораторная работа № 2
Программирование растровых изображений на языке PostScript с использованием процедур.……………………………….……………….….12
Лабораторная работа № 3
Программирование изображений на языке PostScript с использованием операторов ветвления и циклов ……………………………………….…..18
Лабораторная работа № 4
Приемы низкоуровневой работы с мышью………………………………25
Лабораторная работа № 5
Работа с CD проигрывателем.……………………………………….....…..33
Лабораторная работа № 6
Программирование видеокарты SuperVGA с помощью стандарта VESA……………………………………………………….……………….….37
Лабораторная работа № 7
Загружаемые символьные наборы...…...……………….………...…….….50
Лабораторная работа № 8
Низкоуровневое программирование параллельного порта.......................70
Приложение А ………………………………………………………………...76
Приложение Б …………………………………………………………………77
Приложение В …………………………………………………………………82
Приложение Д …………………………………………………………………85
Методические указания и задания к лабораторным работам по курсу
“Методы и способы компьютерных информационных технологий“, (для студентов специальности 7.080407 “Компьютерный эколого-экономический мониторинг ”
Составители : Наталия Евгеньевна Губенко
Вадим Сергеевич Миргород