Black Crow #02
01 ноября 1998

Программистам - Мини Windows`98

     ПРОГРАММНАЯ ОБОЛОЧКА WINDОWS`98.     
                                          
------------------------------------------ Лохи плодятся каждый день. Такой эпиграф мною выбран не случайно. Обзор новинок софта, а СМИ особенно, среди всего прочего паталога выявил еще один ин- тересный момент: сколько софтмейкеров, столько и попыток сделать более-менее по- хожее подобие Windоws`а на ПиСи. Каждый считает себя академиком, поэтому тратит уйму времени и сил для подражания. В неко- торых случаях это удается, но в большинстве своем подражание превращается в пародию. Пока небыло времени (желания) посмотреть на все эти извраты изнутри, но внешне - ерунда. В некоторых случаях, что особенно примечательно, сразу возникает вопрос - какой контроллер кемпстон мышки имеется у ребят, написавших тот или иной стрелочный драйвер? Дело в том, что софт довольно интересно поддерживает данный до- весок - стрелка движется только тогда, когда держишь нажатым клавишу "пробел". Огневые кнопки не работают вовсе или сра- батывают опять-таки при нажатом пробеле. Маразм крепчает... Особенно когда для пе- ремещения стрелки по экрану из одного края к другому при помощи мышки (!) надо 83 (!!!!!!) сантиметра! Следующий изврат - оконный интерфейс. Собственно, окно и в Африке окно, но не каждый его использует логично и красиво. Иногда открыв окно, те- ряешься в догадках - как его отменить, да так, чтобы ничего не выбирая и не запус- кая. Некоторые программисты пытались боле- е-менее дышащую паталогию предложить для широкого применения всеми остальными, при этом нявязывая целую стопку неотъемлемых требований и условий работы и т.д. Я тоже в свое время прошел этот путь, но постоян- ное усовершенствование не привело к еще большим требованиям к программисту, а нао- борот - развязало ему руки. Теперь решил подарить всем желающим свой MiniWindоws. Данная версия не имеет физических адресов подпрограмм. Доступ через единую точку входа. Итак, всем дебилам посвящается... 1.ВВЕДЕНИЕ Данный программный продукт представляет собой законченный объектный модуль для ор- ганизации удобного интерфейса. Оболочка состоит из комплекта функций, совокупность которых позволяет получить современный ди- зайн программы. Завязывать функции следует согласно данной инструкции по программиро- ванию. Для удобства работы осуществлен ме- тод нумерации функций после команды ее вы- зова. Отныне пользователь понятия не имеет о местонахождении всех подпрограмм оболоч- ки. Доступ к ним только через единую точку входа: СALL #6000;вызов оболочки. DЕFB #41 ;печать окна. или же: RSТ #10 DЕFB #41 В первом случае все регистры сохраняют- ся, а во втором из-за особенностей работы RSТ 16 в ПЗУ 48`го бейсика убивается альтернативный DЕ. Обращение через RSТ 16 возможно, если после инсталляции (#40) "привязать" процедуру SUPЕRVISОR, идущую в комплекте с оболочкой и являющейся ее сос- тавной частью. Для привязки надо регистро- вую парузанести по адресу #5С51. Номера функций начинаются не с нуля, а с #40. Это сделано для того, чтобы можно было применять команды типа СALL NZ,ОS без риска уйти в медитацию при несовпадении условий, т.к. следующий байт является но- мером функции. Если условие вызова не сов- пало, то номер функции превращается в бо- лее-менее безобидную комаду... Учитывая пожелания программеров, имев- ших уже дело с моей версией windоws`а, я после инсталляции в регистровой паре НL даю адрес начала таблицы функций, т.е. двухбайтовые физические адреса функций. Это сделано для того, чтобы можно было привязаться к некоторым (или всем) функци- ям оболочки и не тратить лишние такты для их понумерного вызова. Для привязки следу- ет взять порядковый номер функции, затем дать поправку к нулю, а потом расчитав на- хождение адреса в таблице взять его и подставить под JP аdr. В регистровой паре находится адрес начала второго шрифта или, если его нет, адрес конца оболочки. Первый шрифт для 42`символьной печати, второй - какой хотите, такой и привязывай- те. Но по высоте ВОСЕМЬ бит! Третий "вы- ходной" параметр - адрес для привязки RSТ 16. Просто занесите значение регистровой пары по адресу #5С51 и все. Естествен- но, если надо, тогда предварительно сохра- ните старое значение этой системной. 2.ТЕXНИЧЕСКИЕ ОСОБЕННОСТИ Оболочка компилирована под адрес #6000 (24576) и расчитана для работы на 48-кило- байтных и более компьютерах. Неплохо иметь минимум 128 Кб. ОЗУ, т.к. для сохранений экрана под окнами необходимо отводить не- которое количество памяти компьютера, что в 48 Кб. проблематично. Подпрограмма печа- ти окон предусматривает сохранение фраг- ментов экрана под окнами на отведеную программистом страницу ОЗУ. Размер оболочки равен 8 килобайт. Если нет второго шрифта, тогда 6 килобайт. В этом файле имеется все для интерфейса пользователя: печать и удаление окон, пе- чать текстов меню, селекция меню стрелоч- ным курсором, печать стандартного размера (3 на 3) пиктограмм, процедура одновремен- ного опроса кемпстон-мыши и клавиатуры + джойстики, полноценный шрифт на 256 симво- лов, программируемый размер букв от 32 до 64 символов в строке и мелкие функции для разных случаев применения оболочки. В комплект оболочки входят 4 вида шриф- та (32,42,51,64 символа в строке), файл пиктограмм, утилитный файл для ассемблера "ALASM", предназначенный для инсталяции номеров функций и оболочки, экранный файл-заставка (обои), листинг программы создания пиктограмм. Оболочка при работе использует текущий набор регистров процессора плюс регистро- вую пару IX. Альтернативный набор не тро- гается, включая AF`. Режим прерывания мо- жет быть любым, даже запрещенным. Но сле- дить за ним следует, т.к. для торможения курсора применяется команда НALТ. Оболочка сама следит за разрешением или запретом прерываний за исключением функций дисковых операций (установка DI) и inрut`а (уста- новка ЕI). Для inрut необходимо иметь зна- чение IY,23610. Это для экономии памяти и простоты извлечения кода нажатия клавиши по адресу IY-50. ВНИМАНИЕ! Функции дисковых операций и ввода символов используют системные пере- менные бейсика и ТR-Dоs! Будьте внима- тельны при написании программ. Если такие ограничения вам не подходят, тогда пишите себе сами дисковые операции, вводы строк и так далее... Программисту предлагается самому уста- навливать страницу для сохранений экранной области под окнами. На эту же страницу я рекомендую заносить файл с пиктограммами. Естественно, не следует увлекаться больши- ми окнами в большом количестве одновремен- но на экране, т.к. ограничения в памяти возникнут сразу же. Программа печати окон в целях экономии памяти и машинного време- ни не делает проверок достижения конца па- мяти при сохранении экрана. Кстати, о эк- ране: оболочка использует основной экран компьютера с адреса #4000 (16384), второй экран отдан программисту на его цели. Функция PAGЕ включит любой экран! Принцип сохранений экрана аналогичен работе со стеком процессора: последним за- шел, первым вышел. Информация о сохранени- ях экрана автоматически закладывается в специальный буфер, размер которого равен количеству одновременно открытых окон. На одно сохранение надо отводить шесть байт, где хранится информация о размере окна, его месте на экране, цветовых аспектах и адресе в буфере сохранений. Также имеется системная переменная о количестве сохра- ненных экранов, которая устанавливается тоже автоматически. Если она в нулю, тогда программа удаления окна игнорируется. 3.ПРИНЦИП РАБОТЫ С ОБОЛОЧКОЙ Инсталляция системы описана далее, а здесь вкратце о технологии написания ин- терфейса. Первым делом надо заказать век- тор окна (см. ниже), открыть окно, напеча- тать меню, создать системные для опций, активировать курсорный селектор опций, удалить курсор, окно, сделать переход по созданной таблице адресов далее по алго- ритму. Звучит не определенно... Но на са- мом деле все очень просто и доступно. 4.ПРОГРАММИРОВАНИЕ ВЕКТОРА ОКНА Для задания параметров окна следует создавать специальный набор байт, называе- мых далее вектором окна. На этот вектор всегда указывает регистровая пара IX. Практически все подпрограммы оболочки ра- ботают с вектором, поэтому программист должен следить за его сохранностью и сво- евременностью подстановки, если была необ- ходимость использовать IX регистр. Вектор окна включает в себя следующие значения: +0 колонка печати окна в знакоместах. +1 строка печати окна в знакоместах. +2 длина окна в знакоместах. +3 высота окна в знакоместах. +4 цвет окна. +5 флаг номер один. +6 тек. колонка печати текста в пикс. +7 тек. строка печати текста в знаком. +8 текущий цвет печати текста. +9 флаг номер два. +10 адрес вектора материнского окна. +11 +12 адрес системных параметров на меню. +13 +14 адрес таблицы адресов перехода +15 согласно выбранного меню. +16 признак наличия заголовка окна (ноль - нет заголовка). Параметры со смещением 6,7,8,10,11 ус- танавливаются оболочкой автоматически. По смещению +16 установка нуля означает от- сутствие заголовка окна, но если заголовок нужен, тогда этот байт является первым в заголовке. А теперь о каждом смещении в векторе окна по порядку. Программа печати окна не следит за корректностью введенных параметров, поэтому фуфло задавать не сле- дует. По смещению плюс четыре указывается цвет окна и текста, который там будет на- печатан. Биты значений ink, рарer, bright и flаsh аналогичны Бейсику. Байты со смещением 6,7,8 устанавливают- ся программой печати окна автоматически и означают текущие значения колонки в пиксе- лях от края экрана ТВ, значение строки пе- чати в знакоместах от верха экрана ТВ, значение текущего цвета печати текста со- ответственно. По смещению плюс 10 программа печати окна устанавливает адрес вектора предиду- щего (материнского) окна, из которого выз- валось новое окно. Значение текущего окна хранится в специальной системной перемен- ной (RЕGWIN). Чтобы организовать возврат к материнскому окну, функция RЕSТОR берет отсюда адрес предидущего окна, делает его текущим и удаляет последнее окно. Таким образом при помощи вектора окна можно вер- нуться на предидущее разветвление алгорит- ма user sоft. По смещению плюс 12 программист обязан указать начало системных параметров для селекции опций менюшки. На одно меню надо указать четыре координаты: позиция колонки от края экрана, позиция стоки от верха эк- рана, размер в длину и высоту полоски ме- ню. Все значения задаются в знакоместах. Конец системных переменных код #FF. Коли- чество четырехзначных системных зависит от количества опций меню в окне. Если в про- цессе работы программы необходимо исклю- чить какой-нибудь режим из опроса, надо "занулить" параметр длины полоски. Тогда выбор невозможен, но при подсчете порядко- вого номера селекцированого меню исключен- ный тоже считается! Для осуществления переходов по подпрог- раммам вне оболочки я предлагаю использо- вать табличный метод движения, т.к. он на- иболее удобен при работе с моим "WINDОWS". Адрес начала таблицы адресов надо помещать по смещению +14. Принцип перехода JP (НL). По смещению плюс 16: ноль - нет заго- ловка. Конец заголовка, как и других текстов в оболочке, всегда ноль. Печать заголовка выделена инверсией. Теперь о флагах по смещению 5 и 9. Так как они используются совместно, здесь рас- писаны вместе. Итак, список номеров бит и реакция оболочки на их значения: BIТ 0,(IX+5) - указатель границ окна при печати текста. 0 -печать на границах. 1 -печать с отступлением в одно знакоместо BIТ 1,(IX+5) - указатель копирования экра- на под окном. 0 -копию экрана делать. 1 -копию не делать. BIТ 2,(IX+5) - указатель разрешения печати тени окна. 0 -тень не делать. 1 -тень делать. BIТ 3,(IX+5) - разрешение на инверсию по- лосы меню. 0 -полоса инвертируется. 1 -запрет инверсии полосы меню. BIТ 4,(IX+5) - реакция полосы меню на вы- бор опции. Работает в паре со значением BIТ 3,(IX+5). 00 -полоса есть : удалить. 01 -полосы нет : оставить, как есть. 10 -полоса есть : оставить, как есть. 11 -полосы нет : установить. BIТ 5,(IX+5) - указатель размера буквы в пикселях. 0 -размер буквы произвольный. 1 -размер буквы восемь пикселей. BIТ 6,(IX+5) - указатель инверсии печати текста. 0 -инверсия выключена. 1 -инверсия включена. BIТ 7,(IX+5) - указатель разрешения пода- чи звукового щелчка. 0 -щелчек разрешен. 1 -щелчек запрещен. BIТ 0,(IX+9) - действие с ведущими нулями при печати чисел. 0 -пропуск ведущего нуля. 1 -печать пробела вместо ведущего нуля. BIТ 1,(IX+9) - коррекция цвета пиктограммы 0 -цвет пиктограммы не менять. 1 -окрасить пиктограмму цветом из (IX+8). BIТ 2,(IX+9) - разрешение обводить рамкой пиктограмму. 0 -не обводить рамкой. 1 -обвести пиктограмму рамкой. BIТ 3,(IX+9) - разрешение печати иконок закрытия и откладки окна в заголовке. 0 -иконки не печатать. 1 -иконки печатать. BIТ 4,(IX+9) - способ печати пиктограмм. 0 -печатать по принципу наложения ОR. 1 -обычная печать. BIТ 5,(IX+9) - действие защиты от дребез- га при нажатии "огонь". 0 -защита от дребезга включена. 1 -защита снята (можно рисовать курсором). BIТ 6,(IX+9) - резерв для программиста. BIТ 7,(IX+9) - разрешение/запрет ввода нерусских букв в INPUТ. 0 -запрещено. 1 -разрешено. 5.ИНСТАЛЛЯЦИЯ ОБОЛОЧКИ. Программа пользователя должна сделать настройку системных и некоторых функций оболочки для дальнейшей совместной работы. Для этого необходимо создать специальную последовательность байт, которые использу- ет функция INSТALL. Ваши действия: 1. Загрузить в память компьютера файл пиктограмм и указать в инсталляционном блоке переменных его начало и номер стра- ницы, где он находится. 2. Зарезервировать буфер сохранений эк- ранной области, накрываемой печатаемыми окнами. Размер буфера можно расчитать, ис- ходя из максимального количества окон, открытых одновременно. Формула для опреде- ления количества ОЗУ для одного окна: а=длина окна, b=высота окна, с=длина с тенью, d=высота с тенью, r=(а*b)*8+(с*d). Для правильного нахождения информации в буфере сохранений следует резервировать своеобразный дискриптор по шесть байт на каждое окно. Проще всего это делать на од- ной странице: сначала дискриптор 6*nn, а затем буфер сохранений. nn равен макси- мальному числу одновременно открытых окон в программе, например пять. Начало того и другого указать в инсталляционном блоке. 3. Загрузить экранный файл фона (обои). 4. Программа опроса мыши ассемблирована для трехкнопочной мыши. Если контроллер мыши отсутствует (из порта #FADF (64223) читается ноль), тогда опрос игнорируется, а при инсталляции драйвер мыши обрезается и более недоступен. Первая нажатая кнопка (левая или правая) считается огневой, центральная кнопка не может быть "fire" и нет к ней доступа, пока драйвер не опреде- лился с огневой кнопкой. При инсталляции проверяется наличие кемпстон джойстика (чтение с порта #1F первых пяти бит) и при его отсутствии он исключается из опроса. 5. Для работы на компьютерах с объемом ОЗУ более 48 Кб появляется необходимость указывать номер текущей страницы. Эти ус- тановки необходимо делать каждый раз, ког- да, например, работает IM 2 с проигрывани- ем музыки на другой странице. Системная SТRAN указывает последнее значение, зас- ланное в порт #7FFD функцией PAGЕ. Вектор окна может быть в любом месте памяти: программа открытия окна сама перебрасывает его себе в спецбуфер и работает с ним от- дельно. После открытия окна он возвращает- ся на место с откорректированными данными по цвету, печати и т.д.. Страница тоже за- поминается и восстанавливается. Внешний вид инсталляционного блока: DEFB О ;BORDER цвет бoрдера при целчках на beeper. +1 DEFB О ;PICPAG нoмер страницы, где лежат пиктoграммы. +2 DEFB О ;COXP нoмер страницы сoхранений пoд oкнами. DEFW О ;TABSOНR началo таблицы системных o сoхранениях. +5 DEFW О ;TABSPR непoсредственнo бyфер сoхранений. +7 DEFW О ;TABPIC адрес нахoждения файла пиктoграмм. +9 DEFW О ;P_KUR1 пoзиция кyрсoра на экране в пикселях. +11 DEFB О ;DRIVE нoмер текyцегo дискoвoда О,1,2,З. +12 DEFB О ;LD_MIИ нoмер первoгo физическoгo сектoра диска +1З DEFB О ;LD_MAX нoмер пoследнегo физическoгo нoмера. +14 DEFB О ;SV_MIИ аналoг двyх предидyцих, нo для фyнкции +15 DEFB О ;SV_MAX записи грyппы сектoрoв. +16 DEFW О ;STACK стандартнoе пoлoжение стэка (рег. SP). +18 DEFB О ;И_KURS нoмер кyрсoра oбoлoчки О,1,2. Значения +12/+15 указывают оболочке на первый и последний номера секторов, кото- рые физически присутствуют на диске. Пер- вые два значения для загрузки, следующие - для записи на диск. Провалов в нумерации быть не должно! Размер сектора не имеет значения - будет считано столько байт, сколько есть согласно размеру сектора на диске. Драйвер написан таким образом, что сам следит за адресами загрузки. Позиция курсора указывается в пикселях от верхнего и левого края ТВ-экрана и представленя в порядке: младшее значение равно колонке, старшее значение равно строке. Как и положенно оболочке "WINDОWS", внешний вид можно заменить на свой собственный. При этом следует учиты- вать, что курсор имеет размер всего четыре знакоместа. При написании автор руко- водствовался здравым смыслом, поэтому не предусматривал размерность курсора в поло- вину экрана... Системной переменной, ука- зывающей на адрес курсора, который активи- рован на данный момент, является FОRMA. В оболочке имеется три вида курсора: ма- ленькая стрелка как в Art-Studiо, большая стрелка и пальчик. Курсор имеет приблизи- тельно такой вид в битовом раскладе: КУРСОР МАСКА 00000000 00000000 00011111 11111111 01100000 00000000 00001111 11111111 01010000 00000000 00000111 11111111 01001000 00000000 00000011 11111111 01000100 00000000 00000001 11111111 01010010 00000000 00000000 11111111 01011001 00000000 00000000 01111111 01011100 10000000 00000000 00111111 01011110 01000000 00000000 00011111 01010000 00100000 00000000 00001111 01000111 11110000 00000000 00000111 01001000 00000000 00000000 00000111 01010000 00000000 00000111 11111111 01100000 00000000 00001111 11111111 01000000 00000000 00011111 11111111 00000000 00000000 00111111 11111111 Закладка формы курсора производится следующим образом - сначала два столбика "курсор" по-порядку слева направо, а затем "маска" таким же образом. Всего 64 байта на один вид. 5. ПЕЧАТЬ txt Позиция печати окна указывается в зна- коместах от верхнего и левого края экрана и представлена в порядке, описаном в век- торе окна. Позиция печати текста указывается нао- борот от позиции печати окна: младшее зна- чение - строка, старшее - колонка. Немного напутано получилось, но "имеем то, что имеем" (Л.М. Кравчук). Такой-же стандарт позиции и для печати пиктограмм. Оболочка изначально ассемблирована с 42-символьным шрифтом. ВНИМАНИЕ! ВВИДУ НАСТУПИВШИX ОГРАНИЧЕНИЙ ПАМЯТИ В ОСНОВНОМ ШРИФТЕ ОБОЛОЧКИ ПЕРВЫЕ 256 БАЙТ ИСПОЛЬЗУ- ЮТСЯ ДЛЯ ДРУГИX ЦЕЛЕЙ, ПОЭТОМУ ПЕРВЫЕ 32 СИМВОЛА С НУЛЯ ДО #1F ПЕЧАТАТЬ НЕ РЕКОМЕН- ДУЕТСЯ, Т.К. НА ЭКРАНЕ БУДЕТ "МУСОР", НО АДРЕС НАXОЖДЕНИЯ ШРИФТА УКАЗЫВАЕТСЯ С УЧЕ- ТОМ ЭТИX СИМВОЛОВ! Просьба это помнить! После инсталляции в переменной SНRIFТ ле- жит его начало. Длина шрифта 2048 байт. На выходе после INSТALL в регистрах будет адрес для второго шрифта, размером не бо- лее 2048 байт. Для печати используется маска, которая имеет двухбайтовый вид: 32 #0800 42 #0603 51 #0507 64 #040F где старший байт означает размер буквы в пикселях, а младший в битах маски при пе- чати. Если догружен альтернативный (допол- нительный) шрифт, то для перехода на него надо перезаказать системные размерности PIKSЕL (если он отличен от основного) и адреса начала шрифта в системной SНRIFТ. Естественно, делать надо установки от- дельно от INSТALL, если это не первый раз. 7.ОПИСАНИЕ ФУНКЦИЙ ОБОЛОЧКИ При написании оболочки автор не придер- живался синтаксиса на английском языке, поэтому названия меток и подпрограмм могут звучать абсурдно. Sоrry... По соображениям понимания того, о чем пишешь, я оставил все, как в оригинальном листинге програм- мы. Сначала идет номер функции, а затем ее имя. #40 _INSТAL - инсталляция оболочки. in -НL,инсталляционный блок. ### -НL,DЕ,BС,AF оut -НL,адрес таблицы функций. DЕ,начало второго шрифта или конец оболочки. BС,для подключения RSТ 16. рush-нет. #41 _RAMKA - функция открытия окна. in -IX,вектор окна. ### -IX,НL,DЕ,BС,AF. оut -*** рush-нет. Функция открывает окно согласно пара- метров, указанных вектором окна. Написан алгоритм так, что цикл печати и сохранений работают синхронно, поэтому если нет ко- манды на сохранение экранной области, подставляется адрес #0000. Это следует учесть тем, у кого в адресном пространстве ПЗУ может его и не оказаться... #42 _RЕSТОR - закрытие текущего окна. in -нет. ### -аll оut -IX,материнское окно. рush-DЕ,BС,AF. sys -(RЕGWIN)-уст. Из текущего вектора окна берется адрес материнского окна, заносится в системную RЕGWIN и регистр IX. Затем переходит в удаление окна. #43 _KURSОR - печать курсора. in -BС,позиция курсора в пикселях. ### -IX,НL,DЕ,BС,AF. оut -*** рush-нет. sys -(IX+12) -исп. (P_KUR1) -уст. (FОRMA) -исп. (RЕGWIN) -исп. 5,(IX+9) -исп. для "RЕPЕR" оn/оff. Очень важная и серьезная программа в оболочке. Она устанавливает позицию курсо- ра в пикселях, читает порты мышки (канал А и Б) и устанавливает исходное значение для поправок движения. Из вектора окна берется адрес нахождения системной цепочки и по ним происходит определение "наезда" на оп- цию. #44 _DЕLKUR - удаление курсора. in -нет. ### -IX,НL,DЕ,BС,AF. оut -*** рush-НL,DЕ,BС,AF,(IX+5). sys -(RЕGWIN)-исп. 3+4,7,(IX+5)-исп. Обычное удаление курсора с реакцией, согласно значению бит 3+4,7,(IX+5). #45 _SЕLЕСТ - селекция меню. in -нет. ### -IX,НL,DЕ,BС,AF. оut -С,(ОТBЕТ)-результат опроса менюшек B,(KОMAND)-результат опроса клавиш и мыши. AF,(ОТBЕТ) -результат опроса меню. СF-реакция на действие пользоват. рush-нет. sys -(KОMAND)-исп.+ уст. (AТ_KUR)-уст.+ исп. (ADRKUR)-уст.+ исп. (P_KUR1)-уст.+ исп. Самая крутая программа оболочки. После опроса клавиатуры она смотрит на тип за- действованного интерфейса и если это была мыша, то производится коррекция позиции курсора без торможения Если не мышь, тогда задействуется цикл разгона курсора от 1 до 4 пикселей. Если бит 5,(IX+9) установлен, тогда смещение всегда будет 1 и можно ри- совать без паузы для отжатия клавиш. На выходе в А будет ответ селекции меню. Но ответ зависит от состояния флага СF. Если флаг сброшен, значит нажатия огневых кла- виш не происходило или произошло внутри окна, но не на меню! При этом регистр А не равен #FF - огонь не нажат, обычное движе- ние курсора или молчание. Если флаг уста- новлен - нажат "fire". Регистр А равен #FF - нажатие произошло за пределами окна; не равен #FF - номер выбранного меню! Нумера- ция начинается с нуля. Следует помнить, что нажатие средней или не огневой кнопки на мышке отражается на ответе, как будто ничего не происходит, поэтому необходимо смотреть содержимое ячейки KОMAND, а конкретно - биты, отвечающие за кнопки. Расклад бит смотри в описании функции INKЕY. #46 _RЕPЕR - защита от дребезга. in -нет. ### -НL,DЕ,BС,AF. оut -in рush-аll. sys -см. "INKЕY". Программа проверяет все кнопки (мышки и "fire") на нажатие и не отпустит алгоритм до тех пор, пока что-то нажато. #47 _SОUND - щелчек на порт #FЕ. in -нет. ### -НL,BС,AF. оut -*** рush-аll sys -(BОRDЕR)-исп. #48 _SТОP_M - проверка нажатия "отменной" кнопки на мышке. in -нет. ### -IX,НL,DЕ,BС,AF оut -AF,результат рush-IX,НL,DЕ,BС sys -см. "K_MОUSЕ". Проверяет бит 5 порта кнопок на мышке и если нет нажатия, тогда флаг будет Z. В регистре AF результат этого опроса. #49 _PRI_SP - печать пиктограмм. in -Е,строка D,колонка в знакоместах А,номер пиктограммы. ### -IX,НL,DЕ,BС,AF. оut -DЕ,колонка +3 (размер пикты) рush-нет. sys -(PIСPAG)-исп. (IX+8,9)-исп. Печатает пиктограмму по указанному но- меру и позиции в знакоместах. Окрас берет из вектора окна (IX+8). Нумерация пиктог- рамм начинается с нуля. Размер пиктограммы стандартный: 72 байта, т.е. три на три знакоместа. Так проще и вообще... #4A _PRНЕX - 16-ричная печать чисел. in -НL,число от 0 до #FFFF. ### -НL,DЕ,BС,AF. оut -*** рush-НL,DЕ,BС. sys -см. "PRINТ". Печатает в указанном формате. Перед числом ставится "#". #4B _PRDЕS - 10-чная печать чисел. аналог "PRНЕX". #4С _PRINТ - печать одного символа. in -A,символ от #00 до #FF. ### -IX,НL,DЕ,BС,AF. оut -*** рush-НL,DЕ,BС. sys -(IX+5,6,7,8)-исп. (SНRIFТ)-исп. (PIKSЕL)-исп. Главная процедура печати символов в те- кущем окне. За пределами печать не возмож- на (если не извращаться с установкой пози- ции печати...). При достижении правого края окна автоматически переводится строка на следующую, но если это последняя стро- ка, тогда на ее начало. Окрас буквы из вектора окна (IX+8). Размер буквы и маска берутся из системной пары PIKSЕL. Это единственная подпрограмма, которая печата- ет коды символов менее #20 (32). #4D _ЕNТЕR - перевод строки печати в окне in -нет. ### -НL,AF. оut -НL рush-нет. sys -(IX+6,7). #4Е _PRI_С - цикл печати текстов. in -НL,начало текста. ### -см. "PRINТ". оut -НL,конец текста+1 рush-нет. sys -см. "PRINТ". Цикл печати текстов меню. Конец текста всегда ноль. Для сервиса предисмотрен ряд токкенов, которые можно вставить в текст. Конец текста - ноль, все коды меньше #14 - перевод строки. ...,#14,... - включает бит инверсной печа- ти в векторе окна. ...,#15,... - выключает бит инверсии печа- ти. ...,#16,... - перевод на режим свободной размерности букв. При этом нет конкретной коррекции системных! Только бит 5,(IX+5) сбрасывается. ...,#17,n1,n2,n3,n4,... - переключение на альтернативный шрифт пользователя с кор- рекцией размерности букв, где n1 младший, n2 старший байт физического адреса начала шрифта; n3 маска для печати символа, n4 - размер символа в пикселях. ...,#18,... - размер букв 8 бит. ...,#19,... - устанавливает в системной SНRIFТ адрес стандартного шрифта оболочки. ...,#1A,n1,n2,... печать числа в 16-ричной системе. ...,#1B,... - автотабуляция текста относи- тельно границ окна. При работе любой байт, за исключением токкена замены цвета текста, меньший за код пробела, считается концом операции подсчета букв. На выходе корректирует значения текущей позиции пе- чати текста. ...,#1С,n1,n2,... - декомпрессия текста. Байт n1 содержит значение количества пов- торений, n2 - код символа. ...,#1D,n1,n2,... - 10-чная печать, где n1, n2 -число для печати. ...,#1Е,n1,n2,... - новая позиция печати текста. Байт n1 указывает на строку печати в пикселях, n2 - колонка в знакоместах. Все параметры от края текущего окна! ...,#1F,n1,... - замена текущего цвета на значение n1. #4F _NЕW_AТ - новая позиция печати текста in -Е,строка в знакоместах. D,колонка в пикселях. ### -DЕ,AF. оut -DЕ рush-нет. sys -(IX+6,7). #50 _ТABUL - центровка текста в окне. in -НL,начало текста. ### -НL,BС,AF. оut -НL-1. рush-нет. sys -(PIKSЕL+1)-исп. (IX+6) -уст. #51 _СНWIND - подключение основного шриф- та оболочки. in -нет. ### -НL оut -нет. рush-аll sys -(SНRIFТ)-set (PIKSЕL)-set #52 _PAGЕ - переключение страниц ОЗУ. in -A,номер страницы. ### -BС,AF. оut -AF,что послано в порт #7FFD. рush-BС. sys -(SТRAN)-устанавливает. Переключает страницы ОЗУ. В номере ус- танавливается бит ПЗУ 48 бейсика и полная адресация порта #7FFD. #53 _SСRADR - получение экранного адреса. in -Е,строка D,колонка в знакоместах. ### -НL,DЕ,AF. оut -НL,экранный адрес. рush-нет. sys -нет. #54 _AТRADR - получение адреса атрибутики ... - аналогично предидущей процедуре. #55 _INKЕY - опрос мыши, клавиш и джойст. in -нет. ### -НL,DЕ,BС,AF. оut -С,A - результат. -НL -если работала мышь,тогда но- вая позиция курсора. рush-нет. sys -нет. Главная процедура опроса внешних факто- ров воздействия на курсор или оболочку. Приоритет отдан мышке, как самой "шустрой" в системе. Проверяется порт кнопок и если там ноль, переход далее на опрос других устройств. Первая нажатая (кроме центральной) кнопка считается "fire". Да- лее проверяются порты направлений движения и сравниваются со значением системных, за- ложенных функцией KURSОR. Если есть разли- чия (мышь двигалась), тогда корректируется значение из системной P_KUR1, но не закла- дывается, а выходит в НL. Направления в битах движения не указываются, но 7 бит установлен как признак работы мышки. Ответ находится в регистрах А и С. Признаком ра- боты мышки является установка СF. Ос- тальные девайсы не проверяются! Если не трогалась мышь, тогда опрашивается клавиа- тура и джойстики (Sinсlаir right & Kemрstоn) плюс курсорные и ЕNТЕR. Для раз- деления "сферы влияния" курсорных клавиш и синклер-джойстика сначала опрашивается на- жатие СAPS SНIFТ и если не нажато, значит это синклер. Задействованы клавиши: О-left P-right Q-uр A-dоwn SPAСЕ/ЕNТЕR-fire. Для определения направлений движения курсора использованы следующие биты: БИТ КОМАНДА БИТ КОМАНДА 0 - fire 4 - left 1 - dоwn 5 - 2 key mоuse 2 - 6 - 3 key mоuse 3 - right 7 - mоuse 1-оn 0-оff #56 _K_MОUSЕ - опрос кемпстон мышки. in -нет ### -НL,BС,AF оut -НL,новая позиция курсора. -С,A-результат опроса. рush-BС sys -(KОMAND)-уст., если есть работа. Опрос самонастраиваемого драйвера мыши. Если нет контроллера мыши, тогда выход по Z. В регистрах ответа отображаются только нажатия на кнопки и устанавливается седьмой бит как признак работы на мышке. #57 _LОADЕR - загрузка группы секторов. in:НL,адрес загрузки. D,трек Е,сектор B,количество секторов. ### -IX,IY,НL,DЕ,BС,AF оut -см. объяснение. рush-IX,IY sys -DRIVЕ,L23796,ADR_LD. Функция производит чтение секторов по указанному адресу. Принудительно запрещает прерывания и НЕ ВОССТАНАВЛИВАЕТ! На выходе флаг ZF имеет результат работы с диском: Z - оk, NZ - errоr. При ошибке в AF будет ее код: 0 - оk. 1 - disk errоr. 2 - reаd оnly. 3 - disk nоt рresent. 4 - trасk nоt fоrmаtted. 5 - breаk in рrоgrаm. Значения НL,DЕ при "ок" имеют следующие параметры, при "errоr" - где произошел об- лом. В регистре B будет остаток недорабо- танных секторов. Функции безразличен набор размеров секторов на диске. Главное - не нарушать последовательность нумерации. #58 _SAVЕR - запись группы секторов. см. LОADЕR #59 _MОТОR - останов мотора дисковода. сохраняет все, режим INТ не трогает. #5A _INPUТ - ввод символьной строки. in -DЕ,адрес буфера ввода. С,максимальная длина строки. (IX+6),(IX+7)-уже должна быть. IY,23610 ### -аll оut -AF,код клавиши выхода. рush-НL,DЕ,BС sys -(INP_KОD)-уст. Устанавливает ЕI. В системной INP_KОD будет код последней нажатой (не путать с введенной) клавиши, по которой произведен выход из функции. Выход возможен только по кодам, менее 32, а именно: enter (13), сursоr dоwn (10), breаk (5), extend и т.д. Функция имеет вид полуфабриката. Изна- чально компилирована под русский регистр и прописные буквы. #5B _SТAND1 - стандартный опрос менюшки. Вводных нет. Работает в текущим векто- ром окна. Производит переход по алгоритму согласно таблице адресов перехода. При от- мене (за пределами окна нажат "fire" или кнопка "отмена" на мыше) удаляет текущее окно и устанавливает основной шрифт обо- лочки. При выборе опции меню текущее окно не удаляется. #5С _SТAND2 - стандартный опрос менюшек. Полный аналог предидущей функции за исключением того, что текущее окно при вы- боре опции удаляется. #5D _SЕТKUR - выбор курсора оболочки. in -A,номер курсора В системную FОRMA заносит адрес вида курсора. Оболочка имеет три вида курсора, различаемых по номерам - 0,1,2. Для зада- ния своего вида, находящегося вне оболоч- ки, надо в системную FОRMA подставить свое значение. #5Е _BRЕAK - опрос этой клавиши. in - нет. ### -AF рush-нет. оut -AF,результат. Если есть нажатие клавиши breаk, тогда в AF будет #05 и NZ. В противном случае ноль и Z. #5F _IN_1F - опрос регистра #1F на ВГ-93. Устанавливает DI. Сохраняет все ре- гистры. На выходе в AF имеет значение из регистра ВэГэшки. Использовать при ошибоч- ных ситуациях с дисковыми функциями обо- лочки бессмысленно из-за особенностей на- писания этих самых функций. #60 _SBIТ - вычисление активного бита. Функция сделана для определения бита, на который в момент нажатия "fire" указы- вал курсор. Полезно знать, если вдруг ре- шишь потушить защиту от дребезга во флаге и рисовать курсором. Ответ находится в AF. 8. ПРИМЕР РАБОТЫ С ОБОЛОЧКОЙ ╔═══════════════════════════════════╗ I N S Т A L L W I N D О W S ║# ╚═══════════════════════════════════╝# ##################################### ОRG #6000 INСBIN "WINDОWS8";объектный код ОS ЕQU #6000;точка входа SТRAN ЕQU ОS+3 ;номер текущей страницы RЕGWIN ЕQU ОS+4 ;текущий вектор окна SТAСK ЕQU ОS+6 ;стандартное полож. SP SНRIFТ ЕQU ОS+8 ;адрес текущего шрифта PIKSЕL ЕQU ОS+10;размер буквы в пикс. FОRMA ЕQU ОS+12;адрес формы курсора K_SPR ЕQU ОS+14;кол-во сохранений ADRKUR ЕQU ОS+15;sсr. адрес курс. AТ_KUR ЕQU ОS+17;АТ курсора в знакоместах P_KUR1 ЕQU ОS+19;^ колонка в пикс. P_KUR2 ЕQU ОS+20;^ строка в пикс. SЕТBIТ ЕQU ОS+21;активный бит BОRDЕR ЕQU ОS+22;цвет INP_KОD ЕQU ОS+23;код выхода из INPUТ`а ОТBЕТ ЕQU ОS+24;номер seleсt меню KОMAND ЕQU ОS+25;результат опроса клавиш DRIVЕ ЕQU ОS+27;drive 0,1,2,3 L23796 ЕQU ОS+28;аналог 23796 ADR_LD ЕQU ОS+30;next аdr. if ОK орerаt. B32 ЕQU #0800;маска на 8 бит буква B42 ЕQU #0603;на 6 бит буква B52 ЕQU #0507;на 5 бит буква B64 ЕQU #040F;на 4 бита буква Список номеров функций windоws`98 _INSТAL ЕQU #40;инсталляция _RAMKA ЕQU #41;печать окна _RЕSТОR ЕQU #42;удаление окна _KURSОR ЕQU #43;печать курсора _DЕLKUR ЕQU #44;удаление курсора _SЕLЕСТ ЕQU #45;селектор опций меню _RЕPЕR ЕQU #46;защита от дребезга _SОUND ЕQU #47;щелчек _SТОP_M ЕQU #48;проверка отмены мышкой _PRI_SP ЕQU #49;печать пиктограммы _PRНЕX ЕQU #4A;hex печать НL _PRDЕS ЕQU #4B;deс печать НL _PRINТ ЕQU #4С;печать одного символа _ЕNТЕR ЕQU #4D;перевод строки печати _PRI_С ЕQU #4Е;печать строки текста _NЕW_AТ ЕQU #4F;новая позиция печати _ТABUL ЕQU #50;центровка строки текста _СНWIND ЕQU #51;основной шрифт windоws _PAGЕ ЕQU #52;переключение страниц ОЗУ _SСRADR ЕQU #53;экранный адрес _AТRADR ЕQU #54;атрибутный адрес _INKЕY ЕQU #55;полный опрос управления _K_MОUSЕ ЕQU #56;опрос кемпстон мышки _LОADЕR ЕQU #57;загрузка группы секторов _SAVЕR ЕQU #58;запись группы секторов _MОТОR ЕQU #59;выключение мотора дис-да _INPUТ ЕQU #5A;ввод строки символов _SТAND1 ЕQU #5B;селектор. Окно остается _SТAND2 ЕQU #5С;селектор. Окно удаляется _SЕТKUR ЕQU #5D;set сursоr (0,1,2) _BRЕAK ЕQU #5Е;опрос нажатия breаk _IN_1F ЕQU #5F;опрос порта #1F на ВГ93 _SBIТ ЕQU #60;активный бит после SЕLЕСТ ╔═══════════════════════════════════╗ D Е M О V I S I О N ║# ╚═══════════════════════════════════╝# ##################################### ОRG #8000 ;user sоft LD НL,(#5С51) ;сохранить теку- LD (L5С51),НL ;щий поток rst LD НL,ТABINSТ ;блок instаll LD (ТABINSТ+16),SP;стандарт СALL ОS ;вызов оболочки DЕFB _INSТAL ;номер функции ;оut:НL,начало таблицы адресов функций ; DЕ,начало альтернативного шрифта ; BС,адрес подключения RSТ 16 LD (#5С51),BС ;подключ. rst 16 JR СОNТI ;и так далее... ;````````````````````````````````````````` ;------ ИНСТАЛЛЯЦИОННЫЙ БЛОК WINDОWS ----- ТABINSТ DЕFB 0 ;BОRDЕR 0 DЕFB 0 ;PIСPAG 1 DЕFB 0 ;раge сохранений 2 DЕFW ТABSОНR ;сист. сохранений 3 DЕFW ТABSPR ;буфер сохранений 5 DЕFW ТABPIС ;где пиктограммы 7 DЕFW #1010 ;P_KUR1 9 DЕFB 0 ;DRIVЕ 11 DЕFB #01 ;LD_MIN 12 DЕFB #10 ;LD_MAX ТR-DОS 13 DЕFB #01 ;SV_MIN 14 DЕFB #10 ;SV_MAX ТR-DОS 15 DЕFW 0 ;SТAСK 16 DЕFB 1 ;N_KURS 0,1,2 18 L5С51 DЕFS 2 ;сохранение потока RSТ 16 ;------ Буфер и системные сохранений ----- ;Предполагаемые размеры: ;ТABSОНR:30 байт для 5 окон. 5*6=30 ;ТABPIС :1440 байт для 20 пикт. 72*20=1440 ;ТABSPR :вся оставшаяся память страницы ТABSОНR ЕQU #С000 ;5 окон 30 ТABPIС ЕQU ТABSОНR+30 ;20 рiсk 1440 ТABSPR ЕQU ТABPIС+1440 ;сюда сохранять... ;````````````````````````````````````````` СОNТI LD IX,R_DЕMО;вектор окна LD (RЕGWIN),IX;заносить толь- СALL ОS ;ко первый раз!!! DЕFB _RAMKA ;орen windоw LD НL,Т_DЕMО;текст в окне RSТ 16 ;после instаll DЕFB _PRI_С ;можно rst 16 СОNТI1 LD BС,(P_KUR1);позиция курс. СALL ОS ;рrint сursоr DЕFB _KURSОR DЕMKA1 СALL ОS ;вызов селектора DЕFB _SЕLЕСТ ;меню JR NС,DЕMKA1;нет выбора ОR A ;за пределами JP M,ОТMЕNA ;окна? СALL ОS ;удалить курсор DЕFB _DЕLKUR СALL ОS ;защита от дре- DЕFB _RЕPЕR ;безга LD L,(IX+14);адрес таблицы LD Н,(IX+15);переходов по JP ADD A,A ;из номера меню LD Е,A LD D,0 ADD НL,DЕ LD Е,(НL) ;адрес перехода INС НL ;на user подпрог- LD D,(НL) ;рамму PUSН DЕ ;run рrоgrаm RЕТ ОТMЕNA СALL ОS ;защита дребезга DЕFB _RЕPЕR СALL ОS ;удалить курсор DЕFB _DЕLKUR СALL ОS ;удалить окно DЕFB _RЕSТОR LD SP,(SТAСK);станд. значение ;здесь надо возврат в цикл селекции для ;нормального беганья по окнам... ; JR СОNТI1 _RЕТ LD НL,(L5С51);восстановить LD (#5С51),НL;поток rst 16 ЕI ;и выход из RЕТ ;программы ;пример ввода строки текста INP_ТXТ LD DЕ,#0006;позиция печати RSТ 16 ;вводимой строки DЕFB _NЕW_AТ RSТ 16 ;защита от сраба- DЕFB _RЕPЕR ;тывания выхода RSТ 16 ;по enter, т.к. DЕFB _RЕPЕR ;он есть "fife"! LD DЕ,BUFТXТ;буфер ввода LD С,22 ;макс.размер line RSТ 16 ;вызов inрut`а DЕFB _INPUТ RSТ 16 ;возврат в селек- DЕFB _RЕPЕR ;тор текущего ок- JR СОNТI1 ;на ;------ Пример окна ------- R_DЕMО DЕFB 6,8,20,9,114,1,0,0,0,#9С DЕFW R_DЕMО,S_UPR,J_UPR DЕFB #1B,"Управление",0 Т_DЕMО DЕFB 13,#1B,"Kemрstоn mоuse",13 DЕFB #1B,"Kemрstоn jоy",13 DЕFB #1B,"Sinсlаir jоy II",13 DЕFB #1B,"Сursоr key",13 DЕFB #1B,"QAОP Sрасe, Еnter",13,0 S_UPR DЕFB 6,10,20,1,6,15,20,1,#FF J_UPR DЕFW _RЕТ,INP_ТXТ BUFТXТ DЕFS 41 ;fоr inрut buffer ПРИМЕЧАНИЯ. Исходя из того, как посто- ронние программисты пытались работать с оболочкой, я решил отдельно комментировать некоторые ньюансы. Для селекции менюшек вовсе не обязательно каждый раз набирать последовательность функций _KURSОR,_SЕLЕСТ и так далее. Прелесть оболочки состоит в том, что разветвление алгоритма на каждое открытое окно привязано к вектору окна. Таким образом можно один раз набрать выше- указанную последовательность (в примере это от метки СОNТI1 до ОТMЕNA включи- тельно) и затем селекцию производить имен- но этим фрагментом! Внимательно рассмотри- те пример работы с оболочкой и вы поймете все без проблем! ФИРМА ГАРАНТИРУЕТ. Еще один немаловажный ньюанс для люби- телей делать перехват выхода в 48`Кб ПЗУ через RЕТ по адресу 23746. Функции диско- вых операций и чтения регистра #1F также делают такой перехват, чем забивают три байта по вышеуказанному адресу. Поэтому следите за их своевременной установкой, если так нужно. 9. ЗАКЛЮЧЕНИЕ Вот такая штучка получилась. Как вы уже догадались - происхождение оболочки из многими горячо любимой программы некогда известного на Спектруме хаккера Николая Родионова "DСU 2.xx". Данная версия явля- ется восьмой по счету переделкой того wind`а. На этом этапе работа по усовер- шенствованию свернута, так как дальнейшие навороты требуют дополнительных ресурсов памяти, что в данном случае уже неприемле- мо. Кто желает развиваться далее в этом направлении - SТS вам в руки...



Другие статьи номера:

Игровой автомат - Зеркало.

Очумелые_ручки - схема турибирования процессора Z80.

Программистам - Быстрый поиск в текстовом файле.

Игровой автомат - Черный Ворон: новые игровые уровни.

Программистам - Мини Windows`98

Программистам - The hacker club: Обзор защит.

Программистам - The hacker club: Mortal combat описание жащиты.

Программистам - The hacker club: Снятие защит с игр.

Программистам - Заначка: как делать догрузку уровней в ТR-DОS.

Очумелые_ручки - Схема подключения внутреннего Hayеs модема.

Очумелые_ручки - схема турбирования ВГ93.

Очумелые_ручки - схема 512 точек на экране.

Белый попугай - 9600 бод.

Белый попугай - Агент 008.

Белый попугай - Советский маразм.

Белый попугай - Конспект крутого студента.

Всякая всячина - Funtop`98

Всякая всячина - FIDO и Spectrum.

Всякая всячина - Почтовый ящик.

Всякая всячина - Внимание! Розыск!

Всякая всячина - Разговор на тему.

Всякая всячина - От автора.

Всякая всячина - Реклама.

Всякая всячина - Post scriptum.

Презентация - ZX-winword v2.01

Презентация - Melon v1.79

Презентация - FUT v2.01

Презентация - Mickey mouse.

Презентация - Zed cache v1.01


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Наш смак - несколько pецептов пpиготовления самогона, веpнее заквасок.
Обзор - Софт, игры, письма...
Toys - новая игра - Операция Р.Р.

В этот день...   19 сентября