────────────────────────────────
ВЫВОД ОКНА И ТЕКСТА МЕНЮ
────────────────────────────────
Величутин Н.В.
--------------
Тот кто занимается разработкой
программ знает, что хорошо и
профессионально выглядит та
программа где есть красивые меню
с рамкой и тенью.
Предлагаю для вашего рассмотре-
ния подпрограмму которой я поль-
зуюсь уже два года.
Подпрограмма полностью переме-
щаемая, т.е. кодовый блок можно
загрузить по любому адресу и
запустить его по адресу загруз-
ки.
Как известно всем кто програм-
мирует на ассемблее, что пол-
ностью перемещаемые программы
делать несколько сложнее и выг-
лядят они запутано, т.к. исклю-
чение из программ таких команд
как CALL NN, JP NN, LD (NN),A
и т.д., хранение переменных
толко в регистрах или на стеке
не позволяет делать по настояще-
му структуированную программу.Но
использовать кодовый блок такой
программы одно удовольствие. Вся
работа сводится к загрузке этого
блока по любому свободному адре-
су,размещению входных параметров
из основной программы и все!
Входные параметры (адрес текста
координаты вывода окна, ширина и
высота окна,цвет фона и чернил)
передаются в начало программы и
рассчитываются следующим образом
addr - адрес загрузки программы
addr+7 - младший байт адреса
размещения текста
addr+8 - старший байт адреса
размещения текста
addr+10- координата вывода окна
по Y (0 - верх экрана)
addr+12- координата вывода окна
по X (0 - левая часть
экрана)
addr+14- высота окна в знако-
местах
addr+16- ширина окна в знако-
местах
addr+18- цвет чернил
addr+20- цвет фона
Текст программы:
ORG 55000
LD A,2 включить
CALL 5633 канал "S"
LD IX,54500 адрес
текста
LD H,5 коорд. по Y
LD L,6 коорд. по X
LD D,14 высота
LD Е,8 ширина
LD В,7 цвет чернил
LD C,1 цвет фона
PUSH HL
PUSH IX
PUSH ВС
LD A,17 установка
RST #0010 цвета
LD A,C фона
RST #0010
LD A,19 повышенная
RST #0010 яркость
LD A,1
RST #0010
LD A,22
RST #0010 установка
LD A,H координат
RST #0010 вывода
LD A,L окна
RST #0010
LD В,Е ширина окна
A1 LD A,32 цикл печати
RST #0010 верхней
DJNZ A1 строки окна
LD В,D высота окна
A2 PUSH ВС цикл
LD A,22 печати
RST #0010 окна
INC H с выводом
LD A,H боковой
RST #0010 прозрачной
LD A,L тени
RST #0010
LD A,17
RST #0010
LD A,C
RST #0010
LD A,19
RST #0010
LD A,1
RST #0010
LD A,21
RST #0010
LD A,0
RST #0010
LD В,Е
A3 LD A,32 цикл печати
RST #0010 одной
DJNZ A3 строки
LD A,17
RST #0010
LD A,0
RST #0010
LD A,16
RST #0010
LD A,1
RST #0010
LD A,19
RST #0010
LD A,0
RST #0010
LD A,21
RST #0010
LD A,1
RST #0010
LD A,32 печать тени
RST #0010 в одной строке
РОР ВС возврат для
DJNZ A2 печ. след. стр.
LD A,22
RST #0010 установки
LD A,H для
INC A печати
RST #0010 нижней
LD A,L тени
INC A
RST #0010
LD В,Е
A4 LD A,32 цикл печати
RST #0010 нижней
DJNZ A4 тени
LD A,17
RST #0010 восстановление
LD A,C цвета
RST #0010 фона
LD A,19 повышенной
RST #0010 яркости
LD A,1
RST #0010
РОР ВС
LD A,16 и цвета
RST #0010 чернил
LD A,В
RST #0010
LD A,H
LD В,7
A5 ADD A,H умножение
DJNZ A5 на 8 и
PUSH HL
LD H,A вычисление
LD A,169 координаты
SBC A,H угла меню
РОР HL по Y
LD В,A
PUSH ВС
LD A,L
LD В,7
A6 ADD A,L такие же
DJNZ A6 вычисления
INC A координаты
РОР ВС по X
LD C,A
LD H,В
LD L,C вычисления
LD В,7 ширины
LD A,D рамки
A7 ADD A,D
DJNZ A7
ADD A,5
LD D,A
LD В,7
LD A,Е вычисления
A8 ADD A,Е высоты
DJNZ A8 рамки
SBC A,3
LD Е,A
LD В,D
A9 PUSH ВС вычерчивание
LD В,H одной
LD C,L линии
PUSH DE рамки
PUSH HL используя
CALL 8933 подпрограмму
РОР HL ПЗУ
РОР DE
INC H
РОР ВС
DJNZ A9
LD В,Е
A10 PUSH ВС то же
LD В,H самое
LD C,L для другой
PUSH DE стороны
PUSH HL
CALL 8933
РОР HL
РОР DE
INC L
РОР ВС
DJNZ A10
LD В,D
A11 PUSH ВС третья
LD В,H сторона
LD C,L
PUSH DE
PUSH HL
CALL 8933
РОР HL
РОР DE
DEC H
РОР ВС
DJNZ A11
LD В,Е
A12 PUSH ВС четвертая
LD В,H сторона
LD C,L рамки
PUSH DE
PUSH HL
CALL 8933
РОР HL
РОР DE
DEC L
РОР ВС
DJNZ A12
РОР IX восстановление
РОР HL координат
INC H верхнего
INC L угла окна
LD A,22 для вывода
RST #0010 текста
LD A,H
RST #0010
LD A,L
RST #0010
В1 LD A,(IX+1) взять символ
СР 163 если его код
JR NC,В2 больше 163
СР 1 если больше 1
JR NC,В3 если меньше то
RET выход
В3 RST #0010
INC IX
JR В1
В2 INC H цикл
LD A,22 печати
RST #0010 текстового
LD A,H сообщения
RST #0010
LD A,L
RST #0010
INC IX
JR В1
Кодовый блок программы имеет
длину 288 байт.
Вы можете сократить длину
программы исключив из нее строки
LD A,19
RST #0010
LD A,1
RST #0010
...
LD A,19
RST #0010
LD A,0
RST #0010
в этом случае яркость цвета
окна и тени будут одни и те же.
Формат текста следующий:
текст строки - граф. символ U -
-перевод строки,0 конец текста.
На ваш вопрос почему так?
Отвечу. Я так захотел.
Если вам не понравится можете
изменить эту часть программы.
Например:
СР 13
JR Z,В2
СР 255
RET Z
────────────────────────────────
В приложении вы найдете кодовые
блоки этих программ.
техт - кодовый блок первой
программы.
windows - кодовый блок второй
программы.
Other articles: