1. Заголовок или название темы должно быть информативным 2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE] 3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора. 5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM! 6. Проверяйте программы перед тем, как выложить их на форум!!
Некоторые подпрограммы модуля 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;