Помощь - Поиск - Пользователи - Календарь
Полная версия: Модуль CRT
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ассемблер
GLuk
Некоторые подпрограммы модуля Crt, написанные без использования системных средств. Сие отнюдь не претендует на оригинальность кода или максимальную эффективность (во всяком случае см. реализацию GetCursor). Жду комментариев...

Procedure CursorOff;Assembler;
{Убираем курсор}
asm
mov dx,3D4h {Регистр - Адрес КЭЛТ}
mov al,10
out dx,al {Выбираем регистр Начал Курсор #10}
inc dx {Регистр данных}
in al,dx {Читаем состояние курсор - это в принципе не нужно}
or al,100000b {Включаем бит 5 -> н VGA+ -> отключение курсора}
out dx,al
end;
Procedure CursorOn;Assembler;
{Включаем курсор}
asm
mov dx,3D4h {Регистр - Адрес КЭЛТ}
mov al,10
out dx,al {Выбираем регистр Начал Курсор #10}
inc dx {Регистр данных}
in al,dx {Читаем размеры курсора}
and al,11011111b {Отключаем бит #5}
out dx,al
end;
Procedure GetCursor(var X,Y:Byte);Assembler;
{Читаем координаты курсора}
asm
mov dx,3D4h {Регистр - Адрес КЭЛТ}
mov al,0Eh
out dx,al {Выбираем регистр Старшего Адрес Курсора}
inc dx
in al,dx {Получаем значение}
mov ah,al {Кладем в старший байт AX}
dec dx
mov al,0Fh
out dx,al {Выбираем регистр Младшего Адрес Курсора}
inc dx
in al,dx {Получаем значение}
mov dx,ax {DX=AX - координаты курсора, в формате 0-0x0, 2000-80x25}
mov cl,80 {Кол-во символов в строке}
div cl
inc al
les di,[bp+04] {ES:DI - дрес переменной Y}
stosb {Записываем}
dec al
mov ah,0
mul cl {Вычисляем смещение строки}
sub ax,dx {Координат по X в отрицательном виде}
neg ax
inc ax
les di,[bp+08]
stosb {Координат по X}
end;
Procedure PutCursor(X,Y:Byte);Assembler;
{Курсор то двигается...только вот???}
asm
mov al,Y
cbw {AX -> Y}
dec ax
shl ax,4 {AX = Y*16}
mov dx,ax {DX = Y*16}
shl ax,2 {AX = Y*64}
add dx,ax {DX = Y*16+Y*64 = Y*80}
mov al,X
cbw {AX = X}
dec ax
add ax,dx {AX = Y*80+X!}
mov bx,ax {Сохр. его в BX}
mov dx,3D4h {Регистр - Адрес КЭЛТ}
mov al,0Eh
out dx,al {Выбираем регистр Старшего Адрес Курсора}
inc dx
mov al,bh
out dx,al {Заносим старший байт}
dec dx
mov al,0Fh
out dx,al {Выбираем регистр Младшего Адрес Курсора}
inc dx
mov al,bl
out dx,al {Заносим младший байт}
end;
Procedure ClrScr(Attrib:Byte);Assembler;
asm
cld
mov ax,0B800h
mov es,ax
xor di,di {ES:DI - дрес видеобуфера}
mov cx,1000 {Размер буфер в двойных словах}
mov al,32
mov ah,Attrib {AX -> пробел|атрибут}
push ax
db $66,$C1,$E0,$10 {Сдвиг в старшую часть EAX (shl eax,10h)}
pop ax {EAX = AX:AX}
db $F3,$66,$AB {rep stosd}
end;
GLuk
Что, разве так плохо сделано??
Где комментарии?
AlaRic
Жаль не гарантирована эффективность, а так хорошо!
GLuk
По поводу эффективности, дык это только в GetCursor хреново реализован просчет, может какие-нибудь идеи есть??
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.