Некоторые подпрограммы модуля 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 хреново реализован просчет, может какие-нибудь идеи есть??
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.