──────────────────────────────── ВЫВОД ОКНА И ТЕКСТА МЕНЮ ──────────────────────────────── Величутин Н.В. -------------- Тот кто занимается разработкой программ знает, что хорошо и профессионально выглядит та программа где есть красивые меню с рамкой и тенью. Предлагаю для вашего рассмотре- ния подпрограмму которой я поль- зуюсь уже два года. Подпрограмма полностью переме- щаемая, т.е. кодовый блок можно загрузить по любому адресу и запустить его по адресу загруз- ки. Как известно всем кто програм- мирует на ассемблее, что пол- ностью перемещаемые программы делать несколько сложнее и выг- лядят они запутано, т.к. исклю- чение из программ таких команд как 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 - кодовый блок второй программы.