IPB
ЛогинПароль:

> ПРАВИЛА РАЗДЕЛА!!!

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

 
 Ответить  Открыть новую тему 
> Модуль CRT
GLuk
сообщение 26.05.2003 17:12
Сообщение #1


Профи
****

Группа: Пользователи
Сообщений: 775
Пол: Мужской

Репутация: -  0  +


Некоторые подпрограммы модуля 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
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
GLuk
сообщение 31.05.2003 16:33
Сообщение #2


Профи
****

Группа: Пользователи
Сообщений: 775
Пол: Мужской

Репутация: -  0  +


Что, разве так плохо сделано??
Где комментарии?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
AlaRic
сообщение 2.06.2003 19:47
Сообщение #3


...
*****

Группа: Пользователи
Сообщений: 1 347
Пол: Мужской

Репутация: -  3  +


Жаль не гарантирована эффективность, а так хорошо!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
GLuk
сообщение 3.06.2003 15:24
Сообщение #4


Профи
****

Группа: Пользователи
Сообщений: 775
Пол: Мужской

Репутация: -  0  +


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

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 19.07.2025 4:03
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"