Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ассемблер _ Модуль CRT

Автор: GLuk 26.05.2003 21:12

Некоторые подпрограммы модуля 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 31.05.2003 20:33

Что, разве так плохо сделано??
Где комментарии?

Автор: AlaRic 2.06.2003 23:47

Жаль не гарантирована эффективность, а так хорошо!

Автор: GLuk 3.06.2003 19:24

По поводу эффективности, дык это только в GetCursor хреново реализован просчет, может какие-нибудь идеи есть??