Смекни!
smekni.com

Відеопам ять у текстовому режимі (стр. 2 из 2)

В EGA знаходиться своя множина відеопрограм в RAM. Вони розміщуються з адреси C000:0000. Програма початкового завантаження (POST) ініциалізує вектор переривання 10h так, щоб він вказував на власні відеопрограми EGA. Адрес програми відео BIOS на материнській платі зберігається у векторі переривання 42h.

У VGA програми відео BIOS розміщуються за адресою C000:0000

У доданку наводиться текст програми на мові Borland Pascal 7.0 з вставками на мові Assembler. Програма демонструє можливості керування зображенням за допомогою прямої адресації відеопам’яти.


Доданок. Лістінг програми, яка демонструє можливості керування відеопам’ятью.

PROGRAM VideoMem_Demo; {Written by Kovalyov Serhii as attachment}

{to report "Video Memory"}

USES

CRT;

VAR

Cols:WORD;

Rows:BYTE;

PageSize:WORD;

ActivePage:BYTE;

VOffset:WORD;

ChOff:WORD;

J:BYTE;

Dir:BOOLEAN;

PROCEDURE ReadScreenProp; ASSEMBLER;

ASM

{Reading properties of Video Mode}

PUSH DS

MOV AX,0040h

MOV DS,AX

MOV AX,DS:[004Ah]

XOR BX,BX

MOV BL,DS:[0084h]

INC BL

MOV DL,DS:[0062h]

POP DS

MOV Cols,AX

MOV Rows,BL

MUL BX

MOV PageSize,AX

MOV ActivePage,DL

END;

PROCEDURE ClearScreen; ASSEMBLER;

ASM

{Set cursor position}

PUSH DS

MOV AX,0040h

MOV DS,AX

MOV BX,0050h

XOR DH,DH

MOV DL,ActivePage

ADD BX,DX

ADD BX,DX

MOV WORD PTR DS:[BX],0

POP DS

{Clearing active page}

MOV CX,PageSize

XOR AX,AX

XOR BX,BX

MOV AL,ActivePage

MOV BX,PageSize

MUL BX

MOV VOffset,AX

MOV BX,VOffset

MOV CX,PageSize

MOV AX,0B800h

PUSH DS

MOV DS,AX

@loop_label2:

MOV WORD PTR DS:[BX],0000h

INC BX

MOV WORD PTR DS:[BX],000Fh

INC BX

LOOP @loop_label2

POP DS

END;

PROCEDURE PutSymbol(Character:CHAR;Attr:BYTE;PosX,PosY:BYTE); ASSEMBLER;

ASM

MOV CH,Attr

MOV CL,Character

XOR AX,AX

MOV AL,PosY

MOV BX,Cols

ADD BX,BX

MUL BX

XOR BX,BX

MOV BL,PosX

ADD BL,PosX

ADD AX,BX

MOV ChOff,AX

MOV BX,VOffset

ADD BX,ChOff

PUSH DS

MOV AX,0B800h

MOV DS,AX

MOV WORD PTR DS:BX,CX

POP DS

END;

BEGIN

Dir:=TRUE;

ReadScreenProp;

ClearScreen;

{WriteLn(PageSize,' ',VOffset,' ',ActivePage,' ',Cols,' ',Rows,' ',ChOff);}

PutSymbol(' ',$0000,0,0);

PutSymbol('V',$1E,3,1);

PutSymbol('I',$1E,3,2);

PutSymbol('D',$1E,3,3);

PutSymbol('E',$1E,3,4);

PutSymbol('O',$1E,3,5);

PutSymbol('M',$70,2,4);

PutSymbol('E',$02,3,4);

PutSymbol('M',$70,4,4);

PutSymbol('O',$70,5,4);

PutSymbol('R',$70,6,4);

PutSymbol('Y',$70,7,4);

J:=0;

REPEAT

IF Dir THEN PutSymbol(' ',$00,J-1,11)

ELSE PutSymbol(' ',$00,J+6,11);

PutSymbol('D',$0E,J,11);

PutSymbol('C',$0E,J+1,11);

PutSymbol('S',$0E,J+2,11);

PutSymbol('S',$0E,J+3,11);

PutSymbol('-',$0E,J+4,11);

PutSymbol('1',$0E,J+5,11);

IF (J<Cols-6) AND Dir THEN INC(J)

ELSE IF (NOT Dir) AND (J>0)

THEN DEC(J)

ELSE BEGIN

Dir:=NOT Dir;

END;

Delay(120);

UNTIL KeyPressed;

ClearScreen;

END.