Функции для работы с 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,&reg);

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,&reg);

}

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,&reg);

if (reg.r_ax!=0x004f)

return;

}

void SetTextVideo()

{

struct REGPACK reg;

reg.r_ax=2;

intr(0x10,&reg);

}

// создание меню

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 “Компьютерный эколого-экономический мониторинг ”

Составители : Наталия Евгеньевна Губенко

Вадим Сергеевич Миргород

Наши рекомендации