Консультация № 67066
15.12.2006, 09:01
0.00 руб.
0 2 1

Здравствуйте уважаемые эксперты!

В главе 14-ть книги Олега Калашникова описывается принцип рисования рамки на экране. Автор говорит следующее:

- Перед тем как вывести рамку в центр экрана необходимо разделить её высоту на два и из полученного числа вычесть середину высоты.

Загружаем следующий код в отладчик (он взят из книги):

mov ax, Height_X
shr al, 1
mov dh, 11
sub dh, al

Что мы видим? Загружаем в ах высоту нашей рамки - 23 строки, делим на два, вычитаем серидину получая в dh - 0. Расчитывая ширину отладчик также показывает в итоге ноль. И для чего нужны такие координаты? Не проще ли тогда сразу обнулить dh командой xor dh, dh?

Дальше - хуже. Автор пишет, что координату нужно перевести в линейный массив. В текстовом режиме 80х25 символов каждая строка "весит" 2*80=160 байт и соответственно каждый столбец 2*25=50 байт. Вот пример из книги:

mov dh, 8
mov dl, 56
linear = dl*2
linear = linear+dh*160

Так вот при расчёте мы почему то строку умножаем на 160, а вот столбец не на 50-т (что было бы логичнее), а на два. С чем это связано?

Спасибо!

Обсуждение

Неизвестный
15.12.2006, 16:56
общий
Я не он, да и книги нет под руками, поэтому только свои соображения изложу1) Алгоритмов может быть много.2) А если рисовать рамку не на весь экран?3) умножение на 2 от того, что каждому символу на экране (в буфере текстового экрана) соответствует два байта: в четном - код символа, в следующем - его аттрибут4) отсюда - весь буфер текстового экрана можно представить в виде длинной цепочки (линейного массива). Вот и нужно определить место символа в этой цепочке
Неизвестный
17.12.2006, 03:38
общий
это ответ
Здравствуйте, Paltus!
Здравствуйте, Paltus!
1.>Не проще ли тогда сразу обнулить dh
А если высота рамки не 23... Например 10: 10/2=5 11-5=6, а не ноль. Кстати, пример из рассылки.
2. Ищем адрес символа в буфере: длина каждой строки 80 символов*2=160 байт(символ=2 байта). Помимо этого рамка начинается не с левого края экрана, т.е. слева от неё незаконченая строка, кол-во символов в ней и есть нометр столбца. А учитывая, что символ-2байта, получаем Adres=stroka*80*2+ctolbez*2.
С уважением, IceW0|f.

Приложение:
xxxxxxxxx..всего 80..xxxxxxxx <-в памяти 160 байтxxx0 р xxxxxxxxxxxxxxxxx <-первые 3 символа и есть номерxxx а xxxxxxxxxxxxxxxxx столбца, в памяти 6 байт,а ищxxx м xxxxxxxxxxxxxxxxx ем мы смещение 0-а(это только xxx к xxxxxxxxxxxxxxxxx иллюстрация) в памяти. А в памxxx а xxxxxxxxxxxxxxxxx мяти каждый символ 2 байта, иxxxxxxxxx..всего 80..xxxxxxxx всё это в строчку-массив.
Форма ответа